From 85b34edbf3cfb7772f140d012063834a1998cd91 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 1 May 2017 19:20:43 -0400 Subject: [PATCH 001/744] added shot lists to directories --- data/shot_lists/{ => d3d}/d3d_short_clear.txt | 0 .../{ => d3d}/shotlist_JaysonBarr.txt | 0 .../{ => d3d}/shotlist_JaysonBarr_clear.txt | 0 .../{ => d3d}/shotlist_JaysonBarr_disrupt.txt | 0 data/shot_lists/jet/BeWall_clear.txt | 1017 +++ data/shot_lists/jet/CFC_unint.txt | 309 + data/shot_lists/jet/CWall_clear.txt | 4019 ++++++++++++ data/shot_lists/jet/ILW_unint.txt | 179 + data/shot_lists/jet/all_shots.txt | 5524 +++++++++++++++++ data/shot_lists/jet/long_list_C.txt | 309 + data/shot_lists/jet/mixed_list.txt | 608 ++ data/shot_lists/jet/mixed_list1.txt | 618 ++ data/shot_lists/jet/mixed_list_test.txt | 4 + data/shot_lists/jet/short_list.txt | 30 + data/shot_lists/jet/single_clear.txt | 2 + data/shot_lists/nstx/disrupt_nstx.txt | 37 + 16 files changed, 12656 insertions(+) rename data/shot_lists/{ => d3d}/d3d_short_clear.txt (100%) rename data/shot_lists/{ => d3d}/shotlist_JaysonBarr.txt (100%) rename data/shot_lists/{ => d3d}/shotlist_JaysonBarr_clear.txt (100%) rename data/shot_lists/{ => d3d}/shotlist_JaysonBarr_disrupt.txt (100%) create mode 100644 data/shot_lists/jet/BeWall_clear.txt create mode 100644 data/shot_lists/jet/CFC_unint.txt create mode 100644 data/shot_lists/jet/CWall_clear.txt create mode 100644 data/shot_lists/jet/ILW_unint.txt create mode 100644 data/shot_lists/jet/all_shots.txt create mode 100644 data/shot_lists/jet/long_list_C.txt create mode 100644 data/shot_lists/jet/mixed_list.txt create mode 100644 data/shot_lists/jet/mixed_list1.txt create mode 100644 data/shot_lists/jet/mixed_list_test.txt create mode 100644 data/shot_lists/jet/short_list.txt create mode 100644 data/shot_lists/jet/single_clear.txt create mode 100644 data/shot_lists/nstx/disrupt_nstx.txt diff --git a/data/shot_lists/d3d_short_clear.txt b/data/shot_lists/d3d/d3d_short_clear.txt similarity index 100% rename from data/shot_lists/d3d_short_clear.txt rename to data/shot_lists/d3d/d3d_short_clear.txt diff --git a/data/shot_lists/shotlist_JaysonBarr.txt b/data/shot_lists/d3d/shotlist_JaysonBarr.txt similarity index 100% rename from data/shot_lists/shotlist_JaysonBarr.txt rename to data/shot_lists/d3d/shotlist_JaysonBarr.txt diff --git a/data/shot_lists/shotlist_JaysonBarr_clear.txt b/data/shot_lists/d3d/shotlist_JaysonBarr_clear.txt similarity index 100% rename from data/shot_lists/shotlist_JaysonBarr_clear.txt rename to data/shot_lists/d3d/shotlist_JaysonBarr_clear.txt diff --git a/data/shot_lists/shotlist_JaysonBarr_disrupt.txt b/data/shot_lists/d3d/shotlist_JaysonBarr_disrupt.txt similarity index 100% rename from data/shot_lists/shotlist_JaysonBarr_disrupt.txt rename to data/shot_lists/d3d/shotlist_JaysonBarr_disrupt.txt diff --git a/data/shot_lists/jet/BeWall_clear.txt b/data/shot_lists/jet/BeWall_clear.txt new file mode 100644 index 00000000..29fafbc7 --- /dev/null +++ b/data/shot_lists/jet/BeWall_clear.txt @@ -0,0 +1,1017 @@ +81852 -1.000000 +81853 -1.000000 +81854 -1.000000 +81855 -1.000000 +81856 -1.000000 +81858 -1.000000 +81859 -1.000000 +81860 -1.000000 +81861 -1.000000 +81862 -1.000000 +81863 -1.000000 +81864 -1.000000 +81865 -1.000000 +81866 -1.000000 +81869 -1.000000 +81871 -1.000000 +81872 -1.000000 +81873 -1.000000 +81875 -1.000000 +81878 -1.000000 +81879 -1.000000 +81880 -1.000000 +81881 -1.000000 +81882 -1.000000 +81883 -1.000000 +81884 -1.000000 +81886 -1.000000 +81889 -1.000000 +81890 -1.000000 +81892 -1.000000 +81893 -1.000000 +81894 -1.000000 +81895 -1.000000 +81896 -1.000000 +81897 -1.000000 +81898 -1.000000 +81899 -1.000000 +81903 -1.000000 +81904 -1.000000 +81905 -1.000000 +81906 -1.000000 +81908 -1.000000 +81911 -1.000000 +81913 -1.000000 +81915 -1.000000 +81917 -1.000000 +81920 -1.000000 +81931 -1.000000 +81935 -1.000000 +81936 -1.000000 +81938 -1.000000 +81939 -1.000000 +81940 -1.000000 +81941 -1.000000 +81942 -1.000000 +81943 -1.000000 +81944 -1.000000 +81945 -1.000000 +81946 -1.000000 +81947 -1.000000 +81948 -1.000000 +81950 -1.000000 +81951 -1.000000 +81952 -1.000000 +81954 -1.000000 +81955 -1.000000 +81956 -1.000000 +81957 -1.000000 +81958 -1.000000 +81959 -1.000000 +81960 -1.000000 +81961 -1.000000 +81962 -1.000000 +81963 -1.000000 +81964 -1.000000 +81965 -1.000000 +81966 -1.000000 +81968 -1.000000 +81969 -1.000000 +81970 -1.000000 +81971 -1.000000 +81972 -1.000000 +81973 -1.000000 +81976 -1.000000 +81977 -1.000000 +81979 -1.000000 +81980 -1.000000 +81981 -1.000000 +81982 -1.000000 +81984 -1.000000 +81986 -1.000000 +81987 -1.000000 +81988 -1.000000 +81989 -1.000000 +81991 -1.000000 +81993 -1.000000 +81994 -1.000000 +81995 -1.000000 +81996 -1.000000 +81997 -1.000000 +81998 -1.000000 +81999 -1.000000 +82000 -1.000000 +82003 -1.000000 +82006 -1.000000 +82009 -1.000000 +82010 -1.000000 +82011 -1.000000 +82014 -1.000000 +82019 -1.000000 +82020 -1.000000 +82021 -1.000000 +82022 -1.000000 +82026 -1.000000 +82028 -1.000000 +82030 -1.000000 +82031 -1.000000 +82033 -1.000000 +82035 -1.000000 +82036 -1.000000 +82038 -1.000000 +82040 -1.000000 +82041 -1.000000 +82042 -1.000000 +82043 -1.000000 +82044 -1.000000 +82045 -1.000000 +82046 -1.000000 +82047 -1.000000 +82048 -1.000000 +82049 -1.000000 +82050 -1.000000 +82051 -1.000000 +82052 -1.000000 +82053 -1.000000 +82056 -1.000000 +82057 -1.000000 +82059 -1.000000 +82060 -1.000000 +82061 -1.000000 +82062 -1.000000 +82063 -1.000000 +82064 -1.000000 +82066 -1.000000 +82067 -1.000000 +82068 -1.000000 +82069 -1.000000 +82070 -1.000000 +82073 -1.000000 +82074 -1.000000 +82077 -1.000000 +82078 -1.000000 +82079 -1.000000 +82080 -1.000000 +82081 -1.000000 +82083 -1.000000 +82085 -1.000000 +82087 -1.000000 +82088 -1.000000 +82089 -1.000000 +82090 -1.000000 +82091 -1.000000 +82092 -1.000000 +82093 -1.000000 +82094 -1.000000 +82095 -1.000000 +82096 -1.000000 +82098 -1.000000 +82103 -1.000000 +82105 -1.000000 +82106 -1.000000 +82107 -1.000000 +82108 -1.000000 +82109 -1.000000 +82111 -1.000000 +82112 -1.000000 +82113 -1.000000 +82114 -1.000000 +82115 -1.000000 +82116 -1.000000 +82117 -1.000000 +82118 -1.000000 +82120 -1.000000 +82123 -1.000000 +82125 -1.000000 +82127 -1.000000 +82130 -1.000000 +82131 -1.000000 +82132 -1.000000 +82133 -1.000000 +82134 -1.000000 +82135 -1.000000 +82137 -1.000000 +82138 -1.000000 +82142 -1.000000 +82143 -1.000000 +82144 -1.000000 +82146 -1.000000 +82148 -1.000000 +82150 -1.000000 +82151 -1.000000 +82152 -1.000000 +82153 -1.000000 +82179 -1.000000 +82181 -1.000000 +82182 -1.000000 +82184 -1.000000 +82190 -1.000000 +82191 -1.000000 +82194 -1.000000 +82195 -1.000000 +82197 -1.000000 +82198 -1.000000 +82200 -1.000000 +82201 -1.000000 +82202 -1.000000 +82203 -1.000000 +82205 -1.000000 +82208 -1.000000 +82209 -1.000000 +82216 -1.000000 +82217 -1.000000 +82220 -1.000000 +82221 -1.000000 +82222 -1.000000 +82223 -1.000000 +82225 -1.000000 +82226 -1.000000 +82227 -1.000000 +82230 -1.000000 +82231 -1.000000 +82232 -1.000000 +82233 -1.000000 +82234 -1.000000 +82235 -1.000000 +82236 -1.000000 +82237 -1.000000 +82238 -1.000000 +82239 -1.000000 +82240 -1.000000 +82241 -1.000000 +82242 -1.000000 +82245 -1.000000 +82293 -1.000000 +82294 -1.000000 +82295 -1.000000 +82297 -1.000000 +82300 -1.000000 +82301 -1.000000 +82302 -1.000000 +82305 -1.000000 +82306 -1.000000 +82308 -1.000000 +82310 -1.000000 +82315 -1.000000 +82321 -1.000000 +82323 -1.000000 +82324 -1.000000 +82325 -1.000000 +82326 -1.000000 +82327 -1.000000 +82328 -1.000000 +82329 -1.000000 +82330 -1.000000 +82332 -1.000000 +82341 -1.000000 +82343 -1.000000 +82346 -1.000000 +82347 -1.000000 +82349 -1.000000 +82350 -1.000000 +82351 -1.000000 +82352 -1.000000 +82353 -1.000000 +82354 -1.000000 +82355 -1.000000 +82356 -1.000000 +82357 -1.000000 +82358 -1.000000 +82359 -1.000000 +82361 -1.000000 +82363 -1.000000 +82364 -1.000000 +82366 -1.000000 +82370 -1.000000 +82371 -1.000000 +82373 -1.000000 +82375 -1.000000 +82377 -1.000000 +82378 -1.000000 +82379 -1.000000 +82383 -1.000000 +82384 -1.000000 +82385 -1.000000 +82387 -1.000000 +82394 -1.000000 +82395 -1.000000 +82396 -1.000000 +82399 -1.000000 +82400 -1.000000 +82401 -1.000000 +82402 -1.000000 +82403 -1.000000 +82404 -1.000000 +82405 -1.000000 +82406 -1.000000 +82407 -1.000000 +82408 -1.000000 +82410 -1.000000 +82411 -1.000000 +82412 -1.000000 +82413 -1.000000 +82414 -1.000000 +82416 -1.000000 +82429 -1.000000 +82430 -1.000000 +82431 -1.000000 +82432 -1.000000 +82435 -1.000000 +82436 -1.000000 +82437 -1.000000 +82438 -1.000000 +82439 -1.000000 +82440 -1.000000 +82441 -1.000000 +82442 -1.000000 +82443 -1.000000 +82444 -1.000000 +82445 -1.000000 +82446 -1.000000 +82459 -1.000000 +82462 -1.000000 +82463 -1.000000 +82467 -1.000000 +82468 -1.000000 +82469 -1.000000 +82471 -1.000000 +82472 -1.000000 +82474 -1.000000 +82481 -1.000000 +82482 -1.000000 +82484 -1.000000 +82486 -1.000000 +82488 -1.000000 +82490 -1.000000 +82491 -1.000000 +82492 -1.000000 +82494 -1.000000 +82503 -1.000000 +82505 -1.000000 +82506 -1.000000 +82507 -1.000000 +82508 -1.000000 +82509 -1.000000 +82510 -1.000000 +82511 -1.000000 +82512 -1.000000 +82513 -1.000000 +82514 -1.000000 +82515 -1.000000 +82516 -1.000000 +82517 -1.000000 +82518 -1.000000 +82519 -1.000000 +82520 -1.000000 +82521 -1.000000 +82522 -1.000000 +82523 -1.000000 +82524 -1.000000 +82525 -1.000000 +82526 -1.000000 +82527 -1.000000 +82528 -1.000000 +82532 -1.000000 +82533 -1.000000 +82535 -1.000000 +82536 -1.000000 +82537 -1.000000 +82539 -1.000000 +82540 -1.000000 +82541 -1.000000 +82544 -1.000000 +82545 -1.000000 +82546 -1.000000 +82550 -1.000000 +82552 -1.000000 +82557 -1.000000 +82558 -1.000000 +82560 -1.000000 +82561 -1.000000 +82563 -1.000000 +82564 -1.000000 +82565 -1.000000 +82566 -1.000000 +82568 -1.000000 +82573 -1.000000 +82575 -1.000000 +82576 -1.000000 +82579 -1.000000 +82581 -1.000000 +82582 -1.000000 +82584 -1.000000 +82585 -1.000000 +82592 -1.000000 +82593 -1.000000 +82594 -1.000000 +82595 -1.000000 +82596 -1.000000 +82597 -1.000000 +82598 -1.000000 +82599 -1.000000 +82600 -1.000000 +82601 -1.000000 +82602 -1.000000 +82603 -1.000000 +82604 -1.000000 +82605 -1.000000 +82606 -1.000000 +82607 -1.000000 +82608 -1.000000 +82610 -1.000000 +82612 -1.000000 +82613 -1.000000 +82614 -1.000000 +82615 -1.000000 +82616 -1.000000 +82617 -1.000000 +82618 -1.000000 +82619 -1.000000 +82620 -1.000000 +82621 -1.000000 +82622 -1.000000 +82623 -1.000000 +82624 -1.000000 +82625 -1.000000 +82626 -1.000000 +82628 -1.000000 +82630 -1.000000 +82631 -1.000000 +82633 -1.000000 +82634 -1.000000 +82635 -1.000000 +82636 -1.000000 +82637 -1.000000 +82638 -1.000000 +82640 -1.000000 +82641 -1.000000 +82643 -1.000000 +82644 -1.000000 +82645 -1.000000 +82646 -1.000000 +82649 -1.000000 +82650 -1.000000 +82651 -1.000000 +82655 -1.000000 +82658 -1.000000 +82659 -1.000000 +82660 -1.000000 +82661 -1.000000 +82662 -1.000000 +82666 -1.000000 +82667 -1.000000 +82668 -1.000000 +82670 -1.000000 +82671 -1.000000 +82672 -1.000000 +82677 -1.000000 +82678 -1.000000 +82679 -1.000000 +82680 -1.000000 +82681 -1.000000 +82684 -1.000000 +82686 -1.000000 +82694 -1.000000 +82695 -1.000000 +82696 -1.000000 +82697 -1.000000 +82700 -1.000000 +82701 -1.000000 +82702 -1.000000 +82703 -1.000000 +82704 -1.000000 +82705 -1.000000 +82706 -1.000000 +82707 -1.000000 +82708 -1.000000 +82711 -1.000000 +82715 -1.000000 +82717 -1.000000 +82719 -1.000000 +82720 -1.000000 +82722 -1.000000 +82725 -1.000000 +82727 -1.000000 +82728 -1.000000 +82751 -1.000000 +82755 -1.000000 +82757 -1.000000 +82762 -1.000000 +82763 -1.000000 +82773 -1.000000 +82774 -1.000000 +82776 -1.000000 +82778 -1.000000 +82783 -1.000000 +82784 -1.000000 +82787 -1.000000 +82788 -1.000000 +82789 -1.000000 +82790 -1.000000 +82792 -1.000000 +82793 -1.000000 +82796 -1.000000 +82798 -1.000000 +82799 -1.000000 +82800 -1.000000 +82801 -1.000000 +82802 -1.000000 +82803 -1.000000 +82804 -1.000000 +82806 -1.000000 +82814 -1.000000 +82818 -1.000000 +82832 -1.000000 +82833 -1.000000 +82835 -1.000000 +82836 -1.000000 +82837 -1.000000 +82838 -1.000000 +82839 -1.000000 +82840 -1.000000 +82841 -1.000000 +82842 -1.000000 +82843 -1.000000 +82844 -1.000000 +82845 -1.000000 +82846 -1.000000 +82848 -1.000000 +82849 -1.000000 +82850 -1.000000 +82854 -1.000000 +82855 -1.000000 +82856 -1.000000 +82864 -1.000000 +82865 -1.000000 +82866 -1.000000 +82868 -1.000000 +82881 -1.000000 +82882 -1.000000 +82883 -1.000000 +82885 -1.000000 +82886 -1.000000 +82887 -1.000000 +82888 -1.000000 +82889 -1.000000 +82894 -1.000000 +82897 -1.000000 +82898 -1.000000 +82900 -1.000000 +82902 -1.000000 +82903 -1.000000 +82904 -1.000000 +82935 -1.000000 +82945 -1.000000 +82946 -1.000000 +82947 -1.000000 +82948 -1.000000 +82949 -1.000000 +82950 -1.000000 +82951 -1.000000 +82952 -1.000000 +82953 -1.000000 +82954 -1.000000 +82957 -1.000000 +82959 -1.000000 +82961 -1.000000 +82975 -1.000000 +82977 -1.000000 +82978 -1.000000 +82979 -1.000000 +82982 -1.000000 +82986 -1.000000 +83010 -1.000000 +83011 -1.000000 +83012 -1.000000 +83013 -1.000000 +83014 -1.000000 +83015 -1.000000 +83017 -1.000000 +83018 -1.000000 +83023 -1.000000 +83026 -1.000000 +83028 -1.000000 +83029 -1.000000 +83031 -1.000000 +83032 -1.000000 +83033 -1.000000 +83034 -1.000000 +83035 -1.000000 +83043 -1.000000 +83044 -1.000000 +83050 -1.000000 +83052 -1.000000 +83055 -1.000000 +83058 -1.000000 +83059 -1.000000 +83060 -1.000000 +83061 -1.000000 +83062 -1.000000 +83063 -1.000000 +83064 -1.000000 +83066 -1.000000 +83067 -1.000000 +83068 -1.000000 +83070 -1.000000 +83073 -1.000000 +83075 -1.000000 +83076 -1.000000 +83077 -1.000000 +83078 -1.000000 +83079 -1.000000 +83080 -1.000000 +83081 -1.000000 +83082 -1.000000 +83085 -1.000000 +83086 -1.000000 +83087 -1.000000 +83088 -1.000000 +83089 -1.000000 +83090 -1.000000 +83091 -1.000000 +83095 -1.000000 +83096 -1.000000 +83098 -1.000000 +83099 -1.000000 +83100 -1.000000 +83101 -1.000000 +83102 -1.000000 +83103 -1.000000 +83104 -1.000000 +83105 -1.000000 +83106 -1.000000 +83107 -1.000000 +83108 -1.000000 +83109 -1.000000 +83110 -1.000000 +83111 -1.000000 +83112 -1.000000 +83113 -1.000000 +83114 -1.000000 +83116 -1.000000 +83151 -1.000000 +83152 -1.000000 +83155 -1.000000 +83157 -1.000000 +83158 -1.000000 +83159 -1.000000 +83160 -1.000000 +83163 -1.000000 +83164 -1.000000 +83176 -1.000000 +83178 -1.000000 +83181 -1.000000 +83182 -1.000000 +83184 -1.000000 +83189 -1.000000 +83190 -1.000000 +83193 -1.000000 +83194 -1.000000 +83195 -1.000000 +83196 -1.000000 +83197 -1.000000 +83198 -1.000000 +83199 -1.000000 +83200 -1.000000 +83201 -1.000000 +83202 -1.000000 +83203 -1.000000 +83204 -1.000000 +83208 -1.000000 +83211 -1.000000 +83213 -1.000000 +83214 -1.000000 +83222 -1.000000 +83224 -1.000000 +83225 -1.000000 +83226 -1.000000 +83228 -1.000000 +83229 -1.000000 +83246 -1.000000 +83247 -1.000000 +83248 -1.000000 +83249 -1.000000 +83252 -1.000000 +83262 -1.000000 +83263 -1.000000 +83267 -1.000000 +83268 -1.000000 +83269 -1.000000 +83270 -1.000000 +83271 -1.000000 +83272 -1.000000 +83275 -1.000000 +83277 -1.000000 +83278 -1.000000 +83279 -1.000000 +83280 -1.000000 +83284 -1.000000 +83286 -1.000000 +83287 -1.000000 +83288 -1.000000 +83291 -1.000000 +83293 -1.000000 +83297 -1.000000 +83300 -1.000000 +83302 -1.000000 +83303 -1.000000 +83304 -1.000000 +83306 -1.000000 +83315 -1.000000 +83318 -1.000000 +83319 -1.000000 +83320 -1.000000 +83321 -1.000000 +83322 -1.000000 +83323 -1.000000 +83327 -1.000000 +83334 -1.000000 +83339 -1.000000 +83344 -1.000000 +83345 -1.000000 +83347 -1.000000 +83353 -1.000000 +83357 -1.000000 +83358 -1.000000 +83361 -1.000000 +83364 -1.000000 +83365 -1.000000 +83368 -1.000000 +83369 -1.000000 +83371 -1.000000 +83374 -1.000000 +83375 -1.000000 +83376 -1.000000 +83378 -1.000000 +83379 -1.000000 +83380 -1.000000 +83382 -1.000000 +83383 -1.000000 +83385 -1.000000 +83388 -1.000000 +83389 -1.000000 +83392 -1.000000 +83393 -1.000000 +83394 -1.000000 +83395 -1.000000 +83396 -1.000000 +83397 -1.000000 +83398 -1.000000 +83399 -1.000000 +83401 -1.000000 +83407 -1.000000 +83410 -1.000000 +83414 -1.000000 +83415 -1.000000 +83416 -1.000000 +83419 -1.000000 +83422 -1.000000 +83428 -1.000000 +83429 -1.000000 +83437 -1.000000 +83439 -1.000000 +83440 -1.000000 +83442 -1.000000 +83445 -1.000000 +83446 -1.000000 +83447 -1.000000 +83448 -1.000000 +83449 -1.000000 +83450 -1.000000 +83451 -1.000000 +83454 -1.000000 +83455 -1.000000 +83456 -1.000000 +83457 -1.000000 +83458 -1.000000 +83459 -1.000000 +83460 -1.000000 +83461 -1.000000 +83462 -1.000000 +83464 -1.000000 +83465 -1.000000 +83466 -1.000000 +83468 -1.000000 +83469 -1.000000 +83470 -1.000000 +83471 -1.000000 +83472 -1.000000 +83473 -1.000000 +83474 -1.000000 +83475 -1.000000 +83476 -1.000000 +83477 -1.000000 +83479 -1.000000 +83481 -1.000000 +83484 -1.000000 +83486 -1.000000 +83487 -1.000000 +83488 -1.000000 +83490 -1.000000 +83491 -1.000000 +83492 -1.000000 +83493 -1.000000 +83494 -1.000000 +83495 -1.000000 +83496 -1.000000 +83498 -1.000000 +83505 -1.000000 +83507 -1.000000 +83509 -1.000000 +83511 -1.000000 +83512 -1.000000 +83517 -1.000000 +83520 -1.000000 +83523 -1.000000 +83524 -1.000000 +83525 -1.000000 +83527 -1.000000 +83529 -1.000000 +83535 -1.000000 +83536 -1.000000 +83537 -1.000000 +83538 -1.000000 +83541 -1.000000 +83546 -1.000000 +83547 -1.000000 +83548 -1.000000 +83549 -1.000000 +83550 -1.000000 +83551 -1.000000 +83553 -1.000000 +83556 -1.000000 +83558 -1.000000 +83559 -1.000000 +83560 -1.000000 +83561 -1.000000 +83562 -1.000000 +83563 -1.000000 +83565 -1.000000 +83574 -1.000000 +83578 -1.000000 +83579 -1.000000 +83580 -1.000000 +83581 -1.000000 +83582 -1.000000 +83584 -1.000000 +83585 -1.000000 +83586 -1.000000 +83587 -1.000000 +83588 -1.000000 +83589 -1.000000 +83591 -1.000000 +83592 -1.000000 +83593 -1.000000 +83596 -1.000000 +83597 -1.000000 +83599 -1.000000 +83600 -1.000000 +83603 -1.000000 +83607 -1.000000 +83608 -1.000000 +83609 -1.000000 +83610 -1.000000 +83612 -1.000000 +83613 -1.000000 +83614 -1.000000 +83616 -1.000000 +83617 -1.000000 +83624 -1.000000 +83625 -1.000000 +83626 -1.000000 +83627 -1.000000 +83628 -1.000000 +83629 -1.000000 +83630 -1.000000 +83631 -1.000000 +83632 -1.000000 +83634 -1.000000 +83637 -1.000000 +83640 -1.000000 +83641 -1.000000 +83642 -1.000000 +83643 -1.000000 +83644 -1.000000 +83645 -1.000000 +83646 -1.000000 +83647 -1.000000 +83648 -1.000000 +83649 -1.000000 +83650 -1.000000 +83652 -1.000000 +83653 -1.000000 +83654 -1.000000 +83655 -1.000000 +83656 -1.000000 +83657 -1.000000 +83660 -1.000000 +83661 -1.000000 +83663 -1.000000 +83664 -1.000000 +83665 -1.000000 +83666 -1.000000 +83667 -1.000000 +83668 -1.000000 +83669 -1.000000 +83670 -1.000000 +83671 -1.000000 +83672 -1.000000 +83673 -1.000000 +83674 -1.000000 +83675 -1.000000 +83676 -1.000000 +83677 -1.000000 +83679 -1.000000 +83680 -1.000000 +83682 -1.000000 +83683 -1.000000 +83684 -1.000000 +83686 -1.000000 +83687 -1.000000 +83688 -1.000000 +83689 -1.000000 +83690 -1.000000 +83691 -1.000000 +83692 -1.000000 +83693 -1.000000 +83695 -1.000000 +83696 -1.000000 +83699 -1.000000 +83700 -1.000000 +83701 -1.000000 +83702 -1.000000 +83703 -1.000000 +83704 -1.000000 +83705 -1.000000 +83706 -1.000000 +83707 -1.000000 +83708 -1.000000 +83709 -1.000000 +83710 -1.000000 +83711 -1.000000 +83712 -1.000000 +83713 -1.000000 +83714 -1.000000 +83716 -1.000000 +83720 -1.000000 +83721 -1.000000 +83722 -1.000000 +83723 -1.000000 +83724 -1.000000 +83725 -1.000000 +83726 -1.000000 +83727 -1.000000 +83728 -1.000000 +83729 -1.000000 +83731 -1.000000 +83732 -1.000000 +83733 -1.000000 +83735 -1.000000 +83736 -1.000000 +83737 -1.000000 +83738 -1.000000 +83739 -1.000000 +83740 -1.000000 +83742 -1.000000 +83743 -1.000000 +83745 -1.000000 +83746 -1.000000 +83747 -1.000000 +83750 -1.000000 +83751 -1.000000 +83752 -1.000000 +83753 -1.000000 +83754 -1.000000 +83755 -1.000000 +83756 -1.000000 +83757 -1.000000 +83758 -1.000000 +83759 -1.000000 +83760 -1.000000 +83761 -1.000000 +83762 -1.000000 +83763 -1.000000 +83764 -1.000000 +83765 -1.000000 +83766 -1.000000 +83769 -1.000000 +83770 -1.000000 +83771 -1.000000 +83772 -1.000000 +83773 -1.000000 +83774 -1.000000 +83775 -1.000000 +83776 -1.000000 +83778 -1.000000 +83779 -1.000000 +83780 -1.000000 +83781 -1.000000 +83783 -1.000000 +83784 -1.000000 +83785 -1.000000 +83786 -1.000000 +83788 -1.000000 +83790 -1.000000 +83791 -1.000000 +83792 -1.000000 +83793 -1.000000 diff --git a/data/shot_lists/jet/CFC_unint.txt b/data/shot_lists/jet/CFC_unint.txt new file mode 100644 index 00000000..4e886fbf --- /dev/null +++ b/data/shot_lists/jet/CFC_unint.txt @@ -0,0 +1,309 @@ +66027 49.369087 +66092 56.093697 +66122 64.870400 +66143 56.441856 +66154 57.617409 +66225 46.881790 +66238 65.081345 +66260 64.181252 +66299 45.070335 +66304 65.073151 +66313 64.873474 +66369 44.262402 +66380 58.574848 +66382 69.039101 +66383 69.321732 +66395 51.485695 +66409 47.182850 +66428 50.206718 +66503 47.777794 +66509 47.027199 +66569 46.956543 +66965 49.481728 +66973 50.566143 +66976 51.547134 +67665 59.356159 +67681 42.832897 +67702 64.014336 +67710 58.361855 +67749 73.842690 +67780 61.809666 +67906 72.323074 +67915 72.333313 +67918 58.749950 +67942 59.503616 +67971 51.066879 +67982 63.383553 +67989 63.660030 +67992 65.982468 +67994 65.549309 +67997 68.259842 +68001 56.534016 +68003 62.274559 +68006 58.207233 +68008 63.614975 +68027 56.912895 +68029 65.028099 +68031 65.384445 +68032 65.660927 +68092 55.521278 +68095 65.320961 +68098 57.077759 +68116 57.582592 +68117 56.582146 +68148 64.103424 +68193 64.330750 +68222 56.720383 +68227 60.363777 +68229 59.993088 +68231 65.633278 +68237 60.139519 +68252 65.685501 +68314 62.080002 +68450 64.903168 +68459 65.729538 +68461 65.542145 +68475 59.254784 +68480 60.432385 +68496 58.555393 +68572 60.889088 +68644 51.763199 +68647 54.972416 +68651 49.405953 +68773 44.467201 +68782 47.426559 +68827 46.984192 +68835 44.334080 +68844 44.921856 +68912 55.022591 +68915 54.995968 +68918 49.520641 +68921 44.229633 +68925 45.334530 +68930 51.703808 +68949 50.430977 +68985 43.657215 +68986 51.801086 +68994 43.524097 +69030 43.475967 +69081 49.442818 +69083 45.000706 +69085 45.332481 +69087 49.435650 +69096 50.775040 +69131 70.538239 +69257 46.008320 +69281 50.233345 +69303 43.777023 +69311 43.665409 +69315 43.625473 +69336 68.549629 +69349 55.146496 +69355 58.091518 +69373 68.346878 +69381 45.131775 +69455 44.540928 +69538 61.109249 +69731 52.438015 +69740 57.551872 +69814 46.527489 +69816 46.029823 +69913 51.591167 +69974 48.074753 +69988 61.100033 +70057 55.498753 +70071 44.944386 +70073 52.918270 +70078 46.211071 +70102 62.604286 +70106 62.395393 +70117 58.895359 +70118 60.877823 +70119 62.341122 +70120 64.389122 +70121 59.098110 +70125 58.356735 +70130 57.112576 +70131 58.950657 +70171 64.555008 +70182 63.358975 +70261 50.315266 +70270 50.763775 +70276 48.167934 +70301 52.045822 +70341 48.665600 +70417 50.272255 +70427 61.448193 +70433 60.135426 +70440 65.081345 +70453 62.255104 +70509 65.595390 +70511 66.375679 +70568 59.564034 +70570 59.799553 +70572 59.210751 +70574 64.209923 +70576 64.094208 +70606 64.416771 +70610 44.999680 +70634 66.612221 +70643 60.007423 +70675 61.749249 +70686 67.959808 +70702 72.513535 +70711 65.261566 +70712 56.808449 +70717 63.901695 +72163 62.224999 +72172 68.082802 +72195 47.718201 +72283 69.091003 +72302 43.904800 +72422 58.873600 +72460 53.727402 +72465 58.864201 +72468 51.026001 +72497 60.681999 +72500 58.205601 +72537 43.330200 +72549 44.321201 +72563 57.775002 +72567 56.075401 +72643 61.857601 +72670 43.816002 +72723 55.706600 +72734 54.116402 +72738 45.975399 +72782 43.889599 +72786 43.704800 +72799 59.243401 +72852 62.057800 +72897 43.889801 +72922 60.035000 +73062 57.435200 +73460 56.877399 +73462 54.301399 +73492 43.807999 +73495 44.031799 +73497 44.604199 +73534 63.195599 +73560 60.817200 +73565 61.187401 +73685 57.619999 +73691 57.520802 +73703 49.867600 +73710 46.265999 +73744 43.161400 +73765 57.428799 +73766 57.558800 +73851 66.271797 +73879 63.121800 +73885 63.522999 +73911 65.896401 +73968 59.042801 +73972 55.261799 +73979 55.950600 +74032 51.959400 +74058 50.818802 +74077 56.967800 +74079 51.617401 +74098 59.306599 +74164 69.188599 +74165 61.514801 +74170 58.546600 +74177 49.054600 +74208 42.626801 +74214 50.135799 +74301 68.653999 +74330 56.052399 +74334 59.101399 +74336 58.025200 +74338 58.687401 +74339 62.272400 +74341 58.015202 +74344 57.477600 +74369 68.550003 +74383 43.351799 +74391 68.745201 +74415 64.691803 +74417 64.655602 +74420 56.558399 +74425 57.002399 +74429 63.592999 +74494 53.778400 +74497 48.587200 +74519 64.672600 +74530 47.870998 +74543 45.636200 +74544 45.331001 +74562 51.343601 +74570 51.281799 +74576 51.870400 +74615 63.036598 +74642 44.213799 +74693 61.415001 +74698 50.246399 +74704 58.988201 +74721 46.647598 +74738 43.622799 +74746 45.173000 +74797 63.411400 +74937 59.775799 +74942 56.502201 +75003 49.488201 +75067 57.969200 +75076 43.926800 +75162 69.810402 +75179 62.022598 +75210 57.397202 +75218 45.642601 +75307 65.725403 +75384 43.067001 +75415 63.623798 +75417 59.776402 +75419 57.229000 +75453 43.310799 +75478 60.614800 +75485 57.754398 +75495 65.426003 +75543 58.737202 +75546 63.895802 +75608 65.085403 +75652 65.727997 +75657 65.848602 +75671 43.844799 +75679 60.154598 +75766 49.639401 +75787 44.025398 +75835 55.032799 +75837 55.145199 +75844 59.686600 +75845 57.118801 +75846 58.967800 +75880 50.951000 +75949 43.886601 +75971 53.617199 +76030 55.990398 +76064 44.195400 +76193 58.565800 +76294 63.844002 +76425 64.410004 +76431 70.410202 +76497 44.626000 +76499 44.762798 +76539 64.686997 +76589 42.963600 +76655 70.046204 +76672 56.312401 +76694 68.598801 +76705 66.816803 +76783 44.111198 +76794 44.752399 +76818 63.686001 +76844 42.997398 +76848 43.107800 +76850 43.037998 +76872 62.653000 +76911 44.685600 +76920 61.747799 +76936 51.378601 diff --git a/data/shot_lists/jet/CWall_clear.txt b/data/shot_lists/jet/CWall_clear.txt new file mode 100644 index 00000000..eafed9cf --- /dev/null +++ b/data/shot_lists/jet/CWall_clear.txt @@ -0,0 +1,4019 @@ +73856 -1.000000 +73857 -1.000000 +73859 -1.000000 +73860 -1.000000 +73862 -1.000000 +73863 -1.000000 +73864 -1.000000 +73865 -1.000000 +73866 -1.000000 +73867 -1.000000 +73868 -1.000000 +73869 -1.000000 +73874 -1.000000 +73876 -1.000000 +73877 -1.000000 +73878 -1.000000 +73882 -1.000000 +73883 -1.000000 +73884 -1.000000 +73889 -1.000000 +73890 -1.000000 +73891 -1.000000 +73892 -1.000000 +73893 -1.000000 +73894 -1.000000 +73896 -1.000000 +73897 -1.000000 +73898 -1.000000 +73899 -1.000000 +73900 -1.000000 +73901 -1.000000 +73903 -1.000000 +73904 -1.000000 +73905 -1.000000 +73906 -1.000000 +73907 -1.000000 +73908 -1.000000 +73909 -1.000000 +73910 -1.000000 +73915 -1.000000 +73916 -1.000000 +73917 -1.000000 +73918 -1.000000 +73919 -1.000000 +73920 -1.000000 +73921 -1.000000 +73922 -1.000000 +73923 -1.000000 +73924 -1.000000 +73925 -1.000000 +73926 -1.000000 +73927 -1.000000 +73928 -1.000000 +73929 -1.000000 +73930 -1.000000 +73931 -1.000000 +73935 -1.000000 +73936 -1.000000 +73937 -1.000000 +73938 -1.000000 +73939 -1.000000 +73940 -1.000000 +73941 -1.000000 +73943 -1.000000 +73944 -1.000000 +73945 -1.000000 +73946 -1.000000 +73948 -1.000000 +73949 -1.000000 +73950 -1.000000 +73951 -1.000000 +73952 -1.000000 +73953 -1.000000 +73954 -1.000000 +73955 -1.000000 +73957 -1.000000 +73958 -1.000000 +73959 -1.000000 +73960 -1.000000 +73962 -1.000000 +73964 -1.000000 +73965 -1.000000 +73966 -1.000000 +73970 -1.000000 +73974 -1.000000 +73975 -1.000000 +73976 -1.000000 +73978 -1.000000 +73981 -1.000000 +73982 -1.000000 +73984 -1.000000 +73985 -1.000000 +73986 -1.000000 +73987 -1.000000 +73988 -1.000000 +73989 -1.000000 +73991 -1.000000 +73992 -1.000000 +73993 -1.000000 +73994 -1.000000 +73995 -1.000000 +73996 -1.000000 +73997 -1.000000 +73998 -1.000000 +73999 -1.000000 +74002 -1.000000 +74003 -1.000000 +74004 -1.000000 +74005 -1.000000 +74006 -1.000000 +74007 -1.000000 +74008 -1.000000 +74009 -1.000000 +74010 -1.000000 +74011 -1.000000 +74012 -1.000000 +74013 -1.000000 +74014 -1.000000 +74015 -1.000000 +74017 -1.000000 +74018 -1.000000 +74019 -1.000000 +74020 -1.000000 +74021 -1.000000 +74022 -1.000000 +74023 -1.000000 +74024 -1.000000 +74025 -1.000000 +74026 -1.000000 +74027 -1.000000 +74028 -1.000000 +74029 -1.000000 +74030 -1.000000 +74031 -1.000000 +74034 -1.000000 +74035 -1.000000 +74036 -1.000000 +74037 -1.000000 +74038 -1.000000 +74040 -1.000000 +74041 -1.000000 +74042 -1.000000 +74043 -1.000000 +74044 -1.000000 +74045 -1.000000 +74046 -1.000000 +74047 -1.000000 +74048 -1.000000 +74049 -1.000000 +74050 -1.000000 +74051 -1.000000 +74052 -1.000000 +74053 -1.000000 +74054 -1.000000 +74055 -1.000000 +74056 -1.000000 +74057 -1.000000 +74060 -1.000000 +74061 -1.000000 +74062 -1.000000 +74063 -1.000000 +74064 -1.000000 +74065 -1.000000 +74066 -1.000000 +74067 -1.000000 +74068 -1.000000 +74069 -1.000000 +74070 -1.000000 +74071 -1.000000 +74072 -1.000000 +74073 -1.000000 +74075 -1.000000 +74081 -1.000000 +74082 -1.000000 +74083 -1.000000 +74084 -1.000000 +74085 -1.000000 +74086 -1.000000 +74087 -1.000000 +74088 -1.000000 +74089 -1.000000 +74090 -1.000000 +74091 -1.000000 +74092 -1.000000 +74093 -1.000000 +74094 -1.000000 +74095 -1.000000 +74096 -1.000000 +74097 -1.000000 +74101 -1.000000 +74102 -1.000000 +74103 -1.000000 +74104 -1.000000 +74105 -1.000000 +74106 -1.000000 +74107 -1.000000 +74110 -1.000000 +74111 -1.000000 +74112 -1.000000 +74113 -1.000000 +74114 -1.000000 +74115 -1.000000 +74116 -1.000000 +74117 -1.000000 +74119 -1.000000 +74120 -1.000000 +74121 -1.000000 +74122 -1.000000 +74123 -1.000000 +74124 -1.000000 +74125 -1.000000 +74126 -1.000000 +74127 -1.000000 +74128 -1.000000 +74129 -1.000000 +74130 -1.000000 +74131 -1.000000 +74132 -1.000000 +74133 -1.000000 +74134 -1.000000 +74135 -1.000000 +74136 -1.000000 +74137 -1.000000 +74138 -1.000000 +74139 -1.000000 +74140 -1.000000 +74141 -1.000000 +74142 -1.000000 +74143 -1.000000 +74144 -1.000000 +74145 -1.000000 +74146 -1.000000 +74147 -1.000000 +74149 -1.000000 +74150 -1.000000 +74151 -1.000000 +74152 -1.000000 +74154 -1.000000 +74155 -1.000000 +74156 -1.000000 +74157 -1.000000 +74158 -1.000000 +74159 -1.000000 +74160 -1.000000 +74161 -1.000000 +74162 -1.000000 +74163 -1.000000 +74167 -1.000000 +74168 -1.000000 +74169 -1.000000 +74175 -1.000000 +74176 -1.000000 +74179 -1.000000 +74180 -1.000000 +74181 -1.000000 +74182 -1.000000 +74183 -1.000000 +74184 -1.000000 +74185 -1.000000 +74186 -1.000000 +74187 -1.000000 +74188 -1.000000 +74189 -1.000000 +74190 -1.000000 +74191 -1.000000 +74192 -1.000000 +74193 -1.000000 +74194 -1.000000 +74195 -1.000000 +74197 -1.000000 +74198 -1.000000 +74200 -1.000000 +74201 -1.000000 +74206 -1.000000 +74213 -1.000000 +74216 -1.000000 +74217 -1.000000 +74219 -1.000000 +74220 -1.000000 +74223 -1.000000 +74224 -1.000000 +74225 -1.000000 +74226 -1.000000 +74227 -1.000000 +74228 -1.000000 +74230 -1.000000 +74231 -1.000000 +74232 -1.000000 +74233 -1.000000 +74234 -1.000000 +74235 -1.000000 +74237 -1.000000 +74238 -1.000000 +74239 -1.000000 +74241 -1.000000 +74242 -1.000000 +74243 -1.000000 +74244 -1.000000 +74245 -1.000000 +74246 -1.000000 +74247 -1.000000 +74248 -1.000000 +74249 -1.000000 +74250 -1.000000 +74251 -1.000000 +74252 -1.000000 +74253 -1.000000 +74254 -1.000000 +74255 -1.000000 +74256 -1.000000 +74257 -1.000000 +74258 -1.000000 +74259 -1.000000 +74261 -1.000000 +74262 -1.000000 +74264 -1.000000 +74265 -1.000000 +74266 -1.000000 +74267 -1.000000 +74268 -1.000000 +74269 -1.000000 +74270 -1.000000 +74271 -1.000000 +74272 -1.000000 +74273 -1.000000 +74274 -1.000000 +74275 -1.000000 +74276 -1.000000 +74277 -1.000000 +74278 -1.000000 +74279 -1.000000 +74280 -1.000000 +74281 -1.000000 +74282 -1.000000 +74283 -1.000000 +74284 -1.000000 +74285 -1.000000 +74286 -1.000000 +74288 -1.000000 +74289 -1.000000 +74297 -1.000000 +74298 -1.000000 +74299 -1.000000 +74302 -1.000000 +74303 -1.000000 +74304 -1.000000 +74305 -1.000000 +74306 -1.000000 +74307 -1.000000 +74308 -1.000000 +74309 -1.000000 +74310 -1.000000 +74311 -1.000000 +74312 -1.000000 +74313 -1.000000 +74314 -1.000000 +74315 -1.000000 +74316 -1.000000 +74317 -1.000000 +74318 -1.000000 +74319 -1.000000 +74320 -1.000000 +74321 -1.000000 +74322 -1.000000 +74323 -1.000000 +74324 -1.000000 +74325 -1.000000 +74332 -1.000000 +74333 -1.000000 +74335 -1.000000 +74346 -1.000000 +74347 -1.000000 +74348 -1.000000 +74351 -1.000000 +74352 -1.000000 +74353 -1.000000 +74354 -1.000000 +74355 -1.000000 +74356 -1.000000 +74357 -1.000000 +74358 -1.000000 +74359 -1.000000 +74360 -1.000000 +74361 -1.000000 +74362 -1.000000 +74363 -1.000000 +74364 -1.000000 +74365 -1.000000 +74366 -1.000000 +74367 -1.000000 +74368 -1.000000 +74371 -1.000000 +74373 -1.000000 +74374 -1.000000 +74375 -1.000000 +74376 -1.000000 +74378 -1.000000 +74379 -1.000000 +74380 -1.000000 +74381 -1.000000 +74384 -1.000000 +74386 -1.000000 +74387 -1.000000 +74388 -1.000000 +74389 -1.000000 +74390 -1.000000 +74392 -1.000000 +74395 -1.000000 +74396 -1.000000 +74398 -1.000000 +74399 -1.000000 +74400 -1.000000 +74401 -1.000000 +74402 -1.000000 +74403 -1.000000 +74404 -1.000000 +74405 -1.000000 +74406 -1.000000 +74407 -1.000000 +74410 -1.000000 +74411 -1.000000 +74412 -1.000000 +74414 -1.000000 +74419 -1.000000 +74422 -1.000000 +74423 -1.000000 +74427 -1.000000 +74428 -1.000000 +74431 -1.000000 +74432 -1.000000 +74434 -1.000000 +74438 -1.000000 +74439 -1.000000 +74441 -1.000000 +74443 -1.000000 +74444 -1.000000 +74445 -1.000000 +74446 -1.000000 +74447 -1.000000 +74451 -1.000000 +74453 -1.000000 +74454 -1.000000 +74455 -1.000000 +74457 -1.000000 +74458 -1.000000 +74459 -1.000000 +74460 -1.000000 +74461 -1.000000 +74462 -1.000000 +74463 -1.000000 +74467 -1.000000 +74468 -1.000000 +74469 -1.000000 +74470 -1.000000 +74471 -1.000000 +74472 -1.000000 +74473 -1.000000 +74474 -1.000000 +74475 -1.000000 +74476 -1.000000 +74477 -1.000000 +74478 -1.000000 +74479 -1.000000 +74481 -1.000000 +74483 -1.000000 +74484 -1.000000 +74485 -1.000000 +74486 -1.000000 +74487 -1.000000 +74488 -1.000000 +74489 -1.000000 +74490 -1.000000 +74491 -1.000000 +74492 -1.000000 +74493 -1.000000 +74496 -1.000000 +74502 -1.000000 +74503 -1.000000 +74504 -1.000000 +74508 -1.000000 +74509 -1.000000 +74510 -1.000000 +74511 -1.000000 +74512 -1.000000 +74513 -1.000000 +74514 -1.000000 +74515 -1.000000 +74517 -1.000000 +74521 -1.000000 +74523 -1.000000 +74524 -1.000000 +74525 -1.000000 +74526 -1.000000 +74527 -1.000000 +74528 -1.000000 +74529 -1.000000 +74532 -1.000000 +74536 -1.000000 +74537 -1.000000 +74538 -1.000000 +74539 -1.000000 +74540 -1.000000 +74545 -1.000000 +74548 -1.000000 +74549 -1.000000 +74550 -1.000000 +74551 -1.000000 +74552 -1.000000 +74553 -1.000000 +74554 -1.000000 +74555 -1.000000 +74556 -1.000000 +74557 -1.000000 +74558 -1.000000 +74559 -1.000000 +74560 -1.000000 +74561 -1.000000 +74564 -1.000000 +74565 -1.000000 +74566 -1.000000 +74567 -1.000000 +74568 -1.000000 +74569 -1.000000 +74573 -1.000000 +74574 -1.000000 +74575 -1.000000 +74577 -1.000000 +74580 -1.000000 +74581 -1.000000 +74582 -1.000000 +74583 -1.000000 +74584 -1.000000 +74585 -1.000000 +74586 -1.000000 +74587 -1.000000 +74588 -1.000000 +74589 -1.000000 +74590 -1.000000 +74593 -1.000000 +74596 -1.000000 +74597 -1.000000 +74598 -1.000000 +74599 -1.000000 +74602 -1.000000 +74603 -1.000000 +74604 -1.000000 +74605 -1.000000 +74606 -1.000000 +74607 -1.000000 +74608 -1.000000 +74609 -1.000000 +74610 -1.000000 +74611 -1.000000 +74612 -1.000000 +74613 -1.000000 +74614 -1.000000 +74617 -1.000000 +74618 -1.000000 +74619 -1.000000 +74620 -1.000000 +74621 -1.000000 +74622 -1.000000 +74623 -1.000000 +74625 -1.000000 +74626 -1.000000 +74627 -1.000000 +74628 -1.000000 +74629 -1.000000 +74630 -1.000000 +74631 -1.000000 +74632 -1.000000 +74633 -1.000000 +74634 -1.000000 +74635 -1.000000 +74636 -1.000000 +74637 -1.000000 +74638 -1.000000 +74639 -1.000000 +74640 -1.000000 +74641 -1.000000 +74643 -1.000000 +74644 -1.000000 +74646 -1.000000 +74647 -1.000000 +74648 -1.000000 +74650 -1.000000 +74651 -1.000000 +74652 -1.000000 +74657 -1.000000 +74658 -1.000000 +74659 -1.000000 +74660 -1.000000 +74661 -1.000000 +74662 -1.000000 +74663 -1.000000 +74664 -1.000000 +74665 -1.000000 +74666 -1.000000 +74667 -1.000000 +74668 -1.000000 +74669 -1.000000 +74670 -1.000000 +74672 -1.000000 +74673 -1.000000 +74674 -1.000000 +74675 -1.000000 +74676 -1.000000 +74677 -1.000000 +74678 -1.000000 +74679 -1.000000 +74680 -1.000000 +74681 -1.000000 +74682 -1.000000 +74684 -1.000000 +74685 -1.000000 +74686 -1.000000 +74687 -1.000000 +74688 -1.000000 +74689 -1.000000 +74690 -1.000000 +74691 -1.000000 +74692 -1.000000 +74696 -1.000000 +74697 -1.000000 +74699 -1.000000 +74700 -1.000000 +74701 -1.000000 +74702 -1.000000 +74703 -1.000000 +74705 -1.000000 +74706 -1.000000 +74708 -1.000000 +74709 -1.000000 +74710 -1.000000 +74711 -1.000000 +74713 -1.000000 +74715 -1.000000 +74716 -1.000000 +74717 -1.000000 +74719 -1.000000 +74720 -1.000000 +74724 -1.000000 +74726 -1.000000 +74727 -1.000000 +74728 -1.000000 +74729 -1.000000 +74730 -1.000000 +74732 -1.000000 +74733 -1.000000 +74735 -1.000000 +74736 -1.000000 +74737 -1.000000 +74739 -1.000000 +74740 -1.000000 +74741 -1.000000 +74742 -1.000000 +74743 -1.000000 +74744 -1.000000 +74745 -1.000000 +74748 -1.000000 +74749 -1.000000 +74750 -1.000000 +74751 -1.000000 +74752 -1.000000 +74753 -1.000000 +74754 -1.000000 +74755 -1.000000 +74756 -1.000000 +74757 -1.000000 +74758 -1.000000 +74759 -1.000000 +74760 -1.000000 +74761 -1.000000 +74762 -1.000000 +74763 -1.000000 +74764 -1.000000 +74765 -1.000000 +74767 -1.000000 +74768 -1.000000 +74769 -1.000000 +74770 -1.000000 +74771 -1.000000 +74772 -1.000000 +74773 -1.000000 +74774 -1.000000 +74775 -1.000000 +74776 -1.000000 +74777 -1.000000 +74778 -1.000000 +74779 -1.000000 +74781 -1.000000 +74782 -1.000000 +74783 -1.000000 +74784 -1.000000 +74785 -1.000000 +74787 -1.000000 +74788 -1.000000 +74789 -1.000000 +74790 -1.000000 +74791 -1.000000 +74792 -1.000000 +74793 -1.000000 +74794 -1.000000 +74795 -1.000000 +74798 -1.000000 +74799 -1.000000 +74800 -1.000000 +74801 -1.000000 +74802 -1.000000 +74803 -1.000000 +74804 -1.000000 +74805 -1.000000 +74807 -1.000000 +74811 -1.000000 +74812 -1.000000 +74816 -1.000000 +74819 -1.000000 +74820 -1.000000 +74822 -1.000000 +74824 -1.000000 +74827 -1.000000 +74831 -1.000000 +74833 -1.000000 +74834 -1.000000 +74836 -1.000000 +74840 -1.000000 +74841 -1.000000 +74842 -1.000000 +74845 -1.000000 +74846 -1.000000 +74847 -1.000000 +74849 -1.000000 +74850 -1.000000 +74851 -1.000000 +74855 -1.000000 +74859 -1.000000 +74870 -1.000000 +74871 -1.000000 +74872 -1.000000 +74880 -1.000000 +74881 -1.000000 +74885 -1.000000 +74886 -1.000000 +74889 -1.000000 +74891 -1.000000 +74892 -1.000000 +74894 -1.000000 +74897 -1.000000 +74898 -1.000000 +74900 -1.000000 +74901 -1.000000 +74902 -1.000000 +74903 -1.000000 +74904 -1.000000 +74905 -1.000000 +74906 -1.000000 +74907 -1.000000 +74908 -1.000000 +74909 -1.000000 +74910 -1.000000 +74911 -1.000000 +74912 -1.000000 +74913 -1.000000 +74915 -1.000000 +74916 -1.000000 +74917 -1.000000 +74918 -1.000000 +74919 -1.000000 +74920 -1.000000 +74921 -1.000000 +74922 -1.000000 +74924 -1.000000 +74925 -1.000000 +74926 -1.000000 +74927 -1.000000 +74928 -1.000000 +74929 -1.000000 +74930 -1.000000 +74931 -1.000000 +74932 -1.000000 +74933 -1.000000 +74934 -1.000000 +74935 -1.000000 +74936 -1.000000 +74939 -1.000000 +74940 -1.000000 +74941 -1.000000 +74944 -1.000000 +74945 -1.000000 +74946 -1.000000 +74947 -1.000000 +74948 -1.000000 +74949 -1.000000 +74950 -1.000000 +74951 -1.000000 +74952 -1.000000 +74956 -1.000000 +74957 -1.000000 +74958 -1.000000 +74959 -1.000000 +74960 -1.000000 +74961 -1.000000 +74962 -1.000000 +74963 -1.000000 +74964 -1.000000 +74965 -1.000000 +74966 -1.000000 +74967 -1.000000 +74968 -1.000000 +74969 -1.000000 +74970 -1.000000 +74971 -1.000000 +74972 -1.000000 +74973 -1.000000 +74974 -1.000000 +74975 -1.000000 +74976 -1.000000 +74977 -1.000000 +74978 -1.000000 +74979 -1.000000 +74980 -1.000000 +74981 -1.000000 +74982 -1.000000 +74983 -1.000000 +74984 -1.000000 +74985 -1.000000 +74986 -1.000000 +74987 -1.000000 +74988 -1.000000 +74989 -1.000000 +74990 -1.000000 +74991 -1.000000 +74992 -1.000000 +74993 -1.000000 +74994 -1.000000 +74995 -1.000000 +74997 -1.000000 +74998 -1.000000 +74999 -1.000000 +75000 -1.000000 +75001 -1.000000 +75002 -1.000000 +75005 -1.000000 +75006 -1.000000 +75008 -1.000000 +75009 -1.000000 +75010 -1.000000 +75011 -1.000000 +75012 -1.000000 +75014 -1.000000 +75015 -1.000000 +75016 -1.000000 +75017 -1.000000 +75018 -1.000000 +75019 -1.000000 +75020 -1.000000 +75021 -1.000000 +75023 -1.000000 +75024 -1.000000 +75025 -1.000000 +75026 -1.000000 +75027 -1.000000 +75028 -1.000000 +75030 -1.000000 +75032 -1.000000 +75033 -1.000000 +75034 -1.000000 +75035 -1.000000 +75036 -1.000000 +75037 -1.000000 +75038 -1.000000 +75039 -1.000000 +75040 -1.000000 +75041 -1.000000 +75042 -1.000000 +75043 -1.000000 +75044 -1.000000 +75045 -1.000000 +75046 -1.000000 +75047 -1.000000 +75048 -1.000000 +75049 -1.000000 +75050 -1.000000 +75051 -1.000000 +75052 -1.000000 +75053 -1.000000 +75054 -1.000000 +75055 -1.000000 +75057 -1.000000 +75058 -1.000000 +75059 -1.000000 +75060 -1.000000 +75064 -1.000000 +75065 -1.000000 +75066 -1.000000 +75068 -1.000000 +75069 -1.000000 +75070 -1.000000 +75071 -1.000000 +75072 -1.000000 +75073 -1.000000 +75074 -1.000000 +75075 -1.000000 +75078 -1.000000 +75079 -1.000000 +75080 -1.000000 +75081 -1.000000 +75082 -1.000000 +75083 -1.000000 +75085 -1.000000 +75086 -1.000000 +75087 -1.000000 +75088 -1.000000 +75089 -1.000000 +75090 -1.000000 +75091 -1.000000 +75092 -1.000000 +75093 -1.000000 +75094 -1.000000 +75095 -1.000000 +75096 -1.000000 +75097 -1.000000 +75098 -1.000000 +75099 -1.000000 +75100 -1.000000 +75101 -1.000000 +75102 -1.000000 +75103 -1.000000 +75104 -1.000000 +75105 -1.000000 +75106 -1.000000 +75107 -1.000000 +75108 -1.000000 +75109 -1.000000 +75110 -1.000000 +75111 -1.000000 +75112 -1.000000 +75113 -1.000000 +75114 -1.000000 +75115 -1.000000 +75117 -1.000000 +75118 -1.000000 +75119 -1.000000 +75120 -1.000000 +75121 -1.000000 +75122 -1.000000 +75123 -1.000000 +75124 -1.000000 +75125 -1.000000 +75126 -1.000000 +75127 -1.000000 +75128 -1.000000 +75129 -1.000000 +75130 -1.000000 +75131 -1.000000 +75132 -1.000000 +75133 -1.000000 +75134 -1.000000 +75135 -1.000000 +75136 -1.000000 +75137 -1.000000 +75138 -1.000000 +75140 -1.000000 +75141 -1.000000 +75142 -1.000000 +75144 -1.000000 +75145 -1.000000 +75146 -1.000000 +75147 -1.000000 +75148 -1.000000 +75149 -1.000000 +75150 -1.000000 +75151 -1.000000 +75152 -1.000000 +75153 -1.000000 +75154 -1.000000 +75155 -1.000000 +75156 -1.000000 +75157 -1.000000 +75158 -1.000000 +75159 -1.000000 +75160 -1.000000 +75161 -1.000000 +75164 -1.000000 +75165 -1.000000 +75166 -1.000000 +75167 -1.000000 +75168 -1.000000 +75170 -1.000000 +75171 -1.000000 +75172 -1.000000 +75173 -1.000000 +75174 -1.000000 +75175 -1.000000 +75176 -1.000000 +75177 -1.000000 +75178 -1.000000 +75181 -1.000000 +75182 -1.000000 +75183 -1.000000 +75184 -1.000000 +75185 -1.000000 +75186 -1.000000 +75187 -1.000000 +75188 -1.000000 +75189 -1.000000 +75190 -1.000000 +75191 -1.000000 +75193 -1.000000 +75194 -1.000000 +75195 -1.000000 +75196 -1.000000 +75200 -1.000000 +75201 -1.000000 +75202 -1.000000 +75203 -1.000000 +75204 -1.000000 +75205 -1.000000 +75206 -1.000000 +75207 -1.000000 +75208 -1.000000 +75209 -1.000000 +75212 -1.000000 +75213 -1.000000 +75215 -1.000000 +75216 -1.000000 +75217 -1.000000 +75220 -1.000000 +75221 -1.000000 +75222 -1.000000 +75223 -1.000000 +75224 -1.000000 +75225 -1.000000 +75226 -1.000000 +75228 -1.000000 +75229 -1.000000 +75230 -1.000000 +75231 -1.000000 +75232 -1.000000 +75233 -1.000000 +75234 -1.000000 +75235 -1.000000 +75236 -1.000000 +75237 -1.000000 +75238 -1.000000 +75239 -1.000000 +75240 -1.000000 +75241 -1.000000 +75242 -1.000000 +75243 -1.000000 +75244 -1.000000 +75245 -1.000000 +75246 -1.000000 +75247 -1.000000 +75271 -1.000000 +75277 -1.000000 +75278 -1.000000 +75282 -1.000000 +75284 -1.000000 +75286 -1.000000 +75287 -1.000000 +75288 -1.000000 +75289 -1.000000 +75290 -1.000000 +75291 -1.000000 +75292 -1.000000 +75293 -1.000000 +75294 -1.000000 +75295 -1.000000 +75296 -1.000000 +75297 -1.000000 +75298 -1.000000 +75300 -1.000000 +75301 -1.000000 +75302 -1.000000 +75303 -1.000000 +75304 -1.000000 +75305 -1.000000 +75306 -1.000000 +75309 -1.000000 +75310 -1.000000 +75311 -1.000000 +75312 -1.000000 +75313 -1.000000 +75314 -1.000000 +75315 -1.000000 +75316 -1.000000 +75317 -1.000000 +75318 -1.000000 +75319 -1.000000 +75321 -1.000000 +75322 -1.000000 +75323 -1.000000 +75324 -1.000000 +75325 -1.000000 +75326 -1.000000 +75327 -1.000000 +75328 -1.000000 +75329 -1.000000 +75330 -1.000000 +75333 -1.000000 +75337 -1.000000 +75341 -1.000000 +75345 -1.000000 +75346 -1.000000 +75347 -1.000000 +75348 -1.000000 +75349 -1.000000 +75350 -1.000000 +75364 -1.000000 +75366 -1.000000 +75367 -1.000000 +75368 -1.000000 +75369 -1.000000 +75370 -1.000000 +75371 -1.000000 +75372 -1.000000 +75380 -1.000000 +75381 -1.000000 +75382 -1.000000 +75383 -1.000000 +75385 -1.000000 +75386 -1.000000 +75387 -1.000000 +75388 -1.000000 +75389 -1.000000 +75390 -1.000000 +75391 -1.000000 +75392 -1.000000 +75393 -1.000000 +75394 -1.000000 +75395 -1.000000 +75396 -1.000000 +75397 -1.000000 +75398 -1.000000 +75399 -1.000000 +75400 -1.000000 +75401 -1.000000 +75402 -1.000000 +75403 -1.000000 +75404 -1.000000 +75405 -1.000000 +75406 -1.000000 +75407 -1.000000 +75410 -1.000000 +75411 -1.000000 +75412 -1.000000 +75413 -1.000000 +75414 -1.000000 +75422 -1.000000 +75425 -1.000000 +75429 -1.000000 +75430 -1.000000 +75431 -1.000000 +75432 -1.000000 +75433 -1.000000 +75434 -1.000000 +75435 -1.000000 +75436 -1.000000 +75439 -1.000000 +75440 -1.000000 +75441 -1.000000 +75442 -1.000000 +75443 -1.000000 +75444 -1.000000 +75446 -1.000000 +75447 -1.000000 +75448 -1.000000 +75449 -1.000000 +75450 -1.000000 +75451 -1.000000 +75452 -1.000000 +75454 -1.000000 +75455 -1.000000 +75456 -1.000000 +75457 -1.000000 +75458 -1.000000 +75459 -1.000000 +75460 -1.000000 +75461 -1.000000 +75462 -1.000000 +75463 -1.000000 +75464 -1.000000 +75465 -1.000000 +75466 -1.000000 +75468 -1.000000 +75469 -1.000000 +75470 -1.000000 +75471 -1.000000 +75472 -1.000000 +75473 -1.000000 +75474 -1.000000 +75476 -1.000000 +75477 -1.000000 +75481 -1.000000 +75482 -1.000000 +75484 -1.000000 +75487 -1.000000 +75488 -1.000000 +75489 -1.000000 +75491 -1.000000 +75492 -1.000000 +75493 -1.000000 +75494 -1.000000 +75497 -1.000000 +75498 -1.000000 +75499 -1.000000 +75500 -1.000000 +75501 -1.000000 +75502 -1.000000 +75503 -1.000000 +75504 -1.000000 +75505 -1.000000 +75506 -1.000000 +75507 -1.000000 +75508 -1.000000 +75509 -1.000000 +75510 -1.000000 +75511 -1.000000 +75512 -1.000000 +75513 -1.000000 +75514 -1.000000 +75516 -1.000000 +75517 -1.000000 +75518 -1.000000 +75519 -1.000000 +75520 -1.000000 +75521 -1.000000 +75522 -1.000000 +75523 -1.000000 +75524 -1.000000 +75525 -1.000000 +75526 -1.000000 +75527 -1.000000 +75528 -1.000000 +75529 -1.000000 +75530 -1.000000 +75531 -1.000000 +75532 -1.000000 +75533 -1.000000 +75534 -1.000000 +75535 -1.000000 +75536 -1.000000 +75537 -1.000000 +75538 -1.000000 +75539 -1.000000 +75540 -1.000000 +75541 -1.000000 +75545 -1.000000 +75548 -1.000000 +75549 -1.000000 +75550 -1.000000 +75551 -1.000000 +75552 -1.000000 +75553 -1.000000 +75554 -1.000000 +75555 -1.000000 +75556 -1.000000 +75557 -1.000000 +75558 -1.000000 +75559 -1.000000 +75560 -1.000000 +75561 -1.000000 +75562 -1.000000 +75563 -1.000000 +75564 -1.000000 +75565 -1.000000 +75566 -1.000000 +75567 -1.000000 +75568 -1.000000 +75569 -1.000000 +75570 -1.000000 +75571 -1.000000 +75573 -1.000000 +75574 -1.000000 +75575 -1.000000 +75576 -1.000000 +75577 -1.000000 +75578 -1.000000 +75580 -1.000000 +75581 -1.000000 +75582 -1.000000 +75583 -1.000000 +75584 -1.000000 +75585 -1.000000 +75586 -1.000000 +75587 -1.000000 +75588 -1.000000 +75589 -1.000000 +75590 -1.000000 +75591 -1.000000 +75592 -1.000000 +75593 -1.000000 +75594 -1.000000 +75595 -1.000000 +75596 -1.000000 +75597 -1.000000 +75598 -1.000000 +75599 -1.000000 +75602 -1.000000 +75603 -1.000000 +75604 -1.000000 +75605 -1.000000 +75606 -1.000000 +75607 -1.000000 +75610 -1.000000 +75611 -1.000000 +75616 -1.000000 +75617 -1.000000 +75618 -1.000000 +75620 -1.000000 +75623 -1.000000 +75624 -1.000000 +75625 -1.000000 +75626 -1.000000 +75627 -1.000000 +75628 -1.000000 +75629 -1.000000 +75630 -1.000000 +75631 -1.000000 +75632 -1.000000 +75634 -1.000000 +75635 -1.000000 +75636 -1.000000 +75637 -1.000000 +75638 -1.000000 +75639 -1.000000 +75640 -1.000000 +75641 -1.000000 +75642 -1.000000 +75643 -1.000000 +75644 -1.000000 +75645 -1.000000 +75646 -1.000000 +75647 -1.000000 +75648 -1.000000 +75649 -1.000000 +75650 -1.000000 +75651 -1.000000 +75654 -1.000000 +75655 -1.000000 +75656 -1.000000 +75660 -1.000000 +75661 -1.000000 +75662 -1.000000 +75664 -1.000000 +75665 -1.000000 +75666 -1.000000 +75667 -1.000000 +75668 -1.000000 +75670 -1.000000 +75672 -1.000000 +75676 -1.000000 +75677 -1.000000 +75680 -1.000000 +75681 -1.000000 +75683 -1.000000 +75684 -1.000000 +75685 -1.000000 +75686 -1.000000 +75687 -1.000000 +75688 -1.000000 +75693 -1.000000 +75694 -1.000000 +75696 -1.000000 +75697 -1.000000 +75698 -1.000000 +75699 -1.000000 +75700 -1.000000 +75701 -1.000000 +75702 -1.000000 +75703 -1.000000 +75704 -1.000000 +75705 -1.000000 +75706 -1.000000 +75707 -1.000000 +75708 -1.000000 +75709 -1.000000 +75710 -1.000000 +75711 -1.000000 +75712 -1.000000 +75713 -1.000000 +75714 -1.000000 +75715 -1.000000 +75716 -1.000000 +75718 -1.000000 +75719 -1.000000 +75720 -1.000000 +75722 -1.000000 +75723 -1.000000 +75724 -1.000000 +75725 -1.000000 +75726 -1.000000 +75727 -1.000000 +75733 -1.000000 +75734 -1.000000 +75735 -1.000000 +75737 -1.000000 +75738 -1.000000 +75739 -1.000000 +75740 -1.000000 +75741 -1.000000 +75742 -1.000000 +75743 -1.000000 +75744 -1.000000 +75745 -1.000000 +75746 -1.000000 +75747 -1.000000 +75748 -1.000000 +75749 -1.000000 +75750 -1.000000 +75752 -1.000000 +75754 -1.000000 +75755 -1.000000 +75756 -1.000000 +75757 -1.000000 +75758 -1.000000 +75759 -1.000000 +75760 -1.000000 +75761 -1.000000 +75763 -1.000000 +75764 -1.000000 +75765 -1.000000 +75767 -1.000000 +75770 -1.000000 +75771 -1.000000 +75772 -1.000000 +75773 -1.000000 +75775 -1.000000 +75776 -1.000000 +75777 -1.000000 +75779 -1.000000 +75781 -1.000000 +75782 -1.000000 +75783 -1.000000 +75784 -1.000000 +75785 -1.000000 +75788 -1.000000 +75789 -1.000000 +75791 -1.000000 +75792 -1.000000 +75793 -1.000000 +75794 -1.000000 +75795 -1.000000 +75796 -1.000000 +75797 -1.000000 +75798 -1.000000 +75801 -1.000000 +75802 -1.000000 +75803 -1.000000 +75804 -1.000000 +75805 -1.000000 +75806 -1.000000 +75807 -1.000000 +75808 -1.000000 +75809 -1.000000 +75810 -1.000000 +75812 -1.000000 +75813 -1.000000 +75814 -1.000000 +75815 -1.000000 +75816 -1.000000 +75817 -1.000000 +75818 -1.000000 +75819 -1.000000 +75820 -1.000000 +75821 -1.000000 +75822 -1.000000 +75823 -1.000000 +75824 -1.000000 +75825 -1.000000 +75827 -1.000000 +75828 -1.000000 +75829 -1.000000 +75830 -1.000000 +75831 -1.000000 +75832 -1.000000 +75833 -1.000000 +75834 -1.000000 +75839 -1.000000 +75841 -1.000000 +75842 -1.000000 +75843 -1.000000 +75847 -1.000000 +75848 -1.000000 +75849 -1.000000 +75850 -1.000000 +75851 -1.000000 +75852 -1.000000 +75853 -1.000000 +75854 -1.000000 +75856 -1.000000 +75857 -1.000000 +75858 -1.000000 +75859 -1.000000 +75860 -1.000000 +75861 -1.000000 +75862 -1.000000 +75863 -1.000000 +75864 -1.000000 +75865 -1.000000 +75866 -1.000000 +75867 -1.000000 +75868 -1.000000 +75869 -1.000000 +75870 -1.000000 +75871 -1.000000 +75872 -1.000000 +75873 -1.000000 +75874 -1.000000 +75875 -1.000000 +75876 -1.000000 +75877 -1.000000 +75878 -1.000000 +75879 -1.000000 +75882 -1.000000 +75883 -1.000000 +75884 -1.000000 +75885 -1.000000 +75886 -1.000000 +75888 -1.000000 +75898 -1.000000 +75899 -1.000000 +75902 -1.000000 +75904 -1.000000 +75905 -1.000000 +75906 -1.000000 +75909 -1.000000 +75910 -1.000000 +75911 -1.000000 +75912 -1.000000 +75913 -1.000000 +75914 -1.000000 +75915 -1.000000 +75916 -1.000000 +75917 -1.000000 +75918 -1.000000 +75921 -1.000000 +75922 -1.000000 +75923 -1.000000 +75924 -1.000000 +75925 -1.000000 +75926 -1.000000 +75927 -1.000000 +75928 -1.000000 +75929 -1.000000 +75930 -1.000000 +75931 -1.000000 +75933 -1.000000 +75934 -1.000000 +75935 -1.000000 +75936 -1.000000 +75937 -1.000000 +75938 -1.000000 +75939 -1.000000 +75940 -1.000000 +75941 -1.000000 +75942 -1.000000 +75943 -1.000000 +75944 -1.000000 +75945 -1.000000 +75946 -1.000000 +75947 -1.000000 +75950 -1.000000 +75952 -1.000000 +75953 -1.000000 +75954 -1.000000 +75956 -1.000000 +75957 -1.000000 +75958 -1.000000 +75959 -1.000000 +75960 -1.000000 +75961 -1.000000 +75962 -1.000000 +75963 -1.000000 +75964 -1.000000 +75965 -1.000000 +75966 -1.000000 +75967 -1.000000 +75968 -1.000000 +75970 -1.000000 +75973 -1.000000 +75974 -1.000000 +75975 -1.000000 +75976 -1.000000 +75977 -1.000000 +75978 -1.000000 +75979 -1.000000 +75981 -1.000000 +75982 -1.000000 +75984 -1.000000 +75985 -1.000000 +75986 -1.000000 +75987 -1.000000 +75988 -1.000000 +75989 -1.000000 +75990 -1.000000 +75991 -1.000000 +75992 -1.000000 +75993 -1.000000 +75994 -1.000000 +75995 -1.000000 +75996 -1.000000 +75997 -1.000000 +75998 -1.000000 +75999 -1.000000 +76000 -1.000000 +76001 -1.000000 +76002 -1.000000 +76003 -1.000000 +76004 -1.000000 +76005 -1.000000 +76010 -1.000000 +76011 -1.000000 +76012 -1.000000 +76013 -1.000000 +76014 -1.000000 +76016 -1.000000 +76017 -1.000000 +76018 -1.000000 +76019 -1.000000 +76020 -1.000000 +76021 -1.000000 +76022 -1.000000 +76023 -1.000000 +76024 -1.000000 +76025 -1.000000 +76026 -1.000000 +76027 -1.000000 +76029 -1.000000 +76033 -1.000000 +76034 -1.000000 +76035 -1.000000 +76036 -1.000000 +76037 -1.000000 +76038 -1.000000 +76039 -1.000000 +76040 -1.000000 +76041 -1.000000 +76042 -1.000000 +76043 -1.000000 +76044 -1.000000 +76045 -1.000000 +76046 -1.000000 +76047 -1.000000 +76048 -1.000000 +76049 -1.000000 +76050 -1.000000 +76051 -1.000000 +76053 -1.000000 +76056 -1.000000 +76057 -1.000000 +76058 -1.000000 +76060 -1.000000 +76061 -1.000000 +76062 -1.000000 +76063 -1.000000 +76065 -1.000000 +76066 -1.000000 +76067 -1.000000 +76068 -1.000000 +76069 -1.000000 +76070 -1.000000 +76071 -1.000000 +76072 -1.000000 +76073 -1.000000 +76074 -1.000000 +76075 -1.000000 +76076 -1.000000 +76077 -1.000000 +76078 -1.000000 +76079 -1.000000 +76080 -1.000000 +76081 -1.000000 +76082 -1.000000 +76083 -1.000000 +76084 -1.000000 +76085 -1.000000 +76086 -1.000000 +76088 -1.000000 +76089 -1.000000 +76090 -1.000000 +76091 -1.000000 +76092 -1.000000 +76094 -1.000000 +76095 -1.000000 +76096 -1.000000 +76097 -1.000000 +76098 -1.000000 +76099 -1.000000 +76100 -1.000000 +76101 -1.000000 +76102 -1.000000 +76103 -1.000000 +76104 -1.000000 +76105 -1.000000 +76106 -1.000000 +76107 -1.000000 +76108 -1.000000 +76109 -1.000000 +76110 -1.000000 +76111 -1.000000 +76112 -1.000000 +76113 -1.000000 +76114 -1.000000 +76115 -1.000000 +76117 -1.000000 +76118 -1.000000 +76119 -1.000000 +76120 -1.000000 +76121 -1.000000 +76123 -1.000000 +76124 -1.000000 +76125 -1.000000 +76126 -1.000000 +76127 -1.000000 +76128 -1.000000 +76129 -1.000000 +76130 -1.000000 +76131 -1.000000 +76133 -1.000000 +76134 -1.000000 +76135 -1.000000 +76136 -1.000000 +76137 -1.000000 +76138 -1.000000 +76139 -1.000000 +76141 -1.000000 +76142 -1.000000 +76143 -1.000000 +76144 -1.000000 +76145 -1.000000 +76146 -1.000000 +76147 -1.000000 +76148 -1.000000 +76149 -1.000000 +76151 -1.000000 +76152 -1.000000 +76153 -1.000000 +76154 -1.000000 +76155 -1.000000 +76156 -1.000000 +76157 -1.000000 +76158 -1.000000 +76159 -1.000000 +76160 -1.000000 +76161 -1.000000 +76162 -1.000000 +76163 -1.000000 +76164 -1.000000 +76165 -1.000000 +76166 -1.000000 +76167 -1.000000 +76168 -1.000000 +76169 -1.000000 +76170 -1.000000 +76171 -1.000000 +76172 -1.000000 +76173 -1.000000 +76174 -1.000000 +76175 -1.000000 +76176 -1.000000 +76177 -1.000000 +76178 -1.000000 +76179 -1.000000 +76180 -1.000000 +76182 -1.000000 +76183 -1.000000 +76184 -1.000000 +76185 -1.000000 +76186 -1.000000 +76187 -1.000000 +76188 -1.000000 +76189 -1.000000 +76190 -1.000000 +76191 -1.000000 +76192 -1.000000 +76195 -1.000000 +76196 -1.000000 +76197 -1.000000 +76198 -1.000000 +76199 -1.000000 +76200 -1.000000 +76201 -1.000000 +76202 -1.000000 +76203 -1.000000 +76204 -1.000000 +76205 -1.000000 +76206 -1.000000 +76208 -1.000000 +76209 -1.000000 +76210 -1.000000 +76211 -1.000000 +76212 -1.000000 +76213 -1.000000 +76214 -1.000000 +76215 -1.000000 +76216 -1.000000 +76217 -1.000000 +76218 -1.000000 +76219 -1.000000 +76220 -1.000000 +76221 -1.000000 +76222 -1.000000 +76223 -1.000000 +76224 -1.000000 +76225 -1.000000 +76226 -1.000000 +76227 -1.000000 +76228 -1.000000 +76229 -1.000000 +76230 -1.000000 +76231 -1.000000 +76233 -1.000000 +76234 -1.000000 +76235 -1.000000 +76236 -1.000000 +76237 -1.000000 +76238 -1.000000 +76240 -1.000000 +76241 -1.000000 +76242 -1.000000 +76243 -1.000000 +76244 -1.000000 +76246 -1.000000 +76247 -1.000000 +76248 -1.000000 +76249 -1.000000 +76250 -1.000000 +76255 -1.000000 +76259 -1.000000 +76262 -1.000000 +76265 -1.000000 +76267 -1.000000 +76268 -1.000000 +76269 -1.000000 +76271 -1.000000 +76272 -1.000000 +76273 -1.000000 +76274 -1.000000 +76275 -1.000000 +76276 -1.000000 +76277 -1.000000 +76278 -1.000000 +76279 -1.000000 +76280 -1.000000 +76281 -1.000000 +76283 -1.000000 +76287 -1.000000 +76288 -1.000000 +76289 -1.000000 +76290 -1.000000 +76291 -1.000000 +76296 -1.000000 +76297 -1.000000 +76298 -1.000000 +76300 -1.000000 +76301 -1.000000 +76303 -1.000000 +76304 -1.000000 +76305 -1.000000 +76306 -1.000000 +76307 -1.000000 +76308 -1.000000 +76309 -1.000000 +76311 -1.000000 +76312 -1.000000 +76313 -1.000000 +76329 -1.000000 +76396 -1.000000 +76400 -1.000000 +76404 -1.000000 +76406 -1.000000 +76408 -1.000000 +76409 -1.000000 +76410 -1.000000 +76411 -1.000000 +76412 -1.000000 +76413 -1.000000 +76414 -1.000000 +76415 -1.000000 +76416 -1.000000 +76417 -1.000000 +76418 -1.000000 +76419 -1.000000 +76420 -1.000000 +76421 -1.000000 +76422 -1.000000 +76426 -1.000000 +76428 -1.000000 +76430 -1.000000 +76434 -1.000000 +76437 -1.000000 +76438 -1.000000 +76440 -1.000000 +76441 -1.000000 +76442 -1.000000 +76443 -1.000000 +76444 -1.000000 +76445 -1.000000 +76446 -1.000000 +76447 -1.000000 +76448 -1.000000 +76449 -1.000000 +76450 -1.000000 +76451 -1.000000 +76452 -1.000000 +76453 -1.000000 +76454 -1.000000 +76455 -1.000000 +76456 -1.000000 +76457 -1.000000 +76458 -1.000000 +76460 -1.000000 +76461 -1.000000 +76462 -1.000000 +76463 -1.000000 +76464 -1.000000 +76465 -1.000000 +76466 -1.000000 +76467 -1.000000 +76468 -1.000000 +76469 -1.000000 +76470 -1.000000 +76471 -1.000000 +76472 -1.000000 +76473 -1.000000 +76474 -1.000000 +76475 -1.000000 +76476 -1.000000 +76477 -1.000000 +76478 -1.000000 +76479 -1.000000 +76480 -1.000000 +76481 -1.000000 +76482 -1.000000 +76483 -1.000000 +76485 -1.000000 +76486 -1.000000 +76487 -1.000000 +76488 -1.000000 +76489 -1.000000 +76490 -1.000000 +76492 -1.000000 +76493 -1.000000 +76494 -1.000000 +76495 -1.000000 +76496 -1.000000 +76498 -1.000000 +76501 -1.000000 +76502 -1.000000 +76503 -1.000000 +76504 -1.000000 +76505 -1.000000 +76506 -1.000000 +76507 -1.000000 +76508 -1.000000 +76509 -1.000000 +76510 -1.000000 +76511 -1.000000 +76514 -1.000000 +76515 -1.000000 +76516 -1.000000 +76518 -1.000000 +76519 -1.000000 +76520 -1.000000 +76521 -1.000000 +76522 -1.000000 +76523 -1.000000 +76525 -1.000000 +76526 -1.000000 +76527 -1.000000 +76528 -1.000000 +76529 -1.000000 +76531 -1.000000 +76542 -1.000000 +76543 -1.000000 +76546 -1.000000 +76547 -1.000000 +76548 -1.000000 +76549 -1.000000 +76550 -1.000000 +76551 -1.000000 +76552 -1.000000 +76553 -1.000000 +76554 -1.000000 +76555 -1.000000 +76556 -1.000000 +76557 -1.000000 +76558 -1.000000 +76559 -1.000000 +76560 -1.000000 +76561 -1.000000 +76562 -1.000000 +76563 -1.000000 +76564 -1.000000 +76565 -1.000000 +76567 -1.000000 +76568 -1.000000 +76569 -1.000000 +76570 -1.000000 +76571 -1.000000 +76572 -1.000000 +76573 -1.000000 +76574 -1.000000 +76575 -1.000000 +76576 -1.000000 +76577 -1.000000 +76578 -1.000000 +76579 -1.000000 +76580 -1.000000 +76581 -1.000000 +76582 -1.000000 +76583 -1.000000 +76584 -1.000000 +76585 -1.000000 +76586 -1.000000 +76587 -1.000000 +76588 -1.000000 +76591 -1.000000 +76594 -1.000000 +76595 -1.000000 +76597 -1.000000 +76599 -1.000000 +76600 -1.000000 +76601 -1.000000 +76602 -1.000000 +76603 -1.000000 +76604 -1.000000 +76605 -1.000000 +76606 -1.000000 +76607 -1.000000 +76608 -1.000000 +76609 -1.000000 +76610 -1.000000 +76611 -1.000000 +76612 -1.000000 +76613 -1.000000 +76614 -1.000000 +76615 -1.000000 +76616 -1.000000 +76617 -1.000000 +76618 -1.000000 +76619 -1.000000 +76620 -1.000000 +76621 -1.000000 +76622 -1.000000 +76623 -1.000000 +76624 -1.000000 +76625 -1.000000 +76626 -1.000000 +76627 -1.000000 +76628 -1.000000 +76629 -1.000000 +76630 -1.000000 +76631 -1.000000 +76632 -1.000000 +76634 -1.000000 +76635 -1.000000 +76636 -1.000000 +76637 -1.000000 +76638 -1.000000 +76639 -1.000000 +76640 -1.000000 +76641 -1.000000 +76642 -1.000000 +76643 -1.000000 +76644 -1.000000 +76645 -1.000000 +76646 -1.000000 +76647 -1.000000 +76648 -1.000000 +76649 -1.000000 +76650 -1.000000 +76651 -1.000000 +76652 -1.000000 +76653 -1.000000 +76654 -1.000000 +76659 -1.000000 +76660 -1.000000 +76661 -1.000000 +76662 -1.000000 +76663 -1.000000 +76665 -1.000000 +76666 -1.000000 +76667 -1.000000 +76668 -1.000000 +76669 -1.000000 +76670 -1.000000 +76671 -1.000000 +76675 -1.000000 +76676 -1.000000 +76677 -1.000000 +76678 -1.000000 +76679 -1.000000 +76680 -1.000000 +76681 -1.000000 +76683 -1.000000 +76685 -1.000000 +76686 -1.000000 +76687 -1.000000 +76688 -1.000000 +76689 -1.000000 +76690 -1.000000 +76691 -1.000000 +76693 -1.000000 +76696 -1.000000 +76697 -1.000000 +76698 -1.000000 +76699 -1.000000 +76700 -1.000000 +76701 -1.000000 +76702 -1.000000 +76703 -1.000000 +76704 -1.000000 +76707 -1.000000 +76708 -1.000000 +76709 -1.000000 +76710 -1.000000 +76711 -1.000000 +76712 -1.000000 +76713 -1.000000 +76714 -1.000000 +76715 -1.000000 +76716 -1.000000 +76717 -1.000000 +76720 -1.000000 +76721 -1.000000 +76722 -1.000000 +76723 -1.000000 +76724 -1.000000 +76725 -1.000000 +76726 -1.000000 +76727 -1.000000 +76728 -1.000000 +76729 -1.000000 +76732 -1.000000 +76733 -1.000000 +76734 -1.000000 +76735 -1.000000 +76736 -1.000000 +76737 -1.000000 +76738 -1.000000 +76739 -1.000000 +76740 -1.000000 +76741 -1.000000 +76742 -1.000000 +76744 -1.000000 +76745 -1.000000 +76746 -1.000000 +76747 -1.000000 +76748 -1.000000 +76749 -1.000000 +76750 -1.000000 +76751 -1.000000 +76752 -1.000000 +76753 -1.000000 +76754 -1.000000 +76755 -1.000000 +76756 -1.000000 +76757 -1.000000 +76758 -1.000000 +76761 -1.000000 +76762 -1.000000 +76763 -1.000000 +76764 -1.000000 +76766 -1.000000 +76767 -1.000000 +76768 -1.000000 +76769 -1.000000 +76771 -1.000000 +76772 -1.000000 +76773 -1.000000 +76774 -1.000000 +76775 -1.000000 +76776 -1.000000 +76777 -1.000000 +76778 -1.000000 +76779 -1.000000 +76780 -1.000000 +76781 -1.000000 +76782 -1.000000 +76784 -1.000000 +76786 -1.000000 +76787 -1.000000 +76789 -1.000000 +76790 -1.000000 +76791 -1.000000 +76792 -1.000000 +76793 -1.000000 +76798 -1.000000 +76800 -1.000000 +76801 -1.000000 +76802 -1.000000 +76803 -1.000000 +76804 -1.000000 +76805 -1.000000 +76806 -1.000000 +76807 -1.000000 +76808 -1.000000 +76809 -1.000000 +76810 -1.000000 +76811 -1.000000 +76816 -1.000000 +76824 -1.000000 +76827 -1.000000 +76828 -1.000000 +76831 -1.000000 +76832 -1.000000 +76833 -1.000000 +76834 -1.000000 +76835 -1.000000 +76836 -1.000000 +76837 -1.000000 +76838 -1.000000 +76840 -1.000000 +76841 -1.000000 +76843 -1.000000 +76845 -1.000000 +76846 -1.000000 +76847 -1.000000 +76849 -1.000000 +76853 -1.000000 +76854 -1.000000 +76855 -1.000000 +76856 -1.000000 +76857 -1.000000 +76858 -1.000000 +76859 -1.000000 +76864 -1.000000 +76865 -1.000000 +76866 -1.000000 +76867 -1.000000 +76868 -1.000000 +76869 -1.000000 +76870 -1.000000 +76871 -1.000000 +76873 -1.000000 +76874 -1.000000 +76875 -1.000000 +76876 -1.000000 +76877 -1.000000 +76878 -1.000000 +76879 -1.000000 +76880 -1.000000 +76881 -1.000000 +76882 -1.000000 +76884 -1.000000 +76885 -1.000000 +76886 -1.000000 +76887 -1.000000 +76888 -1.000000 +76889 -1.000000 +76891 -1.000000 +76892 -1.000000 +76893 -1.000000 +76894 -1.000000 +76895 -1.000000 +76896 -1.000000 +76897 -1.000000 +76898 -1.000000 +76899 -1.000000 +76900 -1.000000 +76901 -1.000000 +76902 -1.000000 +76903 -1.000000 +76904 -1.000000 +76905 -1.000000 +76906 -1.000000 +76907 -1.000000 +76909 -1.000000 +76910 -1.000000 +76913 -1.000000 +76914 -1.000000 +76915 -1.000000 +76916 -1.000000 +76917 -1.000000 +76918 -1.000000 +76922 -1.000000 +76923 -1.000000 +76924 -1.000000 +76925 -1.000000 +76926 -1.000000 +76927 -1.000000 +76928 -1.000000 +76929 -1.000000 +76930 -1.000000 +76931 -1.000000 +76932 -1.000000 +76933 -1.000000 +76934 -1.000000 +76935 -1.000000 +76938 -1.000000 +76939 -1.000000 +76940 -1.000000 +76941 -1.000000 +76945 -1.000000 +76947 -1.000000 +76948 -1.000000 +76949 -1.000000 +76970 -1.000000 +76971 -1.000000 +76972 -1.000000 +76974 -1.000000 +76975 -1.000000 +76978 -1.000000 +76979 -1.000000 +76980 -1.000000 +76981 -1.000000 +76982 -1.000000 +76983 -1.000000 +76984 -1.000000 +76986 -1.000000 +76987 -1.000000 +76988 -1.000000 +76989 -1.000000 +76990 -1.000000 +76994 -1.000000 +76995 -1.000000 +76997 -1.000000 +76998 -1.000000 +76999 -1.000000 +77000 -1.000000 +77001 -1.000000 +77002 -1.000000 +77003 -1.000000 +77005 -1.000000 +77006 -1.000000 +77007 -1.000000 +77008 -1.000000 +77009 -1.000000 +77010 -1.000000 +77011 -1.000000 +77012 -1.000000 +77013 -1.000000 +77014 -1.000000 +77015 -1.000000 +77016 -1.000000 +77017 -1.000000 +77018 -1.000000 +77019 -1.000000 +77020 -1.000000 +77021 -1.000000 +77025 -1.000000 +77027 -1.000000 +77029 -1.000000 +77030 -1.000000 +77032 -1.000000 +77033 -1.000000 +77034 -1.000000 +77035 -1.000000 +77037 -1.000000 +77038 -1.000000 +77040 -1.000000 +77042 -1.000000 +77043 -1.000000 +77044 -1.000000 +77045 -1.000000 +77046 -1.000000 +77047 -1.000000 +77048 -1.000000 +77049 -1.000000 +77050 -1.000000 +77052 -1.000000 +77053 -1.000000 +77054 -1.000000 +77055 -1.000000 +77056 -1.000000 +77059 -1.000000 +77061 -1.000000 +77062 -1.000000 +77063 -1.000000 +77064 -1.000000 +77065 -1.000000 +77066 -1.000000 +77067 -1.000000 +77068 -1.000000 +77069 -1.000000 +77070 -1.000000 +77071 -1.000000 +77073 -1.000000 +77074 -1.000000 +77075 -1.000000 +77076 -1.000000 +77077 -1.000000 +77080 -1.000000 +77082 -1.000000 +77083 -1.000000 +77084 -1.000000 +77085 -1.000000 +77086 -1.000000 +77089 -1.000000 +77090 -1.000000 +77091 -1.000000 +77092 -1.000000 +77093 -1.000000 +77094 -1.000000 +77095 -1.000000 +77096 -1.000000 +77097 -1.000000 +77099 -1.000000 +77100 -1.000000 +77101 -1.000000 +77102 -1.000000 +77103 -1.000000 +77104 -1.000000 +77105 -1.000000 +77106 -1.000000 +77107 -1.000000 +77108 -1.000000 +77109 -1.000000 +77110 -1.000000 +77117 -1.000000 +77118 -1.000000 +77119 -1.000000 +77121 -1.000000 +77122 -1.000000 +77123 -1.000000 +77124 -1.000000 +77125 -1.000000 +77126 -1.000000 +77127 -1.000000 +77128 -1.000000 +77129 -1.000000 +77130 -1.000000 +77132 -1.000000 +77133 -1.000000 +77134 -1.000000 +77136 -1.000000 +77137 -1.000000 +77138 -1.000000 +77139 -1.000000 +77140 -1.000000 +77141 -1.000000 +77142 -1.000000 +77143 -1.000000 +77144 -1.000000 +77145 -1.000000 +77146 -1.000000 +77147 -1.000000 +77148 -1.000000 +77149 -1.000000 +77150 -1.000000 +77151 -1.000000 +77152 -1.000000 +77153 -1.000000 +77154 -1.000000 +77155 -1.000000 +77156 -1.000000 +77157 -1.000000 +77158 -1.000000 +77159 -1.000000 +77160 -1.000000 +77161 -1.000000 +77162 -1.000000 +77164 -1.000000 +77165 -1.000000 +77166 -1.000000 +77167 -1.000000 +77168 -1.000000 +77169 -1.000000 +77170 -1.000000 +77171 -1.000000 +77172 -1.000000 +77173 -1.000000 +77174 -1.000000 +77175 -1.000000 +77178 -1.000000 +77179 -1.000000 +77180 -1.000000 +77181 -1.000000 +77182 -1.000000 +77184 -1.000000 +77185 -1.000000 +77186 -1.000000 +77187 -1.000000 +77188 -1.000000 +77189 -1.000000 +77191 -1.000000 +77196 -1.000000 +77197 -1.000000 +77198 -1.000000 +77199 -1.000000 +77200 -1.000000 +77201 -1.000000 +77202 -1.000000 +77203 -1.000000 +77204 -1.000000 +77205 -1.000000 +77206 -1.000000 +77207 -1.000000 +77208 -1.000000 +77209 -1.000000 +77210 -1.000000 +77211 -1.000000 +77212 -1.000000 +77213 -1.000000 +77214 -1.000000 +77215 -1.000000 +77216 -1.000000 +77217 -1.000000 +77218 -1.000000 +77219 -1.000000 +77220 -1.000000 +77224 -1.000000 +77226 -1.000000 +77227 -1.000000 +77228 -1.000000 +77229 -1.000000 +77230 -1.000000 +77231 -1.000000 +77232 -1.000000 +77234 -1.000000 +77236 -1.000000 +77237 -1.000000 +77238 -1.000000 +77239 -1.000000 +77241 -1.000000 +77242 -1.000000 +77243 -1.000000 +77244 -1.000000 +77245 -1.000000 +77246 -1.000000 +77247 -1.000000 +77248 -1.000000 +77249 -1.000000 +77250 -1.000000 +77252 -1.000000 +77253 -1.000000 +77254 -1.000000 +77255 -1.000000 +77256 -1.000000 +77257 -1.000000 +77258 -1.000000 +77259 -1.000000 +77260 -1.000000 +77261 -1.000000 +77262 -1.000000 +77263 -1.000000 +77264 -1.000000 +77265 -1.000000 +77266 -1.000000 +77267 -1.000000 +77268 -1.000000 +77269 -1.000000 +77270 -1.000000 +77271 -1.000000 +77272 -1.000000 +77275 -1.000000 +77276 -1.000000 +77277 -1.000000 +77278 -1.000000 +77279 -1.000000 +77280 -1.000000 +77281 -1.000000 +77282 -1.000000 +77283 -1.000000 +77284 -1.000000 +77286 -1.000000 +77287 -1.000000 +77288 -1.000000 +77289 -1.000000 +77290 -1.000000 +77291 -1.000000 +77292 -1.000000 +77293 -1.000000 +77294 -1.000000 +77295 -1.000000 +77296 -1.000000 +77297 -1.000000 +77298 -1.000000 +77299 -1.000000 +77300 -1.000000 +77301 -1.000000 +77302 -1.000000 +77303 -1.000000 +77304 -1.000000 +77305 -1.000000 +77306 -1.000000 +77307 -1.000000 +77308 -1.000000 +77309 -1.000000 +77310 -1.000000 +77311 -1.000000 +77313 -1.000000 +77314 -1.000000 +77315 -1.000000 +77316 -1.000000 +77317 -1.000000 +77318 -1.000000 +77319 -1.000000 +77320 -1.000000 +77321 -1.000000 +77322 -1.000000 +77326 -1.000000 +77329 -1.000000 +77330 -1.000000 +77331 -1.000000 +77332 -1.000000 +77333 -1.000000 +77334 -1.000000 +77335 -1.000000 +77336 -1.000000 +77337 -1.000000 +77338 -1.000000 +77339 -1.000000 +77340 -1.000000 +77342 -1.000000 +77344 -1.000000 +77345 -1.000000 +77346 -1.000000 +77347 -1.000000 +77348 -1.000000 +77349 -1.000000 +77351 -1.000000 +77353 -1.000000 +77361 -1.000000 +77362 -1.000000 +77363 -1.000000 +77364 -1.000000 +77368 -1.000000 +77369 -1.000000 +77370 -1.000000 +77371 -1.000000 +77374 -1.000000 +77375 -1.000000 +77376 -1.000000 +77381 -1.000000 +77382 -1.000000 +77383 -1.000000 +77384 -1.000000 +77385 -1.000000 +77386 -1.000000 +77387 -1.000000 +77388 -1.000000 +77389 -1.000000 +77390 -1.000000 +77391 -1.000000 +77392 -1.000000 +77393 -1.000000 +77395 -1.000000 +77396 -1.000000 +77397 -1.000000 +77398 -1.000000 +77399 -1.000000 +77400 -1.000000 +77401 -1.000000 +77402 -1.000000 +77403 -1.000000 +77404 -1.000000 +77405 -1.000000 +77408 -1.000000 +77409 -1.000000 +77410 -1.000000 +77411 -1.000000 +77412 -1.000000 +77413 -1.000000 +77414 -1.000000 +77415 -1.000000 +77416 -1.000000 +77417 -1.000000 +77419 -1.000000 +77420 -1.000000 +77421 -1.000000 +77422 -1.000000 +77423 -1.000000 +77424 -1.000000 +77425 -1.000000 +77426 -1.000000 +77427 -1.000000 +77428 -1.000000 +77429 -1.000000 +77431 -1.000000 +77432 -1.000000 +77433 -1.000000 +77434 -1.000000 +77435 -1.000000 +77436 -1.000000 +77437 -1.000000 +77438 -1.000000 +77439 -1.000000 +77442 -1.000000 +77443 -1.000000 +77444 -1.000000 +77445 -1.000000 +77446 -1.000000 +77447 -1.000000 +77448 -1.000000 +77449 -1.000000 +77450 -1.000000 +77451 -1.000000 +77453 -1.000000 +77454 -1.000000 +77458 -1.000000 +77460 -1.000000 +77461 -1.000000 +77462 -1.000000 +77463 -1.000000 +77464 -1.000000 +77467 -1.000000 +77468 -1.000000 +77469 -1.000000 +77471 -1.000000 +77472 -1.000000 +77473 -1.000000 +77474 -1.000000 +77475 -1.000000 +77476 -1.000000 +77477 -1.000000 +77478 -1.000000 +77479 -1.000000 +77480 -1.000000 +77483 -1.000000 +77485 -1.000000 +77487 -1.000000 +77488 -1.000000 +77489 -1.000000 +77490 -1.000000 +77492 -1.000000 +77495 -1.000000 +77496 -1.000000 +77497 -1.000000 +77498 -1.000000 +77499 -1.000000 +77500 -1.000000 +77502 -1.000000 +77503 -1.000000 +77506 -1.000000 +77507 -1.000000 +77509 -1.000000 +77510 -1.000000 +77511 -1.000000 +77540 -1.000000 +77541 -1.000000 +77542 -1.000000 +77543 -1.000000 +77544 -1.000000 +77545 -1.000000 +77546 -1.000000 +77547 -1.000000 +77548 -1.000000 +77549 -1.000000 +77550 -1.000000 +77551 -1.000000 +77552 -1.000000 +77553 -1.000000 +77554 -1.000000 +77555 -1.000000 +77556 -1.000000 +77557 -1.000000 +77558 -1.000000 +77559 -1.000000 +77560 -1.000000 +77561 -1.000000 +77562 -1.000000 +77563 -1.000000 +77564 -1.000000 +77565 -1.000000 +77566 -1.000000 +77567 -1.000000 +77568 -1.000000 +77569 -1.000000 +77570 -1.000000 +77571 -1.000000 +77572 -1.000000 +77573 -1.000000 +77574 -1.000000 +77576 -1.000000 +77577 -1.000000 +77578 -1.000000 +77579 -1.000000 +77580 -1.000000 +77581 -1.000000 +77582 -1.000000 +77584 -1.000000 +77585 -1.000000 +77586 -1.000000 +77587 -1.000000 +77588 -1.000000 +77589 -1.000000 +77590 -1.000000 +77591 -1.000000 +77592 -1.000000 +77593 -1.000000 +77594 -1.000000 +77595 -1.000000 +77596 -1.000000 +77597 -1.000000 +77598 -1.000000 +77599 -1.000000 +77600 -1.000000 +77601 -1.000000 +77602 -1.000000 +77603 -1.000000 +77605 -1.000000 +77606 -1.000000 +77607 -1.000000 +77608 -1.000000 +77609 -1.000000 +77610 -1.000000 +77611 -1.000000 +77612 -1.000000 +77615 -1.000000 +77616 -1.000000 +77618 -1.000000 +77619 -1.000000 +77620 -1.000000 +77621 -1.000000 +77622 -1.000000 +77623 -1.000000 +77624 -1.000000 +77625 -1.000000 +77626 -1.000000 +77627 -1.000000 +77628 -1.000000 +77629 -1.000000 +77631 -1.000000 +77632 -1.000000 +77633 -1.000000 +77634 -1.000000 +77635 -1.000000 +77637 -1.000000 +77639 -1.000000 +77640 -1.000000 +77641 -1.000000 +77642 -1.000000 +77645 -1.000000 +77646 -1.000000 +77647 -1.000000 +77648 -1.000000 +77649 -1.000000 +77650 -1.000000 +77653 -1.000000 +77655 -1.000000 +77657 -1.000000 +77670 -1.000000 +77671 -1.000000 +77672 -1.000000 +77673 -1.000000 +77674 -1.000000 +77677 -1.000000 +77678 -1.000000 +77680 -1.000000 +77681 -1.000000 +77682 -1.000000 +77685 -1.000000 +77686 -1.000000 +77687 -1.000000 +77688 -1.000000 +77689 -1.000000 +77691 -1.000000 +77692 -1.000000 +77693 -1.000000 +77694 -1.000000 +77695 -1.000000 +77697 -1.000000 +77698 -1.000000 +77699 -1.000000 +77700 -1.000000 +77701 -1.000000 +77702 -1.000000 +77703 -1.000000 +77704 -1.000000 +77705 -1.000000 +77706 -1.000000 +77707 -1.000000 +77708 -1.000000 +77709 -1.000000 +77710 -1.000000 +77712 -1.000000 +77713 -1.000000 +77714 -1.000000 +77715 -1.000000 +77717 -1.000000 +77718 -1.000000 +77719 -1.000000 +77720 -1.000000 +77721 -1.000000 +77722 -1.000000 +77723 -1.000000 +77725 -1.000000 +77726 -1.000000 +77728 -1.000000 +77729 -1.000000 +77730 -1.000000 +77731 -1.000000 +77732 -1.000000 +77733 -1.000000 +77734 -1.000000 +77735 -1.000000 +77736 -1.000000 +77737 -1.000000 +77738 -1.000000 +77739 -1.000000 +77740 -1.000000 +77741 -1.000000 +77742 -1.000000 +77743 -1.000000 +77745 -1.000000 +77746 -1.000000 +77747 -1.000000 +77748 -1.000000 +77749 -1.000000 +77750 -1.000000 +77751 -1.000000 +77752 -1.000000 +77757 -1.000000 +77758 -1.000000 +77759 -1.000000 +77760 -1.000000 +77761 -1.000000 +77762 -1.000000 +77763 -1.000000 +77764 -1.000000 +77766 -1.000000 +77767 -1.000000 +77768 -1.000000 +77769 -1.000000 +77770 -1.000000 +77771 -1.000000 +77772 -1.000000 +77773 -1.000000 +77774 -1.000000 +77775 -1.000000 +77776 -1.000000 +77777 -1.000000 +77778 -1.000000 +77779 -1.000000 +77780 -1.000000 +77781 -1.000000 +77783 -1.000000 +77784 -1.000000 +77785 -1.000000 +77786 -1.000000 +77787 -1.000000 +77788 -1.000000 +77789 -1.000000 +77790 -1.000000 +77791 -1.000000 +77792 -1.000000 +77793 -1.000000 +77794 -1.000000 +77795 -1.000000 +77796 -1.000000 +77798 -1.000000 +77799 -1.000000 +77802 -1.000000 +77819 -1.000000 +77822 -1.000000 +77823 -1.000000 +77833 -1.000000 +77834 -1.000000 +77836 -1.000000 +77837 -1.000000 +77838 -1.000000 +77839 -1.000000 +77840 -1.000000 +77843 -1.000000 +77844 -1.000000 +77846 -1.000000 +77847 -1.000000 +77848 -1.000000 +77849 -1.000000 +77851 -1.000000 +77852 -1.000000 +77853 -1.000000 +77854 -1.000000 +77855 -1.000000 +77856 -1.000000 +77857 -1.000000 +77858 -1.000000 +77859 -1.000000 +77860 -1.000000 +77862 -1.000000 +77863 -1.000000 +77864 -1.000000 +77865 -1.000000 +77866 -1.000000 +77867 -1.000000 +77868 -1.000000 +77869 -1.000000 +77870 -1.000000 +77871 -1.000000 +77873 -1.000000 +77874 -1.000000 +77875 -1.000000 +77876 -1.000000 +77877 -1.000000 +77878 -1.000000 +77879 -1.000000 +77880 -1.000000 +77881 -1.000000 +77883 -1.000000 +77884 -1.000000 +77885 -1.000000 +77886 -1.000000 +77887 -1.000000 +77888 -1.000000 +77889 -1.000000 +77892 -1.000000 +77893 -1.000000 +77894 -1.000000 +77895 -1.000000 +77898 -1.000000 +77899 -1.000000 +77900 -1.000000 +77901 -1.000000 +77902 -1.000000 +77904 -1.000000 +77905 -1.000000 +77906 -1.000000 +77907 -1.000000 +77908 -1.000000 +77909 -1.000000 +77910 -1.000000 +77911 -1.000000 +77912 -1.000000 +77913 -1.000000 +77914 -1.000000 +77915 -1.000000 +77916 -1.000000 +77918 -1.000000 +77919 -1.000000 +77920 -1.000000 +77921 -1.000000 +77922 -1.000000 +77923 -1.000000 +77924 -1.000000 +77925 -1.000000 +77926 -1.000000 +77927 -1.000000 +77929 -1.000000 +77931 -1.000000 +77932 -1.000000 +77933 -1.000000 +77936 -1.000000 +77937 -1.000000 +77938 -1.000000 +77939 -1.000000 +77940 -1.000000 +77942 -1.000000 +77943 -1.000000 +77945 -1.000000 +77946 -1.000000 +77947 -1.000000 +77948 -1.000000 +77949 -1.000000 +77950 -1.000000 +77953 -1.000000 +77954 -1.000000 +77955 -1.000000 +77958 -1.000000 +77959 -1.000000 +77960 -1.000000 +77961 -1.000000 +77962 -1.000000 +77963 -1.000000 +77964 -1.000000 +77965 -1.000000 +77966 -1.000000 +77982 -1.000000 +77987 -1.000000 +77989 -1.000000 +77990 -1.000000 +77991 -1.000000 +77992 -1.000000 +77993 -1.000000 +77994 -1.000000 +77995 -1.000000 +77997 -1.000000 +77998 -1.000000 +77999 -1.000000 +78000 -1.000000 +78001 -1.000000 +78002 -1.000000 +78003 -1.000000 +78004 -1.000000 +78005 -1.000000 +78006 -1.000000 +78008 -1.000000 +78009 -1.000000 +78010 -1.000000 +78011 -1.000000 +78014 -1.000000 +78018 -1.000000 +78019 -1.000000 +78020 -1.000000 +78021 -1.000000 +78022 -1.000000 +78023 -1.000000 +78024 -1.000000 +78025 -1.000000 +78031 -1.000000 +78032 -1.000000 +78033 -1.000000 +78034 -1.000000 +78035 -1.000000 +78037 -1.000000 +78038 -1.000000 +78040 -1.000000 +78041 -1.000000 +78042 -1.000000 +78043 -1.000000 +78044 -1.000000 +78045 -1.000000 +78046 -1.000000 +78047 -1.000000 +78050 -1.000000 +78051 -1.000000 +78052 -1.000000 +78053 -1.000000 +78055 -1.000000 +78056 -1.000000 +78058 -1.000000 +78060 -1.000000 +78061 -1.000000 +78062 -1.000000 +78063 -1.000000 +78064 -1.000000 +78065 -1.000000 +78066 -1.000000 +78067 -1.000000 +78068 -1.000000 +78069 -1.000000 +78070 -1.000000 +78071 -1.000000 +78072 -1.000000 +78073 -1.000000 +78074 -1.000000 +78075 -1.000000 +78076 -1.000000 +78077 -1.000000 +78078 -1.000000 +78080 -1.000000 +78083 -1.000000 +78084 -1.000000 +78085 -1.000000 +78088 -1.000000 +78089 -1.000000 +78090 -1.000000 +78091 -1.000000 +78092 -1.000000 +78095 -1.000000 +78097 -1.000000 +78098 -1.000000 +78103 -1.000000 +78104 -1.000000 +78105 -1.000000 +78106 -1.000000 +78107 -1.000000 +78108 -1.000000 +78109 -1.000000 +78111 -1.000000 +78114 -1.000000 +78116 -1.000000 +78117 -1.000000 +78118 -1.000000 +78119 -1.000000 +78120 -1.000000 +78122 -1.000000 +78123 -1.000000 +78124 -1.000000 +78125 -1.000000 +78126 -1.000000 +78127 -1.000000 +78130 -1.000000 +78131 -1.000000 +78132 -1.000000 +78133 -1.000000 +78134 -1.000000 +78135 -1.000000 +78136 -1.000000 +78137 -1.000000 +78139 -1.000000 +78140 -1.000000 +78141 -1.000000 +78142 -1.000000 +78143 -1.000000 +78144 -1.000000 +78145 -1.000000 +78146 -1.000000 +78147 -1.000000 +78148 -1.000000 +78149 -1.000000 +78150 -1.000000 +78151 -1.000000 +78152 -1.000000 +78153 -1.000000 +78155 -1.000000 +78156 -1.000000 +78296 -1.000000 +78297 -1.000000 +78298 -1.000000 +78299 -1.000000 +78306 -1.000000 +78307 -1.000000 +78316 -1.000000 +78320 -1.000000 +78321 -1.000000 +78322 -1.000000 +78323 -1.000000 +78324 -1.000000 +78325 -1.000000 +78326 -1.000000 +78327 -1.000000 +78328 -1.000000 +78329 -1.000000 +78330 -1.000000 +78331 -1.000000 +78332 -1.000000 +78345 -1.000000 +78346 -1.000000 +78347 -1.000000 +78348 -1.000000 +78349 -1.000000 +78350 -1.000000 +78351 -1.000000 +78352 -1.000000 +78353 -1.000000 +78357 -1.000000 +78358 -1.000000 +78367 -1.000000 +78368 -1.000000 +78369 -1.000000 +78370 -1.000000 +78371 -1.000000 +78374 -1.000000 +78376 -1.000000 +78377 -1.000000 +78379 -1.000000 +78380 -1.000000 +78381 -1.000000 +78382 -1.000000 +78383 -1.000000 +78384 -1.000000 +78385 -1.000000 +78386 -1.000000 +78387 -1.000000 +78389 -1.000000 +78390 -1.000000 +78391 -1.000000 +78394 -1.000000 +78395 -1.000000 +78396 -1.000000 +78397 -1.000000 +78399 -1.000000 +78400 -1.000000 +78403 -1.000000 +78410 -1.000000 +78411 -1.000000 +78414 -1.000000 +78415 -1.000000 +78416 -1.000000 +78417 -1.000000 +78418 -1.000000 +78419 -1.000000 +78420 -1.000000 +78421 -1.000000 +78424 -1.000000 +78425 -1.000000 +78426 -1.000000 +78427 -1.000000 +78434 -1.000000 +78437 -1.000000 +78439 -1.000000 +78440 -1.000000 +78441 -1.000000 +78442 -1.000000 +78443 -1.000000 +78445 -1.000000 +78446 -1.000000 +78448 -1.000000 +78449 -1.000000 +78450 -1.000000 +78451 -1.000000 +78452 -1.000000 +78454 -1.000000 +78455 -1.000000 +78456 -1.000000 +78457 -1.000000 +78458 -1.000000 +78459 -1.000000 +78480 -1.000000 +78486 -1.000000 +78488 -1.000000 +78492 -1.000000 +78510 -1.000000 +78511 -1.000000 +78512 -1.000000 +78513 -1.000000 +78517 -1.000000 +78518 -1.000000 +78519 -1.000000 +78520 -1.000000 +78521 -1.000000 +78522 -1.000000 +78523 -1.000000 +78524 -1.000000 +78525 -1.000000 +78527 -1.000000 +78528 -1.000000 +78530 -1.000000 +78531 -1.000000 +78532 -1.000000 +78533 -1.000000 +78534 -1.000000 +78535 -1.000000 +78536 -1.000000 +78539 -1.000000 +78540 -1.000000 +78542 -1.000000 +78543 -1.000000 +78544 -1.000000 +78545 -1.000000 +78546 -1.000000 +78547 -1.000000 +78549 -1.000000 +78550 -1.000000 +78551 -1.000000 +78552 -1.000000 +78554 -1.000000 +78555 -1.000000 +78556 -1.000000 +78557 -1.000000 +78558 -1.000000 +78559 -1.000000 +78560 -1.000000 +78561 -1.000000 +78562 -1.000000 +78563 -1.000000 +78570 -1.000000 +78590 -1.000000 +78591 -1.000000 +78593 -1.000000 +78594 -1.000000 +78595 -1.000000 +78596 -1.000000 +78597 -1.000000 +78599 -1.000000 +78600 -1.000000 +78601 -1.000000 +78602 -1.000000 +78603 -1.000000 +78605 -1.000000 +78606 -1.000000 +78607 -1.000000 +78608 -1.000000 +78611 -1.000000 +78612 -1.000000 +78613 -1.000000 +78617 -1.000000 +78618 -1.000000 +78619 -1.000000 +78620 -1.000000 +78621 -1.000000 +78625 -1.000000 +78626 -1.000000 +78627 -1.000000 +78628 -1.000000 +78629 -1.000000 +78630 -1.000000 +78631 -1.000000 +78632 -1.000000 +78633 -1.000000 +78635 -1.000000 +78636 -1.000000 +78637 -1.000000 +78638 -1.000000 +78639 -1.000000 +78640 -1.000000 +78641 -1.000000 +78642 -1.000000 +78643 -1.000000 +78644 -1.000000 +78645 -1.000000 +78646 -1.000000 +78647 -1.000000 +78648 -1.000000 +78649 -1.000000 +78650 -1.000000 +78651 -1.000000 +78652 -1.000000 +78653 -1.000000 +78654 -1.000000 +78655 -1.000000 +78656 -1.000000 +78658 -1.000000 +78659 -1.000000 +78660 -1.000000 +78662 -1.000000 +78664 -1.000000 +78665 -1.000000 +78666 -1.000000 +78667 -1.000000 +78668 -1.000000 +78669 -1.000000 +78670 -1.000000 +78671 -1.000000 +78672 -1.000000 +78673 -1.000000 +78677 -1.000000 +78678 -1.000000 +78679 -1.000000 +78680 -1.000000 +78681 -1.000000 +78682 -1.000000 +78683 -1.000000 +78684 -1.000000 +78685 -1.000000 +78686 -1.000000 +78687 -1.000000 +78688 -1.000000 +78691 -1.000000 +78692 -1.000000 +78693 -1.000000 +78694 -1.000000 +78696 -1.000000 +78697 -1.000000 +78698 -1.000000 +78699 -1.000000 +78700 -1.000000 +78703 -1.000000 +78709 -1.000000 +78710 -1.000000 +78712 -1.000000 +78713 -1.000000 +78716 -1.000000 +78717 -1.000000 +78718 -1.000000 +78720 -1.000000 +78721 -1.000000 +78724 -1.000000 +78725 -1.000000 +78726 -1.000000 +78727 -1.000000 +78728 -1.000000 +78729 -1.000000 +78730 -1.000000 +78731 -1.000000 +78732 -1.000000 +78733 -1.000000 +78735 -1.000000 +78736 -1.000000 +78737 -1.000000 +78738 -1.000000 +78740 -1.000000 +78741 -1.000000 +78757 -1.000000 +78765 -1.000000 +78766 -1.000000 +78767 -1.000000 +78768 -1.000000 +78769 -1.000000 +78770 -1.000000 +78771 -1.000000 +78772 -1.000000 +78773 -1.000000 +78776 -1.000000 +78778 -1.000000 +78780 -1.000000 +78781 -1.000000 +78785 -1.000000 +78786 -1.000000 +78787 -1.000000 +78794 -1.000000 +78797 -1.000000 +78798 -1.000000 +78799 -1.000000 +78800 -1.000000 +78801 -1.000000 +78802 -1.000000 +78804 -1.000000 +78805 -1.000000 +78806 -1.000000 +78807 -1.000000 +78810 -1.000000 +78811 -1.000000 +78812 -1.000000 +78814 -1.000000 +78815 -1.000000 +78816 -1.000000 +78817 -1.000000 +78819 -1.000000 +78820 -1.000000 +78824 -1.000000 +78825 -1.000000 +78826 -1.000000 +78827 -1.000000 +78828 -1.000000 +78829 -1.000000 +78830 -1.000000 +78831 -1.000000 +78834 -1.000000 +78835 -1.000000 +78836 -1.000000 +78837 -1.000000 +78838 -1.000000 +78839 -1.000000 +78840 -1.000000 +78841 -1.000000 +78842 -1.000000 +78843 -1.000000 +78844 -1.000000 +78845 -1.000000 +78846 -1.000000 +78847 -1.000000 +78848 -1.000000 +78862 -1.000000 +78868 -1.000000 +78869 -1.000000 +78997 -1.000000 +78998 -1.000000 +78999 -1.000000 +79000 -1.000000 +79001 -1.000000 +79002 -1.000000 +79003 -1.000000 +79004 -1.000000 +79005 -1.000000 +79006 -1.000000 +79012 -1.000000 +79013 -1.000000 +79014 -1.000000 +79015 -1.000000 +79016 -1.000000 +79017 -1.000000 +79018 -1.000000 +79020 -1.000000 +79022 -1.000000 +79024 -1.000000 +79028 -1.000000 +79030 -1.000000 +79031 -1.000000 +79033 -1.000000 +79037 -1.000000 +79040 -1.000000 +79042 -1.000000 +79045 -1.000000 +79047 -1.000000 +79048 -1.000000 +79049 -1.000000 +79050 -1.000000 +79052 -1.000000 +79053 -1.000000 +79054 -1.000000 +79055 -1.000000 +79056 -1.000000 +79057 -1.000000 +79064 -1.000000 +79065 -1.000000 +79066 -1.000000 +79067 -1.000000 +79068 -1.000000 +79069 -1.000000 +79070 -1.000000 +79071 -1.000000 +79072 -1.000000 +79075 -1.000000 +79078 -1.000000 +79082 -1.000000 +79086 -1.000000 +79087 -1.000000 +79088 -1.000000 +79089 -1.000000 +79090 -1.000000 +79091 -1.000000 +79093 -1.000000 +79094 -1.000000 +79095 -1.000000 +79096 -1.000000 +79100 -1.000000 +79101 -1.000000 +79104 -1.000000 +79108 -1.000000 +79109 -1.000000 +79110 -1.000000 +79111 -1.000000 +79112 -1.000000 +79113 -1.000000 +79114 -1.000000 +79115 -1.000000 +79116 -1.000000 +79117 -1.000000 +79119 -1.000000 +79120 -1.000000 +79126 -1.000000 +79128 -1.000000 +79129 -1.000000 +79132 -1.000000 +79133 -1.000000 +79134 -1.000000 +79136 -1.000000 +79137 -1.000000 +79138 -1.000000 +79140 -1.000000 +79141 -1.000000 +79142 -1.000000 +79143 -1.000000 +79144 -1.000000 +79145 -1.000000 +79146 -1.000000 +79148 -1.000000 +79149 -1.000000 +79150 -1.000000 +79152 -1.000000 +79153 -1.000000 +79154 -1.000000 +79155 -1.000000 +79159 -1.000000 +79162 -1.000000 +79164 -1.000000 +79165 -1.000000 +79167 -1.000000 +79168 -1.000000 +79169 -1.000000 +79170 -1.000000 +79171 -1.000000 +79172 -1.000000 +79173 -1.000000 +79174 -1.000000 +79176 -1.000000 +79178 -1.000000 +79179 -1.000000 +79181 -1.000000 +79183 -1.000000 +79188 -1.000000 +79191 -1.000000 +79192 -1.000000 +79193 -1.000000 +79194 -1.000000 +79195 -1.000000 +79196 -1.000000 +79197 -1.000000 +79198 -1.000000 +79199 -1.000000 +79201 -1.000000 +79202 -1.000000 +79203 -1.000000 +79204 -1.000000 +79209 -1.000000 +79210 -1.000000 +79211 -1.000000 +79213 -1.000000 +79214 -1.000000 +79215 -1.000000 +79216 -1.000000 +79235 -1.000000 +79236 -1.000000 +79237 -1.000000 +79238 -1.000000 +79239 -1.000000 +79240 -1.000000 +79241 -1.000000 +79242 -1.000000 +79243 -1.000000 +79247 -1.000000 +79248 -1.000000 +79250 -1.000000 +79251 -1.000000 +79252 -1.000000 +79253 -1.000000 +79254 -1.000000 +79255 -1.000000 +79256 -1.000000 +79258 -1.000000 +79279 -1.000000 +79281 -1.000000 +79282 -1.000000 +79283 -1.000000 +79285 -1.000000 +79286 -1.000000 +79287 -1.000000 +79288 -1.000000 +79289 -1.000000 +79291 -1.000000 +79292 -1.000000 +79293 -1.000000 +79295 -1.000000 +79296 -1.000000 +79297 -1.000000 +79298 -1.000000 +79300 -1.000000 +79301 -1.000000 +79302 -1.000000 +79303 -1.000000 +79304 -1.000000 +79305 -1.000000 +79306 -1.000000 +79308 -1.000000 +79311 -1.000000 +79318 -1.000000 +79319 -1.000000 +79329 -1.000000 +79330 -1.000000 +79331 -1.000000 +79332 -1.000000 +79333 -1.000000 +79334 -1.000000 +79335 -1.000000 +79336 -1.000000 +79337 -1.000000 +79338 -1.000000 +79340 -1.000000 +79341 -1.000000 +79342 -1.000000 +79343 -1.000000 +79344 -1.000000 +79345 -1.000000 +79346 -1.000000 +79347 -1.000000 +79348 -1.000000 +79349 -1.000000 +79350 -1.000000 +79352 -1.000000 +79353 -1.000000 +79354 -1.000000 +79355 -1.000000 +79356 -1.000000 +79357 -1.000000 +79358 -1.000000 +79359 -1.000000 +79360 -1.000000 +79361 -1.000000 +79362 -1.000000 +79363 -1.000000 +79364 -1.000000 +79365 -1.000000 +79367 -1.000000 +79368 -1.000000 +79369 -1.000000 +79371 -1.000000 +79372 -1.000000 +79373 -1.000000 +79374 -1.000000 +79375 -1.000000 +79377 -1.000000 +79384 -1.000000 +79385 -1.000000 +79388 -1.000000 +79389 -1.000000 +79390 -1.000000 +79391 -1.000000 +79392 -1.000000 +79393 -1.000000 +79394 -1.000000 +79395 -1.000000 +79397 -1.000000 +79398 -1.000000 +79399 -1.000000 +79402 -1.000000 +79405 -1.000000 +79406 -1.000000 +79407 -1.000000 +79409 -1.000000 +79412 -1.000000 +79413 -1.000000 +79428 -1.000000 +79433 -1.000000 +79434 -1.000000 +79437 -1.000000 +79438 -1.000000 +79440 -1.000000 +79441 -1.000000 +79443 -1.000000 +79444 -1.000000 +79445 -1.000000 +79446 -1.000000 +79447 -1.000000 +79448 -1.000000 +79449 -1.000000 +79451 -1.000000 +79452 -1.000000 +79453 -1.000000 +79455 -1.000000 +79456 -1.000000 +79457 -1.000000 +79458 -1.000000 +79459 -1.000000 +79460 -1.000000 +79461 -1.000000 +79462 -1.000000 +79463 -1.000000 +79464 -1.000000 +79465 -1.000000 +79466 -1.000000 +79467 -1.000000 +79468 -1.000000 +79470 -1.000000 +79471 -1.000000 +79472 -1.000000 +79473 -1.000000 +79474 -1.000000 +79479 -1.000000 +79480 -1.000000 +79481 -1.000000 +79482 -1.000000 +79484 -1.000000 +79485 -1.000000 +79486 -1.000000 +79487 -1.000000 +79488 -1.000000 +79489 -1.000000 +79490 -1.000000 +79491 -1.000000 +79492 -1.000000 +79493 -1.000000 +79494 -1.000000 +79498 -1.000000 +79499 -1.000000 +79501 -1.000000 +79503 -1.000000 +79505 -1.000000 +79506 -1.000000 +79508 -1.000000 +79509 -1.000000 +79510 -1.000000 +79512 -1.000000 +79513 -1.000000 +79514 -1.000000 +79515 -1.000000 +79516 -1.000000 +79517 -1.000000 +79518 -1.000000 +79521 -1.000000 +79523 -1.000000 +79526 -1.000000 +79527 -1.000000 +79528 -1.000000 +79529 -1.000000 +79531 -1.000000 +79543 -1.000000 +79557 -1.000000 +79558 -1.000000 +79560 -1.000000 +79564 -1.000000 +79565 -1.000000 +79566 -1.000000 +79567 -1.000000 +79568 -1.000000 +79569 -1.000000 +79570 -1.000000 +79571 -1.000000 +79572 -1.000000 +79573 -1.000000 +79575 -1.000000 +79578 -1.000000 +79579 -1.000000 +79581 -1.000000 +79582 -1.000000 +79584 -1.000000 +79585 -1.000000 +79587 -1.000000 +79588 -1.000000 +79589 -1.000000 +79590 -1.000000 +79592 -1.000000 +79594 -1.000000 +79595 -1.000000 +79598 -1.000000 +79604 -1.000000 +79609 -1.000000 +79611 -1.000000 +79612 -1.000000 +79613 -1.000000 +79614 -1.000000 +79615 -1.000000 +79619 -1.000000 +79620 -1.000000 +79622 -1.000000 +79623 -1.000000 +79624 -1.000000 +79625 -1.000000 +79626 -1.000000 +79628 -1.000000 +79629 -1.000000 +79630 -1.000000 +79631 -1.000000 +79633 -1.000000 +79634 -1.000000 +79635 -1.000000 +79636 -1.000000 +79637 -1.000000 +79638 -1.000000 +79639 -1.000000 +79640 -1.000000 +79641 -1.000000 +79642 -1.000000 +79643 -1.000000 +79644 -1.000000 +79645 -1.000000 +79646 -1.000000 +79647 -1.000000 +79648 -1.000000 +79649 -1.000000 +79650 -1.000000 +79651 -1.000000 +79652 -1.000000 +79653 -1.000000 +79654 -1.000000 +79655 -1.000000 +79656 -1.000000 +79657 -1.000000 +79658 -1.000000 +79661 -1.000000 +79664 -1.000000 +79665 -1.000000 +79666 -1.000000 +79667 -1.000000 +79668 -1.000000 +79669 -1.000000 +79672 -1.000000 +79673 -1.000000 +79674 -1.000000 +79675 -1.000000 +79676 -1.000000 +79679 -1.000000 +79682 -1.000000 +79684 -1.000000 +79685 -1.000000 +79687 -1.000000 +79688 -1.000000 +79690 -1.000000 +79691 -1.000000 +79692 -1.000000 +79693 -1.000000 +79694 -1.000000 +79696 -1.000000 +79697 -1.000000 +79698 -1.000000 +79699 -1.000000 +79700 -1.000000 +79709 -1.000000 +79714 -1.000000 +79715 -1.000000 +79718 -1.000000 +79719 -1.000000 +79720 -1.000000 +79721 -1.000000 +79722 -1.000000 +79723 -1.000000 +79725 -1.000000 +79726 -1.000000 +79727 -1.000000 +79728 -1.000000 +79729 -1.000000 +79730 -1.000000 +79731 -1.000000 +79732 -1.000000 +79733 -1.000000 +79734 -1.000000 +79735 -1.000000 +79736 -1.000000 +79738 -1.000000 +79739 -1.000000 +79740 -1.000000 +79742 -1.000000 +79743 -1.000000 +79744 -1.000000 +79745 -1.000000 +79747 -1.000000 +79755 -1.000000 +79756 -1.000000 +79757 -1.000000 +79758 -1.000000 +79759 -1.000000 +79764 -1.000000 +79768 -1.000000 +79773 -1.000000 +79774 -1.000000 +79775 -1.000000 +79777 -1.000000 +79784 -1.000000 +79785 -1.000000 +79787 -1.000000 +79790 -1.000000 +79791 -1.000000 +79792 -1.000000 +79798 -1.000000 +79799 -1.000000 +79800 -1.000000 +79801 -1.000000 +79802 -1.000000 +79805 -1.000000 +79806 -1.000000 +79809 -1.000000 +79810 -1.000000 +79811 -1.000000 +79813 -1.000000 +79814 -1.000000 +79815 -1.000000 +79818 -1.000000 +79819 -1.000000 +79822 -1.000000 +79823 -1.000000 +79824 -1.000000 +79825 -1.000000 +79826 -1.000000 +79827 -1.000000 +79828 -1.000000 +79832 -1.000000 +79833 -1.000000 +79834 -1.000000 +79835 -1.000000 +79837 -1.000000 +79838 -1.000000 +79839 -1.000000 +79840 -1.000000 +79841 -1.000000 +79842 -1.000000 +79843 -1.000000 +79844 -1.000000 +79845 -1.000000 +79846 -1.000000 +79847 -1.000000 +79848 -1.000000 +79849 -1.000000 +79850 -1.000000 +79851 -1.000000 +79853 -1.000000 diff --git a/data/shot_lists/jet/ILW_unint.txt b/data/shot_lists/jet/ILW_unint.txt new file mode 100644 index 00000000..48819737 --- /dev/null +++ b/data/shot_lists/jet/ILW_unint.txt @@ -0,0 +1,179 @@ +81867 46.30400 +81916 51.70600 +81953 59.76200 +81978 53.77880 +81983 59.45200 +81985 52.27000 +81990 52.37400 +82001 53.36200 +82004 48.78800 +82005 53.16000 +82012 56.55860 +82013 53.67600 +82196 62.1220 +82218 63.1282 +82257 53.1880 +82258 53.1238 +82259 53.5400 +82281 59.6140 +82296 58.3240 +82311 57.4142 +82312 54.2448 +82313 52.8700 +82314 56.8620 +82390 54.8440 +82393 56.6980 +82409 54.3880 +82460 56.9040 +82495 59.6540 +82499 59.2680 +82500 53.5380 +82502 62.2760 +82504 65.2480 +82551 58.4060 +82553 56.6480 +82554 58.0360 +82555 58.0900 +82556 57.4160 +82569 61.8540 +82577 56.8420 +82578 58.5100 +82589 55.6740 +82590 58.5800 +82629 62.4560 +82652 59.8800 +82654 58.1600 +82657 60.2240 +82669 64.8850 +82674 57.0620 +82687 49.6700 +82698 46.6700 +82752 59.4720 +82753 59.6260 +82754 59.3900 +82756 56.7080 +82758 57.7640 +82775 64.7517 +82780 57.0220 +82797 43.8940 +82807 59.1200 +82810 58.8660 +82811 58.9120 +82813 58.4240 +82817 58.1560 +82819 58.1740 +82820 58.9240 +82821 59.8320 +82822 53.3400 +82851 58.0800 +82852 58.0120 +82853 58.2260 +82858 53.0660 +82861 56.1000 +82862 58.2940 +82867 55.7340 +82893 57.0200 +82896 57.5560 +82905 58.1580 +82932 63.3652 +82938 60.7618 +82941 61.4794 +82955 56.9880 +83137 58.8486 +83143 51.2310 +83144 51.4808 +83146 51.4894 +83153 55.7960 +83154 53.8034 +83165 56.1566 +83168 59.5540 +83169 57.3586 +83171 56.4334 +83177 57.7000 +83179 57.4980 +83180 55.8464 +83183 56.4650 +83185 56.6292 +83186 55.7482 +83187 57.8760 +83188 57.6842 +83191 63.7792 +83209 58.7518 +83210 60.1732 +83216 57.6374 +83227 57.5120 +83230 57.4646 +83231 56.9784 +83233 54.3042 +83238 59.2248 +83240 56.5028 +83241 57.1664 +83244 56.7428 +83245 57.1064 +83250 57.7978 +83276 52.8934 +83295 56.0350 +83305 55.5682 +83308 56.5086 +83312 44.8088 +83313 50.3616 +83314 48.6628 +83317 48.3456 +83330 58.7160 +83331 58.8591 +83333 60.9730 +83335 57.3838 +83340 54.7304 +83341 57.4046 +83346 56.9386 +83352 56.5938 +83356 60.9688 +83359 58.4238 +83360 59.3742 +83362 58.3124 +83363 56.9138 +83366 58.2920 +83367 58.1794 +83370 59.3804 +83400 52.2774 +83403 57.6890 +83404 54.6010 +83411 43.7860 +83413 46.2000 +83417 47.6192 +83423 45.5970 +83432 59.4822 +83433 58.8138 +83434 56.8432 +83435 59.9280 +83436 57.6040 +83438 57.9058 +83444 52.6466 +83480 53.6152 +83497 56.6692 +83504 54.9146 +83514 43.4698 +83518 48.7310 +83519 43.8003 +83533 48.7734 +83544 58.0122 +83545 53.9698 +83557 49.9122 +83564 46.5076 +83566 49.7438 +83568 47.5344 +83570 47.8712 +83571 52.8374 +83572 59.3380 +83575 63.7992 +83601 67.3056 +83611 44.9130 +83615 44.9916 +83618 52.3500 +83619 56.5379 +83620 53.5300 +83633 54.7178 +83635 58.2726 +83681 51.6278 +83698 45.1830 +83730 56.3352 diff --git a/data/shot_lists/jet/all_shots.txt b/data/shot_lists/jet/all_shots.txt new file mode 100644 index 00000000..66643c53 --- /dev/null +++ b/data/shot_lists/jet/all_shots.txt @@ -0,0 +1,5524 @@ +66027 49.369087 +66092 56.093697 +66122 64.870400 +66143 56.441856 +66154 57.617409 +66225 46.881790 +66238 65.081345 +66260 64.181252 +66299 45.070335 +66304 65.073151 +66313 64.873474 +66369 44.262402 +66380 58.574848 +66382 69.039101 +66383 69.321732 +66395 51.485695 +66409 47.182850 +66428 50.206718 +66503 47.777794 +66509 47.027199 +66569 46.956543 +66965 49.481728 +66973 50.566143 +66976 51.547134 +67665 59.356159 +67681 42.832897 +67702 64.014336 +67710 58.361855 +67749 73.842690 +67780 61.809666 +67906 72.323074 +67915 72.333313 +67918 58.749950 +67942 59.503616 +67971 51.066879 +67982 63.383553 +67989 63.660030 +67992 65.982468 +67994 65.549309 +67997 68.259842 +68001 56.534016 +68003 62.274559 +68006 58.207233 +68008 63.614975 +68027 56.912895 +68029 65.028099 +68031 65.384445 +68032 65.660927 +68092 55.521278 +68095 65.320961 +68098 57.077759 +68116 57.582592 +68117 56.582146 +68148 64.103424 +68193 64.330750 +68222 56.720383 +68227 60.363777 +68229 59.993088 +68231 65.633278 +68237 60.139519 +68252 65.685501 +68314 62.080002 +68450 64.903168 +68459 65.729538 +68461 65.542145 +68475 59.254784 +68480 60.432385 +68496 58.555393 +68572 60.889088 +68644 51.763199 +68647 54.972416 +68651 49.405953 +68773 44.467201 +68782 47.426559 +68827 46.984192 +68835 44.334080 +68844 44.921856 +68912 55.022591 +68915 54.995968 +68918 49.520641 +68921 44.229633 +68925 45.334530 +68930 51.703808 +68949 50.430977 +68985 43.657215 +68986 51.801086 +68994 43.524097 +69030 43.475967 +69081 49.442818 +69083 45.000706 +69085 45.332481 +69087 49.435650 +69096 50.775040 +69131 70.538239 +69257 46.008320 +69281 50.233345 +69303 43.777023 +69311 43.665409 +69315 43.625473 +69336 68.549629 +69349 55.146496 +69355 58.091518 +69373 68.346878 +69381 45.131775 +69455 44.540928 +69538 61.109249 +69731 52.438015 +69740 57.551872 +69814 46.527489 +69816 46.029823 +69913 51.591167 +69974 48.074753 +69988 61.100033 +70057 55.498753 +70071 44.944386 +70073 52.918270 +70078 46.211071 +70102 62.604286 +70106 62.395393 +70117 58.895359 +70118 60.877823 +70119 62.341122 +70120 64.389122 +70121 59.098110 +70125 58.356735 +70130 57.112576 +70131 58.950657 +70171 64.555008 +70182 63.358975 +70261 50.315266 +70270 50.763775 +70276 48.167934 +70301 52.045822 +70341 48.665600 +70417 50.272255 +70427 61.448193 +70433 60.135426 +70440 65.081345 +70453 62.255104 +70509 65.595390 +70511 66.375679 +70568 59.564034 +70570 59.799553 +70572 59.210751 +70574 64.209923 +70576 64.094208 +70606 64.416771 +70610 44.999680 +70634 66.612221 +70643 60.007423 +70675 61.749249 +70686 67.959808 +70702 72.513535 +70711 65.261566 +70712 56.808449 +70717 63.901695 +72163 62.224999 +72172 68.082802 +72195 47.718201 +72283 69.091003 +72302 43.904800 +72422 58.873600 +72460 53.727402 +72465 58.864201 +72468 51.026001 +72497 60.681999 +72500 58.205601 +72537 43.330200 +72549 44.321201 +72563 57.775002 +72567 56.075401 +72643 61.857601 +72670 43.816002 +72723 55.706600 +72734 54.116402 +72738 45.975399 +72782 43.889599 +72786 43.704800 +72799 59.243401 +72852 62.057800 +72897 43.889801 +72922 60.035000 +73062 57.435200 +73460 56.877399 +73462 54.301399 +73492 43.807999 +73495 44.031799 +73497 44.604199 +73534 63.195599 +73560 60.817200 +73565 61.187401 +73685 57.619999 +73691 57.520802 +73703 49.867600 +73710 46.265999 +73744 43.161400 +73765 57.428799 +73766 57.558800 +73851 66.271797 +73879 63.121800 +73885 63.522999 +73911 65.896401 +73968 59.042801 +73972 55.261799 +73979 55.950600 +74032 51.959400 +74058 50.818802 +74077 56.967800 +74079 51.617401 +74098 59.306599 +74164 69.188599 +74165 61.514801 +74170 58.546600 +74177 49.054600 +74208 42.626801 +74214 50.135799 +74301 68.653999 +74330 56.052399 +74334 59.101399 +74336 58.025200 +74338 58.687401 +74339 62.272400 +74341 58.015202 +74344 57.477600 +74369 68.550003 +74383 43.351799 +74391 68.745201 +74415 64.691803 +74417 64.655602 +74420 56.558399 +74425 57.002399 +74429 63.592999 +74494 53.778400 +74497 48.587200 +74519 64.672600 +74530 47.870998 +74543 45.636200 +74544 45.331001 +74562 51.343601 +74570 51.281799 +74576 51.870400 +74615 63.036598 +74642 44.213799 +74693 61.415001 +74698 50.246399 +74704 58.988201 +74721 46.647598 +74738 43.622799 +74746 45.173000 +74797 63.411400 +74937 59.775799 +74942 56.502201 +75003 49.488201 +75067 57.969200 +75076 43.926800 +75162 69.810402 +75179 62.022598 +75210 57.397202 +75218 45.642601 +75307 65.725403 +75384 43.067001 +75415 63.623798 +75417 59.776402 +75419 57.229000 +75453 43.310799 +75478 60.614800 +75485 57.754398 +75495 65.426003 +75543 58.737202 +75546 63.895802 +75608 65.085403 +75652 65.727997 +75657 65.848602 +75671 43.844799 +75679 60.154598 +75766 49.639401 +75787 44.025398 +75835 55.032799 +75837 55.145199 +75844 59.686600 +75845 57.118801 +75846 58.967800 +75880 50.951000 +75949 43.886601 +75971 53.617199 +76030 55.990398 +76064 44.195400 +76193 58.565800 +76294 63.844002 +76425 64.410004 +76431 70.410202 +76497 44.626000 +76499 44.762798 +76539 64.686997 +76589 42.963600 +76655 70.046204 +76672 56.312401 +76694 68.598801 +76705 66.816803 +76783 44.111198 +76794 44.752399 +76818 63.686001 +76844 42.997398 +76848 43.107800 +76850 43.037998 +76872 62.653000 +76911 44.685600 +76920 61.747799 +76936 51.378601 +81867 46.30400 +81916 51.70600 +81953 59.76200 +81978 53.77880 +81983 59.45200 +81985 52.27000 +81990 52.37400 +82001 53.36200 +82004 48.78800 +82005 53.16000 +82012 56.55860 +82013 53.67600 +82196 62.1220 +82218 63.1282 +82257 53.1880 +82258 53.1238 +82259 53.5400 +82281 59.6140 +82296 58.3240 +82311 57.4142 +82312 54.2448 +82313 52.8700 +82314 56.8620 +82390 54.8440 +82393 56.6980 +82409 54.3880 +82460 56.9040 +82495 59.6540 +82499 59.2680 +82500 53.5380 +82502 62.2760 +82504 65.2480 +82551 58.4060 +82553 56.6480 +82554 58.0360 +82555 58.0900 +82556 57.4160 +82569 61.8540 +82577 56.8420 +82578 58.5100 +82589 55.6740 +82590 58.5800 +82629 62.4560 +82652 59.8800 +82654 58.1600 +82657 60.2240 +82669 64.8850 +82674 57.0620 +82687 49.6700 +82698 46.6700 +82752 59.4720 +82753 59.6260 +82754 59.3900 +82756 56.7080 +82758 57.7640 +82775 64.7517 +82780 57.0220 +82797 43.8940 +82807 59.1200 +82810 58.8660 +82811 58.9120 +82813 58.4240 +82817 58.1560 +82819 58.1740 +82820 58.9240 +82821 59.8320 +82822 53.3400 +82851 58.0800 +82852 58.0120 +82853 58.2260 +82858 53.0660 +82861 56.1000 +82862 58.2940 +82867 55.7340 +82893 57.0200 +82896 57.5560 +82905 58.1580 +82932 63.3652 +82938 60.7618 +82941 61.4794 +82955 56.9880 +83137 58.8486 +83143 51.2310 +83144 51.4808 +83146 51.4894 +83153 55.7960 +83154 53.8034 +83165 56.1566 +83168 59.5540 +83169 57.3586 +83171 56.4334 +83177 57.7000 +83179 57.4980 +83180 55.8464 +83183 56.4650 +83185 56.6292 +83186 55.7482 +83187 57.8760 +83188 57.6842 +83191 63.7792 +83209 58.7518 +83210 60.1732 +83216 57.6374 +83227 57.5120 +83230 57.4646 +83231 56.9784 +83233 54.3042 +83238 59.2248 +83240 56.5028 +83241 57.1664 +83244 56.7428 +83245 57.1064 +83250 57.7978 +83276 52.8934 +83295 56.0350 +83305 55.5682 +83308 56.5086 +83312 44.8088 +83313 50.3616 +83314 48.6628 +83317 48.3456 +83330 58.7160 +83331 58.8591 +83333 60.9730 +83335 57.3838 +83340 54.7304 +83341 57.4046 +83346 56.9386 +83352 56.5938 +83356 60.9688 +83359 58.4238 +83360 59.3742 +83362 58.3124 +83363 56.9138 +83366 58.2920 +83367 58.1794 +83370 59.3804 +83400 52.2774 +83403 57.6890 +83404 54.6010 +83411 43.7860 +83413 46.2000 +83417 47.6192 +83423 45.5970 +83432 59.4822 +83433 58.8138 +83434 56.8432 +83435 59.9280 +83436 57.6040 +83438 57.9058 +83444 52.6466 +83480 53.6152 +83497 56.6692 +83504 54.9146 +83514 43.4698 +83518 48.7310 +83519 43.8003 +83533 48.7734 +83544 58.0122 +83545 53.9698 +83557 49.9122 +83564 46.5076 +83566 49.7438 +83568 47.5344 +83570 47.8712 +83571 52.8374 +83572 59.3380 +83575 63.7992 +83601 67.3056 +83611 44.9130 +83615 44.9916 +83618 52.3500 +83619 56.5379 +83620 53.5300 +83633 54.7178 +83635 58.2726 +83681 51.6278 +83698 45.1830 +83730 56.3352 +73856 -1.000000 +73857 -1.000000 +73859 -1.000000 +73860 -1.000000 +73862 -1.000000 +73863 -1.000000 +73864 -1.000000 +73865 -1.000000 +73866 -1.000000 +73867 -1.000000 +73868 -1.000000 +73869 -1.000000 +73874 -1.000000 +73876 -1.000000 +73877 -1.000000 +73878 -1.000000 +73882 -1.000000 +73883 -1.000000 +73884 -1.000000 +73889 -1.000000 +73890 -1.000000 +73891 -1.000000 +73892 -1.000000 +73893 -1.000000 +73894 -1.000000 +73896 -1.000000 +73897 -1.000000 +73898 -1.000000 +73899 -1.000000 +73900 -1.000000 +73901 -1.000000 +73903 -1.000000 +73904 -1.000000 +73905 -1.000000 +73906 -1.000000 +73907 -1.000000 +73908 -1.000000 +73909 -1.000000 +73910 -1.000000 +73915 -1.000000 +73916 -1.000000 +73917 -1.000000 +73918 -1.000000 +73919 -1.000000 +73920 -1.000000 +73921 -1.000000 +73922 -1.000000 +73923 -1.000000 +73924 -1.000000 +73925 -1.000000 +73926 -1.000000 +73927 -1.000000 +73928 -1.000000 +73929 -1.000000 +73930 -1.000000 +73931 -1.000000 +73935 -1.000000 +73936 -1.000000 +73937 -1.000000 +73938 -1.000000 +73939 -1.000000 +73940 -1.000000 +73941 -1.000000 +73943 -1.000000 +73944 -1.000000 +73945 -1.000000 +73946 -1.000000 +73948 -1.000000 +73949 -1.000000 +73950 -1.000000 +73951 -1.000000 +73952 -1.000000 +73953 -1.000000 +73954 -1.000000 +73955 -1.000000 +73957 -1.000000 +73958 -1.000000 +73959 -1.000000 +73960 -1.000000 +73962 -1.000000 +73964 -1.000000 +73965 -1.000000 +73966 -1.000000 +73970 -1.000000 +73974 -1.000000 +73975 -1.000000 +73976 -1.000000 +73978 -1.000000 +73981 -1.000000 +73982 -1.000000 +73984 -1.000000 +73985 -1.000000 +73986 -1.000000 +73987 -1.000000 +73988 -1.000000 +73989 -1.000000 +73991 -1.000000 +73992 -1.000000 +73993 -1.000000 +73994 -1.000000 +73995 -1.000000 +73996 -1.000000 +73997 -1.000000 +73998 -1.000000 +73999 -1.000000 +74002 -1.000000 +74003 -1.000000 +74004 -1.000000 +74005 -1.000000 +74006 -1.000000 +74007 -1.000000 +74008 -1.000000 +74009 -1.000000 +74010 -1.000000 +74011 -1.000000 +74012 -1.000000 +74013 -1.000000 +74014 -1.000000 +74015 -1.000000 +74017 -1.000000 +74018 -1.000000 +74019 -1.000000 +74020 -1.000000 +74021 -1.000000 +74022 -1.000000 +74023 -1.000000 +74024 -1.000000 +74025 -1.000000 +74026 -1.000000 +74027 -1.000000 +74028 -1.000000 +74029 -1.000000 +74030 -1.000000 +74031 -1.000000 +74034 -1.000000 +74035 -1.000000 +74036 -1.000000 +74037 -1.000000 +74038 -1.000000 +74040 -1.000000 +74041 -1.000000 +74042 -1.000000 +74043 -1.000000 +74044 -1.000000 +74045 -1.000000 +74046 -1.000000 +74047 -1.000000 +74048 -1.000000 +74049 -1.000000 +74050 -1.000000 +74051 -1.000000 +74052 -1.000000 +74053 -1.000000 +74054 -1.000000 +74055 -1.000000 +74056 -1.000000 +74057 -1.000000 +74060 -1.000000 +74061 -1.000000 +74062 -1.000000 +74063 -1.000000 +74064 -1.000000 +74065 -1.000000 +74066 -1.000000 +74067 -1.000000 +74068 -1.000000 +74069 -1.000000 +74070 -1.000000 +74071 -1.000000 +74072 -1.000000 +74073 -1.000000 +74075 -1.000000 +74081 -1.000000 +74082 -1.000000 +74083 -1.000000 +74084 -1.000000 +74085 -1.000000 +74086 -1.000000 +74087 -1.000000 +74088 -1.000000 +74089 -1.000000 +74090 -1.000000 +74091 -1.000000 +74092 -1.000000 +74093 -1.000000 +74094 -1.000000 +74095 -1.000000 +74096 -1.000000 +74097 -1.000000 +74101 -1.000000 +74102 -1.000000 +74103 -1.000000 +74104 -1.000000 +74105 -1.000000 +74106 -1.000000 +74107 -1.000000 +74110 -1.000000 +74111 -1.000000 +74112 -1.000000 +74113 -1.000000 +74114 -1.000000 +74115 -1.000000 +74116 -1.000000 +74117 -1.000000 +74119 -1.000000 +74120 -1.000000 +74121 -1.000000 +74122 -1.000000 +74123 -1.000000 +74124 -1.000000 +74125 -1.000000 +74126 -1.000000 +74127 -1.000000 +74128 -1.000000 +74129 -1.000000 +74130 -1.000000 +74131 -1.000000 +74132 -1.000000 +74133 -1.000000 +74134 -1.000000 +74135 -1.000000 +74136 -1.000000 +74137 -1.000000 +74138 -1.000000 +74139 -1.000000 +74140 -1.000000 +74141 -1.000000 +74142 -1.000000 +74143 -1.000000 +74144 -1.000000 +74145 -1.000000 +74146 -1.000000 +74147 -1.000000 +74149 -1.000000 +74150 -1.000000 +74151 -1.000000 +74152 -1.000000 +74154 -1.000000 +74155 -1.000000 +74156 -1.000000 +74157 -1.000000 +74158 -1.000000 +74159 -1.000000 +74160 -1.000000 +74161 -1.000000 +74162 -1.000000 +74163 -1.000000 +74167 -1.000000 +74168 -1.000000 +74169 -1.000000 +74175 -1.000000 +74176 -1.000000 +74179 -1.000000 +74180 -1.000000 +74181 -1.000000 +74182 -1.000000 +74183 -1.000000 +74184 -1.000000 +74185 -1.000000 +74186 -1.000000 +74187 -1.000000 +74188 -1.000000 +74189 -1.000000 +74190 -1.000000 +74191 -1.000000 +74192 -1.000000 +74193 -1.000000 +74194 -1.000000 +74195 -1.000000 +74197 -1.000000 +74198 -1.000000 +74200 -1.000000 +74201 -1.000000 +74206 -1.000000 +74213 -1.000000 +74216 -1.000000 +74217 -1.000000 +74219 -1.000000 +74220 -1.000000 +74223 -1.000000 +74224 -1.000000 +74225 -1.000000 +74226 -1.000000 +74227 -1.000000 +74228 -1.000000 +74230 -1.000000 +74231 -1.000000 +74232 -1.000000 +74233 -1.000000 +74234 -1.000000 +74235 -1.000000 +74237 -1.000000 +74238 -1.000000 +74239 -1.000000 +74241 -1.000000 +74242 -1.000000 +74243 -1.000000 +74244 -1.000000 +74245 -1.000000 +74246 -1.000000 +74247 -1.000000 +74248 -1.000000 +74249 -1.000000 +74250 -1.000000 +74251 -1.000000 +74252 -1.000000 +74253 -1.000000 +74254 -1.000000 +74255 -1.000000 +74256 -1.000000 +74257 -1.000000 +74258 -1.000000 +74259 -1.000000 +74261 -1.000000 +74262 -1.000000 +74264 -1.000000 +74265 -1.000000 +74266 -1.000000 +74267 -1.000000 +74268 -1.000000 +74269 -1.000000 +74270 -1.000000 +74271 -1.000000 +74272 -1.000000 +74273 -1.000000 +74274 -1.000000 +74275 -1.000000 +74276 -1.000000 +74277 -1.000000 +74278 -1.000000 +74279 -1.000000 +74280 -1.000000 +74281 -1.000000 +74282 -1.000000 +74283 -1.000000 +74284 -1.000000 +74285 -1.000000 +74286 -1.000000 +74288 -1.000000 +74289 -1.000000 +74297 -1.000000 +74298 -1.000000 +74299 -1.000000 +74302 -1.000000 +74303 -1.000000 +74304 -1.000000 +74305 -1.000000 +74306 -1.000000 +74307 -1.000000 +74308 -1.000000 +74309 -1.000000 +74310 -1.000000 +74311 -1.000000 +74312 -1.000000 +74313 -1.000000 +74314 -1.000000 +74315 -1.000000 +74316 -1.000000 +74317 -1.000000 +74318 -1.000000 +74319 -1.000000 +74320 -1.000000 +74321 -1.000000 +74322 -1.000000 +74323 -1.000000 +74324 -1.000000 +74325 -1.000000 +74332 -1.000000 +74333 -1.000000 +74335 -1.000000 +74346 -1.000000 +74347 -1.000000 +74348 -1.000000 +74351 -1.000000 +74352 -1.000000 +74353 -1.000000 +74354 -1.000000 +74355 -1.000000 +74356 -1.000000 +74357 -1.000000 +74358 -1.000000 +74359 -1.000000 +74360 -1.000000 +74361 -1.000000 +74362 -1.000000 +74363 -1.000000 +74364 -1.000000 +74365 -1.000000 +74366 -1.000000 +74367 -1.000000 +74368 -1.000000 +74371 -1.000000 +74373 -1.000000 +74374 -1.000000 +74375 -1.000000 +74376 -1.000000 +74378 -1.000000 +74379 -1.000000 +74380 -1.000000 +74381 -1.000000 +74384 -1.000000 +74386 -1.000000 +74387 -1.000000 +74388 -1.000000 +74389 -1.000000 +74390 -1.000000 +74392 -1.000000 +74395 -1.000000 +74396 -1.000000 +74398 -1.000000 +74399 -1.000000 +74400 -1.000000 +74401 -1.000000 +74402 -1.000000 +74403 -1.000000 +74404 -1.000000 +74405 -1.000000 +74406 -1.000000 +74407 -1.000000 +74410 -1.000000 +74411 -1.000000 +74412 -1.000000 +74414 -1.000000 +74419 -1.000000 +74422 -1.000000 +74423 -1.000000 +74427 -1.000000 +74428 -1.000000 +74431 -1.000000 +74432 -1.000000 +74434 -1.000000 +74438 -1.000000 +74439 -1.000000 +74441 -1.000000 +74443 -1.000000 +74444 -1.000000 +74445 -1.000000 +74446 -1.000000 +74447 -1.000000 +74451 -1.000000 +74453 -1.000000 +74454 -1.000000 +74455 -1.000000 +74457 -1.000000 +74458 -1.000000 +74459 -1.000000 +74460 -1.000000 +74461 -1.000000 +74462 -1.000000 +74463 -1.000000 +74467 -1.000000 +74468 -1.000000 +74469 -1.000000 +74470 -1.000000 +74471 -1.000000 +74472 -1.000000 +74473 -1.000000 +74474 -1.000000 +74475 -1.000000 +74476 -1.000000 +74477 -1.000000 +74478 -1.000000 +74479 -1.000000 +74481 -1.000000 +74483 -1.000000 +74484 -1.000000 +74485 -1.000000 +74486 -1.000000 +74487 -1.000000 +74488 -1.000000 +74489 -1.000000 +74490 -1.000000 +74491 -1.000000 +74492 -1.000000 +74493 -1.000000 +74496 -1.000000 +74502 -1.000000 +74503 -1.000000 +74504 -1.000000 +74508 -1.000000 +74509 -1.000000 +74510 -1.000000 +74511 -1.000000 +74512 -1.000000 +74513 -1.000000 +74514 -1.000000 +74515 -1.000000 +74517 -1.000000 +74521 -1.000000 +74523 -1.000000 +74524 -1.000000 +74525 -1.000000 +74526 -1.000000 +74527 -1.000000 +74528 -1.000000 +74529 -1.000000 +74532 -1.000000 +74536 -1.000000 +74537 -1.000000 +74538 -1.000000 +74539 -1.000000 +74540 -1.000000 +74545 -1.000000 +74548 -1.000000 +74549 -1.000000 +74550 -1.000000 +74551 -1.000000 +74552 -1.000000 +74553 -1.000000 +74554 -1.000000 +74555 -1.000000 +74556 -1.000000 +74557 -1.000000 +74558 -1.000000 +74559 -1.000000 +74560 -1.000000 +74561 -1.000000 +74564 -1.000000 +74565 -1.000000 +74566 -1.000000 +74567 -1.000000 +74568 -1.000000 +74569 -1.000000 +74573 -1.000000 +74574 -1.000000 +74575 -1.000000 +74577 -1.000000 +74580 -1.000000 +74581 -1.000000 +74582 -1.000000 +74583 -1.000000 +74584 -1.000000 +74585 -1.000000 +74586 -1.000000 +74587 -1.000000 +74588 -1.000000 +74589 -1.000000 +74590 -1.000000 +74593 -1.000000 +74596 -1.000000 +74597 -1.000000 +74598 -1.000000 +74599 -1.000000 +74602 -1.000000 +74603 -1.000000 +74604 -1.000000 +74605 -1.000000 +74606 -1.000000 +74607 -1.000000 +74608 -1.000000 +74609 -1.000000 +74610 -1.000000 +74611 -1.000000 +74612 -1.000000 +74613 -1.000000 +74614 -1.000000 +74617 -1.000000 +74618 -1.000000 +74619 -1.000000 +74620 -1.000000 +74621 -1.000000 +74622 -1.000000 +74623 -1.000000 +74625 -1.000000 +74626 -1.000000 +74627 -1.000000 +74628 -1.000000 +74629 -1.000000 +74630 -1.000000 +74631 -1.000000 +74632 -1.000000 +74633 -1.000000 +74634 -1.000000 +74635 -1.000000 +74636 -1.000000 +74637 -1.000000 +74638 -1.000000 +74639 -1.000000 +74640 -1.000000 +74641 -1.000000 +74643 -1.000000 +74644 -1.000000 +74646 -1.000000 +74647 -1.000000 +74648 -1.000000 +74650 -1.000000 +74651 -1.000000 +74652 -1.000000 +74657 -1.000000 +74658 -1.000000 +74659 -1.000000 +74660 -1.000000 +74661 -1.000000 +74662 -1.000000 +74663 -1.000000 +74664 -1.000000 +74665 -1.000000 +74666 -1.000000 +74667 -1.000000 +74668 -1.000000 +74669 -1.000000 +74670 -1.000000 +74672 -1.000000 +74673 -1.000000 +74674 -1.000000 +74675 -1.000000 +74676 -1.000000 +74677 -1.000000 +74678 -1.000000 +74679 -1.000000 +74680 -1.000000 +74681 -1.000000 +74682 -1.000000 +74684 -1.000000 +74685 -1.000000 +74686 -1.000000 +74687 -1.000000 +74688 -1.000000 +74689 -1.000000 +74690 -1.000000 +74691 -1.000000 +74692 -1.000000 +74696 -1.000000 +74697 -1.000000 +74699 -1.000000 +74700 -1.000000 +74701 -1.000000 +74702 -1.000000 +74703 -1.000000 +74705 -1.000000 +74706 -1.000000 +74708 -1.000000 +74709 -1.000000 +74710 -1.000000 +74711 -1.000000 +74713 -1.000000 +74715 -1.000000 +74716 -1.000000 +74717 -1.000000 +74719 -1.000000 +74720 -1.000000 +74724 -1.000000 +74726 -1.000000 +74727 -1.000000 +74728 -1.000000 +74729 -1.000000 +74730 -1.000000 +74732 -1.000000 +74733 -1.000000 +74735 -1.000000 +74736 -1.000000 +74737 -1.000000 +74739 -1.000000 +74740 -1.000000 +74741 -1.000000 +74742 -1.000000 +74743 -1.000000 +74744 -1.000000 +74745 -1.000000 +74748 -1.000000 +74749 -1.000000 +74750 -1.000000 +74751 -1.000000 +74752 -1.000000 +74753 -1.000000 +74754 -1.000000 +74755 -1.000000 +74756 -1.000000 +74757 -1.000000 +74758 -1.000000 +74759 -1.000000 +74760 -1.000000 +74761 -1.000000 +74762 -1.000000 +74763 -1.000000 +74764 -1.000000 +74765 -1.000000 +74767 -1.000000 +74768 -1.000000 +74769 -1.000000 +74770 -1.000000 +74771 -1.000000 +74772 -1.000000 +74773 -1.000000 +74774 -1.000000 +74775 -1.000000 +74776 -1.000000 +74777 -1.000000 +74778 -1.000000 +74779 -1.000000 +74781 -1.000000 +74782 -1.000000 +74783 -1.000000 +74784 -1.000000 +74785 -1.000000 +74787 -1.000000 +74788 -1.000000 +74789 -1.000000 +74790 -1.000000 +74791 -1.000000 +74792 -1.000000 +74793 -1.000000 +74794 -1.000000 +74795 -1.000000 +74798 -1.000000 +74799 -1.000000 +74800 -1.000000 +74801 -1.000000 +74802 -1.000000 +74803 -1.000000 +74804 -1.000000 +74805 -1.000000 +74807 -1.000000 +74811 -1.000000 +74812 -1.000000 +74816 -1.000000 +74819 -1.000000 +74820 -1.000000 +74822 -1.000000 +74824 -1.000000 +74827 -1.000000 +74831 -1.000000 +74833 -1.000000 +74834 -1.000000 +74836 -1.000000 +74840 -1.000000 +74841 -1.000000 +74842 -1.000000 +74845 -1.000000 +74846 -1.000000 +74847 -1.000000 +74849 -1.000000 +74850 -1.000000 +74851 -1.000000 +74855 -1.000000 +74859 -1.000000 +74870 -1.000000 +74871 -1.000000 +74872 -1.000000 +74880 -1.000000 +74881 -1.000000 +74885 -1.000000 +74886 -1.000000 +74889 -1.000000 +74891 -1.000000 +74892 -1.000000 +74894 -1.000000 +74897 -1.000000 +74898 -1.000000 +74900 -1.000000 +74901 -1.000000 +74902 -1.000000 +74903 -1.000000 +74904 -1.000000 +74905 -1.000000 +74906 -1.000000 +74907 -1.000000 +74908 -1.000000 +74909 -1.000000 +74910 -1.000000 +74911 -1.000000 +74912 -1.000000 +74913 -1.000000 +74915 -1.000000 +74916 -1.000000 +74917 -1.000000 +74918 -1.000000 +74919 -1.000000 +74920 -1.000000 +74921 -1.000000 +74922 -1.000000 +74924 -1.000000 +74925 -1.000000 +74926 -1.000000 +74927 -1.000000 +74928 -1.000000 +74929 -1.000000 +74930 -1.000000 +74931 -1.000000 +74932 -1.000000 +74933 -1.000000 +74934 -1.000000 +74935 -1.000000 +74936 -1.000000 +74939 -1.000000 +74940 -1.000000 +74941 -1.000000 +74944 -1.000000 +74945 -1.000000 +74946 -1.000000 +74947 -1.000000 +74948 -1.000000 +74949 -1.000000 +74950 -1.000000 +74951 -1.000000 +74952 -1.000000 +74956 -1.000000 +74957 -1.000000 +74958 -1.000000 +74959 -1.000000 +74960 -1.000000 +74961 -1.000000 +74962 -1.000000 +74963 -1.000000 +74964 -1.000000 +74965 -1.000000 +74966 -1.000000 +74967 -1.000000 +74968 -1.000000 +74969 -1.000000 +74970 -1.000000 +74971 -1.000000 +74972 -1.000000 +74973 -1.000000 +74974 -1.000000 +74975 -1.000000 +74976 -1.000000 +74977 -1.000000 +74978 -1.000000 +74979 -1.000000 +74980 -1.000000 +74981 -1.000000 +74982 -1.000000 +74983 -1.000000 +74984 -1.000000 +74985 -1.000000 +74986 -1.000000 +74987 -1.000000 +74988 -1.000000 +74989 -1.000000 +74990 -1.000000 +74991 -1.000000 +74992 -1.000000 +74993 -1.000000 +74994 -1.000000 +74995 -1.000000 +74997 -1.000000 +74998 -1.000000 +74999 -1.000000 +75000 -1.000000 +75001 -1.000000 +75002 -1.000000 +75005 -1.000000 +75006 -1.000000 +75008 -1.000000 +75009 -1.000000 +75010 -1.000000 +75011 -1.000000 +75012 -1.000000 +75014 -1.000000 +75015 -1.000000 +75016 -1.000000 +75017 -1.000000 +75018 -1.000000 +75019 -1.000000 +75020 -1.000000 +75021 -1.000000 +75023 -1.000000 +75024 -1.000000 +75025 -1.000000 +75026 -1.000000 +75027 -1.000000 +75028 -1.000000 +75030 -1.000000 +75032 -1.000000 +75033 -1.000000 +75034 -1.000000 +75035 -1.000000 +75036 -1.000000 +75037 -1.000000 +75038 -1.000000 +75039 -1.000000 +75040 -1.000000 +75041 -1.000000 +75042 -1.000000 +75043 -1.000000 +75044 -1.000000 +75045 -1.000000 +75046 -1.000000 +75047 -1.000000 +75048 -1.000000 +75049 -1.000000 +75050 -1.000000 +75051 -1.000000 +75052 -1.000000 +75053 -1.000000 +75054 -1.000000 +75055 -1.000000 +75057 -1.000000 +75058 -1.000000 +75059 -1.000000 +75060 -1.000000 +75064 -1.000000 +75065 -1.000000 +75066 -1.000000 +75068 -1.000000 +75069 -1.000000 +75070 -1.000000 +75071 -1.000000 +75072 -1.000000 +75073 -1.000000 +75074 -1.000000 +75075 -1.000000 +75078 -1.000000 +75079 -1.000000 +75080 -1.000000 +75081 -1.000000 +75082 -1.000000 +75083 -1.000000 +75085 -1.000000 +75086 -1.000000 +75087 -1.000000 +75088 -1.000000 +75089 -1.000000 +75090 -1.000000 +75091 -1.000000 +75092 -1.000000 +75093 -1.000000 +75094 -1.000000 +75095 -1.000000 +75096 -1.000000 +75097 -1.000000 +75098 -1.000000 +75099 -1.000000 +75100 -1.000000 +75101 -1.000000 +75102 -1.000000 +75103 -1.000000 +75104 -1.000000 +75105 -1.000000 +75106 -1.000000 +75107 -1.000000 +75108 -1.000000 +75109 -1.000000 +75110 -1.000000 +75111 -1.000000 +75112 -1.000000 +75113 -1.000000 +75114 -1.000000 +75115 -1.000000 +75117 -1.000000 +75118 -1.000000 +75119 -1.000000 +75120 -1.000000 +75121 -1.000000 +75122 -1.000000 +75123 -1.000000 +75124 -1.000000 +75125 -1.000000 +75126 -1.000000 +75127 -1.000000 +75128 -1.000000 +75129 -1.000000 +75130 -1.000000 +75131 -1.000000 +75132 -1.000000 +75133 -1.000000 +75134 -1.000000 +75135 -1.000000 +75136 -1.000000 +75137 -1.000000 +75138 -1.000000 +75140 -1.000000 +75141 -1.000000 +75142 -1.000000 +75144 -1.000000 +75145 -1.000000 +75146 -1.000000 +75147 -1.000000 +75148 -1.000000 +75149 -1.000000 +75150 -1.000000 +75151 -1.000000 +75152 -1.000000 +75153 -1.000000 +75154 -1.000000 +75155 -1.000000 +75156 -1.000000 +75157 -1.000000 +75158 -1.000000 +75159 -1.000000 +75160 -1.000000 +75161 -1.000000 +75164 -1.000000 +75165 -1.000000 +75166 -1.000000 +75167 -1.000000 +75168 -1.000000 +75170 -1.000000 +75171 -1.000000 +75172 -1.000000 +75173 -1.000000 +75174 -1.000000 +75175 -1.000000 +75176 -1.000000 +75177 -1.000000 +75178 -1.000000 +75181 -1.000000 +75182 -1.000000 +75183 -1.000000 +75184 -1.000000 +75185 -1.000000 +75186 -1.000000 +75187 -1.000000 +75188 -1.000000 +75189 -1.000000 +75190 -1.000000 +75191 -1.000000 +75193 -1.000000 +75194 -1.000000 +75195 -1.000000 +75196 -1.000000 +75200 -1.000000 +75201 -1.000000 +75202 -1.000000 +75203 -1.000000 +75204 -1.000000 +75205 -1.000000 +75206 -1.000000 +75207 -1.000000 +75208 -1.000000 +75209 -1.000000 +75212 -1.000000 +75213 -1.000000 +75215 -1.000000 +75216 -1.000000 +75217 -1.000000 +75220 -1.000000 +75221 -1.000000 +75222 -1.000000 +75223 -1.000000 +75224 -1.000000 +75225 -1.000000 +75226 -1.000000 +75228 -1.000000 +75229 -1.000000 +75230 -1.000000 +75231 -1.000000 +75232 -1.000000 +75233 -1.000000 +75234 -1.000000 +75235 -1.000000 +75236 -1.000000 +75237 -1.000000 +75238 -1.000000 +75239 -1.000000 +75240 -1.000000 +75241 -1.000000 +75242 -1.000000 +75243 -1.000000 +75244 -1.000000 +75245 -1.000000 +75246 -1.000000 +75247 -1.000000 +75271 -1.000000 +75277 -1.000000 +75278 -1.000000 +75282 -1.000000 +75284 -1.000000 +75286 -1.000000 +75287 -1.000000 +75288 -1.000000 +75289 -1.000000 +75290 -1.000000 +75291 -1.000000 +75292 -1.000000 +75293 -1.000000 +75294 -1.000000 +75295 -1.000000 +75296 -1.000000 +75297 -1.000000 +75298 -1.000000 +75300 -1.000000 +75301 -1.000000 +75302 -1.000000 +75303 -1.000000 +75304 -1.000000 +75305 -1.000000 +75306 -1.000000 +75309 -1.000000 +75310 -1.000000 +75311 -1.000000 +75312 -1.000000 +75313 -1.000000 +75314 -1.000000 +75315 -1.000000 +75316 -1.000000 +75317 -1.000000 +75318 -1.000000 +75319 -1.000000 +75321 -1.000000 +75322 -1.000000 +75323 -1.000000 +75324 -1.000000 +75325 -1.000000 +75326 -1.000000 +75327 -1.000000 +75328 -1.000000 +75329 -1.000000 +75330 -1.000000 +75333 -1.000000 +75337 -1.000000 +75341 -1.000000 +75345 -1.000000 +75346 -1.000000 +75347 -1.000000 +75348 -1.000000 +75349 -1.000000 +75350 -1.000000 +75364 -1.000000 +75366 -1.000000 +75367 -1.000000 +75368 -1.000000 +75369 -1.000000 +75370 -1.000000 +75371 -1.000000 +75372 -1.000000 +75380 -1.000000 +75381 -1.000000 +75382 -1.000000 +75383 -1.000000 +75385 -1.000000 +75386 -1.000000 +75387 -1.000000 +75388 -1.000000 +75389 -1.000000 +75390 -1.000000 +75391 -1.000000 +75392 -1.000000 +75393 -1.000000 +75394 -1.000000 +75395 -1.000000 +75396 -1.000000 +75397 -1.000000 +75398 -1.000000 +75399 -1.000000 +75400 -1.000000 +75401 -1.000000 +75402 -1.000000 +75403 -1.000000 +75404 -1.000000 +75405 -1.000000 +75406 -1.000000 +75407 -1.000000 +75410 -1.000000 +75411 -1.000000 +75412 -1.000000 +75413 -1.000000 +75414 -1.000000 +75422 -1.000000 +75425 -1.000000 +75429 -1.000000 +75430 -1.000000 +75431 -1.000000 +75432 -1.000000 +75433 -1.000000 +75434 -1.000000 +75435 -1.000000 +75436 -1.000000 +75439 -1.000000 +75440 -1.000000 +75441 -1.000000 +75442 -1.000000 +75443 -1.000000 +75444 -1.000000 +75446 -1.000000 +75447 -1.000000 +75448 -1.000000 +75449 -1.000000 +75450 -1.000000 +75451 -1.000000 +75452 -1.000000 +75454 -1.000000 +75455 -1.000000 +75456 -1.000000 +75457 -1.000000 +75458 -1.000000 +75459 -1.000000 +75460 -1.000000 +75461 -1.000000 +75462 -1.000000 +75463 -1.000000 +75464 -1.000000 +75465 -1.000000 +75466 -1.000000 +75468 -1.000000 +75469 -1.000000 +75470 -1.000000 +75471 -1.000000 +75472 -1.000000 +75473 -1.000000 +75474 -1.000000 +75476 -1.000000 +75477 -1.000000 +75481 -1.000000 +75482 -1.000000 +75484 -1.000000 +75487 -1.000000 +75488 -1.000000 +75489 -1.000000 +75491 -1.000000 +75492 -1.000000 +75493 -1.000000 +75494 -1.000000 +75497 -1.000000 +75498 -1.000000 +75499 -1.000000 +75500 -1.000000 +75501 -1.000000 +75502 -1.000000 +75503 -1.000000 +75504 -1.000000 +75505 -1.000000 +75506 -1.000000 +75507 -1.000000 +75508 -1.000000 +75509 -1.000000 +75510 -1.000000 +75511 -1.000000 +75512 -1.000000 +75513 -1.000000 +75514 -1.000000 +75516 -1.000000 +75517 -1.000000 +75518 -1.000000 +75519 -1.000000 +75520 -1.000000 +75521 -1.000000 +75522 -1.000000 +75523 -1.000000 +75524 -1.000000 +75525 -1.000000 +75526 -1.000000 +75527 -1.000000 +75528 -1.000000 +75529 -1.000000 +75530 -1.000000 +75531 -1.000000 +75532 -1.000000 +75533 -1.000000 +75534 -1.000000 +75535 -1.000000 +75536 -1.000000 +75537 -1.000000 +75538 -1.000000 +75539 -1.000000 +75540 -1.000000 +75541 -1.000000 +75545 -1.000000 +75548 -1.000000 +75549 -1.000000 +75550 -1.000000 +75551 -1.000000 +75552 -1.000000 +75553 -1.000000 +75554 -1.000000 +75555 -1.000000 +75556 -1.000000 +75557 -1.000000 +75558 -1.000000 +75559 -1.000000 +75560 -1.000000 +75561 -1.000000 +75562 -1.000000 +75563 -1.000000 +75564 -1.000000 +75565 -1.000000 +75566 -1.000000 +75567 -1.000000 +75568 -1.000000 +75569 -1.000000 +75570 -1.000000 +75571 -1.000000 +75573 -1.000000 +75574 -1.000000 +75575 -1.000000 +75576 -1.000000 +75577 -1.000000 +75578 -1.000000 +75580 -1.000000 +75581 -1.000000 +75582 -1.000000 +75583 -1.000000 +75584 -1.000000 +75585 -1.000000 +75586 -1.000000 +75587 -1.000000 +75588 -1.000000 +75589 -1.000000 +75590 -1.000000 +75591 -1.000000 +75592 -1.000000 +75593 -1.000000 +75594 -1.000000 +75595 -1.000000 +75596 -1.000000 +75597 -1.000000 +75598 -1.000000 +75599 -1.000000 +75602 -1.000000 +75603 -1.000000 +75604 -1.000000 +75605 -1.000000 +75606 -1.000000 +75607 -1.000000 +75610 -1.000000 +75611 -1.000000 +75616 -1.000000 +75617 -1.000000 +75618 -1.000000 +75620 -1.000000 +75623 -1.000000 +75624 -1.000000 +75625 -1.000000 +75626 -1.000000 +75627 -1.000000 +75628 -1.000000 +75629 -1.000000 +75630 -1.000000 +75631 -1.000000 +75632 -1.000000 +75634 -1.000000 +75635 -1.000000 +75636 -1.000000 +75637 -1.000000 +75638 -1.000000 +75639 -1.000000 +75640 -1.000000 +75641 -1.000000 +75642 -1.000000 +75643 -1.000000 +75644 -1.000000 +75645 -1.000000 +75646 -1.000000 +75647 -1.000000 +75648 -1.000000 +75649 -1.000000 +75650 -1.000000 +75651 -1.000000 +75654 -1.000000 +75655 -1.000000 +75656 -1.000000 +75660 -1.000000 +75661 -1.000000 +75662 -1.000000 +75664 -1.000000 +75665 -1.000000 +75666 -1.000000 +75667 -1.000000 +75668 -1.000000 +75670 -1.000000 +75672 -1.000000 +75676 -1.000000 +75677 -1.000000 +75680 -1.000000 +75681 -1.000000 +75683 -1.000000 +75684 -1.000000 +75685 -1.000000 +75686 -1.000000 +75687 -1.000000 +75688 -1.000000 +75693 -1.000000 +75694 -1.000000 +75696 -1.000000 +75697 -1.000000 +75698 -1.000000 +75699 -1.000000 +75700 -1.000000 +75701 -1.000000 +75702 -1.000000 +75703 -1.000000 +75704 -1.000000 +75705 -1.000000 +75706 -1.000000 +75707 -1.000000 +75708 -1.000000 +75709 -1.000000 +75710 -1.000000 +75711 -1.000000 +75712 -1.000000 +75713 -1.000000 +75714 -1.000000 +75715 -1.000000 +75716 -1.000000 +75718 -1.000000 +75719 -1.000000 +75720 -1.000000 +75722 -1.000000 +75723 -1.000000 +75724 -1.000000 +75725 -1.000000 +75726 -1.000000 +75727 -1.000000 +75733 -1.000000 +75734 -1.000000 +75735 -1.000000 +75737 -1.000000 +75738 -1.000000 +75739 -1.000000 +75740 -1.000000 +75741 -1.000000 +75742 -1.000000 +75743 -1.000000 +75744 -1.000000 +75745 -1.000000 +75746 -1.000000 +75747 -1.000000 +75748 -1.000000 +75749 -1.000000 +75750 -1.000000 +75752 -1.000000 +75754 -1.000000 +75755 -1.000000 +75756 -1.000000 +75757 -1.000000 +75758 -1.000000 +75759 -1.000000 +75760 -1.000000 +75761 -1.000000 +75763 -1.000000 +75764 -1.000000 +75765 -1.000000 +75767 -1.000000 +75770 -1.000000 +75771 -1.000000 +75772 -1.000000 +75773 -1.000000 +75775 -1.000000 +75776 -1.000000 +75777 -1.000000 +75779 -1.000000 +75781 -1.000000 +75782 -1.000000 +75783 -1.000000 +75784 -1.000000 +75785 -1.000000 +75788 -1.000000 +75789 -1.000000 +75791 -1.000000 +75792 -1.000000 +75793 -1.000000 +75794 -1.000000 +75795 -1.000000 +75796 -1.000000 +75797 -1.000000 +75798 -1.000000 +75801 -1.000000 +75802 -1.000000 +75803 -1.000000 +75804 -1.000000 +75805 -1.000000 +75806 -1.000000 +75807 -1.000000 +75808 -1.000000 +75809 -1.000000 +75810 -1.000000 +75812 -1.000000 +75813 -1.000000 +75814 -1.000000 +75815 -1.000000 +75816 -1.000000 +75817 -1.000000 +75818 -1.000000 +75819 -1.000000 +75820 -1.000000 +75821 -1.000000 +75822 -1.000000 +75823 -1.000000 +75824 -1.000000 +75825 -1.000000 +75827 -1.000000 +75828 -1.000000 +75829 -1.000000 +75830 -1.000000 +75831 -1.000000 +75832 -1.000000 +75833 -1.000000 +75834 -1.000000 +75839 -1.000000 +75841 -1.000000 +75842 -1.000000 +75843 -1.000000 +75847 -1.000000 +75848 -1.000000 +75849 -1.000000 +75850 -1.000000 +75851 -1.000000 +75852 -1.000000 +75853 -1.000000 +75854 -1.000000 +75856 -1.000000 +75857 -1.000000 +75858 -1.000000 +75859 -1.000000 +75860 -1.000000 +75861 -1.000000 +75862 -1.000000 +75863 -1.000000 +75864 -1.000000 +75865 -1.000000 +75866 -1.000000 +75867 -1.000000 +75868 -1.000000 +75869 -1.000000 +75870 -1.000000 +75871 -1.000000 +75872 -1.000000 +75873 -1.000000 +75874 -1.000000 +75875 -1.000000 +75876 -1.000000 +75877 -1.000000 +75878 -1.000000 +75879 -1.000000 +75882 -1.000000 +75883 -1.000000 +75884 -1.000000 +75885 -1.000000 +75886 -1.000000 +75888 -1.000000 +75898 -1.000000 +75899 -1.000000 +75902 -1.000000 +75904 -1.000000 +75905 -1.000000 +75906 -1.000000 +75909 -1.000000 +75910 -1.000000 +75911 -1.000000 +75912 -1.000000 +75913 -1.000000 +75914 -1.000000 +75915 -1.000000 +75916 -1.000000 +75917 -1.000000 +75918 -1.000000 +75921 -1.000000 +75922 -1.000000 +75923 -1.000000 +75924 -1.000000 +75925 -1.000000 +75926 -1.000000 +75927 -1.000000 +75928 -1.000000 +75929 -1.000000 +75930 -1.000000 +75931 -1.000000 +75933 -1.000000 +75934 -1.000000 +75935 -1.000000 +75936 -1.000000 +75937 -1.000000 +75938 -1.000000 +75939 -1.000000 +75940 -1.000000 +75941 -1.000000 +75942 -1.000000 +75943 -1.000000 +75944 -1.000000 +75945 -1.000000 +75946 -1.000000 +75947 -1.000000 +75950 -1.000000 +75952 -1.000000 +75953 -1.000000 +75954 -1.000000 +75956 -1.000000 +75957 -1.000000 +75958 -1.000000 +75959 -1.000000 +75960 -1.000000 +75961 -1.000000 +75962 -1.000000 +75963 -1.000000 +75964 -1.000000 +75965 -1.000000 +75966 -1.000000 +75967 -1.000000 +75968 -1.000000 +75970 -1.000000 +75973 -1.000000 +75974 -1.000000 +75975 -1.000000 +75976 -1.000000 +75977 -1.000000 +75978 -1.000000 +75979 -1.000000 +75981 -1.000000 +75982 -1.000000 +75984 -1.000000 +75985 -1.000000 +75986 -1.000000 +75987 -1.000000 +75988 -1.000000 +75989 -1.000000 +75990 -1.000000 +75991 -1.000000 +75992 -1.000000 +75993 -1.000000 +75994 -1.000000 +75995 -1.000000 +75996 -1.000000 +75997 -1.000000 +75998 -1.000000 +75999 -1.000000 +76000 -1.000000 +76001 -1.000000 +76002 -1.000000 +76003 -1.000000 +76004 -1.000000 +76005 -1.000000 +76010 -1.000000 +76011 -1.000000 +76012 -1.000000 +76013 -1.000000 +76014 -1.000000 +76016 -1.000000 +76017 -1.000000 +76018 -1.000000 +76019 -1.000000 +76020 -1.000000 +76021 -1.000000 +76022 -1.000000 +76023 -1.000000 +76024 -1.000000 +76025 -1.000000 +76026 -1.000000 +76027 -1.000000 +76029 -1.000000 +76033 -1.000000 +76034 -1.000000 +76035 -1.000000 +76036 -1.000000 +76037 -1.000000 +76038 -1.000000 +76039 -1.000000 +76040 -1.000000 +76041 -1.000000 +76042 -1.000000 +76043 -1.000000 +76044 -1.000000 +76045 -1.000000 +76046 -1.000000 +76047 -1.000000 +76048 -1.000000 +76049 -1.000000 +76050 -1.000000 +76051 -1.000000 +76053 -1.000000 +76056 -1.000000 +76057 -1.000000 +76058 -1.000000 +76060 -1.000000 +76061 -1.000000 +76062 -1.000000 +76063 -1.000000 +76065 -1.000000 +76066 -1.000000 +76067 -1.000000 +76068 -1.000000 +76069 -1.000000 +76070 -1.000000 +76071 -1.000000 +76072 -1.000000 +76073 -1.000000 +76074 -1.000000 +76075 -1.000000 +76076 -1.000000 +76077 -1.000000 +76078 -1.000000 +76079 -1.000000 +76080 -1.000000 +76081 -1.000000 +76082 -1.000000 +76083 -1.000000 +76084 -1.000000 +76085 -1.000000 +76086 -1.000000 +76088 -1.000000 +76089 -1.000000 +76090 -1.000000 +76091 -1.000000 +76092 -1.000000 +76094 -1.000000 +76095 -1.000000 +76096 -1.000000 +76097 -1.000000 +76098 -1.000000 +76099 -1.000000 +76100 -1.000000 +76101 -1.000000 +76102 -1.000000 +76103 -1.000000 +76104 -1.000000 +76105 -1.000000 +76106 -1.000000 +76107 -1.000000 +76108 -1.000000 +76109 -1.000000 +76110 -1.000000 +76111 -1.000000 +76112 -1.000000 +76113 -1.000000 +76114 -1.000000 +76115 -1.000000 +76117 -1.000000 +76118 -1.000000 +76119 -1.000000 +76120 -1.000000 +76121 -1.000000 +76123 -1.000000 +76124 -1.000000 +76125 -1.000000 +76126 -1.000000 +76127 -1.000000 +76128 -1.000000 +76129 -1.000000 +76130 -1.000000 +76131 -1.000000 +76133 -1.000000 +76134 -1.000000 +76135 -1.000000 +76136 -1.000000 +76137 -1.000000 +76138 -1.000000 +76139 -1.000000 +76141 -1.000000 +76142 -1.000000 +76143 -1.000000 +76144 -1.000000 +76145 -1.000000 +76146 -1.000000 +76147 -1.000000 +76148 -1.000000 +76149 -1.000000 +76151 -1.000000 +76152 -1.000000 +76153 -1.000000 +76154 -1.000000 +76155 -1.000000 +76156 -1.000000 +76157 -1.000000 +76158 -1.000000 +76159 -1.000000 +76160 -1.000000 +76161 -1.000000 +76162 -1.000000 +76163 -1.000000 +76164 -1.000000 +76165 -1.000000 +76166 -1.000000 +76167 -1.000000 +76168 -1.000000 +76169 -1.000000 +76170 -1.000000 +76171 -1.000000 +76172 -1.000000 +76173 -1.000000 +76174 -1.000000 +76175 -1.000000 +76176 -1.000000 +76177 -1.000000 +76178 -1.000000 +76179 -1.000000 +76180 -1.000000 +76182 -1.000000 +76183 -1.000000 +76184 -1.000000 +76185 -1.000000 +76186 -1.000000 +76187 -1.000000 +76188 -1.000000 +76189 -1.000000 +76190 -1.000000 +76191 -1.000000 +76192 -1.000000 +76195 -1.000000 +76196 -1.000000 +76197 -1.000000 +76198 -1.000000 +76199 -1.000000 +76200 -1.000000 +76201 -1.000000 +76202 -1.000000 +76203 -1.000000 +76204 -1.000000 +76205 -1.000000 +76206 -1.000000 +76208 -1.000000 +76209 -1.000000 +76210 -1.000000 +76211 -1.000000 +76212 -1.000000 +76213 -1.000000 +76214 -1.000000 +76215 -1.000000 +76216 -1.000000 +76217 -1.000000 +76218 -1.000000 +76219 -1.000000 +76220 -1.000000 +76221 -1.000000 +76222 -1.000000 +76223 -1.000000 +76224 -1.000000 +76225 -1.000000 +76226 -1.000000 +76227 -1.000000 +76228 -1.000000 +76229 -1.000000 +76230 -1.000000 +76231 -1.000000 +76233 -1.000000 +76234 -1.000000 +76235 -1.000000 +76236 -1.000000 +76237 -1.000000 +76238 -1.000000 +76240 -1.000000 +76241 -1.000000 +76242 -1.000000 +76243 -1.000000 +76244 -1.000000 +76246 -1.000000 +76247 -1.000000 +76248 -1.000000 +76249 -1.000000 +76250 -1.000000 +76255 -1.000000 +76259 -1.000000 +76262 -1.000000 +76265 -1.000000 +76267 -1.000000 +76268 -1.000000 +76269 -1.000000 +76271 -1.000000 +76272 -1.000000 +76273 -1.000000 +76274 -1.000000 +76275 -1.000000 +76276 -1.000000 +76277 -1.000000 +76278 -1.000000 +76279 -1.000000 +76280 -1.000000 +76281 -1.000000 +76283 -1.000000 +76287 -1.000000 +76288 -1.000000 +76289 -1.000000 +76290 -1.000000 +76291 -1.000000 +76296 -1.000000 +76297 -1.000000 +76298 -1.000000 +76300 -1.000000 +76301 -1.000000 +76303 -1.000000 +76304 -1.000000 +76305 -1.000000 +76306 -1.000000 +76307 -1.000000 +76308 -1.000000 +76309 -1.000000 +76311 -1.000000 +76312 -1.000000 +76313 -1.000000 +76329 -1.000000 +76396 -1.000000 +76400 -1.000000 +76404 -1.000000 +76406 -1.000000 +76408 -1.000000 +76409 -1.000000 +76410 -1.000000 +76411 -1.000000 +76412 -1.000000 +76413 -1.000000 +76414 -1.000000 +76415 -1.000000 +76416 -1.000000 +76417 -1.000000 +76418 -1.000000 +76419 -1.000000 +76420 -1.000000 +76421 -1.000000 +76422 -1.000000 +76426 -1.000000 +76428 -1.000000 +76430 -1.000000 +76434 -1.000000 +76437 -1.000000 +76438 -1.000000 +76440 -1.000000 +76441 -1.000000 +76442 -1.000000 +76443 -1.000000 +76444 -1.000000 +76445 -1.000000 +76446 -1.000000 +76447 -1.000000 +76448 -1.000000 +76449 -1.000000 +76450 -1.000000 +76451 -1.000000 +76452 -1.000000 +76453 -1.000000 +76454 -1.000000 +76455 -1.000000 +76456 -1.000000 +76457 -1.000000 +76458 -1.000000 +76460 -1.000000 +76461 -1.000000 +76462 -1.000000 +76463 -1.000000 +76464 -1.000000 +76465 -1.000000 +76466 -1.000000 +76467 -1.000000 +76468 -1.000000 +76469 -1.000000 +76470 -1.000000 +76471 -1.000000 +76472 -1.000000 +76473 -1.000000 +76474 -1.000000 +76475 -1.000000 +76476 -1.000000 +76477 -1.000000 +76478 -1.000000 +76479 -1.000000 +76480 -1.000000 +76481 -1.000000 +76482 -1.000000 +76483 -1.000000 +76485 -1.000000 +76486 -1.000000 +76487 -1.000000 +76488 -1.000000 +76489 -1.000000 +76490 -1.000000 +76492 -1.000000 +76493 -1.000000 +76494 -1.000000 +76495 -1.000000 +76496 -1.000000 +76498 -1.000000 +76501 -1.000000 +76502 -1.000000 +76503 -1.000000 +76504 -1.000000 +76505 -1.000000 +76506 -1.000000 +76507 -1.000000 +76508 -1.000000 +76509 -1.000000 +76510 -1.000000 +76511 -1.000000 +76514 -1.000000 +76515 -1.000000 +76516 -1.000000 +76518 -1.000000 +76519 -1.000000 +76520 -1.000000 +76521 -1.000000 +76522 -1.000000 +76523 -1.000000 +76525 -1.000000 +76526 -1.000000 +76527 -1.000000 +76528 -1.000000 +76529 -1.000000 +76531 -1.000000 +76542 -1.000000 +76543 -1.000000 +76546 -1.000000 +76547 -1.000000 +76548 -1.000000 +76549 -1.000000 +76550 -1.000000 +76551 -1.000000 +76552 -1.000000 +76553 -1.000000 +76554 -1.000000 +76555 -1.000000 +76556 -1.000000 +76557 -1.000000 +76558 -1.000000 +76559 -1.000000 +76560 -1.000000 +76561 -1.000000 +76562 -1.000000 +76563 -1.000000 +76564 -1.000000 +76565 -1.000000 +76567 -1.000000 +76568 -1.000000 +76569 -1.000000 +76570 -1.000000 +76571 -1.000000 +76572 -1.000000 +76573 -1.000000 +76574 -1.000000 +76575 -1.000000 +76576 -1.000000 +76577 -1.000000 +76578 -1.000000 +76579 -1.000000 +76580 -1.000000 +76581 -1.000000 +76582 -1.000000 +76583 -1.000000 +76584 -1.000000 +76585 -1.000000 +76586 -1.000000 +76587 -1.000000 +76588 -1.000000 +76591 -1.000000 +76594 -1.000000 +76595 -1.000000 +76597 -1.000000 +76599 -1.000000 +76600 -1.000000 +76601 -1.000000 +76602 -1.000000 +76603 -1.000000 +76604 -1.000000 +76605 -1.000000 +76606 -1.000000 +76607 -1.000000 +76608 -1.000000 +76609 -1.000000 +76610 -1.000000 +76611 -1.000000 +76612 -1.000000 +76613 -1.000000 +76614 -1.000000 +76615 -1.000000 +76616 -1.000000 +76617 -1.000000 +76618 -1.000000 +76619 -1.000000 +76620 -1.000000 +76621 -1.000000 +76622 -1.000000 +76623 -1.000000 +76624 -1.000000 +76625 -1.000000 +76626 -1.000000 +76627 -1.000000 +76628 -1.000000 +76629 -1.000000 +76630 -1.000000 +76631 -1.000000 +76632 -1.000000 +76634 -1.000000 +76635 -1.000000 +76636 -1.000000 +76637 -1.000000 +76638 -1.000000 +76639 -1.000000 +76640 -1.000000 +76641 -1.000000 +76642 -1.000000 +76643 -1.000000 +76644 -1.000000 +76645 -1.000000 +76646 -1.000000 +76647 -1.000000 +76648 -1.000000 +76649 -1.000000 +76650 -1.000000 +76651 -1.000000 +76652 -1.000000 +76653 -1.000000 +76654 -1.000000 +76659 -1.000000 +76660 -1.000000 +76661 -1.000000 +76662 -1.000000 +76663 -1.000000 +76665 -1.000000 +76666 -1.000000 +76667 -1.000000 +76668 -1.000000 +76669 -1.000000 +76670 -1.000000 +76671 -1.000000 +76675 -1.000000 +76676 -1.000000 +76677 -1.000000 +76678 -1.000000 +76679 -1.000000 +76680 -1.000000 +76681 -1.000000 +76683 -1.000000 +76685 -1.000000 +76686 -1.000000 +76687 -1.000000 +76688 -1.000000 +76689 -1.000000 +76690 -1.000000 +76691 -1.000000 +76693 -1.000000 +76696 -1.000000 +76697 -1.000000 +76698 -1.000000 +76699 -1.000000 +76700 -1.000000 +76701 -1.000000 +76702 -1.000000 +76703 -1.000000 +76704 -1.000000 +76707 -1.000000 +76708 -1.000000 +76709 -1.000000 +76710 -1.000000 +76711 -1.000000 +76712 -1.000000 +76713 -1.000000 +76714 -1.000000 +76715 -1.000000 +76716 -1.000000 +76717 -1.000000 +76720 -1.000000 +76721 -1.000000 +76722 -1.000000 +76723 -1.000000 +76724 -1.000000 +76725 -1.000000 +76726 -1.000000 +76727 -1.000000 +76728 -1.000000 +76729 -1.000000 +76732 -1.000000 +76733 -1.000000 +76734 -1.000000 +76735 -1.000000 +76736 -1.000000 +76737 -1.000000 +76738 -1.000000 +76739 -1.000000 +76740 -1.000000 +76741 -1.000000 +76742 -1.000000 +76744 -1.000000 +76745 -1.000000 +76746 -1.000000 +76747 -1.000000 +76748 -1.000000 +76749 -1.000000 +76750 -1.000000 +76751 -1.000000 +76752 -1.000000 +76753 -1.000000 +76754 -1.000000 +76755 -1.000000 +76756 -1.000000 +76757 -1.000000 +76758 -1.000000 +76761 -1.000000 +76762 -1.000000 +76763 -1.000000 +76764 -1.000000 +76766 -1.000000 +76767 -1.000000 +76768 -1.000000 +76769 -1.000000 +76771 -1.000000 +76772 -1.000000 +76773 -1.000000 +76774 -1.000000 +76775 -1.000000 +76776 -1.000000 +76777 -1.000000 +76778 -1.000000 +76779 -1.000000 +76780 -1.000000 +76781 -1.000000 +76782 -1.000000 +76784 -1.000000 +76786 -1.000000 +76787 -1.000000 +76789 -1.000000 +76790 -1.000000 +76791 -1.000000 +76792 -1.000000 +76793 -1.000000 +76798 -1.000000 +76800 -1.000000 +76801 -1.000000 +76802 -1.000000 +76803 -1.000000 +76804 -1.000000 +76805 -1.000000 +76806 -1.000000 +76807 -1.000000 +76808 -1.000000 +76809 -1.000000 +76810 -1.000000 +76811 -1.000000 +76816 -1.000000 +76824 -1.000000 +76827 -1.000000 +76828 -1.000000 +76831 -1.000000 +76832 -1.000000 +76833 -1.000000 +76834 -1.000000 +76835 -1.000000 +76836 -1.000000 +76837 -1.000000 +76838 -1.000000 +76840 -1.000000 +76841 -1.000000 +76843 -1.000000 +76845 -1.000000 +76846 -1.000000 +76847 -1.000000 +76849 -1.000000 +76853 -1.000000 +76854 -1.000000 +76855 -1.000000 +76856 -1.000000 +76857 -1.000000 +76858 -1.000000 +76859 -1.000000 +76864 -1.000000 +76865 -1.000000 +76866 -1.000000 +76867 -1.000000 +76868 -1.000000 +76869 -1.000000 +76870 -1.000000 +76871 -1.000000 +76873 -1.000000 +76874 -1.000000 +76875 -1.000000 +76876 -1.000000 +76877 -1.000000 +76878 -1.000000 +76879 -1.000000 +76880 -1.000000 +76881 -1.000000 +76882 -1.000000 +76884 -1.000000 +76885 -1.000000 +76886 -1.000000 +76887 -1.000000 +76888 -1.000000 +76889 -1.000000 +76891 -1.000000 +76892 -1.000000 +76893 -1.000000 +76894 -1.000000 +76895 -1.000000 +76896 -1.000000 +76897 -1.000000 +76898 -1.000000 +76899 -1.000000 +76900 -1.000000 +76901 -1.000000 +76902 -1.000000 +76903 -1.000000 +76904 -1.000000 +76905 -1.000000 +76906 -1.000000 +76907 -1.000000 +76909 -1.000000 +76910 -1.000000 +76913 -1.000000 +76914 -1.000000 +76915 -1.000000 +76916 -1.000000 +76917 -1.000000 +76918 -1.000000 +76922 -1.000000 +76923 -1.000000 +76924 -1.000000 +76925 -1.000000 +76926 -1.000000 +76927 -1.000000 +76928 -1.000000 +76929 -1.000000 +76930 -1.000000 +76931 -1.000000 +76932 -1.000000 +76933 -1.000000 +76934 -1.000000 +76935 -1.000000 +76938 -1.000000 +76939 -1.000000 +76940 -1.000000 +76941 -1.000000 +76945 -1.000000 +76947 -1.000000 +76948 -1.000000 +76949 -1.000000 +76970 -1.000000 +76971 -1.000000 +76972 -1.000000 +76974 -1.000000 +76975 -1.000000 +76978 -1.000000 +76979 -1.000000 +76980 -1.000000 +76981 -1.000000 +76982 -1.000000 +76983 -1.000000 +76984 -1.000000 +76986 -1.000000 +76987 -1.000000 +76988 -1.000000 +76989 -1.000000 +76990 -1.000000 +76994 -1.000000 +76995 -1.000000 +76997 -1.000000 +76998 -1.000000 +76999 -1.000000 +77000 -1.000000 +77001 -1.000000 +77002 -1.000000 +77003 -1.000000 +77005 -1.000000 +77006 -1.000000 +77007 -1.000000 +77008 -1.000000 +77009 -1.000000 +77010 -1.000000 +77011 -1.000000 +77012 -1.000000 +77013 -1.000000 +77014 -1.000000 +77015 -1.000000 +77016 -1.000000 +77017 -1.000000 +77018 -1.000000 +77019 -1.000000 +77020 -1.000000 +77021 -1.000000 +77025 -1.000000 +77027 -1.000000 +77029 -1.000000 +77030 -1.000000 +77032 -1.000000 +77033 -1.000000 +77034 -1.000000 +77035 -1.000000 +77037 -1.000000 +77038 -1.000000 +77040 -1.000000 +77042 -1.000000 +77043 -1.000000 +77044 -1.000000 +77045 -1.000000 +77046 -1.000000 +77047 -1.000000 +77048 -1.000000 +77049 -1.000000 +77050 -1.000000 +77052 -1.000000 +77053 -1.000000 +77054 -1.000000 +77055 -1.000000 +77056 -1.000000 +77059 -1.000000 +77061 -1.000000 +77062 -1.000000 +77063 -1.000000 +77064 -1.000000 +77065 -1.000000 +77066 -1.000000 +77067 -1.000000 +77068 -1.000000 +77069 -1.000000 +77070 -1.000000 +77071 -1.000000 +77073 -1.000000 +77074 -1.000000 +77075 -1.000000 +77076 -1.000000 +77077 -1.000000 +77080 -1.000000 +77082 -1.000000 +77083 -1.000000 +77084 -1.000000 +77085 -1.000000 +77086 -1.000000 +77089 -1.000000 +77090 -1.000000 +77091 -1.000000 +77092 -1.000000 +77093 -1.000000 +77094 -1.000000 +77095 -1.000000 +77096 -1.000000 +77097 -1.000000 +77099 -1.000000 +77100 -1.000000 +77101 -1.000000 +77102 -1.000000 +77103 -1.000000 +77104 -1.000000 +77105 -1.000000 +77106 -1.000000 +77107 -1.000000 +77108 -1.000000 +77109 -1.000000 +77110 -1.000000 +77117 -1.000000 +77118 -1.000000 +77119 -1.000000 +77121 -1.000000 +77122 -1.000000 +77123 -1.000000 +77124 -1.000000 +77125 -1.000000 +77126 -1.000000 +77127 -1.000000 +77128 -1.000000 +77129 -1.000000 +77130 -1.000000 +77132 -1.000000 +77133 -1.000000 +77134 -1.000000 +77136 -1.000000 +77137 -1.000000 +77138 -1.000000 +77139 -1.000000 +77140 -1.000000 +77141 -1.000000 +77142 -1.000000 +77143 -1.000000 +77144 -1.000000 +77145 -1.000000 +77146 -1.000000 +77147 -1.000000 +77148 -1.000000 +77149 -1.000000 +77150 -1.000000 +77151 -1.000000 +77152 -1.000000 +77153 -1.000000 +77154 -1.000000 +77155 -1.000000 +77156 -1.000000 +77157 -1.000000 +77158 -1.000000 +77159 -1.000000 +77160 -1.000000 +77161 -1.000000 +77162 -1.000000 +77164 -1.000000 +77165 -1.000000 +77166 -1.000000 +77167 -1.000000 +77168 -1.000000 +77169 -1.000000 +77170 -1.000000 +77171 -1.000000 +77172 -1.000000 +77173 -1.000000 +77174 -1.000000 +77175 -1.000000 +77178 -1.000000 +77179 -1.000000 +77180 -1.000000 +77181 -1.000000 +77182 -1.000000 +77184 -1.000000 +77185 -1.000000 +77186 -1.000000 +77187 -1.000000 +77188 -1.000000 +77189 -1.000000 +77191 -1.000000 +77196 -1.000000 +77197 -1.000000 +77198 -1.000000 +77199 -1.000000 +77200 -1.000000 +77201 -1.000000 +77202 -1.000000 +77203 -1.000000 +77204 -1.000000 +77205 -1.000000 +77206 -1.000000 +77207 -1.000000 +77208 -1.000000 +77209 -1.000000 +77210 -1.000000 +77211 -1.000000 +77212 -1.000000 +77213 -1.000000 +77214 -1.000000 +77215 -1.000000 +77216 -1.000000 +77217 -1.000000 +77218 -1.000000 +77219 -1.000000 +77220 -1.000000 +77224 -1.000000 +77226 -1.000000 +77227 -1.000000 +77228 -1.000000 +77229 -1.000000 +77230 -1.000000 +77231 -1.000000 +77232 -1.000000 +77234 -1.000000 +77236 -1.000000 +77237 -1.000000 +77238 -1.000000 +77239 -1.000000 +77241 -1.000000 +77242 -1.000000 +77243 -1.000000 +77244 -1.000000 +77245 -1.000000 +77246 -1.000000 +77247 -1.000000 +77248 -1.000000 +77249 -1.000000 +77250 -1.000000 +77252 -1.000000 +77253 -1.000000 +77254 -1.000000 +77255 -1.000000 +77256 -1.000000 +77257 -1.000000 +77258 -1.000000 +77259 -1.000000 +77260 -1.000000 +77261 -1.000000 +77262 -1.000000 +77263 -1.000000 +77264 -1.000000 +77265 -1.000000 +77266 -1.000000 +77267 -1.000000 +77268 -1.000000 +77269 -1.000000 +77270 -1.000000 +77271 -1.000000 +77272 -1.000000 +77275 -1.000000 +77276 -1.000000 +77277 -1.000000 +77278 -1.000000 +77279 -1.000000 +77280 -1.000000 +77281 -1.000000 +77282 -1.000000 +77283 -1.000000 +77284 -1.000000 +77286 -1.000000 +77287 -1.000000 +77288 -1.000000 +77289 -1.000000 +77290 -1.000000 +77291 -1.000000 +77292 -1.000000 +77293 -1.000000 +77294 -1.000000 +77295 -1.000000 +77296 -1.000000 +77297 -1.000000 +77298 -1.000000 +77299 -1.000000 +77300 -1.000000 +77301 -1.000000 +77302 -1.000000 +77303 -1.000000 +77304 -1.000000 +77305 -1.000000 +77306 -1.000000 +77307 -1.000000 +77308 -1.000000 +77309 -1.000000 +77310 -1.000000 +77311 -1.000000 +77313 -1.000000 +77314 -1.000000 +77315 -1.000000 +77316 -1.000000 +77317 -1.000000 +77318 -1.000000 +77319 -1.000000 +77320 -1.000000 +77321 -1.000000 +77322 -1.000000 +77326 -1.000000 +77329 -1.000000 +77330 -1.000000 +77331 -1.000000 +77332 -1.000000 +77333 -1.000000 +77334 -1.000000 +77335 -1.000000 +77336 -1.000000 +77337 -1.000000 +77338 -1.000000 +77339 -1.000000 +77340 -1.000000 +77342 -1.000000 +77344 -1.000000 +77345 -1.000000 +77346 -1.000000 +77347 -1.000000 +77348 -1.000000 +77349 -1.000000 +77351 -1.000000 +77353 -1.000000 +77361 -1.000000 +77362 -1.000000 +77363 -1.000000 +77364 -1.000000 +77368 -1.000000 +77369 -1.000000 +77370 -1.000000 +77371 -1.000000 +77374 -1.000000 +77375 -1.000000 +77376 -1.000000 +77381 -1.000000 +77382 -1.000000 +77383 -1.000000 +77384 -1.000000 +77385 -1.000000 +77386 -1.000000 +77387 -1.000000 +77388 -1.000000 +77389 -1.000000 +77390 -1.000000 +77391 -1.000000 +77392 -1.000000 +77393 -1.000000 +77395 -1.000000 +77396 -1.000000 +77397 -1.000000 +77398 -1.000000 +77399 -1.000000 +77400 -1.000000 +77401 -1.000000 +77402 -1.000000 +77403 -1.000000 +77404 -1.000000 +77405 -1.000000 +77408 -1.000000 +77409 -1.000000 +77410 -1.000000 +77411 -1.000000 +77412 -1.000000 +77413 -1.000000 +77414 -1.000000 +77415 -1.000000 +77416 -1.000000 +77417 -1.000000 +77419 -1.000000 +77420 -1.000000 +77421 -1.000000 +77422 -1.000000 +77423 -1.000000 +77424 -1.000000 +77425 -1.000000 +77426 -1.000000 +77427 -1.000000 +77428 -1.000000 +77429 -1.000000 +77431 -1.000000 +77432 -1.000000 +77433 -1.000000 +77434 -1.000000 +77435 -1.000000 +77436 -1.000000 +77437 -1.000000 +77438 -1.000000 +77439 -1.000000 +77442 -1.000000 +77443 -1.000000 +77444 -1.000000 +77445 -1.000000 +77446 -1.000000 +77447 -1.000000 +77448 -1.000000 +77449 -1.000000 +77450 -1.000000 +77451 -1.000000 +77453 -1.000000 +77454 -1.000000 +77458 -1.000000 +77460 -1.000000 +77461 -1.000000 +77462 -1.000000 +77463 -1.000000 +77464 -1.000000 +77467 -1.000000 +77468 -1.000000 +77469 -1.000000 +77471 -1.000000 +77472 -1.000000 +77473 -1.000000 +77474 -1.000000 +77475 -1.000000 +77476 -1.000000 +77477 -1.000000 +77478 -1.000000 +77479 -1.000000 +77480 -1.000000 +77483 -1.000000 +77485 -1.000000 +77487 -1.000000 +77488 -1.000000 +77489 -1.000000 +77490 -1.000000 +77492 -1.000000 +77495 -1.000000 +77496 -1.000000 +77497 -1.000000 +77498 -1.000000 +77499 -1.000000 +77500 -1.000000 +77502 -1.000000 +77503 -1.000000 +77506 -1.000000 +77507 -1.000000 +77509 -1.000000 +77510 -1.000000 +77511 -1.000000 +77540 -1.000000 +77541 -1.000000 +77542 -1.000000 +77543 -1.000000 +77544 -1.000000 +77545 -1.000000 +77546 -1.000000 +77547 -1.000000 +77548 -1.000000 +77549 -1.000000 +77550 -1.000000 +77551 -1.000000 +77552 -1.000000 +77553 -1.000000 +77554 -1.000000 +77555 -1.000000 +77556 -1.000000 +77557 -1.000000 +77558 -1.000000 +77559 -1.000000 +77560 -1.000000 +77561 -1.000000 +77562 -1.000000 +77563 -1.000000 +77564 -1.000000 +77565 -1.000000 +77566 -1.000000 +77567 -1.000000 +77568 -1.000000 +77569 -1.000000 +77570 -1.000000 +77571 -1.000000 +77572 -1.000000 +77573 -1.000000 +77574 -1.000000 +77576 -1.000000 +77577 -1.000000 +77578 -1.000000 +77579 -1.000000 +77580 -1.000000 +77581 -1.000000 +77582 -1.000000 +77584 -1.000000 +77585 -1.000000 +77586 -1.000000 +77587 -1.000000 +77588 -1.000000 +77589 -1.000000 +77590 -1.000000 +77591 -1.000000 +77592 -1.000000 +77593 -1.000000 +77594 -1.000000 +77595 -1.000000 +77596 -1.000000 +77597 -1.000000 +77598 -1.000000 +77599 -1.000000 +77600 -1.000000 +77601 -1.000000 +77602 -1.000000 +77603 -1.000000 +77605 -1.000000 +77606 -1.000000 +77607 -1.000000 +77608 -1.000000 +77609 -1.000000 +77610 -1.000000 +77611 -1.000000 +77612 -1.000000 +77615 -1.000000 +77616 -1.000000 +77618 -1.000000 +77619 -1.000000 +77620 -1.000000 +77621 -1.000000 +77622 -1.000000 +77623 -1.000000 +77624 -1.000000 +77625 -1.000000 +77626 -1.000000 +77627 -1.000000 +77628 -1.000000 +77629 -1.000000 +77631 -1.000000 +77632 -1.000000 +77633 -1.000000 +77634 -1.000000 +77635 -1.000000 +77637 -1.000000 +77639 -1.000000 +77640 -1.000000 +77641 -1.000000 +77642 -1.000000 +77645 -1.000000 +77646 -1.000000 +77647 -1.000000 +77648 -1.000000 +77649 -1.000000 +77650 -1.000000 +77653 -1.000000 +77655 -1.000000 +77657 -1.000000 +77670 -1.000000 +77671 -1.000000 +77672 -1.000000 +77673 -1.000000 +77674 -1.000000 +77677 -1.000000 +77678 -1.000000 +77680 -1.000000 +77681 -1.000000 +77682 -1.000000 +77685 -1.000000 +77686 -1.000000 +77687 -1.000000 +77688 -1.000000 +77689 -1.000000 +77691 -1.000000 +77692 -1.000000 +77693 -1.000000 +77694 -1.000000 +77695 -1.000000 +77697 -1.000000 +77698 -1.000000 +77699 -1.000000 +77700 -1.000000 +77701 -1.000000 +77702 -1.000000 +77703 -1.000000 +77704 -1.000000 +77705 -1.000000 +77706 -1.000000 +77707 -1.000000 +77708 -1.000000 +77709 -1.000000 +77710 -1.000000 +77712 -1.000000 +77713 -1.000000 +77714 -1.000000 +77715 -1.000000 +77717 -1.000000 +77718 -1.000000 +77719 -1.000000 +77720 -1.000000 +77721 -1.000000 +77722 -1.000000 +77723 -1.000000 +77725 -1.000000 +77726 -1.000000 +77728 -1.000000 +77729 -1.000000 +77730 -1.000000 +77731 -1.000000 +77732 -1.000000 +77733 -1.000000 +77734 -1.000000 +77735 -1.000000 +77736 -1.000000 +77737 -1.000000 +77738 -1.000000 +77739 -1.000000 +77740 -1.000000 +77741 -1.000000 +77742 -1.000000 +77743 -1.000000 +77745 -1.000000 +77746 -1.000000 +77747 -1.000000 +77748 -1.000000 +77749 -1.000000 +77750 -1.000000 +77751 -1.000000 +77752 -1.000000 +77757 -1.000000 +77758 -1.000000 +77759 -1.000000 +77760 -1.000000 +77761 -1.000000 +77762 -1.000000 +77763 -1.000000 +77764 -1.000000 +77766 -1.000000 +77767 -1.000000 +77768 -1.000000 +77769 -1.000000 +77770 -1.000000 +77771 -1.000000 +77772 -1.000000 +77773 -1.000000 +77774 -1.000000 +77775 -1.000000 +77776 -1.000000 +77777 -1.000000 +77778 -1.000000 +77779 -1.000000 +77780 -1.000000 +77781 -1.000000 +77783 -1.000000 +77784 -1.000000 +77785 -1.000000 +77786 -1.000000 +77787 -1.000000 +77788 -1.000000 +77789 -1.000000 +77790 -1.000000 +77791 -1.000000 +77792 -1.000000 +77793 -1.000000 +77794 -1.000000 +77795 -1.000000 +77796 -1.000000 +77798 -1.000000 +77799 -1.000000 +77802 -1.000000 +77819 -1.000000 +77822 -1.000000 +77823 -1.000000 +77833 -1.000000 +77834 -1.000000 +77836 -1.000000 +77837 -1.000000 +77838 -1.000000 +77839 -1.000000 +77840 -1.000000 +77843 -1.000000 +77844 -1.000000 +77846 -1.000000 +77847 -1.000000 +77848 -1.000000 +77849 -1.000000 +77851 -1.000000 +77852 -1.000000 +77853 -1.000000 +77854 -1.000000 +77855 -1.000000 +77856 -1.000000 +77857 -1.000000 +77858 -1.000000 +77859 -1.000000 +77860 -1.000000 +77862 -1.000000 +77863 -1.000000 +77864 -1.000000 +77865 -1.000000 +77866 -1.000000 +77867 -1.000000 +77868 -1.000000 +77869 -1.000000 +77870 -1.000000 +77871 -1.000000 +77873 -1.000000 +77874 -1.000000 +77875 -1.000000 +77876 -1.000000 +77877 -1.000000 +77878 -1.000000 +77879 -1.000000 +77880 -1.000000 +77881 -1.000000 +77883 -1.000000 +77884 -1.000000 +77885 -1.000000 +77886 -1.000000 +77887 -1.000000 +77888 -1.000000 +77889 -1.000000 +77892 -1.000000 +77893 -1.000000 +77894 -1.000000 +77895 -1.000000 +77898 -1.000000 +77899 -1.000000 +77900 -1.000000 +77901 -1.000000 +77902 -1.000000 +77904 -1.000000 +77905 -1.000000 +77906 -1.000000 +77907 -1.000000 +77908 -1.000000 +77909 -1.000000 +77910 -1.000000 +77911 -1.000000 +77912 -1.000000 +77913 -1.000000 +77914 -1.000000 +77915 -1.000000 +77916 -1.000000 +77918 -1.000000 +77919 -1.000000 +77920 -1.000000 +77921 -1.000000 +77922 -1.000000 +77923 -1.000000 +77924 -1.000000 +77925 -1.000000 +77926 -1.000000 +77927 -1.000000 +77929 -1.000000 +77931 -1.000000 +77932 -1.000000 +77933 -1.000000 +77936 -1.000000 +77937 -1.000000 +77938 -1.000000 +77939 -1.000000 +77940 -1.000000 +77942 -1.000000 +77943 -1.000000 +77945 -1.000000 +77946 -1.000000 +77947 -1.000000 +77948 -1.000000 +77949 -1.000000 +77950 -1.000000 +77953 -1.000000 +77954 -1.000000 +77955 -1.000000 +77958 -1.000000 +77959 -1.000000 +77960 -1.000000 +77961 -1.000000 +77962 -1.000000 +77963 -1.000000 +77964 -1.000000 +77965 -1.000000 +77966 -1.000000 +77982 -1.000000 +77987 -1.000000 +77989 -1.000000 +77990 -1.000000 +77991 -1.000000 +77992 -1.000000 +77993 -1.000000 +77994 -1.000000 +77995 -1.000000 +77997 -1.000000 +77998 -1.000000 +77999 -1.000000 +78000 -1.000000 +78001 -1.000000 +78002 -1.000000 +78003 -1.000000 +78004 -1.000000 +78005 -1.000000 +78006 -1.000000 +78008 -1.000000 +78009 -1.000000 +78010 -1.000000 +78011 -1.000000 +78014 -1.000000 +78018 -1.000000 +78019 -1.000000 +78020 -1.000000 +78021 -1.000000 +78022 -1.000000 +78023 -1.000000 +78024 -1.000000 +78025 -1.000000 +78031 -1.000000 +78032 -1.000000 +78033 -1.000000 +78034 -1.000000 +78035 -1.000000 +78037 -1.000000 +78038 -1.000000 +78040 -1.000000 +78041 -1.000000 +78042 -1.000000 +78043 -1.000000 +78044 -1.000000 +78045 -1.000000 +78046 -1.000000 +78047 -1.000000 +78050 -1.000000 +78051 -1.000000 +78052 -1.000000 +78053 -1.000000 +78055 -1.000000 +78056 -1.000000 +78058 -1.000000 +78060 -1.000000 +78061 -1.000000 +78062 -1.000000 +78063 -1.000000 +78064 -1.000000 +78065 -1.000000 +78066 -1.000000 +78067 -1.000000 +78068 -1.000000 +78069 -1.000000 +78070 -1.000000 +78071 -1.000000 +78072 -1.000000 +78073 -1.000000 +78074 -1.000000 +78075 -1.000000 +78076 -1.000000 +78077 -1.000000 +78078 -1.000000 +78080 -1.000000 +78083 -1.000000 +78084 -1.000000 +78085 -1.000000 +78088 -1.000000 +78089 -1.000000 +78090 -1.000000 +78091 -1.000000 +78092 -1.000000 +78095 -1.000000 +78097 -1.000000 +78098 -1.000000 +78103 -1.000000 +78104 -1.000000 +78105 -1.000000 +78106 -1.000000 +78107 -1.000000 +78108 -1.000000 +78109 -1.000000 +78111 -1.000000 +78114 -1.000000 +78116 -1.000000 +78117 -1.000000 +78118 -1.000000 +78119 -1.000000 +78120 -1.000000 +78122 -1.000000 +78123 -1.000000 +78124 -1.000000 +78125 -1.000000 +78126 -1.000000 +78127 -1.000000 +78130 -1.000000 +78131 -1.000000 +78132 -1.000000 +78133 -1.000000 +78134 -1.000000 +78135 -1.000000 +78136 -1.000000 +78137 -1.000000 +78139 -1.000000 +78140 -1.000000 +78141 -1.000000 +78142 -1.000000 +78143 -1.000000 +78144 -1.000000 +78145 -1.000000 +78146 -1.000000 +78147 -1.000000 +78148 -1.000000 +78149 -1.000000 +78150 -1.000000 +78151 -1.000000 +78152 -1.000000 +78153 -1.000000 +78155 -1.000000 +78156 -1.000000 +78296 -1.000000 +78297 -1.000000 +78298 -1.000000 +78299 -1.000000 +78306 -1.000000 +78307 -1.000000 +78316 -1.000000 +78320 -1.000000 +78321 -1.000000 +78322 -1.000000 +78323 -1.000000 +78324 -1.000000 +78325 -1.000000 +78326 -1.000000 +78327 -1.000000 +78328 -1.000000 +78329 -1.000000 +78330 -1.000000 +78331 -1.000000 +78332 -1.000000 +78345 -1.000000 +78346 -1.000000 +78347 -1.000000 +78348 -1.000000 +78349 -1.000000 +78350 -1.000000 +78351 -1.000000 +78352 -1.000000 +78353 -1.000000 +78357 -1.000000 +78358 -1.000000 +78367 -1.000000 +78368 -1.000000 +78369 -1.000000 +78370 -1.000000 +78371 -1.000000 +78374 -1.000000 +78376 -1.000000 +78377 -1.000000 +78379 -1.000000 +78380 -1.000000 +78381 -1.000000 +78382 -1.000000 +78383 -1.000000 +78384 -1.000000 +78385 -1.000000 +78386 -1.000000 +78387 -1.000000 +78389 -1.000000 +78390 -1.000000 +78391 -1.000000 +78394 -1.000000 +78395 -1.000000 +78396 -1.000000 +78397 -1.000000 +78399 -1.000000 +78400 -1.000000 +78403 -1.000000 +78410 -1.000000 +78411 -1.000000 +78414 -1.000000 +78415 -1.000000 +78416 -1.000000 +78417 -1.000000 +78418 -1.000000 +78419 -1.000000 +78420 -1.000000 +78421 -1.000000 +78424 -1.000000 +78425 -1.000000 +78426 -1.000000 +78427 -1.000000 +78434 -1.000000 +78437 -1.000000 +78439 -1.000000 +78440 -1.000000 +78441 -1.000000 +78442 -1.000000 +78443 -1.000000 +78445 -1.000000 +78446 -1.000000 +78448 -1.000000 +78449 -1.000000 +78450 -1.000000 +78451 -1.000000 +78452 -1.000000 +78454 -1.000000 +78455 -1.000000 +78456 -1.000000 +78457 -1.000000 +78458 -1.000000 +78459 -1.000000 +78480 -1.000000 +78486 -1.000000 +78488 -1.000000 +78492 -1.000000 +78510 -1.000000 +78511 -1.000000 +78512 -1.000000 +78513 -1.000000 +78517 -1.000000 +78518 -1.000000 +78519 -1.000000 +78520 -1.000000 +78521 -1.000000 +78522 -1.000000 +78523 -1.000000 +78524 -1.000000 +78525 -1.000000 +78527 -1.000000 +78528 -1.000000 +78530 -1.000000 +78531 -1.000000 +78532 -1.000000 +78533 -1.000000 +78534 -1.000000 +78535 -1.000000 +78536 -1.000000 +78539 -1.000000 +78540 -1.000000 +78542 -1.000000 +78543 -1.000000 +78544 -1.000000 +78545 -1.000000 +78546 -1.000000 +78547 -1.000000 +78549 -1.000000 +78550 -1.000000 +78551 -1.000000 +78552 -1.000000 +78554 -1.000000 +78555 -1.000000 +78556 -1.000000 +78557 -1.000000 +78558 -1.000000 +78559 -1.000000 +78560 -1.000000 +78561 -1.000000 +78562 -1.000000 +78563 -1.000000 +78570 -1.000000 +78590 -1.000000 +78591 -1.000000 +78593 -1.000000 +78594 -1.000000 +78595 -1.000000 +78596 -1.000000 +78597 -1.000000 +78599 -1.000000 +78600 -1.000000 +78601 -1.000000 +78602 -1.000000 +78603 -1.000000 +78605 -1.000000 +78606 -1.000000 +78607 -1.000000 +78608 -1.000000 +78611 -1.000000 +78612 -1.000000 +78613 -1.000000 +78617 -1.000000 +78618 -1.000000 +78619 -1.000000 +78620 -1.000000 +78621 -1.000000 +78625 -1.000000 +78626 -1.000000 +78627 -1.000000 +78628 -1.000000 +78629 -1.000000 +78630 -1.000000 +78631 -1.000000 +78632 -1.000000 +78633 -1.000000 +78635 -1.000000 +78636 -1.000000 +78637 -1.000000 +78638 -1.000000 +78639 -1.000000 +78640 -1.000000 +78641 -1.000000 +78642 -1.000000 +78643 -1.000000 +78644 -1.000000 +78645 -1.000000 +78646 -1.000000 +78647 -1.000000 +78648 -1.000000 +78649 -1.000000 +78650 -1.000000 +78651 -1.000000 +78652 -1.000000 +78653 -1.000000 +78654 -1.000000 +78655 -1.000000 +78656 -1.000000 +78658 -1.000000 +78659 -1.000000 +78660 -1.000000 +78662 -1.000000 +78664 -1.000000 +78665 -1.000000 +78666 -1.000000 +78667 -1.000000 +78668 -1.000000 +78669 -1.000000 +78670 -1.000000 +78671 -1.000000 +78672 -1.000000 +78673 -1.000000 +78677 -1.000000 +78678 -1.000000 +78679 -1.000000 +78680 -1.000000 +78681 -1.000000 +78682 -1.000000 +78683 -1.000000 +78684 -1.000000 +78685 -1.000000 +78686 -1.000000 +78687 -1.000000 +78688 -1.000000 +78691 -1.000000 +78692 -1.000000 +78693 -1.000000 +78694 -1.000000 +78696 -1.000000 +78697 -1.000000 +78698 -1.000000 +78699 -1.000000 +78700 -1.000000 +78703 -1.000000 +78709 -1.000000 +78710 -1.000000 +78712 -1.000000 +78713 -1.000000 +78716 -1.000000 +78717 -1.000000 +78718 -1.000000 +78720 -1.000000 +78721 -1.000000 +78724 -1.000000 +78725 -1.000000 +78726 -1.000000 +78727 -1.000000 +78728 -1.000000 +78729 -1.000000 +78730 -1.000000 +78731 -1.000000 +78732 -1.000000 +78733 -1.000000 +78735 -1.000000 +78736 -1.000000 +78737 -1.000000 +78738 -1.000000 +78740 -1.000000 +78741 -1.000000 +78757 -1.000000 +78765 -1.000000 +78766 -1.000000 +78767 -1.000000 +78768 -1.000000 +78769 -1.000000 +78770 -1.000000 +78771 -1.000000 +78772 -1.000000 +78773 -1.000000 +78776 -1.000000 +78778 -1.000000 +78780 -1.000000 +78781 -1.000000 +78785 -1.000000 +78786 -1.000000 +78787 -1.000000 +78794 -1.000000 +78797 -1.000000 +78798 -1.000000 +78799 -1.000000 +78800 -1.000000 +78801 -1.000000 +78802 -1.000000 +78804 -1.000000 +78805 -1.000000 +78806 -1.000000 +78807 -1.000000 +78810 -1.000000 +78811 -1.000000 +78812 -1.000000 +78814 -1.000000 +78815 -1.000000 +78816 -1.000000 +78817 -1.000000 +78819 -1.000000 +78820 -1.000000 +78824 -1.000000 +78825 -1.000000 +78826 -1.000000 +78827 -1.000000 +78828 -1.000000 +78829 -1.000000 +78830 -1.000000 +78831 -1.000000 +78834 -1.000000 +78835 -1.000000 +78836 -1.000000 +78837 -1.000000 +78838 -1.000000 +78839 -1.000000 +78840 -1.000000 +78841 -1.000000 +78842 -1.000000 +78843 -1.000000 +78844 -1.000000 +78845 -1.000000 +78846 -1.000000 +78847 -1.000000 +78848 -1.000000 +78862 -1.000000 +78868 -1.000000 +78869 -1.000000 +78997 -1.000000 +78998 -1.000000 +78999 -1.000000 +79000 -1.000000 +79001 -1.000000 +79002 -1.000000 +79003 -1.000000 +79004 -1.000000 +79005 -1.000000 +79006 -1.000000 +79012 -1.000000 +79013 -1.000000 +79014 -1.000000 +79015 -1.000000 +79016 -1.000000 +79017 -1.000000 +79018 -1.000000 +79020 -1.000000 +79022 -1.000000 +79024 -1.000000 +79028 -1.000000 +79030 -1.000000 +79031 -1.000000 +79033 -1.000000 +79037 -1.000000 +79040 -1.000000 +79042 -1.000000 +79045 -1.000000 +79047 -1.000000 +79048 -1.000000 +79049 -1.000000 +79050 -1.000000 +79052 -1.000000 +79053 -1.000000 +79054 -1.000000 +79055 -1.000000 +79056 -1.000000 +79057 -1.000000 +79064 -1.000000 +79065 -1.000000 +79066 -1.000000 +79067 -1.000000 +79068 -1.000000 +79069 -1.000000 +79070 -1.000000 +79071 -1.000000 +79072 -1.000000 +79075 -1.000000 +79078 -1.000000 +79082 -1.000000 +79086 -1.000000 +79087 -1.000000 +79088 -1.000000 +79089 -1.000000 +79090 -1.000000 +79091 -1.000000 +79093 -1.000000 +79094 -1.000000 +79095 -1.000000 +79096 -1.000000 +79100 -1.000000 +79101 -1.000000 +79104 -1.000000 +79108 -1.000000 +79109 -1.000000 +79110 -1.000000 +79111 -1.000000 +79112 -1.000000 +79113 -1.000000 +79114 -1.000000 +79115 -1.000000 +79116 -1.000000 +79117 -1.000000 +79119 -1.000000 +79120 -1.000000 +79126 -1.000000 +79128 -1.000000 +79129 -1.000000 +79132 -1.000000 +79133 -1.000000 +79134 -1.000000 +79136 -1.000000 +79137 -1.000000 +79138 -1.000000 +79140 -1.000000 +79141 -1.000000 +79142 -1.000000 +79143 -1.000000 +79144 -1.000000 +79145 -1.000000 +79146 -1.000000 +79148 -1.000000 +79149 -1.000000 +79150 -1.000000 +79152 -1.000000 +79153 -1.000000 +79154 -1.000000 +79155 -1.000000 +79159 -1.000000 +79162 -1.000000 +79164 -1.000000 +79165 -1.000000 +79167 -1.000000 +79168 -1.000000 +79169 -1.000000 +79170 -1.000000 +79171 -1.000000 +79172 -1.000000 +79173 -1.000000 +79174 -1.000000 +79176 -1.000000 +79178 -1.000000 +79179 -1.000000 +79181 -1.000000 +79183 -1.000000 +79188 -1.000000 +79191 -1.000000 +79192 -1.000000 +79193 -1.000000 +79194 -1.000000 +79195 -1.000000 +79196 -1.000000 +79197 -1.000000 +79198 -1.000000 +79199 -1.000000 +79201 -1.000000 +79202 -1.000000 +79203 -1.000000 +79204 -1.000000 +79209 -1.000000 +79210 -1.000000 +79211 -1.000000 +79213 -1.000000 +79214 -1.000000 +79215 -1.000000 +79216 -1.000000 +79235 -1.000000 +79236 -1.000000 +79237 -1.000000 +79238 -1.000000 +79239 -1.000000 +79240 -1.000000 +79241 -1.000000 +79242 -1.000000 +79243 -1.000000 +79247 -1.000000 +79248 -1.000000 +79250 -1.000000 +79251 -1.000000 +79252 -1.000000 +79253 -1.000000 +79254 -1.000000 +79255 -1.000000 +79256 -1.000000 +79258 -1.000000 +79279 -1.000000 +79281 -1.000000 +79282 -1.000000 +79283 -1.000000 +79285 -1.000000 +79286 -1.000000 +79287 -1.000000 +79288 -1.000000 +79289 -1.000000 +79291 -1.000000 +79292 -1.000000 +79293 -1.000000 +79295 -1.000000 +79296 -1.000000 +79297 -1.000000 +79298 -1.000000 +79300 -1.000000 +79301 -1.000000 +79302 -1.000000 +79303 -1.000000 +79304 -1.000000 +79305 -1.000000 +79306 -1.000000 +79308 -1.000000 +79311 -1.000000 +79318 -1.000000 +79319 -1.000000 +79329 -1.000000 +79330 -1.000000 +79331 -1.000000 +79332 -1.000000 +79333 -1.000000 +79334 -1.000000 +79335 -1.000000 +79336 -1.000000 +79337 -1.000000 +79338 -1.000000 +79340 -1.000000 +79341 -1.000000 +79342 -1.000000 +79343 -1.000000 +79344 -1.000000 +79345 -1.000000 +79346 -1.000000 +79347 -1.000000 +79348 -1.000000 +79349 -1.000000 +79350 -1.000000 +79352 -1.000000 +79353 -1.000000 +79354 -1.000000 +79355 -1.000000 +79356 -1.000000 +79357 -1.000000 +79358 -1.000000 +79359 -1.000000 +79360 -1.000000 +79361 -1.000000 +79362 -1.000000 +79363 -1.000000 +79364 -1.000000 +79365 -1.000000 +79367 -1.000000 +79368 -1.000000 +79369 -1.000000 +79371 -1.000000 +79372 -1.000000 +79373 -1.000000 +79374 -1.000000 +79375 -1.000000 +79377 -1.000000 +79384 -1.000000 +79385 -1.000000 +79388 -1.000000 +79389 -1.000000 +79390 -1.000000 +79391 -1.000000 +79392 -1.000000 +79393 -1.000000 +79394 -1.000000 +79395 -1.000000 +79397 -1.000000 +79398 -1.000000 +79399 -1.000000 +79402 -1.000000 +79405 -1.000000 +79406 -1.000000 +79407 -1.000000 +79409 -1.000000 +79412 -1.000000 +79413 -1.000000 +79428 -1.000000 +79433 -1.000000 +79434 -1.000000 +79437 -1.000000 +79438 -1.000000 +79440 -1.000000 +79441 -1.000000 +79443 -1.000000 +79444 -1.000000 +79445 -1.000000 +79446 -1.000000 +79447 -1.000000 +79448 -1.000000 +79449 -1.000000 +79451 -1.000000 +79452 -1.000000 +79453 -1.000000 +79455 -1.000000 +79456 -1.000000 +79457 -1.000000 +79458 -1.000000 +79459 -1.000000 +79460 -1.000000 +79461 -1.000000 +79462 -1.000000 +79463 -1.000000 +79464 -1.000000 +79465 -1.000000 +79466 -1.000000 +79467 -1.000000 +79468 -1.000000 +79470 -1.000000 +79471 -1.000000 +79472 -1.000000 +79473 -1.000000 +79474 -1.000000 +79479 -1.000000 +79480 -1.000000 +79481 -1.000000 +79482 -1.000000 +79484 -1.000000 +79485 -1.000000 +79486 -1.000000 +79487 -1.000000 +79488 -1.000000 +79489 -1.000000 +79490 -1.000000 +79491 -1.000000 +79492 -1.000000 +79493 -1.000000 +79494 -1.000000 +79498 -1.000000 +79499 -1.000000 +79501 -1.000000 +79503 -1.000000 +79505 -1.000000 +79506 -1.000000 +79508 -1.000000 +79509 -1.000000 +79510 -1.000000 +79512 -1.000000 +79513 -1.000000 +79514 -1.000000 +79515 -1.000000 +79516 -1.000000 +79517 -1.000000 +79518 -1.000000 +79521 -1.000000 +79523 -1.000000 +79526 -1.000000 +79527 -1.000000 +79528 -1.000000 +79529 -1.000000 +79531 -1.000000 +79543 -1.000000 +79557 -1.000000 +79558 -1.000000 +79560 -1.000000 +79564 -1.000000 +79565 -1.000000 +79566 -1.000000 +79567 -1.000000 +79568 -1.000000 +79569 -1.000000 +79570 -1.000000 +79571 -1.000000 +79572 -1.000000 +79573 -1.000000 +79575 -1.000000 +79578 -1.000000 +79579 -1.000000 +79581 -1.000000 +79582 -1.000000 +79584 -1.000000 +79585 -1.000000 +79587 -1.000000 +79588 -1.000000 +79589 -1.000000 +79590 -1.000000 +79592 -1.000000 +79594 -1.000000 +79595 -1.000000 +79598 -1.000000 +79604 -1.000000 +79609 -1.000000 +79611 -1.000000 +79612 -1.000000 +79613 -1.000000 +79614 -1.000000 +79615 -1.000000 +79619 -1.000000 +79620 -1.000000 +79622 -1.000000 +79623 -1.000000 +79624 -1.000000 +79625 -1.000000 +79626 -1.000000 +79628 -1.000000 +79629 -1.000000 +79630 -1.000000 +79631 -1.000000 +79633 -1.000000 +79634 -1.000000 +79635 -1.000000 +79636 -1.000000 +79637 -1.000000 +79638 -1.000000 +79639 -1.000000 +79640 -1.000000 +79641 -1.000000 +79642 -1.000000 +79643 -1.000000 +79644 -1.000000 +79645 -1.000000 +79646 -1.000000 +79647 -1.000000 +79648 -1.000000 +79649 -1.000000 +79650 -1.000000 +79651 -1.000000 +79652 -1.000000 +79653 -1.000000 +79654 -1.000000 +79655 -1.000000 +79656 -1.000000 +79657 -1.000000 +79658 -1.000000 +79661 -1.000000 +79664 -1.000000 +79665 -1.000000 +79666 -1.000000 +79667 -1.000000 +79668 -1.000000 +79669 -1.000000 +79672 -1.000000 +79673 -1.000000 +79674 -1.000000 +79675 -1.000000 +79676 -1.000000 +79679 -1.000000 +79682 -1.000000 +79684 -1.000000 +79685 -1.000000 +79687 -1.000000 +79688 -1.000000 +79690 -1.000000 +79691 -1.000000 +79692 -1.000000 +79693 -1.000000 +79694 -1.000000 +79696 -1.000000 +79697 -1.000000 +79698 -1.000000 +79699 -1.000000 +79700 -1.000000 +79709 -1.000000 +79714 -1.000000 +79715 -1.000000 +79718 -1.000000 +79719 -1.000000 +79720 -1.000000 +79721 -1.000000 +79722 -1.000000 +79723 -1.000000 +79725 -1.000000 +79726 -1.000000 +79727 -1.000000 +79728 -1.000000 +79729 -1.000000 +79730 -1.000000 +79731 -1.000000 +79732 -1.000000 +79733 -1.000000 +79734 -1.000000 +79735 -1.000000 +79736 -1.000000 +79738 -1.000000 +79739 -1.000000 +79740 -1.000000 +79742 -1.000000 +79743 -1.000000 +79744 -1.000000 +79745 -1.000000 +79747 -1.000000 +79755 -1.000000 +79756 -1.000000 +79757 -1.000000 +79758 -1.000000 +79759 -1.000000 +79764 -1.000000 +79768 -1.000000 +79773 -1.000000 +79774 -1.000000 +79775 -1.000000 +79777 -1.000000 +79784 -1.000000 +79785 -1.000000 +79787 -1.000000 +79790 -1.000000 +79791 -1.000000 +79792 -1.000000 +79798 -1.000000 +79799 -1.000000 +79800 -1.000000 +79801 -1.000000 +79802 -1.000000 +79805 -1.000000 +79806 -1.000000 +79809 -1.000000 +79810 -1.000000 +79811 -1.000000 +79813 -1.000000 +79814 -1.000000 +79815 -1.000000 +79818 -1.000000 +79819 -1.000000 +79822 -1.000000 +79823 -1.000000 +79824 -1.000000 +79825 -1.000000 +79826 -1.000000 +79827 -1.000000 +79828 -1.000000 +79832 -1.000000 +79833 -1.000000 +79834 -1.000000 +79835 -1.000000 +79837 -1.000000 +79838 -1.000000 +79839 -1.000000 +79840 -1.000000 +79841 -1.000000 +79842 -1.000000 +79843 -1.000000 +79844 -1.000000 +79845 -1.000000 +79846 -1.000000 +79847 -1.000000 +79848 -1.000000 +79849 -1.000000 +79850 -1.000000 +79851 -1.000000 +79853 -1.000000 +81852 -1.000000 +81853 -1.000000 +81854 -1.000000 +81855 -1.000000 +81856 -1.000000 +81858 -1.000000 +81859 -1.000000 +81860 -1.000000 +81861 -1.000000 +81862 -1.000000 +81863 -1.000000 +81864 -1.000000 +81865 -1.000000 +81866 -1.000000 +81869 -1.000000 +81871 -1.000000 +81872 -1.000000 +81873 -1.000000 +81875 -1.000000 +81878 -1.000000 +81879 -1.000000 +81880 -1.000000 +81881 -1.000000 +81882 -1.000000 +81883 -1.000000 +81884 -1.000000 +81886 -1.000000 +81889 -1.000000 +81890 -1.000000 +81892 -1.000000 +81893 -1.000000 +81894 -1.000000 +81895 -1.000000 +81896 -1.000000 +81897 -1.000000 +81898 -1.000000 +81899 -1.000000 +81903 -1.000000 +81904 -1.000000 +81905 -1.000000 +81906 -1.000000 +81908 -1.000000 +81911 -1.000000 +81913 -1.000000 +81915 -1.000000 +81917 -1.000000 +81920 -1.000000 +81931 -1.000000 +81935 -1.000000 +81936 -1.000000 +81938 -1.000000 +81939 -1.000000 +81940 -1.000000 +81941 -1.000000 +81942 -1.000000 +81943 -1.000000 +81944 -1.000000 +81945 -1.000000 +81946 -1.000000 +81947 -1.000000 +81948 -1.000000 +81950 -1.000000 +81951 -1.000000 +81952 -1.000000 +81954 -1.000000 +81955 -1.000000 +81956 -1.000000 +81957 -1.000000 +81958 -1.000000 +81959 -1.000000 +81960 -1.000000 +81961 -1.000000 +81962 -1.000000 +81963 -1.000000 +81964 -1.000000 +81965 -1.000000 +81966 -1.000000 +81968 -1.000000 +81969 -1.000000 +81970 -1.000000 +81971 -1.000000 +81972 -1.000000 +81973 -1.000000 +81976 -1.000000 +81977 -1.000000 +81979 -1.000000 +81980 -1.000000 +81981 -1.000000 +81982 -1.000000 +81984 -1.000000 +81986 -1.000000 +81987 -1.000000 +81988 -1.000000 +81989 -1.000000 +81991 -1.000000 +81993 -1.000000 +81994 -1.000000 +81995 -1.000000 +81996 -1.000000 +81997 -1.000000 +81998 -1.000000 +81999 -1.000000 +82000 -1.000000 +82003 -1.000000 +82006 -1.000000 +82009 -1.000000 +82010 -1.000000 +82011 -1.000000 +82014 -1.000000 +82019 -1.000000 +82020 -1.000000 +82021 -1.000000 +82022 -1.000000 +82026 -1.000000 +82028 -1.000000 +82030 -1.000000 +82031 -1.000000 +82033 -1.000000 +82035 -1.000000 +82036 -1.000000 +82038 -1.000000 +82040 -1.000000 +82041 -1.000000 +82042 -1.000000 +82043 -1.000000 +82044 -1.000000 +82045 -1.000000 +82046 -1.000000 +82047 -1.000000 +82048 -1.000000 +82049 -1.000000 +82050 -1.000000 +82051 -1.000000 +82052 -1.000000 +82053 -1.000000 +82056 -1.000000 +82057 -1.000000 +82059 -1.000000 +82060 -1.000000 +82061 -1.000000 +82062 -1.000000 +82063 -1.000000 +82064 -1.000000 +82066 -1.000000 +82067 -1.000000 +82068 -1.000000 +82069 -1.000000 +82070 -1.000000 +82073 -1.000000 +82074 -1.000000 +82077 -1.000000 +82078 -1.000000 +82079 -1.000000 +82080 -1.000000 +82081 -1.000000 +82083 -1.000000 +82085 -1.000000 +82087 -1.000000 +82088 -1.000000 +82089 -1.000000 +82090 -1.000000 +82091 -1.000000 +82092 -1.000000 +82093 -1.000000 +82094 -1.000000 +82095 -1.000000 +82096 -1.000000 +82098 -1.000000 +82103 -1.000000 +82105 -1.000000 +82106 -1.000000 +82107 -1.000000 +82108 -1.000000 +82109 -1.000000 +82111 -1.000000 +82112 -1.000000 +82113 -1.000000 +82114 -1.000000 +82115 -1.000000 +82116 -1.000000 +82117 -1.000000 +82118 -1.000000 +82120 -1.000000 +82123 -1.000000 +82125 -1.000000 +82127 -1.000000 +82130 -1.000000 +82131 -1.000000 +82132 -1.000000 +82133 -1.000000 +82134 -1.000000 +82135 -1.000000 +82137 -1.000000 +82138 -1.000000 +82142 -1.000000 +82143 -1.000000 +82144 -1.000000 +82146 -1.000000 +82148 -1.000000 +82150 -1.000000 +82151 -1.000000 +82152 -1.000000 +82153 -1.000000 +82179 -1.000000 +82181 -1.000000 +82182 -1.000000 +82184 -1.000000 +82190 -1.000000 +82191 -1.000000 +82194 -1.000000 +82195 -1.000000 +82197 -1.000000 +82198 -1.000000 +82200 -1.000000 +82201 -1.000000 +82202 -1.000000 +82203 -1.000000 +82205 -1.000000 +82208 -1.000000 +82209 -1.000000 +82216 -1.000000 +82217 -1.000000 +82220 -1.000000 +82221 -1.000000 +82222 -1.000000 +82223 -1.000000 +82225 -1.000000 +82226 -1.000000 +82227 -1.000000 +82230 -1.000000 +82231 -1.000000 +82232 -1.000000 +82233 -1.000000 +82234 -1.000000 +82235 -1.000000 +82236 -1.000000 +82237 -1.000000 +82238 -1.000000 +82239 -1.000000 +82240 -1.000000 +82241 -1.000000 +82242 -1.000000 +82245 -1.000000 +82293 -1.000000 +82294 -1.000000 +82295 -1.000000 +82297 -1.000000 +82300 -1.000000 +82301 -1.000000 +82302 -1.000000 +82305 -1.000000 +82306 -1.000000 +82308 -1.000000 +82310 -1.000000 +82315 -1.000000 +82321 -1.000000 +82323 -1.000000 +82324 -1.000000 +82325 -1.000000 +82326 -1.000000 +82327 -1.000000 +82328 -1.000000 +82329 -1.000000 +82330 -1.000000 +82332 -1.000000 +82341 -1.000000 +82343 -1.000000 +82346 -1.000000 +82347 -1.000000 +82349 -1.000000 +82350 -1.000000 +82351 -1.000000 +82352 -1.000000 +82353 -1.000000 +82354 -1.000000 +82355 -1.000000 +82356 -1.000000 +82357 -1.000000 +82358 -1.000000 +82359 -1.000000 +82361 -1.000000 +82363 -1.000000 +82364 -1.000000 +82366 -1.000000 +82370 -1.000000 +82371 -1.000000 +82373 -1.000000 +82375 -1.000000 +82377 -1.000000 +82378 -1.000000 +82379 -1.000000 +82383 -1.000000 +82384 -1.000000 +82385 -1.000000 +82387 -1.000000 +82394 -1.000000 +82395 -1.000000 +82396 -1.000000 +82399 -1.000000 +82400 -1.000000 +82401 -1.000000 +82402 -1.000000 +82403 -1.000000 +82404 -1.000000 +82405 -1.000000 +82406 -1.000000 +82407 -1.000000 +82408 -1.000000 +82410 -1.000000 +82411 -1.000000 +82412 -1.000000 +82413 -1.000000 +82414 -1.000000 +82416 -1.000000 +82429 -1.000000 +82430 -1.000000 +82431 -1.000000 +82432 -1.000000 +82435 -1.000000 +82436 -1.000000 +82437 -1.000000 +82438 -1.000000 +82439 -1.000000 +82440 -1.000000 +82441 -1.000000 +82442 -1.000000 +82443 -1.000000 +82444 -1.000000 +82445 -1.000000 +82446 -1.000000 +82459 -1.000000 +82462 -1.000000 +82463 -1.000000 +82467 -1.000000 +82468 -1.000000 +82469 -1.000000 +82471 -1.000000 +82472 -1.000000 +82474 -1.000000 +82481 -1.000000 +82482 -1.000000 +82484 -1.000000 +82486 -1.000000 +82488 -1.000000 +82490 -1.000000 +82491 -1.000000 +82492 -1.000000 +82494 -1.000000 +82503 -1.000000 +82505 -1.000000 +82506 -1.000000 +82507 -1.000000 +82508 -1.000000 +82509 -1.000000 +82510 -1.000000 +82511 -1.000000 +82512 -1.000000 +82513 -1.000000 +82514 -1.000000 +82515 -1.000000 +82516 -1.000000 +82517 -1.000000 +82518 -1.000000 +82519 -1.000000 +82520 -1.000000 +82521 -1.000000 +82522 -1.000000 +82523 -1.000000 +82524 -1.000000 +82525 -1.000000 +82526 -1.000000 +82527 -1.000000 +82528 -1.000000 +82532 -1.000000 +82533 -1.000000 +82535 -1.000000 +82536 -1.000000 +82537 -1.000000 +82539 -1.000000 +82540 -1.000000 +82541 -1.000000 +82544 -1.000000 +82545 -1.000000 +82546 -1.000000 +82550 -1.000000 +82552 -1.000000 +82557 -1.000000 +82558 -1.000000 +82560 -1.000000 +82561 -1.000000 +82563 -1.000000 +82564 -1.000000 +82565 -1.000000 +82566 -1.000000 +82568 -1.000000 +82573 -1.000000 +82575 -1.000000 +82576 -1.000000 +82579 -1.000000 +82581 -1.000000 +82582 -1.000000 +82584 -1.000000 +82585 -1.000000 +82592 -1.000000 +82593 -1.000000 +82594 -1.000000 +82595 -1.000000 +82596 -1.000000 +82597 -1.000000 +82598 -1.000000 +82599 -1.000000 +82600 -1.000000 +82601 -1.000000 +82602 -1.000000 +82603 -1.000000 +82604 -1.000000 +82605 -1.000000 +82606 -1.000000 +82607 -1.000000 +82608 -1.000000 +82610 -1.000000 +82612 -1.000000 +82613 -1.000000 +82614 -1.000000 +82615 -1.000000 +82616 -1.000000 +82617 -1.000000 +82618 -1.000000 +82619 -1.000000 +82620 -1.000000 +82621 -1.000000 +82622 -1.000000 +82623 -1.000000 +82624 -1.000000 +82625 -1.000000 +82626 -1.000000 +82628 -1.000000 +82630 -1.000000 +82631 -1.000000 +82633 -1.000000 +82634 -1.000000 +82635 -1.000000 +82636 -1.000000 +82637 -1.000000 +82638 -1.000000 +82640 -1.000000 +82641 -1.000000 +82643 -1.000000 +82644 -1.000000 +82645 -1.000000 +82646 -1.000000 +82649 -1.000000 +82650 -1.000000 +82651 -1.000000 +82655 -1.000000 +82658 -1.000000 +82659 -1.000000 +82660 -1.000000 +82661 -1.000000 +82662 -1.000000 +82666 -1.000000 +82667 -1.000000 +82668 -1.000000 +82670 -1.000000 +82671 -1.000000 +82672 -1.000000 +82677 -1.000000 +82678 -1.000000 +82679 -1.000000 +82680 -1.000000 +82681 -1.000000 +82684 -1.000000 +82686 -1.000000 +82694 -1.000000 +82695 -1.000000 +82696 -1.000000 +82697 -1.000000 +82700 -1.000000 +82701 -1.000000 +82702 -1.000000 +82703 -1.000000 +82704 -1.000000 +82705 -1.000000 +82706 -1.000000 +82707 -1.000000 +82708 -1.000000 +82711 -1.000000 +82715 -1.000000 +82717 -1.000000 +82719 -1.000000 +82720 -1.000000 +82722 -1.000000 +82725 -1.000000 +82727 -1.000000 +82728 -1.000000 +82751 -1.000000 +82755 -1.000000 +82757 -1.000000 +82762 -1.000000 +82763 -1.000000 +82773 -1.000000 +82774 -1.000000 +82776 -1.000000 +82778 -1.000000 +82783 -1.000000 +82784 -1.000000 +82787 -1.000000 +82788 -1.000000 +82789 -1.000000 +82790 -1.000000 +82792 -1.000000 +82793 -1.000000 +82796 -1.000000 +82798 -1.000000 +82799 -1.000000 +82800 -1.000000 +82801 -1.000000 +82802 -1.000000 +82803 -1.000000 +82804 -1.000000 +82806 -1.000000 +82814 -1.000000 +82818 -1.000000 +82832 -1.000000 +82833 -1.000000 +82835 -1.000000 +82836 -1.000000 +82837 -1.000000 +82838 -1.000000 +82839 -1.000000 +82840 -1.000000 +82841 -1.000000 +82842 -1.000000 +82843 -1.000000 +82844 -1.000000 +82845 -1.000000 +82846 -1.000000 +82848 -1.000000 +82849 -1.000000 +82850 -1.000000 +82854 -1.000000 +82855 -1.000000 +82856 -1.000000 +82864 -1.000000 +82865 -1.000000 +82866 -1.000000 +82868 -1.000000 +82881 -1.000000 +82882 -1.000000 +82883 -1.000000 +82885 -1.000000 +82886 -1.000000 +82887 -1.000000 +82888 -1.000000 +82889 -1.000000 +82894 -1.000000 +82897 -1.000000 +82898 -1.000000 +82900 -1.000000 +82902 -1.000000 +82903 -1.000000 +82904 -1.000000 +82935 -1.000000 +82945 -1.000000 +82946 -1.000000 +82947 -1.000000 +82948 -1.000000 +82949 -1.000000 +82950 -1.000000 +82951 -1.000000 +82952 -1.000000 +82953 -1.000000 +82954 -1.000000 +82957 -1.000000 +82959 -1.000000 +82961 -1.000000 +82975 -1.000000 +82977 -1.000000 +82978 -1.000000 +82979 -1.000000 +82982 -1.000000 +82986 -1.000000 +83010 -1.000000 +83011 -1.000000 +83012 -1.000000 +83013 -1.000000 +83014 -1.000000 +83015 -1.000000 +83017 -1.000000 +83018 -1.000000 +83023 -1.000000 +83026 -1.000000 +83028 -1.000000 +83029 -1.000000 +83031 -1.000000 +83032 -1.000000 +83033 -1.000000 +83034 -1.000000 +83035 -1.000000 +83043 -1.000000 +83044 -1.000000 +83050 -1.000000 +83052 -1.000000 +83055 -1.000000 +83058 -1.000000 +83059 -1.000000 +83060 -1.000000 +83061 -1.000000 +83062 -1.000000 +83063 -1.000000 +83064 -1.000000 +83066 -1.000000 +83067 -1.000000 +83068 -1.000000 +83070 -1.000000 +83073 -1.000000 +83075 -1.000000 +83076 -1.000000 +83077 -1.000000 +83078 -1.000000 +83079 -1.000000 +83080 -1.000000 +83081 -1.000000 +83082 -1.000000 +83085 -1.000000 +83086 -1.000000 +83087 -1.000000 +83088 -1.000000 +83089 -1.000000 +83090 -1.000000 +83091 -1.000000 +83095 -1.000000 +83096 -1.000000 +83098 -1.000000 +83099 -1.000000 +83100 -1.000000 +83101 -1.000000 +83102 -1.000000 +83103 -1.000000 +83104 -1.000000 +83105 -1.000000 +83106 -1.000000 +83107 -1.000000 +83108 -1.000000 +83109 -1.000000 +83110 -1.000000 +83111 -1.000000 +83112 -1.000000 +83113 -1.000000 +83114 -1.000000 +83116 -1.000000 +83151 -1.000000 +83152 -1.000000 +83155 -1.000000 +83157 -1.000000 +83158 -1.000000 +83159 -1.000000 +83160 -1.000000 +83163 -1.000000 +83164 -1.000000 +83176 -1.000000 +83178 -1.000000 +83181 -1.000000 +83182 -1.000000 +83184 -1.000000 +83189 -1.000000 +83190 -1.000000 +83193 -1.000000 +83194 -1.000000 +83195 -1.000000 +83196 -1.000000 +83197 -1.000000 +83198 -1.000000 +83199 -1.000000 +83200 -1.000000 +83201 -1.000000 +83202 -1.000000 +83203 -1.000000 +83204 -1.000000 +83208 -1.000000 +83211 -1.000000 +83213 -1.000000 +83214 -1.000000 +83222 -1.000000 +83224 -1.000000 +83225 -1.000000 +83226 -1.000000 +83228 -1.000000 +83229 -1.000000 +83246 -1.000000 +83247 -1.000000 +83248 -1.000000 +83249 -1.000000 +83252 -1.000000 +83262 -1.000000 +83263 -1.000000 +83267 -1.000000 +83268 -1.000000 +83269 -1.000000 +83270 -1.000000 +83271 -1.000000 +83272 -1.000000 +83275 -1.000000 +83277 -1.000000 +83278 -1.000000 +83279 -1.000000 +83280 -1.000000 +83284 -1.000000 +83286 -1.000000 +83287 -1.000000 +83288 -1.000000 +83291 -1.000000 +83293 -1.000000 +83297 -1.000000 +83300 -1.000000 +83302 -1.000000 +83303 -1.000000 +83304 -1.000000 +83306 -1.000000 +83315 -1.000000 +83318 -1.000000 +83319 -1.000000 +83320 -1.000000 +83321 -1.000000 +83322 -1.000000 +83323 -1.000000 +83327 -1.000000 +83334 -1.000000 +83339 -1.000000 +83344 -1.000000 +83345 -1.000000 +83347 -1.000000 +83353 -1.000000 +83357 -1.000000 +83358 -1.000000 +83361 -1.000000 +83364 -1.000000 +83365 -1.000000 +83368 -1.000000 +83369 -1.000000 +83371 -1.000000 +83374 -1.000000 +83375 -1.000000 +83376 -1.000000 +83378 -1.000000 +83379 -1.000000 +83380 -1.000000 +83382 -1.000000 +83383 -1.000000 +83385 -1.000000 +83388 -1.000000 +83389 -1.000000 +83392 -1.000000 +83393 -1.000000 +83394 -1.000000 +83395 -1.000000 +83396 -1.000000 +83397 -1.000000 +83398 -1.000000 +83399 -1.000000 +83401 -1.000000 +83407 -1.000000 +83410 -1.000000 +83414 -1.000000 +83415 -1.000000 +83416 -1.000000 +83419 -1.000000 +83422 -1.000000 +83428 -1.000000 +83429 -1.000000 +83437 -1.000000 +83439 -1.000000 +83440 -1.000000 +83442 -1.000000 +83445 -1.000000 +83446 -1.000000 +83447 -1.000000 +83448 -1.000000 +83449 -1.000000 +83450 -1.000000 +83451 -1.000000 +83454 -1.000000 +83455 -1.000000 +83456 -1.000000 +83457 -1.000000 +83458 -1.000000 +83459 -1.000000 +83460 -1.000000 +83461 -1.000000 +83462 -1.000000 +83464 -1.000000 +83465 -1.000000 +83466 -1.000000 +83468 -1.000000 +83469 -1.000000 +83470 -1.000000 +83471 -1.000000 +83472 -1.000000 +83473 -1.000000 +83474 -1.000000 +83475 -1.000000 +83476 -1.000000 +83477 -1.000000 +83479 -1.000000 +83481 -1.000000 +83484 -1.000000 +83486 -1.000000 +83487 -1.000000 +83488 -1.000000 +83490 -1.000000 +83491 -1.000000 +83492 -1.000000 +83493 -1.000000 +83494 -1.000000 +83495 -1.000000 +83496 -1.000000 +83498 -1.000000 +83505 -1.000000 +83507 -1.000000 +83509 -1.000000 +83511 -1.000000 +83512 -1.000000 +83517 -1.000000 +83520 -1.000000 +83523 -1.000000 +83524 -1.000000 +83525 -1.000000 +83527 -1.000000 +83529 -1.000000 +83535 -1.000000 +83536 -1.000000 +83537 -1.000000 +83538 -1.000000 +83541 -1.000000 +83546 -1.000000 +83547 -1.000000 +83548 -1.000000 +83549 -1.000000 +83550 -1.000000 +83551 -1.000000 +83553 -1.000000 +83556 -1.000000 +83558 -1.000000 +83559 -1.000000 +83560 -1.000000 +83561 -1.000000 +83562 -1.000000 +83563 -1.000000 +83565 -1.000000 +83574 -1.000000 +83578 -1.000000 +83579 -1.000000 +83580 -1.000000 +83581 -1.000000 +83582 -1.000000 +83584 -1.000000 +83585 -1.000000 +83586 -1.000000 +83587 -1.000000 +83588 -1.000000 +83589 -1.000000 +83591 -1.000000 +83592 -1.000000 +83593 -1.000000 +83596 -1.000000 +83597 -1.000000 +83599 -1.000000 +83600 -1.000000 +83603 -1.000000 +83607 -1.000000 +83608 -1.000000 +83609 -1.000000 +83610 -1.000000 +83612 -1.000000 +83613 -1.000000 +83614 -1.000000 +83616 -1.000000 +83617 -1.000000 +83624 -1.000000 +83625 -1.000000 +83626 -1.000000 +83627 -1.000000 +83628 -1.000000 +83629 -1.000000 +83630 -1.000000 +83631 -1.000000 +83632 -1.000000 +83634 -1.000000 +83637 -1.000000 +83640 -1.000000 +83641 -1.000000 +83642 -1.000000 +83643 -1.000000 +83644 -1.000000 +83645 -1.000000 +83646 -1.000000 +83647 -1.000000 +83648 -1.000000 +83649 -1.000000 +83650 -1.000000 +83652 -1.000000 +83653 -1.000000 +83654 -1.000000 +83655 -1.000000 +83656 -1.000000 +83657 -1.000000 +83660 -1.000000 +83661 -1.000000 +83663 -1.000000 +83664 -1.000000 +83665 -1.000000 +83666 -1.000000 +83667 -1.000000 +83668 -1.000000 +83669 -1.000000 +83670 -1.000000 +83671 -1.000000 +83672 -1.000000 +83673 -1.000000 +83674 -1.000000 +83675 -1.000000 +83676 -1.000000 +83677 -1.000000 +83679 -1.000000 +83680 -1.000000 +83682 -1.000000 +83683 -1.000000 +83684 -1.000000 +83686 -1.000000 +83687 -1.000000 +83688 -1.000000 +83689 -1.000000 +83690 -1.000000 +83691 -1.000000 +83692 -1.000000 +83693 -1.000000 +83695 -1.000000 +83696 -1.000000 +83699 -1.000000 +83700 -1.000000 +83701 -1.000000 +83702 -1.000000 +83703 -1.000000 +83704 -1.000000 +83705 -1.000000 +83706 -1.000000 +83707 -1.000000 +83708 -1.000000 +83709 -1.000000 +83710 -1.000000 +83711 -1.000000 +83712 -1.000000 +83713 -1.000000 +83714 -1.000000 +83716 -1.000000 +83720 -1.000000 +83721 -1.000000 +83722 -1.000000 +83723 -1.000000 +83724 -1.000000 +83725 -1.000000 +83726 -1.000000 +83727 -1.000000 +83728 -1.000000 +83729 -1.000000 +83731 -1.000000 +83732 -1.000000 +83733 -1.000000 +83735 -1.000000 +83736 -1.000000 +83737 -1.000000 +83738 -1.000000 +83739 -1.000000 +83740 -1.000000 +83742 -1.000000 +83743 -1.000000 +83745 -1.000000 +83746 -1.000000 +83747 -1.000000 +83750 -1.000000 +83751 -1.000000 +83752 -1.000000 +83753 -1.000000 +83754 -1.000000 +83755 -1.000000 +83756 -1.000000 +83757 -1.000000 +83758 -1.000000 +83759 -1.000000 +83760 -1.000000 +83761 -1.000000 +83762 -1.000000 +83763 -1.000000 +83764 -1.000000 +83765 -1.000000 +83766 -1.000000 +83769 -1.000000 +83770 -1.000000 +83771 -1.000000 +83772 -1.000000 +83773 -1.000000 +83774 -1.000000 +83775 -1.000000 +83776 -1.000000 +83778 -1.000000 +83779 -1.000000 +83780 -1.000000 +83781 -1.000000 +83783 -1.000000 +83784 -1.000000 +83785 -1.000000 +83786 -1.000000 +83788 -1.000000 +83790 -1.000000 +83791 -1.000000 +83792 -1.000000 +83793 -1.000000 diff --git a/data/shot_lists/jet/long_list_C.txt b/data/shot_lists/jet/long_list_C.txt new file mode 100644 index 00000000..3211810b --- /dev/null +++ b/data/shot_lists/jet/long_list_C.txt @@ -0,0 +1,309 @@ +66027 49.3691 +66092 56.0937 +66122 64.8704 +66143 56.4419 +66154 57.6174 +66225 46.8818 +66238 65.0813 +66260 64.1813 +66299 45.0703 +66304 65.0732 +66313 64.8735 +66369 44.2624 +66380 58.5748 +66382 69.0391 +66383 69.3217 +66395 51.4857 +66409 47.1829 +66428 50.2067 +66503 47.7778 +66509 47.0272 +66569 46.9565 +66965 49.4817 +66973 50.5661 +66976 51.5471 +67665 59.3562 +67681 42.8329 +67702 64.0143 +67710 58.3619 +67749 73.8427 +67780 61.8097 +67906 72.3231 +67915 72.3333 +67918 58.7499 +67942 59.5036 +67971 51.0669 +67982 63.3836 +67989 63.6600 +67992 65.9825 +67994 65.5493 +67997 68.2598 +68001 56.5340 +68003 62.2746 +68006 58.2072 +68008 63.6150 +68027 56.9129 +68029 65.0281 +68031 65.3844 +68032 65.6609 +68092 55.5213 +68095 65.3210 +68098 57.0778 +68116 57.5826 +68117 56.5821 +68148 64.1034 +68193 64.3307 +68222 56.7204 +68227 60.3638 +68229 59.9931 +68231 65.6333 +68237 60.1395 +68252 65.6855 +68314 62.0800 +68450 64.9032 +68459 65.7295 +68461 65.5421 +68475 59.2548 +68480 60.4324 +68496 58.5554 +68572 60.8891 +68644 51.7632 +68647 54.9724 +68651 49.4060 +68773 44.4672 +68782 47.4266 +68827 46.9842 +68835 44.3341 +68844 44.9219 +68912 55.0226 +68915 54.9960 +68918 49.5206 +68921 44.2296 +68925 45.3345 +68930 51.7038 +68949 50.4310 +68985 43.6572 +68986 51.8011 +68994 43.5241 +69030 43.4760 +69081 49.4428 +69083 45.0007 +69085 45.3325 +69087 49.4357 +69096 50.7750 +69131 70.5382 +69257 46.0083 +69281 50.2333 +69303 43.7770 +69311 43.6654 +69315 43.6255 +69336 68.5496 +69349 55.1465 +69355 58.0915 +69373 68.3469 +69381 45.1318 +69455 44.5409 +69538 61.1092 +69731 52.4380 +69740 57.5519 +69814 46.5275 +69816 46.0298 +69913 51.5912 +69974 48.0748 +69988 61.1000 +70057 55.4988 +70071 44.9444 +70073 52.9183 +70078 46.2111 +70102 62.6043 +70106 62.3954 +70117 58.8954 +70118 60.8778 +70119 62.3411 +70120 64.3891 +70121 59.0981 +70125 58.3567 +70130 57.1126 +70131 58.9507 +70171 64.5550 +70182 63.3590 +70261 50.3153 +70270 50.7638 +70276 48.1679 +70301 52.0458 +70341 48.6656 +70417 50.2723 +70427 61.4482 +70433 60.1354 +70440 65.0813 +70453 62.2551 +70509 65.5954 +70511 66.3757 +70568 59.5640 +70570 59.7996 +70572 59.2108 +70574 64.2099 +70576 64.0942 +70606 64.4168 +70610 44.9997 +70634 66.6122 +70643 60.0074 +70675 61.7492 +70686 67.9598 +70702 72.5135 +70711 65.2616 +70712 56.8084 +70717 63.9017 +72163 62.2250 +72172 68.0828 +72195 47.7182 +72283 69.0910 +72302 43.9048 +72422 58.8736 +72460 53.7274 +72465 58.8642 +72468 51.0260 +72497 60.6820 +72500 58.2056 +72537 43.3302 +72549 44.3212 +72563 57.7750 +72567 56.0754 +72643 61.8576 +72670 43.8160 +72723 55.7066 +72734 54.1164 +72738 45.9754 +72782 43.8896 +72786 43.7048 +72799 59.2434 +72852 62.0578 +72897 43.8898 +72922 60.0350 +73062 57.4352 +73460 56.8774 +73462 54.3014 +73492 43.8080 +73495 44.0318 +73497 44.6042 +73534 63.1956 +73560 60.8172 +73565 61.1874 +73685 57.6200 +73691 57.5208 +73703 49.8676 +73710 46.2660 +73744 43.1614 +73765 57.4288 +73766 57.5588 +73851 66.2718 +73879 63.1218 +73885 63.5230 +73911 65.8964 +73968 59.0428 +73972 55.2618 +73979 55.9506 +74032 51.9594 +74058 50.8188 +74077 56.9678 +74079 51.6174 +74098 59.3066 +74164 69.1886 +74165 61.5148 +74170 58.5466 +74177 49.0546 +74208 42.6268 +74214 50.1358 +74301 68.6540 +74330 56.0524 +74334 59.1014 +74336 58.0252 +74338 58.6874 +74339 62.2724 +74341 58.0152 +74344 57.4776 +74369 68.5500 +74383 43.3518 +74391 68.7452 +74415 64.6918 +74417 64.6556 +74420 56.5584 +74425 57.0024 +74429 63.5930 +74494 53.7784 +74497 48.5872 +74519 64.6726 +74530 47.8710 +74543 45.6362 +74544 45.3310 +74562 51.3436 +74570 51.2818 +74576 51.8704 +74615 63.0366 +74642 44.2138 +74693 61.4150 +74698 50.2464 +74704 58.9882 +74721 46.6476 +74738 43.6228 +74746 45.1730 +74797 63.4114 +74937 59.7758 +74942 56.5022 +75003 49.4882 +75067 57.9692 +75076 43.9268 +75162 69.8104 +75179 62.0226 +75210 57.3972 +75218 45.6426 +75307 65.7254 +75384 43.0670 +75415 63.6238 +75417 59.7764 +75419 57.2290 +75453 43.3108 +75478 60.6148 +75485 57.7544 +75495 65.4260 +75543 58.7372 +75546 63.8958 +75608 65.0854 +75652 65.7280 +75657 65.8486 +75671 43.8448 +75679 60.1546 +75766 49.6394 +75787 44.0254 +75835 55.0328 +75837 55.1452 +75844 59.6866 +75845 57.1188 +75846 58.9678 +75880 50.9510 +75949 43.8866 +75971 53.6172 +76030 55.9904 +76064 44.1954 +76193 58.5658 +76294 63.8440 +76425 64.4100 +76431 70.4102 +76497 44.6260 +76499 44.7628 +76539 64.6870 +76589 42.9636 +76655 70.0462 +76672 56.3124 +76694 68.5988 +76705 66.8168 +76783 44.1112 +76794 44.7524 +76818 63.6860 +76844 42.9974 +76848 43.1078 +76850 43.0380 +76872 62.6530 +76911 44.6856 +76920 61.7478 +76936 51.3786 diff --git a/data/shot_lists/jet/mixed_list.txt b/data/shot_lists/jet/mixed_list.txt new file mode 100644 index 00000000..a79d6441 --- /dev/null +++ b/data/shot_lists/jet/mixed_list.txt @@ -0,0 +1,608 @@ +66027 49.3691 +66092 56.0937 +66122 64.8704 +66143 56.4419 +66154 57.6174 +66225 46.8818 +66238 65.0813 +66260 64.1813 +66299 45.0703 +66304 65.0732 +66313 64.8735 +66369 44.2624 +66380 58.5748 +66382 69.0391 +66383 69.3217 +66395 51.4857 +66409 47.1829 +66428 50.2067 +66503 47.7778 +66509 47.0272 +66569 46.9565 +66965 49.4817 +66973 50.5661 +66976 51.5471 +67665 59.3562 +67681 42.8329 +67702 64.0143 +67710 58.3619 +67749 73.8427 +67780 61.8097 +67906 72.3231 +67915 72.3333 +67918 58.7499 +67942 59.5036 +67971 51.0669 +67982 63.3836 +67989 63.6600 +67992 65.9825 +67994 65.5493 +67997 68.2598 +68001 56.5340 +68003 62.2746 +68006 58.2072 +68008 63.6150 +68027 56.9129 +68029 65.0281 +68031 65.3844 +68032 65.6609 +68092 55.5213 +68095 65.3210 +68098 57.0778 +68116 57.5826 +68117 56.5821 +68148 64.1034 +68193 64.3307 +68222 56.7204 +68227 60.3638 +68229 59.9931 +68231 65.6333 +68237 60.1395 +68252 65.6855 +68314 62.0800 +68450 64.9032 +68459 65.7295 +68461 65.5421 +68475 59.2548 +68480 60.4324 +68496 58.5554 +68572 60.8891 +68644 51.7632 +68647 54.9724 +68651 49.4060 +68773 44.4672 +68782 47.4266 +68827 46.9842 +68835 44.3341 +68844 44.9219 +68912 55.0226 +68915 54.9960 +68918 49.5206 +68921 44.2296 +68925 45.3345 +68930 51.7038 +68949 50.4310 +68985 43.6572 +68986 51.8011 +68994 43.5241 +69030 43.4760 +69081 49.4428 +69083 45.0007 +69085 45.3325 +69087 49.4357 +69096 50.7750 +69131 70.5382 +69257 46.0083 +69281 50.2333 +69303 43.7770 +69311 43.6654 +69315 43.6255 +69336 68.5496 +69349 55.1465 +69355 58.0915 +69373 68.3469 +69381 45.1318 +69455 44.5409 +69538 61.1092 +69731 52.4380 +69740 57.5519 +69814 46.5275 +69816 46.0298 +69913 51.5912 +69974 48.0748 +69988 61.1000 +70057 55.4988 +70071 44.9444 +70073 52.9183 +70078 46.2111 +70102 62.6043 +70106 62.3954 +70117 58.8954 +70118 60.8778 +70119 62.3411 +70120 64.3891 +70121 59.0981 +70125 58.3567 +70130 57.1126 +70131 58.9507 +70171 64.5550 +70182 63.3590 +70261 50.3153 +70270 50.7638 +70276 48.1679 +70301 52.0458 +70341 48.6656 +70417 50.2723 +70427 61.4482 +70433 60.1354 +70440 65.0813 +70453 62.2551 +70509 65.5954 +70511 66.3757 +70568 59.5640 +70570 59.7996 +70572 59.2108 +70574 64.2099 +70576 64.0942 +70606 64.4168 +70610 44.9997 +70634 66.6122 +70643 60.0074 +70675 61.7492 +70686 67.9598 +70702 72.5135 +70711 65.2616 +70712 56.8084 +70717 63.9017 +72163 62.2250 +72172 68.0828 +72195 47.7182 +72283 69.0910 +72302 43.9048 +72422 58.8736 +72460 53.7274 +72465 58.8642 +72468 51.0260 +72497 60.6820 +72500 58.2056 +72537 43.3302 +72549 44.3212 +72563 57.7750 +72567 56.0754 +72643 61.8576 +72670 43.8160 +72723 55.7066 +72734 54.1164 +72738 45.9754 +72782 43.8896 +72786 43.7048 +72799 59.2434 +72852 62.0578 +72897 43.8898 +72922 60.0350 +73062 57.4352 +73460 56.8774 +73462 54.3014 +73492 43.8080 +73495 44.0318 +73497 44.6042 +73534 63.1956 +73560 60.8172 +73565 61.1874 +73685 57.6200 +73691 57.5208 +73703 49.8676 +73710 46.2660 +73744 43.1614 +73765 57.4288 +73766 57.5588 +73851 66.2718 +73879 63.1218 +73885 63.5230 +73911 65.8964 +73968 59.0428 +73972 55.2618 +73979 55.9506 +74032 51.9594 +74058 50.8188 +74077 56.9678 +74079 51.6174 +74098 59.3066 +74164 69.1886 +74165 61.5148 +74170 58.5466 +74177 49.0546 +74208 42.6268 +74214 50.1358 +74301 68.6540 +74330 56.0524 +74334 59.1014 +74336 58.0252 +74338 58.6874 +74339 62.2724 +74341 58.0152 +74344 57.4776 +74369 68.5500 +74383 43.3518 +74391 68.7452 +74415 64.6918 +74417 64.6556 +74420 56.5584 +74425 57.0024 +74429 63.5930 +74494 53.7784 +74497 48.5872 +74519 64.6726 +74530 47.8710 +74543 45.6362 +74544 45.3310 +74562 51.3436 +74570 51.2818 +74576 51.8704 +74615 63.0366 +74642 44.2138 +74693 61.4150 +74698 50.2464 +74704 58.9882 +74721 46.6476 +74738 43.6228 +74746 45.1730 +74797 63.4114 +74937 59.7758 +74942 56.5022 +75003 49.4882 +75067 57.9692 +75076 43.9268 +75162 69.8104 +75179 62.0226 +75210 57.3972 +75218 45.6426 +75307 65.7254 +75384 43.0670 +75415 63.6238 +75417 59.7764 +75419 57.2290 +75453 43.3108 +75478 60.6148 +75485 57.7544 +75495 65.4260 +75543 58.7372 +75546 63.8958 +75608 65.0854 +75652 65.7280 +75657 65.8486 +75671 43.8448 +75679 60.1546 +75766 49.6394 +75787 44.0254 +75835 55.0328 +75837 55.1452 +75844 59.6866 +75845 57.1188 +75846 58.9678 +75880 50.9510 +75949 43.8866 +75971 53.6172 +76030 55.9904 +76064 44.1954 +76193 58.5658 +76294 63.8440 +76425 64.4100 +76431 70.4102 +76497 44.6260 +76499 44.7628 +76539 64.6870 +76589 42.9636 +76655 70.0462 +76672 56.3124 +76694 68.5988 +76705 66.8168 +76783 44.1112 +76794 44.7524 +76818 63.6860 +76844 42.9974 +76848 43.1078 +76850 43.0380 +76872 62.6530 +76911 44.6856 +76920 61.7478 +76936 51.3786 +81852 -1.000000 +81853 -1.000000 +81854 -1.000000 +81855 -1.000000 +81856 -1.000000 +81858 -1.000000 +81859 -1.000000 +81860 -1.000000 +81861 -1.000000 +81862 -1.000000 +81863 -1.000000 +81864 -1.000000 +81865 -1.000000 +81866 -1.000000 +81869 -1.000000 +81871 -1.000000 +81872 -1.000000 +81873 -1.000000 +81875 -1.000000 +81878 -1.000000 +81879 -1.000000 +81880 -1.000000 +81881 -1.000000 +81882 -1.000000 +81883 -1.000000 +81884 -1.000000 +81886 -1.000000 +81889 -1.000000 +81890 -1.000000 +81892 -1.000000 +81893 -1.000000 +81894 -1.000000 +81895 -1.000000 +81896 -1.000000 +81897 -1.000000 +81898 -1.000000 +81899 -1.000000 +81903 -1.000000 +81904 -1.000000 +81905 -1.000000 +81906 -1.000000 +81908 -1.000000 +81911 -1.000000 +81913 -1.000000 +81915 -1.000000 +81917 -1.000000 +81920 -1.000000 +81931 -1.000000 +81935 -1.000000 +81936 -1.000000 +81938 -1.000000 +81939 -1.000000 +81940 -1.000000 +81941 -1.000000 +81942 -1.000000 +81943 -1.000000 +81944 -1.000000 +81945 -1.000000 +81946 -1.000000 +81947 -1.000000 +81948 -1.000000 +81950 -1.000000 +81951 -1.000000 +81952 -1.000000 +81954 -1.000000 +81955 -1.000000 +81956 -1.000000 +81957 -1.000000 +81958 -1.000000 +81959 -1.000000 +81960 -1.000000 +81961 -1.000000 +81962 -1.000000 +81963 -1.000000 +81964 -1.000000 +81965 -1.000000 +81966 -1.000000 +81968 -1.000000 +81969 -1.000000 +81970 -1.000000 +81971 -1.000000 +81972 -1.000000 +81973 -1.000000 +81976 -1.000000 +81977 -1.000000 +81979 -1.000000 +81980 -1.000000 +81981 -1.000000 +81982 -1.000000 +81984 -1.000000 +81986 -1.000000 +81987 -1.000000 +81988 -1.000000 +81989 -1.000000 +81991 -1.000000 +81993 -1.000000 +81994 -1.000000 +81995 -1.000000 +81996 -1.000000 +81997 -1.000000 +81998 -1.000000 +81999 -1.000000 +82000 -1.000000 +82003 -1.000000 +82006 -1.000000 +82009 -1.000000 +82010 -1.000000 +82011 -1.000000 +82014 -1.000000 +82019 -1.000000 +82020 -1.000000 +82021 -1.000000 +82022 -1.000000 +82026 -1.000000 +82028 -1.000000 +82030 -1.000000 +82031 -1.000000 +82033 -1.000000 +82035 -1.000000 +82036 -1.000000 +82038 -1.000000 +82040 -1.000000 +82041 -1.000000 +82042 -1.000000 +82043 -1.000000 +82044 -1.000000 +82045 -1.000000 +82046 -1.000000 +82047 -1.000000 +82048 -1.000000 +82049 -1.000000 +82050 -1.000000 +82051 -1.000000 +82052 -1.000000 +82053 -1.000000 +82056 -1.000000 +82057 -1.000000 +82059 -1.000000 +82060 -1.000000 +82061 -1.000000 +82062 -1.000000 +82063 -1.000000 +82064 -1.000000 +82066 -1.000000 +82067 -1.000000 +82068 -1.000000 +82069 -1.000000 +82070 -1.000000 +82073 -1.000000 +82074 -1.000000 +82077 -1.000000 +82078 -1.000000 +82079 -1.000000 +82080 -1.000000 +82081 -1.000000 +82083 -1.000000 +82085 -1.000000 +82087 -1.000000 +82088 -1.000000 +82089 -1.000000 +82090 -1.000000 +82091 -1.000000 +82092 -1.000000 +82093 -1.000000 +82094 -1.000000 +82095 -1.000000 +82096 -1.000000 +82098 -1.000000 +82103 -1.000000 +82105 -1.000000 +82106 -1.000000 +82107 -1.000000 +82108 -1.000000 +82109 -1.000000 +82111 -1.000000 +82112 -1.000000 +82113 -1.000000 +82114 -1.000000 +82115 -1.000000 +82116 -1.000000 +82117 -1.000000 +82118 -1.000000 +82120 -1.000000 +82123 -1.000000 +82125 -1.000000 +82127 -1.000000 +82130 -1.000000 +82131 -1.000000 +82132 -1.000000 +82133 -1.000000 +82134 -1.000000 +82135 -1.000000 +82137 -1.000000 +82138 -1.000000 +82142 -1.000000 +82143 -1.000000 +82144 -1.000000 +82146 -1.000000 +82148 -1.000000 +82150 -1.000000 +82151 -1.000000 +82152 -1.000000 +82153 -1.000000 +82179 -1.000000 +82181 -1.000000 +82182 -1.000000 +82184 -1.000000 +82190 -1.000000 +82191 -1.000000 +82194 -1.000000 +82195 -1.000000 +82197 -1.000000 +82198 -1.000000 +82200 -1.000000 +82201 -1.000000 +82202 -1.000000 +82203 -1.000000 +82205 -1.000000 +82208 -1.000000 +82209 -1.000000 +82216 -1.000000 +82217 -1.000000 +82220 -1.000000 +82221 -1.000000 +82222 -1.000000 +82223 -1.000000 +82225 -1.000000 +82226 -1.000000 +82227 -1.000000 +82230 -1.000000 +82231 -1.000000 +82232 -1.000000 +82233 -1.000000 +82234 -1.000000 +82235 -1.000000 +82236 -1.000000 +82237 -1.000000 +82238 -1.000000 +82239 -1.000000 +82240 -1.000000 +82241 -1.000000 +82242 -1.000000 +82245 -1.000000 +82293 -1.000000 +82294 -1.000000 +82295 -1.000000 +82297 -1.000000 +82300 -1.000000 +82301 -1.000000 +82302 -1.000000 +82305 -1.000000 +82306 -1.000000 +82308 -1.000000 +82310 -1.000000 +82315 -1.000000 +82321 -1.000000 +82323 -1.000000 +82324 -1.000000 +82325 -1.000000 +82326 -1.000000 +82327 -1.000000 +82328 -1.000000 +82329 -1.000000 +82330 -1.000000 +82332 -1.000000 +82341 -1.000000 +82343 -1.000000 +82346 -1.000000 +82347 -1.000000 +82349 -1.000000 +82350 -1.000000 +82351 -1.000000 +82352 -1.000000 +82353 -1.000000 +82354 -1.000000 +82355 -1.000000 +82356 -1.000000 +82357 -1.000000 +82358 -1.000000 +82359 -1.000000 +82361 -1.000000 +82363 -1.000000 +82364 -1.000000 +82366 -1.000000 +82370 -1.000000 +82371 -1.000000 +82373 -1.000000 +82375 -1.000000 +82377 -1.000000 +82378 -1.000000 +82379 -1.000000 +82383 -1.000000 +82384 -1.000000 +82385 -1.000000 +82387 -1.000000 +82394 -1.000000 +82395 -1.000000 +82396 -1.000000 +82399 -1.000000 diff --git a/data/shot_lists/jet/mixed_list1.txt b/data/shot_lists/jet/mixed_list1.txt new file mode 100644 index 00000000..a20db7ae --- /dev/null +++ b/data/shot_lists/jet/mixed_list1.txt @@ -0,0 +1,618 @@ +66027 49.369087 +66092 56.093697 +66122 64.870400 +66143 56.441856 +66154 57.617409 +66225 46.881790 +66238 65.081345 +66260 64.181252 +66299 45.070335 +66304 65.073151 +66313 64.873474 +66369 44.262402 +66380 58.574848 +66382 69.039101 +66383 69.321732 +66395 51.485695 +66409 47.182850 +66428 50.206718 +66503 47.777794 +66509 47.027199 +66569 46.956543 +66965 49.481728 +66973 50.566143 +66976 51.547134 +67665 59.356159 +67681 42.832897 +67702 64.014336 +67710 58.361855 +67749 73.842690 +67780 61.809666 +67906 72.323074 +67915 72.333313 +67918 58.749950 +67942 59.503616 +67971 51.066879 +67982 63.383553 +67989 63.660030 +67992 65.982468 +67994 65.549309 +67997 68.259842 +68001 56.534016 +68003 62.274559 +68006 58.207233 +68008 63.614975 +68027 56.912895 +68029 65.028099 +68031 65.384445 +68032 65.660927 +68092 55.521278 +68095 65.320961 +68098 57.077759 +68116 57.582592 +68117 56.582146 +68148 64.103424 +68193 64.330750 +68222 56.720383 +68227 60.363777 +68229 59.993088 +68231 65.633278 +68237 60.139519 +68252 65.685501 +68314 62.080002 +68450 64.903168 +68459 65.729538 +68461 65.542145 +68475 59.254784 +68480 60.432385 +68496 58.555393 +68572 60.889088 +68644 51.763199 +68647 54.972416 +68651 49.405953 +68773 44.467201 +68782 47.426559 +68827 46.984192 +68835 44.334080 +68844 44.921856 +68912 55.022591 +68915 54.995968 +68918 49.520641 +68921 44.229633 +68925 45.334530 +68930 51.703808 +68949 50.430977 +68985 43.657215 +68986 51.801086 +68994 43.524097 +69030 43.475967 +69081 49.442818 +69083 45.000706 +69085 45.332481 +69087 49.435650 +69096 50.775040 +69131 70.538239 +69257 46.008320 +69281 50.233345 +69303 43.777023 +69311 43.665409 +69315 43.625473 +69336 68.549629 +69349 55.146496 +69355 58.091518 +69373 68.346878 +69381 45.131775 +69455 44.540928 +69538 61.109249 +69731 52.438015 +69740 57.551872 +69814 46.527489 +69816 46.029823 +69913 51.591167 +69974 48.074753 +69988 61.100033 +70057 55.498753 +70071 44.944386 +70073 52.918270 +70078 46.211071 +70102 62.604286 +70106 62.395393 +70117 58.895359 +70118 60.877823 +70119 62.341122 +70120 64.389122 +70121 59.098110 +70125 58.356735 +70130 57.112576 +70131 58.950657 +70171 64.555008 +70182 63.358975 +70261 50.315266 +70270 50.763775 +70276 48.167934 +70301 52.045822 +70341 48.665600 +70417 50.272255 +70427 61.448193 +70433 60.135426 +70440 65.081345 +70453 62.255104 +70509 65.595390 +70511 66.375679 +70568 59.564034 +70570 59.799553 +70572 59.210751 +70574 64.209923 +70576 64.094208 +70606 64.416771 +70610 44.999680 +70634 66.612221 +70643 60.007423 +70675 61.749249 +70686 67.959808 +70702 72.513535 +70711 65.261566 +70712 56.808449 +70717 63.901695 +72163 62.224999 +72172 68.082802 +72195 47.718201 +72283 69.091003 +72302 43.904800 +72422 58.873600 +72460 53.727402 +72465 58.864201 +72468 51.026001 +72497 60.681999 +72500 58.205601 +72537 43.330200 +72549 44.321201 +72563 57.775002 +72567 56.075401 +72643 61.857601 +72670 43.816002 +72723 55.706600 +72734 54.116402 +72738 45.975399 +72782 43.889599 +72786 43.704800 +72799 59.243401 +72852 62.057800 +72897 43.889801 +72922 60.035000 +73062 57.435200 +73460 56.877399 +73462 54.301399 +73492 43.807999 +73495 44.031799 +73497 44.604199 +73534 63.195599 +73560 60.817200 +73565 61.187401 +73685 57.619999 +73691 57.520802 +73703 49.867600 +73710 46.265999 +73744 43.161400 +73765 57.428799 +73766 57.558800 +73851 66.271797 +73879 63.121800 +73885 63.522999 +73911 65.896401 +73968 59.042801 +73972 55.261799 +73979 55.950600 +74032 51.959400 +74058 50.818802 +74077 56.967800 +74079 51.617401 +74098 59.306599 +74164 69.188599 +74165 61.514801 +74170 58.546600 +74177 49.054600 +74208 42.626801 +74214 50.135799 +74301 68.653999 +74330 56.052399 +74334 59.101399 +74336 58.025200 +74338 58.687401 +74339 62.272400 +74341 58.015202 +74344 57.477600 +74369 68.550003 +74383 43.351799 +74391 68.745201 +74415 64.691803 +74417 64.655602 +74420 56.558399 +74425 57.002399 +74429 63.592999 +74494 53.778400 +74497 48.587200 +74519 64.672600 +74530 47.870998 +74543 45.636200 +74544 45.331001 +74562 51.343601 +74570 51.281799 +74576 51.870400 +74615 63.036598 +74642 44.213799 +74693 61.415001 +74698 50.246399 +74704 58.988201 +74721 46.647598 +74738 43.622799 +74746 45.173000 +74797 63.411400 +74937 59.775799 +74942 56.502201 +75003 49.488201 +75067 57.969200 +75076 43.926800 +75162 69.810402 +75179 62.022598 +75210 57.397202 +75218 45.642601 +75307 65.725403 +75384 43.067001 +75415 63.623798 +75417 59.776402 +75419 57.229000 +75453 43.310799 +75478 60.614800 +75485 57.754398 +75495 65.426003 +75543 58.737202 +75546 63.895802 +75608 65.085403 +75652 65.727997 +75657 65.848602 +75671 43.844799 +75679 60.154598 +75766 49.639401 +75787 44.025398 +75835 55.032799 +75837 55.145199 +75844 59.686600 +75845 57.118801 +75846 58.967800 +75880 50.951000 +75949 43.886601 +75971 53.617199 +76030 55.990398 +76064 44.195400 +76193 58.565800 +76294 63.844002 +76425 64.410004 +76431 70.410202 +76497 44.626000 +76499 44.762798 +76539 64.686997 +76589 42.963600 +76655 70.046204 +76672 56.312401 +76694 68.598801 +76705 66.816803 +76783 44.111198 +76794 44.752399 +76818 63.686001 +76844 42.997398 +76848 43.107800 +76850 43.037998 +76872 62.653000 +76911 44.685600 +76920 61.747799 +76936 51.378601 +73856 -1.000000 +73857 -1.000000 +73859 -1.000000 +73860 -1.000000 +73862 -1.000000 +73863 -1.000000 +73864 -1.000000 +73865 -1.000000 +73866 -1.000000 +73867 -1.000000 +73868 -1.000000 +73869 -1.000000 +73874 -1.000000 +73876 -1.000000 +73877 -1.000000 +73878 -1.000000 +73882 -1.000000 +73883 -1.000000 +73884 -1.000000 +73889 -1.000000 +73890 -1.000000 +73891 -1.000000 +73892 -1.000000 +73893 -1.000000 +73894 -1.000000 +73896 -1.000000 +73897 -1.000000 +73898 -1.000000 +73899 -1.000000 +73900 -1.000000 +73901 -1.000000 +73903 -1.000000 +73904 -1.000000 +73905 -1.000000 +73906 -1.000000 +73907 -1.000000 +73908 -1.000000 +73909 -1.000000 +73910 -1.000000 +73915 -1.000000 +73916 -1.000000 +73917 -1.000000 +73918 -1.000000 +73919 -1.000000 +73920 -1.000000 +73921 -1.000000 +73922 -1.000000 +73923 -1.000000 +73924 -1.000000 +73925 -1.000000 +73926 -1.000000 +73927 -1.000000 +73928 -1.000000 +73929 -1.000000 +73930 -1.000000 +73931 -1.000000 +73935 -1.000000 +73936 -1.000000 +73937 -1.000000 +73938 -1.000000 +73939 -1.000000 +73940 -1.000000 +73941 -1.000000 +73943 -1.000000 +73944 -1.000000 +73945 -1.000000 +73946 -1.000000 +73948 -1.000000 +73949 -1.000000 +73950 -1.000000 +73951 -1.000000 +73952 -1.000000 +73953 -1.000000 +73954 -1.000000 +73955 -1.000000 +73957 -1.000000 +73958 -1.000000 +73959 -1.000000 +73960 -1.000000 +73962 -1.000000 +73964 -1.000000 +73965 -1.000000 +73966 -1.000000 +73970 -1.000000 +73974 -1.000000 +73975 -1.000000 +73976 -1.000000 +73978 -1.000000 +73981 -1.000000 +73982 -1.000000 +73984 -1.000000 +73985 -1.000000 +73986 -1.000000 +73987 -1.000000 +73988 -1.000000 +73989 -1.000000 +73991 -1.000000 +73992 -1.000000 +73993 -1.000000 +73994 -1.000000 +73995 -1.000000 +73996 -1.000000 +73997 -1.000000 +73998 -1.000000 +73999 -1.000000 +74002 -1.000000 +74003 -1.000000 +74004 -1.000000 +74005 -1.000000 +74006 -1.000000 +74007 -1.000000 +74008 -1.000000 +74009 -1.000000 +74010 -1.000000 +74011 -1.000000 +74012 -1.000000 +74013 -1.000000 +74014 -1.000000 +74015 -1.000000 +74017 -1.000000 +74018 -1.000000 +74019 -1.000000 +74020 -1.000000 +74021 -1.000000 +74022 -1.000000 +74023 -1.000000 +74024 -1.000000 +74025 -1.000000 +74026 -1.000000 +74027 -1.000000 +74028 -1.000000 +74029 -1.000000 +74030 -1.000000 +74031 -1.000000 +74034 -1.000000 +74035 -1.000000 +74036 -1.000000 +74037 -1.000000 +74038 -1.000000 +74040 -1.000000 +74041 -1.000000 +74042 -1.000000 +74043 -1.000000 +74044 -1.000000 +74045 -1.000000 +74046 -1.000000 +74047 -1.000000 +74048 -1.000000 +74049 -1.000000 +74050 -1.000000 +74051 -1.000000 +74052 -1.000000 +74053 -1.000000 +74054 -1.000000 +74055 -1.000000 +74056 -1.000000 +74057 -1.000000 +74060 -1.000000 +74061 -1.000000 +74062 -1.000000 +74063 -1.000000 +74064 -1.000000 +74065 -1.000000 +74066 -1.000000 +74067 -1.000000 +74068 -1.000000 +74069 -1.000000 +74070 -1.000000 +74071 -1.000000 +74072 -1.000000 +74073 -1.000000 +74075 -1.000000 +74081 -1.000000 +74082 -1.000000 +74083 -1.000000 +74084 -1.000000 +74085 -1.000000 +74086 -1.000000 +74087 -1.000000 +74088 -1.000000 +74089 -1.000000 +74090 -1.000000 +74091 -1.000000 +74092 -1.000000 +74093 -1.000000 +74094 -1.000000 +74095 -1.000000 +74096 -1.000000 +74097 -1.000000 +74101 -1.000000 +74102 -1.000000 +74103 -1.000000 +74104 -1.000000 +74105 -1.000000 +74106 -1.000000 +74107 -1.000000 +74110 -1.000000 +74111 -1.000000 +74112 -1.000000 +74113 -1.000000 +74114 -1.000000 +74115 -1.000000 +74116 -1.000000 +74117 -1.000000 +74119 -1.000000 +74120 -1.000000 +74121 -1.000000 +74122 -1.000000 +74123 -1.000000 +74124 -1.000000 +74125 -1.000000 +74126 -1.000000 +74127 -1.000000 +74128 -1.000000 +74129 -1.000000 +74130 -1.000000 +74131 -1.000000 +74132 -1.000000 +74133 -1.000000 +74134 -1.000000 +74135 -1.000000 +74136 -1.000000 +74137 -1.000000 +74138 -1.000000 +74139 -1.000000 +74140 -1.000000 +74141 -1.000000 +74142 -1.000000 +74143 -1.000000 +74144 -1.000000 +74145 -1.000000 +74146 -1.000000 +74147 -1.000000 +74149 -1.000000 +74150 -1.000000 +74151 -1.000000 +74152 -1.000000 +74154 -1.000000 +74155 -1.000000 +74156 -1.000000 +74157 -1.000000 +74158 -1.000000 +74159 -1.000000 +74160 -1.000000 +74161 -1.000000 +74162 -1.000000 +74163 -1.000000 +74167 -1.000000 +74168 -1.000000 +74169 -1.000000 +74175 -1.000000 +74176 -1.000000 +74179 -1.000000 +74180 -1.000000 +74181 -1.000000 +74182 -1.000000 +74183 -1.000000 +74184 -1.000000 +74185 -1.000000 +74186 -1.000000 +74187 -1.000000 +74188 -1.000000 +74189 -1.000000 +74190 -1.000000 +74191 -1.000000 +74192 -1.000000 +74193 -1.000000 +74194 -1.000000 +74195 -1.000000 +74197 -1.000000 +74198 -1.000000 +74200 -1.000000 +74201 -1.000000 +74206 -1.000000 +74213 -1.000000 +74216 -1.000000 +74217 -1.000000 +74219 -1.000000 +74220 -1.000000 +74223 -1.000000 +74224 -1.000000 +74225 -1.000000 +74226 -1.000000 +74227 -1.000000 +74228 -1.000000 +74230 -1.000000 +74231 -1.000000 +74232 -1.000000 +74233 -1.000000 +74234 -1.000000 +74235 -1.000000 +74237 -1.000000 +74238 -1.000000 +74239 -1.000000 +74241 -1.000000 +74242 -1.000000 +74243 -1.000000 +74244 -1.000000 +74245 -1.000000 +74246 -1.000000 +74247 -1.000000 +74248 -1.000000 +74249 -1.000000 +74250 -1.000000 +74251 -1.000000 +74252 -1.000000 +74253 -1.000000 +74254 -1.000000 +74255 -1.000000 diff --git a/data/shot_lists/jet/mixed_list_test.txt b/data/shot_lists/jet/mixed_list_test.txt new file mode 100644 index 00000000..a42854b2 --- /dev/null +++ b/data/shot_lists/jet/mixed_list_test.txt @@ -0,0 +1,4 @@ +66027 49.369087 +66092 56.093697 +81852 -1.000000 +81853 -1.000000 diff --git a/data/shot_lists/jet/short_list.txt b/data/shot_lists/jet/short_list.txt new file mode 100644 index 00000000..f352eaf7 --- /dev/null +++ b/data/shot_lists/jet/short_list.txt @@ -0,0 +1,30 @@ +66027 49.369087 +66092 56.093697 +66122 64.870400 +66143 56.441856 +66154 57.617409 +66225 46.881790 +66238 65.081345 +66260 64.181252 +66299 45.070335 +66304 65.073151 +66313 64.873474 +66369 44.262402 +66380 58.574848 +66382 69.039101 +66383 69.321732 +66395 51.485695 +66409 47.182850 +66428 50.206718 +66503 47.777794 +66509 47.027199 +66569 46.956543 +66965 49.481728 +66973 50.566143 +66976 51.547134 +67665 59.356159 +67681 42.832897 +67702 64.014336 +67710 58.361855 +67749 73.842690 +67780 61.809666 diff --git a/data/shot_lists/jet/single_clear.txt b/data/shot_lists/jet/single_clear.txt new file mode 100644 index 00000000..96a829b4 --- /dev/null +++ b/data/shot_lists/jet/single_clear.txt @@ -0,0 +1,2 @@ +81867 -1.000000 +46 -1.000000 diff --git a/data/shot_lists/nstx/disrupt_nstx.txt b/data/shot_lists/nstx/disrupt_nstx.txt new file mode 100644 index 00000000..e1c534c3 --- /dev/null +++ b/data/shot_lists/nstx/disrupt_nstx.txt @@ -0,0 +1,37 @@ +134832 0.814 +134834 0.518 +134836 0.695 +135097 0.935 +135098 0.636 +135099 0.789 +135100 0.555 +135102 1.046 +135104 0.953 +135106 0.821 +135108 0.734 +135110 0.906 +135111 0.855 +135112 0.808 +135114 0.829 +135115 0.987 +135116 0.968 +135118 0.710 +135120 0.529 +135121 0.921 +135131 0.848 +140117 0.809 +140119 0.881 +140120 0.796 +140121 0.776 +140123 0.810 +140130 0.829 +140131 0.756 +140132 0.726 +140134 0.501 +140138 0.544 +140139 0.895 +140536 0.783 +140538 0.761 +140579 0.587 +140580 0.798 +140581 0.694 From 83864354eb39619ad31a84f57339a2be2496dae8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 2 May 2017 15:29:40 -0400 Subject: [PATCH 002/744] added d3d full shotlists --- data/shot_lists/d3d/d3d_clear.txt | 74248 ++++++++++++++++++++++++++ data/shot_lists/d3d/d3d_disrupt.txt | 17295 ++++++ 2 files changed, 91543 insertions(+) create mode 100755 data/shot_lists/d3d/d3d_clear.txt create mode 100755 data/shot_lists/d3d/d3d_disrupt.txt diff --git a/data/shot_lists/d3d/d3d_clear.txt b/data/shot_lists/d3d/d3d_clear.txt new file mode 100755 index 00000000..9d9425f8 --- /dev/null +++ b/data/shot_lists/d3d/d3d_clear.txt @@ -0,0 +1,74248 @@ +40560 -1.000000 +40561 -1.000000 +40562 -1.000000 +40563 -1.000000 +40564 -1.000000 +41026 -1.000000 +41027 -1.000000 +41032 -1.000000 +41336 -1.000000 +41652 -1.000000 +41653 -1.000000 +41764 -1.000000 +41765 -1.000000 +41776 -1.000000 +41779 -1.000000 +41901 -1.000000 +41902 -1.000000 +41904 -1.000000 +41909 -1.000000 +41911 -1.000000 +41912 -1.000000 +41914 -1.000000 +41915 -1.000000 +41918 -1.000000 +41920 -1.000000 +41921 -1.000000 +41925 -1.000000 +41926 -1.000000 +41927 -1.000000 +41930 -1.000000 +41934 -1.000000 +41935 -1.000000 +41936 -1.000000 +41937 -1.000000 +41938 -1.000000 +41940 -1.000000 +41941 -1.000000 +41943 -1.000000 +41945 -1.000000 +41948 -1.000000 +41953 -1.000000 +41955 -1.000000 +41967 -1.000000 +41969 -1.000000 +41972 -1.000000 +41978 -1.000000 +41986 -1.000000 +41987 -1.000000 +41989 -1.000000 +42591 -1.000000 +42604 -1.000000 +42679 -1.000000 +42692 -1.000000 +43163 -1.000000 +43222 -1.000000 +43226 -1.000000 +43227 -1.000000 +43228 -1.000000 +43229 -1.000000 +43230 -1.000000 +43233 -1.000000 +43429 -1.000000 +43431 -1.000000 +43433 -1.000000 +43446 -1.000000 +43470 -1.000000 +43471 -1.000000 +43472 -1.000000 +43473 -1.000000 +43475 -1.000000 +43476 -1.000000 +43481 -1.000000 +43488 -1.000000 +43490 -1.000000 +43491 -1.000000 +43492 -1.000000 +43493 -1.000000 +43495 -1.000000 +43496 -1.000000 +43497 -1.000000 +43498 -1.000000 +43499 -1.000000 +43500 -1.000000 +43503 -1.000000 +43505 -1.000000 +43507 -1.000000 +43508 -1.000000 +43510 -1.000000 +43511 -1.000000 +43512 -1.000000 +43513 -1.000000 +43534 -1.000000 +43540 -1.000000 +43542 -1.000000 +43543 -1.000000 +43997 -1.000000 +43999 -1.000000 +44000 -1.000000 +44001 -1.000000 +44002 -1.000000 +44003 -1.000000 +44004 -1.000000 +44005 -1.000000 +44006 -1.000000 +44007 -1.000000 +44020 -1.000000 +44024 -1.000000 +44028 -1.000000 +44029 -1.000000 +44051 -1.000000 +44054 -1.000000 +44056 -1.000000 +44069 -1.000000 +44073 -1.000000 +44092 -1.000000 +44145 -1.000000 +44239 -1.000000 +44278 -1.000000 +44279 -1.000000 +44282 -1.000000 +44285 -1.000000 +44286 -1.000000 +44954 -1.000000 +44955 -1.000000 +45021 -1.000000 +45022 -1.000000 +45024 -1.000000 +45026 -1.000000 +45028 -1.000000 +45030 -1.000000 +45031 -1.000000 +45032 -1.000000 +45034 -1.000000 +45039 -1.000000 +45057 -1.000000 +45058 -1.000000 +45063 -1.000000 +45064 -1.000000 +45068 -1.000000 +45069 -1.000000 +45071 -1.000000 +45072 -1.000000 +45080 -1.000000 +45087 -1.000000 +45088 -1.000000 +45090 -1.000000 +45116 -1.000000 +45202 -1.000000 +45728 -1.000000 +45729 -1.000000 +45730 -1.000000 +45731 -1.000000 +45732 -1.000000 +45735 -1.000000 +45736 -1.000000 +45738 -1.000000 +45739 -1.000000 +45740 -1.000000 +45741 -1.000000 +45743 -1.000000 +45744 -1.000000 +45777 -1.000000 +45778 -1.000000 +45791 -1.000000 +45792 -1.000000 +45815 -1.000000 +45821 -1.000000 +45824 -1.000000 +45828 -1.000000 +45829 -1.000000 +45832 -1.000000 +45833 -1.000000 +45836 -1.000000 +45838 -1.000000 +45839 -1.000000 +45841 -1.000000 +45851 -1.000000 +45852 -1.000000 +45855 -1.000000 +45856 -1.000000 +45857 -1.000000 +45858 -1.000000 +45859 -1.000000 +45866 -1.000000 +45867 -1.000000 +45868 -1.000000 +45869 -1.000000 +45873 -1.000000 +45874 -1.000000 +46061 -1.000000 +46062 -1.000000 +46063 -1.000000 +46064 -1.000000 +46065 -1.000000 +46066 -1.000000 +46067 -1.000000 +46068 -1.000000 +46069 -1.000000 +46070 -1.000000 +46071 -1.000000 +46072 -1.000000 +46073 -1.000000 +46074 -1.000000 +46075 -1.000000 +46076 -1.000000 +46077 -1.000000 +46078 -1.000000 +46079 -1.000000 +46080 -1.000000 +46084 -1.000000 +46085 -1.000000 +46088 -1.000000 +46089 -1.000000 +46090 -1.000000 +46092 -1.000000 +46093 -1.000000 +46094 -1.000000 +46095 -1.000000 +46096 -1.000000 +46097 -1.000000 +46098 -1.000000 +46145 -1.000000 +46152 -1.000000 +46153 -1.000000 +46154 -1.000000 +46155 -1.000000 +46156 -1.000000 +46157 -1.000000 +46158 -1.000000 +46159 -1.000000 +46160 -1.000000 +46164 -1.000000 +46166 -1.000000 +46167 -1.000000 +46169 -1.000000 +46176 -1.000000 +46177 -1.000000 +46178 -1.000000 +46180 -1.000000 +46182 -1.000000 +46183 -1.000000 +46185 -1.000000 +46186 -1.000000 +46191 -1.000000 +46193 -1.000000 +46195 -1.000000 +46198 -1.000000 +46199 -1.000000 +46603 -1.000000 +46976 -1.000000 +46977 -1.000000 +46978 -1.000000 +46979 -1.000000 +46980 -1.000000 +46981 -1.000000 +46982 -1.000000 +46983 -1.000000 +46984 -1.000000 +46985 -1.000000 +46986 -1.000000 +46987 -1.000000 +46988 -1.000000 +46990 -1.000000 +46991 -1.000000 +46992 -1.000000 +46993 -1.000000 +46996 -1.000000 +46999 -1.000000 +47002 -1.000000 +47008 -1.000000 +47009 -1.000000 +47010 -1.000000 +47011 -1.000000 +47012 -1.000000 +47013 -1.000000 +47014 -1.000000 +47015 -1.000000 +47016 -1.000000 +47017 -1.000000 +47018 -1.000000 +47019 -1.000000 +47020 -1.000000 +47021 -1.000000 +47022 -1.000000 +47023 -1.000000 +47024 -1.000000 +47025 -1.000000 +47026 -1.000000 +47028 -1.000000 +47031 -1.000000 +47032 -1.000000 +47047 -1.000000 +47048 -1.000000 +47049 -1.000000 +47057 -1.000000 +47058 -1.000000 +47059 -1.000000 +47061 -1.000000 +47062 -1.000000 +47063 -1.000000 +47064 -1.000000 +47065 -1.000000 +47069 -1.000000 +47071 -1.000000 +47076 -1.000000 +47078 -1.000000 +47079 -1.000000 +47080 -1.000000 +47081 -1.000000 +47090 -1.000000 +47091 -1.000000 +47092 -1.000000 +47094 -1.000000 +47096 -1.000000 +47097 -1.000000 +47099 -1.000000 +47104 -1.000000 +47105 -1.000000 +47106 -1.000000 +47131 -1.000000 +47133 -1.000000 +47134 -1.000000 +47135 -1.000000 +47136 -1.000000 +47137 -1.000000 +47138 -1.000000 +47139 -1.000000 +47140 -1.000000 +47141 -1.000000 +47142 -1.000000 +47143 -1.000000 +47144 -1.000000 +47145 -1.000000 +47146 -1.000000 +47147 -1.000000 +47148 -1.000000 +47149 -1.000000 +47150 -1.000000 +47151 -1.000000 +47152 -1.000000 +47153 -1.000000 +47154 -1.000000 +47155 -1.000000 +47156 -1.000000 +47157 -1.000000 +47158 -1.000000 +47159 -1.000000 +47160 -1.000000 +47161 -1.000000 +47162 -1.000000 +47163 -1.000000 +47164 -1.000000 +47165 -1.000000 +47166 -1.000000 +47167 -1.000000 +47168 -1.000000 +47169 -1.000000 +47170 -1.000000 +47171 -1.000000 +47172 -1.000000 +47173 -1.000000 +47174 -1.000000 +47175 -1.000000 +47176 -1.000000 +47177 -1.000000 +47178 -1.000000 +47179 -1.000000 +47180 -1.000000 +47181 -1.000000 +47182 -1.000000 +47183 -1.000000 +47184 -1.000000 +47185 -1.000000 +47186 -1.000000 +47187 -1.000000 +47188 -1.000000 +47189 -1.000000 +47190 -1.000000 +47191 -1.000000 +47192 -1.000000 +47193 -1.000000 +47194 -1.000000 +47195 -1.000000 +47196 -1.000000 +47197 -1.000000 +47198 -1.000000 +47199 -1.000000 +47200 -1.000000 +47201 -1.000000 +47202 -1.000000 +47203 -1.000000 +47207 -1.000000 +47208 -1.000000 +47209 -1.000000 +47210 -1.000000 +47211 -1.000000 +47212 -1.000000 +47213 -1.000000 +47214 -1.000000 +47215 -1.000000 +47216 -1.000000 +47217 -1.000000 +47218 -1.000000 +47219 -1.000000 +47221 -1.000000 +47222 -1.000000 +47223 -1.000000 +47224 -1.000000 +47225 -1.000000 +47226 -1.000000 +47227 -1.000000 +47228 -1.000000 +47229 -1.000000 +47230 -1.000000 +47231 -1.000000 +47306 -1.000000 +47309 -1.000000 +47310 -1.000000 +47318 -1.000000 +47319 -1.000000 +49925 -1.000000 +50011 -1.000000 +50013 -1.000000 +50014 -1.000000 +50015 -1.000000 +50016 -1.000000 +50017 -1.000000 +50018 -1.000000 +50019 -1.000000 +50020 -1.000000 +50021 -1.000000 +50022 -1.000000 +50023 -1.000000 +50024 -1.000000 +50025 -1.000000 +50026 -1.000000 +50027 -1.000000 +50028 -1.000000 +50029 -1.000000 +50030 -1.000000 +50031 -1.000000 +50032 -1.000000 +50033 -1.000000 +50034 -1.000000 +50035 -1.000000 +50036 -1.000000 +50037 -1.000000 +50038 -1.000000 +50039 -1.000000 +50040 -1.000000 +50041 -1.000000 +50042 -1.000000 +50043 -1.000000 +50044 -1.000000 +50045 -1.000000 +50046 -1.000000 +50047 -1.000000 +50048 -1.000000 +50049 -1.000000 +50050 -1.000000 +50051 -1.000000 +50052 -1.000000 +50053 -1.000000 +50054 -1.000000 +50055 -1.000000 +50056 -1.000000 +50057 -1.000000 +50058 -1.000000 +50059 -1.000000 +50060 -1.000000 +50061 -1.000000 +50062 -1.000000 +50063 -1.000000 +50064 -1.000000 +50065 -1.000000 +50066 -1.000000 +50067 -1.000000 +50068 -1.000000 +50069 -1.000000 +50070 -1.000000 +50071 -1.000000 +50072 -1.000000 +50073 -1.000000 +50074 -1.000000 +50075 -1.000000 +50076 -1.000000 +50077 -1.000000 +50078 -1.000000 +50079 -1.000000 +50080 -1.000000 +50081 -1.000000 +50082 -1.000000 +50083 -1.000000 +50084 -1.000000 +50085 -1.000000 +50086 -1.000000 +50087 -1.000000 +50088 -1.000000 +50089 -1.000000 +50090 -1.000000 +50091 -1.000000 +50092 -1.000000 +50093 -1.000000 +50094 -1.000000 +50095 -1.000000 +50096 -1.000000 +50097 -1.000000 +50098 -1.000000 +50099 -1.000000 +50100 -1.000000 +50101 -1.000000 +50102 -1.000000 +50103 -1.000000 +50104 -1.000000 +50105 -1.000000 +50106 -1.000000 +50107 -1.000000 +50108 -1.000000 +50109 -1.000000 +50110 -1.000000 +50111 -1.000000 +50112 -1.000000 +50113 -1.000000 +50114 -1.000000 +50115 -1.000000 +50116 -1.000000 +50117 -1.000000 +50118 -1.000000 +50119 -1.000000 +50120 -1.000000 +50121 -1.000000 +50122 -1.000000 +50123 -1.000000 +50124 -1.000000 +50125 -1.000000 +50126 -1.000000 +50127 -1.000000 +50128 -1.000000 +50129 -1.000000 +50130 -1.000000 +50131 -1.000000 +50132 -1.000000 +50133 -1.000000 +50134 -1.000000 +50135 -1.000000 +50136 -1.000000 +50139 -1.000000 +50140 -1.000000 +50141 -1.000000 +50142 -1.000000 +50143 -1.000000 +50144 -1.000000 +50145 -1.000000 +50146 -1.000000 +50147 -1.000000 +50148 -1.000000 +50149 -1.000000 +50150 -1.000000 +50151 -1.000000 +50152 -1.000000 +50153 -1.000000 +50154 -1.000000 +50155 -1.000000 +50156 -1.000000 +50157 -1.000000 +50158 -1.000000 +50159 -1.000000 +50160 -1.000000 +50161 -1.000000 +50162 -1.000000 +50163 -1.000000 +50164 -1.000000 +50165 -1.000000 +50166 -1.000000 +50167 -1.000000 +50168 -1.000000 +50169 -1.000000 +50170 -1.000000 +50171 -1.000000 +50172 -1.000000 +50173 -1.000000 +50174 -1.000000 +50175 -1.000000 +50176 -1.000000 +50177 -1.000000 +50178 -1.000000 +50179 -1.000000 +50180 -1.000000 +50181 -1.000000 +50182 -1.000000 +50183 -1.000000 +50184 -1.000000 +50185 -1.000000 +50186 -1.000000 +50187 -1.000000 +50188 -1.000000 +50189 -1.000000 +50190 -1.000000 +50191 -1.000000 +50192 -1.000000 +50193 -1.000000 +50194 -1.000000 +50195 -1.000000 +50196 -1.000000 +50197 -1.000000 +50198 -1.000000 +50199 -1.000000 +50200 -1.000000 +50201 -1.000000 +50202 -1.000000 +50203 -1.000000 +50204 -1.000000 +50205 -1.000000 +50206 -1.000000 +50207 -1.000000 +50208 -1.000000 +50209 -1.000000 +50210 -1.000000 +50211 -1.000000 +50212 -1.000000 +50213 -1.000000 +50214 -1.000000 +50215 -1.000000 +50216 -1.000000 +50217 -1.000000 +50218 -1.000000 +50219 -1.000000 +50220 -1.000000 +50221 -1.000000 +50222 -1.000000 +50223 -1.000000 +50224 -1.000000 +50225 -1.000000 +50226 -1.000000 +50227 -1.000000 +50228 -1.000000 +50229 -1.000000 +50230 -1.000000 +50231 -1.000000 +50232 -1.000000 +50233 -1.000000 +50234 -1.000000 +50235 -1.000000 +50236 -1.000000 +50237 -1.000000 +50238 -1.000000 +50239 -1.000000 +50240 -1.000000 +50241 -1.000000 +50242 -1.000000 +50243 -1.000000 +50244 -1.000000 +50245 -1.000000 +50246 -1.000000 +50247 -1.000000 +50248 -1.000000 +50249 -1.000000 +50250 -1.000000 +50251 -1.000000 +50252 -1.000000 +50253 -1.000000 +50254 -1.000000 +50255 -1.000000 +50256 -1.000000 +50257 -1.000000 +50258 -1.000000 +50259 -1.000000 +50260 -1.000000 +50261 -1.000000 +50262 -1.000000 +50263 -1.000000 +50264 -1.000000 +50265 -1.000000 +50266 -1.000000 +50267 -1.000000 +50268 -1.000000 +50269 -1.000000 +50270 -1.000000 +50271 -1.000000 +50272 -1.000000 +50273 -1.000000 +50274 -1.000000 +50275 -1.000000 +50276 -1.000000 +50277 -1.000000 +50278 -1.000000 +50279 -1.000000 +50280 -1.000000 +50281 -1.000000 +50282 -1.000000 +50283 -1.000000 +50284 -1.000000 +50285 -1.000000 +50286 -1.000000 +50287 -1.000000 +50288 -1.000000 +50289 -1.000000 +50290 -1.000000 +50291 -1.000000 +50292 -1.000000 +50293 -1.000000 +50294 -1.000000 +50295 -1.000000 +50296 -1.000000 +50297 -1.000000 +50298 -1.000000 +50299 -1.000000 +50300 -1.000000 +50301 -1.000000 +50302 -1.000000 +50303 -1.000000 +50304 -1.000000 +50305 -1.000000 +50306 -1.000000 +50307 -1.000000 +50308 -1.000000 +50309 -1.000000 +50310 -1.000000 +50516 -1.000000 +50517 -1.000000 +50518 -1.000000 +50519 -1.000000 +50520 -1.000000 +50521 -1.000000 +50522 -1.000000 +50523 -1.000000 +50524 -1.000000 +50525 -1.000000 +50526 -1.000000 +50527 -1.000000 +50528 -1.000000 +50529 -1.000000 +50530 -1.000000 +50578 -1.000000 +50579 -1.000000 +50581 -1.000000 +50583 -1.000000 +50585 -1.000000 +50588 -1.000000 +50589 -1.000000 +50591 -1.000000 +50593 -1.000000 +50595 -1.000000 +50597 -1.000000 +50600 -1.000000 +50602 -1.000000 +50603 -1.000000 +50604 -1.000000 +50606 -1.000000 +50607 -1.000000 +50608 -1.000000 +50609 -1.000000 +50612 -1.000000 +50613 -1.000000 +50615 -1.000000 +50616 -1.000000 +50617 -1.000000 +50618 -1.000000 +50619 -1.000000 +50620 -1.000000 +50621 -1.000000 +50622 -1.000000 +50623 -1.000000 +50624 -1.000000 +50625 -1.000000 +50626 -1.000000 +50627 -1.000000 +50628 -1.000000 +50629 -1.000000 +50631 -1.000000 +50632 -1.000000 +50633 -1.000000 +50634 -1.000000 +50635 -1.000000 +50636 -1.000000 +50637 -1.000000 +50638 -1.000000 +50642 -1.000000 +50643 -1.000000 +50645 -1.000000 +50646 -1.000000 +50647 -1.000000 +50648 -1.000000 +50649 -1.000000 +50650 -1.000000 +50651 -1.000000 +50652 -1.000000 +50653 -1.000000 +50654 -1.000000 +50655 -1.000000 +50656 -1.000000 +50657 -1.000000 +50662 -1.000000 +50663 -1.000000 +50664 -1.000000 +50665 -1.000000 +50666 -1.000000 +50667 -1.000000 +50668 -1.000000 +50669 -1.000000 +50670 -1.000000 +50671 -1.000000 +50672 -1.000000 +50673 -1.000000 +50674 -1.000000 +50675 -1.000000 +50676 -1.000000 +50677 -1.000000 +50678 -1.000000 +50679 -1.000000 +50680 -1.000000 +50681 -1.000000 +50682 -1.000000 +50683 -1.000000 +50684 -1.000000 +50688 -1.000000 +50689 -1.000000 +50694 -1.000000 +50695 -1.000000 +50696 -1.000000 +50697 -1.000000 +50698 -1.000000 +50699 -1.000000 +50700 -1.000000 +50701 -1.000000 +50702 -1.000000 +50703 -1.000000 +50704 -1.000000 +50705 -1.000000 +50707 -1.000000 +50709 -1.000000 +50711 -1.000000 +50713 -1.000000 +50715 -1.000000 +50716 -1.000000 +50717 -1.000000 +50718 -1.000000 +50719 -1.000000 +50720 -1.000000 +50721 -1.000000 +50722 -1.000000 +50723 -1.000000 +50724 -1.000000 +50725 -1.000000 +50726 -1.000000 +50727 -1.000000 +50728 -1.000000 +50731 -1.000000 +50732 -1.000000 +50733 -1.000000 +50734 -1.000000 +50735 -1.000000 +50736 -1.000000 +50737 -1.000000 +50738 -1.000000 +50739 -1.000000 +50740 -1.000000 +50743 -1.000000 +50745 -1.000000 +50746 -1.000000 +50747 -1.000000 +50748 -1.000000 +50749 -1.000000 +50750 -1.000000 +50751 -1.000000 +50752 -1.000000 +50753 -1.000000 +50754 -1.000000 +50755 -1.000000 +50756 -1.000000 +50757 -1.000000 +50758 -1.000000 +50759 -1.000000 +50760 -1.000000 +50761 -1.000000 +50762 -1.000000 +50763 -1.000000 +50764 -1.000000 +50775 -1.000000 +50776 -1.000000 +50777 -1.000000 +50778 -1.000000 +50779 -1.000000 +50780 -1.000000 +50781 -1.000000 +50782 -1.000000 +50783 -1.000000 +50784 -1.000000 +50785 -1.000000 +50786 -1.000000 +50787 -1.000000 +50788 -1.000000 +50789 -1.000000 +50790 -1.000000 +50791 -1.000000 +50792 -1.000000 +50793 -1.000000 +50794 -1.000000 +50795 -1.000000 +50796 -1.000000 +50797 -1.000000 +50799 -1.000000 +50800 -1.000000 +50801 -1.000000 +50805 -1.000000 +50806 -1.000000 +50807 -1.000000 +50808 -1.000000 +50812 -1.000000 +50813 -1.000000 +50814 -1.000000 +50815 -1.000000 +50816 -1.000000 +50817 -1.000000 +50819 -1.000000 +50820 -1.000000 +50821 -1.000000 +50822 -1.000000 +50823 -1.000000 +50824 -1.000000 +50827 -1.000000 +50828 -1.000000 +50829 -1.000000 +50830 -1.000000 +50831 -1.000000 +50832 -1.000000 +50833 -1.000000 +50834 -1.000000 +50835 -1.000000 +50836 -1.000000 +50837 -1.000000 +50838 -1.000000 +50839 -1.000000 +50840 -1.000000 +50841 -1.000000 +50842 -1.000000 +50843 -1.000000 +50844 -1.000000 +50845 -1.000000 +50846 -1.000000 +50847 -1.000000 +50848 -1.000000 +50849 -1.000000 +50850 -1.000000 +50851 -1.000000 +50852 -1.000000 +50853 -1.000000 +50854 -1.000000 +50855 -1.000000 +50856 -1.000000 +50857 -1.000000 +50858 -1.000000 +50859 -1.000000 +50860 -1.000000 +50861 -1.000000 +50862 -1.000000 +50863 -1.000000 +50864 -1.000000 +50865 -1.000000 +50866 -1.000000 +50867 -1.000000 +50868 -1.000000 +50869 -1.000000 +50870 -1.000000 +50871 -1.000000 +50872 -1.000000 +50876 -1.000000 +50877 -1.000000 +50878 -1.000000 +50879 -1.000000 +50880 -1.000000 +50881 -1.000000 +50882 -1.000000 +50883 -1.000000 +50884 -1.000000 +50885 -1.000000 +50890 -1.000000 +50891 -1.000000 +50892 -1.000000 +50893 -1.000000 +50894 -1.000000 +50895 -1.000000 +50896 -1.000000 +50897 -1.000000 +50898 -1.000000 +50899 -1.000000 +50900 -1.000000 +50901 -1.000000 +50902 -1.000000 +50903 -1.000000 +50905 -1.000000 +50906 -1.000000 +50907 -1.000000 +50909 -1.000000 +50913 -1.000000 +50918 -1.000000 +50919 -1.000000 +50920 -1.000000 +50921 -1.000000 +50922 -1.000000 +50923 -1.000000 +50925 -1.000000 +50926 -1.000000 +50927 -1.000000 +50928 -1.000000 +50929 -1.000000 +50930 -1.000000 +50931 -1.000000 +50932 -1.000000 +50933 -1.000000 +50934 -1.000000 +50935 -1.000000 +50936 -1.000000 +50937 -1.000000 +50938 -1.000000 +50939 -1.000000 +50940 -1.000000 +50941 -1.000000 +50942 -1.000000 +50943 -1.000000 +50944 -1.000000 +50945 -1.000000 +50946 -1.000000 +50948 -1.000000 +50949 -1.000000 +50950 -1.000000 +50951 -1.000000 +50952 -1.000000 +50953 -1.000000 +50954 -1.000000 +50955 -1.000000 +50956 -1.000000 +50957 -1.000000 +50958 -1.000000 +50959 -1.000000 +50960 -1.000000 +50961 -1.000000 +50962 -1.000000 +50963 -1.000000 +50964 -1.000000 +50965 -1.000000 +50966 -1.000000 +50967 -1.000000 +50968 -1.000000 +50969 -1.000000 +50970 -1.000000 +50971 -1.000000 +50972 -1.000000 +50973 -1.000000 +50974 -1.000000 +50975 -1.000000 +50976 -1.000000 +50977 -1.000000 +50978 -1.000000 +50979 -1.000000 +50980 -1.000000 +50981 -1.000000 +50982 -1.000000 +50983 -1.000000 +50984 -1.000000 +50985 -1.000000 +50986 -1.000000 +50987 -1.000000 +50988 -1.000000 +50989 -1.000000 +50990 -1.000000 +50991 -1.000000 +50992 -1.000000 +50993 -1.000000 +50994 -1.000000 +50995 -1.000000 +50996 -1.000000 +50997 -1.000000 +50998 -1.000000 +50999 -1.000000 +51000 -1.000000 +51001 -1.000000 +51002 -1.000000 +51003 -1.000000 +51004 -1.000000 +51005 -1.000000 +51006 -1.000000 +51007 -1.000000 +51008 -1.000000 +51009 -1.000000 +51010 -1.000000 +51011 -1.000000 +51012 -1.000000 +51013 -1.000000 +51018 -1.000000 +51019 -1.000000 +51020 -1.000000 +51021 -1.000000 +51022 -1.000000 +51023 -1.000000 +51024 -1.000000 +51025 -1.000000 +51026 -1.000000 +51027 -1.000000 +51028 -1.000000 +51029 -1.000000 +51030 -1.000000 +51031 -1.000000 +51032 -1.000000 +51033 -1.000000 +51034 -1.000000 +51035 -1.000000 +51036 -1.000000 +51037 -1.000000 +51038 -1.000000 +51041 -1.000000 +51042 -1.000000 +51043 -1.000000 +51044 -1.000000 +51045 -1.000000 +51046 -1.000000 +51047 -1.000000 +51048 -1.000000 +51049 -1.000000 +51050 -1.000000 +51051 -1.000000 +51052 -1.000000 +51053 -1.000000 +51054 -1.000000 +51055 -1.000000 +51057 -1.000000 +51058 -1.000000 +51059 -1.000000 +51060 -1.000000 +51061 -1.000000 +51062 -1.000000 +51063 -1.000000 +51064 -1.000000 +51065 -1.000000 +51066 -1.000000 +51067 -1.000000 +51068 -1.000000 +51069 -1.000000 +51070 -1.000000 +51073 -1.000000 +51074 -1.000000 +51075 -1.000000 +51076 -1.000000 +51077 -1.000000 +51078 -1.000000 +51079 -1.000000 +51080 -1.000000 +51081 -1.000000 +51082 -1.000000 +51083 -1.000000 +51084 -1.000000 +51085 -1.000000 +51086 -1.000000 +51087 -1.000000 +51088 -1.000000 +51090 -1.000000 +51091 -1.000000 +51092 -1.000000 +51093 -1.000000 +51094 -1.000000 +51095 -1.000000 +51096 -1.000000 +51097 -1.000000 +51098 -1.000000 +51099 -1.000000 +51100 -1.000000 +51101 -1.000000 +51102 -1.000000 +51103 -1.000000 +51104 -1.000000 +51105 -1.000000 +51106 -1.000000 +51107 -1.000000 +51108 -1.000000 +51109 -1.000000 +51110 -1.000000 +51111 -1.000000 +51112 -1.000000 +51113 -1.000000 +51114 -1.000000 +51119 -1.000000 +51120 -1.000000 +51121 -1.000000 +51122 -1.000000 +51123 -1.000000 +51124 -1.000000 +51125 -1.000000 +51126 -1.000000 +51127 -1.000000 +51128 -1.000000 +51129 -1.000000 +51130 -1.000000 +51131 -1.000000 +51132 -1.000000 +51133 -1.000000 +51134 -1.000000 +51135 -1.000000 +51136 -1.000000 +51138 -1.000000 +51139 -1.000000 +51140 -1.000000 +51141 -1.000000 +51190 -1.000000 +51191 -1.000000 +51192 -1.000000 +51193 -1.000000 +51194 -1.000000 +51195 -1.000000 +51196 -1.000000 +51197 -1.000000 +51198 -1.000000 +51199 -1.000000 +51200 -1.000000 +51201 -1.000000 +51202 -1.000000 +51203 -1.000000 +51204 -1.000000 +51205 -1.000000 +51206 -1.000000 +51209 -1.000000 +51214 -1.000000 +51215 -1.000000 +51216 -1.000000 +51225 -1.000000 +51226 -1.000000 +51227 -1.000000 +51228 -1.000000 +51229 -1.000000 +51230 -1.000000 +51231 -1.000000 +51232 -1.000000 +51233 -1.000000 +51234 -1.000000 +51235 -1.000000 +51236 -1.000000 +51237 -1.000000 +51238 -1.000000 +51239 -1.000000 +51240 -1.000000 +51241 -1.000000 +51242 -1.000000 +51243 -1.000000 +51244 -1.000000 +51245 -1.000000 +51246 -1.000000 +51247 -1.000000 +51248 -1.000000 +51249 -1.000000 +51250 -1.000000 +51251 -1.000000 +51252 -1.000000 +51253 -1.000000 +51254 -1.000000 +51256 -1.000000 +51257 -1.000000 +51258 -1.000000 +51259 -1.000000 +51260 -1.000000 +51261 -1.000000 +51262 -1.000000 +51263 -1.000000 +51264 -1.000000 +51265 -1.000000 +51266 -1.000000 +51267 -1.000000 +51268 -1.000000 +51269 -1.000000 +51270 -1.000000 +51271 -1.000000 +51272 -1.000000 +51273 -1.000000 +51274 -1.000000 +51275 -1.000000 +51276 -1.000000 +51277 -1.000000 +51278 -1.000000 +51279 -1.000000 +51280 -1.000000 +51281 -1.000000 +51282 -1.000000 +51283 -1.000000 +51284 -1.000000 +51285 -1.000000 +51286 -1.000000 +51289 -1.000000 +51342 -1.000000 +51343 -1.000000 +51344 -1.000000 +51345 -1.000000 +51346 -1.000000 +51347 -1.000000 +51348 -1.000000 +51349 -1.000000 +51350 -1.000000 +51351 -1.000000 +51352 -1.000000 +51354 -1.000000 +51355 -1.000000 +51356 -1.000000 +51357 -1.000000 +51358 -1.000000 +51359 -1.000000 +51360 -1.000000 +51361 -1.000000 +51362 -1.000000 +51363 -1.000000 +51364 -1.000000 +51365 -1.000000 +51366 -1.000000 +51367 -1.000000 +51368 -1.000000 +51369 -1.000000 +51370 -1.000000 +51371 -1.000000 +51372 -1.000000 +51373 -1.000000 +51375 -1.000000 +51376 -1.000000 +51383 -1.000000 +51388 -1.000000 +51392 -1.000000 +51393 -1.000000 +51394 -1.000000 +51395 -1.000000 +51396 -1.000000 +51397 -1.000000 +51398 -1.000000 +51399 -1.000000 +51400 -1.000000 +51401 -1.000000 +51402 -1.000000 +51403 -1.000000 +51404 -1.000000 +51405 -1.000000 +51406 -1.000000 +51407 -1.000000 +51409 -1.000000 +51410 -1.000000 +51411 -1.000000 +51412 -1.000000 +51413 -1.000000 +51414 -1.000000 +51415 -1.000000 +51416 -1.000000 +51417 -1.000000 +51418 -1.000000 +51419 -1.000000 +51420 -1.000000 +51421 -1.000000 +51422 -1.000000 +51423 -1.000000 +51424 -1.000000 +51425 -1.000000 +51426 -1.000000 +51427 -1.000000 +51428 -1.000000 +51429 -1.000000 +51430 -1.000000 +51431 -1.000000 +51432 -1.000000 +51433 -1.000000 +51434 -1.000000 +51435 -1.000000 +51436 -1.000000 +51437 -1.000000 +51438 -1.000000 +51439 -1.000000 +51440 -1.000000 +51441 -1.000000 +51442 -1.000000 +51443 -1.000000 +51444 -1.000000 +51445 -1.000000 +51446 -1.000000 +51447 -1.000000 +51448 -1.000000 +51449 -1.000000 +51450 -1.000000 +51451 -1.000000 +51452 -1.000000 +51453 -1.000000 +51454 -1.000000 +51455 -1.000000 +51456 -1.000000 +51457 -1.000000 +51458 -1.000000 +51459 -1.000000 +51461 -1.000000 +51463 -1.000000 +51464 -1.000000 +51465 -1.000000 +51466 -1.000000 +51467 -1.000000 +51468 -1.000000 +51469 -1.000000 +51470 -1.000000 +51471 -1.000000 +51472 -1.000000 +51473 -1.000000 +51474 -1.000000 +51475 -1.000000 +51476 -1.000000 +51477 -1.000000 +51478 -1.000000 +51479 -1.000000 +51480 -1.000000 +51482 -1.000000 +51483 -1.000000 +51485 -1.000000 +51486 -1.000000 +51487 -1.000000 +51488 -1.000000 +51489 -1.000000 +51490 -1.000000 +51491 -1.000000 +51492 -1.000000 +51493 -1.000000 +51494 -1.000000 +51495 -1.000000 +51496 -1.000000 +51497 -1.000000 +51498 -1.000000 +51499 -1.000000 +51500 -1.000000 +51501 -1.000000 +51502 -1.000000 +51510 -1.000000 +51511 -1.000000 +51512 -1.000000 +51513 -1.000000 +51514 -1.000000 +51515 -1.000000 +51516 -1.000000 +51517 -1.000000 +51518 -1.000000 +51519 -1.000000 +51520 -1.000000 +51521 -1.000000 +51522 -1.000000 +51523 -1.000000 +51524 -1.000000 +51525 -1.000000 +51526 -1.000000 +51527 -1.000000 +51528 -1.000000 +51529 -1.000000 +51530 -1.000000 +51531 -1.000000 +51532 -1.000000 +51533 -1.000000 +51534 -1.000000 +51535 -1.000000 +51536 -1.000000 +51537 -1.000000 +51538 -1.000000 +51539 -1.000000 +51540 -1.000000 +51543 -1.000000 +51544 -1.000000 +51545 -1.000000 +51546 -1.000000 +51547 -1.000000 +51548 -1.000000 +51549 -1.000000 +51552 -1.000000 +51553 -1.000000 +51554 -1.000000 +51555 -1.000000 +51556 -1.000000 +51557 -1.000000 +51558 -1.000000 +51559 -1.000000 +51560 -1.000000 +51561 -1.000000 +51562 -1.000000 +51563 -1.000000 +51564 -1.000000 +51565 -1.000000 +51567 -1.000000 +51568 -1.000000 +51569 -1.000000 +51571 -1.000000 +51572 -1.000000 +51581 -1.000000 +51582 -1.000000 +51583 -1.000000 +51584 -1.000000 +51585 -1.000000 +51586 -1.000000 +51587 -1.000000 +51588 -1.000000 +51589 -1.000000 +51590 -1.000000 +51591 -1.000000 +51592 -1.000000 +51593 -1.000000 +51594 -1.000000 +51595 -1.000000 +51596 -1.000000 +51597 -1.000000 +51598 -1.000000 +51599 -1.000000 +51600 -1.000000 +51601 -1.000000 +51602 -1.000000 +51603 -1.000000 +51604 -1.000000 +51605 -1.000000 +51606 -1.000000 +51607 -1.000000 +51608 -1.000000 +51609 -1.000000 +51610 -1.000000 +51635 -1.000000 +51636 -1.000000 +51637 -1.000000 +51638 -1.000000 +51639 -1.000000 +51640 -1.000000 +51641 -1.000000 +51642 -1.000000 +51643 -1.000000 +51644 -1.000000 +51645 -1.000000 +51646 -1.000000 +51647 -1.000000 +51648 -1.000000 +51649 -1.000000 +51650 -1.000000 +51651 -1.000000 +51652 -1.000000 +51653 -1.000000 +51654 -1.000000 +51655 -1.000000 +51656 -1.000000 +51657 -1.000000 +51658 -1.000000 +51659 -1.000000 +51660 -1.000000 +51661 -1.000000 +51662 -1.000000 +51663 -1.000000 +51664 -1.000000 +51665 -1.000000 +51666 -1.000000 +51667 -1.000000 +51668 -1.000000 +51669 -1.000000 +51670 -1.000000 +51671 -1.000000 +51672 -1.000000 +51674 -1.000000 +51676 -1.000000 +51688 -1.000000 +51690 -1.000000 +51692 -1.000000 +51694 -1.000000 +51696 -1.000000 +51697 -1.000000 +51698 -1.000000 +51700 -1.000000 +51702 -1.000000 +51703 -1.000000 +51771 -1.000000 +52000 -1.000000 +52075 -1.000000 +52076 -1.000000 +52077 -1.000000 +52078 -1.000000 +52079 -1.000000 +52080 -1.000000 +52081 -1.000000 +52082 -1.000000 +52083 -1.000000 +52084 -1.000000 +52085 -1.000000 +52086 -1.000000 +52087 -1.000000 +52088 -1.000000 +52089 -1.000000 +52090 -1.000000 +52091 -1.000000 +52092 -1.000000 +52093 -1.000000 +52095 -1.000000 +52096 -1.000000 +52097 -1.000000 +52098 -1.000000 +52099 -1.000000 +52100 -1.000000 +52101 -1.000000 +52102 -1.000000 +52103 -1.000000 +52104 -1.000000 +52105 -1.000000 +52106 -1.000000 +52107 -1.000000 +52108 -1.000000 +52109 -1.000000 +52110 -1.000000 +52111 -1.000000 +52112 -1.000000 +52113 -1.000000 +52114 -1.000000 +52115 -1.000000 +52116 -1.000000 +52117 -1.000000 +52118 -1.000000 +52119 -1.000000 +52120 -1.000000 +52121 -1.000000 +52122 -1.000000 +52126 -1.000000 +52127 -1.000000 +52129 -1.000000 +52130 -1.000000 +52131 -1.000000 +52132 -1.000000 +52133 -1.000000 +52134 -1.000000 +52135 -1.000000 +52136 -1.000000 +52137 -1.000000 +52138 -1.000000 +52139 -1.000000 +52140 -1.000000 +52141 -1.000000 +52142 -1.000000 +52143 -1.000000 +52144 -1.000000 +52145 -1.000000 +52146 -1.000000 +52147 -1.000000 +52148 -1.000000 +52149 -1.000000 +52151 -1.000000 +52152 -1.000000 +52153 -1.000000 +52154 -1.000000 +52155 -1.000000 +52156 -1.000000 +52157 -1.000000 +52158 -1.000000 +52159 -1.000000 +52160 -1.000000 +52161 -1.000000 +52162 -1.000000 +52163 -1.000000 +52164 -1.000000 +52165 -1.000000 +52166 -1.000000 +52167 -1.000000 +52168 -1.000000 +52169 -1.000000 +52170 -1.000000 +52172 -1.000000 +52173 -1.000000 +52174 -1.000000 +52175 -1.000000 +52176 -1.000000 +52177 -1.000000 +52178 -1.000000 +52179 -1.000000 +52180 -1.000000 +52181 -1.000000 +52182 -1.000000 +52183 -1.000000 +52184 -1.000000 +52185 -1.000000 +52186 -1.000000 +52187 -1.000000 +52188 -1.000000 +52189 -1.000000 +52190 -1.000000 +52191 -1.000000 +52192 -1.000000 +52193 -1.000000 +52194 -1.000000 +52195 -1.000000 +52196 -1.000000 +52198 -1.000000 +52199 -1.000000 +52201 -1.000000 +52202 -1.000000 +52203 -1.000000 +52204 -1.000000 +52205 -1.000000 +52206 -1.000000 +52207 -1.000000 +52208 -1.000000 +52209 -1.000000 +52210 -1.000000 +52211 -1.000000 +52212 -1.000000 +52213 -1.000000 +52214 -1.000000 +52215 -1.000000 +52216 -1.000000 +52217 -1.000000 +52218 -1.000000 +52219 -1.000000 +52220 -1.000000 +52221 -1.000000 +52222 -1.000000 +52223 -1.000000 +52224 -1.000000 +52225 -1.000000 +52226 -1.000000 +52227 -1.000000 +52228 -1.000000 +52229 -1.000000 +52230 -1.000000 +52231 -1.000000 +52232 -1.000000 +52233 -1.000000 +52234 -1.000000 +52235 -1.000000 +52236 -1.000000 +52248 -1.000000 +52249 -1.000000 +52250 -1.000000 +52251 -1.000000 +52252 -1.000000 +52253 -1.000000 +52254 -1.000000 +52255 -1.000000 +52256 -1.000000 +52257 -1.000000 +52258 -1.000000 +52259 -1.000000 +52260 -1.000000 +52261 -1.000000 +52262 -1.000000 +52263 -1.000000 +52264 -1.000000 +52265 -1.000000 +52266 -1.000000 +52267 -1.000000 +52269 -1.000000 +52270 -1.000000 +52271 -1.000000 +52272 -1.000000 +52273 -1.000000 +52274 -1.000000 +52276 -1.000000 +52277 -1.000000 +52278 -1.000000 +52279 -1.000000 +52280 -1.000000 +52281 -1.000000 +52282 -1.000000 +52283 -1.000000 +52284 -1.000000 +52285 -1.000000 +52286 -1.000000 +52287 -1.000000 +52288 -1.000000 +52289 -1.000000 +52290 -1.000000 +52291 -1.000000 +52292 -1.000000 +52293 -1.000000 +52294 -1.000000 +52295 -1.000000 +52296 -1.000000 +52297 -1.000000 +52298 -1.000000 +52299 -1.000000 +52300 -1.000000 +52301 -1.000000 +52302 -1.000000 +52303 -1.000000 +52304 -1.000000 +52305 -1.000000 +52306 -1.000000 +52307 -1.000000 +52308 -1.000000 +52310 -1.000000 +52311 -1.000000 +52312 -1.000000 +52313 -1.000000 +52314 -1.000000 +52316 -1.000000 +52317 -1.000000 +52318 -1.000000 +52319 -1.000000 +52320 -1.000000 +52321 -1.000000 +52322 -1.000000 +52323 -1.000000 +52324 -1.000000 +52325 -1.000000 +52326 -1.000000 +52327 -1.000000 +52328 -1.000000 +52329 -1.000000 +52331 -1.000000 +52332 -1.000000 +52333 -1.000000 +52334 -1.000000 +52335 -1.000000 +52336 -1.000000 +52337 -1.000000 +52338 -1.000000 +52339 -1.000000 +52340 -1.000000 +52341 -1.000000 +52342 -1.000000 +52343 -1.000000 +52344 -1.000000 +52345 -1.000000 +52346 -1.000000 +52347 -1.000000 +52349 -1.000000 +52360 -1.000000 +52361 -1.000000 +52363 -1.000000 +52364 -1.000000 +52365 -1.000000 +52366 -1.000000 +52367 -1.000000 +52368 -1.000000 +52369 -1.000000 +52370 -1.000000 +52371 -1.000000 +52372 -1.000000 +52373 -1.000000 +52374 -1.000000 +52375 -1.000000 +52376 -1.000000 +52377 -1.000000 +52378 -1.000000 +52379 -1.000000 +52380 -1.000000 +52381 -1.000000 +52382 -1.000000 +52383 -1.000000 +52384 -1.000000 +52385 -1.000000 +52386 -1.000000 +52387 -1.000000 +52388 -1.000000 +52389 -1.000000 +52390 -1.000000 +52392 -1.000000 +52393 -1.000000 +52394 -1.000000 +52395 -1.000000 +52396 -1.000000 +52397 -1.000000 +52398 -1.000000 +52399 -1.000000 +52400 -1.000000 +52401 -1.000000 +52402 -1.000000 +52403 -1.000000 +52404 -1.000000 +52405 -1.000000 +52406 -1.000000 +52407 -1.000000 +52408 -1.000000 +52409 -1.000000 +52410 -1.000000 +52411 -1.000000 +52412 -1.000000 +52413 -1.000000 +52414 -1.000000 +52415 -1.000000 +52416 -1.000000 +52417 -1.000000 +52418 -1.000000 +52419 -1.000000 +52420 -1.000000 +52421 -1.000000 +52422 -1.000000 +52423 -1.000000 +52424 -1.000000 +52425 -1.000000 +52426 -1.000000 +52427 -1.000000 +52428 -1.000000 +52429 -1.000000 +52430 -1.000000 +52431 -1.000000 +52432 -1.000000 +52433 -1.000000 +52434 -1.000000 +52435 -1.000000 +52436 -1.000000 +52437 -1.000000 +52438 -1.000000 +52439 -1.000000 +52440 -1.000000 +52441 -1.000000 +52442 -1.000000 +52443 -1.000000 +52444 -1.000000 +52445 -1.000000 +52446 -1.000000 +52447 -1.000000 +52448 -1.000000 +52449 -1.000000 +52450 -1.000000 +52451 -1.000000 +52452 -1.000000 +52453 -1.000000 +52454 -1.000000 +52455 -1.000000 +52456 -1.000000 +52457 -1.000000 +52458 -1.000000 +52459 -1.000000 +52460 -1.000000 +52461 -1.000000 +52462 -1.000000 +52463 -1.000000 +52464 -1.000000 +52465 -1.000000 +52466 -1.000000 +52467 -1.000000 +52468 -1.000000 +52469 -1.000000 +52470 -1.000000 +52471 -1.000000 +52472 -1.000000 +52473 -1.000000 +52474 -1.000000 +52475 -1.000000 +52476 -1.000000 +52477 -1.000000 +52478 -1.000000 +52479 -1.000000 +52480 -1.000000 +52481 -1.000000 +52482 -1.000000 +52483 -1.000000 +52484 -1.000000 +52485 -1.000000 +52486 -1.000000 +52487 -1.000000 +52488 -1.000000 +52489 -1.000000 +52490 -1.000000 +52491 -1.000000 +52492 -1.000000 +52493 -1.000000 +52494 -1.000000 +52495 -1.000000 +52496 -1.000000 +52505 -1.000000 +52506 -1.000000 +52507 -1.000000 +52508 -1.000000 +52509 -1.000000 +52510 -1.000000 +52511 -1.000000 +52512 -1.000000 +52513 -1.000000 +52514 -1.000000 +52515 -1.000000 +52516 -1.000000 +52517 -1.000000 +52518 -1.000000 +52519 -1.000000 +52520 -1.000000 +52521 -1.000000 +52522 -1.000000 +52523 -1.000000 +52524 -1.000000 +52525 -1.000000 +52526 -1.000000 +52527 -1.000000 +52528 -1.000000 +52529 -1.000000 +52530 -1.000000 +52531 -1.000000 +52532 -1.000000 +52533 -1.000000 +52534 -1.000000 +52535 -1.000000 +52536 -1.000000 +52537 -1.000000 +52538 -1.000000 +52539 -1.000000 +52540 -1.000000 +52541 -1.000000 +52542 -1.000000 +52543 -1.000000 +52544 -1.000000 +52545 -1.000000 +52546 -1.000000 +52547 -1.000000 +52548 -1.000000 +52549 -1.000000 +52550 -1.000000 +52551 -1.000000 +52552 -1.000000 +52553 -1.000000 +52554 -1.000000 +52555 -1.000000 +52556 -1.000000 +52557 -1.000000 +52558 -1.000000 +52560 -1.000000 +52561 -1.000000 +52562 -1.000000 +52563 -1.000000 +52564 -1.000000 +52565 -1.000000 +52566 -1.000000 +52567 -1.000000 +52568 -1.000000 +52569 -1.000000 +52570 -1.000000 +52571 -1.000000 +52572 -1.000000 +52573 -1.000000 +52574 -1.000000 +52575 -1.000000 +52576 -1.000000 +52577 -1.000000 +52579 -1.000000 +52580 -1.000000 +52581 -1.000000 +52582 -1.000000 +52583 -1.000000 +52584 -1.000000 +52585 -1.000000 +52586 -1.000000 +52587 -1.000000 +52590 -1.000000 +52591 -1.000000 +52592 -1.000000 +52593 -1.000000 +52594 -1.000000 +52595 -1.000000 +52596 -1.000000 +52597 -1.000000 +52598 -1.000000 +52599 -1.000000 +52600 -1.000000 +52601 -1.000000 +52602 -1.000000 +52603 -1.000000 +52604 -1.000000 +52605 -1.000000 +52606 -1.000000 +52607 -1.000000 +52608 -1.000000 +52609 -1.000000 +52610 -1.000000 +52611 -1.000000 +52612 -1.000000 +52613 -1.000000 +52614 -1.000000 +52615 -1.000000 +52616 -1.000000 +52617 -1.000000 +52618 -1.000000 +52619 -1.000000 +52620 -1.000000 +52621 -1.000000 +52622 -1.000000 +52623 -1.000000 +52624 -1.000000 +52625 -1.000000 +52626 -1.000000 +52627 -1.000000 +52628 -1.000000 +52629 -1.000000 +52630 -1.000000 +52631 -1.000000 +52632 -1.000000 +52633 -1.000000 +52634 -1.000000 +52635 -1.000000 +52636 -1.000000 +52637 -1.000000 +52638 -1.000000 +52639 -1.000000 +52640 -1.000000 +52641 -1.000000 +52642 -1.000000 +52643 -1.000000 +52644 -1.000000 +52645 -1.000000 +52646 -1.000000 +52647 -1.000000 +52648 -1.000000 +52649 -1.000000 +52650 -1.000000 +52651 -1.000000 +52652 -1.000000 +52653 -1.000000 +52654 -1.000000 +52655 -1.000000 +52656 -1.000000 +52657 -1.000000 +52658 -1.000000 +52659 -1.000000 +52660 -1.000000 +52661 -1.000000 +52662 -1.000000 +52663 -1.000000 +52664 -1.000000 +52665 -1.000000 +52666 -1.000000 +52667 -1.000000 +52668 -1.000000 +52669 -1.000000 +52670 -1.000000 +52671 -1.000000 +52672 -1.000000 +52673 -1.000000 +52674 -1.000000 +52675 -1.000000 +52676 -1.000000 +52738 -1.000000 +52751 -1.000000 +52753 -1.000000 +52754 -1.000000 +52755 -1.000000 +52756 -1.000000 +52757 -1.000000 +52758 -1.000000 +52759 -1.000000 +52760 -1.000000 +52761 -1.000000 +52762 -1.000000 +52763 -1.000000 +52764 -1.000000 +52765 -1.000000 +52766 -1.000000 +52767 -1.000000 +52768 -1.000000 +52769 -1.000000 +52770 -1.000000 +52771 -1.000000 +52772 -1.000000 +52773 -1.000000 +52774 -1.000000 +52775 -1.000000 +52776 -1.000000 +52777 -1.000000 +52778 -1.000000 +52779 -1.000000 +52780 -1.000000 +52781 -1.000000 +52782 -1.000000 +52783 -1.000000 +52784 -1.000000 +52785 -1.000000 +52786 -1.000000 +52787 -1.000000 +52788 -1.000000 +52789 -1.000000 +52790 -1.000000 +52791 -1.000000 +52792 -1.000000 +52793 -1.000000 +52794 -1.000000 +52795 -1.000000 +52796 -1.000000 +52797 -1.000000 +52798 -1.000000 +52799 -1.000000 +52800 -1.000000 +52801 -1.000000 +52802 -1.000000 +52803 -1.000000 +52804 -1.000000 +52805 -1.000000 +52806 -1.000000 +52807 -1.000000 +52808 -1.000000 +52809 -1.000000 +52810 -1.000000 +52811 -1.000000 +52812 -1.000000 +52813 -1.000000 +52814 -1.000000 +52815 -1.000000 +52816 -1.000000 +52817 -1.000000 +52818 -1.000000 +52819 -1.000000 +52820 -1.000000 +52821 -1.000000 +52823 -1.000000 +52825 -1.000000 +52826 -1.000000 +52827 -1.000000 +52828 -1.000000 +52829 -1.000000 +52830 -1.000000 +52831 -1.000000 +52832 -1.000000 +52833 -1.000000 +52834 -1.000000 +52835 -1.000000 +52836 -1.000000 +52837 -1.000000 +52838 -1.000000 +52840 -1.000000 +52841 -1.000000 +52842 -1.000000 +52843 -1.000000 +52844 -1.000000 +52845 -1.000000 +52846 -1.000000 +52847 -1.000000 +52848 -1.000000 +52849 -1.000000 +52850 -1.000000 +52851 -1.000000 +52852 -1.000000 +52853 -1.000000 +52855 -1.000000 +52856 -1.000000 +52857 -1.000000 +52858 -1.000000 +52859 -1.000000 +52860 -1.000000 +52861 -1.000000 +52862 -1.000000 +52863 -1.000000 +52864 -1.000000 +52865 -1.000000 +52866 -1.000000 +52867 -1.000000 +52868 -1.000000 +52869 -1.000000 +52872 -1.000000 +52873 -1.000000 +52874 -1.000000 +52875 -1.000000 +52876 -1.000000 +52877 -1.000000 +52878 -1.000000 +52879 -1.000000 +52880 -1.000000 +52881 -1.000000 +52882 -1.000000 +52883 -1.000000 +52884 -1.000000 +52885 -1.000000 +52886 -1.000000 +52887 -1.000000 +52888 -1.000000 +52889 -1.000000 +52890 -1.000000 +52891 -1.000000 +52892 -1.000000 +52893 -1.000000 +52894 -1.000000 +52895 -1.000000 +52896 -1.000000 +52897 -1.000000 +52898 -1.000000 +52899 -1.000000 +52900 -1.000000 +52901 -1.000000 +52902 -1.000000 +52903 -1.000000 +52904 -1.000000 +52905 -1.000000 +52906 -1.000000 +52907 -1.000000 +52908 -1.000000 +52909 -1.000000 +52910 -1.000000 +52911 -1.000000 +52912 -1.000000 +52913 -1.000000 +52914 -1.000000 +52915 -1.000000 +52916 -1.000000 +52917 -1.000000 +52918 -1.000000 +52919 -1.000000 +52920 -1.000000 +52927 -1.000000 +52928 -1.000000 +52929 -1.000000 +52930 -1.000000 +52931 -1.000000 +52932 -1.000000 +52933 -1.000000 +52934 -1.000000 +52935 -1.000000 +52936 -1.000000 +52937 -1.000000 +52938 -1.000000 +52939 -1.000000 +52940 -1.000000 +52941 -1.000000 +52942 -1.000000 +52943 -1.000000 +52944 -1.000000 +52945 -1.000000 +52946 -1.000000 +52947 -1.000000 +52948 -1.000000 +52949 -1.000000 +52950 -1.000000 +52951 -1.000000 +52952 -1.000000 +52953 -1.000000 +52954 -1.000000 +52955 -1.000000 +52956 -1.000000 +52957 -1.000000 +52958 -1.000000 +52959 -1.000000 +52960 -1.000000 +52961 -1.000000 +52962 -1.000000 +52963 -1.000000 +52964 -1.000000 +52965 -1.000000 +52966 -1.000000 +52967 -1.000000 +52968 -1.000000 +52969 -1.000000 +52970 -1.000000 +52971 -1.000000 +52972 -1.000000 +52973 -1.000000 +52974 -1.000000 +52975 -1.000000 +52976 -1.000000 +52977 -1.000000 +52978 -1.000000 +52979 -1.000000 +52980 -1.000000 +52981 -1.000000 +52982 -1.000000 +52983 -1.000000 +52984 -1.000000 +52985 -1.000000 +52986 -1.000000 +52987 -1.000000 +52988 -1.000000 +52989 -1.000000 +52990 -1.000000 +52991 -1.000000 +52992 -1.000000 +52993 -1.000000 +52994 -1.000000 +52995 -1.000000 +52996 -1.000000 +52997 -1.000000 +52998 -1.000000 +52999 -1.000000 +53000 -1.000000 +53001 -1.000000 +53003 -1.000000 +53004 -1.000000 +53005 -1.000000 +53006 -1.000000 +53007 -1.000000 +53008 -1.000000 +53009 -1.000000 +53010 -1.000000 +53011 -1.000000 +53012 -1.000000 +53013 -1.000000 +53014 -1.000000 +53015 -1.000000 +53016 -1.000000 +53017 -1.000000 +53018 -1.000000 +53019 -1.000000 +53020 -1.000000 +53021 -1.000000 +53022 -1.000000 +53023 -1.000000 +53024 -1.000000 +53025 -1.000000 +53026 -1.000000 +53027 -1.000000 +53028 -1.000000 +53029 -1.000000 +53030 -1.000000 +53031 -1.000000 +53032 -1.000000 +53033 -1.000000 +53034 -1.000000 +53035 -1.000000 +53036 -1.000000 +53037 -1.000000 +53038 -1.000000 +53039 -1.000000 +53040 -1.000000 +53041 -1.000000 +53042 -1.000000 +53043 -1.000000 +53044 -1.000000 +53045 -1.000000 +53046 -1.000000 +53047 -1.000000 +53048 -1.000000 +53049 -1.000000 +53050 -1.000000 +53051 -1.000000 +53052 -1.000000 +53053 -1.000000 +53054 -1.000000 +53055 -1.000000 +53056 -1.000000 +53057 -1.000000 +53058 -1.000000 +53073 -1.000000 +53074 -1.000000 +53075 -1.000000 +53076 -1.000000 +53077 -1.000000 +53078 -1.000000 +53079 -1.000000 +53080 -1.000000 +53081 -1.000000 +53082 -1.000000 +53083 -1.000000 +53084 -1.000000 +53085 -1.000000 +53086 -1.000000 +53087 -1.000000 +53088 -1.000000 +53089 -1.000000 +53090 -1.000000 +53091 -1.000000 +53092 -1.000000 +53093 -1.000000 +53094 -1.000000 +53095 -1.000000 +53096 -1.000000 +53097 -1.000000 +53098 -1.000000 +53099 -1.000000 +53100 -1.000000 +53101 -1.000000 +53102 -1.000000 +53103 -1.000000 +53104 -1.000000 +53105 -1.000000 +53106 -1.000000 +53107 -1.000000 +53108 -1.000000 +53109 -1.000000 +53110 -1.000000 +53111 -1.000000 +53112 -1.000000 +53113 -1.000000 +53114 -1.000000 +53115 -1.000000 +53116 -1.000000 +53117 -1.000000 +53118 -1.000000 +53119 -1.000000 +53120 -1.000000 +53121 -1.000000 +53122 -1.000000 +53123 -1.000000 +53124 -1.000000 +53125 -1.000000 +53126 -1.000000 +53127 -1.000000 +53128 -1.000000 +53129 -1.000000 +53130 -1.000000 +53131 -1.000000 +53132 -1.000000 +53133 -1.000000 +53134 -1.000000 +53135 -1.000000 +53136 -1.000000 +53137 -1.000000 +53138 -1.000000 +53139 -1.000000 +53140 -1.000000 +53141 -1.000000 +53142 -1.000000 +53143 -1.000000 +53144 -1.000000 +53145 -1.000000 +53146 -1.000000 +53147 -1.000000 +53148 -1.000000 +53149 -1.000000 +53150 -1.000000 +53151 -1.000000 +53152 -1.000000 +53153 -1.000000 +53156 -1.000000 +53157 -1.000000 +53158 -1.000000 +53159 -1.000000 +53160 -1.000000 +53161 -1.000000 +53162 -1.000000 +53163 -1.000000 +53164 -1.000000 +53165 -1.000000 +53166 -1.000000 +53167 -1.000000 +53168 -1.000000 +53169 -1.000000 +53170 -1.000000 +53171 -1.000000 +53177 -1.000000 +53178 -1.000000 +53179 -1.000000 +53180 -1.000000 +53181 -1.000000 +53182 -1.000000 +53183 -1.000000 +53184 -1.000000 +53185 -1.000000 +53186 -1.000000 +53187 -1.000000 +53188 -1.000000 +53189 -1.000000 +53190 -1.000000 +53191 -1.000000 +53192 -1.000000 +53193 -1.000000 +53194 -1.000000 +53195 -1.000000 +53196 -1.000000 +53197 -1.000000 +53198 -1.000000 +53199 -1.000000 +53200 -1.000000 +53201 -1.000000 +53202 -1.000000 +53203 -1.000000 +53204 -1.000000 +53205 -1.000000 +53206 -1.000000 +53207 -1.000000 +53208 -1.000000 +53209 -1.000000 +53210 -1.000000 +53211 -1.000000 +53212 -1.000000 +53214 -1.000000 +53215 -1.000000 +53216 -1.000000 +53217 -1.000000 +53218 -1.000000 +53219 -1.000000 +53220 -1.000000 +53221 -1.000000 +53222 -1.000000 +53223 -1.000000 +53224 -1.000000 +53225 -1.000000 +53226 -1.000000 +53227 -1.000000 +53228 -1.000000 +53229 -1.000000 +53230 -1.000000 +53231 -1.000000 +53232 -1.000000 +53233 -1.000000 +53234 -1.000000 +53235 -1.000000 +53236 -1.000000 +53237 -1.000000 +53238 -1.000000 +53239 -1.000000 +53241 -1.000000 +53242 -1.000000 +53243 -1.000000 +53244 -1.000000 +53245 -1.000000 +53246 -1.000000 +53247 -1.000000 +53248 -1.000000 +53249 -1.000000 +53250 -1.000000 +53251 -1.000000 +53252 -1.000000 +53253 -1.000000 +53254 -1.000000 +53255 -1.000000 +53256 -1.000000 +53257 -1.000000 +53258 -1.000000 +53259 -1.000000 +53260 -1.000000 +53261 -1.000000 +53262 -1.000000 +53263 -1.000000 +53264 -1.000000 +53265 -1.000000 +53266 -1.000000 +53267 -1.000000 +53268 -1.000000 +53269 -1.000000 +53270 -1.000000 +53271 -1.000000 +53272 -1.000000 +53273 -1.000000 +53274 -1.000000 +53275 -1.000000 +53276 -1.000000 +53277 -1.000000 +53278 -1.000000 +53279 -1.000000 +53280 -1.000000 +53281 -1.000000 +53282 -1.000000 +53283 -1.000000 +53284 -1.000000 +53285 -1.000000 +53287 -1.000000 +53288 -1.000000 +53289 -1.000000 +53290 -1.000000 +53291 -1.000000 +53292 -1.000000 +53293 -1.000000 +53294 -1.000000 +53295 -1.000000 +53296 -1.000000 +53297 -1.000000 +53298 -1.000000 +53299 -1.000000 +53300 -1.000000 +53301 -1.000000 +53302 -1.000000 +53303 -1.000000 +53304 -1.000000 +53305 -1.000000 +53306 -1.000000 +53307 -1.000000 +53308 -1.000000 +53310 -1.000000 +53311 -1.000000 +53312 -1.000000 +53313 -1.000000 +53314 -1.000000 +53315 -1.000000 +53316 -1.000000 +53317 -1.000000 +53318 -1.000000 +53319 -1.000000 +53320 -1.000000 +53321 -1.000000 +53322 -1.000000 +53323 -1.000000 +53324 -1.000000 +53325 -1.000000 +53326 -1.000000 +53327 -1.000000 +53328 -1.000000 +53329 -1.000000 +53330 -1.000000 +53331 -1.000000 +53332 -1.000000 +53333 -1.000000 +53334 -1.000000 +53335 -1.000000 +53336 -1.000000 +53337 -1.000000 +53338 -1.000000 +53339 -1.000000 +53340 -1.000000 +53341 -1.000000 +53342 -1.000000 +53343 -1.000000 +53344 -1.000000 +53345 -1.000000 +53346 -1.000000 +53347 -1.000000 +53348 -1.000000 +53349 -1.000000 +53350 -1.000000 +53351 -1.000000 +53352 -1.000000 +53353 -1.000000 +53354 -1.000000 +53355 -1.000000 +53356 -1.000000 +53357 -1.000000 +53358 -1.000000 +53359 -1.000000 +53360 -1.000000 +53361 -1.000000 +53362 -1.000000 +53363 -1.000000 +53364 -1.000000 +53365 -1.000000 +53366 -1.000000 +53367 -1.000000 +53368 -1.000000 +53369 -1.000000 +53370 -1.000000 +53371 -1.000000 +53372 -1.000000 +53373 -1.000000 +53374 -1.000000 +53375 -1.000000 +53376 -1.000000 +53377 -1.000000 +53378 -1.000000 +53379 -1.000000 +53380 -1.000000 +53381 -1.000000 +53382 -1.000000 +53383 -1.000000 +53384 -1.000000 +53385 -1.000000 +53386 -1.000000 +53387 -1.000000 +53388 -1.000000 +53389 -1.000000 +53390 -1.000000 +53391 -1.000000 +53392 -1.000000 +53393 -1.000000 +53394 -1.000000 +53395 -1.000000 +53396 -1.000000 +53397 -1.000000 +53398 -1.000000 +53399 -1.000000 +53400 -1.000000 +53401 -1.000000 +53402 -1.000000 +53403 -1.000000 +53404 -1.000000 +53405 -1.000000 +53406 -1.000000 +53407 -1.000000 +53410 -1.000000 +53411 -1.000000 +53412 -1.000000 +53413 -1.000000 +53414 -1.000000 +53415 -1.000000 +53416 -1.000000 +53417 -1.000000 +53418 -1.000000 +53419 -1.000000 +53420 -1.000000 +53421 -1.000000 +53422 -1.000000 +53423 -1.000000 +53424 -1.000000 +53425 -1.000000 +53426 -1.000000 +53427 -1.000000 +53428 -1.000000 +53429 -1.000000 +53430 -1.000000 +53431 -1.000000 +53432 -1.000000 +53433 -1.000000 +53434 -1.000000 +53435 -1.000000 +53436 -1.000000 +53437 -1.000000 +53438 -1.000000 +53440 -1.000000 +53441 -1.000000 +53442 -1.000000 +53443 -1.000000 +53444 -1.000000 +53445 -1.000000 +53446 -1.000000 +53447 -1.000000 +53448 -1.000000 +53449 -1.000000 +53450 -1.000000 +53451 -1.000000 +53452 -1.000000 +53453 -1.000000 +53454 -1.000000 +53455 -1.000000 +53456 -1.000000 +53457 -1.000000 +53458 -1.000000 +53459 -1.000000 +53460 -1.000000 +53461 -1.000000 +53462 -1.000000 +53463 -1.000000 +53464 -1.000000 +53465 -1.000000 +53466 -1.000000 +53467 -1.000000 +53468 -1.000000 +53469 -1.000000 +53470 -1.000000 +53471 -1.000000 +53472 -1.000000 +53473 -1.000000 +53474 -1.000000 +53475 -1.000000 +53476 -1.000000 +53477 -1.000000 +53478 -1.000000 +53479 -1.000000 +53480 -1.000000 +53481 -1.000000 +53482 -1.000000 +53497 -1.000000 +53498 -1.000000 +53499 -1.000000 +53500 -1.000000 +53501 -1.000000 +53502 -1.000000 +53503 -1.000000 +53504 -1.000000 +53505 -1.000000 +53506 -1.000000 +53507 -1.000000 +53509 -1.000000 +53510 -1.000000 +53511 -1.000000 +53512 -1.000000 +53513 -1.000000 +53514 -1.000000 +53515 -1.000000 +53516 -1.000000 +53517 -1.000000 +53518 -1.000000 +53519 -1.000000 +53520 -1.000000 +53521 -1.000000 +53522 -1.000000 +53523 -1.000000 +53524 -1.000000 +53525 -1.000000 +53526 -1.000000 +53527 -1.000000 +53528 -1.000000 +53529 -1.000000 +53530 -1.000000 +53531 -1.000000 +53532 -1.000000 +53533 -1.000000 +53534 -1.000000 +53535 -1.000000 +53536 -1.000000 +53537 -1.000000 +53538 -1.000000 +53539 -1.000000 +53540 -1.000000 +53541 -1.000000 +53542 -1.000000 +53543 -1.000000 +53544 -1.000000 +53545 -1.000000 +53546 -1.000000 +53547 -1.000000 +53548 -1.000000 +53549 -1.000000 +53550 -1.000000 +53551 -1.000000 +53552 -1.000000 +53553 -1.000000 +53554 -1.000000 +53555 -1.000000 +53556 -1.000000 +53557 -1.000000 +53558 -1.000000 +53559 -1.000000 +53560 -1.000000 +53561 -1.000000 +53562 -1.000000 +53563 -1.000000 +53564 -1.000000 +53565 -1.000000 +53566 -1.000000 +53567 -1.000000 +53568 -1.000000 +53569 -1.000000 +53570 -1.000000 +53571 -1.000000 +53572 -1.000000 +53573 -1.000000 +53574 -1.000000 +53575 -1.000000 +53576 -1.000000 +53577 -1.000000 +53578 -1.000000 +53579 -1.000000 +53580 -1.000000 +53581 -1.000000 +53582 -1.000000 +53584 -1.000000 +53585 -1.000000 +53586 -1.000000 +53587 -1.000000 +53588 -1.000000 +53589 -1.000000 +53590 -1.000000 +53591 -1.000000 +53592 -1.000000 +53593 -1.000000 +53594 -1.000000 +53595 -1.000000 +53596 -1.000000 +53597 -1.000000 +53598 -1.000000 +53599 -1.000000 +53600 -1.000000 +53601 -1.000000 +53602 -1.000000 +53603 -1.000000 +53604 -1.000000 +53605 -1.000000 +53606 -1.000000 +53607 -1.000000 +53608 -1.000000 +53609 -1.000000 +53610 -1.000000 +53611 -1.000000 +53613 -1.000000 +53614 -1.000000 +53615 -1.000000 +53616 -1.000000 +53617 -1.000000 +53618 -1.000000 +53619 -1.000000 +53620 -1.000000 +53621 -1.000000 +53622 -1.000000 +53623 -1.000000 +53624 -1.000000 +53625 -1.000000 +53626 -1.000000 +53627 -1.000000 +53628 -1.000000 +53629 -1.000000 +53630 -1.000000 +53631 -1.000000 +53632 -1.000000 +53633 -1.000000 +53634 -1.000000 +53635 -1.000000 +53636 -1.000000 +53637 -1.000000 +53638 -1.000000 +53639 -1.000000 +53641 -1.000000 +53642 -1.000000 +53643 -1.000000 +53644 -1.000000 +53645 -1.000000 +53646 -1.000000 +53647 -1.000000 +53648 -1.000000 +53649 -1.000000 +53650 -1.000000 +53651 -1.000000 +53652 -1.000000 +53653 -1.000000 +53654 -1.000000 +53655 -1.000000 +53656 -1.000000 +53657 -1.000000 +53658 -1.000000 +53659 -1.000000 +53660 -1.000000 +53661 -1.000000 +53662 -1.000000 +53663 -1.000000 +53664 -1.000000 +53665 -1.000000 +53666 -1.000000 +53667 -1.000000 +53668 -1.000000 +53669 -1.000000 +53670 -1.000000 +53671 -1.000000 +53672 -1.000000 +53673 -1.000000 +53674 -1.000000 +53675 -1.000000 +53676 -1.000000 +53677 -1.000000 +53678 -1.000000 +53679 -1.000000 +53680 -1.000000 +53681 -1.000000 +53682 -1.000000 +53683 -1.000000 +53684 -1.000000 +53685 -1.000000 +53686 -1.000000 +53687 -1.000000 +53688 -1.000000 +53689 -1.000000 +53690 -1.000000 +53691 -1.000000 +53692 -1.000000 +53693 -1.000000 +53694 -1.000000 +53695 -1.000000 +53696 -1.000000 +53697 -1.000000 +53698 -1.000000 +53699 -1.000000 +53700 -1.000000 +53701 -1.000000 +53702 -1.000000 +53703 -1.000000 +53704 -1.000000 +53705 -1.000000 +53706 -1.000000 +53707 -1.000000 +53708 -1.000000 +53709 -1.000000 +53710 -1.000000 +53711 -1.000000 +53712 -1.000000 +53713 -1.000000 +53714 -1.000000 +53715 -1.000000 +53716 -1.000000 +53717 -1.000000 +53718 -1.000000 +53719 -1.000000 +53720 -1.000000 +53721 -1.000000 +53722 -1.000000 +53723 -1.000000 +53724 -1.000000 +53725 -1.000000 +53726 -1.000000 +53727 -1.000000 +53728 -1.000000 +53729 -1.000000 +53730 -1.000000 +53731 -1.000000 +53733 -1.000000 +53734 -1.000000 +53735 -1.000000 +53736 -1.000000 +53737 -1.000000 +53738 -1.000000 +53739 -1.000000 +53740 -1.000000 +53741 -1.000000 +53742 -1.000000 +53743 -1.000000 +53744 -1.000000 +53745 -1.000000 +53746 -1.000000 +53747 -1.000000 +53748 -1.000000 +53749 -1.000000 +53750 -1.000000 +53751 -1.000000 +53752 -1.000000 +53753 -1.000000 +53754 -1.000000 +53755 -1.000000 +53756 -1.000000 +53757 -1.000000 +53758 -1.000000 +53759 -1.000000 +53760 -1.000000 +53761 -1.000000 +53762 -1.000000 +53763 -1.000000 +53764 -1.000000 +53765 -1.000000 +53766 -1.000000 +53767 -1.000000 +53768 -1.000000 +53769 -1.000000 +53770 -1.000000 +53771 -1.000000 +53772 -1.000000 +53773 -1.000000 +53774 -1.000000 +53775 -1.000000 +53776 -1.000000 +53777 -1.000000 +53778 -1.000000 +53779 -1.000000 +53780 -1.000000 +53781 -1.000000 +53782 -1.000000 +53783 -1.000000 +53784 -1.000000 +53785 -1.000000 +53786 -1.000000 +53787 -1.000000 +53788 -1.000000 +53789 -1.000000 +53790 -1.000000 +53791 -1.000000 +53792 -1.000000 +53793 -1.000000 +53794 -1.000000 +53795 -1.000000 +53796 -1.000000 +53797 -1.000000 +53798 -1.000000 +53799 -1.000000 +53800 -1.000000 +53801 -1.000000 +53802 -1.000000 +53803 -1.000000 +53804 -1.000000 +53805 -1.000000 +53806 -1.000000 +53807 -1.000000 +53810 -1.000000 +53811 -1.000000 +53812 -1.000000 +53813 -1.000000 +53814 -1.000000 +53815 -1.000000 +53816 -1.000000 +53817 -1.000000 +53818 -1.000000 +53819 -1.000000 +53820 -1.000000 +53821 -1.000000 +53822 -1.000000 +53823 -1.000000 +53824 -1.000000 +53825 -1.000000 +53826 -1.000000 +53827 -1.000000 +53828 -1.000000 +53829 -1.000000 +53830 -1.000000 +53831 -1.000000 +53832 -1.000000 +53833 -1.000000 +53834 -1.000000 +53835 -1.000000 +53836 -1.000000 +53837 -1.000000 +53838 -1.000000 +53840 -1.000000 +53841 -1.000000 +53842 -1.000000 +53843 -1.000000 +53844 -1.000000 +53845 -1.000000 +53846 -1.000000 +53847 -1.000000 +53848 -1.000000 +53849 -1.000000 +53850 -1.000000 +53851 -1.000000 +53852 -1.000000 +53853 -1.000000 +53854 -1.000000 +53855 -1.000000 +53856 -1.000000 +53857 -1.000000 +53858 -1.000000 +53859 -1.000000 +53860 -1.000000 +53861 -1.000000 +53863 -1.000000 +53864 -1.000000 +53865 -1.000000 +53866 -1.000000 +53867 -1.000000 +53868 -1.000000 +53869 -1.000000 +53870 -1.000000 +53871 -1.000000 +53872 -1.000000 +53873 -1.000000 +53874 -1.000000 +53875 -1.000000 +53876 -1.000000 +53877 -1.000000 +53878 -1.000000 +53879 -1.000000 +53880 -1.000000 +53881 -1.000000 +53882 -1.000000 +53883 -1.000000 +53884 -1.000000 +53885 -1.000000 +53886 -1.000000 +53888 -1.000000 +53889 -1.000000 +53890 -1.000000 +53891 -1.000000 +53892 -1.000000 +53893 -1.000000 +53894 -1.000000 +53895 -1.000000 +53896 -1.000000 +53897 -1.000000 +53898 -1.000000 +53899 -1.000000 +53902 -1.000000 +53903 -1.000000 +53904 -1.000000 +53905 -1.000000 +53906 -1.000000 +53907 -1.000000 +53908 -1.000000 +53909 -1.000000 +53910 -1.000000 +53911 -1.000000 +53912 -1.000000 +53913 -1.000000 +53914 -1.000000 +53915 -1.000000 +53916 -1.000000 +53917 -1.000000 +53918 -1.000000 +53919 -1.000000 +53920 -1.000000 +53921 -1.000000 +53922 -1.000000 +53923 -1.000000 +53924 -1.000000 +53925 -1.000000 +53926 -1.000000 +53927 -1.000000 +53928 -1.000000 +53929 -1.000000 +53930 -1.000000 +53931 -1.000000 +53932 -1.000000 +53933 -1.000000 +53934 -1.000000 +53935 -1.000000 +53936 -1.000000 +53937 -1.000000 +53938 -1.000000 +53939 -1.000000 +53940 -1.000000 +53941 -1.000000 +53942 -1.000000 +53943 -1.000000 +53944 -1.000000 +53945 -1.000000 +53946 -1.000000 +53947 -1.000000 +53948 -1.000000 +53949 -1.000000 +53950 -1.000000 +53951 -1.000000 +53952 -1.000000 +53953 -1.000000 +53954 -1.000000 +53955 -1.000000 +53956 -1.000000 +53957 -1.000000 +53958 -1.000000 +53959 -1.000000 +53960 -1.000000 +53961 -1.000000 +53962 -1.000000 +53963 -1.000000 +53964 -1.000000 +53965 -1.000000 +53966 -1.000000 +53967 -1.000000 +53968 -1.000000 +53969 -1.000000 +53971 -1.000000 +53972 -1.000000 +53973 -1.000000 +53974 -1.000000 +53975 -1.000000 +53976 -1.000000 +53977 -1.000000 +53978 -1.000000 +53979 -1.000000 +53980 -1.000000 +53981 -1.000000 +53982 -1.000000 +53983 -1.000000 +53984 -1.000000 +53985 -1.000000 +53986 -1.000000 +53987 -1.000000 +53988 -1.000000 +53989 -1.000000 +53990 -1.000000 +53991 -1.000000 +53992 -1.000000 +53993 -1.000000 +53994 -1.000000 +53995 -1.000000 +53996 -1.000000 +53997 -1.000000 +53998 -1.000000 +53999 -1.000000 +54000 -1.000000 +54001 -1.000000 +54002 -1.000000 +54003 -1.000000 +54004 -1.000000 +54005 -1.000000 +54006 -1.000000 +54007 -1.000000 +54008 -1.000000 +54009 -1.000000 +54010 -1.000000 +54011 -1.000000 +54012 -1.000000 +54013 -1.000000 +54014 -1.000000 +54015 -1.000000 +54016 -1.000000 +54017 -1.000000 +54018 -1.000000 +54019 -1.000000 +54020 -1.000000 +54021 -1.000000 +54023 -1.000000 +54024 -1.000000 +54025 -1.000000 +54026 -1.000000 +54027 -1.000000 +54028 -1.000000 +54029 -1.000000 +54030 -1.000000 +54031 -1.000000 +54032 -1.000000 +54033 -1.000000 +54034 -1.000000 +54035 -1.000000 +54036 -1.000000 +54037 -1.000000 +54038 -1.000000 +54039 -1.000000 +54040 -1.000000 +54041 -1.000000 +54042 -1.000000 +54043 -1.000000 +54044 -1.000000 +54045 -1.000000 +54046 -1.000000 +54047 -1.000000 +54048 -1.000000 +54049 -1.000000 +54050 -1.000000 +54051 -1.000000 +54052 -1.000000 +54053 -1.000000 +54054 -1.000000 +54055 -1.000000 +54056 -1.000000 +54057 -1.000000 +54058 -1.000000 +54059 -1.000000 +54060 -1.000000 +54061 -1.000000 +54062 -1.000000 +54063 -1.000000 +54064 -1.000000 +54065 -1.000000 +54066 -1.000000 +54067 -1.000000 +54068 -1.000000 +54069 -1.000000 +54070 -1.000000 +54071 -1.000000 +54072 -1.000000 +54073 -1.000000 +54074 -1.000000 +54075 -1.000000 +54076 -1.000000 +54077 -1.000000 +54078 -1.000000 +54079 -1.000000 +54080 -1.000000 +54081 -1.000000 +54082 -1.000000 +54083 -1.000000 +54084 -1.000000 +54085 -1.000000 +54086 -1.000000 +54087 -1.000000 +54088 -1.000000 +54089 -1.000000 +54090 -1.000000 +54091 -1.000000 +54092 -1.000000 +54093 -1.000000 +54094 -1.000000 +54095 -1.000000 +54096 -1.000000 +54097 -1.000000 +54098 -1.000000 +54099 -1.000000 +54100 -1.000000 +54101 -1.000000 +54102 -1.000000 +54103 -1.000000 +54104 -1.000000 +54105 -1.000000 +54106 -1.000000 +54107 -1.000000 +54108 -1.000000 +54109 -1.000000 +54110 -1.000000 +54111 -1.000000 +54112 -1.000000 +54113 -1.000000 +54114 -1.000000 +54115 -1.000000 +54116 -1.000000 +54117 -1.000000 +54118 -1.000000 +54119 -1.000000 +54120 -1.000000 +54121 -1.000000 +54122 -1.000000 +54123 -1.000000 +54124 -1.000000 +54125 -1.000000 +54126 -1.000000 +54127 -1.000000 +54128 -1.000000 +54129 -1.000000 +54130 -1.000000 +54131 -1.000000 +54132 -1.000000 +54133 -1.000000 +54134 -1.000000 +54135 -1.000000 +54136 -1.000000 +54139 -1.000000 +54140 -1.000000 +54141 -1.000000 +54142 -1.000000 +54143 -1.000000 +54144 -1.000000 +54145 -1.000000 +54146 -1.000000 +54147 -1.000000 +54148 -1.000000 +54149 -1.000000 +54150 -1.000000 +54151 -1.000000 +54152 -1.000000 +54153 -1.000000 +54154 -1.000000 +54155 -1.000000 +54156 -1.000000 +54157 -1.000000 +54158 -1.000000 +54159 -1.000000 +54160 -1.000000 +54161 -1.000000 +54162 -1.000000 +54163 -1.000000 +54164 -1.000000 +54165 -1.000000 +54166 -1.000000 +54167 -1.000000 +54168 -1.000000 +54169 -1.000000 +54170 -1.000000 +54171 -1.000000 +54172 -1.000000 +54173 -1.000000 +54174 -1.000000 +54175 -1.000000 +54176 -1.000000 +54177 -1.000000 +54178 -1.000000 +54179 -1.000000 +54180 -1.000000 +54181 -1.000000 +54182 -1.000000 +54183 -1.000000 +54184 -1.000000 +54185 -1.000000 +54186 -1.000000 +54187 -1.000000 +54188 -1.000000 +54189 -1.000000 +54190 -1.000000 +54191 -1.000000 +54192 -1.000000 +54193 -1.000000 +54194 -1.000000 +54195 -1.000000 +54196 -1.000000 +54197 -1.000000 +54198 -1.000000 +54199 -1.000000 +54200 -1.000000 +54201 -1.000000 +54202 -1.000000 +54203 -1.000000 +54204 -1.000000 +54205 -1.000000 +54206 -1.000000 +54207 -1.000000 +54208 -1.000000 +54209 -1.000000 +54210 -1.000000 +54211 -1.000000 +54212 -1.000000 +54213 -1.000000 +54214 -1.000000 +54215 -1.000000 +54216 -1.000000 +54217 -1.000000 +54218 -1.000000 +54219 -1.000000 +54220 -1.000000 +54221 -1.000000 +54222 -1.000000 +54223 -1.000000 +54224 -1.000000 +54225 -1.000000 +54226 -1.000000 +54227 -1.000000 +54228 -1.000000 +54229 -1.000000 +54230 -1.000000 +54231 -1.000000 +54232 -1.000000 +54233 -1.000000 +54234 -1.000000 +54235 -1.000000 +54236 -1.000000 +54237 -1.000000 +54238 -1.000000 +54239 -1.000000 +54240 -1.000000 +54241 -1.000000 +54242 -1.000000 +54243 -1.000000 +54244 -1.000000 +54245 -1.000000 +54246 -1.000000 +54247 -1.000000 +54248 -1.000000 +54249 -1.000000 +54250 -1.000000 +54251 -1.000000 +54252 -1.000000 +54253 -1.000000 +54254 -1.000000 +54255 -1.000000 +54256 -1.000000 +54257 -1.000000 +54258 -1.000000 +54259 -1.000000 +54260 -1.000000 +54261 -1.000000 +54262 -1.000000 +54263 -1.000000 +54264 -1.000000 +54265 -1.000000 +54266 -1.000000 +54267 -1.000000 +54269 -1.000000 +54270 -1.000000 +54272 -1.000000 +54273 -1.000000 +54274 -1.000000 +54275 -1.000000 +54276 -1.000000 +54277 -1.000000 +54279 -1.000000 +54280 -1.000000 +54281 -1.000000 +54282 -1.000000 +54283 -1.000000 +54284 -1.000000 +54285 -1.000000 +54286 -1.000000 +54288 -1.000000 +54289 -1.000000 +54290 -1.000000 +54291 -1.000000 +54292 -1.000000 +54293 -1.000000 +54294 -1.000000 +54295 -1.000000 +54296 -1.000000 +54297 -1.000000 +54298 -1.000000 +54299 -1.000000 +54300 -1.000000 +54301 -1.000000 +54302 -1.000000 +54303 -1.000000 +54304 -1.000000 +54305 -1.000000 +54306 -1.000000 +54307 -1.000000 +54308 -1.000000 +54309 -1.000000 +54310 -1.000000 +54311 -1.000000 +54312 -1.000000 +54313 -1.000000 +54314 -1.000000 +54315 -1.000000 +54316 -1.000000 +54317 -1.000000 +54318 -1.000000 +54319 -1.000000 +54320 -1.000000 +54321 -1.000000 +54322 -1.000000 +54323 -1.000000 +54324 -1.000000 +54325 -1.000000 +54326 -1.000000 +54327 -1.000000 +54328 -1.000000 +54329 -1.000000 +54330 -1.000000 +54331 -1.000000 +54332 -1.000000 +54333 -1.000000 +54334 -1.000000 +54335 -1.000000 +54336 -1.000000 +54337 -1.000000 +54338 -1.000000 +54339 -1.000000 +54340 -1.000000 +54341 -1.000000 +54342 -1.000000 +54343 -1.000000 +54344 -1.000000 +54345 -1.000000 +54346 -1.000000 +54347 -1.000000 +54348 -1.000000 +54349 -1.000000 +54350 -1.000000 +54351 -1.000000 +54352 -1.000000 +54353 -1.000000 +54354 -1.000000 +54355 -1.000000 +54356 -1.000000 +54357 -1.000000 +54358 -1.000000 +54359 -1.000000 +54360 -1.000000 +54361 -1.000000 +54362 -1.000000 +54363 -1.000000 +54364 -1.000000 +54365 -1.000000 +54366 -1.000000 +54367 -1.000000 +54368 -1.000000 +54369 -1.000000 +54370 -1.000000 +54371 -1.000000 +54372 -1.000000 +54373 -1.000000 +54374 -1.000000 +54375 -1.000000 +54376 -1.000000 +54377 -1.000000 +54378 -1.000000 +54379 -1.000000 +54380 -1.000000 +54381 -1.000000 +54382 -1.000000 +54383 -1.000000 +54384 -1.000000 +54385 -1.000000 +54386 -1.000000 +54387 -1.000000 +54388 -1.000000 +54389 -1.000000 +54390 -1.000000 +54391 -1.000000 +54392 -1.000000 +54393 -1.000000 +54394 -1.000000 +54395 -1.000000 +54396 -1.000000 +54397 -1.000000 +54398 -1.000000 +54399 -1.000000 +54400 -1.000000 +54401 -1.000000 +54402 -1.000000 +54403 -1.000000 +54404 -1.000000 +54405 -1.000000 +54406 -1.000000 +54407 -1.000000 +54408 -1.000000 +54409 -1.000000 +54410 -1.000000 +54411 -1.000000 +54412 -1.000000 +54413 -1.000000 +54414 -1.000000 +54415 -1.000000 +54416 -1.000000 +54417 -1.000000 +54418 -1.000000 +54419 -1.000000 +54420 -1.000000 +54421 -1.000000 +54422 -1.000000 +54423 -1.000000 +54424 -1.000000 +54425 -1.000000 +54426 -1.000000 +54435 -1.000000 +54436 -1.000000 +54438 -1.000000 +54439 -1.000000 +54441 -1.000000 +54442 -1.000000 +54444 -1.000000 +54445 -1.000000 +54446 -1.000000 +54447 -1.000000 +54448 -1.000000 +54449 -1.000000 +54450 -1.000000 +54451 -1.000000 +54452 -1.000000 +54453 -1.000000 +54454 -1.000000 +54455 -1.000000 +54456 -1.000000 +54457 -1.000000 +54458 -1.000000 +54459 -1.000000 +54460 -1.000000 +54461 -1.000000 +54462 -1.000000 +54463 -1.000000 +54464 -1.000000 +54465 -1.000000 +54466 -1.000000 +54467 -1.000000 +54468 -1.000000 +54469 -1.000000 +54470 -1.000000 +54471 -1.000000 +54472 -1.000000 +54473 -1.000000 +54474 -1.000000 +54475 -1.000000 +54476 -1.000000 +54477 -1.000000 +54478 -1.000000 +54479 -1.000000 +54480 -1.000000 +54481 -1.000000 +54482 -1.000000 +54483 -1.000000 +54485 -1.000000 +54489 -1.000000 +54490 -1.000000 +54491 -1.000000 +54492 -1.000000 +54493 -1.000000 +54494 -1.000000 +54495 -1.000000 +54496 -1.000000 +54497 -1.000000 +54498 -1.000000 +54499 -1.000000 +54500 -1.000000 +54501 -1.000000 +54502 -1.000000 +54503 -1.000000 +54504 -1.000000 +54505 -1.000000 +54506 -1.000000 +54507 -1.000000 +54508 -1.000000 +54509 -1.000000 +54510 -1.000000 +54511 -1.000000 +54512 -1.000000 +54513 -1.000000 +54514 -1.000000 +54515 -1.000000 +54516 -1.000000 +54517 -1.000000 +54518 -1.000000 +54519 -1.000000 +54520 -1.000000 +54521 -1.000000 +54522 -1.000000 +54523 -1.000000 +54524 -1.000000 +54525 -1.000000 +54526 -1.000000 +54527 -1.000000 +54528 -1.000000 +54529 -1.000000 +54530 -1.000000 +54531 -1.000000 +54532 -1.000000 +54533 -1.000000 +54534 -1.000000 +54535 -1.000000 +54536 -1.000000 +54537 -1.000000 +54538 -1.000000 +54539 -1.000000 +54540 -1.000000 +54541 -1.000000 +54542 -1.000000 +54543 -1.000000 +54544 -1.000000 +54545 -1.000000 +54546 -1.000000 +54547 -1.000000 +54548 -1.000000 +54549 -1.000000 +54550 -1.000000 +54551 -1.000000 +54552 -1.000000 +54553 -1.000000 +54554 -1.000000 +54555 -1.000000 +54556 -1.000000 +54557 -1.000000 +54558 -1.000000 +54559 -1.000000 +54560 -1.000000 +54562 -1.000000 +54563 -1.000000 +54564 -1.000000 +54565 -1.000000 +54566 -1.000000 +54567 -1.000000 +54568 -1.000000 +54569 -1.000000 +54570 -1.000000 +54571 -1.000000 +54573 -1.000000 +54574 -1.000000 +54575 -1.000000 +54576 -1.000000 +54577 -1.000000 +54578 -1.000000 +54580 -1.000000 +54581 -1.000000 +54582 -1.000000 +54583 -1.000000 +54584 -1.000000 +54585 -1.000000 +54587 -1.000000 +54588 -1.000000 +54589 -1.000000 +54590 -1.000000 +54591 -1.000000 +54592 -1.000000 +54593 -1.000000 +54594 -1.000000 +54595 -1.000000 +54596 -1.000000 +54597 -1.000000 +54598 -1.000000 +54599 -1.000000 +54600 -1.000000 +54601 -1.000000 +54602 -1.000000 +54603 -1.000000 +54604 -1.000000 +54605 -1.000000 +54606 -1.000000 +54607 -1.000000 +54608 -1.000000 +54609 -1.000000 +54610 -1.000000 +54611 -1.000000 +54612 -1.000000 +54613 -1.000000 +54614 -1.000000 +54615 -1.000000 +54616 -1.000000 +54617 -1.000000 +54618 -1.000000 +54619 -1.000000 +54620 -1.000000 +54621 -1.000000 +54622 -1.000000 +54623 -1.000000 +54624 -1.000000 +54625 -1.000000 +54626 -1.000000 +54627 -1.000000 +54628 -1.000000 +54629 -1.000000 +54630 -1.000000 +54631 -1.000000 +54632 -1.000000 +54633 -1.000000 +54634 -1.000000 +54635 -1.000000 +54636 -1.000000 +54638 -1.000000 +54639 -1.000000 +54640 -1.000000 +54641 -1.000000 +54642 -1.000000 +54643 -1.000000 +54644 -1.000000 +54645 -1.000000 +54646 -1.000000 +54647 -1.000000 +54648 -1.000000 +54649 -1.000000 +54650 -1.000000 +54651 -1.000000 +54652 -1.000000 +54653 -1.000000 +54654 -1.000000 +54655 -1.000000 +54656 -1.000000 +54657 -1.000000 +54658 -1.000000 +54659 -1.000000 +54660 -1.000000 +54661 -1.000000 +54662 -1.000000 +54663 -1.000000 +54664 -1.000000 +54665 -1.000000 +54666 -1.000000 +54667 -1.000000 +54668 -1.000000 +54669 -1.000000 +54670 -1.000000 +54671 -1.000000 +54672 -1.000000 +54673 -1.000000 +54674 -1.000000 +54675 -1.000000 +54676 -1.000000 +54677 -1.000000 +54678 -1.000000 +54679 -1.000000 +54680 -1.000000 +54681 -1.000000 +54682 -1.000000 +54683 -1.000000 +54684 -1.000000 +54685 -1.000000 +54686 -1.000000 +54687 -1.000000 +54688 -1.000000 +54689 -1.000000 +54690 -1.000000 +54691 -1.000000 +54692 -1.000000 +54693 -1.000000 +54694 -1.000000 +54695 -1.000000 +54696 -1.000000 +54697 -1.000000 +54698 -1.000000 +54699 -1.000000 +54700 -1.000000 +54701 -1.000000 +54702 -1.000000 +54703 -1.000000 +54704 -1.000000 +54705 -1.000000 +54706 -1.000000 +54707 -1.000000 +54708 -1.000000 +54709 -1.000000 +54710 -1.000000 +54711 -1.000000 +54713 -1.000000 +54714 -1.000000 +54715 -1.000000 +54716 -1.000000 +54717 -1.000000 +54718 -1.000000 +54719 -1.000000 +54720 -1.000000 +54721 -1.000000 +54722 -1.000000 +54723 -1.000000 +54724 -1.000000 +54725 -1.000000 +54726 -1.000000 +54727 -1.000000 +54728 -1.000000 +54729 -1.000000 +54730 -1.000000 +54731 -1.000000 +54732 -1.000000 +54733 -1.000000 +54734 -1.000000 +54735 -1.000000 +54736 -1.000000 +54737 -1.000000 +54738 -1.000000 +54739 -1.000000 +54740 -1.000000 +54741 -1.000000 +54742 -1.000000 +54743 -1.000000 +54744 -1.000000 +54745 -1.000000 +54746 -1.000000 +54747 -1.000000 +54748 -1.000000 +54749 -1.000000 +54750 -1.000000 +54751 -1.000000 +54752 -1.000000 +54753 -1.000000 +54755 -1.000000 +54756 -1.000000 +54757 -1.000000 +54758 -1.000000 +54759 -1.000000 +54760 -1.000000 +54761 -1.000000 +54762 -1.000000 +54763 -1.000000 +54764 -1.000000 +54765 -1.000000 +54766 -1.000000 +54767 -1.000000 +54768 -1.000000 +54769 -1.000000 +54770 -1.000000 +54771 -1.000000 +54772 -1.000000 +54773 -1.000000 +54774 -1.000000 +54775 -1.000000 +54776 -1.000000 +54777 -1.000000 +54778 -1.000000 +54779 -1.000000 +54780 -1.000000 +54781 -1.000000 +54782 -1.000000 +54783 -1.000000 +54784 -1.000000 +54785 -1.000000 +54786 -1.000000 +54787 -1.000000 +54788 -1.000000 +54789 -1.000000 +54790 -1.000000 +54791 -1.000000 +54792 -1.000000 +54793 -1.000000 +54794 -1.000000 +54795 -1.000000 +54796 -1.000000 +54797 -1.000000 +54798 -1.000000 +54799 -1.000000 +54800 -1.000000 +54801 -1.000000 +54802 -1.000000 +54803 -1.000000 +54804 -1.000000 +54805 -1.000000 +54806 -1.000000 +54807 -1.000000 +54808 -1.000000 +54809 -1.000000 +54810 -1.000000 +54811 -1.000000 +54812 -1.000000 +54813 -1.000000 +54814 -1.000000 +54815 -1.000000 +54817 -1.000000 +54818 -1.000000 +54819 -1.000000 +54820 -1.000000 +54821 -1.000000 +54822 -1.000000 +54823 -1.000000 +54824 -1.000000 +54825 -1.000000 +54826 -1.000000 +54827 -1.000000 +54828 -1.000000 +54829 -1.000000 +54830 -1.000000 +54831 -1.000000 +54832 -1.000000 +54833 -1.000000 +54834 -1.000000 +54835 -1.000000 +54836 -1.000000 +54837 -1.000000 +54838 -1.000000 +54839 -1.000000 +54840 -1.000000 +54841 -1.000000 +54842 -1.000000 +54843 -1.000000 +54844 -1.000000 +54845 -1.000000 +54846 -1.000000 +54847 -1.000000 +54848 -1.000000 +54849 -1.000000 +54850 -1.000000 +54851 -1.000000 +54852 -1.000000 +54853 -1.000000 +54854 -1.000000 +54855 -1.000000 +54856 -1.000000 +54857 -1.000000 +54858 -1.000000 +54859 -1.000000 +54860 -1.000000 +54861 -1.000000 +54862 -1.000000 +54863 -1.000000 +54864 -1.000000 +54865 -1.000000 +54866 -1.000000 +54867 -1.000000 +54868 -1.000000 +54869 -1.000000 +54870 -1.000000 +54871 -1.000000 +54872 -1.000000 +54873 -1.000000 +54874 -1.000000 +54875 -1.000000 +54876 -1.000000 +54877 -1.000000 +54878 -1.000000 +54879 -1.000000 +54880 -1.000000 +54881 -1.000000 +54882 -1.000000 +54883 -1.000000 +54886 -1.000000 +54887 -1.000000 +54888 -1.000000 +54889 -1.000000 +54890 -1.000000 +54891 -1.000000 +54892 -1.000000 +54893 -1.000000 +54894 -1.000000 +54895 -1.000000 +54896 -1.000000 +54897 -1.000000 +54898 -1.000000 +54899 -1.000000 +54900 -1.000000 +54901 -1.000000 +54902 -1.000000 +54903 -1.000000 +54904 -1.000000 +54905 -1.000000 +54906 -1.000000 +54907 -1.000000 +54908 -1.000000 +54909 -1.000000 +54910 -1.000000 +54911 -1.000000 +54912 -1.000000 +54913 -1.000000 +54914 -1.000000 +54915 -1.000000 +54916 -1.000000 +54917 -1.000000 +54918 -1.000000 +54919 -1.000000 +54920 -1.000000 +54921 -1.000000 +54922 -1.000000 +54923 -1.000000 +54924 -1.000000 +54925 -1.000000 +54926 -1.000000 +54927 -1.000000 +54928 -1.000000 +54929 -1.000000 +54930 -1.000000 +54931 -1.000000 +54932 -1.000000 +54933 -1.000000 +54934 -1.000000 +54935 -1.000000 +54936 -1.000000 +54937 -1.000000 +54938 -1.000000 +54939 -1.000000 +54940 -1.000000 +54941 -1.000000 +54942 -1.000000 +54943 -1.000000 +54944 -1.000000 +54945 -1.000000 +54946 -1.000000 +54947 -1.000000 +54948 -1.000000 +54949 -1.000000 +54950 -1.000000 +54951 -1.000000 +54952 -1.000000 +54953 -1.000000 +54954 -1.000000 +54955 -1.000000 +54956 -1.000000 +54957 -1.000000 +54958 -1.000000 +54959 -1.000000 +54960 -1.000000 +54961 -1.000000 +54962 -1.000000 +54963 -1.000000 +54964 -1.000000 +54965 -1.000000 +54966 -1.000000 +54967 -1.000000 +54968 -1.000000 +54969 -1.000000 +54970 -1.000000 +54971 -1.000000 +54972 -1.000000 +54973 -1.000000 +54974 -1.000000 +54975 -1.000000 +54976 -1.000000 +54977 -1.000000 +54978 -1.000000 +54979 -1.000000 +54980 -1.000000 +54981 -1.000000 +54982 -1.000000 +54983 -1.000000 +54984 -1.000000 +54985 -1.000000 +54986 -1.000000 +54987 -1.000000 +54988 -1.000000 +54989 -1.000000 +54990 -1.000000 +54991 -1.000000 +54992 -1.000000 +54993 -1.000000 +54994 -1.000000 +54995 -1.000000 +54996 -1.000000 +54997 -1.000000 +54998 -1.000000 +54999 -1.000000 +55000 -1.000000 +55001 -1.000000 +55002 -1.000000 +55003 -1.000000 +55004 -1.000000 +55005 -1.000000 +55006 -1.000000 +55007 -1.000000 +55008 -1.000000 +55009 -1.000000 +55010 -1.000000 +55011 -1.000000 +55012 -1.000000 +55013 -1.000000 +55014 -1.000000 +55015 -1.000000 +55016 -1.000000 +55017 -1.000000 +55019 -1.000000 +55020 -1.000000 +55021 -1.000000 +55022 -1.000000 +55023 -1.000000 +55024 -1.000000 +55025 -1.000000 +55026 -1.000000 +55027 -1.000000 +55028 -1.000000 +55029 -1.000000 +55030 -1.000000 +55031 -1.000000 +55032 -1.000000 +55033 -1.000000 +55034 -1.000000 +55035 -1.000000 +55037 -1.000000 +55038 -1.000000 +55039 -1.000000 +55040 -1.000000 +55041 -1.000000 +55042 -1.000000 +55044 -1.000000 +55045 -1.000000 +55046 -1.000000 +55047 -1.000000 +55048 -1.000000 +55049 -1.000000 +55050 -1.000000 +55051 -1.000000 +55052 -1.000000 +55053 -1.000000 +55054 -1.000000 +55056 -1.000000 +55057 -1.000000 +55058 -1.000000 +55059 -1.000000 +55060 -1.000000 +55061 -1.000000 +55062 -1.000000 +55063 -1.000000 +55064 -1.000000 +55065 -1.000000 +55066 -1.000000 +55067 -1.000000 +55068 -1.000000 +55069 -1.000000 +55070 -1.000000 +55071 -1.000000 +55072 -1.000000 +55073 -1.000000 +55074 -1.000000 +55075 -1.000000 +55076 -1.000000 +55077 -1.000000 +55078 -1.000000 +55079 -1.000000 +55080 -1.000000 +55081 -1.000000 +55082 -1.000000 +55083 -1.000000 +55084 -1.000000 +55085 -1.000000 +55086 -1.000000 +55087 -1.000000 +55095 -1.000000 +55096 -1.000000 +55097 -1.000000 +55098 -1.000000 +55099 -1.000000 +55100 -1.000000 +55101 -1.000000 +55102 -1.000000 +55103 -1.000000 +55104 -1.000000 +55105 -1.000000 +55106 -1.000000 +55107 -1.000000 +55108 -1.000000 +55109 -1.000000 +55110 -1.000000 +55111 -1.000000 +55112 -1.000000 +55113 -1.000000 +55114 -1.000000 +55115 -1.000000 +55116 -1.000000 +55117 -1.000000 +55118 -1.000000 +55119 -1.000000 +55120 -1.000000 +55121 -1.000000 +55122 -1.000000 +55123 -1.000000 +55124 -1.000000 +55125 -1.000000 +55126 -1.000000 +55127 -1.000000 +55128 -1.000000 +55129 -1.000000 +55130 -1.000000 +55131 -1.000000 +55132 -1.000000 +55133 -1.000000 +55134 -1.000000 +55135 -1.000000 +55136 -1.000000 +55137 -1.000000 +55138 -1.000000 +55139 -1.000000 +55140 -1.000000 +55141 -1.000000 +55142 -1.000000 +55143 -1.000000 +55144 -1.000000 +55145 -1.000000 +55146 -1.000000 +55147 -1.000000 +55148 -1.000000 +55149 -1.000000 +55150 -1.000000 +55151 -1.000000 +55152 -1.000000 +55153 -1.000000 +55154 -1.000000 +55155 -1.000000 +55156 -1.000000 +55157 -1.000000 +55158 -1.000000 +55159 -1.000000 +55160 -1.000000 +55161 -1.000000 +55162 -1.000000 +55163 -1.000000 +55164 -1.000000 +55165 -1.000000 +55166 -1.000000 +55167 -1.000000 +55168 -1.000000 +55169 -1.000000 +55170 -1.000000 +55171 -1.000000 +55172 -1.000000 +55173 -1.000000 +55174 -1.000000 +55175 -1.000000 +55176 -1.000000 +55177 -1.000000 +55178 -1.000000 +55179 -1.000000 +55180 -1.000000 +55181 -1.000000 +55182 -1.000000 +55183 -1.000000 +55184 -1.000000 +55185 -1.000000 +55186 -1.000000 +55187 -1.000000 +55188 -1.000000 +55189 -1.000000 +55190 -1.000000 +55191 -1.000000 +55192 -1.000000 +55193 -1.000000 +55194 -1.000000 +55195 -1.000000 +55196 -1.000000 +55197 -1.000000 +55198 -1.000000 +55199 -1.000000 +55200 -1.000000 +55201 -1.000000 +55202 -1.000000 +55203 -1.000000 +55204 -1.000000 +55205 -1.000000 +55206 -1.000000 +55207 -1.000000 +55208 -1.000000 +55209 -1.000000 +55210 -1.000000 +55211 -1.000000 +55212 -1.000000 +55213 -1.000000 +55214 -1.000000 +55215 -1.000000 +55216 -1.000000 +55217 -1.000000 +55218 -1.000000 +55219 -1.000000 +55220 -1.000000 +55221 -1.000000 +55222 -1.000000 +55223 -1.000000 +55224 -1.000000 +55225 -1.000000 +55226 -1.000000 +55227 -1.000000 +55228 -1.000000 +55229 -1.000000 +55230 -1.000000 +55231 -1.000000 +55232 -1.000000 +55233 -1.000000 +55234 -1.000000 +55235 -1.000000 +55236 -1.000000 +55237 -1.000000 +55238 -1.000000 +55239 -1.000000 +55240 -1.000000 +55244 -1.000000 +55245 -1.000000 +55246 -1.000000 +55247 -1.000000 +55248 -1.000000 +55249 -1.000000 +55250 -1.000000 +55251 -1.000000 +55252 -1.000000 +55253 -1.000000 +55254 -1.000000 +55255 -1.000000 +55256 -1.000000 +55257 -1.000000 +55258 -1.000000 +55259 -1.000000 +55260 -1.000000 +55261 -1.000000 +55262 -1.000000 +55263 -1.000000 +55266 -1.000000 +55267 -1.000000 +55268 -1.000000 +55269 -1.000000 +55270 -1.000000 +55271 -1.000000 +55272 -1.000000 +55273 -1.000000 +55274 -1.000000 +55275 -1.000000 +55276 -1.000000 +55277 -1.000000 +55278 -1.000000 +55279 -1.000000 +55280 -1.000000 +55281 -1.000000 +55282 -1.000000 +55283 -1.000000 +55284 -1.000000 +55285 -1.000000 +55286 -1.000000 +55287 -1.000000 +55288 -1.000000 +55289 -1.000000 +55290 -1.000000 +55291 -1.000000 +55292 -1.000000 +55293 -1.000000 +55294 -1.000000 +55295 -1.000000 +55296 -1.000000 +55297 -1.000000 +55298 -1.000000 +55299 -1.000000 +55300 -1.000000 +55301 -1.000000 +55302 -1.000000 +55303 -1.000000 +55304 -1.000000 +55305 -1.000000 +55306 -1.000000 +55307 -1.000000 +55308 -1.000000 +55309 -1.000000 +55310 -1.000000 +55311 -1.000000 +55312 -1.000000 +55313 -1.000000 +55314 -1.000000 +55315 -1.000000 +55316 -1.000000 +55317 -1.000000 +55318 -1.000000 +55319 -1.000000 +55320 -1.000000 +55321 -1.000000 +55322 -1.000000 +55323 -1.000000 +55324 -1.000000 +55325 -1.000000 +55326 -1.000000 +55327 -1.000000 +55328 -1.000000 +55329 -1.000000 +55330 -1.000000 +55331 -1.000000 +55332 -1.000000 +55333 -1.000000 +55334 -1.000000 +55335 -1.000000 +55336 -1.000000 +55337 -1.000000 +55338 -1.000000 +55339 -1.000000 +55340 -1.000000 +55341 -1.000000 +55342 -1.000000 +55343 -1.000000 +55344 -1.000000 +55345 -1.000000 +55346 -1.000000 +55347 -1.000000 +55348 -1.000000 +55349 -1.000000 +55350 -1.000000 +55351 -1.000000 +55352 -1.000000 +55353 -1.000000 +55354 -1.000000 +55355 -1.000000 +55356 -1.000000 +55357 -1.000000 +55358 -1.000000 +55359 -1.000000 +55360 -1.000000 +55361 -1.000000 +55362 -1.000000 +55363 -1.000000 +55364 -1.000000 +55365 -1.000000 +55366 -1.000000 +55367 -1.000000 +55368 -1.000000 +55369 -1.000000 +55370 -1.000000 +55371 -1.000000 +55372 -1.000000 +55373 -1.000000 +55374 -1.000000 +55375 -1.000000 +55376 -1.000000 +55377 -1.000000 +55378 -1.000000 +55379 -1.000000 +55380 -1.000000 +55381 -1.000000 +55382 -1.000000 +55383 -1.000000 +55384 -1.000000 +55385 -1.000000 +55386 -1.000000 +55387 -1.000000 +55388 -1.000000 +55389 -1.000000 +55390 -1.000000 +55391 -1.000000 +55392 -1.000000 +55393 -1.000000 +55394 -1.000000 +55395 -1.000000 +55396 -1.000000 +55397 -1.000000 +55398 -1.000000 +55399 -1.000000 +55400 -1.000000 +55401 -1.000000 +55402 -1.000000 +55403 -1.000000 +55404 -1.000000 +55405 -1.000000 +55406 -1.000000 +55407 -1.000000 +55408 -1.000000 +55409 -1.000000 +55410 -1.000000 +55411 -1.000000 +55412 -1.000000 +55413 -1.000000 +55414 -1.000000 +55415 -1.000000 +55416 -1.000000 +55417 -1.000000 +55418 -1.000000 +55419 -1.000000 +55420 -1.000000 +55421 -1.000000 +55422 -1.000000 +55423 -1.000000 +55424 -1.000000 +55425 -1.000000 +55426 -1.000000 +55427 -1.000000 +55428 -1.000000 +55429 -1.000000 +55430 -1.000000 +55431 -1.000000 +55432 -1.000000 +55433 -1.000000 +55434 -1.000000 +55435 -1.000000 +55436 -1.000000 +55437 -1.000000 +55439 -1.000000 +55440 -1.000000 +55441 -1.000000 +55442 -1.000000 +55443 -1.000000 +55444 -1.000000 +55445 -1.000000 +55446 -1.000000 +55447 -1.000000 +55448 -1.000000 +55449 -1.000000 +55451 -1.000000 +55452 -1.000000 +55453 -1.000000 +55454 -1.000000 +55455 -1.000000 +55456 -1.000000 +55457 -1.000000 +55458 -1.000000 +55459 -1.000000 +55460 -1.000000 +55461 -1.000000 +55462 -1.000000 +55463 -1.000000 +55464 -1.000000 +55465 -1.000000 +55466 -1.000000 +55467 -1.000000 +55468 -1.000000 +55469 -1.000000 +55470 -1.000000 +55471 -1.000000 +55472 -1.000000 +55473 -1.000000 +55474 -1.000000 +55475 -1.000000 +55476 -1.000000 +55477 -1.000000 +55478 -1.000000 +55479 -1.000000 +55480 -1.000000 +55481 -1.000000 +55482 -1.000000 +55483 -1.000000 +55484 -1.000000 +55485 -1.000000 +55486 -1.000000 +55487 -1.000000 +55488 -1.000000 +55489 -1.000000 +55490 -1.000000 +55491 -1.000000 +55492 -1.000000 +55493 -1.000000 +55494 -1.000000 +55495 -1.000000 +55496 -1.000000 +55497 -1.000000 +55498 -1.000000 +55499 -1.000000 +55500 -1.000000 +55501 -1.000000 +55502 -1.000000 +55503 -1.000000 +55504 -1.000000 +55505 -1.000000 +55506 -1.000000 +55507 -1.000000 +55508 -1.000000 +55509 -1.000000 +55510 -1.000000 +55511 -1.000000 +55512 -1.000000 +55513 -1.000000 +55514 -1.000000 +55515 -1.000000 +55516 -1.000000 +55517 -1.000000 +55518 -1.000000 +55519 -1.000000 +55520 -1.000000 +55521 -1.000000 +55522 -1.000000 +55523 -1.000000 +55524 -1.000000 +55525 -1.000000 +55526 -1.000000 +55527 -1.000000 +55528 -1.000000 +55529 -1.000000 +55530 -1.000000 +55531 -1.000000 +55532 -1.000000 +55533 -1.000000 +55534 -1.000000 +55535 -1.000000 +55536 -1.000000 +55537 -1.000000 +55538 -1.000000 +55539 -1.000000 +55540 -1.000000 +55541 -1.000000 +55542 -1.000000 +55543 -1.000000 +55544 -1.000000 +55545 -1.000000 +55546 -1.000000 +55547 -1.000000 +55548 -1.000000 +55549 -1.000000 +55550 -1.000000 +55551 -1.000000 +55552 -1.000000 +55553 -1.000000 +55554 -1.000000 +55555 -1.000000 +55556 -1.000000 +55557 -1.000000 +55558 -1.000000 +55559 -1.000000 +55560 -1.000000 +55561 -1.000000 +55562 -1.000000 +55563 -1.000000 +55564 -1.000000 +55565 -1.000000 +55566 -1.000000 +55567 -1.000000 +55568 -1.000000 +55569 -1.000000 +55570 -1.000000 +55571 -1.000000 +55572 -1.000000 +55573 -1.000000 +55574 -1.000000 +55575 -1.000000 +55576 -1.000000 +55577 -1.000000 +55578 -1.000000 +55579 -1.000000 +55580 -1.000000 +55581 -1.000000 +55582 -1.000000 +55583 -1.000000 +55584 -1.000000 +55585 -1.000000 +55586 -1.000000 +55587 -1.000000 +55588 -1.000000 +55589 -1.000000 +55590 -1.000000 +55591 -1.000000 +55592 -1.000000 +55593 -1.000000 +55594 -1.000000 +55595 -1.000000 +55596 -1.000000 +55597 -1.000000 +55598 -1.000000 +55599 -1.000000 +55600 -1.000000 +55601 -1.000000 +55602 -1.000000 +55603 -1.000000 +55604 -1.000000 +55605 -1.000000 +55606 -1.000000 +55607 -1.000000 +55608 -1.000000 +55609 -1.000000 +55610 -1.000000 +55611 -1.000000 +55612 -1.000000 +55613 -1.000000 +55614 -1.000000 +55615 -1.000000 +55616 -1.000000 +55617 -1.000000 +55618 -1.000000 +55619 -1.000000 +55620 -1.000000 +55621 -1.000000 +55622 -1.000000 +55623 -1.000000 +55624 -1.000000 +55625 -1.000000 +55626 -1.000000 +55627 -1.000000 +55628 -1.000000 +55629 -1.000000 +55630 -1.000000 +55631 -1.000000 +55632 -1.000000 +55633 -1.000000 +55634 -1.000000 +55635 -1.000000 +55636 -1.000000 +55637 -1.000000 +55638 -1.000000 +55639 -1.000000 +55640 -1.000000 +55641 -1.000000 +55642 -1.000000 +55643 -1.000000 +55644 -1.000000 +55645 -1.000000 +55646 -1.000000 +55647 -1.000000 +55648 -1.000000 +55649 -1.000000 +55650 -1.000000 +55651 -1.000000 +55652 -1.000000 +55653 -1.000000 +55654 -1.000000 +55655 -1.000000 +55656 -1.000000 +55657 -1.000000 +55658 -1.000000 +55659 -1.000000 +55660 -1.000000 +55661 -1.000000 +55662 -1.000000 +55663 -1.000000 +55664 -1.000000 +55665 -1.000000 +55666 -1.000000 +55667 -1.000000 +55668 -1.000000 +55669 -1.000000 +55670 -1.000000 +55671 -1.000000 +55672 -1.000000 +55673 -1.000000 +55674 -1.000000 +55675 -1.000000 +55676 -1.000000 +55677 -1.000000 +55678 -1.000000 +55679 -1.000000 +55680 -1.000000 +55681 -1.000000 +55682 -1.000000 +55683 -1.000000 +55684 -1.000000 +55685 -1.000000 +55686 -1.000000 +55687 -1.000000 +55688 -1.000000 +55689 -1.000000 +55690 -1.000000 +55691 -1.000000 +55692 -1.000000 +55693 -1.000000 +55694 -1.000000 +55695 -1.000000 +55696 -1.000000 +55697 -1.000000 +55698 -1.000000 +55699 -1.000000 +55700 -1.000000 +55701 -1.000000 +55702 -1.000000 +55703 -1.000000 +55705 -1.000000 +55706 -1.000000 +55707 -1.000000 +55708 -1.000000 +55709 -1.000000 +55710 -1.000000 +55711 -1.000000 +55712 -1.000000 +55713 -1.000000 +55714 -1.000000 +55715 -1.000000 +55716 -1.000000 +55717 -1.000000 +55718 -1.000000 +55719 -1.000000 +55720 -1.000000 +55721 -1.000000 +55722 -1.000000 +55723 -1.000000 +55724 -1.000000 +55725 -1.000000 +55726 -1.000000 +55727 -1.000000 +55728 -1.000000 +55729 -1.000000 +55730 -1.000000 +55731 -1.000000 +55732 -1.000000 +55733 -1.000000 +55734 -1.000000 +55735 -1.000000 +55736 -1.000000 +55737 -1.000000 +55738 -1.000000 +55739 -1.000000 +55740 -1.000000 +55741 -1.000000 +55742 -1.000000 +55743 -1.000000 +55744 -1.000000 +55745 -1.000000 +55746 -1.000000 +55747 -1.000000 +55748 -1.000000 +55749 -1.000000 +55750 -1.000000 +55751 -1.000000 +55752 -1.000000 +55753 -1.000000 +55754 -1.000000 +55755 -1.000000 +55756 -1.000000 +55757 -1.000000 +55758 -1.000000 +55759 -1.000000 +55760 -1.000000 +55761 -1.000000 +55762 -1.000000 +55763 -1.000000 +55764 -1.000000 +55765 -1.000000 +55766 -1.000000 +55767 -1.000000 +55768 -1.000000 +55769 -1.000000 +55770 -1.000000 +55771 -1.000000 +55772 -1.000000 +55773 -1.000000 +55774 -1.000000 +55775 -1.000000 +55776 -1.000000 +55777 -1.000000 +55778 -1.000000 +55779 -1.000000 +55780 -1.000000 +55781 -1.000000 +55782 -1.000000 +55783 -1.000000 +55784 -1.000000 +55785 -1.000000 +55786 -1.000000 +55787 -1.000000 +55788 -1.000000 +55789 -1.000000 +55790 -1.000000 +55791 -1.000000 +55792 -1.000000 +55793 -1.000000 +55794 -1.000000 +55795 -1.000000 +55796 -1.000000 +55797 -1.000000 +55798 -1.000000 +55799 -1.000000 +55800 -1.000000 +55801 -1.000000 +55802 -1.000000 +55803 -1.000000 +55804 -1.000000 +55805 -1.000000 +55806 -1.000000 +55807 -1.000000 +55808 -1.000000 +55809 -1.000000 +55810 -1.000000 +55811 -1.000000 +55812 -1.000000 +55813 -1.000000 +55814 -1.000000 +55815 -1.000000 +55816 -1.000000 +55817 -1.000000 +55818 -1.000000 +55819 -1.000000 +55820 -1.000000 +55821 -1.000000 +55822 -1.000000 +55823 -1.000000 +55824 -1.000000 +55825 -1.000000 +55826 -1.000000 +55827 -1.000000 +55828 -1.000000 +55829 -1.000000 +55830 -1.000000 +55831 -1.000000 +55832 -1.000000 +55833 -1.000000 +55834 -1.000000 +55835 -1.000000 +55836 -1.000000 +55837 -1.000000 +55838 -1.000000 +55839 -1.000000 +55840 -1.000000 +55841 -1.000000 +55842 -1.000000 +55843 -1.000000 +55844 -1.000000 +55845 -1.000000 +55850 -1.000000 +55851 -1.000000 +55852 -1.000000 +55853 -1.000000 +55854 -1.000000 +55855 -1.000000 +55856 -1.000000 +55857 -1.000000 +55858 -1.000000 +55859 -1.000000 +55860 -1.000000 +55861 -1.000000 +55862 -1.000000 +55863 -1.000000 +55864 -1.000000 +55865 -1.000000 +55866 -1.000000 +55867 -1.000000 +55868 -1.000000 +55869 -1.000000 +55870 -1.000000 +55871 -1.000000 +55872 -1.000000 +55873 -1.000000 +55874 -1.000000 +55875 -1.000000 +55876 -1.000000 +55877 -1.000000 +55878 -1.000000 +55879 -1.000000 +55880 -1.000000 +55881 -1.000000 +55882 -1.000000 +55883 -1.000000 +55884 -1.000000 +55885 -1.000000 +55886 -1.000000 +55887 -1.000000 +55888 -1.000000 +55889 -1.000000 +55890 -1.000000 +55891 -1.000000 +55892 -1.000000 +55893 -1.000000 +55894 -1.000000 +55895 -1.000000 +55896 -1.000000 +55897 -1.000000 +55898 -1.000000 +55899 -1.000000 +55900 -1.000000 +55901 -1.000000 +55902 -1.000000 +55903 -1.000000 +55904 -1.000000 +55905 -1.000000 +55906 -1.000000 +55907 -1.000000 +55908 -1.000000 +55909 -1.000000 +55910 -1.000000 +55911 -1.000000 +55912 -1.000000 +55913 -1.000000 +55914 -1.000000 +55915 -1.000000 +55916 -1.000000 +55917 -1.000000 +55918 -1.000000 +55919 -1.000000 +55920 -1.000000 +55921 -1.000000 +55922 -1.000000 +55923 -1.000000 +55924 -1.000000 +55925 -1.000000 +55926 -1.000000 +55927 -1.000000 +55928 -1.000000 +55929 -1.000000 +55930 -1.000000 +55931 -1.000000 +55932 -1.000000 +55933 -1.000000 +55934 -1.000000 +55935 -1.000000 +55936 -1.000000 +55937 -1.000000 +55938 -1.000000 +55939 -1.000000 +55940 -1.000000 +55941 -1.000000 +55942 -1.000000 +55943 -1.000000 +55944 -1.000000 +55945 -1.000000 +55946 -1.000000 +55947 -1.000000 +55948 -1.000000 +55949 -1.000000 +55950 -1.000000 +55951 -1.000000 +55952 -1.000000 +55953 -1.000000 +55954 -1.000000 +55955 -1.000000 +55956 -1.000000 +55957 -1.000000 +55958 -1.000000 +55959 -1.000000 +55960 -1.000000 +55961 -1.000000 +55962 -1.000000 +55963 -1.000000 +55964 -1.000000 +55965 -1.000000 +55966 -1.000000 +55967 -1.000000 +55968 -1.000000 +55969 -1.000000 +55970 -1.000000 +55971 -1.000000 +55972 -1.000000 +55973 -1.000000 +55974 -1.000000 +55975 -1.000000 +55976 -1.000000 +55977 -1.000000 +55978 -1.000000 +55979 -1.000000 +55980 -1.000000 +55981 -1.000000 +55982 -1.000000 +55983 -1.000000 +55984 -1.000000 +55985 -1.000000 +55986 -1.000000 +55987 -1.000000 +55988 -1.000000 +55989 -1.000000 +55990 -1.000000 +55991 -1.000000 +55992 -1.000000 +55993 -1.000000 +55994 -1.000000 +55995 -1.000000 +55996 -1.000000 +55997 -1.000000 +55998 -1.000000 +55999 -1.000000 +56000 -1.000000 +56001 -1.000000 +56002 -1.000000 +56003 -1.000000 +56004 -1.000000 +56005 -1.000000 +56006 -1.000000 +56007 -1.000000 +56008 -1.000000 +56009 -1.000000 +56010 -1.000000 +56011 -1.000000 +56012 -1.000000 +56013 -1.000000 +56014 -1.000000 +56015 -1.000000 +56016 -1.000000 +56017 -1.000000 +56018 -1.000000 +56019 -1.000000 +56020 -1.000000 +56021 -1.000000 +56022 -1.000000 +56023 -1.000000 +56024 -1.000000 +56025 -1.000000 +56026 -1.000000 +56027 -1.000000 +56028 -1.000000 +56029 -1.000000 +56030 -1.000000 +56031 -1.000000 +56032 -1.000000 +56033 -1.000000 +56034 -1.000000 +56035 -1.000000 +56036 -1.000000 +56037 -1.000000 +56038 -1.000000 +56039 -1.000000 +56040 -1.000000 +56041 -1.000000 +56042 -1.000000 +56043 -1.000000 +56044 -1.000000 +56045 -1.000000 +56046 -1.000000 +56047 -1.000000 +56048 -1.000000 +56049 -1.000000 +56050 -1.000000 +56051 -1.000000 +56052 -1.000000 +56053 -1.000000 +56054 -1.000000 +56055 -1.000000 +56056 -1.000000 +56057 -1.000000 +56058 -1.000000 +56059 -1.000000 +56060 -1.000000 +56061 -1.000000 +56062 -1.000000 +56063 -1.000000 +56064 -1.000000 +56065 -1.000000 +56066 -1.000000 +56067 -1.000000 +56068 -1.000000 +56069 -1.000000 +56070 -1.000000 +56071 -1.000000 +56072 -1.000000 +56073 -1.000000 +56074 -1.000000 +56075 -1.000000 +56076 -1.000000 +56077 -1.000000 +56078 -1.000000 +56079 -1.000000 +56080 -1.000000 +56081 -1.000000 +56082 -1.000000 +56083 -1.000000 +56084 -1.000000 +56085 -1.000000 +56086 -1.000000 +56087 -1.000000 +56088 -1.000000 +56089 -1.000000 +56090 -1.000000 +56091 -1.000000 +56092 -1.000000 +56093 -1.000000 +56094 -1.000000 +56095 -1.000000 +56096 -1.000000 +56097 -1.000000 +56098 -1.000000 +56099 -1.000000 +56100 -1.000000 +56101 -1.000000 +56102 -1.000000 +56103 -1.000000 +56104 -1.000000 +56105 -1.000000 +56106 -1.000000 +56107 -1.000000 +56108 -1.000000 +56109 -1.000000 +56110 -1.000000 +56111 -1.000000 +56112 -1.000000 +56113 -1.000000 +56114 -1.000000 +56115 -1.000000 +56116 -1.000000 +56117 -1.000000 +56118 -1.000000 +56119 -1.000000 +56120 -1.000000 +56121 -1.000000 +56122 -1.000000 +56123 -1.000000 +56124 -1.000000 +56125 -1.000000 +56126 -1.000000 +56127 -1.000000 +56128 -1.000000 +56129 -1.000000 +56130 -1.000000 +56131 -1.000000 +56132 -1.000000 +56133 -1.000000 +56134 -1.000000 +56135 -1.000000 +56136 -1.000000 +56137 -1.000000 +56138 -1.000000 +56139 -1.000000 +56140 -1.000000 +56142 -1.000000 +56143 -1.000000 +56144 -1.000000 +56145 -1.000000 +56146 -1.000000 +56147 -1.000000 +56148 -1.000000 +56149 -1.000000 +56150 -1.000000 +56151 -1.000000 +56152 -1.000000 +56153 -1.000000 +56154 -1.000000 +56155 -1.000000 +56156 -1.000000 +56157 -1.000000 +56158 -1.000000 +56159 -1.000000 +56160 -1.000000 +56161 -1.000000 +56162 -1.000000 +56163 -1.000000 +56164 -1.000000 +56165 -1.000000 +56166 -1.000000 +56167 -1.000000 +56168 -1.000000 +56169 -1.000000 +56170 -1.000000 +56171 -1.000000 +56172 -1.000000 +56173 -1.000000 +56174 -1.000000 +56175 -1.000000 +56176 -1.000000 +56177 -1.000000 +56178 -1.000000 +56179 -1.000000 +56180 -1.000000 +56181 -1.000000 +56182 -1.000000 +56183 -1.000000 +56184 -1.000000 +56185 -1.000000 +56186 -1.000000 +56187 -1.000000 +56188 -1.000000 +56189 -1.000000 +56190 -1.000000 +56191 -1.000000 +56192 -1.000000 +56193 -1.000000 +56194 -1.000000 +56195 -1.000000 +56196 -1.000000 +56197 -1.000000 +56198 -1.000000 +56199 -1.000000 +56200 -1.000000 +56201 -1.000000 +56202 -1.000000 +56203 -1.000000 +56204 -1.000000 +56205 -1.000000 +56206 -1.000000 +56207 -1.000000 +56208 -1.000000 +56209 -1.000000 +56210 -1.000000 +56211 -1.000000 +56212 -1.000000 +56213 -1.000000 +56214 -1.000000 +56215 -1.000000 +56216 -1.000000 +56217 -1.000000 +56219 -1.000000 +56220 -1.000000 +56221 -1.000000 +56222 -1.000000 +56223 -1.000000 +56224 -1.000000 +56225 -1.000000 +56226 -1.000000 +56227 -1.000000 +56228 -1.000000 +56229 -1.000000 +56230 -1.000000 +56231 -1.000000 +56232 -1.000000 +56233 -1.000000 +56234 -1.000000 +56235 -1.000000 +56236 -1.000000 +56237 -1.000000 +56238 -1.000000 +56239 -1.000000 +56240 -1.000000 +56241 -1.000000 +56242 -1.000000 +56243 -1.000000 +56244 -1.000000 +56245 -1.000000 +56246 -1.000000 +56247 -1.000000 +56248 -1.000000 +56249 -1.000000 +56250 -1.000000 +56252 -1.000000 +56253 -1.000000 +56254 -1.000000 +56255 -1.000000 +56256 -1.000000 +56257 -1.000000 +56258 -1.000000 +56259 -1.000000 +56260 -1.000000 +56261 -1.000000 +56262 -1.000000 +56264 -1.000000 +56265 -1.000000 +56266 -1.000000 +56267 -1.000000 +56268 -1.000000 +56269 -1.000000 +56270 -1.000000 +56271 -1.000000 +56272 -1.000000 +56273 -1.000000 +56274 -1.000000 +56275 -1.000000 +56276 -1.000000 +56277 -1.000000 +56278 -1.000000 +56279 -1.000000 +56280 -1.000000 +56281 -1.000000 +56282 -1.000000 +56283 -1.000000 +56284 -1.000000 +56285 -1.000000 +56286 -1.000000 +56287 -1.000000 +56288 -1.000000 +56289 -1.000000 +56290 -1.000000 +56291 -1.000000 +56292 -1.000000 +56293 -1.000000 +56294 -1.000000 +56295 -1.000000 +56296 -1.000000 +56297 -1.000000 +56298 -1.000000 +56299 -1.000000 +56300 -1.000000 +56301 -1.000000 +56302 -1.000000 +56303 -1.000000 +56304 -1.000000 +56305 -1.000000 +56306 -1.000000 +56307 -1.000000 +56308 -1.000000 +56309 -1.000000 +56310 -1.000000 +56311 -1.000000 +56312 -1.000000 +56313 -1.000000 +56314 -1.000000 +56315 -1.000000 +56316 -1.000000 +56317 -1.000000 +56318 -1.000000 +56319 -1.000000 +56320 -1.000000 +56322 -1.000000 +56323 -1.000000 +56324 -1.000000 +56325 -1.000000 +56326 -1.000000 +56327 -1.000000 +56328 -1.000000 +56329 -1.000000 +56330 -1.000000 +56331 -1.000000 +56332 -1.000000 +56333 -1.000000 +56334 -1.000000 +56335 -1.000000 +56336 -1.000000 +56337 -1.000000 +56338 -1.000000 +56339 -1.000000 +56340 -1.000000 +56341 -1.000000 +56342 -1.000000 +56343 -1.000000 +56344 -1.000000 +56345 -1.000000 +56346 -1.000000 +56347 -1.000000 +56348 -1.000000 +56349 -1.000000 +56350 -1.000000 +56351 -1.000000 +56352 -1.000000 +56353 -1.000000 +56354 -1.000000 +56355 -1.000000 +56356 -1.000000 +56357 -1.000000 +56358 -1.000000 +56359 -1.000000 +56360 -1.000000 +56361 -1.000000 +56362 -1.000000 +56363 -1.000000 +56364 -1.000000 +56365 -1.000000 +56366 -1.000000 +56367 -1.000000 +56368 -1.000000 +56369 -1.000000 +56370 -1.000000 +56371 -1.000000 +56372 -1.000000 +56373 -1.000000 +56374 -1.000000 +56375 -1.000000 +56376 -1.000000 +56377 -1.000000 +56378 -1.000000 +56385 -1.000000 +56386 -1.000000 +56387 -1.000000 +56388 -1.000000 +56389 -1.000000 +56390 -1.000000 +56391 -1.000000 +56392 -1.000000 +56393 -1.000000 +56394 -1.000000 +56395 -1.000000 +56396 -1.000000 +56397 -1.000000 +56398 -1.000000 +56399 -1.000000 +56400 -1.000000 +56401 -1.000000 +56402 -1.000000 +56403 -1.000000 +56404 -1.000000 +56405 -1.000000 +56406 -1.000000 +56407 -1.000000 +56408 -1.000000 +56409 -1.000000 +56410 -1.000000 +56411 -1.000000 +56412 -1.000000 +56413 -1.000000 +56414 -1.000000 +56415 -1.000000 +56416 -1.000000 +56417 -1.000000 +56418 -1.000000 +56419 -1.000000 +56420 -1.000000 +56421 -1.000000 +56422 -1.000000 +56423 -1.000000 +56424 -1.000000 +56425 -1.000000 +56426 -1.000000 +56427 -1.000000 +56428 -1.000000 +56429 -1.000000 +56430 -1.000000 +56431 -1.000000 +56432 -1.000000 +56433 -1.000000 +56434 -1.000000 +56435 -1.000000 +56436 -1.000000 +56437 -1.000000 +56438 -1.000000 +56439 -1.000000 +56440 -1.000000 +56441 -1.000000 +56442 -1.000000 +56443 -1.000000 +56444 -1.000000 +56445 -1.000000 +56446 -1.000000 +56447 -1.000000 +56448 -1.000000 +56449 -1.000000 +56450 -1.000000 +56451 -1.000000 +56452 -1.000000 +56453 -1.000000 +56454 -1.000000 +56455 -1.000000 +56456 -1.000000 +56457 -1.000000 +56458 -1.000000 +56459 -1.000000 +56460 -1.000000 +56461 -1.000000 +56462 -1.000000 +56463 -1.000000 +56464 -1.000000 +56465 -1.000000 +56466 -1.000000 +56467 -1.000000 +56468 -1.000000 +56469 -1.000000 +56470 -1.000000 +56471 -1.000000 +56472 -1.000000 +56473 -1.000000 +56474 -1.000000 +56475 -1.000000 +56476 -1.000000 +56477 -1.000000 +56478 -1.000000 +56479 -1.000000 +56480 -1.000000 +56481 -1.000000 +56482 -1.000000 +56483 -1.000000 +56484 -1.000000 +56485 -1.000000 +56486 -1.000000 +56487 -1.000000 +56488 -1.000000 +56489 -1.000000 +56490 -1.000000 +56491 -1.000000 +56492 -1.000000 +56493 -1.000000 +56494 -1.000000 +56495 -1.000000 +56496 -1.000000 +56497 -1.000000 +56498 -1.000000 +56499 -1.000000 +56500 -1.000000 +56501 -1.000000 +56502 -1.000000 +56503 -1.000000 +56504 -1.000000 +56505 -1.000000 +56506 -1.000000 +56507 -1.000000 +56508 -1.000000 +56509 -1.000000 +56510 -1.000000 +56511 -1.000000 +56512 -1.000000 +56513 -1.000000 +56514 -1.000000 +56515 -1.000000 +56516 -1.000000 +56517 -1.000000 +56518 -1.000000 +56519 -1.000000 +56520 -1.000000 +56521 -1.000000 +56522 -1.000000 +56523 -1.000000 +56524 -1.000000 +56525 -1.000000 +56526 -1.000000 +56527 -1.000000 +56528 -1.000000 +56529 -1.000000 +56530 -1.000000 +56531 -1.000000 +56532 -1.000000 +56533 -1.000000 +56534 -1.000000 +56535 -1.000000 +56536 -1.000000 +56537 -1.000000 +56538 -1.000000 +56539 -1.000000 +56540 -1.000000 +56541 -1.000000 +56542 -1.000000 +56543 -1.000000 +56544 -1.000000 +56545 -1.000000 +56546 -1.000000 +56547 -1.000000 +56548 -1.000000 +56549 -1.000000 +56550 -1.000000 +56551 -1.000000 +56552 -1.000000 +56553 -1.000000 +56554 -1.000000 +56555 -1.000000 +56556 -1.000000 +56557 -1.000000 +56558 -1.000000 +56559 -1.000000 +56560 -1.000000 +56561 -1.000000 +56562 -1.000000 +56563 -1.000000 +56565 -1.000000 +56566 -1.000000 +56568 -1.000000 +56569 -1.000000 +56570 -1.000000 +56571 -1.000000 +56572 -1.000000 +56573 -1.000000 +56574 -1.000000 +56576 -1.000000 +56577 -1.000000 +56578 -1.000000 +56579 -1.000000 +56580 -1.000000 +56581 -1.000000 +56582 -1.000000 +56583 -1.000000 +56584 -1.000000 +56585 -1.000000 +56587 -1.000000 +56588 -1.000000 +56592 -1.000000 +56593 -1.000000 +56594 -1.000000 +56595 -1.000000 +56596 -1.000000 +56597 -1.000000 +56599 -1.000000 +56600 -1.000000 +56601 -1.000000 +56602 -1.000000 +56603 -1.000000 +56604 -1.000000 +56605 -1.000000 +56606 -1.000000 +56607 -1.000000 +56608 -1.000000 +56609 -1.000000 +56610 -1.000000 +56612 -1.000000 +56613 -1.000000 +56614 -1.000000 +56615 -1.000000 +56616 -1.000000 +56617 -1.000000 +56618 -1.000000 +56619 -1.000000 +56620 -1.000000 +56621 -1.000000 +56622 -1.000000 +56623 -1.000000 +56624 -1.000000 +56625 -1.000000 +56626 -1.000000 +56627 -1.000000 +56628 -1.000000 +56629 -1.000000 +56630 -1.000000 +56631 -1.000000 +56632 -1.000000 +56633 -1.000000 +56634 -1.000000 +56635 -1.000000 +56636 -1.000000 +56637 -1.000000 +56638 -1.000000 +56639 -1.000000 +56640 -1.000000 +56641 -1.000000 +56642 -1.000000 +56643 -1.000000 +56644 -1.000000 +56645 -1.000000 +56646 -1.000000 +56647 -1.000000 +56648 -1.000000 +56649 -1.000000 +56650 -1.000000 +56651 -1.000000 +56652 -1.000000 +56653 -1.000000 +56654 -1.000000 +56655 -1.000000 +56656 -1.000000 +56657 -1.000000 +56658 -1.000000 +56659 -1.000000 +56660 -1.000000 +56661 -1.000000 +56662 -1.000000 +56663 -1.000000 +56664 -1.000000 +56665 -1.000000 +56666 -1.000000 +56667 -1.000000 +56668 -1.000000 +56669 -1.000000 +56670 -1.000000 +56671 -1.000000 +56672 -1.000000 +56673 -1.000000 +56674 -1.000000 +56675 -1.000000 +56676 -1.000000 +56677 -1.000000 +56678 -1.000000 +56679 -1.000000 +56680 -1.000000 +56681 -1.000000 +56682 -1.000000 +56683 -1.000000 +56684 -1.000000 +56685 -1.000000 +56686 -1.000000 +56687 -1.000000 +56688 -1.000000 +56689 -1.000000 +56690 -1.000000 +56691 -1.000000 +56693 -1.000000 +56694 -1.000000 +56695 -1.000000 +56696 -1.000000 +56697 -1.000000 +56698 -1.000000 +56699 -1.000000 +56700 -1.000000 +56701 -1.000000 +56702 -1.000000 +56703 -1.000000 +56704 -1.000000 +56705 -1.000000 +56706 -1.000000 +56707 -1.000000 +56708 -1.000000 +56709 -1.000000 +56710 -1.000000 +56712 -1.000000 +56713 -1.000000 +56714 -1.000000 +56715 -1.000000 +56716 -1.000000 +56717 -1.000000 +56718 -1.000000 +56719 -1.000000 +56720 -1.000000 +56721 -1.000000 +56722 -1.000000 +56723 -1.000000 +56724 -1.000000 +56725 -1.000000 +56726 -1.000000 +56727 -1.000000 +56728 -1.000000 +56729 -1.000000 +56730 -1.000000 +56731 -1.000000 +56732 -1.000000 +56733 -1.000000 +56734 -1.000000 +56735 -1.000000 +56736 -1.000000 +56737 -1.000000 +56738 -1.000000 +56739 -1.000000 +56740 -1.000000 +56741 -1.000000 +56742 -1.000000 +56743 -1.000000 +56745 -1.000000 +56746 -1.000000 +56747 -1.000000 +56748 -1.000000 +56749 -1.000000 +56750 -1.000000 +56751 -1.000000 +56752 -1.000000 +56753 -1.000000 +56754 -1.000000 +56755 -1.000000 +56756 -1.000000 +56757 -1.000000 +56758 -1.000000 +56759 -1.000000 +56760 -1.000000 +56761 -1.000000 +56762 -1.000000 +56763 -1.000000 +56764 -1.000000 +56765 -1.000000 +56766 -1.000000 +56767 -1.000000 +56768 -1.000000 +56769 -1.000000 +56770 -1.000000 +56771 -1.000000 +56772 -1.000000 +56773 -1.000000 +56774 -1.000000 +56775 -1.000000 +56776 -1.000000 +56777 -1.000000 +56778 -1.000000 +56779 -1.000000 +56780 -1.000000 +56781 -1.000000 +56782 -1.000000 +56783 -1.000000 +56784 -1.000000 +56785 -1.000000 +56786 -1.000000 +56787 -1.000000 +56788 -1.000000 +56789 -1.000000 +56790 -1.000000 +56791 -1.000000 +56792 -1.000000 +56793 -1.000000 +56794 -1.000000 +56795 -1.000000 +56796 -1.000000 +56797 -1.000000 +56798 -1.000000 +56799 -1.000000 +56800 -1.000000 +56801 -1.000000 +56802 -1.000000 +56803 -1.000000 +56804 -1.000000 +56805 -1.000000 +56806 -1.000000 +56807 -1.000000 +56808 -1.000000 +56809 -1.000000 +56812 -1.000000 +56813 -1.000000 +56814 -1.000000 +56815 -1.000000 +56816 -1.000000 +56817 -1.000000 +56818 -1.000000 +56820 -1.000000 +56821 -1.000000 +56822 -1.000000 +56823 -1.000000 +56824 -1.000000 +56825 -1.000000 +56826 -1.000000 +56827 -1.000000 +56828 -1.000000 +56829 -1.000000 +56830 -1.000000 +56831 -1.000000 +56832 -1.000000 +56833 -1.000000 +56834 -1.000000 +56835 -1.000000 +56836 -1.000000 +56837 -1.000000 +56838 -1.000000 +56839 -1.000000 +56840 -1.000000 +56841 -1.000000 +56842 -1.000000 +56843 -1.000000 +56844 -1.000000 +56845 -1.000000 +56846 -1.000000 +56847 -1.000000 +56848 -1.000000 +56849 -1.000000 +56850 -1.000000 +56851 -1.000000 +56852 -1.000000 +56853 -1.000000 +56854 -1.000000 +56855 -1.000000 +56857 -1.000000 +56858 -1.000000 +56859 -1.000000 +56860 -1.000000 +56861 -1.000000 +56862 -1.000000 +56863 -1.000000 +56864 -1.000000 +56865 -1.000000 +56866 -1.000000 +56867 -1.000000 +56868 -1.000000 +56869 -1.000000 +56870 -1.000000 +56871 -1.000000 +56872 -1.000000 +56873 -1.000000 +56874 -1.000000 +56875 -1.000000 +56876 -1.000000 +56879 -1.000000 +56880 -1.000000 +56881 -1.000000 +56884 -1.000000 +56885 -1.000000 +56886 -1.000000 +56887 -1.000000 +56888 -1.000000 +56889 -1.000000 +56890 -1.000000 +56891 -1.000000 +56892 -1.000000 +56893 -1.000000 +56894 -1.000000 +56895 -1.000000 +56896 -1.000000 +56897 -1.000000 +56899 -1.000000 +56900 -1.000000 +56901 -1.000000 +56902 -1.000000 +56903 -1.000000 +56904 -1.000000 +56905 -1.000000 +56906 -1.000000 +56907 -1.000000 +56908 -1.000000 +56909 -1.000000 +56910 -1.000000 +56911 -1.000000 +56912 -1.000000 +56913 -1.000000 +56914 -1.000000 +56915 -1.000000 +56916 -1.000000 +56917 -1.000000 +56918 -1.000000 +56919 -1.000000 +56920 -1.000000 +56921 -1.000000 +56922 -1.000000 +56923 -1.000000 +56924 -1.000000 +56925 -1.000000 +56926 -1.000000 +56927 -1.000000 +56928 -1.000000 +56929 -1.000000 +56930 -1.000000 +56931 -1.000000 +56932 -1.000000 +56933 -1.000000 +56934 -1.000000 +56935 -1.000000 +56936 -1.000000 +56937 -1.000000 +56938 -1.000000 +56939 -1.000000 +56940 -1.000000 +56941 -1.000000 +56942 -1.000000 +56943 -1.000000 +56944 -1.000000 +56945 -1.000000 +56946 -1.000000 +56947 -1.000000 +56948 -1.000000 +56949 -1.000000 +56950 -1.000000 +56951 -1.000000 +56952 -1.000000 +56953 -1.000000 +56954 -1.000000 +56955 -1.000000 +56956 -1.000000 +56957 -1.000000 +56958 -1.000000 +56959 -1.000000 +56960 -1.000000 +56961 -1.000000 +56962 -1.000000 +56963 -1.000000 +56964 -1.000000 +56965 -1.000000 +56966 -1.000000 +56967 -1.000000 +56968 -1.000000 +56969 -1.000000 +56970 -1.000000 +56971 -1.000000 +56972 -1.000000 +56973 -1.000000 +56974 -1.000000 +56975 -1.000000 +56976 -1.000000 +56977 -1.000000 +56978 -1.000000 +56979 -1.000000 +56980 -1.000000 +56981 -1.000000 +56982 -1.000000 +56983 -1.000000 +56984 -1.000000 +56985 -1.000000 +56986 -1.000000 +56987 -1.000000 +56988 -1.000000 +56989 -1.000000 +56991 -1.000000 +56992 -1.000000 +56993 -1.000000 +56994 -1.000000 +56995 -1.000000 +56996 -1.000000 +56997 -1.000000 +56998 -1.000000 +56999 -1.000000 +57000 -1.000000 +57001 -1.000000 +57002 -1.000000 +57003 -1.000000 +57004 -1.000000 +57005 -1.000000 +57006 -1.000000 +57007 -1.000000 +57008 -1.000000 +57009 -1.000000 +57010 -1.000000 +57011 -1.000000 +57012 -1.000000 +57013 -1.000000 +57014 -1.000000 +57015 -1.000000 +57016 -1.000000 +57017 -1.000000 +57018 -1.000000 +57019 -1.000000 +57020 -1.000000 +57021 -1.000000 +57022 -1.000000 +57023 -1.000000 +57024 -1.000000 +57025 -1.000000 +57026 -1.000000 +57027 -1.000000 +57028 -1.000000 +57029 -1.000000 +57030 -1.000000 +57031 -1.000000 +57032 -1.000000 +57033 -1.000000 +57034 -1.000000 +57035 -1.000000 +57036 -1.000000 +57037 -1.000000 +57038 -1.000000 +57039 -1.000000 +57040 -1.000000 +57041 -1.000000 +57042 -1.000000 +57043 -1.000000 +57044 -1.000000 +57045 -1.000000 +57046 -1.000000 +57047 -1.000000 +57048 -1.000000 +57049 -1.000000 +57050 -1.000000 +57051 -1.000000 +57052 -1.000000 +57053 -1.000000 +57054 -1.000000 +57055 -1.000000 +57056 -1.000000 +57057 -1.000000 +57058 -1.000000 +57059 -1.000000 +57060 -1.000000 +57061 -1.000000 +57062 -1.000000 +57063 -1.000000 +57064 -1.000000 +57065 -1.000000 +57066 -1.000000 +57067 -1.000000 +57068 -1.000000 +57069 -1.000000 +57070 -1.000000 +57071 -1.000000 +57072 -1.000000 +57073 -1.000000 +57074 -1.000000 +57075 -1.000000 +57076 -1.000000 +57077 -1.000000 +57078 -1.000000 +57079 -1.000000 +57080 -1.000000 +57081 -1.000000 +57082 -1.000000 +57083 -1.000000 +57084 -1.000000 +57085 -1.000000 +57086 -1.000000 +57087 -1.000000 +57088 -1.000000 +57089 -1.000000 +57090 -1.000000 +57091 -1.000000 +57092 -1.000000 +57093 -1.000000 +57094 -1.000000 +57095 -1.000000 +57096 -1.000000 +57097 -1.000000 +57098 -1.000000 +57099 -1.000000 +57100 -1.000000 +57101 -1.000000 +57102 -1.000000 +57103 -1.000000 +57104 -1.000000 +57105 -1.000000 +57106 -1.000000 +57107 -1.000000 +57108 -1.000000 +57109 -1.000000 +57110 -1.000000 +57111 -1.000000 +57112 -1.000000 +57113 -1.000000 +57114 -1.000000 +57115 -1.000000 +57116 -1.000000 +57117 -1.000000 +57118 -1.000000 +57119 -1.000000 +57120 -1.000000 +57121 -1.000000 +57122 -1.000000 +57123 -1.000000 +57124 -1.000000 +57125 -1.000000 +57126 -1.000000 +57127 -1.000000 +57128 -1.000000 +57129 -1.000000 +57130 -1.000000 +57131 -1.000000 +57132 -1.000000 +57133 -1.000000 +57134 -1.000000 +57135 -1.000000 +57136 -1.000000 +57137 -1.000000 +57138 -1.000000 +57139 -1.000000 +57140 -1.000000 +57141 -1.000000 +57142 -1.000000 +57143 -1.000000 +57144 -1.000000 +57145 -1.000000 +57146 -1.000000 +57147 -1.000000 +57148 -1.000000 +57149 -1.000000 +57150 -1.000000 +57151 -1.000000 +57152 -1.000000 +57153 -1.000000 +57154 -1.000000 +57155 -1.000000 +57156 -1.000000 +57157 -1.000000 +57158 -1.000000 +57159 -1.000000 +57160 -1.000000 +57161 -1.000000 +57162 -1.000000 +57163 -1.000000 +57164 -1.000000 +57165 -1.000000 +57166 -1.000000 +57167 -1.000000 +57168 -1.000000 +57169 -1.000000 +57170 -1.000000 +57171 -1.000000 +57172 -1.000000 +57173 -1.000000 +57174 -1.000000 +57175 -1.000000 +57176 -1.000000 +57177 -1.000000 +57178 -1.000000 +57179 -1.000000 +57180 -1.000000 +57181 -1.000000 +57182 -1.000000 +57183 -1.000000 +57184 -1.000000 +57185 -1.000000 +57186 -1.000000 +57187 -1.000000 +57188 -1.000000 +57189 -1.000000 +57190 -1.000000 +57191 -1.000000 +57192 -1.000000 +57193 -1.000000 +57194 -1.000000 +57195 -1.000000 +57196 -1.000000 +57197 -1.000000 +57198 -1.000000 +57199 -1.000000 +57200 -1.000000 +57201 -1.000000 +57202 -1.000000 +57203 -1.000000 +57204 -1.000000 +57205 -1.000000 +57206 -1.000000 +57207 -1.000000 +57208 -1.000000 +57209 -1.000000 +57210 -1.000000 +57211 -1.000000 +57212 -1.000000 +57213 -1.000000 +57216 -1.000000 +57217 -1.000000 +57219 -1.000000 +57220 -1.000000 +57221 -1.000000 +57222 -1.000000 +57224 -1.000000 +57225 -1.000000 +57226 -1.000000 +57227 -1.000000 +57228 -1.000000 +57229 -1.000000 +57230 -1.000000 +57231 -1.000000 +57233 -1.000000 +57234 -1.000000 +57235 -1.000000 +57236 -1.000000 +57237 -1.000000 +57238 -1.000000 +57239 -1.000000 +57240 -1.000000 +57241 -1.000000 +57242 -1.000000 +57243 -1.000000 +57244 -1.000000 +57245 -1.000000 +57246 -1.000000 +57247 -1.000000 +57248 -1.000000 +57249 -1.000000 +57250 -1.000000 +57251 -1.000000 +57254 -1.000000 +57255 -1.000000 +57256 -1.000000 +57257 -1.000000 +57258 -1.000000 +57259 -1.000000 +57260 -1.000000 +57261 -1.000000 +57262 -1.000000 +57263 -1.000000 +57264 -1.000000 +57265 -1.000000 +57266 -1.000000 +57267 -1.000000 +57268 -1.000000 +57269 -1.000000 +57270 -1.000000 +57272 -1.000000 +57273 -1.000000 +57274 -1.000000 +57275 -1.000000 +57276 -1.000000 +57277 -1.000000 +57278 -1.000000 +57279 -1.000000 +57280 -1.000000 +57281 -1.000000 +57282 -1.000000 +57283 -1.000000 +57284 -1.000000 +57285 -1.000000 +57286 -1.000000 +57287 -1.000000 +57288 -1.000000 +57289 -1.000000 +57290 -1.000000 +57291 -1.000000 +57292 -1.000000 +57293 -1.000000 +57294 -1.000000 +57295 -1.000000 +57296 -1.000000 +57297 -1.000000 +57298 -1.000000 +57299 -1.000000 +57300 -1.000000 +57301 -1.000000 +57302 -1.000000 +57303 -1.000000 +57304 -1.000000 +57305 -1.000000 +57306 -1.000000 +57307 -1.000000 +57308 -1.000000 +57309 -1.000000 +57310 -1.000000 +57311 -1.000000 +57312 -1.000000 +57313 -1.000000 +57314 -1.000000 +57315 -1.000000 +57316 -1.000000 +57317 -1.000000 +57318 -1.000000 +57319 -1.000000 +57320 -1.000000 +57321 -1.000000 +57322 -1.000000 +57323 -1.000000 +57324 -1.000000 +57325 -1.000000 +57326 -1.000000 +57327 -1.000000 +57328 -1.000000 +57329 -1.000000 +57330 -1.000000 +57331 -1.000000 +57332 -1.000000 +57333 -1.000000 +57334 -1.000000 +57335 -1.000000 +57336 -1.000000 +57337 -1.000000 +57338 -1.000000 +57339 -1.000000 +57340 -1.000000 +57341 -1.000000 +57342 -1.000000 +57343 -1.000000 +57344 -1.000000 +57345 -1.000000 +57346 -1.000000 +57347 -1.000000 +57348 -1.000000 +57349 -1.000000 +57350 -1.000000 +57351 -1.000000 +57352 -1.000000 +57353 -1.000000 +57354 -1.000000 +57355 -1.000000 +57356 -1.000000 +57357 -1.000000 +57358 -1.000000 +57359 -1.000000 +57360 -1.000000 +57361 -1.000000 +57362 -1.000000 +57363 -1.000000 +57364 -1.000000 +57365 -1.000000 +57366 -1.000000 +57367 -1.000000 +57368 -1.000000 +57369 -1.000000 +57370 -1.000000 +57371 -1.000000 +57372 -1.000000 +57373 -1.000000 +57374 -1.000000 +57375 -1.000000 +57376 -1.000000 +57377 -1.000000 +57378 -1.000000 +57379 -1.000000 +57380 -1.000000 +57381 -1.000000 +57382 -1.000000 +57383 -1.000000 +57384 -1.000000 +57385 -1.000000 +57386 -1.000000 +57387 -1.000000 +57388 -1.000000 +57389 -1.000000 +57390 -1.000000 +57391 -1.000000 +57392 -1.000000 +57393 -1.000000 +57394 -1.000000 +57395 -1.000000 +57396 -1.000000 +57397 -1.000000 +57398 -1.000000 +57399 -1.000000 +57400 -1.000000 +57401 -1.000000 +57402 -1.000000 +57403 -1.000000 +57404 -1.000000 +57405 -1.000000 +57406 -1.000000 +57407 -1.000000 +57408 -1.000000 +57409 -1.000000 +57410 -1.000000 +57411 -1.000000 +57412 -1.000000 +57413 -1.000000 +57414 -1.000000 +57415 -1.000000 +57416 -1.000000 +57417 -1.000000 +57418 -1.000000 +57419 -1.000000 +57420 -1.000000 +57421 -1.000000 +57422 -1.000000 +57423 -1.000000 +57424 -1.000000 +57425 -1.000000 +57426 -1.000000 +57427 -1.000000 +57428 -1.000000 +57429 -1.000000 +57430 -1.000000 +57431 -1.000000 +57432 -1.000000 +57433 -1.000000 +57434 -1.000000 +57435 -1.000000 +57436 -1.000000 +57437 -1.000000 +57438 -1.000000 +57439 -1.000000 +57440 -1.000000 +57441 -1.000000 +57442 -1.000000 +57443 -1.000000 +57444 -1.000000 +57445 -1.000000 +57446 -1.000000 +57447 -1.000000 +57448 -1.000000 +57449 -1.000000 +57450 -1.000000 +57451 -1.000000 +57452 -1.000000 +57453 -1.000000 +57454 -1.000000 +57455 -1.000000 +57456 -1.000000 +57462 -1.000000 +57463 -1.000000 +57464 -1.000000 +57465 -1.000000 +57466 -1.000000 +57467 -1.000000 +57468 -1.000000 +57469 -1.000000 +57470 -1.000000 +57471 -1.000000 +57472 -1.000000 +57473 -1.000000 +57474 -1.000000 +57475 -1.000000 +57476 -1.000000 +57477 -1.000000 +57478 -1.000000 +57479 -1.000000 +57480 -1.000000 +57481 -1.000000 +57482 -1.000000 +57483 -1.000000 +57484 -1.000000 +57485 -1.000000 +57486 -1.000000 +57487 -1.000000 +57488 -1.000000 +57489 -1.000000 +57490 -1.000000 +57491 -1.000000 +57492 -1.000000 +57493 -1.000000 +57494 -1.000000 +57495 -1.000000 +57496 -1.000000 +57497 -1.000000 +57498 -1.000000 +57499 -1.000000 +57500 -1.000000 +57501 -1.000000 +57502 -1.000000 +57503 -1.000000 +57525 -1.000000 +57526 -1.000000 +57527 -1.000000 +57528 -1.000000 +57529 -1.000000 +57530 -1.000000 +57531 -1.000000 +57532 -1.000000 +57534 -1.000000 +57535 -1.000000 +57536 -1.000000 +57537 -1.000000 +57538 -1.000000 +57539 -1.000000 +57540 -1.000000 +57541 -1.000000 +57543 -1.000000 +57544 -1.000000 +57545 -1.000000 +57546 -1.000000 +57548 -1.000000 +57549 -1.000000 +57550 -1.000000 +57551 -1.000000 +57552 -1.000000 +57553 -1.000000 +57554 -1.000000 +57555 -1.000000 +57556 -1.000000 +57557 -1.000000 +57558 -1.000000 +57559 -1.000000 +57560 -1.000000 +57561 -1.000000 +57562 -1.000000 +57563 -1.000000 +57564 -1.000000 +57565 -1.000000 +57566 -1.000000 +57567 -1.000000 +57568 -1.000000 +57569 -1.000000 +57570 -1.000000 +57571 -1.000000 +57572 -1.000000 +57573 -1.000000 +57574 -1.000000 +57575 -1.000000 +57576 -1.000000 +57577 -1.000000 +57578 -1.000000 +57579 -1.000000 +57580 -1.000000 +57581 -1.000000 +57582 -1.000000 +57583 -1.000000 +57584 -1.000000 +57585 -1.000000 +57586 -1.000000 +57587 -1.000000 +57588 -1.000000 +57589 -1.000000 +57590 -1.000000 +57591 -1.000000 +57592 -1.000000 +57593 -1.000000 +57594 -1.000000 +57595 -1.000000 +57596 -1.000000 +57597 -1.000000 +57598 -1.000000 +57599 -1.000000 +57600 -1.000000 +57601 -1.000000 +57602 -1.000000 +57603 -1.000000 +57604 -1.000000 +57605 -1.000000 +57606 -1.000000 +57607 -1.000000 +57608 -1.000000 +57609 -1.000000 +57610 -1.000000 +57611 -1.000000 +57612 -1.000000 +57613 -1.000000 +57614 -1.000000 +57615 -1.000000 +57616 -1.000000 +57617 -1.000000 +57618 -1.000000 +57619 -1.000000 +57620 -1.000000 +57621 -1.000000 +57622 -1.000000 +57623 -1.000000 +57624 -1.000000 +57625 -1.000000 +57626 -1.000000 +57627 -1.000000 +57628 -1.000000 +57629 -1.000000 +57630 -1.000000 +57631 -1.000000 +57632 -1.000000 +57633 -1.000000 +57634 -1.000000 +57635 -1.000000 +57636 -1.000000 +57637 -1.000000 +57638 -1.000000 +57639 -1.000000 +57640 -1.000000 +57641 -1.000000 +57642 -1.000000 +57643 -1.000000 +57644 -1.000000 +57645 -1.000000 +57646 -1.000000 +57647 -1.000000 +57648 -1.000000 +57649 -1.000000 +57650 -1.000000 +57651 -1.000000 +57652 -1.000000 +57653 -1.000000 +57654 -1.000000 +57655 -1.000000 +57656 -1.000000 +57657 -1.000000 +57658 -1.000000 +57659 -1.000000 +57660 -1.000000 +57661 -1.000000 +57662 -1.000000 +57663 -1.000000 +57664 -1.000000 +57665 -1.000000 +57666 -1.000000 +57667 -1.000000 +57668 -1.000000 +57669 -1.000000 +57670 -1.000000 +57671 -1.000000 +57672 -1.000000 +57673 -1.000000 +57674 -1.000000 +57675 -1.000000 +57676 -1.000000 +57677 -1.000000 +57678 -1.000000 +57679 -1.000000 +57680 -1.000000 +57681 -1.000000 +57682 -1.000000 +57683 -1.000000 +57684 -1.000000 +57685 -1.000000 +57686 -1.000000 +57687 -1.000000 +57688 -1.000000 +57689 -1.000000 +57690 -1.000000 +57691 -1.000000 +57692 -1.000000 +57693 -1.000000 +57694 -1.000000 +57695 -1.000000 +57696 -1.000000 +57697 -1.000000 +57698 -1.000000 +57699 -1.000000 +57700 -1.000000 +57701 -1.000000 +57702 -1.000000 +57703 -1.000000 +57704 -1.000000 +57705 -1.000000 +57706 -1.000000 +57707 -1.000000 +57708 -1.000000 +57709 -1.000000 +57710 -1.000000 +57711 -1.000000 +57712 -1.000000 +57713 -1.000000 +57714 -1.000000 +57715 -1.000000 +57716 -1.000000 +57717 -1.000000 +57718 -1.000000 +57719 -1.000000 +57720 -1.000000 +57721 -1.000000 +57722 -1.000000 +57723 -1.000000 +57724 -1.000000 +57725 -1.000000 +57726 -1.000000 +57727 -1.000000 +57728 -1.000000 +57729 -1.000000 +57730 -1.000000 +57731 -1.000000 +57732 -1.000000 +57733 -1.000000 +57734 -1.000000 +57735 -1.000000 +57736 -1.000000 +57737 -1.000000 +57738 -1.000000 +57739 -1.000000 +57740 -1.000000 +57741 -1.000000 +57742 -1.000000 +57743 -1.000000 +57744 -1.000000 +57745 -1.000000 +57746 -1.000000 +57747 -1.000000 +57748 -1.000000 +57749 -1.000000 +57750 -1.000000 +57751 -1.000000 +57752 -1.000000 +57753 -1.000000 +57754 -1.000000 +57755 -1.000000 +57756 -1.000000 +57757 -1.000000 +57758 -1.000000 +57759 -1.000000 +57760 -1.000000 +57761 -1.000000 +57762 -1.000000 +57763 -1.000000 +57764 -1.000000 +57765 -1.000000 +57766 -1.000000 +57767 -1.000000 +57768 -1.000000 +57769 -1.000000 +57770 -1.000000 +57771 -1.000000 +57773 -1.000000 +57774 -1.000000 +57775 -1.000000 +57776 -1.000000 +57777 -1.000000 +57778 -1.000000 +57779 -1.000000 +57780 -1.000000 +57781 -1.000000 +57782 -1.000000 +57783 -1.000000 +57784 -1.000000 +57785 -1.000000 +57786 -1.000000 +57787 -1.000000 +57788 -1.000000 +57789 -1.000000 +57790 -1.000000 +57791 -1.000000 +57792 -1.000000 +57793 -1.000000 +57794 -1.000000 +57795 -1.000000 +57796 -1.000000 +57797 -1.000000 +57798 -1.000000 +57799 -1.000000 +57800 -1.000000 +57801 -1.000000 +57802 -1.000000 +57803 -1.000000 +57804 -1.000000 +57805 -1.000000 +57806 -1.000000 +57807 -1.000000 +57808 -1.000000 +57809 -1.000000 +57810 -1.000000 +57811 -1.000000 +57812 -1.000000 +57813 -1.000000 +57814 -1.000000 +57815 -1.000000 +57816 -1.000000 +57817 -1.000000 +57818 -1.000000 +57819 -1.000000 +57820 -1.000000 +57821 -1.000000 +57822 -1.000000 +57823 -1.000000 +57824 -1.000000 +57825 -1.000000 +57826 -1.000000 +57827 -1.000000 +57828 -1.000000 +57829 -1.000000 +57830 -1.000000 +57831 -1.000000 +57832 -1.000000 +57833 -1.000000 +57834 -1.000000 +57835 -1.000000 +57836 -1.000000 +57837 -1.000000 +57838 -1.000000 +57839 -1.000000 +57840 -1.000000 +57841 -1.000000 +57842 -1.000000 +57843 -1.000000 +57844 -1.000000 +57845 -1.000000 +57848 -1.000000 +57849 -1.000000 +57858 -1.000000 +57859 -1.000000 +57860 -1.000000 +57861 -1.000000 +57862 -1.000000 +57863 -1.000000 +57864 -1.000000 +57865 -1.000000 +57866 -1.000000 +57867 -1.000000 +57868 -1.000000 +57869 -1.000000 +57870 -1.000000 +57871 -1.000000 +57872 -1.000000 +57873 -1.000000 +57874 -1.000000 +57875 -1.000000 +57876 -1.000000 +57877 -1.000000 +57878 -1.000000 +57892 -1.000000 +57893 -1.000000 +57894 -1.000000 +57895 -1.000000 +57896 -1.000000 +57897 -1.000000 +57898 -1.000000 +57899 -1.000000 +57900 -1.000000 +57901 -1.000000 +57902 -1.000000 +57903 -1.000000 +57904 -1.000000 +57905 -1.000000 +57906 -1.000000 +57907 -1.000000 +57908 -1.000000 +57909 -1.000000 +57910 -1.000000 +57911 -1.000000 +57912 -1.000000 +57913 -1.000000 +57914 -1.000000 +57915 -1.000000 +57916 -1.000000 +57917 -1.000000 +57918 -1.000000 +57919 -1.000000 +57920 -1.000000 +57921 -1.000000 +57922 -1.000000 +57923 -1.000000 +57924 -1.000000 +57925 -1.000000 +57926 -1.000000 +57927 -1.000000 +57928 -1.000000 +57929 -1.000000 +57930 -1.000000 +57931 -1.000000 +57932 -1.000000 +57933 -1.000000 +57934 -1.000000 +57935 -1.000000 +57936 -1.000000 +57937 -1.000000 +57938 -1.000000 +57939 -1.000000 +57940 -1.000000 +57941 -1.000000 +57942 -1.000000 +57943 -1.000000 +57944 -1.000000 +57945 -1.000000 +57946 -1.000000 +57947 -1.000000 +57948 -1.000000 +57949 -1.000000 +57950 -1.000000 +57951 -1.000000 +57952 -1.000000 +57953 -1.000000 +57954 -1.000000 +57955 -1.000000 +57956 -1.000000 +57957 -1.000000 +57958 -1.000000 +57959 -1.000000 +57960 -1.000000 +57961 -1.000000 +57962 -1.000000 +57963 -1.000000 +57964 -1.000000 +57965 -1.000000 +57966 -1.000000 +57967 -1.000000 +57968 -1.000000 +57969 -1.000000 +57970 -1.000000 +57971 -1.000000 +57972 -1.000000 +57973 -1.000000 +57974 -1.000000 +57975 -1.000000 +57976 -1.000000 +57977 -1.000000 +57978 -1.000000 +57979 -1.000000 +57980 -1.000000 +57981 -1.000000 +57982 -1.000000 +57984 -1.000000 +57985 -1.000000 +57986 -1.000000 +57987 -1.000000 +57988 -1.000000 +57989 -1.000000 +57990 -1.000000 +57991 -1.000000 +57992 -1.000000 +57993 -1.000000 +57994 -1.000000 +57995 -1.000000 +57996 -1.000000 +57997 -1.000000 +57998 -1.000000 +57999 -1.000000 +58000 -1.000000 +58001 -1.000000 +58002 -1.000000 +58003 -1.000000 +58004 -1.000000 +58005 -1.000000 +58006 -1.000000 +58007 -1.000000 +58008 -1.000000 +58009 -1.000000 +58010 -1.000000 +58011 -1.000000 +58012 -1.000000 +58013 -1.000000 +58014 -1.000000 +58015 -1.000000 +58016 -1.000000 +58017 -1.000000 +58018 -1.000000 +58019 -1.000000 +58020 -1.000000 +58021 -1.000000 +58022 -1.000000 +58023 -1.000000 +58024 -1.000000 +58025 -1.000000 +58026 -1.000000 +58027 -1.000000 +58028 -1.000000 +58029 -1.000000 +58030 -1.000000 +58031 -1.000000 +58032 -1.000000 +58033 -1.000000 +58034 -1.000000 +58035 -1.000000 +58036 -1.000000 +58037 -1.000000 +58038 -1.000000 +58039 -1.000000 +58040 -1.000000 +58041 -1.000000 +58042 -1.000000 +58043 -1.000000 +58044 -1.000000 +58045 -1.000000 +58046 -1.000000 +58047 -1.000000 +58048 -1.000000 +58049 -1.000000 +58050 -1.000000 +58051 -1.000000 +58052 -1.000000 +58053 -1.000000 +58054 -1.000000 +58055 -1.000000 +58056 -1.000000 +58057 -1.000000 +58058 -1.000000 +58059 -1.000000 +58060 -1.000000 +58061 -1.000000 +58062 -1.000000 +58063 -1.000000 +58064 -1.000000 +58065 -1.000000 +58066 -1.000000 +58067 -1.000000 +58068 -1.000000 +58069 -1.000000 +58070 -1.000000 +58071 -1.000000 +58072 -1.000000 +58073 -1.000000 +58074 -1.000000 +58075 -1.000000 +58076 -1.000000 +58077 -1.000000 +58078 -1.000000 +58079 -1.000000 +58080 -1.000000 +58081 -1.000000 +58082 -1.000000 +58083 -1.000000 +58084 -1.000000 +58085 -1.000000 +58086 -1.000000 +58087 -1.000000 +58088 -1.000000 +58089 -1.000000 +58090 -1.000000 +58091 -1.000000 +58092 -1.000000 +58093 -1.000000 +58094 -1.000000 +58095 -1.000000 +58096 -1.000000 +58097 -1.000000 +58098 -1.000000 +58099 -1.000000 +58100 -1.000000 +58101 -1.000000 +58102 -1.000000 +58103 -1.000000 +58104 -1.000000 +58105 -1.000000 +58106 -1.000000 +58107 -1.000000 +58108 -1.000000 +58109 -1.000000 +58110 -1.000000 +58111 -1.000000 +58112 -1.000000 +58113 -1.000000 +58114 -1.000000 +58115 -1.000000 +58116 -1.000000 +58117 -1.000000 +58118 -1.000000 +58119 -1.000000 +58120 -1.000000 +58121 -1.000000 +58122 -1.000000 +58123 -1.000000 +58124 -1.000000 +58125 -1.000000 +58126 -1.000000 +58127 -1.000000 +58128 -1.000000 +58129 -1.000000 +58130 -1.000000 +58131 -1.000000 +58132 -1.000000 +58133 -1.000000 +58134 -1.000000 +58135 -1.000000 +58136 -1.000000 +58137 -1.000000 +58138 -1.000000 +58139 -1.000000 +58140 -1.000000 +58141 -1.000000 +58142 -1.000000 +58143 -1.000000 +58144 -1.000000 +58145 -1.000000 +58146 -1.000000 +58147 -1.000000 +58148 -1.000000 +58149 -1.000000 +58150 -1.000000 +58151 -1.000000 +58152 -1.000000 +58153 -1.000000 +58154 -1.000000 +58155 -1.000000 +58156 -1.000000 +58157 -1.000000 +58158 -1.000000 +58159 -1.000000 +58160 -1.000000 +58161 -1.000000 +58162 -1.000000 +58163 -1.000000 +58164 -1.000000 +58165 -1.000000 +58166 -1.000000 +58167 -1.000000 +58168 -1.000000 +58169 -1.000000 +58170 -1.000000 +58171 -1.000000 +58172 -1.000000 +58173 -1.000000 +58174 -1.000000 +58175 -1.000000 +58176 -1.000000 +58177 -1.000000 +58178 -1.000000 +58179 -1.000000 +58180 -1.000000 +58181 -1.000000 +58182 -1.000000 +58183 -1.000000 +58184 -1.000000 +58185 -1.000000 +58186 -1.000000 +58187 -1.000000 +58188 -1.000000 +58189 -1.000000 +58190 -1.000000 +58191 -1.000000 +58192 -1.000000 +58193 -1.000000 +58194 -1.000000 +58195 -1.000000 +58196 -1.000000 +58197 -1.000000 +58198 -1.000000 +58199 -1.000000 +58200 -1.000000 +58201 -1.000000 +58202 -1.000000 +58203 -1.000000 +58204 -1.000000 +58205 -1.000000 +58206 -1.000000 +58207 -1.000000 +58208 -1.000000 +58209 -1.000000 +58210 -1.000000 +58211 -1.000000 +58213 -1.000000 +58214 -1.000000 +58215 -1.000000 +58216 -1.000000 +58217 -1.000000 +58218 -1.000000 +58219 -1.000000 +58220 -1.000000 +58221 -1.000000 +58222 -1.000000 +58223 -1.000000 +58224 -1.000000 +58225 -1.000000 +58226 -1.000000 +58227 -1.000000 +58229 -1.000000 +58230 -1.000000 +58231 -1.000000 +58232 -1.000000 +58233 -1.000000 +58234 -1.000000 +58235 -1.000000 +58236 -1.000000 +58237 -1.000000 +58238 -1.000000 +58239 -1.000000 +58240 -1.000000 +58241 -1.000000 +58242 -1.000000 +58243 -1.000000 +58244 -1.000000 +58245 -1.000000 +58246 -1.000000 +58247 -1.000000 +58248 -1.000000 +58249 -1.000000 +58250 -1.000000 +58251 -1.000000 +58252 -1.000000 +58253 -1.000000 +58254 -1.000000 +58255 -1.000000 +58256 -1.000000 +58257 -1.000000 +58258 -1.000000 +58259 -1.000000 +58260 -1.000000 +58261 -1.000000 +58262 -1.000000 +58263 -1.000000 +58264 -1.000000 +58265 -1.000000 +58266 -1.000000 +58267 -1.000000 +58268 -1.000000 +58269 -1.000000 +58270 -1.000000 +58271 -1.000000 +58272 -1.000000 +58273 -1.000000 +58274 -1.000000 +58275 -1.000000 +58276 -1.000000 +58277 -1.000000 +58278 -1.000000 +58279 -1.000000 +58280 -1.000000 +58281 -1.000000 +58282 -1.000000 +58283 -1.000000 +58284 -1.000000 +58285 -1.000000 +58286 -1.000000 +58287 -1.000000 +58288 -1.000000 +58289 -1.000000 +58290 -1.000000 +58291 -1.000000 +58292 -1.000000 +58293 -1.000000 +58294 -1.000000 +58295 -1.000000 +58296 -1.000000 +58297 -1.000000 +58298 -1.000000 +58299 -1.000000 +58300 -1.000000 +58302 -1.000000 +58303 -1.000000 +58304 -1.000000 +58305 -1.000000 +58306 -1.000000 +58307 -1.000000 +58308 -1.000000 +58309 -1.000000 +58310 -1.000000 +58311 -1.000000 +58312 -1.000000 +58313 -1.000000 +58314 -1.000000 +58315 -1.000000 +58316 -1.000000 +58317 -1.000000 +58318 -1.000000 +58319 -1.000000 +58320 -1.000000 +58321 -1.000000 +58322 -1.000000 +58323 -1.000000 +58324 -1.000000 +58325 -1.000000 +58326 -1.000000 +58327 -1.000000 +58328 -1.000000 +58329 -1.000000 +58330 -1.000000 +58331 -1.000000 +58332 -1.000000 +58333 -1.000000 +58334 -1.000000 +58335 -1.000000 +58336 -1.000000 +58337 -1.000000 +58338 -1.000000 +58339 -1.000000 +58340 -1.000000 +58341 -1.000000 +58342 -1.000000 +58343 -1.000000 +58344 -1.000000 +58345 -1.000000 +58346 -1.000000 +58347 -1.000000 +58348 -1.000000 +58349 -1.000000 +58350 -1.000000 +58351 -1.000000 +58352 -1.000000 +58353 -1.000000 +58354 -1.000000 +58355 -1.000000 +58356 -1.000000 +58357 -1.000000 +58358 -1.000000 +58359 -1.000000 +58360 -1.000000 +58361 -1.000000 +58362 -1.000000 +58363 -1.000000 +58364 -1.000000 +58365 -1.000000 +58366 -1.000000 +58367 -1.000000 +58368 -1.000000 +58369 -1.000000 +58370 -1.000000 +58371 -1.000000 +58372 -1.000000 +58373 -1.000000 +58374 -1.000000 +58375 -1.000000 +58376 -1.000000 +58377 -1.000000 +58378 -1.000000 +58379 -1.000000 +58380 -1.000000 +58381 -1.000000 +58382 -1.000000 +58383 -1.000000 +58384 -1.000000 +58385 -1.000000 +58386 -1.000000 +58387 -1.000000 +58388 -1.000000 +58389 -1.000000 +58390 -1.000000 +58391 -1.000000 +58392 -1.000000 +58393 -1.000000 +58394 -1.000000 +58395 -1.000000 +58396 -1.000000 +58397 -1.000000 +58398 -1.000000 +58399 -1.000000 +58400 -1.000000 +58401 -1.000000 +58402 -1.000000 +58404 -1.000000 +58405 -1.000000 +58406 -1.000000 +58407 -1.000000 +58408 -1.000000 +58413 -1.000000 +58414 -1.000000 +58415 -1.000000 +58416 -1.000000 +58417 -1.000000 +58418 -1.000000 +58419 -1.000000 +58420 -1.000000 +58421 -1.000000 +58422 -1.000000 +58423 -1.000000 +58424 -1.000000 +58425 -1.000000 +58426 -1.000000 +58427 -1.000000 +58428 -1.000000 +58429 -1.000000 +58430 -1.000000 +58431 -1.000000 +58432 -1.000000 +58433 -1.000000 +58434 -1.000000 +58435 -1.000000 +58436 -1.000000 +58437 -1.000000 +58438 -1.000000 +58439 -1.000000 +58440 -1.000000 +58441 -1.000000 +58442 -1.000000 +58443 -1.000000 +58444 -1.000000 +58445 -1.000000 +58446 -1.000000 +58447 -1.000000 +58448 -1.000000 +58449 -1.000000 +58450 -1.000000 +58451 -1.000000 +58452 -1.000000 +58453 -1.000000 +58454 -1.000000 +58455 -1.000000 +58456 -1.000000 +58457 -1.000000 +58458 -1.000000 +58459 -1.000000 +58460 -1.000000 +58461 -1.000000 +58462 -1.000000 +58463 -1.000000 +58464 -1.000000 +58465 -1.000000 +58466 -1.000000 +58467 -1.000000 +58468 -1.000000 +58469 -1.000000 +58470 -1.000000 +58471 -1.000000 +58472 -1.000000 +58473 -1.000000 +58474 -1.000000 +58475 -1.000000 +58476 -1.000000 +58477 -1.000000 +58478 -1.000000 +58479 -1.000000 +58480 -1.000000 +58481 -1.000000 +58482 -1.000000 +58483 -1.000000 +58484 -1.000000 +58485 -1.000000 +58486 -1.000000 +58487 -1.000000 +58488 -1.000000 +58489 -1.000000 +58490 -1.000000 +58491 -1.000000 +58492 -1.000000 +58493 -1.000000 +58494 -1.000000 +58495 -1.000000 +58496 -1.000000 +58497 -1.000000 +58498 -1.000000 +58499 -1.000000 +58500 -1.000000 +58501 -1.000000 +58502 -1.000000 +58503 -1.000000 +58504 -1.000000 +58505 -1.000000 +58506 -1.000000 +58507 -1.000000 +58508 -1.000000 +58509 -1.000000 +58510 -1.000000 +58511 -1.000000 +58512 -1.000000 +58513 -1.000000 +58514 -1.000000 +58515 -1.000000 +58516 -1.000000 +58517 -1.000000 +58518 -1.000000 +58519 -1.000000 +58520 -1.000000 +58521 -1.000000 +58522 -1.000000 +58523 -1.000000 +58524 -1.000000 +58525 -1.000000 +58526 -1.000000 +58527 -1.000000 +58528 -1.000000 +58529 -1.000000 +58530 -1.000000 +58531 -1.000000 +58532 -1.000000 +58533 -1.000000 +58534 -1.000000 +58535 -1.000000 +58536 -1.000000 +58537 -1.000000 +58538 -1.000000 +58539 -1.000000 +58540 -1.000000 +58541 -1.000000 +58542 -1.000000 +58543 -1.000000 +58544 -1.000000 +58545 -1.000000 +58546 -1.000000 +58547 -1.000000 +58548 -1.000000 +58549 -1.000000 +58550 -1.000000 +58551 -1.000000 +58552 -1.000000 +58553 -1.000000 +58554 -1.000000 +58555 -1.000000 +58556 -1.000000 +58557 -1.000000 +58558 -1.000000 +58559 -1.000000 +58560 -1.000000 +58561 -1.000000 +58562 -1.000000 +58563 -1.000000 +58564 -1.000000 +58565 -1.000000 +58566 -1.000000 +58567 -1.000000 +58568 -1.000000 +58569 -1.000000 +58570 -1.000000 +58571 -1.000000 +58572 -1.000000 +58573 -1.000000 +58574 -1.000000 +58575 -1.000000 +58576 -1.000000 +58577 -1.000000 +58578 -1.000000 +58579 -1.000000 +58580 -1.000000 +58581 -1.000000 +58582 -1.000000 +58583 -1.000000 +58584 -1.000000 +58585 -1.000000 +58586 -1.000000 +58587 -1.000000 +58588 -1.000000 +58589 -1.000000 +58590 -1.000000 +58591 -1.000000 +58594 -1.000000 +58595 -1.000000 +58596 -1.000000 +58597 -1.000000 +58598 -1.000000 +58599 -1.000000 +58600 -1.000000 +58601 -1.000000 +58602 -1.000000 +58603 -1.000000 +58604 -1.000000 +58605 -1.000000 +58606 -1.000000 +58607 -1.000000 +58608 -1.000000 +58609 -1.000000 +58610 -1.000000 +58611 -1.000000 +58612 -1.000000 +58613 -1.000000 +58614 -1.000000 +58615 -1.000000 +58616 -1.000000 +58617 -1.000000 +58618 -1.000000 +58619 -1.000000 +58620 -1.000000 +58621 -1.000000 +58622 -1.000000 +58623 -1.000000 +58624 -1.000000 +58625 -1.000000 +58626 -1.000000 +58627 -1.000000 +58628 -1.000000 +58629 -1.000000 +58630 -1.000000 +58631 -1.000000 +58632 -1.000000 +58633 -1.000000 +58634 -1.000000 +58635 -1.000000 +58636 -1.000000 +58637 -1.000000 +58638 -1.000000 +58639 -1.000000 +58640 -1.000000 +58641 -1.000000 +58642 -1.000000 +58643 -1.000000 +58644 -1.000000 +58645 -1.000000 +58646 -1.000000 +58647 -1.000000 +58648 -1.000000 +58649 -1.000000 +58650 -1.000000 +58651 -1.000000 +58652 -1.000000 +58653 -1.000000 +58654 -1.000000 +58655 -1.000000 +58656 -1.000000 +58657 -1.000000 +58658 -1.000000 +58659 -1.000000 +58660 -1.000000 +58661 -1.000000 +58662 -1.000000 +58663 -1.000000 +58664 -1.000000 +58665 -1.000000 +58666 -1.000000 +58667 -1.000000 +58668 -1.000000 +58669 -1.000000 +58670 -1.000000 +58671 -1.000000 +58672 -1.000000 +58673 -1.000000 +58674 -1.000000 +58675 -1.000000 +58676 -1.000000 +58677 -1.000000 +58678 -1.000000 +58679 -1.000000 +58680 -1.000000 +58681 -1.000000 +58682 -1.000000 +58683 -1.000000 +58684 -1.000000 +58686 -1.000000 +58687 -1.000000 +58688 -1.000000 +58689 -1.000000 +58690 -1.000000 +58691 -1.000000 +58692 -1.000000 +58693 -1.000000 +58694 -1.000000 +58695 -1.000000 +58696 -1.000000 +58697 -1.000000 +58698 -1.000000 +58699 -1.000000 +58700 -1.000000 +58701 -1.000000 +58702 -1.000000 +58703 -1.000000 +58704 -1.000000 +58705 -1.000000 +58706 -1.000000 +58707 -1.000000 +58708 -1.000000 +58709 -1.000000 +58710 -1.000000 +58711 -1.000000 +58712 -1.000000 +58713 -1.000000 +58714 -1.000000 +58715 -1.000000 +58716 -1.000000 +58717 -1.000000 +58718 -1.000000 +58719 -1.000000 +58720 -1.000000 +58721 -1.000000 +58722 -1.000000 +58723 -1.000000 +58724 -1.000000 +58725 -1.000000 +58726 -1.000000 +58727 -1.000000 +58728 -1.000000 +58729 -1.000000 +58731 -1.000000 +58732 -1.000000 +58733 -1.000000 +58734 -1.000000 +58735 -1.000000 +58736 -1.000000 +58737 -1.000000 +58738 -1.000000 +58739 -1.000000 +58740 -1.000000 +58741 -1.000000 +58742 -1.000000 +58743 -1.000000 +58744 -1.000000 +58745 -1.000000 +58746 -1.000000 +58747 -1.000000 +58748 -1.000000 +58749 -1.000000 +58750 -1.000000 +58751 -1.000000 +58752 -1.000000 +58753 -1.000000 +58754 -1.000000 +58755 -1.000000 +58756 -1.000000 +58757 -1.000000 +58758 -1.000000 +58759 -1.000000 +58760 -1.000000 +58761 -1.000000 +58762 -1.000000 +58763 -1.000000 +58764 -1.000000 +58765 -1.000000 +58766 -1.000000 +58767 -1.000000 +58768 -1.000000 +58769 -1.000000 +58770 -1.000000 +58771 -1.000000 +58772 -1.000000 +58773 -1.000000 +58774 -1.000000 +58775 -1.000000 +58776 -1.000000 +58777 -1.000000 +58778 -1.000000 +58779 -1.000000 +58780 -1.000000 +58781 -1.000000 +58782 -1.000000 +58783 -1.000000 +58784 -1.000000 +58785 -1.000000 +58786 -1.000000 +58787 -1.000000 +58788 -1.000000 +58789 -1.000000 +58790 -1.000000 +58791 -1.000000 +58792 -1.000000 +58793 -1.000000 +58794 -1.000000 +58795 -1.000000 +58796 -1.000000 +58797 -1.000000 +58798 -1.000000 +58799 -1.000000 +58800 -1.000000 +58801 -1.000000 +58802 -1.000000 +58803 -1.000000 +58804 -1.000000 +58805 -1.000000 +58806 -1.000000 +58807 -1.000000 +58808 -1.000000 +58809 -1.000000 +58810 -1.000000 +58811 -1.000000 +58812 -1.000000 +58813 -1.000000 +58814 -1.000000 +58815 -1.000000 +58816 -1.000000 +58817 -1.000000 +58818 -1.000000 +58819 -1.000000 +58820 -1.000000 +58821 -1.000000 +58822 -1.000000 +58823 -1.000000 +58824 -1.000000 +58825 -1.000000 +58826 -1.000000 +58827 -1.000000 +58828 -1.000000 +58829 -1.000000 +58830 -1.000000 +58831 -1.000000 +58832 -1.000000 +58833 -1.000000 +58834 -1.000000 +58835 -1.000000 +58836 -1.000000 +58837 -1.000000 +58838 -1.000000 +58839 -1.000000 +58840 -1.000000 +58841 -1.000000 +58842 -1.000000 +58843 -1.000000 +58844 -1.000000 +58845 -1.000000 +58846 -1.000000 +58847 -1.000000 +58848 -1.000000 +58849 -1.000000 +58850 -1.000000 +58851 -1.000000 +58852 -1.000000 +58853 -1.000000 +58854 -1.000000 +58855 -1.000000 +58856 -1.000000 +58857 -1.000000 +58858 -1.000000 +58859 -1.000000 +58860 -1.000000 +58861 -1.000000 +58862 -1.000000 +58863 -1.000000 +58864 -1.000000 +58865 -1.000000 +58866 -1.000000 +58867 -1.000000 +58868 -1.000000 +58869 -1.000000 +58870 -1.000000 +58871 -1.000000 +58872 -1.000000 +58873 -1.000000 +58874 -1.000000 +58877 -1.000000 +58878 -1.000000 +58879 -1.000000 +58880 -1.000000 +58881 -1.000000 +58882 -1.000000 +58883 -1.000000 +58884 -1.000000 +58885 -1.000000 +58886 -1.000000 +58887 -1.000000 +58888 -1.000000 +58889 -1.000000 +58890 -1.000000 +58891 -1.000000 +58892 -1.000000 +58893 -1.000000 +58894 -1.000000 +58895 -1.000000 +58896 -1.000000 +58897 -1.000000 +58898 -1.000000 +58899 -1.000000 +58900 -1.000000 +58901 -1.000000 +58902 -1.000000 +58903 -1.000000 +58904 -1.000000 +58905 -1.000000 +58906 -1.000000 +58907 -1.000000 +58908 -1.000000 +58909 -1.000000 +58910 -1.000000 +58911 -1.000000 +58912 -1.000000 +58913 -1.000000 +58914 -1.000000 +58915 -1.000000 +58916 -1.000000 +58917 -1.000000 +58918 -1.000000 +58919 -1.000000 +58920 -1.000000 +58921 -1.000000 +58922 -1.000000 +58923 -1.000000 +58924 -1.000000 +58925 -1.000000 +58926 -1.000000 +58927 -1.000000 +58930 -1.000000 +58931 -1.000000 +58932 -1.000000 +58933 -1.000000 +58934 -1.000000 +58935 -1.000000 +58936 -1.000000 +58937 -1.000000 +58938 -1.000000 +58939 -1.000000 +58941 -1.000000 +58942 -1.000000 +58943 -1.000000 +58944 -1.000000 +58945 -1.000000 +58946 -1.000000 +58947 -1.000000 +58948 -1.000000 +58949 -1.000000 +58950 -1.000000 +58951 -1.000000 +58952 -1.000000 +58953 -1.000000 +58954 -1.000000 +58955 -1.000000 +58956 -1.000000 +58957 -1.000000 +58958 -1.000000 +58959 -1.000000 +58960 -1.000000 +58961 -1.000000 +58962 -1.000000 +58963 -1.000000 +58964 -1.000000 +58965 -1.000000 +58966 -1.000000 +58967 -1.000000 +58968 -1.000000 +58969 -1.000000 +58970 -1.000000 +58971 -1.000000 +58972 -1.000000 +58973 -1.000000 +58974 -1.000000 +58975 -1.000000 +58976 -1.000000 +58977 -1.000000 +58978 -1.000000 +58979 -1.000000 +58980 -1.000000 +58981 -1.000000 +58982 -1.000000 +58983 -1.000000 +58984 -1.000000 +58985 -1.000000 +58986 -1.000000 +58987 -1.000000 +58988 -1.000000 +58989 -1.000000 +58990 -1.000000 +58991 -1.000000 +58992 -1.000000 +58993 -1.000000 +58994 -1.000000 +58995 -1.000000 +58996 -1.000000 +58997 -1.000000 +58998 -1.000000 +58999 -1.000000 +59000 -1.000000 +59001 -1.000000 +59002 -1.000000 +59003 -1.000000 +59004 -1.000000 +59005 -1.000000 +59006 -1.000000 +59007 -1.000000 +59008 -1.000000 +59009 -1.000000 +59010 -1.000000 +59011 -1.000000 +59012 -1.000000 +59013 -1.000000 +59014 -1.000000 +59015 -1.000000 +59016 -1.000000 +59017 -1.000000 +59018 -1.000000 +59019 -1.000000 +59020 -1.000000 +59021 -1.000000 +59022 -1.000000 +59023 -1.000000 +59024 -1.000000 +59025 -1.000000 +59026 -1.000000 +59027 -1.000000 +59028 -1.000000 +59029 -1.000000 +59030 -1.000000 +59031 -1.000000 +59032 -1.000000 +59033 -1.000000 +59034 -1.000000 +59035 -1.000000 +59036 -1.000000 +59037 -1.000000 +59038 -1.000000 +59039 -1.000000 +59040 -1.000000 +59041 -1.000000 +59042 -1.000000 +59043 -1.000000 +59044 -1.000000 +59045 -1.000000 +59046 -1.000000 +59047 -1.000000 +59048 -1.000000 +59049 -1.000000 +59050 -1.000000 +59051 -1.000000 +59052 -1.000000 +59053 -1.000000 +59054 -1.000000 +59055 -1.000000 +59056 -1.000000 +59057 -1.000000 +59058 -1.000000 +59059 -1.000000 +59060 -1.000000 +59061 -1.000000 +59062 -1.000000 +59063 -1.000000 +59064 -1.000000 +59065 -1.000000 +59066 -1.000000 +59067 -1.000000 +59068 -1.000000 +59069 -1.000000 +59070 -1.000000 +59071 -1.000000 +59072 -1.000000 +59073 -1.000000 +59074 -1.000000 +59075 -1.000000 +59076 -1.000000 +59077 -1.000000 +59078 -1.000000 +59079 -1.000000 +59080 -1.000000 +59081 -1.000000 +59082 -1.000000 +59083 -1.000000 +59084 -1.000000 +59085 -1.000000 +59086 -1.000000 +59087 -1.000000 +59088 -1.000000 +59089 -1.000000 +59090 -1.000000 +59091 -1.000000 +59092 -1.000000 +59093 -1.000000 +59094 -1.000000 +59095 -1.000000 +59096 -1.000000 +59097 -1.000000 +59098 -1.000000 +59099 -1.000000 +59100 -1.000000 +59101 -1.000000 +59102 -1.000000 +59103 -1.000000 +59104 -1.000000 +59105 -1.000000 +59106 -1.000000 +59107 -1.000000 +59108 -1.000000 +59109 -1.000000 +59110 -1.000000 +59111 -1.000000 +59112 -1.000000 +59113 -1.000000 +59114 -1.000000 +59115 -1.000000 +59116 -1.000000 +59117 -1.000000 +59118 -1.000000 +59119 -1.000000 +59120 -1.000000 +59121 -1.000000 +59122 -1.000000 +59123 -1.000000 +59124 -1.000000 +59125 -1.000000 +59126 -1.000000 +59127 -1.000000 +59128 -1.000000 +59129 -1.000000 +59130 -1.000000 +59131 -1.000000 +59132 -1.000000 +59133 -1.000000 +59134 -1.000000 +59135 -1.000000 +59136 -1.000000 +59137 -1.000000 +59138 -1.000000 +59140 -1.000000 +59141 -1.000000 +59142 -1.000000 +59143 -1.000000 +59144 -1.000000 +59145 -1.000000 +59146 -1.000000 +59148 -1.000000 +59149 -1.000000 +59150 -1.000000 +59151 -1.000000 +59152 -1.000000 +59153 -1.000000 +59154 -1.000000 +59155 -1.000000 +59156 -1.000000 +59157 -1.000000 +59158 -1.000000 +59159 -1.000000 +59160 -1.000000 +59161 -1.000000 +59162 -1.000000 +59163 -1.000000 +59164 -1.000000 +59165 -1.000000 +59166 -1.000000 +59167 -1.000000 +59168 -1.000000 +59169 -1.000000 +59170 -1.000000 +59171 -1.000000 +59172 -1.000000 +59173 -1.000000 +59174 -1.000000 +59175 -1.000000 +59176 -1.000000 +59177 -1.000000 +59178 -1.000000 +59179 -1.000000 +59180 -1.000000 +59181 -1.000000 +59182 -1.000000 +59183 -1.000000 +59184 -1.000000 +59185 -1.000000 +59186 -1.000000 +59187 -1.000000 +59188 -1.000000 +59189 -1.000000 +59190 -1.000000 +59191 -1.000000 +59192 -1.000000 +59193 -1.000000 +59194 -1.000000 +59195 -1.000000 +59196 -1.000000 +59197 -1.000000 +59198 -1.000000 +59199 -1.000000 +59200 -1.000000 +59201 -1.000000 +59202 -1.000000 +59203 -1.000000 +59204 -1.000000 +59205 -1.000000 +59206 -1.000000 +59207 -1.000000 +59208 -1.000000 +59209 -1.000000 +59210 -1.000000 +59211 -1.000000 +59212 -1.000000 +59213 -1.000000 +59214 -1.000000 +59215 -1.000000 +59216 -1.000000 +59217 -1.000000 +59218 -1.000000 +59219 -1.000000 +59220 -1.000000 +59221 -1.000000 +59222 -1.000000 +59223 -1.000000 +59224 -1.000000 +59225 -1.000000 +59226 -1.000000 +59227 -1.000000 +59228 -1.000000 +59229 -1.000000 +59230 -1.000000 +59231 -1.000000 +59232 -1.000000 +59233 -1.000000 +59234 -1.000000 +59235 -1.000000 +59236 -1.000000 +59237 -1.000000 +59238 -1.000000 +59239 -1.000000 +59240 -1.000000 +59241 -1.000000 +59242 -1.000000 +59243 -1.000000 +59244 -1.000000 +59246 -1.000000 +59247 -1.000000 +59248 -1.000000 +59249 -1.000000 +59250 -1.000000 +59251 -1.000000 +59252 -1.000000 +59253 -1.000000 +59254 -1.000000 +59255 -1.000000 +59256 -1.000000 +59257 -1.000000 +59258 -1.000000 +59259 -1.000000 +59260 -1.000000 +59261 -1.000000 +59262 -1.000000 +59263 -1.000000 +59264 -1.000000 +59265 -1.000000 +59266 -1.000000 +59267 -1.000000 +59268 -1.000000 +59269 -1.000000 +59270 -1.000000 +59271 -1.000000 +59272 -1.000000 +59273 -1.000000 +59274 -1.000000 +59276 -1.000000 +59277 -1.000000 +59278 -1.000000 +59279 -1.000000 +59280 -1.000000 +59281 -1.000000 +59282 -1.000000 +59283 -1.000000 +59286 -1.000000 +59287 -1.000000 +59288 -1.000000 +59289 -1.000000 +59290 -1.000000 +59291 -1.000000 +59292 -1.000000 +59293 -1.000000 +59294 -1.000000 +59295 -1.000000 +59296 -1.000000 +59297 -1.000000 +59298 -1.000000 +59299 -1.000000 +59300 -1.000000 +59301 -1.000000 +59302 -1.000000 +59303 -1.000000 +59304 -1.000000 +59305 -1.000000 +59306 -1.000000 +59307 -1.000000 +59308 -1.000000 +59309 -1.000000 +59310 -1.000000 +59311 -1.000000 +59312 -1.000000 +59313 -1.000000 +59314 -1.000000 +59315 -1.000000 +59316 -1.000000 +59317 -1.000000 +59318 -1.000000 +59319 -1.000000 +59320 -1.000000 +59321 -1.000000 +59322 -1.000000 +59323 -1.000000 +59324 -1.000000 +59325 -1.000000 +59326 -1.000000 +59327 -1.000000 +59328 -1.000000 +59329 -1.000000 +59330 -1.000000 +59331 -1.000000 +59332 -1.000000 +59333 -1.000000 +59334 -1.000000 +59335 -1.000000 +59336 -1.000000 +59337 -1.000000 +59338 -1.000000 +59339 -1.000000 +59340 -1.000000 +59341 -1.000000 +59342 -1.000000 +59343 -1.000000 +59344 -1.000000 +59345 -1.000000 +59346 -1.000000 +59347 -1.000000 +59348 -1.000000 +59349 -1.000000 +59350 -1.000000 +59351 -1.000000 +59352 -1.000000 +59353 -1.000000 +59354 -1.000000 +59355 -1.000000 +59356 -1.000000 +59357 -1.000000 +59358 -1.000000 +59359 -1.000000 +59360 -1.000000 +59361 -1.000000 +59362 -1.000000 +59363 -1.000000 +59364 -1.000000 +59365 -1.000000 +59366 -1.000000 +59367 -1.000000 +59368 -1.000000 +59369 -1.000000 +59370 -1.000000 +59371 -1.000000 +59372 -1.000000 +59373 -1.000000 +59374 -1.000000 +59375 -1.000000 +59376 -1.000000 +59377 -1.000000 +59378 -1.000000 +59379 -1.000000 +59380 -1.000000 +59381 -1.000000 +59382 -1.000000 +59383 -1.000000 +59384 -1.000000 +59385 -1.000000 +59386 -1.000000 +59387 -1.000000 +59388 -1.000000 +59389 -1.000000 +59390 -1.000000 +59391 -1.000000 +59392 -1.000000 +59393 -1.000000 +59394 -1.000000 +59395 -1.000000 +59396 -1.000000 +59397 -1.000000 +59398 -1.000000 +59399 -1.000000 +59400 -1.000000 +59401 -1.000000 +59402 -1.000000 +59403 -1.000000 +59404 -1.000000 +59405 -1.000000 +59406 -1.000000 +59407 -1.000000 +59408 -1.000000 +59409 -1.000000 +59410 -1.000000 +59411 -1.000000 +59412 -1.000000 +59413 -1.000000 +59414 -1.000000 +59415 -1.000000 +59416 -1.000000 +59417 -1.000000 +59418 -1.000000 +59419 -1.000000 +59420 -1.000000 +59421 -1.000000 +59422 -1.000000 +59423 -1.000000 +59424 -1.000000 +59425 -1.000000 +59426 -1.000000 +59427 -1.000000 +59428 -1.000000 +59429 -1.000000 +59430 -1.000000 +59431 -1.000000 +59432 -1.000000 +59433 -1.000000 +59434 -1.000000 +59435 -1.000000 +59436 -1.000000 +59437 -1.000000 +59438 -1.000000 +59439 -1.000000 +59440 -1.000000 +59441 -1.000000 +59442 -1.000000 +59443 -1.000000 +59444 -1.000000 +59445 -1.000000 +59446 -1.000000 +59447 -1.000000 +59448 -1.000000 +59449 -1.000000 +59450 -1.000000 +59451 -1.000000 +59452 -1.000000 +59453 -1.000000 +59454 -1.000000 +59455 -1.000000 +59456 -1.000000 +59457 -1.000000 +59458 -1.000000 +59459 -1.000000 +59460 -1.000000 +59461 -1.000000 +59462 -1.000000 +59463 -1.000000 +59464 -1.000000 +59465 -1.000000 +59466 -1.000000 +59467 -1.000000 +59468 -1.000000 +59469 -1.000000 +59470 -1.000000 +59471 -1.000000 +59476 -1.000000 +59477 -1.000000 +59478 -1.000000 +59479 -1.000000 +59480 -1.000000 +59481 -1.000000 +59482 -1.000000 +59483 -1.000000 +59484 -1.000000 +59485 -1.000000 +59486 -1.000000 +59487 -1.000000 +59488 -1.000000 +59489 -1.000000 +59490 -1.000000 +59500 -1.000000 +59501 -1.000000 +59502 -1.000000 +59503 -1.000000 +59504 -1.000000 +59505 -1.000000 +59506 -1.000000 +59507 -1.000000 +59508 -1.000000 +59509 -1.000000 +59511 -1.000000 +59512 -1.000000 +59513 -1.000000 +59514 -1.000000 +59515 -1.000000 +59516 -1.000000 +59517 -1.000000 +59518 -1.000000 +59519 -1.000000 +59520 -1.000000 +59521 -1.000000 +59522 -1.000000 +59523 -1.000000 +59524 -1.000000 +59525 -1.000000 +59526 -1.000000 +59527 -1.000000 +59528 -1.000000 +59529 -1.000000 +59530 -1.000000 +59531 -1.000000 +59532 -1.000000 +59533 -1.000000 +59534 -1.000000 +59535 -1.000000 +59537 -1.000000 +59538 -1.000000 +59539 -1.000000 +59540 -1.000000 +59541 -1.000000 +59542 -1.000000 +59543 -1.000000 +59544 -1.000000 +59545 -1.000000 +59546 -1.000000 +59547 -1.000000 +59548 -1.000000 +59551 -1.000000 +59552 -1.000000 +59553 -1.000000 +59554 -1.000000 +59555 -1.000000 +59556 -1.000000 +59557 -1.000000 +59558 -1.000000 +59559 -1.000000 +59560 -1.000000 +59561 -1.000000 +59562 -1.000000 +59563 -1.000000 +59564 -1.000000 +59565 -1.000000 +59566 -1.000000 +59567 -1.000000 +59568 -1.000000 +59569 -1.000000 +59570 -1.000000 +59571 -1.000000 +59572 -1.000000 +59573 -1.000000 +59574 -1.000000 +59575 -1.000000 +59576 -1.000000 +59577 -1.000000 +59578 -1.000000 +59579 -1.000000 +59580 -1.000000 +59581 -1.000000 +59582 -1.000000 +59583 -1.000000 +59584 -1.000000 +59585 -1.000000 +59586 -1.000000 +59587 -1.000000 +59588 -1.000000 +59589 -1.000000 +59590 -1.000000 +59592 -1.000000 +59593 -1.000000 +59594 -1.000000 +59595 -1.000000 +59596 -1.000000 +59597 -1.000000 +59598 -1.000000 +59599 -1.000000 +59600 -1.000000 +59601 -1.000000 +59602 -1.000000 +59603 -1.000000 +59604 -1.000000 +59605 -1.000000 +59606 -1.000000 +59607 -1.000000 +59608 -1.000000 +59609 -1.000000 +59610 -1.000000 +59611 -1.000000 +59613 -1.000000 +59614 -1.000000 +59615 -1.000000 +59616 -1.000000 +59617 -1.000000 +59618 -1.000000 +59619 -1.000000 +59620 -1.000000 +59621 -1.000000 +59622 -1.000000 +59623 -1.000000 +59624 -1.000000 +59625 -1.000000 +59626 -1.000000 +59627 -1.000000 +59628 -1.000000 +59629 -1.000000 +59630 -1.000000 +59631 -1.000000 +59632 -1.000000 +59633 -1.000000 +59634 -1.000000 +59635 -1.000000 +59636 -1.000000 +59637 -1.000000 +59638 -1.000000 +59639 -1.000000 +59640 -1.000000 +59641 -1.000000 +59642 -1.000000 +59643 -1.000000 +59644 -1.000000 +59645 -1.000000 +59646 -1.000000 +59647 -1.000000 +59648 -1.000000 +59649 -1.000000 +59650 -1.000000 +59651 -1.000000 +59652 -1.000000 +59653 -1.000000 +59654 -1.000000 +59655 -1.000000 +59656 -1.000000 +59657 -1.000000 +59658 -1.000000 +59659 -1.000000 +59660 -1.000000 +59661 -1.000000 +59662 -1.000000 +59663 -1.000000 +59664 -1.000000 +59665 -1.000000 +59666 -1.000000 +59667 -1.000000 +59668 -1.000000 +59669 -1.000000 +59670 -1.000000 +59671 -1.000000 +59672 -1.000000 +59673 -1.000000 +59674 -1.000000 +59675 -1.000000 +59676 -1.000000 +59677 -1.000000 +59678 -1.000000 +59679 -1.000000 +59680 -1.000000 +59681 -1.000000 +59682 -1.000000 +59683 -1.000000 +59684 -1.000000 +59685 -1.000000 +59691 -1.000000 +59692 -1.000000 +59693 -1.000000 +59694 -1.000000 +59695 -1.000000 +59696 -1.000000 +59697 -1.000000 +59698 -1.000000 +59699 -1.000000 +59700 -1.000000 +59701 -1.000000 +59702 -1.000000 +59703 -1.000000 +59704 -1.000000 +59705 -1.000000 +59706 -1.000000 +59707 -1.000000 +59708 -1.000000 +59709 -1.000000 +59710 -1.000000 +59711 -1.000000 +59712 -1.000000 +59713 -1.000000 +59714 -1.000000 +59715 -1.000000 +59716 -1.000000 +59717 -1.000000 +59719 -1.000000 +59720 -1.000000 +59721 -1.000000 +59723 -1.000000 +59724 -1.000000 +59725 -1.000000 +59726 -1.000000 +59727 -1.000000 +59728 -1.000000 +59729 -1.000000 +59730 -1.000000 +59731 -1.000000 +59732 -1.000000 +59733 -1.000000 +59734 -1.000000 +59735 -1.000000 +59736 -1.000000 +59737 -1.000000 +59738 -1.000000 +59739 -1.000000 +59740 -1.000000 +59741 -1.000000 +59742 -1.000000 +59743 -1.000000 +59744 -1.000000 +59745 -1.000000 +59746 -1.000000 +59747 -1.000000 +59748 -1.000000 +59749 -1.000000 +59750 -1.000000 +59751 -1.000000 +59752 -1.000000 +59753 -1.000000 +59754 -1.000000 +59755 -1.000000 +59756 -1.000000 +59757 -1.000000 +59758 -1.000000 +59759 -1.000000 +59760 -1.000000 +59761 -1.000000 +59762 -1.000000 +59763 -1.000000 +59764 -1.000000 +59765 -1.000000 +59766 -1.000000 +59767 -1.000000 +59768 -1.000000 +59769 -1.000000 +59770 -1.000000 +59771 -1.000000 +59772 -1.000000 +59773 -1.000000 +59774 -1.000000 +59775 -1.000000 +59776 -1.000000 +59777 -1.000000 +59778 -1.000000 +59779 -1.000000 +59780 -1.000000 +59781 -1.000000 +59782 -1.000000 +59783 -1.000000 +59784 -1.000000 +59785 -1.000000 +59786 -1.000000 +59787 -1.000000 +59788 -1.000000 +59789 -1.000000 +59790 -1.000000 +59791 -1.000000 +59792 -1.000000 +59793 -1.000000 +59794 -1.000000 +59795 -1.000000 +59796 -1.000000 +59797 -1.000000 +59798 -1.000000 +59799 -1.000000 +59800 -1.000000 +59801 -1.000000 +59802 -1.000000 +59803 -1.000000 +59804 -1.000000 +59805 -1.000000 +59806 -1.000000 +59808 -1.000000 +59809 -1.000000 +59810 -1.000000 +59811 -1.000000 +59813 -1.000000 +59814 -1.000000 +59815 -1.000000 +59816 -1.000000 +59817 -1.000000 +59818 -1.000000 +59832 -1.000000 +59833 -1.000000 +59834 -1.000000 +59835 -1.000000 +59836 -1.000000 +59837 -1.000000 +59838 -1.000000 +59839 -1.000000 +59840 -1.000000 +59841 -1.000000 +59842 -1.000000 +59843 -1.000000 +59844 -1.000000 +59845 -1.000000 +59846 -1.000000 +59847 -1.000000 +59848 -1.000000 +59849 -1.000000 +59850 -1.000000 +59851 -1.000000 +59852 -1.000000 +59853 -1.000000 +59854 -1.000000 +59855 -1.000000 +59856 -1.000000 +59857 -1.000000 +59858 -1.000000 +59859 -1.000000 +59860 -1.000000 +59861 -1.000000 +59862 -1.000000 +59863 -1.000000 +59864 -1.000000 +59865 -1.000000 +59866 -1.000000 +59867 -1.000000 +59868 -1.000000 +59869 -1.000000 +59870 -1.000000 +59871 -1.000000 +59872 -1.000000 +59873 -1.000000 +59874 -1.000000 +59875 -1.000000 +59876 -1.000000 +59877 -1.000000 +59878 -1.000000 +59879 -1.000000 +59880 -1.000000 +59881 -1.000000 +59882 -1.000000 +59883 -1.000000 +59884 -1.000000 +59885 -1.000000 +59886 -1.000000 +59887 -1.000000 +59888 -1.000000 +59889 -1.000000 +59890 -1.000000 +59891 -1.000000 +59892 -1.000000 +59893 -1.000000 +59894 -1.000000 +59895 -1.000000 +59896 -1.000000 +59897 -1.000000 +59898 -1.000000 +59899 -1.000000 +59900 -1.000000 +59901 -1.000000 +59902 -1.000000 +59903 -1.000000 +59904 -1.000000 +59905 -1.000000 +59906 -1.000000 +59907 -1.000000 +59908 -1.000000 +59909 -1.000000 +59910 -1.000000 +59911 -1.000000 +59912 -1.000000 +59913 -1.000000 +59914 -1.000000 +59915 -1.000000 +59916 -1.000000 +59917 -1.000000 +59918 -1.000000 +59919 -1.000000 +59920 -1.000000 +59921 -1.000000 +59922 -1.000000 +59923 -1.000000 +59924 -1.000000 +59925 -1.000000 +59926 -1.000000 +59927 -1.000000 +59928 -1.000000 +59929 -1.000000 +59930 -1.000000 +59931 -1.000000 +59932 -1.000000 +59933 -1.000000 +59934 -1.000000 +59935 -1.000000 +59936 -1.000000 +59937 -1.000000 +59938 -1.000000 +59939 -1.000000 +59940 -1.000000 +59941 -1.000000 +59942 -1.000000 +59943 -1.000000 +59944 -1.000000 +59945 -1.000000 +59946 -1.000000 +59947 -1.000000 +59948 -1.000000 +59949 -1.000000 +59950 -1.000000 +59951 -1.000000 +59952 -1.000000 +59953 -1.000000 +59954 -1.000000 +59955 -1.000000 +59956 -1.000000 +59957 -1.000000 +59959 -1.000000 +59960 -1.000000 +59961 -1.000000 +59962 -1.000000 +59963 -1.000000 +59964 -1.000000 +59965 -1.000000 +59966 -1.000000 +59967 -1.000000 +59968 -1.000000 +59969 -1.000000 +59970 -1.000000 +59971 -1.000000 +59972 -1.000000 +59973 -1.000000 +59974 -1.000000 +59975 -1.000000 +59976 -1.000000 +59977 -1.000000 +59978 -1.000000 +59979 -1.000000 +59980 -1.000000 +59981 -1.000000 +59982 -1.000000 +59983 -1.000000 +59984 -1.000000 +59985 -1.000000 +59986 -1.000000 +59987 -1.000000 +59988 -1.000000 +59989 -1.000000 +59990 -1.000000 +59991 -1.000000 +59992 -1.000000 +59993 -1.000000 +59994 -1.000000 +59995 -1.000000 +59996 -1.000000 +59997 -1.000000 +59998 -1.000000 +59999 -1.000000 +60000 -1.000000 +60001 -1.000000 +60002 -1.000000 +60003 -1.000000 +60004 -1.000000 +60005 -1.000000 +60006 -1.000000 +60007 -1.000000 +60008 -1.000000 +60009 -1.000000 +60010 -1.000000 +60011 -1.000000 +60012 -1.000000 +60013 -1.000000 +60014 -1.000000 +60015 -1.000000 +60016 -1.000000 +60017 -1.000000 +60018 -1.000000 +60019 -1.000000 +60020 -1.000000 +60021 -1.000000 +60022 -1.000000 +60023 -1.000000 +60024 -1.000000 +60025 -1.000000 +60026 -1.000000 +60028 -1.000000 +60029 -1.000000 +60030 -1.000000 +60031 -1.000000 +60032 -1.000000 +60033 -1.000000 +60034 -1.000000 +60035 -1.000000 +60036 -1.000000 +60037 -1.000000 +60038 -1.000000 +60039 -1.000000 +60040 -1.000000 +60041 -1.000000 +60042 -1.000000 +60043 -1.000000 +60044 -1.000000 +60045 -1.000000 +60046 -1.000000 +60047 -1.000000 +60048 -1.000000 +60049 -1.000000 +60050 -1.000000 +60051 -1.000000 +60052 -1.000000 +60053 -1.000000 +60054 -1.000000 +60055 -1.000000 +60056 -1.000000 +60057 -1.000000 +60058 -1.000000 +60059 -1.000000 +60060 -1.000000 +60061 -1.000000 +60062 -1.000000 +60063 -1.000000 +60064 -1.000000 +60065 -1.000000 +60066 -1.000000 +60067 -1.000000 +60068 -1.000000 +60069 -1.000000 +60070 -1.000000 +60071 -1.000000 +60072 -1.000000 +60073 -1.000000 +60074 -1.000000 +60075 -1.000000 +60076 -1.000000 +60077 -1.000000 +60078 -1.000000 +60079 -1.000000 +60080 -1.000000 +60081 -1.000000 +60082 -1.000000 +60083 -1.000000 +60084 -1.000000 +60085 -1.000000 +60086 -1.000000 +60087 -1.000000 +60088 -1.000000 +60089 -1.000000 +60090 -1.000000 +60091 -1.000000 +60092 -1.000000 +60093 -1.000000 +60094 -1.000000 +60095 -1.000000 +60096 -1.000000 +60097 -1.000000 +60098 -1.000000 +60099 -1.000000 +60100 -1.000000 +60101 -1.000000 +60102 -1.000000 +60103 -1.000000 +60104 -1.000000 +60105 -1.000000 +60106 -1.000000 +60107 -1.000000 +60108 -1.000000 +60109 -1.000000 +60110 -1.000000 +60111 -1.000000 +60112 -1.000000 +60113 -1.000000 +60114 -1.000000 +60115 -1.000000 +60116 -1.000000 +60117 -1.000000 +60118 -1.000000 +60119 -1.000000 +60120 -1.000000 +60121 -1.000000 +60122 -1.000000 +60123 -1.000000 +60124 -1.000000 +60125 -1.000000 +60126 -1.000000 +60127 -1.000000 +60128 -1.000000 +60129 -1.000000 +60130 -1.000000 +60131 -1.000000 +60132 -1.000000 +60133 -1.000000 +60134 -1.000000 +60135 -1.000000 +60136 -1.000000 +60137 -1.000000 +60138 -1.000000 +60139 -1.000000 +60140 -1.000000 +60141 -1.000000 +60142 -1.000000 +60143 -1.000000 +60144 -1.000000 +60145 -1.000000 +60146 -1.000000 +60147 -1.000000 +60148 -1.000000 +60149 -1.000000 +60150 -1.000000 +60151 -1.000000 +60152 -1.000000 +60153 -1.000000 +60154 -1.000000 +60155 -1.000000 +60156 -1.000000 +60157 -1.000000 +60158 -1.000000 +60159 -1.000000 +60160 -1.000000 +60161 -1.000000 +60162 -1.000000 +60163 -1.000000 +60164 -1.000000 +60165 -1.000000 +60166 -1.000000 +60167 -1.000000 +60168 -1.000000 +60169 -1.000000 +60170 -1.000000 +60171 -1.000000 +60172 -1.000000 +60173 -1.000000 +60174 -1.000000 +60175 -1.000000 +60176 -1.000000 +60177 -1.000000 +60178 -1.000000 +60179 -1.000000 +60180 -1.000000 +60181 -1.000000 +60182 -1.000000 +60183 -1.000000 +60184 -1.000000 +60185 -1.000000 +60186 -1.000000 +60187 -1.000000 +60188 -1.000000 +60189 -1.000000 +60190 -1.000000 +60191 -1.000000 +60192 -1.000000 +60193 -1.000000 +60194 -1.000000 +60195 -1.000000 +60196 -1.000000 +60197 -1.000000 +60198 -1.000000 +60199 -1.000000 +60200 -1.000000 +60201 -1.000000 +60202 -1.000000 +60203 -1.000000 +60204 -1.000000 +60205 -1.000000 +60206 -1.000000 +60207 -1.000000 +60208 -1.000000 +60209 -1.000000 +60210 -1.000000 +60211 -1.000000 +60212 -1.000000 +60213 -1.000000 +60214 -1.000000 +60215 -1.000000 +60216 -1.000000 +60217 -1.000000 +60218 -1.000000 +60219 -1.000000 +60220 -1.000000 +60221 -1.000000 +60222 -1.000000 +60223 -1.000000 +60224 -1.000000 +60225 -1.000000 +60226 -1.000000 +60227 -1.000000 +60228 -1.000000 +60229 -1.000000 +60230 -1.000000 +60231 -1.000000 +60232 -1.000000 +60233 -1.000000 +60234 -1.000000 +60235 -1.000000 +60236 -1.000000 +60237 -1.000000 +60238 -1.000000 +60239 -1.000000 +60240 -1.000000 +60241 -1.000000 +60242 -1.000000 +60243 -1.000000 +60244 -1.000000 +60245 -1.000000 +60246 -1.000000 +60247 -1.000000 +60248 -1.000000 +60249 -1.000000 +60250 -1.000000 +60251 -1.000000 +60252 -1.000000 +60253 -1.000000 +60254 -1.000000 +60255 -1.000000 +60256 -1.000000 +60257 -1.000000 +60258 -1.000000 +60259 -1.000000 +60260 -1.000000 +60261 -1.000000 +60262 -1.000000 +60263 -1.000000 +60264 -1.000000 +60265 -1.000000 +60266 -1.000000 +60267 -1.000000 +60268 -1.000000 +60269 -1.000000 +60270 -1.000000 +60272 -1.000000 +60273 -1.000000 +60274 -1.000000 +60275 -1.000000 +60276 -1.000000 +60277 -1.000000 +60278 -1.000000 +60279 -1.000000 +60280 -1.000000 +60281 -1.000000 +60282 -1.000000 +60283 -1.000000 +60284 -1.000000 +60285 -1.000000 +60286 -1.000000 +60287 -1.000000 +60288 -1.000000 +60289 -1.000000 +60290 -1.000000 +60291 -1.000000 +60292 -1.000000 +60293 -1.000000 +60294 -1.000000 +60295 -1.000000 +60296 -1.000000 +60297 -1.000000 +60298 -1.000000 +60299 -1.000000 +60300 -1.000000 +60301 -1.000000 +60302 -1.000000 +60303 -1.000000 +60304 -1.000000 +60305 -1.000000 +60306 -1.000000 +60307 -1.000000 +60308 -1.000000 +60309 -1.000000 +60310 -1.000000 +60311 -1.000000 +60312 -1.000000 +60313 -1.000000 +60314 -1.000000 +60315 -1.000000 +60316 -1.000000 +60317 -1.000000 +60318 -1.000000 +60319 -1.000000 +60320 -1.000000 +60321 -1.000000 +60322 -1.000000 +60323 -1.000000 +60324 -1.000000 +60325 -1.000000 +60326 -1.000000 +60327 -1.000000 +60328 -1.000000 +60329 -1.000000 +60330 -1.000000 +60331 -1.000000 +60332 -1.000000 +60333 -1.000000 +60334 -1.000000 +60335 -1.000000 +60336 -1.000000 +60337 -1.000000 +60338 -1.000000 +60339 -1.000000 +60340 -1.000000 +60341 -1.000000 +60342 -1.000000 +60343 -1.000000 +60344 -1.000000 +60345 -1.000000 +60346 -1.000000 +60347 -1.000000 +60348 -1.000000 +60349 -1.000000 +60350 -1.000000 +60351 -1.000000 +60352 -1.000000 +60353 -1.000000 +60354 -1.000000 +60355 -1.000000 +60356 -1.000000 +60357 -1.000000 +60358 -1.000000 +60359 -1.000000 +60360 -1.000000 +60361 -1.000000 +60362 -1.000000 +60363 -1.000000 +60364 -1.000000 +60365 -1.000000 +60366 -1.000000 +60367 -1.000000 +60368 -1.000000 +60369 -1.000000 +60370 -1.000000 +60371 -1.000000 +60372 -1.000000 +60373 -1.000000 +60374 -1.000000 +60375 -1.000000 +60376 -1.000000 +60377 -1.000000 +60378 -1.000000 +60379 -1.000000 +60380 -1.000000 +60381 -1.000000 +60382 -1.000000 +60383 -1.000000 +60385 -1.000000 +60386 -1.000000 +60387 -1.000000 +60388 -1.000000 +60389 -1.000000 +60390 -1.000000 +60391 -1.000000 +60392 -1.000000 +60393 -1.000000 +60394 -1.000000 +60395 -1.000000 +60396 -1.000000 +60397 -1.000000 +60398 -1.000000 +60399 -1.000000 +60400 -1.000000 +60401 -1.000000 +60402 -1.000000 +60403 -1.000000 +60404 -1.000000 +60405 -1.000000 +60406 -1.000000 +60407 -1.000000 +60408 -1.000000 +60409 -1.000000 +60410 -1.000000 +60411 -1.000000 +60412 -1.000000 +60413 -1.000000 +60414 -1.000000 +60415 -1.000000 +60416 -1.000000 +60417 -1.000000 +60418 -1.000000 +60419 -1.000000 +60420 -1.000000 +60421 -1.000000 +60422 -1.000000 +60423 -1.000000 +60424 -1.000000 +60425 -1.000000 +60426 -1.000000 +60427 -1.000000 +60428 -1.000000 +60429 -1.000000 +60430 -1.000000 +60431 -1.000000 +60432 -1.000000 +60433 -1.000000 +60435 -1.000000 +60436 -1.000000 +60437 -1.000000 +60438 -1.000000 +60439 -1.000000 +60440 -1.000000 +60441 -1.000000 +60442 -1.000000 +60443 -1.000000 +60444 -1.000000 +60445 -1.000000 +60446 -1.000000 +60447 -1.000000 +60448 -1.000000 +60449 -1.000000 +60450 -1.000000 +60451 -1.000000 +60452 -1.000000 +60453 -1.000000 +60454 -1.000000 +60455 -1.000000 +60456 -1.000000 +60457 -1.000000 +60458 -1.000000 +60459 -1.000000 +60460 -1.000000 +60461 -1.000000 +60462 -1.000000 +60463 -1.000000 +60464 -1.000000 +60465 -1.000000 +60466 -1.000000 +60467 -1.000000 +60468 -1.000000 +60469 -1.000000 +60470 -1.000000 +60471 -1.000000 +60472 -1.000000 +60473 -1.000000 +60474 -1.000000 +60475 -1.000000 +60476 -1.000000 +60477 -1.000000 +60478 -1.000000 +60479 -1.000000 +60480 -1.000000 +60481 -1.000000 +60482 -1.000000 +60483 -1.000000 +60484 -1.000000 +60485 -1.000000 +60486 -1.000000 +60487 -1.000000 +60488 -1.000000 +60489 -1.000000 +60490 -1.000000 +60491 -1.000000 +60492 -1.000000 +60493 -1.000000 +60494 -1.000000 +60495 -1.000000 +60496 -1.000000 +60497 -1.000000 +60498 -1.000000 +60499 -1.000000 +60500 -1.000000 +60501 -1.000000 +60502 -1.000000 +60503 -1.000000 +60504 -1.000000 +60505 -1.000000 +60506 -1.000000 +60507 -1.000000 +60508 -1.000000 +60509 -1.000000 +60510 -1.000000 +60511 -1.000000 +60512 -1.000000 +60513 -1.000000 +60514 -1.000000 +60515 -1.000000 +60516 -1.000000 +60517 -1.000000 +60518 -1.000000 +60519 -1.000000 +60520 -1.000000 +60521 -1.000000 +60522 -1.000000 +60523 -1.000000 +60524 -1.000000 +60525 -1.000000 +60526 -1.000000 +60530 -1.000000 +60531 -1.000000 +60532 -1.000000 +60533 -1.000000 +60534 -1.000000 +60535 -1.000000 +60536 -1.000000 +60537 -1.000000 +60538 -1.000000 +60539 -1.000000 +60540 -1.000000 +60541 -1.000000 +60542 -1.000000 +60543 -1.000000 +60544 -1.000000 +60545 -1.000000 +60546 -1.000000 +60547 -1.000000 +60548 -1.000000 +60549 -1.000000 +60550 -1.000000 +60551 -1.000000 +60552 -1.000000 +60553 -1.000000 +60554 -1.000000 +60555 -1.000000 +60556 -1.000000 +60557 -1.000000 +60558 -1.000000 +60559 -1.000000 +60560 -1.000000 +60561 -1.000000 +60562 -1.000000 +60563 -1.000000 +60564 -1.000000 +60565 -1.000000 +60566 -1.000000 +60567 -1.000000 +60568 -1.000000 +60569 -1.000000 +60570 -1.000000 +60571 -1.000000 +60572 -1.000000 +60573 -1.000000 +60574 -1.000000 +60575 -1.000000 +60576 -1.000000 +60577 -1.000000 +60579 -1.000000 +60580 -1.000000 +60581 -1.000000 +60582 -1.000000 +60583 -1.000000 +60584 -1.000000 +60585 -1.000000 +60586 -1.000000 +60587 -1.000000 +60588 -1.000000 +60589 -1.000000 +60590 -1.000000 +60591 -1.000000 +60592 -1.000000 +60593 -1.000000 +60594 -1.000000 +60595 -1.000000 +60596 -1.000000 +60597 -1.000000 +60598 -1.000000 +60599 -1.000000 +60600 -1.000000 +60601 -1.000000 +60602 -1.000000 +60603 -1.000000 +60604 -1.000000 +60605 -1.000000 +60606 -1.000000 +60607 -1.000000 +60608 -1.000000 +60609 -1.000000 +60610 -1.000000 +60611 -1.000000 +60612 -1.000000 +60613 -1.000000 +60614 -1.000000 +60615 -1.000000 +60616 -1.000000 +60617 -1.000000 +60618 -1.000000 +60619 -1.000000 +60620 -1.000000 +60621 -1.000000 +60622 -1.000000 +60623 -1.000000 +60624 -1.000000 +60625 -1.000000 +60626 -1.000000 +60627 -1.000000 +60628 -1.000000 +60629 -1.000000 +60630 -1.000000 +60631 -1.000000 +60632 -1.000000 +60633 -1.000000 +60634 -1.000000 +60635 -1.000000 +60636 -1.000000 +60637 -1.000000 +60638 -1.000000 +60639 -1.000000 +60640 -1.000000 +60641 -1.000000 +60642 -1.000000 +60643 -1.000000 +60644 -1.000000 +60645 -1.000000 +60646 -1.000000 +60647 -1.000000 +60648 -1.000000 +60649 -1.000000 +60650 -1.000000 +60651 -1.000000 +60652 -1.000000 +60653 -1.000000 +60654 -1.000000 +60655 -1.000000 +60656 -1.000000 +60657 -1.000000 +60658 -1.000000 +60659 -1.000000 +60660 -1.000000 +60661 -1.000000 +60662 -1.000000 +60663 -1.000000 +60664 -1.000000 +60665 -1.000000 +60666 -1.000000 +60667 -1.000000 +60668 -1.000000 +60669 -1.000000 +60670 -1.000000 +60671 -1.000000 +60672 -1.000000 +60673 -1.000000 +60674 -1.000000 +60675 -1.000000 +60676 -1.000000 +60677 -1.000000 +60678 -1.000000 +60679 -1.000000 +60680 -1.000000 +60681 -1.000000 +60682 -1.000000 +60683 -1.000000 +60684 -1.000000 +60685 -1.000000 +60686 -1.000000 +60687 -1.000000 +60688 -1.000000 +60689 -1.000000 +60690 -1.000000 +60691 -1.000000 +60692 -1.000000 +60693 -1.000000 +60694 -1.000000 +60695 -1.000000 +60696 -1.000000 +60697 -1.000000 +60698 -1.000000 +60699 -1.000000 +60700 -1.000000 +60701 -1.000000 +60702 -1.000000 +60703 -1.000000 +60704 -1.000000 +60705 -1.000000 +60706 -1.000000 +60708 -1.000000 +60709 -1.000000 +60710 -1.000000 +60711 -1.000000 +60712 -1.000000 +60713 -1.000000 +60714 -1.000000 +60715 -1.000000 +60716 -1.000000 +60717 -1.000000 +60718 -1.000000 +60719 -1.000000 +60720 -1.000000 +60721 -1.000000 +60722 -1.000000 +60723 -1.000000 +60724 -1.000000 +60725 -1.000000 +60726 -1.000000 +60727 -1.000000 +60728 -1.000000 +60729 -1.000000 +60730 -1.000000 +60731 -1.000000 +60732 -1.000000 +60733 -1.000000 +60734 -1.000000 +60735 -1.000000 +60736 -1.000000 +60737 -1.000000 +60738 -1.000000 +60739 -1.000000 +60740 -1.000000 +60741 -1.000000 +60742 -1.000000 +60743 -1.000000 +60744 -1.000000 +60745 -1.000000 +60746 -1.000000 +60747 -1.000000 +60748 -1.000000 +60749 -1.000000 +60750 -1.000000 +60751 -1.000000 +60752 -1.000000 +60753 -1.000000 +60754 -1.000000 +60755 -1.000000 +60756 -1.000000 +60757 -1.000000 +60758 -1.000000 +60759 -1.000000 +60760 -1.000000 +60761 -1.000000 +60762 -1.000000 +60763 -1.000000 +60764 -1.000000 +60765 -1.000000 +60766 -1.000000 +60767 -1.000000 +60768 -1.000000 +60769 -1.000000 +60770 -1.000000 +60771 -1.000000 +60772 -1.000000 +60773 -1.000000 +60774 -1.000000 +60775 -1.000000 +60776 -1.000000 +60777 -1.000000 +60778 -1.000000 +60779 -1.000000 +60780 -1.000000 +60781 -1.000000 +60782 -1.000000 +60783 -1.000000 +60784 -1.000000 +60785 -1.000000 +60786 -1.000000 +60787 -1.000000 +60788 -1.000000 +60789 -1.000000 +60790 -1.000000 +60791 -1.000000 +60792 -1.000000 +60793 -1.000000 +60794 -1.000000 +60795 -1.000000 +60796 -1.000000 +60797 -1.000000 +60798 -1.000000 +60799 -1.000000 +60800 -1.000000 +60801 -1.000000 +60802 -1.000000 +60803 -1.000000 +60804 -1.000000 +60805 -1.000000 +60806 -1.000000 +60807 -1.000000 +60808 -1.000000 +60809 -1.000000 +60810 -1.000000 +60811 -1.000000 +60812 -1.000000 +60813 -1.000000 +60814 -1.000000 +60815 -1.000000 +60816 -1.000000 +60817 -1.000000 +60818 -1.000000 +60819 -1.000000 +60820 -1.000000 +60821 -1.000000 +60822 -1.000000 +60823 -1.000000 +60824 -1.000000 +60825 -1.000000 +60826 -1.000000 +60827 -1.000000 +60828 -1.000000 +60829 -1.000000 +60830 -1.000000 +60831 -1.000000 +60832 -1.000000 +60833 -1.000000 +60834 -1.000000 +60835 -1.000000 +60836 -1.000000 +60837 -1.000000 +60838 -1.000000 +60839 -1.000000 +60840 -1.000000 +60841 -1.000000 +60842 -1.000000 +60843 -1.000000 +60844 -1.000000 +60845 -1.000000 +60846 -1.000000 +60847 -1.000000 +60848 -1.000000 +60849 -1.000000 +60850 -1.000000 +60851 -1.000000 +60852 -1.000000 +60853 -1.000000 +60854 -1.000000 +60855 -1.000000 +60856 -1.000000 +60857 -1.000000 +60858 -1.000000 +60859 -1.000000 +60860 -1.000000 +60861 -1.000000 +60862 -1.000000 +60863 -1.000000 +60864 -1.000000 +60865 -1.000000 +60866 -1.000000 +60867 -1.000000 +60868 -1.000000 +60869 -1.000000 +60870 -1.000000 +60871 -1.000000 +60872 -1.000000 +60873 -1.000000 +60874 -1.000000 +60875 -1.000000 +60876 -1.000000 +60877 -1.000000 +60878 -1.000000 +60879 -1.000000 +60880 -1.000000 +60881 -1.000000 +60882 -1.000000 +60883 -1.000000 +60884 -1.000000 +60885 -1.000000 +60886 -1.000000 +60887 -1.000000 +60888 -1.000000 +60889 -1.000000 +60890 -1.000000 +60891 -1.000000 +60892 -1.000000 +60893 -1.000000 +60894 -1.000000 +60895 -1.000000 +60896 -1.000000 +60897 -1.000000 +60898 -1.000000 +60899 -1.000000 +60900 -1.000000 +60901 -1.000000 +60902 -1.000000 +60903 -1.000000 +60904 -1.000000 +60905 -1.000000 +60906 -1.000000 +60907 -1.000000 +60908 -1.000000 +60909 -1.000000 +60910 -1.000000 +60911 -1.000000 +60912 -1.000000 +60913 -1.000000 +60914 -1.000000 +60915 -1.000000 +60916 -1.000000 +60917 -1.000000 +60918 -1.000000 +60919 -1.000000 +60920 -1.000000 +60921 -1.000000 +60922 -1.000000 +60923 -1.000000 +60924 -1.000000 +60925 -1.000000 +60926 -1.000000 +60927 -1.000000 +60928 -1.000000 +60929 -1.000000 +60930 -1.000000 +60931 -1.000000 +60932 -1.000000 +60933 -1.000000 +60934 -1.000000 +60935 -1.000000 +60936 -1.000000 +60937 -1.000000 +60938 -1.000000 +60939 -1.000000 +60940 -1.000000 +60941 -1.000000 +60942 -1.000000 +60943 -1.000000 +60944 -1.000000 +60945 -1.000000 +60946 -1.000000 +60947 -1.000000 +60948 -1.000000 +60949 -1.000000 +60950 -1.000000 +60951 -1.000000 +60952 -1.000000 +60953 -1.000000 +60954 -1.000000 +60955 -1.000000 +60956 -1.000000 +60957 -1.000000 +60958 -1.000000 +60959 -1.000000 +60960 -1.000000 +60961 -1.000000 +60962 -1.000000 +60963 -1.000000 +60964 -1.000000 +60965 -1.000000 +60966 -1.000000 +60967 -1.000000 +60968 -1.000000 +60970 -1.000000 +60971 -1.000000 +60972 -1.000000 +60973 -1.000000 +60974 -1.000000 +60975 -1.000000 +60976 -1.000000 +60977 -1.000000 +60978 -1.000000 +60979 -1.000000 +60980 -1.000000 +60981 -1.000000 +60982 -1.000000 +60983 -1.000000 +60984 -1.000000 +60985 -1.000000 +60986 -1.000000 +60987 -1.000000 +60988 -1.000000 +60989 -1.000000 +60990 -1.000000 +60991 -1.000000 +60992 -1.000000 +60993 -1.000000 +60994 -1.000000 +60997 -1.000000 +60998 -1.000000 +60999 -1.000000 +61000 -1.000000 +61001 -1.000000 +61002 -1.000000 +61003 -1.000000 +61004 -1.000000 +61005 -1.000000 +61006 -1.000000 +61007 -1.000000 +61008 -1.000000 +61009 -1.000000 +61010 -1.000000 +61011 -1.000000 +61012 -1.000000 +61013 -1.000000 +61014 -1.000000 +61015 -1.000000 +61016 -1.000000 +61017 -1.000000 +61018 -1.000000 +61019 -1.000000 +61020 -1.000000 +61021 -1.000000 +61022 -1.000000 +61023 -1.000000 +61024 -1.000000 +61025 -1.000000 +61026 -1.000000 +61027 -1.000000 +61028 -1.000000 +61029 -1.000000 +61030 -1.000000 +61031 -1.000000 +61032 -1.000000 +61033 -1.000000 +61034 -1.000000 +61035 -1.000000 +61036 -1.000000 +61037 -1.000000 +61038 -1.000000 +61039 -1.000000 +61040 -1.000000 +61041 -1.000000 +61042 -1.000000 +61043 -1.000000 +61044 -1.000000 +61045 -1.000000 +61046 -1.000000 +61047 -1.000000 +61048 -1.000000 +61049 -1.000000 +61050 -1.000000 +61051 -1.000000 +61052 -1.000000 +61053 -1.000000 +61054 -1.000000 +61055 -1.000000 +61056 -1.000000 +61057 -1.000000 +61058 -1.000000 +61059 -1.000000 +61060 -1.000000 +61061 -1.000000 +61062 -1.000000 +61063 -1.000000 +61064 -1.000000 +61065 -1.000000 +61066 -1.000000 +61067 -1.000000 +61068 -1.000000 +61069 -1.000000 +61070 -1.000000 +61071 -1.000000 +61072 -1.000000 +61073 -1.000000 +61074 -1.000000 +61075 -1.000000 +61076 -1.000000 +61077 -1.000000 +61078 -1.000000 +61079 -1.000000 +61080 -1.000000 +61081 -1.000000 +61082 -1.000000 +61083 -1.000000 +61084 -1.000000 +61085 -1.000000 +61086 -1.000000 +61087 -1.000000 +61088 -1.000000 +61089 -1.000000 +61090 -1.000000 +61091 -1.000000 +61092 -1.000000 +61093 -1.000000 +61094 -1.000000 +61095 -1.000000 +61096 -1.000000 +61097 -1.000000 +61098 -1.000000 +61099 -1.000000 +61100 -1.000000 +61101 -1.000000 +61102 -1.000000 +61103 -1.000000 +61104 -1.000000 +61105 -1.000000 +61106 -1.000000 +61107 -1.000000 +61108 -1.000000 +61109 -1.000000 +61110 -1.000000 +61111 -1.000000 +61112 -1.000000 +61113 -1.000000 +61114 -1.000000 +61115 -1.000000 +61116 -1.000000 +61117 -1.000000 +61118 -1.000000 +61119 -1.000000 +61120 -1.000000 +61121 -1.000000 +61122 -1.000000 +61123 -1.000000 +61124 -1.000000 +61125 -1.000000 +61126 -1.000000 +61127 -1.000000 +61128 -1.000000 +61129 -1.000000 +61130 -1.000000 +61131 -1.000000 +61132 -1.000000 +61133 -1.000000 +61134 -1.000000 +61135 -1.000000 +61136 -1.000000 +61137 -1.000000 +61138 -1.000000 +61139 -1.000000 +61140 -1.000000 +61141 -1.000000 +61143 -1.000000 +61144 -1.000000 +61145 -1.000000 +61146 -1.000000 +61147 -1.000000 +61148 -1.000000 +61149 -1.000000 +61150 -1.000000 +61151 -1.000000 +61152 -1.000000 +61153 -1.000000 +61154 -1.000000 +61155 -1.000000 +61156 -1.000000 +61157 -1.000000 +61158 -1.000000 +61159 -1.000000 +61160 -1.000000 +61161 -1.000000 +61162 -1.000000 +61163 -1.000000 +61164 -1.000000 +61165 -1.000000 +61166 -1.000000 +61167 -1.000000 +61168 -1.000000 +61169 -1.000000 +61170 -1.000000 +61171 -1.000000 +61172 -1.000000 +61173 -1.000000 +61174 -1.000000 +61175 -1.000000 +61176 -1.000000 +61177 -1.000000 +61178 -1.000000 +61179 -1.000000 +61180 -1.000000 +61181 -1.000000 +61182 -1.000000 +61183 -1.000000 +61184 -1.000000 +61185 -1.000000 +61186 -1.000000 +61187 -1.000000 +61190 -1.000000 +61191 -1.000000 +61192 -1.000000 +61193 -1.000000 +61194 -1.000000 +61195 -1.000000 +61196 -1.000000 +61197 -1.000000 +61198 -1.000000 +61199 -1.000000 +61200 -1.000000 +61201 -1.000000 +61202 -1.000000 +61203 -1.000000 +61204 -1.000000 +61205 -1.000000 +61206 -1.000000 +61207 -1.000000 +61208 -1.000000 +61209 -1.000000 +61210 -1.000000 +61211 -1.000000 +61212 -1.000000 +61213 -1.000000 +61214 -1.000000 +61215 -1.000000 +61216 -1.000000 +61217 -1.000000 +61218 -1.000000 +61219 -1.000000 +61220 -1.000000 +61221 -1.000000 +61222 -1.000000 +61223 -1.000000 +61224 -1.000000 +61225 -1.000000 +61226 -1.000000 +61227 -1.000000 +61228 -1.000000 +61229 -1.000000 +61230 -1.000000 +61231 -1.000000 +61232 -1.000000 +61233 -1.000000 +61234 -1.000000 +61235 -1.000000 +61236 -1.000000 +61237 -1.000000 +61238 -1.000000 +61239 -1.000000 +61240 -1.000000 +61242 -1.000000 +61243 -1.000000 +61244 -1.000000 +61245 -1.000000 +61246 -1.000000 +61247 -1.000000 +61248 -1.000000 +61249 -1.000000 +61250 -1.000000 +61251 -1.000000 +61252 -1.000000 +61253 -1.000000 +61254 -1.000000 +61255 -1.000000 +61256 -1.000000 +61257 -1.000000 +61258 -1.000000 +61259 -1.000000 +61260 -1.000000 +61261 -1.000000 +61262 -1.000000 +61263 -1.000000 +61264 -1.000000 +61265 -1.000000 +61266 -1.000000 +61267 -1.000000 +61268 -1.000000 +61269 -1.000000 +61270 -1.000000 +61271 -1.000000 +61272 -1.000000 +61274 -1.000000 +61275 -1.000000 +61276 -1.000000 +61277 -1.000000 +61278 -1.000000 +61279 -1.000000 +61280 -1.000000 +61281 -1.000000 +61282 -1.000000 +61283 -1.000000 +61284 -1.000000 +61285 -1.000000 +61286 -1.000000 +61287 -1.000000 +61288 -1.000000 +61289 -1.000000 +61290 -1.000000 +61291 -1.000000 +61292 -1.000000 +61293 -1.000000 +61294 -1.000000 +61295 -1.000000 +61296 -1.000000 +61297 -1.000000 +61298 -1.000000 +61299 -1.000000 +61300 -1.000000 +61301 -1.000000 +61303 -1.000000 +61304 -1.000000 +61305 -1.000000 +61306 -1.000000 +61307 -1.000000 +61308 -1.000000 +61309 -1.000000 +61310 -1.000000 +61311 -1.000000 +61312 -1.000000 +61313 -1.000000 +61314 -1.000000 +61317 -1.000000 +61318 -1.000000 +61319 -1.000000 +61320 -1.000000 +61321 -1.000000 +61322 -1.000000 +61323 -1.000000 +61324 -1.000000 +61325 -1.000000 +61326 -1.000000 +61327 -1.000000 +61328 -1.000000 +61329 -1.000000 +61330 -1.000000 +61331 -1.000000 +61332 -1.000000 +61333 -1.000000 +61334 -1.000000 +61335 -1.000000 +61336 -1.000000 +61337 -1.000000 +61338 -1.000000 +61339 -1.000000 +61340 -1.000000 +61341 -1.000000 +61342 -1.000000 +61343 -1.000000 +61344 -1.000000 +61345 -1.000000 +61346 -1.000000 +61347 -1.000000 +61348 -1.000000 +61349 -1.000000 +61350 -1.000000 +61351 -1.000000 +61352 -1.000000 +61353 -1.000000 +61354 -1.000000 +61355 -1.000000 +61356 -1.000000 +61357 -1.000000 +61358 -1.000000 +61359 -1.000000 +61360 -1.000000 +61361 -1.000000 +61362 -1.000000 +61363 -1.000000 +61364 -1.000000 +61365 -1.000000 +61366 -1.000000 +61367 -1.000000 +61368 -1.000000 +61369 -1.000000 +61370 -1.000000 +61371 -1.000000 +61372 -1.000000 +61373 -1.000000 +61374 -1.000000 +61375 -1.000000 +61376 -1.000000 +61377 -1.000000 +61378 -1.000000 +61379 -1.000000 +61380 -1.000000 +61381 -1.000000 +61382 -1.000000 +61383 -1.000000 +61384 -1.000000 +61385 -1.000000 +61386 -1.000000 +61387 -1.000000 +61388 -1.000000 +61389 -1.000000 +61390 -1.000000 +61391 -1.000000 +61392 -1.000000 +61393 -1.000000 +61394 -1.000000 +61395 -1.000000 +61396 -1.000000 +61397 -1.000000 +61398 -1.000000 +61399 -1.000000 +61400 -1.000000 +61401 -1.000000 +61402 -1.000000 +61403 -1.000000 +61404 -1.000000 +61405 -1.000000 +61406 -1.000000 +61407 -1.000000 +61408 -1.000000 +61409 -1.000000 +61410 -1.000000 +61411 -1.000000 +61412 -1.000000 +61413 -1.000000 +61414 -1.000000 +61415 -1.000000 +61416 -1.000000 +61417 -1.000000 +61418 -1.000000 +61419 -1.000000 +61420 -1.000000 +61421 -1.000000 +61422 -1.000000 +61423 -1.000000 +61424 -1.000000 +61425 -1.000000 +61426 -1.000000 +61427 -1.000000 +61428 -1.000000 +61429 -1.000000 +61430 -1.000000 +61431 -1.000000 +61432 -1.000000 +61433 -1.000000 +61434 -1.000000 +61435 -1.000000 +61436 -1.000000 +61437 -1.000000 +61438 -1.000000 +61439 -1.000000 +61440 -1.000000 +61441 -1.000000 +61442 -1.000000 +61443 -1.000000 +61444 -1.000000 +61445 -1.000000 +61446 -1.000000 +61447 -1.000000 +61448 -1.000000 +61449 -1.000000 +61450 -1.000000 +61451 -1.000000 +61452 -1.000000 +61453 -1.000000 +61454 -1.000000 +61455 -1.000000 +61456 -1.000000 +61457 -1.000000 +61458 -1.000000 +61459 -1.000000 +61460 -1.000000 +61461 -1.000000 +61462 -1.000000 +61463 -1.000000 +61464 -1.000000 +61465 -1.000000 +61466 -1.000000 +61467 -1.000000 +61468 -1.000000 +61469 -1.000000 +61470 -1.000000 +61471 -1.000000 +61472 -1.000000 +61473 -1.000000 +61474 -1.000000 +61475 -1.000000 +61476 -1.000000 +61477 -1.000000 +61478 -1.000000 +61479 -1.000000 +61480 -1.000000 +61481 -1.000000 +61482 -1.000000 +61483 -1.000000 +61484 -1.000000 +61485 -1.000000 +61486 -1.000000 +61487 -1.000000 +61488 -1.000000 +61489 -1.000000 +61490 -1.000000 +61491 -1.000000 +61492 -1.000000 +61493 -1.000000 +61494 -1.000000 +61496 -1.000000 +61497 -1.000000 +61498 -1.000000 +61499 -1.000000 +61500 -1.000000 +61501 -1.000000 +61502 -1.000000 +61503 -1.000000 +61504 -1.000000 +61505 -1.000000 +61506 -1.000000 +61507 -1.000000 +61508 -1.000000 +61509 -1.000000 +61510 -1.000000 +61511 -1.000000 +61512 -1.000000 +61513 -1.000000 +61514 -1.000000 +61515 -1.000000 +61516 -1.000000 +61517 -1.000000 +61518 -1.000000 +61519 -1.000000 +61520 -1.000000 +61521 -1.000000 +61522 -1.000000 +61523 -1.000000 +61524 -1.000000 +61525 -1.000000 +61526 -1.000000 +61527 -1.000000 +61528 -1.000000 +61529 -1.000000 +61530 -1.000000 +61531 -1.000000 +61532 -1.000000 +61533 -1.000000 +61534 -1.000000 +61535 -1.000000 +61536 -1.000000 +61537 -1.000000 +61538 -1.000000 +61539 -1.000000 +61540 -1.000000 +61541 -1.000000 +61542 -1.000000 +61543 -1.000000 +61544 -1.000000 +61545 -1.000000 +61546 -1.000000 +61547 -1.000000 +61548 -1.000000 +61549 -1.000000 +61550 -1.000000 +61551 -1.000000 +61552 -1.000000 +61553 -1.000000 +61554 -1.000000 +61555 -1.000000 +61556 -1.000000 +61557 -1.000000 +61558 -1.000000 +61559 -1.000000 +61560 -1.000000 +61561 -1.000000 +61562 -1.000000 +61563 -1.000000 +61564 -1.000000 +61565 -1.000000 +61566 -1.000000 +61567 -1.000000 +61568 -1.000000 +61569 -1.000000 +61570 -1.000000 +61571 -1.000000 +61572 -1.000000 +61573 -1.000000 +61574 -1.000000 +61575 -1.000000 +61576 -1.000000 +61577 -1.000000 +61578 -1.000000 +61579 -1.000000 +61580 -1.000000 +61581 -1.000000 +61582 -1.000000 +61583 -1.000000 +61584 -1.000000 +61585 -1.000000 +61586 -1.000000 +61587 -1.000000 +61588 -1.000000 +61589 -1.000000 +61590 -1.000000 +61591 -1.000000 +61592 -1.000000 +61593 -1.000000 +61594 -1.000000 +61595 -1.000000 +61596 -1.000000 +61597 -1.000000 +61598 -1.000000 +61599 -1.000000 +61600 -1.000000 +61601 -1.000000 +61602 -1.000000 +61603 -1.000000 +61604 -1.000000 +61605 -1.000000 +61606 -1.000000 +61607 -1.000000 +61608 -1.000000 +61609 -1.000000 +61610 -1.000000 +61611 -1.000000 +61612 -1.000000 +61613 -1.000000 +61614 -1.000000 +61615 -1.000000 +61616 -1.000000 +61617 -1.000000 +61618 -1.000000 +61619 -1.000000 +61620 -1.000000 +61621 -1.000000 +61622 -1.000000 +61623 -1.000000 +61624 -1.000000 +61625 -1.000000 +61626 -1.000000 +61627 -1.000000 +61628 -1.000000 +61629 -1.000000 +61630 -1.000000 +61631 -1.000000 +61632 -1.000000 +61633 -1.000000 +61634 -1.000000 +61635 -1.000000 +61636 -1.000000 +61637 -1.000000 +61638 -1.000000 +61639 -1.000000 +61640 -1.000000 +61641 -1.000000 +61642 -1.000000 +61643 -1.000000 +61644 -1.000000 +61645 -1.000000 +61646 -1.000000 +61647 -1.000000 +61648 -1.000000 +61649 -1.000000 +61650 -1.000000 +61651 -1.000000 +61652 -1.000000 +61653 -1.000000 +61654 -1.000000 +61655 -1.000000 +61656 -1.000000 +61657 -1.000000 +61658 -1.000000 +61659 -1.000000 +61660 -1.000000 +61661 -1.000000 +61662 -1.000000 +61663 -1.000000 +61664 -1.000000 +61665 -1.000000 +61666 -1.000000 +61667 -1.000000 +61668 -1.000000 +61669 -1.000000 +61670 -1.000000 +61671 -1.000000 +61672 -1.000000 +61673 -1.000000 +61674 -1.000000 +61675 -1.000000 +61676 -1.000000 +61677 -1.000000 +61678 -1.000000 +61679 -1.000000 +61707 -1.000000 +61713 -1.000000 +61747 -1.000000 +61751 -1.000000 +61764 -1.000000 +61765 -1.000000 +61767 -1.000000 +61768 -1.000000 +61771 -1.000000 +61772 -1.000000 +61773 -1.000000 +61879 -1.000000 +61880 -1.000000 +61881 -1.000000 +61882 -1.000000 +61883 -1.000000 +61884 -1.000000 +61885 -1.000000 +61886 -1.000000 +61889 -1.000000 +61890 -1.000000 +61892 -1.000000 +61893 -1.000000 +61895 -1.000000 +61896 -1.000000 +61897 -1.000000 +62003 -1.000000 +62004 -1.000000 +62007 -1.000000 +62012 -1.000000 +62013 -1.000000 +62014 -1.000000 +62015 -1.000000 +62016 -1.000000 +62017 -1.000000 +62150 -1.000000 +62165 -1.000000 +62166 -1.000000 +62167 -1.000000 +62168 -1.000000 +62170 -1.000000 +62172 -1.000000 +62174 -1.000000 +62175 -1.000000 +62176 -1.000000 +62177 -1.000000 +62178 -1.000000 +62179 -1.000000 +62180 -1.000000 +62181 -1.000000 +62182 -1.000000 +62183 -1.000000 +62184 -1.000000 +62185 -1.000000 +62186 -1.000000 +62189 -1.000000 +62190 -1.000000 +62191 -1.000000 +62192 -1.000000 +62193 -1.000000 +62194 -1.000000 +62196 -1.000000 +62197 -1.000000 +62198 -1.000000 +62209 -1.000000 +62210 -1.000000 +62211 -1.000000 +62212 -1.000000 +62213 -1.000000 +62218 -1.000000 +62219 -1.000000 +62220 -1.000000 +62221 -1.000000 +62222 -1.000000 +62223 -1.000000 +62224 -1.000000 +62225 -1.000000 +62226 -1.000000 +62229 -1.000000 +62231 -1.000000 +62232 -1.000000 +62233 -1.000000 +62234 -1.000000 +62237 -1.000000 +62238 -1.000000 +62239 -1.000000 +62240 -1.000000 +62256 -1.000000 +62263 -1.000000 +62264 -1.000000 +62265 -1.000000 +62266 -1.000000 +62268 -1.000000 +62269 -1.000000 +62270 -1.000000 +62271 -1.000000 +62272 -1.000000 +62273 -1.000000 +62274 -1.000000 +62275 -1.000000 +62276 -1.000000 +62277 -1.000000 +62278 -1.000000 +62279 -1.000000 +62280 -1.000000 +62281 -1.000000 +62282 -1.000000 +62283 -1.000000 +62284 -1.000000 +62285 -1.000000 +62286 -1.000000 +62287 -1.000000 +62288 -1.000000 +62289 -1.000000 +62296 -1.000000 +62297 -1.000000 +62298 -1.000000 +62303 -1.000000 +62304 -1.000000 +62306 -1.000000 +62307 -1.000000 +62308 -1.000000 +62389 -1.000000 +62391 -1.000000 +62394 -1.000000 +62396 -1.000000 +62400 -1.000000 +62406 -1.000000 +62407 -1.000000 +62408 -1.000000 +62414 -1.000000 +62417 -1.000000 +62419 -1.000000 +62420 -1.000000 +62423 -1.000000 +62425 -1.000000 +62451 -1.000000 +62456 -1.000000 +62457 -1.000000 +62458 -1.000000 +62459 -1.000000 +62491 -1.000000 +62622 -1.000000 +62626 -1.000000 +62627 -1.000000 +62628 -1.000000 +62629 -1.000000 +62630 -1.000000 +62634 -1.000000 +62635 -1.000000 +62637 -1.000000 +62638 -1.000000 +62700 -1.000000 +62701 -1.000000 +62702 -1.000000 +62703 -1.000000 +62704 -1.000000 +62705 -1.000000 +62706 -1.000000 +62707 -1.000000 +62708 -1.000000 +62709 -1.000000 +62710 -1.000000 +62711 -1.000000 +62712 -1.000000 +62713 -1.000000 +62714 -1.000000 +62715 -1.000000 +62716 -1.000000 +62717 -1.000000 +62718 -1.000000 +62719 -1.000000 +62742 -1.000000 +62743 -1.000000 +62744 -1.000000 +62745 -1.000000 +62746 -1.000000 +62747 -1.000000 +62748 -1.000000 +62749 -1.000000 +62750 -1.000000 +62751 -1.000000 +62752 -1.000000 +62753 -1.000000 +62754 -1.000000 +62755 -1.000000 +62756 -1.000000 +62757 -1.000000 +62758 -1.000000 +62759 -1.000000 +62760 -1.000000 +62761 -1.000000 +62762 -1.000000 +62763 -1.000000 +62764 -1.000000 +62765 -1.000000 +62766 -1.000000 +62767 -1.000000 +62768 -1.000000 +62769 -1.000000 +62770 -1.000000 +62771 -1.000000 +62772 -1.000000 +62773 -1.000000 +62774 -1.000000 +62775 -1.000000 +62776 -1.000000 +62777 -1.000000 +62778 -1.000000 +62779 -1.000000 +62780 -1.000000 +62781 -1.000000 +62782 -1.000000 +62783 -1.000000 +62784 -1.000000 +62785 -1.000000 +62786 -1.000000 +62787 -1.000000 +62788 -1.000000 +62790 -1.000000 +62791 -1.000000 +62792 -1.000000 +62793 -1.000000 +62794 -1.000000 +62795 -1.000000 +62796 -1.000000 +62798 -1.000000 +62799 -1.000000 +62800 -1.000000 +62801 -1.000000 +62802 -1.000000 +62803 -1.000000 +62804 -1.000000 +62805 -1.000000 +62806 -1.000000 +62807 -1.000000 +62808 -1.000000 +62809 -1.000000 +62810 -1.000000 +62811 -1.000000 +62812 -1.000000 +62813 -1.000000 +62814 -1.000000 +62815 -1.000000 +62816 -1.000000 +62817 -1.000000 +62818 -1.000000 +62819 -1.000000 +62820 -1.000000 +62821 -1.000000 +62822 -1.000000 +62823 -1.000000 +62824 -1.000000 +62825 -1.000000 +62826 -1.000000 +62828 -1.000000 +62829 -1.000000 +62830 -1.000000 +62831 -1.000000 +62839 -1.000000 +62840 -1.000000 +62841 -1.000000 +62842 -1.000000 +62844 -1.000000 +62845 -1.000000 +62852 -1.000000 +62853 -1.000000 +62854 -1.000000 +62855 -1.000000 +62856 -1.000000 +62857 -1.000000 +62858 -1.000000 +62871 -1.000000 +62872 -1.000000 +62873 -1.000000 +62875 -1.000000 +62877 -1.000000 +62879 -1.000000 +62880 -1.000000 +62881 -1.000000 +62882 -1.000000 +62885 -1.000000 +62886 -1.000000 +62887 -1.000000 +62888 -1.000000 +62889 -1.000000 +62890 -1.000000 +62892 -1.000000 +62896 -1.000000 +62898 -1.000000 +62899 -1.000000 +62900 -1.000000 +62901 -1.000000 +62902 -1.000000 +62903 -1.000000 +62904 -1.000000 +62905 -1.000000 +62914 -1.000000 +62917 -1.000000 +62918 -1.000000 +62919 -1.000000 +62927 -1.000000 +62931 -1.000000 +62932 -1.000000 +62934 -1.000000 +62936 -1.000000 +62937 -1.000000 +62938 -1.000000 +62947 -1.000000 +62948 -1.000000 +62949 -1.000000 +62950 -1.000000 +62951 -1.000000 +62958 -1.000000 +62961 -1.000000 +62963 -1.000000 +62964 -1.000000 +62966 -1.000000 +62967 -1.000000 +62969 -1.000000 +62970 -1.000000 +62971 -1.000000 +62972 -1.000000 +62973 -1.000000 +62974 -1.000000 +62975 -1.000000 +62976 -1.000000 +62977 -1.000000 +62978 -1.000000 +62979 -1.000000 +62980 -1.000000 +62981 -1.000000 +62982 -1.000000 +62983 -1.000000 +62984 -1.000000 +62985 -1.000000 +62986 -1.000000 +62987 -1.000000 +62988 -1.000000 +62989 -1.000000 +62990 -1.000000 +62991 -1.000000 +62992 -1.000000 +62993 -1.000000 +62994 -1.000000 +62995 -1.000000 +62996 -1.000000 +62997 -1.000000 +62998 -1.000000 +62999 -1.000000 +63000 -1.000000 +63001 -1.000000 +63002 -1.000000 +63003 -1.000000 +63004 -1.000000 +63005 -1.000000 +63006 -1.000000 +63007 -1.000000 +63008 -1.000000 +63009 -1.000000 +63010 -1.000000 +63011 -1.000000 +63012 -1.000000 +63013 -1.000000 +63014 -1.000000 +63015 -1.000000 +63016 -1.000000 +63017 -1.000000 +63018 -1.000000 +63019 -1.000000 +63020 -1.000000 +63021 -1.000000 +63022 -1.000000 +63023 -1.000000 +63024 -1.000000 +63025 -1.000000 +63026 -1.000000 +63027 -1.000000 +63028 -1.000000 +63029 -1.000000 +63030 -1.000000 +63031 -1.000000 +63032 -1.000000 +63033 -1.000000 +63034 -1.000000 +63035 -1.000000 +63036 -1.000000 +63037 -1.000000 +63038 -1.000000 +63039 -1.000000 +63040 -1.000000 +63041 -1.000000 +63042 -1.000000 +63043 -1.000000 +63044 -1.000000 +63045 -1.000000 +63046 -1.000000 +63047 -1.000000 +63048 -1.000000 +63049 -1.000000 +63050 -1.000000 +63051 -1.000000 +63052 -1.000000 +63053 -1.000000 +63054 -1.000000 +63055 -1.000000 +63056 -1.000000 +63057 -1.000000 +63058 -1.000000 +63059 -1.000000 +63060 -1.000000 +63061 -1.000000 +63062 -1.000000 +63063 -1.000000 +63064 -1.000000 +63065 -1.000000 +63066 -1.000000 +63067 -1.000000 +63068 -1.000000 +63069 -1.000000 +63070 -1.000000 +63071 -1.000000 +63072 -1.000000 +63073 -1.000000 +63074 -1.000000 +63075 -1.000000 +63077 -1.000000 +63078 -1.000000 +63079 -1.000000 +63080 -1.000000 +63081 -1.000000 +63082 -1.000000 +63084 -1.000000 +63085 -1.000000 +63086 -1.000000 +63087 -1.000000 +63088 -1.000000 +63090 -1.000000 +63091 -1.000000 +63092 -1.000000 +63093 -1.000000 +63094 -1.000000 +63095 -1.000000 +63096 -1.000000 +63097 -1.000000 +63099 -1.000000 +63100 -1.000000 +63101 -1.000000 +63102 -1.000000 +63103 -1.000000 +63104 -1.000000 +63105 -1.000000 +63106 -1.000000 +63107 -1.000000 +63108 -1.000000 +63109 -1.000000 +63110 -1.000000 +63111 -1.000000 +63112 -1.000000 +63113 -1.000000 +63114 -1.000000 +63115 -1.000000 +63116 -1.000000 +63117 -1.000000 +63118 -1.000000 +63119 -1.000000 +63120 -1.000000 +63121 -1.000000 +63122 -1.000000 +63123 -1.000000 +63124 -1.000000 +63125 -1.000000 +63126 -1.000000 +63127 -1.000000 +63128 -1.000000 +63129 -1.000000 +63131 -1.000000 +63132 -1.000000 +63133 -1.000000 +63134 -1.000000 +63135 -1.000000 +63136 -1.000000 +63137 -1.000000 +63138 -1.000000 +63139 -1.000000 +63141 -1.000000 +63142 -1.000000 +63143 -1.000000 +63144 -1.000000 +63145 -1.000000 +63146 -1.000000 +63147 -1.000000 +63148 -1.000000 +63149 -1.000000 +63150 -1.000000 +63151 -1.000000 +63152 -1.000000 +63153 -1.000000 +63154 -1.000000 +63155 -1.000000 +63156 -1.000000 +63157 -1.000000 +63158 -1.000000 +63159 -1.000000 +63160 -1.000000 +63161 -1.000000 +63162 -1.000000 +63163 -1.000000 +63164 -1.000000 +63165 -1.000000 +63166 -1.000000 +63167 -1.000000 +63168 -1.000000 +63169 -1.000000 +63170 -1.000000 +63171 -1.000000 +63172 -1.000000 +63173 -1.000000 +63174 -1.000000 +63175 -1.000000 +63176 -1.000000 +63177 -1.000000 +63178 -1.000000 +63179 -1.000000 +63180 -1.000000 +63181 -1.000000 +63182 -1.000000 +63183 -1.000000 +63184 -1.000000 +63185 -1.000000 +63186 -1.000000 +63187 -1.000000 +63188 -1.000000 +63189 -1.000000 +63190 -1.000000 +63191 -1.000000 +63192 -1.000000 +63193 -1.000000 +63194 -1.000000 +63195 -1.000000 +63196 -1.000000 +63197 -1.000000 +63198 -1.000000 +63199 -1.000000 +63200 -1.000000 +63201 -1.000000 +63202 -1.000000 +63203 -1.000000 +63204 -1.000000 +63205 -1.000000 +63206 -1.000000 +63207 -1.000000 +63208 -1.000000 +63209 -1.000000 +63210 -1.000000 +63211 -1.000000 +63212 -1.000000 +63213 -1.000000 +63214 -1.000000 +63215 -1.000000 +63216 -1.000000 +63217 -1.000000 +63218 -1.000000 +63219 -1.000000 +63220 -1.000000 +63221 -1.000000 +63222 -1.000000 +63223 -1.000000 +63224 -1.000000 +63225 -1.000000 +63226 -1.000000 +63227 -1.000000 +63228 -1.000000 +63229 -1.000000 +63230 -1.000000 +63231 -1.000000 +63232 -1.000000 +63233 -1.000000 +63234 -1.000000 +63235 -1.000000 +63236 -1.000000 +63237 -1.000000 +63238 -1.000000 +63239 -1.000000 +63240 -1.000000 +63241 -1.000000 +63242 -1.000000 +63243 -1.000000 +63244 -1.000000 +63245 -1.000000 +63246 -1.000000 +63247 -1.000000 +63248 -1.000000 +63249 -1.000000 +63250 -1.000000 +63251 -1.000000 +63252 -1.000000 +63253 -1.000000 +63254 -1.000000 +63255 -1.000000 +63256 -1.000000 +63257 -1.000000 +63258 -1.000000 +63259 -1.000000 +63260 -1.000000 +63261 -1.000000 +63262 -1.000000 +63263 -1.000000 +63264 -1.000000 +63265 -1.000000 +63266 -1.000000 +63267 -1.000000 +63268 -1.000000 +63269 -1.000000 +63270 -1.000000 +63271 -1.000000 +63272 -1.000000 +63273 -1.000000 +63274 -1.000000 +63275 -1.000000 +63276 -1.000000 +63277 -1.000000 +63278 -1.000000 +63279 -1.000000 +63280 -1.000000 +63281 -1.000000 +63282 -1.000000 +63283 -1.000000 +63285 -1.000000 +63286 -1.000000 +63287 -1.000000 +63288 -1.000000 +63289 -1.000000 +63290 -1.000000 +63291 -1.000000 +63292 -1.000000 +63293 -1.000000 +63294 -1.000000 +63295 -1.000000 +63296 -1.000000 +63297 -1.000000 +63298 -1.000000 +63299 -1.000000 +63302 -1.000000 +63303 -1.000000 +63304 -1.000000 +63305 -1.000000 +63306 -1.000000 +63307 -1.000000 +63308 -1.000000 +63309 -1.000000 +63310 -1.000000 +63311 -1.000000 +63312 -1.000000 +63313 -1.000000 +63314 -1.000000 +63315 -1.000000 +63316 -1.000000 +63317 -1.000000 +63318 -1.000000 +63319 -1.000000 +63320 -1.000000 +63321 -1.000000 +63322 -1.000000 +63323 -1.000000 +63324 -1.000000 +63325 -1.000000 +63326 -1.000000 +63327 -1.000000 +63328 -1.000000 +63329 -1.000000 +63330 -1.000000 +63331 -1.000000 +63332 -1.000000 +63333 -1.000000 +63334 -1.000000 +63335 -1.000000 +63336 -1.000000 +63337 -1.000000 +63338 -1.000000 +63339 -1.000000 +63340 -1.000000 +63341 -1.000000 +63342 -1.000000 +63343 -1.000000 +63344 -1.000000 +63345 -1.000000 +63346 -1.000000 +63347 -1.000000 +63348 -1.000000 +63349 -1.000000 +63350 -1.000000 +63351 -1.000000 +63352 -1.000000 +63353 -1.000000 +63354 -1.000000 +63355 -1.000000 +63356 -1.000000 +63357 -1.000000 +63358 -1.000000 +63359 -1.000000 +63360 -1.000000 +63361 -1.000000 +63362 -1.000000 +63363 -1.000000 +63364 -1.000000 +63365 -1.000000 +63366 -1.000000 +63367 -1.000000 +63368 -1.000000 +63369 -1.000000 +63370 -1.000000 +63371 -1.000000 +63372 -1.000000 +63373 -1.000000 +63374 -1.000000 +63375 -1.000000 +63376 -1.000000 +63377 -1.000000 +63378 -1.000000 +63379 -1.000000 +63380 -1.000000 +63381 -1.000000 +63382 -1.000000 +63383 -1.000000 +63384 -1.000000 +63385 -1.000000 +63386 -1.000000 +63387 -1.000000 +63388 -1.000000 +63389 -1.000000 +63390 -1.000000 +63391 -1.000000 +63392 -1.000000 +63393 -1.000000 +63394 -1.000000 +63395 -1.000000 +63396 -1.000000 +63397 -1.000000 +63398 -1.000000 +63399 -1.000000 +63401 -1.000000 +63402 -1.000000 +63403 -1.000000 +63404 -1.000000 +63405 -1.000000 +63406 -1.000000 +63407 -1.000000 +63408 -1.000000 +63409 -1.000000 +63410 -1.000000 +63411 -1.000000 +63412 -1.000000 +63413 -1.000000 +63414 -1.000000 +63415 -1.000000 +63416 -1.000000 +63417 -1.000000 +63418 -1.000000 +63419 -1.000000 +63420 -1.000000 +63421 -1.000000 +63422 -1.000000 +63423 -1.000000 +63424 -1.000000 +63425 -1.000000 +63426 -1.000000 +63427 -1.000000 +63428 -1.000000 +63429 -1.000000 +63430 -1.000000 +63431 -1.000000 +63432 -1.000000 +63433 -1.000000 +63434 -1.000000 +63435 -1.000000 +63436 -1.000000 +63437 -1.000000 +63438 -1.000000 +63439 -1.000000 +63440 -1.000000 +63441 -1.000000 +63442 -1.000000 +63443 -1.000000 +63444 -1.000000 +63445 -1.000000 +63446 -1.000000 +63447 -1.000000 +63448 -1.000000 +63449 -1.000000 +63450 -1.000000 +63451 -1.000000 +63452 -1.000000 +63453 -1.000000 +63454 -1.000000 +63455 -1.000000 +63456 -1.000000 +63457 -1.000000 +63458 -1.000000 +63459 -1.000000 +63460 -1.000000 +63461 -1.000000 +63462 -1.000000 +63463 -1.000000 +63464 -1.000000 +63478 -1.000000 +63480 -1.000000 +63485 -1.000000 +63486 -1.000000 +63487 -1.000000 +63488 -1.000000 +63489 -1.000000 +63490 -1.000000 +63491 -1.000000 +63493 -1.000000 +63494 -1.000000 +63495 -1.000000 +63496 -1.000000 +63497 -1.000000 +63498 -1.000000 +63499 -1.000000 +63501 -1.000000 +63507 -1.000000 +63508 -1.000000 +63509 -1.000000 +63510 -1.000000 +63511 -1.000000 +63512 -1.000000 +63516 -1.000000 +63517 -1.000000 +63518 -1.000000 +63519 -1.000000 +63520 -1.000000 +63521 -1.000000 +63522 -1.000000 +63523 -1.000000 +63524 -1.000000 +63525 -1.000000 +63526 -1.000000 +63527 -1.000000 +63528 -1.000000 +63529 -1.000000 +63530 -1.000000 +63531 -1.000000 +63532 -1.000000 +63533 -1.000000 +63534 -1.000000 +63535 -1.000000 +63536 -1.000000 +63537 -1.000000 +63538 -1.000000 +63539 -1.000000 +63540 -1.000000 +63541 -1.000000 +63542 -1.000000 +63543 -1.000000 +63544 -1.000000 +63545 -1.000000 +63546 -1.000000 +63547 -1.000000 +63552 -1.000000 +63553 -1.000000 +63564 -1.000000 +63569 -1.000000 +63570 -1.000000 +63571 -1.000000 +63576 -1.000000 +63605 -1.000000 +63606 -1.000000 +63608 -1.000000 +63617 -1.000000 +63626 -1.000000 +63631 -1.000000 +63638 -1.000000 +63642 -1.000000 +63656 -1.000000 +63663 -1.000000 +63667 -1.000000 +63672 -1.000000 +63684 -1.000000 +63687 -1.000000 +63690 -1.000000 +63691 -1.000000 +63698 -1.000000 +63706 -1.000000 +63712 -1.000000 +63718 -1.000000 +63729 -1.000000 +63733 -1.000000 +63735 -1.000000 +63736 -1.000000 +63741 -1.000000 +63742 -1.000000 +63758 -1.000000 +63762 -1.000000 +63771 -1.000000 +63783 -1.000000 +63788 -1.000000 +63797 -1.000000 +63802 -1.000000 +63803 -1.000000 +63811 -1.000000 +63815 -1.000000 +63821 -1.000000 +63823 -1.000000 +63824 -1.000000 +63825 -1.000000 +63829 -1.000000 +63834 -1.000000 +63840 -1.000000 +63844 -1.000000 +63848 -1.000000 +63852 -1.000000 +63856 -1.000000 +63857 -1.000000 +63858 -1.000000 +63859 -1.000000 +63860 -1.000000 +63861 -1.000000 +63862 -1.000000 +63863 -1.000000 +63864 -1.000000 +63865 -1.000000 +63866 -1.000000 +63878 -1.000000 +63879 -1.000000 +63880 -1.000000 +63881 -1.000000 +63882 -1.000000 +63883 -1.000000 +63904 -1.000000 +63910 -1.000000 +63911 -1.000000 +63913 -1.000000 +63915 -1.000000 +63917 -1.000000 +63918 -1.000000 +63921 -1.000000 +63923 -1.000000 +63927 -1.000000 +63928 -1.000000 +63929 -1.000000 +63930 -1.000000 +63931 -1.000000 +63932 -1.000000 +63934 -1.000000 +63935 -1.000000 +63936 -1.000000 +63937 -1.000000 +63938 -1.000000 +63939 -1.000000 +63991 -1.000000 +63994 -1.000000 +63998 -1.000000 +64005 -1.000000 +64018 -1.000000 +64019 -1.000000 +64020 -1.000000 +64022 -1.000000 +64025 -1.000000 +64026 -1.000000 +64039 -1.000000 +64042 -1.000000 +64045 -1.000000 +64047 -1.000000 +64052 -1.000000 +64053 -1.000000 +64054 -1.000000 +64056 -1.000000 +64057 -1.000000 +64058 -1.000000 +64059 -1.000000 +64060 -1.000000 +64063 -1.000000 +64073 -1.000000 +64074 -1.000000 +64075 -1.000000 +64076 -1.000000 +64077 -1.000000 +64088 -1.000000 +64089 -1.000000 +64090 -1.000000 +64091 -1.000000 +64092 -1.000000 +64093 -1.000000 +64095 -1.000000 +64100 -1.000000 +64101 -1.000000 +64102 -1.000000 +64103 -1.000000 +64104 -1.000000 +64105 -1.000000 +64125 -1.000000 +64126 -1.000000 +64127 -1.000000 +64128 -1.000000 +64129 -1.000000 +64130 -1.000000 +64131 -1.000000 +64132 -1.000000 +64133 -1.000000 +64134 -1.000000 +64135 -1.000000 +64136 -1.000000 +64137 -1.000000 +64138 -1.000000 +64139 -1.000000 +64140 -1.000000 +64141 -1.000000 +64142 -1.000000 +64143 -1.000000 +64144 -1.000000 +64145 -1.000000 +64146 -1.000000 +64147 -1.000000 +64148 -1.000000 +64149 -1.000000 +64150 -1.000000 +64151 -1.000000 +64152 -1.000000 +64153 -1.000000 +64154 -1.000000 +64155 -1.000000 +64158 -1.000000 +64159 -1.000000 +64160 -1.000000 +64161 -1.000000 +64162 -1.000000 +64163 -1.000000 +64164 -1.000000 +64165 -1.000000 +64166 -1.000000 +64167 -1.000000 +64168 -1.000000 +64169 -1.000000 +64170 -1.000000 +64171 -1.000000 +64172 -1.000000 +64173 -1.000000 +64174 -1.000000 +64175 -1.000000 +64176 -1.000000 +64178 -1.000000 +64179 -1.000000 +64181 -1.000000 +64182 -1.000000 +64183 -1.000000 +64184 -1.000000 +64185 -1.000000 +64186 -1.000000 +64187 -1.000000 +64188 -1.000000 +64189 -1.000000 +64190 -1.000000 +64191 -1.000000 +64192 -1.000000 +64193 -1.000000 +64194 -1.000000 +64195 -1.000000 +64196 -1.000000 +64197 -1.000000 +64198 -1.000000 +64199 -1.000000 +64200 -1.000000 +64201 -1.000000 +64202 -1.000000 +64203 -1.000000 +64204 -1.000000 +64205 -1.000000 +64206 -1.000000 +64207 -1.000000 +64208 -1.000000 +64209 -1.000000 +64210 -1.000000 +64211 -1.000000 +64212 -1.000000 +64213 -1.000000 +64214 -1.000000 +64215 -1.000000 +64216 -1.000000 +64217 -1.000000 +64218 -1.000000 +64219 -1.000000 +64220 -1.000000 +64221 -1.000000 +64222 -1.000000 +64223 -1.000000 +64224 -1.000000 +64225 -1.000000 +64226 -1.000000 +64227 -1.000000 +64228 -1.000000 +64229 -1.000000 +64230 -1.000000 +64231 -1.000000 +64232 -1.000000 +64233 -1.000000 +64235 -1.000000 +64236 -1.000000 +64237 -1.000000 +64238 -1.000000 +64239 -1.000000 +64240 -1.000000 +64241 -1.000000 +64242 -1.000000 +64243 -1.000000 +64244 -1.000000 +64245 -1.000000 +64246 -1.000000 +64247 -1.000000 +64248 -1.000000 +64249 -1.000000 +64250 -1.000000 +64251 -1.000000 +64252 -1.000000 +64253 -1.000000 +64254 -1.000000 +64255 -1.000000 +64256 -1.000000 +64257 -1.000000 +64258 -1.000000 +64260 -1.000000 +64261 -1.000000 +64262 -1.000000 +64263 -1.000000 +64264 -1.000000 +64265 -1.000000 +64266 -1.000000 +64267 -1.000000 +64268 -1.000000 +64269 -1.000000 +64270 -1.000000 +64271 -1.000000 +64272 -1.000000 +64273 -1.000000 +64274 -1.000000 +64275 -1.000000 +64276 -1.000000 +64277 -1.000000 +64278 -1.000000 +64279 -1.000000 +64280 -1.000000 +64281 -1.000000 +64283 -1.000000 +64284 -1.000000 +64285 -1.000000 +64286 -1.000000 +64287 -1.000000 +64288 -1.000000 +64289 -1.000000 +64290 -1.000000 +64291 -1.000000 +64292 -1.000000 +64293 -1.000000 +64294 -1.000000 +64295 -1.000000 +64296 -1.000000 +64297 -1.000000 +64298 -1.000000 +64299 -1.000000 +64300 -1.000000 +64301 -1.000000 +64302 -1.000000 +64303 -1.000000 +64304 -1.000000 +64305 -1.000000 +64306 -1.000000 +64307 -1.000000 +64308 -1.000000 +64309 -1.000000 +64310 -1.000000 +64311 -1.000000 +64312 -1.000000 +64313 -1.000000 +64314 -1.000000 +64315 -1.000000 +64316 -1.000000 +64317 -1.000000 +64318 -1.000000 +64319 -1.000000 +64320 -1.000000 +64321 -1.000000 +64322 -1.000000 +64323 -1.000000 +64324 -1.000000 +64325 -1.000000 +64326 -1.000000 +64327 -1.000000 +64328 -1.000000 +64329 -1.000000 +64330 -1.000000 +64331 -1.000000 +64332 -1.000000 +64333 -1.000000 +64334 -1.000000 +64335 -1.000000 +64336 -1.000000 +64337 -1.000000 +64338 -1.000000 +64339 -1.000000 +64340 -1.000000 +64341 -1.000000 +64342 -1.000000 +64343 -1.000000 +64344 -1.000000 +64345 -1.000000 +64346 -1.000000 +64347 -1.000000 +64348 -1.000000 +64349 -1.000000 +64350 -1.000000 +64351 -1.000000 +64352 -1.000000 +64353 -1.000000 +64354 -1.000000 +64355 -1.000000 +64356 -1.000000 +64357 -1.000000 +64358 -1.000000 +64359 -1.000000 +64360 -1.000000 +64361 -1.000000 +64362 -1.000000 +64363 -1.000000 +64364 -1.000000 +64365 -1.000000 +64366 -1.000000 +64367 -1.000000 +64368 -1.000000 +64369 -1.000000 +64370 -1.000000 +64371 -1.000000 +64372 -1.000000 +64373 -1.000000 +64374 -1.000000 +64375 -1.000000 +64376 -1.000000 +64377 -1.000000 +64378 -1.000000 +64379 -1.000000 +64380 -1.000000 +64381 -1.000000 +64382 -1.000000 +64383 -1.000000 +64384 -1.000000 +64385 -1.000000 +64386 -1.000000 +64387 -1.000000 +64388 -1.000000 +64389 -1.000000 +64390 -1.000000 +64391 -1.000000 +64392 -1.000000 +64393 -1.000000 +64394 -1.000000 +64395 -1.000000 +64396 -1.000000 +64397 -1.000000 +64398 -1.000000 +64399 -1.000000 +64400 -1.000000 +64401 -1.000000 +64402 -1.000000 +64403 -1.000000 +64404 -1.000000 +64405 -1.000000 +64406 -1.000000 +64407 -1.000000 +64408 -1.000000 +64409 -1.000000 +64410 -1.000000 +64411 -1.000000 +64412 -1.000000 +64413 -1.000000 +64414 -1.000000 +64415 -1.000000 +64416 -1.000000 +64417 -1.000000 +64418 -1.000000 +64419 -1.000000 +64420 -1.000000 +64421 -1.000000 +64422 -1.000000 +64423 -1.000000 +64424 -1.000000 +64425 -1.000000 +64426 -1.000000 +64427 -1.000000 +64428 -1.000000 +64429 -1.000000 +64430 -1.000000 +64431 -1.000000 +64432 -1.000000 +64433 -1.000000 +64434 -1.000000 +64435 -1.000000 +64436 -1.000000 +64437 -1.000000 +64438 -1.000000 +64439 -1.000000 +64440 -1.000000 +64441 -1.000000 +64442 -1.000000 +64443 -1.000000 +64444 -1.000000 +64445 -1.000000 +64446 -1.000000 +64447 -1.000000 +64448 -1.000000 +64449 -1.000000 +64450 -1.000000 +64451 -1.000000 +64452 -1.000000 +64453 -1.000000 +64454 -1.000000 +64455 -1.000000 +64456 -1.000000 +64457 -1.000000 +64458 -1.000000 +64459 -1.000000 +64460 -1.000000 +64461 -1.000000 +64462 -1.000000 +64463 -1.000000 +64464 -1.000000 +64465 -1.000000 +64466 -1.000000 +64467 -1.000000 +64468 -1.000000 +64469 -1.000000 +64470 -1.000000 +64471 -1.000000 +64472 -1.000000 +64473 -1.000000 +64474 -1.000000 +64475 -1.000000 +64476 -1.000000 +64477 -1.000000 +64478 -1.000000 +64479 -1.000000 +64480 -1.000000 +64481 -1.000000 +64482 -1.000000 +64483 -1.000000 +64484 -1.000000 +64485 -1.000000 +64486 -1.000000 +64487 -1.000000 +64488 -1.000000 +64489 -1.000000 +64490 -1.000000 +64491 -1.000000 +64492 -1.000000 +64493 -1.000000 +64494 -1.000000 +64495 -1.000000 +64496 -1.000000 +64497 -1.000000 +64498 -1.000000 +64499 -1.000000 +64500 -1.000000 +64501 -1.000000 +64502 -1.000000 +64503 -1.000000 +64504 -1.000000 +64505 -1.000000 +64506 -1.000000 +64507 -1.000000 +64508 -1.000000 +64509 -1.000000 +64510 -1.000000 +64511 -1.000000 +64512 -1.000000 +64513 -1.000000 +64514 -1.000000 +64515 -1.000000 +64516 -1.000000 +64517 -1.000000 +64518 -1.000000 +64519 -1.000000 +64520 -1.000000 +64521 -1.000000 +64522 -1.000000 +64523 -1.000000 +64524 -1.000000 +64525 -1.000000 +64526 -1.000000 +64527 -1.000000 +64528 -1.000000 +64529 -1.000000 +64530 -1.000000 +64531 -1.000000 +64532 -1.000000 +64533 -1.000000 +64534 -1.000000 +64535 -1.000000 +64536 -1.000000 +64537 -1.000000 +64538 -1.000000 +64539 -1.000000 +64540 -1.000000 +64541 -1.000000 +64542 -1.000000 +64543 -1.000000 +64544 -1.000000 +64545 -1.000000 +64546 -1.000000 +64547 -1.000000 +64548 -1.000000 +64549 -1.000000 +64550 -1.000000 +64551 -1.000000 +64552 -1.000000 +64553 -1.000000 +64554 -1.000000 +64555 -1.000000 +64556 -1.000000 +64557 -1.000000 +64558 -1.000000 +64559 -1.000000 +64560 -1.000000 +64561 -1.000000 +64562 -1.000000 +64563 -1.000000 +64564 -1.000000 +64565 -1.000000 +64566 -1.000000 +64567 -1.000000 +64568 -1.000000 +64569 -1.000000 +64570 -1.000000 +64571 -1.000000 +64572 -1.000000 +64573 -1.000000 +64574 -1.000000 +64575 -1.000000 +64576 -1.000000 +64577 -1.000000 +64578 -1.000000 +64579 -1.000000 +64580 -1.000000 +64581 -1.000000 +64582 -1.000000 +64583 -1.000000 +64584 -1.000000 +64585 -1.000000 +64586 -1.000000 +64587 -1.000000 +64588 -1.000000 +64589 -1.000000 +64590 -1.000000 +64591 -1.000000 +64592 -1.000000 +64593 -1.000000 +64594 -1.000000 +64595 -1.000000 +64596 -1.000000 +64597 -1.000000 +64598 -1.000000 +64599 -1.000000 +64600 -1.000000 +64601 -1.000000 +64602 -1.000000 +64603 -1.000000 +64604 -1.000000 +64605 -1.000000 +64606 -1.000000 +64607 -1.000000 +64608 -1.000000 +64609 -1.000000 +64610 -1.000000 +64611 -1.000000 +64612 -1.000000 +64613 -1.000000 +64614 -1.000000 +64615 -1.000000 +64616 -1.000000 +64617 -1.000000 +64618 -1.000000 +64619 -1.000000 +64620 -1.000000 +64621 -1.000000 +64622 -1.000000 +64623 -1.000000 +64624 -1.000000 +64625 -1.000000 +64626 -1.000000 +64627 -1.000000 +64628 -1.000000 +64629 -1.000000 +64630 -1.000000 +64631 -1.000000 +64632 -1.000000 +64633 -1.000000 +64634 -1.000000 +64635 -1.000000 +64636 -1.000000 +64637 -1.000000 +64638 -1.000000 +64639 -1.000000 +64640 -1.000000 +64641 -1.000000 +64642 -1.000000 +64643 -1.000000 +64644 -1.000000 +64645 -1.000000 +64646 -1.000000 +64647 -1.000000 +64648 -1.000000 +64649 -1.000000 +64650 -1.000000 +64651 -1.000000 +64652 -1.000000 +64653 -1.000000 +64654 -1.000000 +64655 -1.000000 +64656 -1.000000 +64657 -1.000000 +64658 -1.000000 +64659 -1.000000 +64660 -1.000000 +64661 -1.000000 +64662 -1.000000 +64663 -1.000000 +64664 -1.000000 +64665 -1.000000 +64666 -1.000000 +64667 -1.000000 +64668 -1.000000 +64669 -1.000000 +64670 -1.000000 +64671 -1.000000 +64672 -1.000000 +64673 -1.000000 +64674 -1.000000 +64675 -1.000000 +64676 -1.000000 +64677 -1.000000 +64678 -1.000000 +64679 -1.000000 +64680 -1.000000 +64681 -1.000000 +64682 -1.000000 +64683 -1.000000 +64684 -1.000000 +64685 -1.000000 +64686 -1.000000 +64687 -1.000000 +64688 -1.000000 +64689 -1.000000 +64690 -1.000000 +64691 -1.000000 +64692 -1.000000 +64693 -1.000000 +64694 -1.000000 +64695 -1.000000 +64696 -1.000000 +64697 -1.000000 +64698 -1.000000 +64699 -1.000000 +64700 -1.000000 +64701 -1.000000 +64702 -1.000000 +64703 -1.000000 +64704 -1.000000 +64705 -1.000000 +64706 -1.000000 +64707 -1.000000 +64708 -1.000000 +64709 -1.000000 +64710 -1.000000 +64711 -1.000000 +64712 -1.000000 +64713 -1.000000 +64714 -1.000000 +64715 -1.000000 +64716 -1.000000 +64717 -1.000000 +64718 -1.000000 +64719 -1.000000 +64720 -1.000000 +64721 -1.000000 +64722 -1.000000 +64723 -1.000000 +64724 -1.000000 +64725 -1.000000 +64726 -1.000000 +64727 -1.000000 +64728 -1.000000 +64729 -1.000000 +64730 -1.000000 +64731 -1.000000 +64733 -1.000000 +64734 -1.000000 +64735 -1.000000 +64736 -1.000000 +64737 -1.000000 +64738 -1.000000 +64739 -1.000000 +64740 -1.000000 +64741 -1.000000 +64742 -1.000000 +64743 -1.000000 +64744 -1.000000 +64745 -1.000000 +64746 -1.000000 +64747 -1.000000 +64748 -1.000000 +64749 -1.000000 +64750 -1.000000 +64751 -1.000000 +64752 -1.000000 +64753 -1.000000 +64754 -1.000000 +64755 -1.000000 +64756 -1.000000 +64757 -1.000000 +64758 -1.000000 +64759 -1.000000 +64760 -1.000000 +64761 -1.000000 +64762 -1.000000 +64763 -1.000000 +64764 -1.000000 +64765 -1.000000 +64766 -1.000000 +64767 -1.000000 +64768 -1.000000 +64769 -1.000000 +64770 -1.000000 +64771 -1.000000 +64772 -1.000000 +64773 -1.000000 +64774 -1.000000 +64775 -1.000000 +64776 -1.000000 +64777 -1.000000 +64778 -1.000000 +64779 -1.000000 +64780 -1.000000 +64781 -1.000000 +64782 -1.000000 +64783 -1.000000 +64784 -1.000000 +64785 -1.000000 +64786 -1.000000 +64787 -1.000000 +64788 -1.000000 +64789 -1.000000 +64792 -1.000000 +64802 -1.000000 +64803 -1.000000 +64804 -1.000000 +64805 -1.000000 +64806 -1.000000 +64807 -1.000000 +64808 -1.000000 +64809 -1.000000 +64810 -1.000000 +64811 -1.000000 +64812 -1.000000 +64813 -1.000000 +64814 -1.000000 +64815 -1.000000 +64816 -1.000000 +64817 -1.000000 +64818 -1.000000 +64819 -1.000000 +64820 -1.000000 +64821 -1.000000 +64822 -1.000000 +64823 -1.000000 +64824 -1.000000 +64825 -1.000000 +64826 -1.000000 +64827 -1.000000 +64828 -1.000000 +64829 -1.000000 +64830 -1.000000 +64831 -1.000000 +64832 -1.000000 +64833 -1.000000 +64834 -1.000000 +64835 -1.000000 +64836 -1.000000 +64837 -1.000000 +64838 -1.000000 +64839 -1.000000 +64840 -1.000000 +64841 -1.000000 +64842 -1.000000 +64843 -1.000000 +64844 -1.000000 +64845 -1.000000 +64846 -1.000000 +64847 -1.000000 +64848 -1.000000 +64849 -1.000000 +64850 -1.000000 +64851 -1.000000 +64852 -1.000000 +64853 -1.000000 +64854 -1.000000 +64855 -1.000000 +64856 -1.000000 +64857 -1.000000 +64861 -1.000000 +64862 -1.000000 +64863 -1.000000 +64864 -1.000000 +64865 -1.000000 +64866 -1.000000 +64867 -1.000000 +64868 -1.000000 +64869 -1.000000 +64870 -1.000000 +64871 -1.000000 +64872 -1.000000 +64873 -1.000000 +64874 -1.000000 +64875 -1.000000 +64876 -1.000000 +64877 -1.000000 +64878 -1.000000 +64879 -1.000000 +64880 -1.000000 +64881 -1.000000 +64882 -1.000000 +64883 -1.000000 +64884 -1.000000 +64885 -1.000000 +64886 -1.000000 +64887 -1.000000 +64888 -1.000000 +64889 -1.000000 +64890 -1.000000 +64891 -1.000000 +64892 -1.000000 +64893 -1.000000 +64894 -1.000000 +64895 -1.000000 +64896 -1.000000 +64897 -1.000000 +64898 -1.000000 +64899 -1.000000 +64900 -1.000000 +64901 -1.000000 +64902 -1.000000 +64903 -1.000000 +64904 -1.000000 +64905 -1.000000 +64906 -1.000000 +64907 -1.000000 +64908 -1.000000 +64909 -1.000000 +64910 -1.000000 +64911 -1.000000 +64912 -1.000000 +64913 -1.000000 +64914 -1.000000 +64915 -1.000000 +64916 -1.000000 +64917 -1.000000 +64918 -1.000000 +64920 -1.000000 +64921 -1.000000 +64922 -1.000000 +64923 -1.000000 +64924 -1.000000 +64925 -1.000000 +64926 -1.000000 +64927 -1.000000 +64928 -1.000000 +64929 -1.000000 +64930 -1.000000 +64931 -1.000000 +64932 -1.000000 +64933 -1.000000 +64935 -1.000000 +64936 -1.000000 +64938 -1.000000 +64941 -1.000000 +64943 -1.000000 +64944 -1.000000 +64945 -1.000000 +64946 -1.000000 +64948 -1.000000 +64955 -1.000000 +64956 -1.000000 +64966 -1.000000 +64968 -1.000000 +64969 -1.000000 +64972 -1.000000 +64973 -1.000000 +64976 -1.000000 +64977 -1.000000 +64978 -1.000000 +64979 -1.000000 +64980 -1.000000 +64981 -1.000000 +64982 -1.000000 +64985 -1.000000 +64986 -1.000000 +64987 -1.000000 +64993 -1.000000 +65000 -1.000000 +65001 -1.000000 +65002 -1.000000 +65003 -1.000000 +65004 -1.000000 +65005 -1.000000 +65006 -1.000000 +65007 -1.000000 +65008 -1.000000 +65009 -1.000000 +65010 -1.000000 +65011 -1.000000 +65012 -1.000000 +65013 -1.000000 +65014 -1.000000 +65015 -1.000000 +65016 -1.000000 +65017 -1.000000 +65018 -1.000000 +65020 -1.000000 +65021 -1.000000 +65022 -1.000000 +65023 -1.000000 +65024 -1.000000 +65025 -1.000000 +65026 -1.000000 +65027 -1.000000 +65028 -1.000000 +65029 -1.000000 +65030 -1.000000 +65031 -1.000000 +65032 -1.000000 +65033 -1.000000 +65034 -1.000000 +65035 -1.000000 +65036 -1.000000 +65037 -1.000000 +65038 -1.000000 +65039 -1.000000 +65040 -1.000000 +65041 -1.000000 +65042 -1.000000 +65043 -1.000000 +65044 -1.000000 +65045 -1.000000 +65046 -1.000000 +65047 -1.000000 +65048 -1.000000 +65049 -1.000000 +65050 -1.000000 +65051 -1.000000 +65052 -1.000000 +65053 -1.000000 +65054 -1.000000 +65055 -1.000000 +65056 -1.000000 +65057 -1.000000 +65058 -1.000000 +65059 -1.000000 +65060 -1.000000 +65061 -1.000000 +65062 -1.000000 +65063 -1.000000 +65064 -1.000000 +65065 -1.000000 +65066 -1.000000 +65067 -1.000000 +65068 -1.000000 +65069 -1.000000 +65070 -1.000000 +65071 -1.000000 +65072 -1.000000 +65073 -1.000000 +65074 -1.000000 +65075 -1.000000 +65076 -1.000000 +65077 -1.000000 +65078 -1.000000 +65079 -1.000000 +65080 -1.000000 +65081 -1.000000 +65082 -1.000000 +65083 -1.000000 +65084 -1.000000 +65085 -1.000000 +65086 -1.000000 +65087 -1.000000 +65088 -1.000000 +65089 -1.000000 +65090 -1.000000 +65091 -1.000000 +65092 -1.000000 +65093 -1.000000 +65094 -1.000000 +65095 -1.000000 +65096 -1.000000 +65097 -1.000000 +65098 -1.000000 +65099 -1.000000 +65100 -1.000000 +65101 -1.000000 +65102 -1.000000 +65103 -1.000000 +65104 -1.000000 +65105 -1.000000 +65106 -1.000000 +65107 -1.000000 +65108 -1.000000 +65109 -1.000000 +65110 -1.000000 +65111 -1.000000 +65112 -1.000000 +65113 -1.000000 +65114 -1.000000 +65115 -1.000000 +65116 -1.000000 +65117 -1.000000 +65118 -1.000000 +65119 -1.000000 +65120 -1.000000 +65121 -1.000000 +65122 -1.000000 +65123 -1.000000 +65124 -1.000000 +65125 -1.000000 +65126 -1.000000 +65127 -1.000000 +65128 -1.000000 +65129 -1.000000 +65130 -1.000000 +65131 -1.000000 +65132 -1.000000 +65133 -1.000000 +65134 -1.000000 +65135 -1.000000 +65136 -1.000000 +65137 -1.000000 +65138 -1.000000 +65139 -1.000000 +65140 -1.000000 +65141 -1.000000 +65142 -1.000000 +65143 -1.000000 +65144 -1.000000 +65145 -1.000000 +65146 -1.000000 +65147 -1.000000 +65148 -1.000000 +65149 -1.000000 +65150 -1.000000 +65151 -1.000000 +65152 -1.000000 +65153 -1.000000 +65154 -1.000000 +65155 -1.000000 +65156 -1.000000 +65157 -1.000000 +65158 -1.000000 +65159 -1.000000 +65160 -1.000000 +65161 -1.000000 +65162 -1.000000 +65163 -1.000000 +65164 -1.000000 +65165 -1.000000 +65166 -1.000000 +65167 -1.000000 +65168 -1.000000 +65169 -1.000000 +65170 -1.000000 +65171 -1.000000 +65172 -1.000000 +65173 -1.000000 +65174 -1.000000 +65175 -1.000000 +65176 -1.000000 +65177 -1.000000 +65178 -1.000000 +65179 -1.000000 +65180 -1.000000 +65181 -1.000000 +65182 -1.000000 +65183 -1.000000 +65184 -1.000000 +65185 -1.000000 +65186 -1.000000 +65187 -1.000000 +65188 -1.000000 +65189 -1.000000 +65190 -1.000000 +65191 -1.000000 +65192 -1.000000 +65193 -1.000000 +65194 -1.000000 +65195 -1.000000 +65196 -1.000000 +65197 -1.000000 +65198 -1.000000 +65199 -1.000000 +65200 -1.000000 +65201 -1.000000 +65202 -1.000000 +65203 -1.000000 +65204 -1.000000 +65205 -1.000000 +65206 -1.000000 +65207 -1.000000 +65208 -1.000000 +65209 -1.000000 +65210 -1.000000 +65211 -1.000000 +65212 -1.000000 +65213 -1.000000 +65214 -1.000000 +65215 -1.000000 +65216 -1.000000 +65217 -1.000000 +65218 -1.000000 +65219 -1.000000 +65220 -1.000000 +65221 -1.000000 +65222 -1.000000 +65223 -1.000000 +65224 -1.000000 +65225 -1.000000 +65226 -1.000000 +65227 -1.000000 +65228 -1.000000 +65229 -1.000000 +65230 -1.000000 +65231 -1.000000 +65232 -1.000000 +65233 -1.000000 +65234 -1.000000 +65235 -1.000000 +65236 -1.000000 +65237 -1.000000 +65238 -1.000000 +65239 -1.000000 +65240 -1.000000 +65241 -1.000000 +65242 -1.000000 +65243 -1.000000 +65244 -1.000000 +65245 -1.000000 +65246 -1.000000 +65247 -1.000000 +65248 -1.000000 +65249 -1.000000 +65250 -1.000000 +65251 -1.000000 +65252 -1.000000 +65253 -1.000000 +65254 -1.000000 +65255 -1.000000 +65256 -1.000000 +65257 -1.000000 +65258 -1.000000 +65259 -1.000000 +65260 -1.000000 +65261 -1.000000 +65262 -1.000000 +65263 -1.000000 +65264 -1.000000 +65265 -1.000000 +65266 -1.000000 +65267 -1.000000 +65268 -1.000000 +65269 -1.000000 +65270 -1.000000 +65271 -1.000000 +65272 -1.000000 +65273 -1.000000 +65274 -1.000000 +65275 -1.000000 +65276 -1.000000 +65277 -1.000000 +65278 -1.000000 +65279 -1.000000 +65280 -1.000000 +65281 -1.000000 +65282 -1.000000 +65283 -1.000000 +65284 -1.000000 +65285 -1.000000 +65286 -1.000000 +65287 -1.000000 +65288 -1.000000 +65289 -1.000000 +65290 -1.000000 +65291 -1.000000 +65292 -1.000000 +65293 -1.000000 +65294 -1.000000 +65295 -1.000000 +65296 -1.000000 +65297 -1.000000 +65298 -1.000000 +65299 -1.000000 +65300 -1.000000 +65301 -1.000000 +65302 -1.000000 +65303 -1.000000 +65304 -1.000000 +65305 -1.000000 +65306 -1.000000 +65307 -1.000000 +65308 -1.000000 +65309 -1.000000 +65310 -1.000000 +65311 -1.000000 +65312 -1.000000 +65313 -1.000000 +65314 -1.000000 +65315 -1.000000 +65316 -1.000000 +65317 -1.000000 +65318 -1.000000 +65319 -1.000000 +65320 -1.000000 +65321 -1.000000 +65322 -1.000000 +65323 -1.000000 +65324 -1.000000 +65325 -1.000000 +65326 -1.000000 +65327 -1.000000 +65328 -1.000000 +65329 -1.000000 +65330 -1.000000 +65331 -1.000000 +65332 -1.000000 +65333 -1.000000 +65334 -1.000000 +65335 -1.000000 +65336 -1.000000 +65337 -1.000000 +65338 -1.000000 +65339 -1.000000 +65340 -1.000000 +65341 -1.000000 +65342 -1.000000 +65343 -1.000000 +65344 -1.000000 +65345 -1.000000 +65346 -1.000000 +65347 -1.000000 +65348 -1.000000 +65349 -1.000000 +65350 -1.000000 +65351 -1.000000 +65352 -1.000000 +65353 -1.000000 +65354 -1.000000 +65355 -1.000000 +65356 -1.000000 +65357 -1.000000 +65358 -1.000000 +65359 -1.000000 +65360 -1.000000 +65361 -1.000000 +65362 -1.000000 +65363 -1.000000 +65364 -1.000000 +65365 -1.000000 +65366 -1.000000 +65367 -1.000000 +65368 -1.000000 +65369 -1.000000 +65370 -1.000000 +65371 -1.000000 +65372 -1.000000 +65373 -1.000000 +65374 -1.000000 +65375 -1.000000 +65376 -1.000000 +65377 -1.000000 +65378 -1.000000 +65379 -1.000000 +65380 -1.000000 +65381 -1.000000 +65382 -1.000000 +65383 -1.000000 +65384 -1.000000 +65385 -1.000000 +65386 -1.000000 +65387 -1.000000 +65388 -1.000000 +65389 -1.000000 +65390 -1.000000 +65391 -1.000000 +65392 -1.000000 +65393 -1.000000 +65394 -1.000000 +65395 -1.000000 +65396 -1.000000 +65397 -1.000000 +65398 -1.000000 +65399 -1.000000 +65400 -1.000000 +65401 -1.000000 +65402 -1.000000 +65403 -1.000000 +65404 -1.000000 +65405 -1.000000 +65406 -1.000000 +65407 -1.000000 +65408 -1.000000 +65409 -1.000000 +65410 -1.000000 +65411 -1.000000 +65412 -1.000000 +65413 -1.000000 +65414 -1.000000 +65415 -1.000000 +65416 -1.000000 +65417 -1.000000 +65418 -1.000000 +65419 -1.000000 +65420 -1.000000 +65421 -1.000000 +65422 -1.000000 +65423 -1.000000 +65424 -1.000000 +65425 -1.000000 +65426 -1.000000 +65427 -1.000000 +65428 -1.000000 +65430 -1.000000 +65431 -1.000000 +65432 -1.000000 +65433 -1.000000 +65434 -1.000000 +65435 -1.000000 +65436 -1.000000 +65437 -1.000000 +65438 -1.000000 +65439 -1.000000 +65440 -1.000000 +65441 -1.000000 +65442 -1.000000 +65443 -1.000000 +65444 -1.000000 +65445 -1.000000 +65446 -1.000000 +65447 -1.000000 +65448 -1.000000 +65449 -1.000000 +65450 -1.000000 +65451 -1.000000 +65452 -1.000000 +65453 -1.000000 +65454 -1.000000 +65455 -1.000000 +65456 -1.000000 +65457 -1.000000 +65458 -1.000000 +65459 -1.000000 +65460 -1.000000 +65461 -1.000000 +65462 -1.000000 +65463 -1.000000 +65464 -1.000000 +65465 -1.000000 +65466 -1.000000 +65467 -1.000000 +65468 -1.000000 +65469 -1.000000 +65470 -1.000000 +65471 -1.000000 +65472 -1.000000 +65473 -1.000000 +65474 -1.000000 +65475 -1.000000 +65476 -1.000000 +65477 -1.000000 +65478 -1.000000 +65479 -1.000000 +65480 -1.000000 +65481 -1.000000 +65482 -1.000000 +65483 -1.000000 +65484 -1.000000 +65485 -1.000000 +65486 -1.000000 +65487 -1.000000 +65488 -1.000000 +65489 -1.000000 +65490 -1.000000 +65491 -1.000000 +65492 -1.000000 +65493 -1.000000 +65494 -1.000000 +65495 -1.000000 +65496 -1.000000 +65497 -1.000000 +65498 -1.000000 +65499 -1.000000 +65500 -1.000000 +65501 -1.000000 +65502 -1.000000 +65503 -1.000000 +65505 -1.000000 +65506 -1.000000 +65507 -1.000000 +65508 -1.000000 +65509 -1.000000 +65510 -1.000000 +65511 -1.000000 +65512 -1.000000 +65513 -1.000000 +65514 -1.000000 +65515 -1.000000 +65516 -1.000000 +65517 -1.000000 +65518 -1.000000 +65519 -1.000000 +65520 -1.000000 +65521 -1.000000 +65522 -1.000000 +65523 -1.000000 +65524 -1.000000 +65525 -1.000000 +65526 -1.000000 +65527 -1.000000 +65528 -1.000000 +65529 -1.000000 +65530 -1.000000 +65531 -1.000000 +65532 -1.000000 +65533 -1.000000 +65534 -1.000000 +65535 -1.000000 +65536 -1.000000 +65537 -1.000000 +65538 -1.000000 +65539 -1.000000 +65541 -1.000000 +65542 -1.000000 +65543 -1.000000 +65544 -1.000000 +65545 -1.000000 +65546 -1.000000 +65547 -1.000000 +65548 -1.000000 +65549 -1.000000 +65550 -1.000000 +65551 -1.000000 +65552 -1.000000 +65553 -1.000000 +65554 -1.000000 +65555 -1.000000 +65556 -1.000000 +65557 -1.000000 +65558 -1.000000 +65559 -1.000000 +65560 -1.000000 +65561 -1.000000 +65562 -1.000000 +65563 -1.000000 +65564 -1.000000 +65565 -1.000000 +65566 -1.000000 +65567 -1.000000 +65568 -1.000000 +65569 -1.000000 +65570 -1.000000 +65571 -1.000000 +65572 -1.000000 +65573 -1.000000 +65574 -1.000000 +65575 -1.000000 +65576 -1.000000 +65577 -1.000000 +65578 -1.000000 +65579 -1.000000 +65580 -1.000000 +65581 -1.000000 +65582 -1.000000 +65583 -1.000000 +65584 -1.000000 +65585 -1.000000 +65586 -1.000000 +65587 -1.000000 +65588 -1.000000 +65589 -1.000000 +65590 -1.000000 +65591 -1.000000 +65592 -1.000000 +65593 -1.000000 +65594 -1.000000 +65595 -1.000000 +65596 -1.000000 +65597 -1.000000 +65598 -1.000000 +65599 -1.000000 +65600 -1.000000 +65601 -1.000000 +65602 -1.000000 +65603 -1.000000 +65604 -1.000000 +65605 -1.000000 +65606 -1.000000 +65607 -1.000000 +65608 -1.000000 +65609 -1.000000 +65610 -1.000000 +65611 -1.000000 +65612 -1.000000 +65613 -1.000000 +65614 -1.000000 +65615 -1.000000 +65616 -1.000000 +65617 -1.000000 +65618 -1.000000 +65619 -1.000000 +65620 -1.000000 +65621 -1.000000 +65622 -1.000000 +65623 -1.000000 +65624 -1.000000 +65625 -1.000000 +65626 -1.000000 +65627 -1.000000 +65628 -1.000000 +65629 -1.000000 +65630 -1.000000 +65631 -1.000000 +65632 -1.000000 +65633 -1.000000 +65634 -1.000000 +65635 -1.000000 +65636 -1.000000 +65637 -1.000000 +65638 -1.000000 +65639 -1.000000 +65640 -1.000000 +65641 -1.000000 +65642 -1.000000 +65643 -1.000000 +65644 -1.000000 +65645 -1.000000 +65646 -1.000000 +65647 -1.000000 +65648 -1.000000 +65649 -1.000000 +65650 -1.000000 +65651 -1.000000 +65652 -1.000000 +65653 -1.000000 +65654 -1.000000 +65655 -1.000000 +65656 -1.000000 +65657 -1.000000 +65658 -1.000000 +65659 -1.000000 +65660 -1.000000 +65661 -1.000000 +65662 -1.000000 +65667 -1.000000 +65668 -1.000000 +65669 -1.000000 +65670 -1.000000 +65671 -1.000000 +65672 -1.000000 +65673 -1.000000 +65674 -1.000000 +65675 -1.000000 +65676 -1.000000 +65677 -1.000000 +65678 -1.000000 +65679 -1.000000 +65680 -1.000000 +65681 -1.000000 +65682 -1.000000 +65683 -1.000000 +65684 -1.000000 +65685 -1.000000 +65686 -1.000000 +65687 -1.000000 +65688 -1.000000 +65689 -1.000000 +65690 -1.000000 +65691 -1.000000 +65692 -1.000000 +65693 -1.000000 +65694 -1.000000 +65695 -1.000000 +65696 -1.000000 +65697 -1.000000 +65698 -1.000000 +65699 -1.000000 +65700 -1.000000 +65701 -1.000000 +65702 -1.000000 +65703 -1.000000 +65704 -1.000000 +65705 -1.000000 +65706 -1.000000 +65707 -1.000000 +65708 -1.000000 +65709 -1.000000 +65710 -1.000000 +65711 -1.000000 +65712 -1.000000 +65713 -1.000000 +65714 -1.000000 +65715 -1.000000 +65716 -1.000000 +65717 -1.000000 +65718 -1.000000 +65719 -1.000000 +65720 -1.000000 +65721 -1.000000 +65722 -1.000000 +65723 -1.000000 +65724 -1.000000 +65725 -1.000000 +65726 -1.000000 +65727 -1.000000 +65728 -1.000000 +65729 -1.000000 +65730 -1.000000 +65731 -1.000000 +65732 -1.000000 +65733 -1.000000 +65734 -1.000000 +65735 -1.000000 +65736 -1.000000 +65737 -1.000000 +65738 -1.000000 +65739 -1.000000 +65740 -1.000000 +65741 -1.000000 +65742 -1.000000 +65743 -1.000000 +65744 -1.000000 +65745 -1.000000 +65746 -1.000000 +65747 -1.000000 +65748 -1.000000 +65749 -1.000000 +65750 -1.000000 +65751 -1.000000 +65752 -1.000000 +65753 -1.000000 +65754 -1.000000 +65755 -1.000000 +65756 -1.000000 +65757 -1.000000 +65758 -1.000000 +65759 -1.000000 +65760 -1.000000 +65761 -1.000000 +65762 -1.000000 +65763 -1.000000 +65764 -1.000000 +65765 -1.000000 +65766 -1.000000 +65767 -1.000000 +65768 -1.000000 +65769 -1.000000 +65770 -1.000000 +65771 -1.000000 +65772 -1.000000 +65773 -1.000000 +65774 -1.000000 +65775 -1.000000 +65776 -1.000000 +65777 -1.000000 +65778 -1.000000 +65779 -1.000000 +65780 -1.000000 +65781 -1.000000 +65782 -1.000000 +65783 -1.000000 +65784 -1.000000 +65785 -1.000000 +65786 -1.000000 +65787 -1.000000 +65788 -1.000000 +65789 -1.000000 +65790 -1.000000 +65791 -1.000000 +65792 -1.000000 +65793 -1.000000 +65794 -1.000000 +65795 -1.000000 +65796 -1.000000 +65797 -1.000000 +65798 -1.000000 +65799 -1.000000 +65800 -1.000000 +65801 -1.000000 +65802 -1.000000 +65803 -1.000000 +65804 -1.000000 +65805 -1.000000 +65806 -1.000000 +65807 -1.000000 +65808 -1.000000 +65809 -1.000000 +65810 -1.000000 +65811 -1.000000 +65812 -1.000000 +65813 -1.000000 +65814 -1.000000 +65815 -1.000000 +65816 -1.000000 +65817 -1.000000 +65818 -1.000000 +65819 -1.000000 +65820 -1.000000 +65821 -1.000000 +65823 -1.000000 +65824 -1.000000 +65825 -1.000000 +65826 -1.000000 +65827 -1.000000 +65828 -1.000000 +65829 -1.000000 +65830 -1.000000 +65831 -1.000000 +65832 -1.000000 +65833 -1.000000 +65834 -1.000000 +65835 -1.000000 +65836 -1.000000 +65837 -1.000000 +65838 -1.000000 +65839 -1.000000 +65840 -1.000000 +65841 -1.000000 +65842 -1.000000 +65843 -1.000000 +65844 -1.000000 +65845 -1.000000 +65846 -1.000000 +65847 -1.000000 +65848 -1.000000 +65849 -1.000000 +65850 -1.000000 +65851 -1.000000 +65852 -1.000000 +65853 -1.000000 +65854 -1.000000 +65855 -1.000000 +65856 -1.000000 +65857 -1.000000 +65858 -1.000000 +65859 -1.000000 +65860 -1.000000 +65861 -1.000000 +65862 -1.000000 +65863 -1.000000 +65864 -1.000000 +65865 -1.000000 +65866 -1.000000 +65867 -1.000000 +65868 -1.000000 +65869 -1.000000 +65870 -1.000000 +65871 -1.000000 +65872 -1.000000 +65873 -1.000000 +65874 -1.000000 +65875 -1.000000 +65876 -1.000000 +65877 -1.000000 +65878 -1.000000 +65879 -1.000000 +65880 -1.000000 +65881 -1.000000 +65882 -1.000000 +65883 -1.000000 +65884 -1.000000 +65885 -1.000000 +65886 -1.000000 +65887 -1.000000 +65888 -1.000000 +65889 -1.000000 +65890 -1.000000 +65891 -1.000000 +65892 -1.000000 +65893 -1.000000 +65894 -1.000000 +65895 -1.000000 +65896 -1.000000 +65897 -1.000000 +65898 -1.000000 +65899 -1.000000 +65900 -1.000000 +65901 -1.000000 +65902 -1.000000 +65903 -1.000000 +65904 -1.000000 +65905 -1.000000 +65906 -1.000000 +65907 -1.000000 +65908 -1.000000 +65909 -1.000000 +65910 -1.000000 +65911 -1.000000 +65912 -1.000000 +65913 -1.000000 +65914 -1.000000 +65915 -1.000000 +65916 -1.000000 +65917 -1.000000 +65918 -1.000000 +65919 -1.000000 +65920 -1.000000 +65921 -1.000000 +65922 -1.000000 +65923 -1.000000 +65924 -1.000000 +65925 -1.000000 +65926 -1.000000 +65927 -1.000000 +65928 -1.000000 +65929 -1.000000 +65930 -1.000000 +65931 -1.000000 +65932 -1.000000 +65933 -1.000000 +65934 -1.000000 +65935 -1.000000 +65936 -1.000000 +65937 -1.000000 +65938 -1.000000 +65939 -1.000000 +65940 -1.000000 +65941 -1.000000 +65942 -1.000000 +65943 -1.000000 +65944 -1.000000 +65945 -1.000000 +65946 -1.000000 +65947 -1.000000 +65948 -1.000000 +65949 -1.000000 +65950 -1.000000 +65951 -1.000000 +65952 -1.000000 +65953 -1.000000 +65954 -1.000000 +65955 -1.000000 +65956 -1.000000 +65957 -1.000000 +65958 -1.000000 +65959 -1.000000 +65960 -1.000000 +65961 -1.000000 +65962 -1.000000 +65963 -1.000000 +65964 -1.000000 +65965 -1.000000 +65966 -1.000000 +65967 -1.000000 +65968 -1.000000 +65969 -1.000000 +65970 -1.000000 +65971 -1.000000 +65972 -1.000000 +65973 -1.000000 +65974 -1.000000 +65975 -1.000000 +65976 -1.000000 +65977 -1.000000 +65978 -1.000000 +65979 -1.000000 +65980 -1.000000 +65981 -1.000000 +65982 -1.000000 +65983 -1.000000 +65984 -1.000000 +65985 -1.000000 +65986 -1.000000 +65987 -1.000000 +65988 -1.000000 +65989 -1.000000 +65990 -1.000000 +65991 -1.000000 +65992 -1.000000 +65993 -1.000000 +65994 -1.000000 +65995 -1.000000 +65996 -1.000000 +65997 -1.000000 +65998 -1.000000 +65999 -1.000000 +66000 -1.000000 +66001 -1.000000 +66002 -1.000000 +66003 -1.000000 +66004 -1.000000 +66005 -1.000000 +66006 -1.000000 +66007 -1.000000 +66008 -1.000000 +66009 -1.000000 +66010 -1.000000 +66011 -1.000000 +66012 -1.000000 +66013 -1.000000 +66014 -1.000000 +66015 -1.000000 +66016 -1.000000 +66017 -1.000000 +66018 -1.000000 +66019 -1.000000 +66020 -1.000000 +66021 -1.000000 +66022 -1.000000 +66023 -1.000000 +66056 -1.000000 +66058 -1.000000 +66061 -1.000000 +66062 -1.000000 +66063 -1.000000 +66064 -1.000000 +66065 -1.000000 +66066 -1.000000 +66067 -1.000000 +66068 -1.000000 +66069 -1.000000 +66070 -1.000000 +66071 -1.000000 +66072 -1.000000 +66073 -1.000000 +66074 -1.000000 +66075 -1.000000 +66076 -1.000000 +66077 -1.000000 +66078 -1.000000 +66079 -1.000000 +66080 -1.000000 +66081 -1.000000 +66082 -1.000000 +66083 -1.000000 +66084 -1.000000 +66085 -1.000000 +66086 -1.000000 +66087 -1.000000 +66088 -1.000000 +66089 -1.000000 +66090 -1.000000 +66091 -1.000000 +66092 -1.000000 +66093 -1.000000 +66094 -1.000000 +66095 -1.000000 +66096 -1.000000 +66097 -1.000000 +66098 -1.000000 +66099 -1.000000 +66100 -1.000000 +66101 -1.000000 +66102 -1.000000 +66103 -1.000000 +66104 -1.000000 +66105 -1.000000 +66106 -1.000000 +66107 -1.000000 +66108 -1.000000 +66109 -1.000000 +66110 -1.000000 +66111 -1.000000 +66112 -1.000000 +66113 -1.000000 +66114 -1.000000 +66115 -1.000000 +66116 -1.000000 +66117 -1.000000 +66118 -1.000000 +66119 -1.000000 +66120 -1.000000 +66121 -1.000000 +66122 -1.000000 +66123 -1.000000 +66124 -1.000000 +66125 -1.000000 +66126 -1.000000 +66127 -1.000000 +66128 -1.000000 +66129 -1.000000 +66130 -1.000000 +66131 -1.000000 +66132 -1.000000 +66133 -1.000000 +66134 -1.000000 +66135 -1.000000 +66136 -1.000000 +66137 -1.000000 +66138 -1.000000 +66139 -1.000000 +66140 -1.000000 +66141 -1.000000 +66142 -1.000000 +66143 -1.000000 +66144 -1.000000 +66145 -1.000000 +66146 -1.000000 +66147 -1.000000 +66148 -1.000000 +66149 -1.000000 +66150 -1.000000 +66151 -1.000000 +66152 -1.000000 +66153 -1.000000 +66154 -1.000000 +66155 -1.000000 +66156 -1.000000 +66157 -1.000000 +66158 -1.000000 +66159 -1.000000 +66160 -1.000000 +66161 -1.000000 +66162 -1.000000 +66163 -1.000000 +66164 -1.000000 +66165 -1.000000 +66166 -1.000000 +66167 -1.000000 +66168 -1.000000 +66169 -1.000000 +66170 -1.000000 +66171 -1.000000 +66172 -1.000000 +66173 -1.000000 +66174 -1.000000 +66175 -1.000000 +66176 -1.000000 +66177 -1.000000 +66178 -1.000000 +66180 -1.000000 +66181 -1.000000 +66182 -1.000000 +66183 -1.000000 +66184 -1.000000 +66185 -1.000000 +66186 -1.000000 +66187 -1.000000 +66188 -1.000000 +66189 -1.000000 +66190 -1.000000 +66191 -1.000000 +66192 -1.000000 +66193 -1.000000 +66194 -1.000000 +66195 -1.000000 +66196 -1.000000 +66197 -1.000000 +66198 -1.000000 +66199 -1.000000 +66200 -1.000000 +66201 -1.000000 +66202 -1.000000 +66203 -1.000000 +66204 -1.000000 +66205 -1.000000 +66206 -1.000000 +66207 -1.000000 +66210 -1.000000 +66211 -1.000000 +66212 -1.000000 +66213 -1.000000 +66214 -1.000000 +66215 -1.000000 +66216 -1.000000 +66217 -1.000000 +66218 -1.000000 +66219 -1.000000 +66220 -1.000000 +66221 -1.000000 +66222 -1.000000 +66223 -1.000000 +66224 -1.000000 +66225 -1.000000 +66226 -1.000000 +66227 -1.000000 +66228 -1.000000 +66229 -1.000000 +66230 -1.000000 +66231 -1.000000 +66232 -1.000000 +66233 -1.000000 +66234 -1.000000 +66235 -1.000000 +66236 -1.000000 +66237 -1.000000 +66238 -1.000000 +66239 -1.000000 +66240 -1.000000 +66241 -1.000000 +66242 -1.000000 +66243 -1.000000 +66244 -1.000000 +66245 -1.000000 +66246 -1.000000 +66247 -1.000000 +66248 -1.000000 +66249 -1.000000 +66250 -1.000000 +66251 -1.000000 +66252 -1.000000 +66253 -1.000000 +66254 -1.000000 +66255 -1.000000 +66256 -1.000000 +66257 -1.000000 +66258 -1.000000 +66259 -1.000000 +66260 -1.000000 +66261 -1.000000 +66262 -1.000000 +66263 -1.000000 +66264 -1.000000 +66265 -1.000000 +66266 -1.000000 +66267 -1.000000 +66268 -1.000000 +66269 -1.000000 +66270 -1.000000 +66271 -1.000000 +66272 -1.000000 +66273 -1.000000 +66274 -1.000000 +66275 -1.000000 +66276 -1.000000 +66277 -1.000000 +66278 -1.000000 +66279 -1.000000 +66280 -1.000000 +66281 -1.000000 +66282 -1.000000 +66283 -1.000000 +66284 -1.000000 +66285 -1.000000 +66286 -1.000000 +66287 -1.000000 +66288 -1.000000 +66289 -1.000000 +66290 -1.000000 +66291 -1.000000 +66292 -1.000000 +66293 -1.000000 +66294 -1.000000 +66295 -1.000000 +66296 -1.000000 +66297 -1.000000 +66298 -1.000000 +66299 -1.000000 +66300 -1.000000 +66301 -1.000000 +66302 -1.000000 +66303 -1.000000 +66304 -1.000000 +66305 -1.000000 +66306 -1.000000 +66307 -1.000000 +66308 -1.000000 +66309 -1.000000 +66310 -1.000000 +66311 -1.000000 +66312 -1.000000 +66313 -1.000000 +66314 -1.000000 +66315 -1.000000 +66316 -1.000000 +66317 -1.000000 +66318 -1.000000 +66319 -1.000000 +66320 -1.000000 +66321 -1.000000 +66322 -1.000000 +66323 -1.000000 +66324 -1.000000 +66325 -1.000000 +66326 -1.000000 +66327 -1.000000 +66328 -1.000000 +66329 -1.000000 +66330 -1.000000 +66331 -1.000000 +66332 -1.000000 +66333 -1.000000 +66334 -1.000000 +66335 -1.000000 +66336 -1.000000 +66337 -1.000000 +66338 -1.000000 +66339 -1.000000 +66340 -1.000000 +66341 -1.000000 +66342 -1.000000 +66343 -1.000000 +66344 -1.000000 +66345 -1.000000 +66346 -1.000000 +66347 -1.000000 +66348 -1.000000 +66349 -1.000000 +66350 -1.000000 +66351 -1.000000 +66352 -1.000000 +66353 -1.000000 +66354 -1.000000 +66355 -1.000000 +66356 -1.000000 +66357 -1.000000 +66358 -1.000000 +66359 -1.000000 +66360 -1.000000 +66361 -1.000000 +66362 -1.000000 +66363 -1.000000 +66364 -1.000000 +66365 -1.000000 +66366 -1.000000 +66367 -1.000000 +66368 -1.000000 +66369 -1.000000 +66370 -1.000000 +66371 -1.000000 +66372 -1.000000 +66373 -1.000000 +66374 -1.000000 +66375 -1.000000 +66376 -1.000000 +66377 -1.000000 +66378 -1.000000 +66379 -1.000000 +66380 -1.000000 +66381 -1.000000 +66382 -1.000000 +66383 -1.000000 +66384 -1.000000 +66385 -1.000000 +66386 -1.000000 +66387 -1.000000 +66388 -1.000000 +66389 -1.000000 +66390 -1.000000 +66391 -1.000000 +66392 -1.000000 +66393 -1.000000 +66394 -1.000000 +66395 -1.000000 +66396 -1.000000 +66397 -1.000000 +66398 -1.000000 +66399 -1.000000 +66400 -1.000000 +66401 -1.000000 +66402 -1.000000 +66403 -1.000000 +66404 -1.000000 +66405 -1.000000 +66406 -1.000000 +66407 -1.000000 +66408 -1.000000 +66409 -1.000000 +66410 -1.000000 +66411 -1.000000 +66412 -1.000000 +66413 -1.000000 +66414 -1.000000 +66415 -1.000000 +66416 -1.000000 +66417 -1.000000 +66418 -1.000000 +66419 -1.000000 +66420 -1.000000 +66421 -1.000000 +66422 -1.000000 +66423 -1.000000 +66424 -1.000000 +66425 -1.000000 +66426 -1.000000 +66427 -1.000000 +66428 -1.000000 +66429 -1.000000 +66430 -1.000000 +66431 -1.000000 +66432 -1.000000 +66434 -1.000000 +66435 -1.000000 +66436 -1.000000 +66437 -1.000000 +66438 -1.000000 +66439 -1.000000 +66440 -1.000000 +66441 -1.000000 +66442 -1.000000 +66443 -1.000000 +66444 -1.000000 +66445 -1.000000 +66446 -1.000000 +66447 -1.000000 +66448 -1.000000 +66449 -1.000000 +66450 -1.000000 +66451 -1.000000 +66452 -1.000000 +66453 -1.000000 +66454 -1.000000 +66455 -1.000000 +66456 -1.000000 +66457 -1.000000 +66458 -1.000000 +66459 -1.000000 +66460 -1.000000 +66461 -1.000000 +66462 -1.000000 +66463 -1.000000 +66464 -1.000000 +66465 -1.000000 +66466 -1.000000 +66467 -1.000000 +66468 -1.000000 +66469 -1.000000 +66470 -1.000000 +66471 -1.000000 +66472 -1.000000 +66473 -1.000000 +66474 -1.000000 +66475 -1.000000 +66476 -1.000000 +66477 -1.000000 +66478 -1.000000 +66479 -1.000000 +66480 -1.000000 +66481 -1.000000 +66482 -1.000000 +66483 -1.000000 +66484 -1.000000 +66485 -1.000000 +66486 -1.000000 +66487 -1.000000 +66488 -1.000000 +66489 -1.000000 +66490 -1.000000 +66491 -1.000000 +66492 -1.000000 +66493 -1.000000 +66494 -1.000000 +66495 -1.000000 +66496 -1.000000 +66497 -1.000000 +66498 -1.000000 +66499 -1.000000 +66500 -1.000000 +66501 -1.000000 +66502 -1.000000 +66503 -1.000000 +66504 -1.000000 +66505 -1.000000 +66506 -1.000000 +66507 -1.000000 +66508 -1.000000 +66509 -1.000000 +66510 -1.000000 +66511 -1.000000 +66513 -1.000000 +66514 -1.000000 +66515 -1.000000 +66516 -1.000000 +66518 -1.000000 +66519 -1.000000 +66520 -1.000000 +66523 -1.000000 +66524 -1.000000 +66525 -1.000000 +66526 -1.000000 +66527 -1.000000 +66528 -1.000000 +66529 -1.000000 +66530 -1.000000 +66531 -1.000000 +66532 -1.000000 +66533 -1.000000 +66534 -1.000000 +66535 -1.000000 +66536 -1.000000 +66537 -1.000000 +66538 -1.000000 +66539 -1.000000 +66540 -1.000000 +66541 -1.000000 +66542 -1.000000 +66543 -1.000000 +66544 -1.000000 +66545 -1.000000 +66546 -1.000000 +66547 -1.000000 +66548 -1.000000 +66549 -1.000000 +66550 -1.000000 +66551 -1.000000 +66552 -1.000000 +66553 -1.000000 +66554 -1.000000 +66555 -1.000000 +66556 -1.000000 +66557 -1.000000 +66558 -1.000000 +66559 -1.000000 +66560 -1.000000 +66561 -1.000000 +66562 -1.000000 +66563 -1.000000 +66564 -1.000000 +66565 -1.000000 +66566 -1.000000 +66567 -1.000000 +66568 -1.000000 +66569 -1.000000 +66570 -1.000000 +66571 -1.000000 +66572 -1.000000 +66573 -1.000000 +66574 -1.000000 +66575 -1.000000 +66576 -1.000000 +66577 -1.000000 +66578 -1.000000 +66579 -1.000000 +66580 -1.000000 +66581 -1.000000 +66582 -1.000000 +66583 -1.000000 +66584 -1.000000 +66585 -1.000000 +66586 -1.000000 +66588 -1.000000 +66589 -1.000000 +66590 -1.000000 +66591 -1.000000 +66592 -1.000000 +66593 -1.000000 +66594 -1.000000 +66595 -1.000000 +66596 -1.000000 +66597 -1.000000 +66598 -1.000000 +66599 -1.000000 +66600 -1.000000 +66601 -1.000000 +66602 -1.000000 +66603 -1.000000 +66604 -1.000000 +66605 -1.000000 +66606 -1.000000 +66607 -1.000000 +66608 -1.000000 +66609 -1.000000 +66610 -1.000000 +66611 -1.000000 +66612 -1.000000 +66613 -1.000000 +66614 -1.000000 +66615 -1.000000 +66616 -1.000000 +66617 -1.000000 +66618 -1.000000 +66619 -1.000000 +66620 -1.000000 +66621 -1.000000 +66622 -1.000000 +66623 -1.000000 +66624 -1.000000 +66625 -1.000000 +66626 -1.000000 +66627 -1.000000 +66628 -1.000000 +66629 -1.000000 +66630 -1.000000 +66631 -1.000000 +66632 -1.000000 +66633 -1.000000 +66634 -1.000000 +66635 -1.000000 +66636 -1.000000 +66637 -1.000000 +66638 -1.000000 +66639 -1.000000 +66640 -1.000000 +66641 -1.000000 +66642 -1.000000 +66643 -1.000000 +66644 -1.000000 +66645 -1.000000 +66646 -1.000000 +66647 -1.000000 +66648 -1.000000 +66649 -1.000000 +66650 -1.000000 +66651 -1.000000 +66652 -1.000000 +66653 -1.000000 +66654 -1.000000 +66655 -1.000000 +66656 -1.000000 +66657 -1.000000 +66658 -1.000000 +66659 -1.000000 +66660 -1.000000 +66661 -1.000000 +66662 -1.000000 +66663 -1.000000 +66664 -1.000000 +66665 -1.000000 +66666 -1.000000 +66667 -1.000000 +66668 -1.000000 +66669 -1.000000 +66670 -1.000000 +66671 -1.000000 +66672 -1.000000 +66673 -1.000000 +66674 -1.000000 +66676 -1.000000 +66677 -1.000000 +66678 -1.000000 +66679 -1.000000 +66680 -1.000000 +66681 -1.000000 +66682 -1.000000 +66683 -1.000000 +66684 -1.000000 +66685 -1.000000 +66686 -1.000000 +66687 -1.000000 +66688 -1.000000 +66689 -1.000000 +66690 -1.000000 +66691 -1.000000 +66692 -1.000000 +66693 -1.000000 +66694 -1.000000 +66696 -1.000000 +66697 -1.000000 +66698 -1.000000 +66699 -1.000000 +66700 -1.000000 +66701 -1.000000 +66702 -1.000000 +66703 -1.000000 +66704 -1.000000 +66705 -1.000000 +66706 -1.000000 +66707 -1.000000 +66708 -1.000000 +66709 -1.000000 +66710 -1.000000 +66711 -1.000000 +66712 -1.000000 +66713 -1.000000 +66714 -1.000000 +66715 -1.000000 +66716 -1.000000 +66717 -1.000000 +66718 -1.000000 +66719 -1.000000 +66720 -1.000000 +66721 -1.000000 +66722 -1.000000 +66723 -1.000000 +66724 -1.000000 +66725 -1.000000 +66726 -1.000000 +66727 -1.000000 +66728 -1.000000 +66729 -1.000000 +66730 -1.000000 +66731 -1.000000 +66732 -1.000000 +66733 -1.000000 +66734 -1.000000 +66735 -1.000000 +66736 -1.000000 +66737 -1.000000 +66738 -1.000000 +66739 -1.000000 +66740 -1.000000 +66741 -1.000000 +66742 -1.000000 +66743 -1.000000 +66744 -1.000000 +66745 -1.000000 +66746 -1.000000 +66747 -1.000000 +66748 -1.000000 +66749 -1.000000 +66750 -1.000000 +66751 -1.000000 +66752 -1.000000 +66753 -1.000000 +66754 -1.000000 +66755 -1.000000 +66756 -1.000000 +66757 -1.000000 +66758 -1.000000 +66759 -1.000000 +66760 -1.000000 +66761 -1.000000 +66762 -1.000000 +66763 -1.000000 +66764 -1.000000 +66765 -1.000000 +66766 -1.000000 +66767 -1.000000 +66768 -1.000000 +66769 -1.000000 +66770 -1.000000 +66771 -1.000000 +66772 -1.000000 +66773 -1.000000 +66774 -1.000000 +66775 -1.000000 +66776 -1.000000 +66777 -1.000000 +66778 -1.000000 +66779 -1.000000 +66780 -1.000000 +66781 -1.000000 +66782 -1.000000 +66783 -1.000000 +66784 -1.000000 +66785 -1.000000 +66786 -1.000000 +66787 -1.000000 +66788 -1.000000 +66789 -1.000000 +66790 -1.000000 +66791 -1.000000 +66792 -1.000000 +66793 -1.000000 +66794 -1.000000 +66795 -1.000000 +66796 -1.000000 +66797 -1.000000 +66798 -1.000000 +66799 -1.000000 +66800 -1.000000 +66801 -1.000000 +66802 -1.000000 +66803 -1.000000 +66804 -1.000000 +66805 -1.000000 +66806 -1.000000 +66807 -1.000000 +66808 -1.000000 +66809 -1.000000 +66810 -1.000000 +66811 -1.000000 +66812 -1.000000 +66813 -1.000000 +66814 -1.000000 +66815 -1.000000 +66816 -1.000000 +66817 -1.000000 +66818 -1.000000 +66819 -1.000000 +66820 -1.000000 +66821 -1.000000 +66822 -1.000000 +66823 -1.000000 +66824 -1.000000 +66825 -1.000000 +66826 -1.000000 +66827 -1.000000 +66828 -1.000000 +66829 -1.000000 +66830 -1.000000 +66831 -1.000000 +66832 -1.000000 +66833 -1.000000 +66834 -1.000000 +66835 -1.000000 +66836 -1.000000 +66837 -1.000000 +66838 -1.000000 +66839 -1.000000 +66840 -1.000000 +66841 -1.000000 +66842 -1.000000 +66843 -1.000000 +66844 -1.000000 +66845 -1.000000 +66846 -1.000000 +66847 -1.000000 +66848 -1.000000 +66849 -1.000000 +66850 -1.000000 +66851 -1.000000 +66852 -1.000000 +66853 -1.000000 +66854 -1.000000 +66855 -1.000000 +66856 -1.000000 +66857 -1.000000 +66858 -1.000000 +66859 -1.000000 +66860 -1.000000 +66861 -1.000000 +66862 -1.000000 +66863 -1.000000 +66864 -1.000000 +66865 -1.000000 +66866 -1.000000 +66867 -1.000000 +66868 -1.000000 +66869 -1.000000 +66871 -1.000000 +66872 -1.000000 +66873 -1.000000 +66874 -1.000000 +66875 -1.000000 +66876 -1.000000 +66877 -1.000000 +66878 -1.000000 +66879 -1.000000 +66880 -1.000000 +66881 -1.000000 +66882 -1.000000 +66883 -1.000000 +66884 -1.000000 +66885 -1.000000 +66886 -1.000000 +66887 -1.000000 +66888 -1.000000 +66889 -1.000000 +66890 -1.000000 +66891 -1.000000 +66892 -1.000000 +66893 -1.000000 +66894 -1.000000 +66895 -1.000000 +66896 -1.000000 +66897 -1.000000 +66898 -1.000000 +66899 -1.000000 +66900 -1.000000 +66901 -1.000000 +66902 -1.000000 +66903 -1.000000 +66904 -1.000000 +66905 -1.000000 +66906 -1.000000 +66907 -1.000000 +66908 -1.000000 +66909 -1.000000 +66910 -1.000000 +66911 -1.000000 +66912 -1.000000 +66913 -1.000000 +66914 -1.000000 +66915 -1.000000 +66916 -1.000000 +66917 -1.000000 +66918 -1.000000 +66919 -1.000000 +66920 -1.000000 +66921 -1.000000 +66922 -1.000000 +66923 -1.000000 +66925 -1.000000 +66926 -1.000000 +66927 -1.000000 +66928 -1.000000 +66929 -1.000000 +66930 -1.000000 +66931 -1.000000 +66932 -1.000000 +66933 -1.000000 +66934 -1.000000 +66935 -1.000000 +66936 -1.000000 +66937 -1.000000 +66938 -1.000000 +66939 -1.000000 +66940 -1.000000 +66941 -1.000000 +66942 -1.000000 +66943 -1.000000 +66944 -1.000000 +66945 -1.000000 +66946 -1.000000 +66947 -1.000000 +66948 -1.000000 +66949 -1.000000 +66950 -1.000000 +66951 -1.000000 +66952 -1.000000 +66953 -1.000000 +66954 -1.000000 +66955 -1.000000 +66956 -1.000000 +66957 -1.000000 +66958 -1.000000 +66959 -1.000000 +66960 -1.000000 +66961 -1.000000 +66962 -1.000000 +66963 -1.000000 +66964 -1.000000 +66965 -1.000000 +66966 -1.000000 +66967 -1.000000 +66968 -1.000000 +66969 -1.000000 +66970 -1.000000 +66971 -1.000000 +66972 -1.000000 +66973 -1.000000 +66974 -1.000000 +66975 -1.000000 +66976 -1.000000 +66977 -1.000000 +66978 -1.000000 +66979 -1.000000 +66980 -1.000000 +66981 -1.000000 +66982 -1.000000 +66983 -1.000000 +66984 -1.000000 +66985 -1.000000 +66986 -1.000000 +66988 -1.000000 +66989 -1.000000 +66990 -1.000000 +66991 -1.000000 +66992 -1.000000 +66993 -1.000000 +66994 -1.000000 +66995 -1.000000 +66996 -1.000000 +66997 -1.000000 +66998 -1.000000 +66999 -1.000000 +67000 -1.000000 +67001 -1.000000 +67002 -1.000000 +67003 -1.000000 +67004 -1.000000 +67005 -1.000000 +67006 -1.000000 +67007 -1.000000 +67008 -1.000000 +67009 -1.000000 +67010 -1.000000 +67011 -1.000000 +67012 -1.000000 +67013 -1.000000 +67014 -1.000000 +67015 -1.000000 +67016 -1.000000 +67017 -1.000000 +67018 -1.000000 +67019 -1.000000 +67020 -1.000000 +67021 -1.000000 +67022 -1.000000 +67023 -1.000000 +67024 -1.000000 +67025 -1.000000 +67026 -1.000000 +67027 -1.000000 +67028 -1.000000 +67029 -1.000000 +67030 -1.000000 +67031 -1.000000 +67032 -1.000000 +67033 -1.000000 +67034 -1.000000 +67035 -1.000000 +67036 -1.000000 +67037 -1.000000 +67038 -1.000000 +67039 -1.000000 +67040 -1.000000 +67041 -1.000000 +67042 -1.000000 +67043 -1.000000 +67044 -1.000000 +67045 -1.000000 +67046 -1.000000 +67047 -1.000000 +67048 -1.000000 +67049 -1.000000 +67050 -1.000000 +67051 -1.000000 +67052 -1.000000 +67053 -1.000000 +67054 -1.000000 +67055 -1.000000 +67056 -1.000000 +67057 -1.000000 +67058 -1.000000 +67059 -1.000000 +67060 -1.000000 +67061 -1.000000 +67062 -1.000000 +67063 -1.000000 +67064 -1.000000 +67065 -1.000000 +67066 -1.000000 +67067 -1.000000 +67068 -1.000000 +67069 -1.000000 +67070 -1.000000 +67071 -1.000000 +67072 -1.000000 +67073 -1.000000 +67074 -1.000000 +67075 -1.000000 +67076 -1.000000 +67077 -1.000000 +67078 -1.000000 +67079 -1.000000 +67080 -1.000000 +67081 -1.000000 +67082 -1.000000 +67083 -1.000000 +67084 -1.000000 +67085 -1.000000 +67086 -1.000000 +67087 -1.000000 +67088 -1.000000 +67089 -1.000000 +67090 -1.000000 +67091 -1.000000 +67092 -1.000000 +67093 -1.000000 +67094 -1.000000 +67095 -1.000000 +67096 -1.000000 +67097 -1.000000 +67098 -1.000000 +67099 -1.000000 +67100 -1.000000 +67101 -1.000000 +67102 -1.000000 +67103 -1.000000 +67104 -1.000000 +67105 -1.000000 +67106 -1.000000 +67107 -1.000000 +67108 -1.000000 +67109 -1.000000 +67110 -1.000000 +67111 -1.000000 +67112 -1.000000 +67113 -1.000000 +67114 -1.000000 +67115 -1.000000 +67116 -1.000000 +67117 -1.000000 +67118 -1.000000 +67119 -1.000000 +67120 -1.000000 +67121 -1.000000 +67122 -1.000000 +67123 -1.000000 +67124 -1.000000 +67125 -1.000000 +67126 -1.000000 +67127 -1.000000 +67128 -1.000000 +67129 -1.000000 +67130 -1.000000 +67131 -1.000000 +67132 -1.000000 +67133 -1.000000 +67134 -1.000000 +67135 -1.000000 +67136 -1.000000 +67137 -1.000000 +67138 -1.000000 +67139 -1.000000 +67140 -1.000000 +67141 -1.000000 +67142 -1.000000 +67143 -1.000000 +67144 -1.000000 +67145 -1.000000 +67146 -1.000000 +67147 -1.000000 +67148 -1.000000 +67149 -1.000000 +67152 -1.000000 +67153 -1.000000 +67154 -1.000000 +67155 -1.000000 +67156 -1.000000 +67157 -1.000000 +67158 -1.000000 +67159 -1.000000 +67160 -1.000000 +67161 -1.000000 +67162 -1.000000 +67163 -1.000000 +67164 -1.000000 +67166 -1.000000 +67167 -1.000000 +67168 -1.000000 +67169 -1.000000 +67170 -1.000000 +67171 -1.000000 +67173 -1.000000 +67175 -1.000000 +67176 -1.000000 +67177 -1.000000 +67178 -1.000000 +67179 -1.000000 +67180 -1.000000 +67181 -1.000000 +67182 -1.000000 +67183 -1.000000 +67184 -1.000000 +67185 -1.000000 +67186 -1.000000 +67187 -1.000000 +67188 -1.000000 +67189 -1.000000 +67190 -1.000000 +67191 -1.000000 +67192 -1.000000 +67193 -1.000000 +67194 -1.000000 +67195 -1.000000 +67196 -1.000000 +67197 -1.000000 +67198 -1.000000 +67199 -1.000000 +67200 -1.000000 +67201 -1.000000 +67202 -1.000000 +67203 -1.000000 +67204 -1.000000 +67205 -1.000000 +67206 -1.000000 +67207 -1.000000 +67208 -1.000000 +67209 -1.000000 +67210 -1.000000 +67211 -1.000000 +67212 -1.000000 +67213 -1.000000 +67214 -1.000000 +67215 -1.000000 +67216 -1.000000 +67217 -1.000000 +67218 -1.000000 +67219 -1.000000 +67220 -1.000000 +67221 -1.000000 +67222 -1.000000 +67223 -1.000000 +67224 -1.000000 +67225 -1.000000 +67226 -1.000000 +67227 -1.000000 +67228 -1.000000 +67229 -1.000000 +67230 -1.000000 +67231 -1.000000 +67232 -1.000000 +67233 -1.000000 +67234 -1.000000 +67235 -1.000000 +67236 -1.000000 +67237 -1.000000 +67238 -1.000000 +67239 -1.000000 +67240 -1.000000 +67241 -1.000000 +67242 -1.000000 +67243 -1.000000 +67244 -1.000000 +67245 -1.000000 +67246 -1.000000 +67247 -1.000000 +67248 -1.000000 +67249 -1.000000 +67250 -1.000000 +67251 -1.000000 +67252 -1.000000 +67253 -1.000000 +67254 -1.000000 +67255 -1.000000 +67256 -1.000000 +67257 -1.000000 +67258 -1.000000 +67259 -1.000000 +67260 -1.000000 +67261 -1.000000 +67262 -1.000000 +67263 -1.000000 +67264 -1.000000 +67265 -1.000000 +67266 -1.000000 +67267 -1.000000 +67268 -1.000000 +67269 -1.000000 +67270 -1.000000 +67271 -1.000000 +67272 -1.000000 +67273 -1.000000 +67274 -1.000000 +67275 -1.000000 +67276 -1.000000 +67277 -1.000000 +67278 -1.000000 +67279 -1.000000 +67280 -1.000000 +67281 -1.000000 +67282 -1.000000 +67283 -1.000000 +67284 -1.000000 +67285 -1.000000 +67286 -1.000000 +67287 -1.000000 +67288 -1.000000 +67289 -1.000000 +67290 -1.000000 +67291 -1.000000 +67292 -1.000000 +67293 -1.000000 +67294 -1.000000 +67295 -1.000000 +67296 -1.000000 +67297 -1.000000 +67298 -1.000000 +67299 -1.000000 +67300 -1.000000 +67301 -1.000000 +67302 -1.000000 +67303 -1.000000 +67304 -1.000000 +67305 -1.000000 +67306 -1.000000 +67307 -1.000000 +67308 -1.000000 +67309 -1.000000 +67310 -1.000000 +67311 -1.000000 +67312 -1.000000 +67313 -1.000000 +67314 -1.000000 +67315 -1.000000 +67316 -1.000000 +67317 -1.000000 +67318 -1.000000 +67319 -1.000000 +67320 -1.000000 +67321 -1.000000 +67322 -1.000000 +67323 -1.000000 +67324 -1.000000 +67325 -1.000000 +67326 -1.000000 +67327 -1.000000 +67328 -1.000000 +67329 -1.000000 +67330 -1.000000 +67331 -1.000000 +67332 -1.000000 +67333 -1.000000 +67334 -1.000000 +67335 -1.000000 +67336 -1.000000 +67337 -1.000000 +67338 -1.000000 +67339 -1.000000 +67340 -1.000000 +67341 -1.000000 +67342 -1.000000 +67343 -1.000000 +67344 -1.000000 +67345 -1.000000 +67346 -1.000000 +67347 -1.000000 +67348 -1.000000 +67349 -1.000000 +67350 -1.000000 +67351 -1.000000 +67352 -1.000000 +67353 -1.000000 +67354 -1.000000 +67355 -1.000000 +67356 -1.000000 +67357 -1.000000 +67358 -1.000000 +67359 -1.000000 +67360 -1.000000 +67361 -1.000000 +67362 -1.000000 +67363 -1.000000 +67364 -1.000000 +67365 -1.000000 +67366 -1.000000 +67367 -1.000000 +67368 -1.000000 +67369 -1.000000 +67370 -1.000000 +67371 -1.000000 +67372 -1.000000 +67373 -1.000000 +67374 -1.000000 +67375 -1.000000 +67376 -1.000000 +67377 -1.000000 +67378 -1.000000 +67379 -1.000000 +67380 -1.000000 +67381 -1.000000 +67382 -1.000000 +67383 -1.000000 +67384 -1.000000 +67385 -1.000000 +67386 -1.000000 +67387 -1.000000 +67388 -1.000000 +67389 -1.000000 +67390 -1.000000 +67391 -1.000000 +67392 -1.000000 +67393 -1.000000 +67394 -1.000000 +67395 -1.000000 +67396 -1.000000 +67397 -1.000000 +67398 -1.000000 +67399 -1.000000 +67400 -1.000000 +67401 -1.000000 +67402 -1.000000 +67403 -1.000000 +67404 -1.000000 +67405 -1.000000 +67406 -1.000000 +67407 -1.000000 +67408 -1.000000 +67409 -1.000000 +67410 -1.000000 +67411 -1.000000 +67412 -1.000000 +67413 -1.000000 +67414 -1.000000 +67415 -1.000000 +67416 -1.000000 +67417 -1.000000 +67418 -1.000000 +67419 -1.000000 +67420 -1.000000 +67421 -1.000000 +67422 -1.000000 +67423 -1.000000 +67424 -1.000000 +67425 -1.000000 +67426 -1.000000 +67427 -1.000000 +67428 -1.000000 +67429 -1.000000 +67430 -1.000000 +67431 -1.000000 +67432 -1.000000 +67433 -1.000000 +67434 -1.000000 +67435 -1.000000 +67436 -1.000000 +67437 -1.000000 +67438 -1.000000 +67439 -1.000000 +67440 -1.000000 +67441 -1.000000 +67442 -1.000000 +67443 -1.000000 +67444 -1.000000 +67445 -1.000000 +67446 -1.000000 +67447 -1.000000 +67448 -1.000000 +67449 -1.000000 +67450 -1.000000 +67451 -1.000000 +67452 -1.000000 +67453 -1.000000 +67454 -1.000000 +67455 -1.000000 +67456 -1.000000 +67457 -1.000000 +67458 -1.000000 +67459 -1.000000 +67460 -1.000000 +67461 -1.000000 +67462 -1.000000 +67463 -1.000000 +67464 -1.000000 +67465 -1.000000 +67466 -1.000000 +67467 -1.000000 +67468 -1.000000 +67469 -1.000000 +67470 -1.000000 +67471 -1.000000 +67472 -1.000000 +67473 -1.000000 +67474 -1.000000 +67475 -1.000000 +67476 -1.000000 +67477 -1.000000 +67478 -1.000000 +67479 -1.000000 +67480 -1.000000 +67481 -1.000000 +67482 -1.000000 +67483 -1.000000 +67484 -1.000000 +67485 -1.000000 +67486 -1.000000 +67487 -1.000000 +67488 -1.000000 +67489 -1.000000 +67490 -1.000000 +67491 -1.000000 +67492 -1.000000 +67493 -1.000000 +67494 -1.000000 +67495 -1.000000 +67496 -1.000000 +67497 -1.000000 +67498 -1.000000 +67499 -1.000000 +67501 -1.000000 +67502 -1.000000 +67503 -1.000000 +67504 -1.000000 +67505 -1.000000 +67506 -1.000000 +67507 -1.000000 +67508 -1.000000 +67509 -1.000000 +67510 -1.000000 +67511 -1.000000 +67512 -1.000000 +67513 -1.000000 +67514 -1.000000 +67515 -1.000000 +67516 -1.000000 +67517 -1.000000 +67518 -1.000000 +67519 -1.000000 +67520 -1.000000 +67521 -1.000000 +67522 -1.000000 +67523 -1.000000 +67524 -1.000000 +67525 -1.000000 +67526 -1.000000 +67527 -1.000000 +67528 -1.000000 +67529 -1.000000 +67530 -1.000000 +67531 -1.000000 +67532 -1.000000 +67533 -1.000000 +67534 -1.000000 +67535 -1.000000 +67536 -1.000000 +67537 -1.000000 +67538 -1.000000 +67539 -1.000000 +67540 -1.000000 +67541 -1.000000 +67542 -1.000000 +67543 -1.000000 +67544 -1.000000 +67545 -1.000000 +67546 -1.000000 +67547 -1.000000 +67548 -1.000000 +67549 -1.000000 +67550 -1.000000 +67551 -1.000000 +67552 -1.000000 +67553 -1.000000 +67554 -1.000000 +67555 -1.000000 +67556 -1.000000 +67557 -1.000000 +67558 -1.000000 +67559 -1.000000 +67560 -1.000000 +67561 -1.000000 +67562 -1.000000 +67563 -1.000000 +67564 -1.000000 +67565 -1.000000 +67566 -1.000000 +67567 -1.000000 +67568 -1.000000 +67569 -1.000000 +67570 -1.000000 +67571 -1.000000 +67572 -1.000000 +67573 -1.000000 +67574 -1.000000 +67575 -1.000000 +67576 -1.000000 +67577 -1.000000 +67578 -1.000000 +67579 -1.000000 +67580 -1.000000 +67581 -1.000000 +67582 -1.000000 +67583 -1.000000 +67584 -1.000000 +67585 -1.000000 +67586 -1.000000 +67587 -1.000000 +67588 -1.000000 +67589 -1.000000 +67590 -1.000000 +67591 -1.000000 +67592 -1.000000 +67593 -1.000000 +67594 -1.000000 +67595 -1.000000 +67596 -1.000000 +67597 -1.000000 +67598 -1.000000 +67599 -1.000000 +67600 -1.000000 +67601 -1.000000 +67602 -1.000000 +67603 -1.000000 +67604 -1.000000 +67605 -1.000000 +67606 -1.000000 +67607 -1.000000 +67608 -1.000000 +67609 -1.000000 +67610 -1.000000 +67611 -1.000000 +67612 -1.000000 +67613 -1.000000 +67614 -1.000000 +67615 -1.000000 +67616 -1.000000 +67617 -1.000000 +67618 -1.000000 +67619 -1.000000 +67620 -1.000000 +67621 -1.000000 +67622 -1.000000 +67623 -1.000000 +67624 -1.000000 +67625 -1.000000 +67626 -1.000000 +67627 -1.000000 +67628 -1.000000 +67629 -1.000000 +67631 -1.000000 +67632 -1.000000 +67633 -1.000000 +67634 -1.000000 +67635 -1.000000 +67637 -1.000000 +67638 -1.000000 +67639 -1.000000 +67640 -1.000000 +67641 -1.000000 +67642 -1.000000 +67643 -1.000000 +67644 -1.000000 +67645 -1.000000 +67646 -1.000000 +67647 -1.000000 +67648 -1.000000 +67649 -1.000000 +67650 -1.000000 +67651 -1.000000 +67652 -1.000000 +67653 -1.000000 +67654 -1.000000 +67655 -1.000000 +67656 -1.000000 +67657 -1.000000 +67658 -1.000000 +67659 -1.000000 +67660 -1.000000 +67661 -1.000000 +67662 -1.000000 +67663 -1.000000 +67664 -1.000000 +67665 -1.000000 +67666 -1.000000 +67667 -1.000000 +67668 -1.000000 +67669 -1.000000 +67670 -1.000000 +67671 -1.000000 +67672 -1.000000 +67673 -1.000000 +67674 -1.000000 +67675 -1.000000 +67676 -1.000000 +67677 -1.000000 +67678 -1.000000 +67679 -1.000000 +67680 -1.000000 +67681 -1.000000 +67682 -1.000000 +67683 -1.000000 +67684 -1.000000 +67685 -1.000000 +67686 -1.000000 +67687 -1.000000 +67688 -1.000000 +67689 -1.000000 +67690 -1.000000 +67691 -1.000000 +67692 -1.000000 +67693 -1.000000 +67694 -1.000000 +67695 -1.000000 +67696 -1.000000 +67697 -1.000000 +67698 -1.000000 +67699 -1.000000 +67700 -1.000000 +67701 -1.000000 +67702 -1.000000 +67703 -1.000000 +67704 -1.000000 +67705 -1.000000 +67706 -1.000000 +67707 -1.000000 +67708 -1.000000 +67709 -1.000000 +67710 -1.000000 +67711 -1.000000 +67712 -1.000000 +67713 -1.000000 +67714 -1.000000 +67715 -1.000000 +67716 -1.000000 +67717 -1.000000 +67718 -1.000000 +67719 -1.000000 +67720 -1.000000 +67721 -1.000000 +67722 -1.000000 +67723 -1.000000 +67724 -1.000000 +67725 -1.000000 +67726 -1.000000 +67727 -1.000000 +67729 -1.000000 +67730 -1.000000 +67731 -1.000000 +67732 -1.000000 +67733 -1.000000 +67734 -1.000000 +67735 -1.000000 +67736 -1.000000 +67737 -1.000000 +67738 -1.000000 +67739 -1.000000 +67740 -1.000000 +67741 -1.000000 +67742 -1.000000 +67743 -1.000000 +67744 -1.000000 +67745 -1.000000 +67746 -1.000000 +67747 -1.000000 +67748 -1.000000 +67749 -1.000000 +67750 -1.000000 +67751 -1.000000 +67752 -1.000000 +67753 -1.000000 +67754 -1.000000 +67756 -1.000000 +67757 -1.000000 +67758 -1.000000 +67759 -1.000000 +67760 -1.000000 +67761 -1.000000 +67762 -1.000000 +67763 -1.000000 +67764 -1.000000 +67765 -1.000000 +67766 -1.000000 +67767 -1.000000 +67768 -1.000000 +67769 -1.000000 +67770 -1.000000 +67771 -1.000000 +67775 -1.000000 +67776 -1.000000 +67777 -1.000000 +67778 -1.000000 +67779 -1.000000 +67780 -1.000000 +67781 -1.000000 +67782 -1.000000 +67783 -1.000000 +67787 -1.000000 +67788 -1.000000 +67789 -1.000000 +67790 -1.000000 +67791 -1.000000 +67792 -1.000000 +67793 -1.000000 +67794 -1.000000 +67795 -1.000000 +67796 -1.000000 +67797 -1.000000 +67798 -1.000000 +67799 -1.000000 +67800 -1.000000 +67801 -1.000000 +67802 -1.000000 +67803 -1.000000 +67804 -1.000000 +67805 -1.000000 +67806 -1.000000 +67807 -1.000000 +67808 -1.000000 +67809 -1.000000 +67810 -1.000000 +67811 -1.000000 +67812 -1.000000 +67813 -1.000000 +67814 -1.000000 +67815 -1.000000 +67816 -1.000000 +67817 -1.000000 +67819 -1.000000 +67820 -1.000000 +67821 -1.000000 +67822 -1.000000 +67823 -1.000000 +67824 -1.000000 +67825 -1.000000 +67826 -1.000000 +67827 -1.000000 +67828 -1.000000 +67829 -1.000000 +67830 -1.000000 +67831 -1.000000 +67832 -1.000000 +67833 -1.000000 +67834 -1.000000 +67835 -1.000000 +67836 -1.000000 +67837 -1.000000 +67838 -1.000000 +67839 -1.000000 +67840 -1.000000 +67841 -1.000000 +67842 -1.000000 +67843 -1.000000 +67844 -1.000000 +67845 -1.000000 +67846 -1.000000 +67847 -1.000000 +67848 -1.000000 +67849 -1.000000 +67850 -1.000000 +67851 -1.000000 +67852 -1.000000 +67853 -1.000000 +67854 -1.000000 +67855 -1.000000 +67856 -1.000000 +67857 -1.000000 +67858 -1.000000 +67859 -1.000000 +67860 -1.000000 +67861 -1.000000 +67862 -1.000000 +67863 -1.000000 +67864 -1.000000 +67865 -1.000000 +67866 -1.000000 +67867 -1.000000 +67868 -1.000000 +67869 -1.000000 +67870 -1.000000 +67871 -1.000000 +67872 -1.000000 +67873 -1.000000 +67874 -1.000000 +67875 -1.000000 +67876 -1.000000 +67877 -1.000000 +67878 -1.000000 +67879 -1.000000 +67880 -1.000000 +67881 -1.000000 +67882 -1.000000 +67883 -1.000000 +67884 -1.000000 +67885 -1.000000 +67886 -1.000000 +67887 -1.000000 +67888 -1.000000 +67889 -1.000000 +67890 -1.000000 +67891 -1.000000 +67892 -1.000000 +67893 -1.000000 +67894 -1.000000 +67895 -1.000000 +67896 -1.000000 +67897 -1.000000 +67898 -1.000000 +67899 -1.000000 +67900 -1.000000 +67901 -1.000000 +67902 -1.000000 +67903 -1.000000 +67904 -1.000000 +67905 -1.000000 +67906 -1.000000 +67907 -1.000000 +67908 -1.000000 +67909 -1.000000 +67910 -1.000000 +67911 -1.000000 +67912 -1.000000 +67913 -1.000000 +67914 -1.000000 +67915 -1.000000 +67916 -1.000000 +67917 -1.000000 +67918 -1.000000 +67919 -1.000000 +67920 -1.000000 +67921 -1.000000 +67922 -1.000000 +67923 -1.000000 +67924 -1.000000 +67925 -1.000000 +67926 -1.000000 +67927 -1.000000 +67928 -1.000000 +67929 -1.000000 +67930 -1.000000 +67931 -1.000000 +67932 -1.000000 +67933 -1.000000 +67934 -1.000000 +67935 -1.000000 +67936 -1.000000 +67937 -1.000000 +67938 -1.000000 +67939 -1.000000 +67940 -1.000000 +67941 -1.000000 +67942 -1.000000 +67943 -1.000000 +67944 -1.000000 +67945 -1.000000 +67946 -1.000000 +67948 -1.000000 +67949 -1.000000 +67950 -1.000000 +67951 -1.000000 +67952 -1.000000 +67953 -1.000000 +67954 -1.000000 +67955 -1.000000 +67956 -1.000000 +67957 -1.000000 +67958 -1.000000 +67959 -1.000000 +67960 -1.000000 +67961 -1.000000 +67962 -1.000000 +67963 -1.000000 +67964 -1.000000 +67965 -1.000000 +67966 -1.000000 +67967 -1.000000 +67968 -1.000000 +67969 -1.000000 +67970 -1.000000 +67971 -1.000000 +67972 -1.000000 +67973 -1.000000 +67974 -1.000000 +67975 -1.000000 +67976 -1.000000 +67977 -1.000000 +67978 -1.000000 +67979 -1.000000 +67980 -1.000000 +67981 -1.000000 +67982 -1.000000 +67983 -1.000000 +67984 -1.000000 +67985 -1.000000 +67986 -1.000000 +67987 -1.000000 +67988 -1.000000 +67989 -1.000000 +67990 -1.000000 +67991 -1.000000 +67992 -1.000000 +67993 -1.000000 +67994 -1.000000 +67995 -1.000000 +67996 -1.000000 +67997 -1.000000 +67998 -1.000000 +67999 -1.000000 +68000 -1.000000 +68001 -1.000000 +68002 -1.000000 +68003 -1.000000 +68004 -1.000000 +68005 -1.000000 +68006 -1.000000 +68007 -1.000000 +68008 -1.000000 +68009 -1.000000 +68010 -1.000000 +68011 -1.000000 +68012 -1.000000 +68013 -1.000000 +68014 -1.000000 +68015 -1.000000 +68016 -1.000000 +68017 -1.000000 +68018 -1.000000 +68019 -1.000000 +68020 -1.000000 +68021 -1.000000 +68022 -1.000000 +68023 -1.000000 +68024 -1.000000 +68025 -1.000000 +68026 -1.000000 +68027 -1.000000 +68028 -1.000000 +68029 -1.000000 +68030 -1.000000 +68031 -1.000000 +68032 -1.000000 +68033 -1.000000 +68034 -1.000000 +68035 -1.000000 +68036 -1.000000 +68037 -1.000000 +68038 -1.000000 +68039 -1.000000 +68040 -1.000000 +68041 -1.000000 +68042 -1.000000 +68043 -1.000000 +68044 -1.000000 +68045 -1.000000 +68046 -1.000000 +68047 -1.000000 +68048 -1.000000 +68049 -1.000000 +68050 -1.000000 +68051 -1.000000 +68052 -1.000000 +68053 -1.000000 +68054 -1.000000 +68056 -1.000000 +68057 -1.000000 +68058 -1.000000 +68059 -1.000000 +68060 -1.000000 +68061 -1.000000 +68062 -1.000000 +68063 -1.000000 +68064 -1.000000 +68065 -1.000000 +68066 -1.000000 +68067 -1.000000 +68068 -1.000000 +68069 -1.000000 +68070 -1.000000 +68071 -1.000000 +68072 -1.000000 +68073 -1.000000 +68074 -1.000000 +68075 -1.000000 +68076 -1.000000 +68077 -1.000000 +68078 -1.000000 +68079 -1.000000 +68080 -1.000000 +68081 -1.000000 +68082 -1.000000 +68083 -1.000000 +68084 -1.000000 +68085 -1.000000 +68086 -1.000000 +68087 -1.000000 +68088 -1.000000 +68089 -1.000000 +68090 -1.000000 +68091 -1.000000 +68092 -1.000000 +68093 -1.000000 +68094 -1.000000 +68095 -1.000000 +68096 -1.000000 +68097 -1.000000 +68098 -1.000000 +68099 -1.000000 +68100 -1.000000 +68101 -1.000000 +68102 -1.000000 +68103 -1.000000 +68104 -1.000000 +68105 -1.000000 +68106 -1.000000 +68107 -1.000000 +68108 -1.000000 +68109 -1.000000 +68110 -1.000000 +68111 -1.000000 +68112 -1.000000 +68113 -1.000000 +68114 -1.000000 +68115 -1.000000 +68116 -1.000000 +68117 -1.000000 +68118 -1.000000 +68119 -1.000000 +68120 -1.000000 +68121 -1.000000 +68122 -1.000000 +68123 -1.000000 +68124 -1.000000 +68125 -1.000000 +68126 -1.000000 +68127 -1.000000 +68128 -1.000000 +68129 -1.000000 +68130 -1.000000 +68131 -1.000000 +68132 -1.000000 +68133 -1.000000 +68134 -1.000000 +68135 -1.000000 +68136 -1.000000 +68137 -1.000000 +68138 -1.000000 +68139 -1.000000 +68140 -1.000000 +68141 -1.000000 +68142 -1.000000 +68143 -1.000000 +68144 -1.000000 +68145 -1.000000 +68146 -1.000000 +68147 -1.000000 +68148 -1.000000 +68149 -1.000000 +68150 -1.000000 +68151 -1.000000 +68152 -1.000000 +68153 -1.000000 +68154 -1.000000 +68155 -1.000000 +68156 -1.000000 +68157 -1.000000 +68158 -1.000000 +68159 -1.000000 +68160 -1.000000 +68161 -1.000000 +68162 -1.000000 +68166 -1.000000 +68167 -1.000000 +68168 -1.000000 +68170 -1.000000 +68171 -1.000000 +68172 -1.000000 +68173 -1.000000 +68174 -1.000000 +68175 -1.000000 +68176 -1.000000 +68177 -1.000000 +68178 -1.000000 +68179 -1.000000 +68180 -1.000000 +68181 -1.000000 +68182 -1.000000 +68183 -1.000000 +68184 -1.000000 +68185 -1.000000 +68186 -1.000000 +68187 -1.000000 +68188 -1.000000 +68189 -1.000000 +68190 -1.000000 +68191 -1.000000 +68192 -1.000000 +68193 -1.000000 +68194 -1.000000 +68195 -1.000000 +68196 -1.000000 +68197 -1.000000 +68204 -1.000000 +68205 -1.000000 +68206 -1.000000 +68207 -1.000000 +68208 -1.000000 +68209 -1.000000 +68210 -1.000000 +68211 -1.000000 +68212 -1.000000 +68213 -1.000000 +68214 -1.000000 +68215 -1.000000 +68216 -1.000000 +68217 -1.000000 +68218 -1.000000 +68219 -1.000000 +68220 -1.000000 +68221 -1.000000 +68222 -1.000000 +68223 -1.000000 +68224 -1.000000 +68225 -1.000000 +68226 -1.000000 +68227 -1.000000 +68228 -1.000000 +68229 -1.000000 +68230 -1.000000 +68231 -1.000000 +68232 -1.000000 +68233 -1.000000 +68234 -1.000000 +68235 -1.000000 +68236 -1.000000 +68237 -1.000000 +68238 -1.000000 +68239 -1.000000 +68240 -1.000000 +68241 -1.000000 +68242 -1.000000 +68243 -1.000000 +68244 -1.000000 +68245 -1.000000 +68246 -1.000000 +68247 -1.000000 +68248 -1.000000 +68249 -1.000000 +68250 -1.000000 +68251 -1.000000 +68252 -1.000000 +68253 -1.000000 +68254 -1.000000 +68255 -1.000000 +68256 -1.000000 +68257 -1.000000 +68258 -1.000000 +68259 -1.000000 +68260 -1.000000 +68261 -1.000000 +68262 -1.000000 +68263 -1.000000 +68264 -1.000000 +68265 -1.000000 +68266 -1.000000 +68267 -1.000000 +68268 -1.000000 +68269 -1.000000 +68270 -1.000000 +68271 -1.000000 +68272 -1.000000 +68273 -1.000000 +68274 -1.000000 +68275 -1.000000 +68276 -1.000000 +68277 -1.000000 +68278 -1.000000 +68279 -1.000000 +68280 -1.000000 +68281 -1.000000 +68282 -1.000000 +68283 -1.000000 +68284 -1.000000 +68285 -1.000000 +68286 -1.000000 +68287 -1.000000 +68288 -1.000000 +68289 -1.000000 +68290 -1.000000 +68291 -1.000000 +68292 -1.000000 +68293 -1.000000 +68294 -1.000000 +68295 -1.000000 +68296 -1.000000 +68297 -1.000000 +68298 -1.000000 +68299 -1.000000 +68300 -1.000000 +68301 -1.000000 +68302 -1.000000 +68303 -1.000000 +68304 -1.000000 +68305 -1.000000 +68306 -1.000000 +68307 -1.000000 +68308 -1.000000 +68309 -1.000000 +68310 -1.000000 +68311 -1.000000 +68312 -1.000000 +68313 -1.000000 +68314 -1.000000 +68315 -1.000000 +68316 -1.000000 +68317 -1.000000 +68318 -1.000000 +68319 -1.000000 +68320 -1.000000 +68321 -1.000000 +68322 -1.000000 +68323 -1.000000 +68324 -1.000000 +68325 -1.000000 +68326 -1.000000 +68327 -1.000000 +68328 -1.000000 +68329 -1.000000 +68330 -1.000000 +68331 -1.000000 +68332 -1.000000 +68333 -1.000000 +68334 -1.000000 +68335 -1.000000 +68336 -1.000000 +68337 -1.000000 +68338 -1.000000 +68339 -1.000000 +68340 -1.000000 +68341 -1.000000 +68342 -1.000000 +68343 -1.000000 +68344 -1.000000 +68345 -1.000000 +68346 -1.000000 +68347 -1.000000 +68348 -1.000000 +68349 -1.000000 +68350 -1.000000 +68351 -1.000000 +68352 -1.000000 +68353 -1.000000 +68354 -1.000000 +68355 -1.000000 +68356 -1.000000 +68357 -1.000000 +68358 -1.000000 +68359 -1.000000 +68360 -1.000000 +68361 -1.000000 +68362 -1.000000 +68363 -1.000000 +68364 -1.000000 +68365 -1.000000 +68366 -1.000000 +68367 -1.000000 +68368 -1.000000 +68369 -1.000000 +68370 -1.000000 +68371 -1.000000 +68372 -1.000000 +68373 -1.000000 +68374 -1.000000 +68375 -1.000000 +68376 -1.000000 +68377 -1.000000 +68378 -1.000000 +68379 -1.000000 +68380 -1.000000 +68381 -1.000000 +68382 -1.000000 +68383 -1.000000 +68384 -1.000000 +68385 -1.000000 +68386 -1.000000 +68387 -1.000000 +68388 -1.000000 +68389 -1.000000 +68390 -1.000000 +68391 -1.000000 +68392 -1.000000 +68393 -1.000000 +68394 -1.000000 +68395 -1.000000 +68396 -1.000000 +68397 -1.000000 +68398 -1.000000 +68399 -1.000000 +68400 -1.000000 +68401 -1.000000 +68402 -1.000000 +68403 -1.000000 +68404 -1.000000 +68405 -1.000000 +68406 -1.000000 +68407 -1.000000 +68408 -1.000000 +68409 -1.000000 +68410 -1.000000 +68411 -1.000000 +68412 -1.000000 +68413 -1.000000 +68414 -1.000000 +68415 -1.000000 +68416 -1.000000 +68417 -1.000000 +68418 -1.000000 +68419 -1.000000 +68420 -1.000000 +68421 -1.000000 +68422 -1.000000 +68423 -1.000000 +68424 -1.000000 +68425 -1.000000 +68426 -1.000000 +68427 -1.000000 +68428 -1.000000 +68429 -1.000000 +68430 -1.000000 +68431 -1.000000 +68432 -1.000000 +68433 -1.000000 +68434 -1.000000 +68435 -1.000000 +68436 -1.000000 +68437 -1.000000 +68438 -1.000000 +68439 -1.000000 +68440 -1.000000 +68441 -1.000000 +68442 -1.000000 +68443 -1.000000 +68444 -1.000000 +68445 -1.000000 +68446 -1.000000 +68447 -1.000000 +68448 -1.000000 +68449 -1.000000 +68450 -1.000000 +68451 -1.000000 +68452 -1.000000 +68453 -1.000000 +68454 -1.000000 +68455 -1.000000 +68456 -1.000000 +68457 -1.000000 +68458 -1.000000 +68459 -1.000000 +68460 -1.000000 +68461 -1.000000 +68462 -1.000000 +68463 -1.000000 +68464 -1.000000 +68465 -1.000000 +68466 -1.000000 +68467 -1.000000 +68468 -1.000000 +68469 -1.000000 +68470 -1.000000 +68471 -1.000000 +68472 -1.000000 +68473 -1.000000 +68474 -1.000000 +68475 -1.000000 +68476 -1.000000 +68477 -1.000000 +68478 -1.000000 +68479 -1.000000 +68480 -1.000000 +68481 -1.000000 +68482 -1.000000 +68483 -1.000000 +68484 -1.000000 +68485 -1.000000 +68486 -1.000000 +68487 -1.000000 +68488 -1.000000 +68489 -1.000000 +68490 -1.000000 +68491 -1.000000 +68492 -1.000000 +68493 -1.000000 +68494 -1.000000 +68495 -1.000000 +68496 -1.000000 +68497 -1.000000 +68498 -1.000000 +68499 -1.000000 +68500 -1.000000 +68501 -1.000000 +68502 -1.000000 +68503 -1.000000 +68504 -1.000000 +68505 -1.000000 +68506 -1.000000 +68507 -1.000000 +68508 -1.000000 +68509 -1.000000 +68510 -1.000000 +68511 -1.000000 +68512 -1.000000 +68513 -1.000000 +68514 -1.000000 +68515 -1.000000 +68516 -1.000000 +68517 -1.000000 +68518 -1.000000 +68519 -1.000000 +68520 -1.000000 +68521 -1.000000 +68522 -1.000000 +68523 -1.000000 +68524 -1.000000 +68525 -1.000000 +68526 -1.000000 +68527 -1.000000 +68528 -1.000000 +68529 -1.000000 +68530 -1.000000 +68531 -1.000000 +68532 -1.000000 +68533 -1.000000 +68534 -1.000000 +68535 -1.000000 +68536 -1.000000 +68537 -1.000000 +68538 -1.000000 +68539 -1.000000 +68540 -1.000000 +68541 -1.000000 +68542 -1.000000 +68543 -1.000000 +68544 -1.000000 +68545 -1.000000 +68546 -1.000000 +68547 -1.000000 +68548 -1.000000 +68549 -1.000000 +68550 -1.000000 +68551 -1.000000 +68552 -1.000000 +68553 -1.000000 +68554 -1.000000 +68555 -1.000000 +68556 -1.000000 +68557 -1.000000 +68558 -1.000000 +68559 -1.000000 +68560 -1.000000 +68561 -1.000000 +68562 -1.000000 +68563 -1.000000 +68564 -1.000000 +68565 -1.000000 +68566 -1.000000 +68567 -1.000000 +68568 -1.000000 +68569 -1.000000 +68570 -1.000000 +68571 -1.000000 +68572 -1.000000 +68573 -1.000000 +68574 -1.000000 +68575 -1.000000 +68576 -1.000000 +68577 -1.000000 +68578 -1.000000 +68579 -1.000000 +68580 -1.000000 +68581 -1.000000 +68582 -1.000000 +68583 -1.000000 +68584 -1.000000 +68585 -1.000000 +68586 -1.000000 +68587 -1.000000 +68588 -1.000000 +68589 -1.000000 +68590 -1.000000 +68591 -1.000000 +68592 -1.000000 +68593 -1.000000 +68594 -1.000000 +68595 -1.000000 +68596 -1.000000 +68597 -1.000000 +68598 -1.000000 +68599 -1.000000 +68600 -1.000000 +68601 -1.000000 +68602 -1.000000 +68603 -1.000000 +68604 -1.000000 +68605 -1.000000 +68606 -1.000000 +68607 -1.000000 +68608 -1.000000 +68609 -1.000000 +68610 -1.000000 +68611 -1.000000 +68612 -1.000000 +68613 -1.000000 +68614 -1.000000 +68615 -1.000000 +68616 -1.000000 +68617 -1.000000 +68618 -1.000000 +68619 -1.000000 +68620 -1.000000 +68621 -1.000000 +68622 -1.000000 +68623 -1.000000 +68624 -1.000000 +68625 -1.000000 +68626 -1.000000 +68627 -1.000000 +68628 -1.000000 +68629 -1.000000 +68630 -1.000000 +68631 -1.000000 +68632 -1.000000 +68633 -1.000000 +68634 -1.000000 +68635 -1.000000 +68636 -1.000000 +68637 -1.000000 +68638 -1.000000 +68639 -1.000000 +68640 -1.000000 +68641 -1.000000 +68642 -1.000000 +68643 -1.000000 +68644 -1.000000 +68645 -1.000000 +68646 -1.000000 +68647 -1.000000 +68648 -1.000000 +68649 -1.000000 +68650 -1.000000 +68651 -1.000000 +68652 -1.000000 +68653 -1.000000 +68654 -1.000000 +68655 -1.000000 +68656 -1.000000 +68657 -1.000000 +68658 -1.000000 +68659 -1.000000 +68660 -1.000000 +68661 -1.000000 +68662 -1.000000 +68663 -1.000000 +68664 -1.000000 +68665 -1.000000 +68666 -1.000000 +68667 -1.000000 +68668 -1.000000 +68669 -1.000000 +68670 -1.000000 +68671 -1.000000 +68672 -1.000000 +68673 -1.000000 +68674 -1.000000 +68675 -1.000000 +68676 -1.000000 +68677 -1.000000 +68678 -1.000000 +68679 -1.000000 +68680 -1.000000 +68681 -1.000000 +68682 -1.000000 +68683 -1.000000 +68684 -1.000000 +68685 -1.000000 +68686 -1.000000 +68687 -1.000000 +68688 -1.000000 +68689 -1.000000 +68690 -1.000000 +68691 -1.000000 +68692 -1.000000 +68693 -1.000000 +68694 -1.000000 +68695 -1.000000 +68696 -1.000000 +68697 -1.000000 +68698 -1.000000 +68699 -1.000000 +68700 -1.000000 +68701 -1.000000 +68702 -1.000000 +68703 -1.000000 +68704 -1.000000 +68705 -1.000000 +68706 -1.000000 +68707 -1.000000 +68708 -1.000000 +68709 -1.000000 +68710 -1.000000 +68711 -1.000000 +68712 -1.000000 +68713 -1.000000 +68714 -1.000000 +68715 -1.000000 +68716 -1.000000 +68717 -1.000000 +68718 -1.000000 +68719 -1.000000 +68720 -1.000000 +68721 -1.000000 +68722 -1.000000 +68723 -1.000000 +68724 -1.000000 +68725 -1.000000 +68726 -1.000000 +68727 -1.000000 +68728 -1.000000 +68729 -1.000000 +68730 -1.000000 +68731 -1.000000 +68732 -1.000000 +68733 -1.000000 +68734 -1.000000 +68735 -1.000000 +68736 -1.000000 +68737 -1.000000 +68738 -1.000000 +68739 -1.000000 +68740 -1.000000 +68741 -1.000000 +68742 -1.000000 +68743 -1.000000 +68744 -1.000000 +68745 -1.000000 +68746 -1.000000 +68747 -1.000000 +68748 -1.000000 +68749 -1.000000 +68750 -1.000000 +68751 -1.000000 +68752 -1.000000 +68753 -1.000000 +68754 -1.000000 +68755 -1.000000 +68756 -1.000000 +68757 -1.000000 +68758 -1.000000 +68759 -1.000000 +68760 -1.000000 +68761 -1.000000 +68762 -1.000000 +68763 -1.000000 +68764 -1.000000 +68765 -1.000000 +68766 -1.000000 +68767 -1.000000 +68768 -1.000000 +68769 -1.000000 +68770 -1.000000 +68771 -1.000000 +68772 -1.000000 +68773 -1.000000 +68774 -1.000000 +68775 -1.000000 +68776 -1.000000 +68777 -1.000000 +68778 -1.000000 +68779 -1.000000 +68780 -1.000000 +68781 -1.000000 +68782 -1.000000 +68783 -1.000000 +68784 -1.000000 +68785 -1.000000 +68786 -1.000000 +68787 -1.000000 +68788 -1.000000 +68789 -1.000000 +68790 -1.000000 +68791 -1.000000 +68792 -1.000000 +68793 -1.000000 +68794 -1.000000 +68795 -1.000000 +68796 -1.000000 +68797 -1.000000 +68798 -1.000000 +68799 -1.000000 +68800 -1.000000 +68801 -1.000000 +68802 -1.000000 +68803 -1.000000 +68804 -1.000000 +68805 -1.000000 +68806 -1.000000 +68807 -1.000000 +68808 -1.000000 +68809 -1.000000 +68810 -1.000000 +68811 -1.000000 +68812 -1.000000 +68813 -1.000000 +68814 -1.000000 +68815 -1.000000 +68816 -1.000000 +68817 -1.000000 +68818 -1.000000 +68819 -1.000000 +68820 -1.000000 +68821 -1.000000 +68822 -1.000000 +68823 -1.000000 +68824 -1.000000 +68825 -1.000000 +68826 -1.000000 +68827 -1.000000 +68828 -1.000000 +68829 -1.000000 +68830 -1.000000 +68831 -1.000000 +68832 -1.000000 +68833 -1.000000 +68834 -1.000000 +68835 -1.000000 +68836 -1.000000 +68837 -1.000000 +68838 -1.000000 +68839 -1.000000 +68840 -1.000000 +68841 -1.000000 +68842 -1.000000 +68843 -1.000000 +68844 -1.000000 +68845 -1.000000 +68846 -1.000000 +68847 -1.000000 +68848 -1.000000 +68849 -1.000000 +68850 -1.000000 +68851 -1.000000 +68852 -1.000000 +68853 -1.000000 +68854 -1.000000 +68855 -1.000000 +68856 -1.000000 +68857 -1.000000 +68858 -1.000000 +68859 -1.000000 +68860 -1.000000 +68861 -1.000000 +68862 -1.000000 +68863 -1.000000 +68864 -1.000000 +68865 -1.000000 +68866 -1.000000 +68867 -1.000000 +68868 -1.000000 +68869 -1.000000 +68870 -1.000000 +68871 -1.000000 +68872 -1.000000 +68873 -1.000000 +68874 -1.000000 +68875 -1.000000 +68876 -1.000000 +68877 -1.000000 +68878 -1.000000 +68879 -1.000000 +68880 -1.000000 +68881 -1.000000 +68882 -1.000000 +68883 -1.000000 +68884 -1.000000 +68885 -1.000000 +68886 -1.000000 +68887 -1.000000 +68888 -1.000000 +68889 -1.000000 +68890 -1.000000 +68891 -1.000000 +68892 -1.000000 +68893 -1.000000 +68894 -1.000000 +68895 -1.000000 +68896 -1.000000 +68897 -1.000000 +68898 -1.000000 +68899 -1.000000 +68900 -1.000000 +68901 -1.000000 +68902 -1.000000 +68903 -1.000000 +68904 -1.000000 +68905 -1.000000 +68906 -1.000000 +68907 -1.000000 +68908 -1.000000 +68909 -1.000000 +68910 -1.000000 +68911 -1.000000 +68912 -1.000000 +68913 -1.000000 +68914 -1.000000 +68915 -1.000000 +68916 -1.000000 +68917 -1.000000 +68918 -1.000000 +68919 -1.000000 +68920 -1.000000 +68921 -1.000000 +68922 -1.000000 +68923 -1.000000 +68924 -1.000000 +68925 -1.000000 +68926 -1.000000 +68927 -1.000000 +68928 -1.000000 +68929 -1.000000 +68930 -1.000000 +68931 -1.000000 +68932 -1.000000 +68933 -1.000000 +68934 -1.000000 +68935 -1.000000 +68936 -1.000000 +68937 -1.000000 +68938 -1.000000 +68939 -1.000000 +68940 -1.000000 +68941 -1.000000 +68942 -1.000000 +68943 -1.000000 +68944 -1.000000 +68945 -1.000000 +68948 -1.000000 +68949 -1.000000 +68950 -1.000000 +68951 -1.000000 +68952 -1.000000 +68953 -1.000000 +68954 -1.000000 +68955 -1.000000 +68956 -1.000000 +68957 -1.000000 +68958 -1.000000 +68959 -1.000000 +68960 -1.000000 +68961 -1.000000 +68962 -1.000000 +68963 -1.000000 +68964 -1.000000 +68965 -1.000000 +68966 -1.000000 +68967 -1.000000 +68968 -1.000000 +68969 -1.000000 +68970 -1.000000 +68971 -1.000000 +68972 -1.000000 +68973 -1.000000 +68974 -1.000000 +68975 -1.000000 +68976 -1.000000 +68977 -1.000000 +68978 -1.000000 +68979 -1.000000 +68980 -1.000000 +68981 -1.000000 +68983 -1.000000 +68984 -1.000000 +68985 -1.000000 +68986 -1.000000 +68987 -1.000000 +68988 -1.000000 +68989 -1.000000 +68990 -1.000000 +68991 -1.000000 +68992 -1.000000 +68993 -1.000000 +68994 -1.000000 +68995 -1.000000 +68996 -1.000000 +68997 -1.000000 +68998 -1.000000 +68999 -1.000000 +69000 -1.000000 +69001 -1.000000 +69002 -1.000000 +69003 -1.000000 +69004 -1.000000 +69005 -1.000000 +69006 -1.000000 +69007 -1.000000 +69008 -1.000000 +69009 -1.000000 +69010 -1.000000 +69011 -1.000000 +69012 -1.000000 +69013 -1.000000 +69014 -1.000000 +69015 -1.000000 +69016 -1.000000 +69017 -1.000000 +69018 -1.000000 +69019 -1.000000 +69020 -1.000000 +69021 -1.000000 +69022 -1.000000 +69023 -1.000000 +69024 -1.000000 +69025 -1.000000 +69026 -1.000000 +69027 -1.000000 +69028 -1.000000 +69029 -1.000000 +69030 -1.000000 +69031 -1.000000 +69032 -1.000000 +69033 -1.000000 +69034 -1.000000 +69035 -1.000000 +69036 -1.000000 +69037 -1.000000 +69038 -1.000000 +69039 -1.000000 +69040 -1.000000 +69041 -1.000000 +69042 -1.000000 +69043 -1.000000 +69044 -1.000000 +69045 -1.000000 +69046 -1.000000 +69047 -1.000000 +69048 -1.000000 +69049 -1.000000 +69050 -1.000000 +69051 -1.000000 +69052 -1.000000 +69053 -1.000000 +69054 -1.000000 +69055 -1.000000 +69056 -1.000000 +69057 -1.000000 +69058 -1.000000 +69059 -1.000000 +69060 -1.000000 +69061 -1.000000 +69062 -1.000000 +69063 -1.000000 +69064 -1.000000 +69065 -1.000000 +69066 -1.000000 +69067 -1.000000 +69068 -1.000000 +69069 -1.000000 +69070 -1.000000 +69071 -1.000000 +69072 -1.000000 +69073 -1.000000 +69074 -1.000000 +69075 -1.000000 +69076 -1.000000 +69077 -1.000000 +69078 -1.000000 +69079 -1.000000 +69080 -1.000000 +69081 -1.000000 +69082 -1.000000 +69083 -1.000000 +69084 -1.000000 +69085 -1.000000 +69086 -1.000000 +69087 -1.000000 +69088 -1.000000 +69089 -1.000000 +69090 -1.000000 +69091 -1.000000 +69092 -1.000000 +69093 -1.000000 +69094 -1.000000 +69095 -1.000000 +69096 -1.000000 +69097 -1.000000 +69098 -1.000000 +69099 -1.000000 +69100 -1.000000 +69101 -1.000000 +69102 -1.000000 +69103 -1.000000 +69104 -1.000000 +69105 -1.000000 +69106 -1.000000 +69107 -1.000000 +69108 -1.000000 +69109 -1.000000 +69110 -1.000000 +69111 -1.000000 +69112 -1.000000 +69113 -1.000000 +69114 -1.000000 +69115 -1.000000 +69116 -1.000000 +69117 -1.000000 +69118 -1.000000 +69119 -1.000000 +69120 -1.000000 +69121 -1.000000 +69122 -1.000000 +69123 -1.000000 +69124 -1.000000 +69125 -1.000000 +69126 -1.000000 +69127 -1.000000 +69128 -1.000000 +69129 -1.000000 +69130 -1.000000 +69131 -1.000000 +69132 -1.000000 +69133 -1.000000 +69134 -1.000000 +69135 -1.000000 +69136 -1.000000 +69137 -1.000000 +69138 -1.000000 +69139 -1.000000 +69140 -1.000000 +69141 -1.000000 +69142 -1.000000 +69143 -1.000000 +69144 -1.000000 +69145 -1.000000 +69146 -1.000000 +69147 -1.000000 +69148 -1.000000 +69149 -1.000000 +69150 -1.000000 +69151 -1.000000 +69152 -1.000000 +69153 -1.000000 +69154 -1.000000 +69155 -1.000000 +69156 -1.000000 +69157 -1.000000 +69158 -1.000000 +69159 -1.000000 +69160 -1.000000 +69161 -1.000000 +69162 -1.000000 +69163 -1.000000 +69164 -1.000000 +69165 -1.000000 +69166 -1.000000 +69167 -1.000000 +69168 -1.000000 +69169 -1.000000 +69170 -1.000000 +69171 -1.000000 +69172 -1.000000 +69173 -1.000000 +69174 -1.000000 +69175 -1.000000 +69176 -1.000000 +69177 -1.000000 +69178 -1.000000 +69179 -1.000000 +69180 -1.000000 +69181 -1.000000 +69182 -1.000000 +69183 -1.000000 +69184 -1.000000 +69185 -1.000000 +69186 -1.000000 +69187 -1.000000 +69188 -1.000000 +69189 -1.000000 +69190 -1.000000 +69191 -1.000000 +69192 -1.000000 +69193 -1.000000 +69194 -1.000000 +69195 -1.000000 +69196 -1.000000 +69197 -1.000000 +69198 -1.000000 +69199 -1.000000 +69200 -1.000000 +69201 -1.000000 +69202 -1.000000 +69203 -1.000000 +69204 -1.000000 +69205 -1.000000 +69206 -1.000000 +69207 -1.000000 +69208 -1.000000 +69209 -1.000000 +69210 -1.000000 +69211 -1.000000 +69212 -1.000000 +69213 -1.000000 +69214 -1.000000 +69215 -1.000000 +69216 -1.000000 +69217 -1.000000 +69218 -1.000000 +69219 -1.000000 +69220 -1.000000 +69221 -1.000000 +69222 -1.000000 +69223 -1.000000 +69224 -1.000000 +69225 -1.000000 +69226 -1.000000 +69227 -1.000000 +69228 -1.000000 +69229 -1.000000 +69230 -1.000000 +69231 -1.000000 +69232 -1.000000 +69233 -1.000000 +69234 -1.000000 +69235 -1.000000 +69236 -1.000000 +69237 -1.000000 +69238 -1.000000 +69239 -1.000000 +69240 -1.000000 +69241 -1.000000 +69242 -1.000000 +69243 -1.000000 +69244 -1.000000 +69247 -1.000000 +69248 -1.000000 +69249 -1.000000 +69250 -1.000000 +69251 -1.000000 +69252 -1.000000 +69253 -1.000000 +69268 -1.000000 +69269 -1.000000 +69270 -1.000000 +69271 -1.000000 +69272 -1.000000 +69273 -1.000000 +69274 -1.000000 +69275 -1.000000 +69276 -1.000000 +69277 -1.000000 +69278 -1.000000 +69279 -1.000000 +69280 -1.000000 +69281 -1.000000 +69282 -1.000000 +69283 -1.000000 +69284 -1.000000 +69285 -1.000000 +69286 -1.000000 +69287 -1.000000 +69288 -1.000000 +69289 -1.000000 +69290 -1.000000 +69291 -1.000000 +69292 -1.000000 +69293 -1.000000 +69294 -1.000000 +69295 -1.000000 +69296 -1.000000 +69297 -1.000000 +69298 -1.000000 +69299 -1.000000 +69300 -1.000000 +69301 -1.000000 +69302 -1.000000 +69303 -1.000000 +69304 -1.000000 +69305 -1.000000 +69306 -1.000000 +69307 -1.000000 +69308 -1.000000 +69309 -1.000000 +69310 -1.000000 +69311 -1.000000 +69312 -1.000000 +69313 -1.000000 +69314 -1.000000 +69315 -1.000000 +69316 -1.000000 +69317 -1.000000 +69318 -1.000000 +69319 -1.000000 +69320 -1.000000 +69321 -1.000000 +69322 -1.000000 +69323 -1.000000 +69324 -1.000000 +69325 -1.000000 +69326 -1.000000 +69327 -1.000000 +69328 -1.000000 +69329 -1.000000 +69330 -1.000000 +69331 -1.000000 +69332 -1.000000 +69333 -1.000000 +69334 -1.000000 +69335 -1.000000 +69336 -1.000000 +69337 -1.000000 +69338 -1.000000 +69339 -1.000000 +69340 -1.000000 +69341 -1.000000 +69342 -1.000000 +69343 -1.000000 +69344 -1.000000 +69345 -1.000000 +69346 -1.000000 +69347 -1.000000 +69348 -1.000000 +69349 -1.000000 +69350 -1.000000 +69351 -1.000000 +69352 -1.000000 +69353 -1.000000 +69354 -1.000000 +69355 -1.000000 +69356 -1.000000 +69357 -1.000000 +69358 -1.000000 +69359 -1.000000 +69360 -1.000000 +69361 -1.000000 +69362 -1.000000 +69363 -1.000000 +69364 -1.000000 +69365 -1.000000 +69366 -1.000000 +69367 -1.000000 +69368 -1.000000 +69369 -1.000000 +69370 -1.000000 +69371 -1.000000 +69372 -1.000000 +69373 -1.000000 +69374 -1.000000 +69375 -1.000000 +69376 -1.000000 +69377 -1.000000 +69378 -1.000000 +69379 -1.000000 +69380 -1.000000 +69381 -1.000000 +69382 -1.000000 +69383 -1.000000 +69384 -1.000000 +69385 -1.000000 +69386 -1.000000 +69387 -1.000000 +69388 -1.000000 +69389 -1.000000 +69390 -1.000000 +69391 -1.000000 +69392 -1.000000 +69393 -1.000000 +69396 -1.000000 +69397 -1.000000 +69398 -1.000000 +69399 -1.000000 +69400 -1.000000 +69401 -1.000000 +69402 -1.000000 +69403 -1.000000 +69404 -1.000000 +69405 -1.000000 +69406 -1.000000 +69407 -1.000000 +69408 -1.000000 +69409 -1.000000 +69410 -1.000000 +69411 -1.000000 +69412 -1.000000 +69413 -1.000000 +69414 -1.000000 +69415 -1.000000 +69416 -1.000000 +69417 -1.000000 +69418 -1.000000 +69419 -1.000000 +69420 -1.000000 +69421 -1.000000 +69422 -1.000000 +69423 -1.000000 +69424 -1.000000 +69425 -1.000000 +69426 -1.000000 +69427 -1.000000 +69428 -1.000000 +69429 -1.000000 +69430 -1.000000 +69431 -1.000000 +69432 -1.000000 +69433 -1.000000 +69434 -1.000000 +69435 -1.000000 +69436 -1.000000 +69437 -1.000000 +69438 -1.000000 +69439 -1.000000 +69440 -1.000000 +69441 -1.000000 +69442 -1.000000 +69443 -1.000000 +69444 -1.000000 +69445 -1.000000 +69446 -1.000000 +69447 -1.000000 +69448 -1.000000 +69449 -1.000000 +69450 -1.000000 +69451 -1.000000 +69452 -1.000000 +69453 -1.000000 +69454 -1.000000 +69455 -1.000000 +69456 -1.000000 +69457 -1.000000 +69458 -1.000000 +69459 -1.000000 +69460 -1.000000 +69461 -1.000000 +69462 -1.000000 +69463 -1.000000 +69464 -1.000000 +69465 -1.000000 +69466 -1.000000 +69467 -1.000000 +69468 -1.000000 +69469 -1.000000 +69471 -1.000000 +69472 -1.000000 +69473 -1.000000 +69474 -1.000000 +69475 -1.000000 +69476 -1.000000 +69477 -1.000000 +69478 -1.000000 +69479 -1.000000 +69480 -1.000000 +69481 -1.000000 +69482 -1.000000 +69483 -1.000000 +69484 -1.000000 +69485 -1.000000 +69486 -1.000000 +69487 -1.000000 +69488 -1.000000 +69489 -1.000000 +69490 -1.000000 +69491 -1.000000 +69492 -1.000000 +69493 -1.000000 +69494 -1.000000 +69495 -1.000000 +69496 -1.000000 +69497 -1.000000 +69498 -1.000000 +69499 -1.000000 +69500 -1.000000 +69501 -1.000000 +69502 -1.000000 +69503 -1.000000 +69504 -1.000000 +69505 -1.000000 +69506 -1.000000 +69507 -1.000000 +69508 -1.000000 +69509 -1.000000 +69510 -1.000000 +69511 -1.000000 +69512 -1.000000 +69513 -1.000000 +69514 -1.000000 +69515 -1.000000 +69516 -1.000000 +69517 -1.000000 +69518 -1.000000 +69519 -1.000000 +69520 -1.000000 +69521 -1.000000 +69522 -1.000000 +69523 -1.000000 +69524 -1.000000 +69525 -1.000000 +69526 -1.000000 +69527 -1.000000 +69528 -1.000000 +69529 -1.000000 +69530 -1.000000 +69531 -1.000000 +69532 -1.000000 +69533 -1.000000 +69534 -1.000000 +69535 -1.000000 +69536 -1.000000 +69537 -1.000000 +69538 -1.000000 +69539 -1.000000 +69540 -1.000000 +69541 -1.000000 +69542 -1.000000 +69543 -1.000000 +69544 -1.000000 +69545 -1.000000 +69546 -1.000000 +69547 -1.000000 +69548 -1.000000 +69549 -1.000000 +69550 -1.000000 +69551 -1.000000 +69552 -1.000000 +69553 -1.000000 +69554 -1.000000 +69555 -1.000000 +69556 -1.000000 +69557 -1.000000 +69558 -1.000000 +69559 -1.000000 +69560 -1.000000 +69561 -1.000000 +69562 -1.000000 +69563 -1.000000 +69564 -1.000000 +69565 -1.000000 +69566 -1.000000 +69567 -1.000000 +69568 -1.000000 +69569 -1.000000 +69570 -1.000000 +69571 -1.000000 +69572 -1.000000 +69573 -1.000000 +69574 -1.000000 +69575 -1.000000 +69576 -1.000000 +69577 -1.000000 +69578 -1.000000 +69579 -1.000000 +69580 -1.000000 +69581 -1.000000 +69582 -1.000000 +69583 -1.000000 +69584 -1.000000 +69585 -1.000000 +69586 -1.000000 +69587 -1.000000 +69588 -1.000000 +69589 -1.000000 +69590 -1.000000 +69591 -1.000000 +69592 -1.000000 +69593 -1.000000 +69594 -1.000000 +69595 -1.000000 +69596 -1.000000 +69597 -1.000000 +69598 -1.000000 +69599 -1.000000 +69600 -1.000000 +69601 -1.000000 +69602 -1.000000 +69603 -1.000000 +69604 -1.000000 +69605 -1.000000 +69606 -1.000000 +69607 -1.000000 +69608 -1.000000 +69609 -1.000000 +69610 -1.000000 +69611 -1.000000 +69612 -1.000000 +69613 -1.000000 +69614 -1.000000 +69615 -1.000000 +69616 -1.000000 +69617 -1.000000 +69618 -1.000000 +69619 -1.000000 +69620 -1.000000 +69621 -1.000000 +69622 -1.000000 +69623 -1.000000 +69624 -1.000000 +69625 -1.000000 +69626 -1.000000 +69627 -1.000000 +69628 -1.000000 +69629 -1.000000 +69630 -1.000000 +69631 -1.000000 +69632 -1.000000 +69633 -1.000000 +69634 -1.000000 +69635 -1.000000 +69636 -1.000000 +69637 -1.000000 +69638 -1.000000 +69639 -1.000000 +69640 -1.000000 +69641 -1.000000 +69642 -1.000000 +69643 -1.000000 +69644 -1.000000 +69645 -1.000000 +69646 -1.000000 +69647 -1.000000 +69648 -1.000000 +69649 -1.000000 +69650 -1.000000 +69651 -1.000000 +69652 -1.000000 +69653 -1.000000 +69654 -1.000000 +69655 -1.000000 +69656 -1.000000 +69657 -1.000000 +69658 -1.000000 +69659 -1.000000 +69660 -1.000000 +69661 -1.000000 +69662 -1.000000 +69663 -1.000000 +69664 -1.000000 +69665 -1.000000 +69666 -1.000000 +69667 -1.000000 +69668 -1.000000 +69669 -1.000000 +69670 -1.000000 +69671 -1.000000 +69672 -1.000000 +69673 -1.000000 +69674 -1.000000 +69675 -1.000000 +69676 -1.000000 +69677 -1.000000 +69678 -1.000000 +69679 -1.000000 +69680 -1.000000 +69681 -1.000000 +69682 -1.000000 +69683 -1.000000 +69684 -1.000000 +69685 -1.000000 +69686 -1.000000 +69687 -1.000000 +69688 -1.000000 +69689 -1.000000 +69690 -1.000000 +69691 -1.000000 +69692 -1.000000 +69693 -1.000000 +69694 -1.000000 +69695 -1.000000 +69696 -1.000000 +69697 -1.000000 +69698 -1.000000 +69699 -1.000000 +69700 -1.000000 +69701 -1.000000 +69702 -1.000000 +69703 -1.000000 +69704 -1.000000 +69705 -1.000000 +69706 -1.000000 +69707 -1.000000 +69708 -1.000000 +69709 -1.000000 +69710 -1.000000 +69711 -1.000000 +69712 -1.000000 +69713 -1.000000 +69714 -1.000000 +69715 -1.000000 +69716 -1.000000 +69717 -1.000000 +69718 -1.000000 +69719 -1.000000 +69720 -1.000000 +69721 -1.000000 +69722 -1.000000 +69723 -1.000000 +69724 -1.000000 +69725 -1.000000 +69726 -1.000000 +69727 -1.000000 +69728 -1.000000 +69729 -1.000000 +69730 -1.000000 +69731 -1.000000 +69732 -1.000000 +69733 -1.000000 +69734 -1.000000 +69735 -1.000000 +69736 -1.000000 +69737 -1.000000 +69738 -1.000000 +69739 -1.000000 +69740 -1.000000 +69741 -1.000000 +69742 -1.000000 +69743 -1.000000 +69744 -1.000000 +69745 -1.000000 +69746 -1.000000 +69747 -1.000000 +69748 -1.000000 +69749 -1.000000 +69750 -1.000000 +69751 -1.000000 +69752 -1.000000 +69753 -1.000000 +69754 -1.000000 +69755 -1.000000 +69756 -1.000000 +69757 -1.000000 +69758 -1.000000 +69759 -1.000000 +69760 -1.000000 +69761 -1.000000 +69762 -1.000000 +69763 -1.000000 +69764 -1.000000 +69765 -1.000000 +69766 -1.000000 +69767 -1.000000 +69768 -1.000000 +69769 -1.000000 +69770 -1.000000 +69771 -1.000000 +69772 -1.000000 +69773 -1.000000 +69774 -1.000000 +69775 -1.000000 +69776 -1.000000 +69777 -1.000000 +69778 -1.000000 +69779 -1.000000 +69780 -1.000000 +69781 -1.000000 +69782 -1.000000 +69783 -1.000000 +69784 -1.000000 +69785 -1.000000 +69786 -1.000000 +69787 -1.000000 +69788 -1.000000 +69789 -1.000000 +69790 -1.000000 +69791 -1.000000 +69792 -1.000000 +69793 -1.000000 +69794 -1.000000 +69795 -1.000000 +69796 -1.000000 +69797 -1.000000 +69798 -1.000000 +69799 -1.000000 +69800 -1.000000 +69801 -1.000000 +69802 -1.000000 +69803 -1.000000 +69804 -1.000000 +69805 -1.000000 +69806 -1.000000 +69807 -1.000000 +69808 -1.000000 +69809 -1.000000 +69810 -1.000000 +69811 -1.000000 +69812 -1.000000 +69813 -1.000000 +69814 -1.000000 +69815 -1.000000 +69816 -1.000000 +69817 -1.000000 +69818 -1.000000 +69819 -1.000000 +69820 -1.000000 +69821 -1.000000 +69822 -1.000000 +69823 -1.000000 +69824 -1.000000 +69825 -1.000000 +69826 -1.000000 +69827 -1.000000 +69828 -1.000000 +69829 -1.000000 +69830 -1.000000 +69831 -1.000000 +69832 -1.000000 +69833 -1.000000 +69834 -1.000000 +69835 -1.000000 +69836 -1.000000 +69837 -1.000000 +69838 -1.000000 +69839 -1.000000 +69840 -1.000000 +69841 -1.000000 +69842 -1.000000 +69843 -1.000000 +69844 -1.000000 +69845 -1.000000 +69846 -1.000000 +69847 -1.000000 +69848 -1.000000 +69849 -1.000000 +69850 -1.000000 +69851 -1.000000 +69852 -1.000000 +69853 -1.000000 +69854 -1.000000 +69855 -1.000000 +69856 -1.000000 +69857 -1.000000 +69858 -1.000000 +69859 -1.000000 +69860 -1.000000 +69861 -1.000000 +69862 -1.000000 +69863 -1.000000 +69864 -1.000000 +69865 -1.000000 +69866 -1.000000 +69867 -1.000000 +69868 -1.000000 +69869 -1.000000 +69870 -1.000000 +69871 -1.000000 +69872 -1.000000 +69873 -1.000000 +69874 -1.000000 +69875 -1.000000 +69876 -1.000000 +69877 -1.000000 +69878 -1.000000 +69879 -1.000000 +69880 -1.000000 +69881 -1.000000 +69882 -1.000000 +69883 -1.000000 +69884 -1.000000 +69885 -1.000000 +69886 -1.000000 +69887 -1.000000 +69888 -1.000000 +69889 -1.000000 +69890 -1.000000 +69891 -1.000000 +69892 -1.000000 +69893 -1.000000 +69894 -1.000000 +69895 -1.000000 +69896 -1.000000 +69897 -1.000000 +69898 -1.000000 +69899 -1.000000 +69900 -1.000000 +69901 -1.000000 +69902 -1.000000 +69903 -1.000000 +69904 -1.000000 +69905 -1.000000 +69906 -1.000000 +69907 -1.000000 +69908 -1.000000 +69909 -1.000000 +69910 -1.000000 +69911 -1.000000 +69912 -1.000000 +69913 -1.000000 +69914 -1.000000 +69915 -1.000000 +69916 -1.000000 +69917 -1.000000 +69918 -1.000000 +69919 -1.000000 +69920 -1.000000 +69921 -1.000000 +69922 -1.000000 +69923 -1.000000 +69924 -1.000000 +69925 -1.000000 +69926 -1.000000 +69927 -1.000000 +69928 -1.000000 +69929 -1.000000 +69930 -1.000000 +69931 -1.000000 +69932 -1.000000 +69933 -1.000000 +69934 -1.000000 +69935 -1.000000 +69936 -1.000000 +69937 -1.000000 +69938 -1.000000 +69939 -1.000000 +69940 -1.000000 +69941 -1.000000 +69942 -1.000000 +69943 -1.000000 +69944 -1.000000 +69945 -1.000000 +69946 -1.000000 +69947 -1.000000 +69948 -1.000000 +69949 -1.000000 +69950 -1.000000 +69951 -1.000000 +69952 -1.000000 +69953 -1.000000 +69954 -1.000000 +69955 -1.000000 +69956 -1.000000 +69957 -1.000000 +69958 -1.000000 +69959 -1.000000 +69960 -1.000000 +69963 -1.000000 +69964 -1.000000 +69965 -1.000000 +69966 -1.000000 +69967 -1.000000 +69968 -1.000000 +69969 -1.000000 +69970 -1.000000 +69971 -1.000000 +69972 -1.000000 +69973 -1.000000 +69975 -1.000000 +69976 -1.000000 +69977 -1.000000 +69978 -1.000000 +69979 -1.000000 +69980 -1.000000 +69981 -1.000000 +69982 -1.000000 +69983 -1.000000 +69984 -1.000000 +69985 -1.000000 +69986 -1.000000 +69987 -1.000000 +69988 -1.000000 +69989 -1.000000 +69990 -1.000000 +69991 -1.000000 +69992 -1.000000 +69993 -1.000000 +69994 -1.000000 +69995 -1.000000 +69996 -1.000000 +69997 -1.000000 +69998 -1.000000 +69999 -1.000000 +70000 -1.000000 +70001 -1.000000 +70002 -1.000000 +70003 -1.000000 +70004 -1.000000 +70005 -1.000000 +70006 -1.000000 +70007 -1.000000 +70008 -1.000000 +70009 -1.000000 +70010 -1.000000 +70011 -1.000000 +70012 -1.000000 +70013 -1.000000 +70014 -1.000000 +70015 -1.000000 +70016 -1.000000 +70017 -1.000000 +70018 -1.000000 +70019 -1.000000 +70020 -1.000000 +70021 -1.000000 +70022 -1.000000 +70023 -1.000000 +70024 -1.000000 +70025 -1.000000 +70026 -1.000000 +70027 -1.000000 +70028 -1.000000 +70029 -1.000000 +70030 -1.000000 +70031 -1.000000 +70032 -1.000000 +70033 -1.000000 +70034 -1.000000 +70035 -1.000000 +70036 -1.000000 +70037 -1.000000 +70038 -1.000000 +70039 -1.000000 +70041 -1.000000 +70042 -1.000000 +70043 -1.000000 +70044 -1.000000 +70045 -1.000000 +70046 -1.000000 +70047 -1.000000 +70048 -1.000000 +70049 -1.000000 +70050 -1.000000 +70051 -1.000000 +70052 -1.000000 +70053 -1.000000 +70054 -1.000000 +70055 -1.000000 +70056 -1.000000 +70057 -1.000000 +70058 -1.000000 +70059 -1.000000 +70060 -1.000000 +70061 -1.000000 +70062 -1.000000 +70063 -1.000000 +70064 -1.000000 +70065 -1.000000 +70067 -1.000000 +70068 -1.000000 +70069 -1.000000 +70070 -1.000000 +70071 -1.000000 +70072 -1.000000 +70073 -1.000000 +70074 -1.000000 +70077 -1.000000 +70078 -1.000000 +70079 -1.000000 +70080 -1.000000 +70081 -1.000000 +70082 -1.000000 +70083 -1.000000 +70084 -1.000000 +70085 -1.000000 +70086 -1.000000 +70087 -1.000000 +70088 -1.000000 +70089 -1.000000 +70090 -1.000000 +70091 -1.000000 +70092 -1.000000 +70093 -1.000000 +70094 -1.000000 +70095 -1.000000 +70096 -1.000000 +70097 -1.000000 +70098 -1.000000 +70099 -1.000000 +70100 -1.000000 +70101 -1.000000 +70102 -1.000000 +70103 -1.000000 +70104 -1.000000 +70105 -1.000000 +70106 -1.000000 +70107 -1.000000 +70108 -1.000000 +70112 -1.000000 +70113 -1.000000 +70114 -1.000000 +70115 -1.000000 +70116 -1.000000 +70117 -1.000000 +70120 -1.000000 +70121 -1.000000 +70122 -1.000000 +70123 -1.000000 +70124 -1.000000 +70125 -1.000000 +70126 -1.000000 +70127 -1.000000 +70128 -1.000000 +70129 -1.000000 +70130 -1.000000 +70131 -1.000000 +70132 -1.000000 +70134 -1.000000 +70135 -1.000000 +70136 -1.000000 +70137 -1.000000 +70138 -1.000000 +70139 -1.000000 +70140 -1.000000 +70141 -1.000000 +70142 -1.000000 +70143 -1.000000 +70144 -1.000000 +70145 -1.000000 +70146 -1.000000 +70147 -1.000000 +70148 -1.000000 +70149 -1.000000 +70150 -1.000000 +70151 -1.000000 +70152 -1.000000 +70153 -1.000000 +70154 -1.000000 +70155 -1.000000 +70156 -1.000000 +70157 -1.000000 +70158 -1.000000 +70159 -1.000000 +70160 -1.000000 +70161 -1.000000 +70162 -1.000000 +70163 -1.000000 +70164 -1.000000 +70165 -1.000000 +70166 -1.000000 +70167 -1.000000 +70168 -1.000000 +70169 -1.000000 +70170 -1.000000 +70171 -1.000000 +70172 -1.000000 +70173 -1.000000 +70174 -1.000000 +70175 -1.000000 +70176 -1.000000 +70177 -1.000000 +70178 -1.000000 +70179 -1.000000 +70180 -1.000000 +70181 -1.000000 +70182 -1.000000 +70183 -1.000000 +70184 -1.000000 +70185 -1.000000 +70186 -1.000000 +70187 -1.000000 +70188 -1.000000 +70189 -1.000000 +70190 -1.000000 +70191 -1.000000 +70192 -1.000000 +70193 -1.000000 +70194 -1.000000 +70195 -1.000000 +70196 -1.000000 +70197 -1.000000 +70198 -1.000000 +70199 -1.000000 +70200 -1.000000 +70201 -1.000000 +70202 -1.000000 +70203 -1.000000 +70204 -1.000000 +70205 -1.000000 +70206 -1.000000 +70207 -1.000000 +70208 -1.000000 +70209 -1.000000 +70210 -1.000000 +70211 -1.000000 +70212 -1.000000 +70213 -1.000000 +70214 -1.000000 +70215 -1.000000 +70216 -1.000000 +70217 -1.000000 +70218 -1.000000 +70219 -1.000000 +70220 -1.000000 +70221 -1.000000 +70222 -1.000000 +70223 -1.000000 +70224 -1.000000 +70225 -1.000000 +70226 -1.000000 +70227 -1.000000 +70228 -1.000000 +70229 -1.000000 +70230 -1.000000 +70231 -1.000000 +70232 -1.000000 +70233 -1.000000 +70234 -1.000000 +70235 -1.000000 +70236 -1.000000 +70237 -1.000000 +70238 -1.000000 +70239 -1.000000 +70240 -1.000000 +70241 -1.000000 +70242 -1.000000 +70243 -1.000000 +70244 -1.000000 +70245 -1.000000 +70246 -1.000000 +70247 -1.000000 +70248 -1.000000 +70249 -1.000000 +70250 -1.000000 +70251 -1.000000 +70252 -1.000000 +70253 -1.000000 +70254 -1.000000 +70255 -1.000000 +70257 -1.000000 +70258 -1.000000 +70259 -1.000000 +70260 -1.000000 +70261 -1.000000 +70262 -1.000000 +70263 -1.000000 +70264 -1.000000 +70265 -1.000000 +70266 -1.000000 +70267 -1.000000 +70268 -1.000000 +70269 -1.000000 +70270 -1.000000 +70271 -1.000000 +70272 -1.000000 +70273 -1.000000 +70274 -1.000000 +70275 -1.000000 +70276 -1.000000 +70277 -1.000000 +70278 -1.000000 +70279 -1.000000 +70280 -1.000000 +70281 -1.000000 +70282 -1.000000 +70283 -1.000000 +70284 -1.000000 +70285 -1.000000 +70286 -1.000000 +70287 -1.000000 +70288 -1.000000 +70289 -1.000000 +70290 -1.000000 +70291 -1.000000 +70292 -1.000000 +70293 -1.000000 +70294 -1.000000 +70295 -1.000000 +70296 -1.000000 +70297 -1.000000 +70298 -1.000000 +70299 -1.000000 +70300 -1.000000 +70301 -1.000000 +70302 -1.000000 +70303 -1.000000 +70304 -1.000000 +70305 -1.000000 +70306 -1.000000 +70307 -1.000000 +70308 -1.000000 +70309 -1.000000 +70310 -1.000000 +70311 -1.000000 +70312 -1.000000 +70313 -1.000000 +70314 -1.000000 +70315 -1.000000 +70316 -1.000000 +70317 -1.000000 +70318 -1.000000 +70319 -1.000000 +70320 -1.000000 +70321 -1.000000 +70322 -1.000000 +70323 -1.000000 +70324 -1.000000 +70325 -1.000000 +70326 -1.000000 +70327 -1.000000 +70328 -1.000000 +70329 -1.000000 +70330 -1.000000 +70331 -1.000000 +70332 -1.000000 +70333 -1.000000 +70334 -1.000000 +70335 -1.000000 +70336 -1.000000 +70337 -1.000000 +70338 -1.000000 +70339 -1.000000 +70340 -1.000000 +70341 -1.000000 +70342 -1.000000 +70343 -1.000000 +70344 -1.000000 +70345 -1.000000 +70346 -1.000000 +70347 -1.000000 +70348 -1.000000 +70349 -1.000000 +70350 -1.000000 +70351 -1.000000 +70352 -1.000000 +70353 -1.000000 +70354 -1.000000 +70355 -1.000000 +70356 -1.000000 +70357 -1.000000 +70358 -1.000000 +70363 -1.000000 +70364 -1.000000 +70365 -1.000000 +70366 -1.000000 +70367 -1.000000 +70368 -1.000000 +70369 -1.000000 +70370 -1.000000 +70371 -1.000000 +70372 -1.000000 +70373 -1.000000 +70374 -1.000000 +70375 -1.000000 +70376 -1.000000 +70377 -1.000000 +70378 -1.000000 +70379 -1.000000 +70380 -1.000000 +70381 -1.000000 +70382 -1.000000 +70383 -1.000000 +70384 -1.000000 +70385 -1.000000 +70386 -1.000000 +70387 -1.000000 +70388 -1.000000 +70389 -1.000000 +70390 -1.000000 +70391 -1.000000 +70392 -1.000000 +70393 -1.000000 +70394 -1.000000 +70395 -1.000000 +70396 -1.000000 +70397 -1.000000 +70398 -1.000000 +70399 -1.000000 +70400 -1.000000 +70401 -1.000000 +70402 -1.000000 +70403 -1.000000 +70404 -1.000000 +70405 -1.000000 +70406 -1.000000 +70407 -1.000000 +70408 -1.000000 +70409 -1.000000 +70410 -1.000000 +70411 -1.000000 +70412 -1.000000 +70413 -1.000000 +70414 -1.000000 +70415 -1.000000 +70416 -1.000000 +70417 -1.000000 +70419 -1.000000 +70420 -1.000000 +70421 -1.000000 +70422 -1.000000 +70423 -1.000000 +70424 -1.000000 +70425 -1.000000 +70426 -1.000000 +70427 -1.000000 +70428 -1.000000 +70429 -1.000000 +70430 -1.000000 +70431 -1.000000 +70432 -1.000000 +70433 -1.000000 +70434 -1.000000 +70435 -1.000000 +70436 -1.000000 +70437 -1.000000 +70438 -1.000000 +70439 -1.000000 +70440 -1.000000 +70441 -1.000000 +70442 -1.000000 +70443 -1.000000 +70444 -1.000000 +70445 -1.000000 +70446 -1.000000 +70447 -1.000000 +70448 -1.000000 +70450 -1.000000 +70451 -1.000000 +70452 -1.000000 +70453 -1.000000 +70454 -1.000000 +70455 -1.000000 +70456 -1.000000 +70457 -1.000000 +70459 -1.000000 +70460 -1.000000 +70461 -1.000000 +70462 -1.000000 +70463 -1.000000 +70464 -1.000000 +70465 -1.000000 +70466 -1.000000 +70467 -1.000000 +70468 -1.000000 +70469 -1.000000 +70470 -1.000000 +70471 -1.000000 +70472 -1.000000 +70473 -1.000000 +70474 -1.000000 +70475 -1.000000 +70476 -1.000000 +70477 -1.000000 +70478 -1.000000 +70479 -1.000000 +70480 -1.000000 +70481 -1.000000 +70482 -1.000000 +70483 -1.000000 +70484 -1.000000 +70485 -1.000000 +70486 -1.000000 +70487 -1.000000 +70488 -1.000000 +70489 -1.000000 +70490 -1.000000 +70491 -1.000000 +70492 -1.000000 +70493 -1.000000 +70494 -1.000000 +70495 -1.000000 +70496 -1.000000 +70497 -1.000000 +70498 -1.000000 +70499 -1.000000 +70500 -1.000000 +70501 -1.000000 +70502 -1.000000 +70503 -1.000000 +70504 -1.000000 +70505 -1.000000 +70506 -1.000000 +70507 -1.000000 +70508 -1.000000 +70509 -1.000000 +70510 -1.000000 +70511 -1.000000 +70512 -1.000000 +70513 -1.000000 +70515 -1.000000 +70516 -1.000000 +70517 -1.000000 +70518 -1.000000 +70519 -1.000000 +70520 -1.000000 +70521 -1.000000 +70522 -1.000000 +70523 -1.000000 +70524 -1.000000 +70525 -1.000000 +70526 -1.000000 +70527 -1.000000 +70528 -1.000000 +70529 -1.000000 +70530 -1.000000 +70531 -1.000000 +70532 -1.000000 +70533 -1.000000 +70534 -1.000000 +70535 -1.000000 +70536 -1.000000 +70537 -1.000000 +70538 -1.000000 +70539 -1.000000 +70540 -1.000000 +70541 -1.000000 +70542 -1.000000 +70543 -1.000000 +70544 -1.000000 +70545 -1.000000 +70546 -1.000000 +70547 -1.000000 +70548 -1.000000 +70549 -1.000000 +70550 -1.000000 +70551 -1.000000 +70552 -1.000000 +70553 -1.000000 +70554 -1.000000 +70555 -1.000000 +70556 -1.000000 +70557 -1.000000 +70558 -1.000000 +70559 -1.000000 +70560 -1.000000 +70561 -1.000000 +70562 -1.000000 +70563 -1.000000 +70564 -1.000000 +70565 -1.000000 +70566 -1.000000 +70567 -1.000000 +70568 -1.000000 +70569 -1.000000 +70570 -1.000000 +70571 -1.000000 +70572 -1.000000 +70573 -1.000000 +70574 -1.000000 +70575 -1.000000 +70576 -1.000000 +70577 -1.000000 +70578 -1.000000 +70579 -1.000000 +70580 -1.000000 +70581 -1.000000 +70582 -1.000000 +70583 -1.000000 +70584 -1.000000 +70585 -1.000000 +70586 -1.000000 +70587 -1.000000 +70588 -1.000000 +70589 -1.000000 +70590 -1.000000 +70591 -1.000000 +70592 -1.000000 +70593 -1.000000 +70594 -1.000000 +70595 -1.000000 +70596 -1.000000 +70597 -1.000000 +70598 -1.000000 +70599 -1.000000 +70600 -1.000000 +70601 -1.000000 +70602 -1.000000 +70603 -1.000000 +70604 -1.000000 +70605 -1.000000 +70606 -1.000000 +70607 -1.000000 +70608 -1.000000 +70609 -1.000000 +70610 -1.000000 +70611 -1.000000 +70612 -1.000000 +70613 -1.000000 +70614 -1.000000 +70615 -1.000000 +70616 -1.000000 +70617 -1.000000 +70618 -1.000000 +70619 -1.000000 +70620 -1.000000 +70621 -1.000000 +70622 -1.000000 +70623 -1.000000 +70624 -1.000000 +70625 -1.000000 +70626 -1.000000 +70627 -1.000000 +70628 -1.000000 +70629 -1.000000 +70630 -1.000000 +70631 -1.000000 +70632 -1.000000 +70633 -1.000000 +70634 -1.000000 +70635 -1.000000 +70636 -1.000000 +70637 -1.000000 +70638 -1.000000 +70639 -1.000000 +70640 -1.000000 +70641 -1.000000 +70642 -1.000000 +70643 -1.000000 +70644 -1.000000 +70645 -1.000000 +70646 -1.000000 +70647 -1.000000 +70648 -1.000000 +70649 -1.000000 +70650 -1.000000 +70651 -1.000000 +70652 -1.000000 +70653 -1.000000 +70654 -1.000000 +70655 -1.000000 +70656 -1.000000 +70657 -1.000000 +70658 -1.000000 +70659 -1.000000 +70660 -1.000000 +70661 -1.000000 +70662 -1.000000 +70663 -1.000000 +70664 -1.000000 +70665 -1.000000 +70666 -1.000000 +70667 -1.000000 +70668 -1.000000 +70669 -1.000000 +70670 -1.000000 +70671 -1.000000 +70672 -1.000000 +70673 -1.000000 +70674 -1.000000 +70675 -1.000000 +70676 -1.000000 +70677 -1.000000 +70678 -1.000000 +70679 -1.000000 +70680 -1.000000 +70681 -1.000000 +70682 -1.000000 +70683 -1.000000 +70684 -1.000000 +70685 -1.000000 +70686 -1.000000 +70687 -1.000000 +70688 -1.000000 +70689 -1.000000 +70690 -1.000000 +70691 -1.000000 +70692 -1.000000 +70693 -1.000000 +70694 -1.000000 +70695 -1.000000 +70696 -1.000000 +70697 -1.000000 +70698 -1.000000 +70699 -1.000000 +70700 -1.000000 +70701 -1.000000 +70702 -1.000000 +70703 -1.000000 +70704 -1.000000 +70705 -1.000000 +70706 -1.000000 +70707 -1.000000 +70708 -1.000000 +70709 -1.000000 +70710 -1.000000 +70711 -1.000000 +70712 -1.000000 +70713 -1.000000 +70714 -1.000000 +70715 -1.000000 +70716 -1.000000 +70717 -1.000000 +70718 -1.000000 +70719 -1.000000 +70720 -1.000000 +70721 -1.000000 +70722 -1.000000 +70723 -1.000000 +70724 -1.000000 +70725 -1.000000 +70726 -1.000000 +70727 -1.000000 +70728 -1.000000 +70729 -1.000000 +70730 -1.000000 +70731 -1.000000 +70732 -1.000000 +70733 -1.000000 +70734 -1.000000 +70735 -1.000000 +70736 -1.000000 +70737 -1.000000 +70738 -1.000000 +70739 -1.000000 +70740 -1.000000 +70741 -1.000000 +70742 -1.000000 +70743 -1.000000 +70744 -1.000000 +70745 -1.000000 +70746 -1.000000 +70747 -1.000000 +70748 -1.000000 +70749 -1.000000 +70750 -1.000000 +70751 -1.000000 +70752 -1.000000 +70753 -1.000000 +70754 -1.000000 +70755 -1.000000 +70756 -1.000000 +70757 -1.000000 +70758 -1.000000 +70759 -1.000000 +70760 -1.000000 +70761 -1.000000 +70762 -1.000000 +70763 -1.000000 +70764 -1.000000 +70765 -1.000000 +70766 -1.000000 +70767 -1.000000 +70768 -1.000000 +70769 -1.000000 +70770 -1.000000 +70771 -1.000000 +70772 -1.000000 +70773 -1.000000 +70774 -1.000000 +70775 -1.000000 +70776 -1.000000 +70777 -1.000000 +70778 -1.000000 +70779 -1.000000 +70780 -1.000000 +70781 -1.000000 +70782 -1.000000 +70783 -1.000000 +70784 -1.000000 +70785 -1.000000 +70786 -1.000000 +70787 -1.000000 +70788 -1.000000 +70789 -1.000000 +70790 -1.000000 +70791 -1.000000 +70792 -1.000000 +70793 -1.000000 +70794 -1.000000 +70795 -1.000000 +70796 -1.000000 +70797 -1.000000 +70798 -1.000000 +70799 -1.000000 +70800 -1.000000 +70804 -1.000000 +70806 -1.000000 +70807 -1.000000 +70808 -1.000000 +70809 -1.000000 +70810 -1.000000 +70811 -1.000000 +70812 -1.000000 +70813 -1.000000 +70814 -1.000000 +70815 -1.000000 +70816 -1.000000 +70817 -1.000000 +70818 -1.000000 +70819 -1.000000 +70820 -1.000000 +70821 -1.000000 +70822 -1.000000 +70823 -1.000000 +70824 -1.000000 +70825 -1.000000 +70826 -1.000000 +70827 -1.000000 +70828 -1.000000 +70829 -1.000000 +70830 -1.000000 +70831 -1.000000 +70832 -1.000000 +70833 -1.000000 +70834 -1.000000 +70835 -1.000000 +70836 -1.000000 +70837 -1.000000 +70838 -1.000000 +70839 -1.000000 +70840 -1.000000 +70841 -1.000000 +70842 -1.000000 +70843 -1.000000 +70844 -1.000000 +70845 -1.000000 +70846 -1.000000 +70847 -1.000000 +70848 -1.000000 +70849 -1.000000 +70850 -1.000000 +70851 -1.000000 +70852 -1.000000 +70853 -1.000000 +70854 -1.000000 +70855 -1.000000 +70856 -1.000000 +70857 -1.000000 +70858 -1.000000 +70859 -1.000000 +70860 -1.000000 +70861 -1.000000 +70862 -1.000000 +70863 -1.000000 +70864 -1.000000 +70865 -1.000000 +70866 -1.000000 +70867 -1.000000 +70868 -1.000000 +70869 -1.000000 +70870 -1.000000 +70871 -1.000000 +70872 -1.000000 +70873 -1.000000 +70874 -1.000000 +70875 -1.000000 +70876 -1.000000 +70877 -1.000000 +70878 -1.000000 +70879 -1.000000 +70880 -1.000000 +70881 -1.000000 +70882 -1.000000 +70883 -1.000000 +70884 -1.000000 +70885 -1.000000 +70886 -1.000000 +70887 -1.000000 +70888 -1.000000 +70889 -1.000000 +70890 -1.000000 +70891 -1.000000 +70892 -1.000000 +70893 -1.000000 +70894 -1.000000 +70895 -1.000000 +70896 -1.000000 +70897 -1.000000 +70898 -1.000000 +70899 -1.000000 +70900 -1.000000 +70901 -1.000000 +70902 -1.000000 +70903 -1.000000 +70904 -1.000000 +70905 -1.000000 +70906 -1.000000 +70907 -1.000000 +70908 -1.000000 +70909 -1.000000 +70910 -1.000000 +70911 -1.000000 +70912 -1.000000 +70913 -1.000000 +70914 -1.000000 +70915 -1.000000 +70916 -1.000000 +70917 -1.000000 +70918 -1.000000 +70919 -1.000000 +70920 -1.000000 +70921 -1.000000 +70922 -1.000000 +70923 -1.000000 +70924 -1.000000 +70925 -1.000000 +70926 -1.000000 +70927 -1.000000 +70928 -1.000000 +70929 -1.000000 +70930 -1.000000 +70931 -1.000000 +70932 -1.000000 +70933 -1.000000 +70934 -1.000000 +70935 -1.000000 +70936 -1.000000 +70937 -1.000000 +70938 -1.000000 +70939 -1.000000 +70940 -1.000000 +70941 -1.000000 +70942 -1.000000 +70943 -1.000000 +70944 -1.000000 +70945 -1.000000 +70946 -1.000000 +70947 -1.000000 +70948 -1.000000 +70949 -1.000000 +70950 -1.000000 +70951 -1.000000 +70952 -1.000000 +70953 -1.000000 +70954 -1.000000 +70955 -1.000000 +70956 -1.000000 +70957 -1.000000 +70958 -1.000000 +70959 -1.000000 +70960 -1.000000 +70961 -1.000000 +70962 -1.000000 +70963 -1.000000 +70964 -1.000000 +70965 -1.000000 +70966 -1.000000 +70967 -1.000000 +70968 -1.000000 +70969 -1.000000 +70970 -1.000000 +70971 -1.000000 +70972 -1.000000 +70973 -1.000000 +70974 -1.000000 +70975 -1.000000 +70976 -1.000000 +70977 -1.000000 +70978 -1.000000 +70979 -1.000000 +70980 -1.000000 +70981 -1.000000 +70982 -1.000000 +70983 -1.000000 +70984 -1.000000 +70985 -1.000000 +70986 -1.000000 +70987 -1.000000 +70988 -1.000000 +70989 -1.000000 +70990 -1.000000 +70991 -1.000000 +70992 -1.000000 +70993 -1.000000 +70994 -1.000000 +70995 -1.000000 +70996 -1.000000 +70997 -1.000000 +70998 -1.000000 +70999 -1.000000 +71000 -1.000000 +71001 -1.000000 +71002 -1.000000 +71003 -1.000000 +71004 -1.000000 +71005 -1.000000 +71006 -1.000000 +71007 -1.000000 +71008 -1.000000 +71009 -1.000000 +71010 -1.000000 +71011 -1.000000 +71012 -1.000000 +71013 -1.000000 +71014 -1.000000 +71015 -1.000000 +71016 -1.000000 +71017 -1.000000 +71018 -1.000000 +71019 -1.000000 +71020 -1.000000 +71021 -1.000000 +71022 -1.000000 +71023 -1.000000 +71024 -1.000000 +71025 -1.000000 +71026 -1.000000 +71027 -1.000000 +71028 -1.000000 +71029 -1.000000 +71030 -1.000000 +71031 -1.000000 +71032 -1.000000 +71033 -1.000000 +71034 -1.000000 +71035 -1.000000 +71036 -1.000000 +71037 -1.000000 +71038 -1.000000 +71039 -1.000000 +71040 -1.000000 +71041 -1.000000 +71042 -1.000000 +71043 -1.000000 +71044 -1.000000 +71045 -1.000000 +71046 -1.000000 +71047 -1.000000 +71048 -1.000000 +71049 -1.000000 +71050 -1.000000 +71051 -1.000000 +71052 -1.000000 +71053 -1.000000 +71054 -1.000000 +71055 -1.000000 +71056 -1.000000 +71057 -1.000000 +71058 -1.000000 +71059 -1.000000 +71060 -1.000000 +71061 -1.000000 +71062 -1.000000 +71063 -1.000000 +71064 -1.000000 +71065 -1.000000 +71066 -1.000000 +71067 -1.000000 +71068 -1.000000 +71069 -1.000000 +71070 -1.000000 +71071 -1.000000 +71072 -1.000000 +71073 -1.000000 +71074 -1.000000 +71075 -1.000000 +71076 -1.000000 +71077 -1.000000 +71078 -1.000000 +71079 -1.000000 +71080 -1.000000 +71081 -1.000000 +71082 -1.000000 +71083 -1.000000 +71084 -1.000000 +71085 -1.000000 +71086 -1.000000 +71087 -1.000000 +71088 -1.000000 +71089 -1.000000 +71090 -1.000000 +71091 -1.000000 +71092 -1.000000 +71093 -1.000000 +71094 -1.000000 +71095 -1.000000 +71096 -1.000000 +71097 -1.000000 +71098 -1.000000 +71099 -1.000000 +71100 -1.000000 +71101 -1.000000 +71102 -1.000000 +71103 -1.000000 +71104 -1.000000 +71105 -1.000000 +71106 -1.000000 +71107 -1.000000 +71108 -1.000000 +71109 -1.000000 +71110 -1.000000 +71111 -1.000000 +71112 -1.000000 +71114 -1.000000 +71115 -1.000000 +71116 -1.000000 +71117 -1.000000 +71118 -1.000000 +71119 -1.000000 +71120 -1.000000 +71121 -1.000000 +71122 -1.000000 +71123 -1.000000 +71124 -1.000000 +71125 -1.000000 +71126 -1.000000 +71127 -1.000000 +71128 -1.000000 +71129 -1.000000 +71130 -1.000000 +71131 -1.000000 +71132 -1.000000 +71133 -1.000000 +71134 -1.000000 +71135 -1.000000 +71136 -1.000000 +71137 -1.000000 +71138 -1.000000 +71139 -1.000000 +71140 -1.000000 +71141 -1.000000 +71142 -1.000000 +71143 -1.000000 +71144 -1.000000 +71145 -1.000000 +71146 -1.000000 +71147 -1.000000 +71148 -1.000000 +71149 -1.000000 +71150 -1.000000 +71151 -1.000000 +71152 -1.000000 +71153 -1.000000 +71154 -1.000000 +71155 -1.000000 +71156 -1.000000 +71157 -1.000000 +71158 -1.000000 +71159 -1.000000 +71160 -1.000000 +71161 -1.000000 +71162 -1.000000 +71163 -1.000000 +71164 -1.000000 +71165 -1.000000 +71166 -1.000000 +71167 -1.000000 +71168 -1.000000 +71169 -1.000000 +71170 -1.000000 +71171 -1.000000 +71172 -1.000000 +71173 -1.000000 +71174 -1.000000 +71175 -1.000000 +71176 -1.000000 +71177 -1.000000 +71178 -1.000000 +71179 -1.000000 +71180 -1.000000 +71181 -1.000000 +71182 -1.000000 +71183 -1.000000 +71184 -1.000000 +71185 -1.000000 +71186 -1.000000 +71187 -1.000000 +71188 -1.000000 +71189 -1.000000 +71190 -1.000000 +71191 -1.000000 +71192 -1.000000 +71193 -1.000000 +71194 -1.000000 +71195 -1.000000 +71196 -1.000000 +71197 -1.000000 +71198 -1.000000 +71199 -1.000000 +71200 -1.000000 +71201 -1.000000 +71202 -1.000000 +71203 -1.000000 +71204 -1.000000 +71205 -1.000000 +71206 -1.000000 +71207 -1.000000 +71208 -1.000000 +71209 -1.000000 +71210 -1.000000 +71211 -1.000000 +71212 -1.000000 +71213 -1.000000 +71214 -1.000000 +71215 -1.000000 +71216 -1.000000 +71217 -1.000000 +71218 -1.000000 +71219 -1.000000 +71220 -1.000000 +71221 -1.000000 +71222 -1.000000 +71223 -1.000000 +71224 -1.000000 +71225 -1.000000 +71226 -1.000000 +71227 -1.000000 +71228 -1.000000 +71229 -1.000000 +71230 -1.000000 +71231 -1.000000 +71232 -1.000000 +71233 -1.000000 +71234 -1.000000 +71235 -1.000000 +71236 -1.000000 +71237 -1.000000 +71238 -1.000000 +71239 -1.000000 +71240 -1.000000 +71241 -1.000000 +71242 -1.000000 +71243 -1.000000 +71244 -1.000000 +71245 -1.000000 +71246 -1.000000 +71247 -1.000000 +71248 -1.000000 +71249 -1.000000 +71250 -1.000000 +71251 -1.000000 +71252 -1.000000 +71253 -1.000000 +71254 -1.000000 +71255 -1.000000 +71256 -1.000000 +71257 -1.000000 +71258 -1.000000 +71259 -1.000000 +71260 -1.000000 +71262 -1.000000 +71263 -1.000000 +71264 -1.000000 +71265 -1.000000 +71266 -1.000000 +71267 -1.000000 +71268 -1.000000 +71269 -1.000000 +71270 -1.000000 +71271 -1.000000 +71272 -1.000000 +71273 -1.000000 +71274 -1.000000 +71275 -1.000000 +71276 -1.000000 +71277 -1.000000 +71278 -1.000000 +71279 -1.000000 +71280 -1.000000 +71281 -1.000000 +71282 -1.000000 +71283 -1.000000 +71284 -1.000000 +71285 -1.000000 +71286 -1.000000 +71287 -1.000000 +71288 -1.000000 +71289 -1.000000 +71290 -1.000000 +71291 -1.000000 +71292 -1.000000 +71293 -1.000000 +71294 -1.000000 +71295 -1.000000 +71296 -1.000000 +71297 -1.000000 +71298 -1.000000 +71299 -1.000000 +71300 -1.000000 +71301 -1.000000 +71302 -1.000000 +71303 -1.000000 +71304 -1.000000 +71305 -1.000000 +71306 -1.000000 +71307 -1.000000 +71308 -1.000000 +71309 -1.000000 +71310 -1.000000 +71311 -1.000000 +71312 -1.000000 +71313 -1.000000 +71314 -1.000000 +71315 -1.000000 +71316 -1.000000 +71317 -1.000000 +71318 -1.000000 +71319 -1.000000 +71320 -1.000000 +71321 -1.000000 +71322 -1.000000 +71323 -1.000000 +71324 -1.000000 +71325 -1.000000 +71326 -1.000000 +71327 -1.000000 +71328 -1.000000 +71329 -1.000000 +71330 -1.000000 +71331 -1.000000 +71332 -1.000000 +71333 -1.000000 +71334 -1.000000 +71335 -1.000000 +71336 -1.000000 +71337 -1.000000 +71338 -1.000000 +71339 -1.000000 +71340 -1.000000 +71341 -1.000000 +71342 -1.000000 +71343 -1.000000 +71344 -1.000000 +71345 -1.000000 +71346 -1.000000 +71347 -1.000000 +71348 -1.000000 +71349 -1.000000 +71350 -1.000000 +71351 -1.000000 +71352 -1.000000 +71353 -1.000000 +71354 -1.000000 +71355 -1.000000 +71356 -1.000000 +71357 -1.000000 +71358 -1.000000 +71359 -1.000000 +71360 -1.000000 +71361 -1.000000 +71362 -1.000000 +71363 -1.000000 +71364 -1.000000 +71365 -1.000000 +71366 -1.000000 +71367 -1.000000 +71368 -1.000000 +71369 -1.000000 +71370 -1.000000 +71371 -1.000000 +71372 -1.000000 +71373 -1.000000 +71374 -1.000000 +71375 -1.000000 +71376 -1.000000 +71377 -1.000000 +71378 -1.000000 +71379 -1.000000 +71380 -1.000000 +71381 -1.000000 +71382 -1.000000 +71383 -1.000000 +71384 -1.000000 +71385 -1.000000 +71386 -1.000000 +71387 -1.000000 +71388 -1.000000 +71389 -1.000000 +71390 -1.000000 +71391 -1.000000 +71392 -1.000000 +71393 -1.000000 +71394 -1.000000 +71395 -1.000000 +71396 -1.000000 +71397 -1.000000 +71398 -1.000000 +71400 -1.000000 +71401 -1.000000 +71402 -1.000000 +71403 -1.000000 +71404 -1.000000 +71405 -1.000000 +71406 -1.000000 +71407 -1.000000 +71408 -1.000000 +71412 -1.000000 +71413 -1.000000 +71414 -1.000000 +71415 -1.000000 +71416 -1.000000 +71417 -1.000000 +71418 -1.000000 +71419 -1.000000 +71420 -1.000000 +71421 -1.000000 +71422 -1.000000 +71423 -1.000000 +71424 -1.000000 +71425 -1.000000 +71426 -1.000000 +71427 -1.000000 +71428 -1.000000 +71429 -1.000000 +71430 -1.000000 +71431 -1.000000 +71432 -1.000000 +71433 -1.000000 +71434 -1.000000 +71435 -1.000000 +71436 -1.000000 +71437 -1.000000 +71438 -1.000000 +71439 -1.000000 +71440 -1.000000 +71441 -1.000000 +71442 -1.000000 +71443 -1.000000 +71444 -1.000000 +71445 -1.000000 +71446 -1.000000 +71447 -1.000000 +71448 -1.000000 +71449 -1.000000 +71450 -1.000000 +71451 -1.000000 +71452 -1.000000 +71453 -1.000000 +71454 -1.000000 +71455 -1.000000 +71456 -1.000000 +71457 -1.000000 +71459 -1.000000 +71460 -1.000000 +71461 -1.000000 +71462 -1.000000 +71463 -1.000000 +71464 -1.000000 +71465 -1.000000 +71466 -1.000000 +71467 -1.000000 +71468 -1.000000 +71469 -1.000000 +71470 -1.000000 +71471 -1.000000 +71472 -1.000000 +71473 -1.000000 +71474 -1.000000 +71475 -1.000000 +71476 -1.000000 +71477 -1.000000 +71478 -1.000000 +71479 -1.000000 +71480 -1.000000 +71481 -1.000000 +71482 -1.000000 +71483 -1.000000 +71484 -1.000000 +71485 -1.000000 +71486 -1.000000 +71487 -1.000000 +71488 -1.000000 +71489 -1.000000 +71490 -1.000000 +71491 -1.000000 +71492 -1.000000 +71493 -1.000000 +71494 -1.000000 +71495 -1.000000 +71496 -1.000000 +71497 -1.000000 +71498 -1.000000 +71499 -1.000000 +71500 -1.000000 +71501 -1.000000 +71502 -1.000000 +71503 -1.000000 +71504 -1.000000 +71505 -1.000000 +71506 -1.000000 +71507 -1.000000 +71508 -1.000000 +71509 -1.000000 +71510 -1.000000 +71511 -1.000000 +71512 -1.000000 +71513 -1.000000 +71514 -1.000000 +71515 -1.000000 +71516 -1.000000 +71517 -1.000000 +71518 -1.000000 +71519 -1.000000 +71520 -1.000000 +71521 -1.000000 +71522 -1.000000 +71523 -1.000000 +71524 -1.000000 +71525 -1.000000 +71526 -1.000000 +71527 -1.000000 +71528 -1.000000 +71529 -1.000000 +71530 -1.000000 +71531 -1.000000 +71532 -1.000000 +71533 -1.000000 +71534 -1.000000 +71535 -1.000000 +71536 -1.000000 +71537 -1.000000 +71538 -1.000000 +71539 -1.000000 +71540 -1.000000 +71541 -1.000000 +71542 -1.000000 +71543 -1.000000 +71544 -1.000000 +71545 -1.000000 +71546 -1.000000 +71547 -1.000000 +71548 -1.000000 +71549 -1.000000 +71550 -1.000000 +71551 -1.000000 +71552 -1.000000 +71554 -1.000000 +71555 -1.000000 +71556 -1.000000 +71557 -1.000000 +71558 -1.000000 +71559 -1.000000 +71560 -1.000000 +71561 -1.000000 +71562 -1.000000 +71563 -1.000000 +71564 -1.000000 +71565 -1.000000 +71566 -1.000000 +71567 -1.000000 +71568 -1.000000 +71569 -1.000000 +71570 -1.000000 +71571 -1.000000 +71572 -1.000000 +71573 -1.000000 +71574 -1.000000 +71575 -1.000000 +71576 -1.000000 +71577 -1.000000 +71578 -1.000000 +71579 -1.000000 +71580 -1.000000 +71581 -1.000000 +71582 -1.000000 +71583 -1.000000 +71584 -1.000000 +71585 -1.000000 +71586 -1.000000 +71587 -1.000000 +71588 -1.000000 +71589 -1.000000 +71590 -1.000000 +71591 -1.000000 +71592 -1.000000 +71593 -1.000000 +71594 -1.000000 +71595 -1.000000 +71596 -1.000000 +71597 -1.000000 +71598 -1.000000 +71599 -1.000000 +71600 -1.000000 +71601 -1.000000 +71602 -1.000000 +71603 -1.000000 +71604 -1.000000 +71605 -1.000000 +71606 -1.000000 +71607 -1.000000 +71608 -1.000000 +71609 -1.000000 +71610 -1.000000 +71611 -1.000000 +71612 -1.000000 +71613 -1.000000 +71614 -1.000000 +71615 -1.000000 +71616 -1.000000 +71617 -1.000000 +71618 -1.000000 +71619 -1.000000 +71620 -1.000000 +71621 -1.000000 +71622 -1.000000 +71623 -1.000000 +71624 -1.000000 +71625 -1.000000 +71626 -1.000000 +71627 -1.000000 +71628 -1.000000 +71629 -1.000000 +71630 -1.000000 +71631 -1.000000 +71632 -1.000000 +71633 -1.000000 +71634 -1.000000 +71635 -1.000000 +71636 -1.000000 +71637 -1.000000 +71638 -1.000000 +71639 -1.000000 +71640 -1.000000 +71641 -1.000000 +71642 -1.000000 +71643 -1.000000 +71644 -1.000000 +71645 -1.000000 +71646 -1.000000 +71647 -1.000000 +71648 -1.000000 +71649 -1.000000 +71650 -1.000000 +71651 -1.000000 +71652 -1.000000 +71653 -1.000000 +71654 -1.000000 +71655 -1.000000 +71656 -1.000000 +71657 -1.000000 +71659 -1.000000 +71660 -1.000000 +71661 -1.000000 +71662 -1.000000 +71663 -1.000000 +71664 -1.000000 +71665 -1.000000 +71666 -1.000000 +71667 -1.000000 +71668 -1.000000 +71669 -1.000000 +71670 -1.000000 +71671 -1.000000 +71672 -1.000000 +71673 -1.000000 +71674 -1.000000 +71675 -1.000000 +71676 -1.000000 +71677 -1.000000 +71678 -1.000000 +71679 -1.000000 +71680 -1.000000 +71681 -1.000000 +71682 -1.000000 +71683 -1.000000 +71684 -1.000000 +71685 -1.000000 +71686 -1.000000 +71687 -1.000000 +71688 -1.000000 +71689 -1.000000 +71690 -1.000000 +71691 -1.000000 +71692 -1.000000 +71693 -1.000000 +71694 -1.000000 +71695 -1.000000 +71696 -1.000000 +71697 -1.000000 +71698 -1.000000 +71699 -1.000000 +71700 -1.000000 +71701 -1.000000 +71702 -1.000000 +71703 -1.000000 +71704 -1.000000 +71705 -1.000000 +71706 -1.000000 +71707 -1.000000 +71708 -1.000000 +71709 -1.000000 +71710 -1.000000 +71711 -1.000000 +71712 -1.000000 +71713 -1.000000 +71714 -1.000000 +71715 -1.000000 +71716 -1.000000 +71717 -1.000000 +71718 -1.000000 +71719 -1.000000 +71720 -1.000000 +71721 -1.000000 +71722 -1.000000 +71723 -1.000000 +71724 -1.000000 +71725 -1.000000 +71726 -1.000000 +71727 -1.000000 +71728 -1.000000 +71729 -1.000000 +71730 -1.000000 +71731 -1.000000 +71732 -1.000000 +71733 -1.000000 +71734 -1.000000 +71735 -1.000000 +71736 -1.000000 +71737 -1.000000 +71738 -1.000000 +71739 -1.000000 +71740 -1.000000 +71741 -1.000000 +71742 -1.000000 +71743 -1.000000 +71744 -1.000000 +71745 -1.000000 +71746 -1.000000 +71747 -1.000000 +71748 -1.000000 +71749 -1.000000 +71750 -1.000000 +71751 -1.000000 +71752 -1.000000 +71753 -1.000000 +71754 -1.000000 +71755 -1.000000 +71756 -1.000000 +71757 -1.000000 +71758 -1.000000 +71759 -1.000000 +71760 -1.000000 +71762 -1.000000 +71763 -1.000000 +71764 -1.000000 +71765 -1.000000 +71766 -1.000000 +71767 -1.000000 +71768 -1.000000 +71770 -1.000000 +71771 -1.000000 +71772 -1.000000 +71773 -1.000000 +71774 -1.000000 +71775 -1.000000 +71776 -1.000000 +71777 -1.000000 +71778 -1.000000 +71779 -1.000000 +71780 -1.000000 +71781 -1.000000 +71782 -1.000000 +71783 -1.000000 +71784 -1.000000 +71785 -1.000000 +71786 -1.000000 +71787 -1.000000 +71788 -1.000000 +71789 -1.000000 +71790 -1.000000 +71791 -1.000000 +71792 -1.000000 +71793 -1.000000 +71794 -1.000000 +71795 -1.000000 +71796 -1.000000 +71797 -1.000000 +71798 -1.000000 +71799 -1.000000 +71800 -1.000000 +71801 -1.000000 +71802 -1.000000 +71803 -1.000000 +71804 -1.000000 +71805 -1.000000 +71806 -1.000000 +71808 -1.000000 +71809 -1.000000 +71815 -1.000000 +71816 -1.000000 +71817 -1.000000 +71819 -1.000000 +71820 -1.000000 +71822 -1.000000 +71823 -1.000000 +71824 -1.000000 +71825 -1.000000 +71826 -1.000000 +71827 -1.000000 +71828 -1.000000 +71829 -1.000000 +71830 -1.000000 +71831 -1.000000 +71832 -1.000000 +71833 -1.000000 +71834 -1.000000 +71835 -1.000000 +71836 -1.000000 +71837 -1.000000 +71838 -1.000000 +71839 -1.000000 +71840 -1.000000 +71841 -1.000000 +71842 -1.000000 +71843 -1.000000 +71844 -1.000000 +71845 -1.000000 +71846 -1.000000 +71847 -1.000000 +71848 -1.000000 +71849 -1.000000 +71850 -1.000000 +71851 -1.000000 +71852 -1.000000 +71853 -1.000000 +71854 -1.000000 +71855 -1.000000 +71856 -1.000000 +71857 -1.000000 +71858 -1.000000 +71859 -1.000000 +71860 -1.000000 +71861 -1.000000 +71862 -1.000000 +71863 -1.000000 +71864 -1.000000 +71865 -1.000000 +71866 -1.000000 +71867 -1.000000 +71868 -1.000000 +71869 -1.000000 +71870 -1.000000 +71871 -1.000000 +71872 -1.000000 +71873 -1.000000 +71874 -1.000000 +71875 -1.000000 +71876 -1.000000 +71877 -1.000000 +71878 -1.000000 +71879 -1.000000 +71880 -1.000000 +71881 -1.000000 +71882 -1.000000 +71883 -1.000000 +71884 -1.000000 +71885 -1.000000 +71886 -1.000000 +71887 -1.000000 +71888 -1.000000 +71889 -1.000000 +71890 -1.000000 +71891 -1.000000 +71892 -1.000000 +71893 -1.000000 +71894 -1.000000 +71895 -1.000000 +71896 -1.000000 +71897 -1.000000 +71898 -1.000000 +71899 -1.000000 +71900 -1.000000 +71901 -1.000000 +71902 -1.000000 +71903 -1.000000 +71904 -1.000000 +71905 -1.000000 +71906 -1.000000 +71907 -1.000000 +71908 -1.000000 +71909 -1.000000 +71910 -1.000000 +71911 -1.000000 +71912 -1.000000 +71913 -1.000000 +71914 -1.000000 +71915 -1.000000 +71916 -1.000000 +71917 -1.000000 +71918 -1.000000 +71919 -1.000000 +71920 -1.000000 +71921 -1.000000 +71922 -1.000000 +71923 -1.000000 +71924 -1.000000 +71925 -1.000000 +71926 -1.000000 +71927 -1.000000 +71928 -1.000000 +71929 -1.000000 +71930 -1.000000 +71931 -1.000000 +71932 -1.000000 +71933 -1.000000 +71934 -1.000000 +71935 -1.000000 +71936 -1.000000 +71937 -1.000000 +71938 -1.000000 +71939 -1.000000 +71940 -1.000000 +71941 -1.000000 +71942 -1.000000 +71943 -1.000000 +71944 -1.000000 +71945 -1.000000 +71946 -1.000000 +71947 -1.000000 +71948 -1.000000 +71949 -1.000000 +71950 -1.000000 +71951 -1.000000 +71952 -1.000000 +71953 -1.000000 +71954 -1.000000 +71955 -1.000000 +71956 -1.000000 +71957 -1.000000 +71958 -1.000000 +71959 -1.000000 +71960 -1.000000 +71961 -1.000000 +71962 -1.000000 +71963 -1.000000 +71964 -1.000000 +71965 -1.000000 +71966 -1.000000 +71967 -1.000000 +71968 -1.000000 +71969 -1.000000 +71970 -1.000000 +71971 -1.000000 +71972 -1.000000 +71973 -1.000000 +71974 -1.000000 +71975 -1.000000 +71976 -1.000000 +71977 -1.000000 +71978 -1.000000 +71979 -1.000000 +71980 -1.000000 +71981 -1.000000 +71982 -1.000000 +71983 -1.000000 +71984 -1.000000 +71985 -1.000000 +71986 -1.000000 +71987 -1.000000 +71988 -1.000000 +71989 -1.000000 +71990 -1.000000 +71991 -1.000000 +71992 -1.000000 +71993 -1.000000 +71994 -1.000000 +71995 -1.000000 +71996 -1.000000 +71997 -1.000000 +71998 -1.000000 +71999 -1.000000 +72000 -1.000000 +72001 -1.000000 +72002 -1.000000 +72003 -1.000000 +72004 -1.000000 +72005 -1.000000 +72006 -1.000000 +72007 -1.000000 +72008 -1.000000 +72009 -1.000000 +72010 -1.000000 +72011 -1.000000 +72012 -1.000000 +72013 -1.000000 +72014 -1.000000 +72015 -1.000000 +72016 -1.000000 +72017 -1.000000 +72018 -1.000000 +72019 -1.000000 +72020 -1.000000 +72021 -1.000000 +72022 -1.000000 +72023 -1.000000 +72024 -1.000000 +72025 -1.000000 +72026 -1.000000 +72027 -1.000000 +72028 -1.000000 +72029 -1.000000 +72030 -1.000000 +72031 -1.000000 +72032 -1.000000 +72033 -1.000000 +72034 -1.000000 +72035 -1.000000 +72036 -1.000000 +72037 -1.000000 +72038 -1.000000 +72039 -1.000000 +72040 -1.000000 +72041 -1.000000 +72042 -1.000000 +72043 -1.000000 +72044 -1.000000 +72045 -1.000000 +72046 -1.000000 +72047 -1.000000 +72048 -1.000000 +72049 -1.000000 +72050 -1.000000 +72051 -1.000000 +72052 -1.000000 +72053 -1.000000 +72054 -1.000000 +72055 -1.000000 +72056 -1.000000 +72057 -1.000000 +72058 -1.000000 +72059 -1.000000 +72060 -1.000000 +72061 -1.000000 +72062 -1.000000 +72063 -1.000000 +72064 -1.000000 +72065 -1.000000 +72066 -1.000000 +72067 -1.000000 +72068 -1.000000 +72069 -1.000000 +72070 -1.000000 +72071 -1.000000 +72072 -1.000000 +72073 -1.000000 +72074 -1.000000 +72075 -1.000000 +72076 -1.000000 +72077 -1.000000 +72078 -1.000000 +72079 -1.000000 +72080 -1.000000 +72081 -1.000000 +72082 -1.000000 +72083 -1.000000 +72084 -1.000000 +72085 -1.000000 +72086 -1.000000 +72087 -1.000000 +72088 -1.000000 +72089 -1.000000 +72090 -1.000000 +72091 -1.000000 +72092 -1.000000 +72093 -1.000000 +72094 -1.000000 +72095 -1.000000 +72096 -1.000000 +72097 -1.000000 +72098 -1.000000 +72099 -1.000000 +72100 -1.000000 +72101 -1.000000 +72102 -1.000000 +72103 -1.000000 +72104 -1.000000 +72105 -1.000000 +72106 -1.000000 +72107 -1.000000 +72108 -1.000000 +72109 -1.000000 +72110 -1.000000 +72111 -1.000000 +72112 -1.000000 +72113 -1.000000 +72114 -1.000000 +72115 -1.000000 +72116 -1.000000 +72117 -1.000000 +72118 -1.000000 +72119 -1.000000 +72120 -1.000000 +72121 -1.000000 +72122 -1.000000 +72123 -1.000000 +72124 -1.000000 +72125 -1.000000 +72126 -1.000000 +72127 -1.000000 +72128 -1.000000 +72129 -1.000000 +72130 -1.000000 +72131 -1.000000 +72132 -1.000000 +72133 -1.000000 +72134 -1.000000 +72135 -1.000000 +72136 -1.000000 +72137 -1.000000 +72138 -1.000000 +72139 -1.000000 +72140 -1.000000 +72141 -1.000000 +72142 -1.000000 +72143 -1.000000 +72144 -1.000000 +72145 -1.000000 +72146 -1.000000 +72147 -1.000000 +72148 -1.000000 +72149 -1.000000 +72150 -1.000000 +72151 -1.000000 +72152 -1.000000 +72153 -1.000000 +72154 -1.000000 +72155 -1.000000 +72156 -1.000000 +72157 -1.000000 +72158 -1.000000 +72159 -1.000000 +72160 -1.000000 +72161 -1.000000 +72162 -1.000000 +72163 -1.000000 +72164 -1.000000 +72165 -1.000000 +72166 -1.000000 +72167 -1.000000 +72168 -1.000000 +72169 -1.000000 +72170 -1.000000 +72171 -1.000000 +72172 -1.000000 +72173 -1.000000 +72174 -1.000000 +72175 -1.000000 +72176 -1.000000 +72177 -1.000000 +72178 -1.000000 +72179 -1.000000 +72180 -1.000000 +72181 -1.000000 +72182 -1.000000 +72183 -1.000000 +72184 -1.000000 +72185 -1.000000 +72186 -1.000000 +72187 -1.000000 +72188 -1.000000 +72189 -1.000000 +72190 -1.000000 +72191 -1.000000 +72192 -1.000000 +72193 -1.000000 +72194 -1.000000 +72195 -1.000000 +72196 -1.000000 +72197 -1.000000 +72198 -1.000000 +72199 -1.000000 +72200 -1.000000 +72201 -1.000000 +72202 -1.000000 +72203 -1.000000 +72204 -1.000000 +72205 -1.000000 +72206 -1.000000 +72207 -1.000000 +72208 -1.000000 +72209 -1.000000 +72210 -1.000000 +72211 -1.000000 +72212 -1.000000 +72213 -1.000000 +72214 -1.000000 +72215 -1.000000 +72216 -1.000000 +72217 -1.000000 +72218 -1.000000 +72219 -1.000000 +72220 -1.000000 +72221 -1.000000 +72222 -1.000000 +72223 -1.000000 +72224 -1.000000 +72225 -1.000000 +72226 -1.000000 +72227 -1.000000 +72228 -1.000000 +72232 -1.000000 +72233 -1.000000 +72234 -1.000000 +72235 -1.000000 +72236 -1.000000 +72237 -1.000000 +72238 -1.000000 +72239 -1.000000 +72240 -1.000000 +72241 -1.000000 +72242 -1.000000 +72243 -1.000000 +72244 -1.000000 +72245 -1.000000 +72246 -1.000000 +72247 -1.000000 +72248 -1.000000 +72249 -1.000000 +72250 -1.000000 +72251 -1.000000 +72254 -1.000000 +72255 -1.000000 +72256 -1.000000 +72257 -1.000000 +72258 -1.000000 +72259 -1.000000 +72260 -1.000000 +72261 -1.000000 +72262 -1.000000 +72263 -1.000000 +72264 -1.000000 +72265 -1.000000 +72266 -1.000000 +72267 -1.000000 +72268 -1.000000 +72269 -1.000000 +72270 -1.000000 +72271 -1.000000 +72272 -1.000000 +72273 -1.000000 +72274 -1.000000 +72275 -1.000000 +72276 -1.000000 +72277 -1.000000 +72278 -1.000000 +72279 -1.000000 +72280 -1.000000 +72281 -1.000000 +72282 -1.000000 +72283 -1.000000 +72284 -1.000000 +72285 -1.000000 +72286 -1.000000 +72287 -1.000000 +72288 -1.000000 +72289 -1.000000 +72290 -1.000000 +72291 -1.000000 +72292 -1.000000 +72293 -1.000000 +72294 -1.000000 +72295 -1.000000 +72296 -1.000000 +72297 -1.000000 +72298 -1.000000 +72299 -1.000000 +72300 -1.000000 +72301 -1.000000 +72302 -1.000000 +72303 -1.000000 +72304 -1.000000 +72305 -1.000000 +72306 -1.000000 +72307 -1.000000 +72308 -1.000000 +72309 -1.000000 +72310 -1.000000 +72311 -1.000000 +72312 -1.000000 +72313 -1.000000 +72314 -1.000000 +72315 -1.000000 +72316 -1.000000 +72317 -1.000000 +72318 -1.000000 +72319 -1.000000 +72320 -1.000000 +72321 -1.000000 +72322 -1.000000 +72323 -1.000000 +72324 -1.000000 +72325 -1.000000 +72326 -1.000000 +72327 -1.000000 +72328 -1.000000 +72329 -1.000000 +72330 -1.000000 +72331 -1.000000 +72332 -1.000000 +72333 -1.000000 +72334 -1.000000 +72335 -1.000000 +72336 -1.000000 +72337 -1.000000 +72338 -1.000000 +72339 -1.000000 +72340 -1.000000 +72341 -1.000000 +72342 -1.000000 +72343 -1.000000 +72344 -1.000000 +72345 -1.000000 +72346 -1.000000 +72347 -1.000000 +72348 -1.000000 +72349 -1.000000 +72350 -1.000000 +72351 -1.000000 +72352 -1.000000 +72353 -1.000000 +72354 -1.000000 +72355 -1.000000 +72356 -1.000000 +72357 -1.000000 +72358 -1.000000 +72360 -1.000000 +72361 -1.000000 +72362 -1.000000 +72363 -1.000000 +72364 -1.000000 +72365 -1.000000 +72366 -1.000000 +72367 -1.000000 +72368 -1.000000 +72369 -1.000000 +72370 -1.000000 +72371 -1.000000 +72372 -1.000000 +72373 -1.000000 +72374 -1.000000 +72375 -1.000000 +72376 -1.000000 +72377 -1.000000 +72378 -1.000000 +72379 -1.000000 +72380 -1.000000 +72381 -1.000000 +72382 -1.000000 +72383 -1.000000 +72384 -1.000000 +72385 -1.000000 +72386 -1.000000 +72387 -1.000000 +72388 -1.000000 +72389 -1.000000 +72390 -1.000000 +72391 -1.000000 +72392 -1.000000 +72393 -1.000000 +72394 -1.000000 +72395 -1.000000 +72396 -1.000000 +72398 -1.000000 +72399 -1.000000 +72400 -1.000000 +72401 -1.000000 +72402 -1.000000 +72403 -1.000000 +72404 -1.000000 +72405 -1.000000 +72406 -1.000000 +72407 -1.000000 +72408 -1.000000 +72409 -1.000000 +72410 -1.000000 +72411 -1.000000 +72412 -1.000000 +72413 -1.000000 +72415 -1.000000 +72416 -1.000000 +72417 -1.000000 +72418 -1.000000 +72419 -1.000000 +72420 -1.000000 +72421 -1.000000 +72422 -1.000000 +72423 -1.000000 +72424 -1.000000 +72425 -1.000000 +72426 -1.000000 +72427 -1.000000 +72428 -1.000000 +72429 -1.000000 +72430 -1.000000 +72431 -1.000000 +72432 -1.000000 +72433 -1.000000 +72434 -1.000000 +72435 -1.000000 +72436 -1.000000 +72437 -1.000000 +72438 -1.000000 +72439 -1.000000 +72440 -1.000000 +72441 -1.000000 +72442 -1.000000 +72443 -1.000000 +72444 -1.000000 +72445 -1.000000 +72446 -1.000000 +72447 -1.000000 +72448 -1.000000 +72449 -1.000000 +72450 -1.000000 +72451 -1.000000 +72452 -1.000000 +72453 -1.000000 +72454 -1.000000 +72455 -1.000000 +72456 -1.000000 +72457 -1.000000 +72458 -1.000000 +72459 -1.000000 +72460 -1.000000 +72461 -1.000000 +72462 -1.000000 +72463 -1.000000 +72464 -1.000000 +72465 -1.000000 +72466 -1.000000 +72467 -1.000000 +72468 -1.000000 +72469 -1.000000 +72470 -1.000000 +72471 -1.000000 +72472 -1.000000 +72473 -1.000000 +72474 -1.000000 +72475 -1.000000 +72476 -1.000000 +72477 -1.000000 +72478 -1.000000 +72479 -1.000000 +72480 -1.000000 +72481 -1.000000 +72482 -1.000000 +72483 -1.000000 +72484 -1.000000 +72485 -1.000000 +72486 -1.000000 +72487 -1.000000 +72488 -1.000000 +72489 -1.000000 +72490 -1.000000 +72491 -1.000000 +72492 -1.000000 +72493 -1.000000 +72494 -1.000000 +72495 -1.000000 +72496 -1.000000 +72497 -1.000000 +72498 -1.000000 +72499 -1.000000 +72500 -1.000000 +72501 -1.000000 +72502 -1.000000 +72503 -1.000000 +72504 -1.000000 +72505 -1.000000 +72506 -1.000000 +72507 -1.000000 +72508 -1.000000 +72509 -1.000000 +72510 -1.000000 +72511 -1.000000 +72512 -1.000000 +72513 -1.000000 +72514 -1.000000 +72515 -1.000000 +72516 -1.000000 +72517 -1.000000 +72518 -1.000000 +72519 -1.000000 +72520 -1.000000 +72521 -1.000000 +72522 -1.000000 +72523 -1.000000 +72524 -1.000000 +72525 -1.000000 +72526 -1.000000 +72527 -1.000000 +72528 -1.000000 +72529 -1.000000 +72530 -1.000000 +72531 -1.000000 +72532 -1.000000 +72533 -1.000000 +72534 -1.000000 +72535 -1.000000 +72536 -1.000000 +72537 -1.000000 +72538 -1.000000 +72539 -1.000000 +72540 -1.000000 +72541 -1.000000 +72542 -1.000000 +72543 -1.000000 +72544 -1.000000 +72545 -1.000000 +72546 -1.000000 +72547 -1.000000 +72548 -1.000000 +72549 -1.000000 +72550 -1.000000 +72551 -1.000000 +72552 -1.000000 +72553 -1.000000 +72554 -1.000000 +72555 -1.000000 +72556 -1.000000 +72557 -1.000000 +72558 -1.000000 +72559 -1.000000 +72560 -1.000000 +72561 -1.000000 +72562 -1.000000 +72563 -1.000000 +72564 -1.000000 +72565 -1.000000 +72566 -1.000000 +72567 -1.000000 +72568 -1.000000 +72569 -1.000000 +72570 -1.000000 +72571 -1.000000 +72572 -1.000000 +72573 -1.000000 +72574 -1.000000 +72575 -1.000000 +72576 -1.000000 +72577 -1.000000 +72578 -1.000000 +72579 -1.000000 +72580 -1.000000 +72581 -1.000000 +72582 -1.000000 +72583 -1.000000 +72584 -1.000000 +72585 -1.000000 +72586 -1.000000 +72587 -1.000000 +72588 -1.000000 +72589 -1.000000 +72590 -1.000000 +72591 -1.000000 +72592 -1.000000 +72593 -1.000000 +72594 -1.000000 +72595 -1.000000 +72596 -1.000000 +72597 -1.000000 +72598 -1.000000 +72599 -1.000000 +72600 -1.000000 +72601 -1.000000 +72602 -1.000000 +72603 -1.000000 +72604 -1.000000 +72605 -1.000000 +72606 -1.000000 +72607 -1.000000 +72608 -1.000000 +72609 -1.000000 +72610 -1.000000 +72611 -1.000000 +72612 -1.000000 +72613 -1.000000 +72614 -1.000000 +72615 -1.000000 +72616 -1.000000 +72617 -1.000000 +72618 -1.000000 +72619 -1.000000 +72620 -1.000000 +72621 -1.000000 +72622 -1.000000 +72623 -1.000000 +72624 -1.000000 +72625 -1.000000 +72626 -1.000000 +72627 -1.000000 +72628 -1.000000 +72629 -1.000000 +72630 -1.000000 +72631 -1.000000 +72632 -1.000000 +72633 -1.000000 +72634 -1.000000 +72635 -1.000000 +72636 -1.000000 +72637 -1.000000 +72638 -1.000000 +72639 -1.000000 +72640 -1.000000 +72641 -1.000000 +72642 -1.000000 +72643 -1.000000 +72644 -1.000000 +72645 -1.000000 +72646 -1.000000 +72647 -1.000000 +72648 -1.000000 +72649 -1.000000 +72650 -1.000000 +72651 -1.000000 +72652 -1.000000 +72653 -1.000000 +72654 -1.000000 +72656 -1.000000 +72657 -1.000000 +72658 -1.000000 +72659 -1.000000 +72660 -1.000000 +72661 -1.000000 +72662 -1.000000 +72663 -1.000000 +72664 -1.000000 +72665 -1.000000 +72666 -1.000000 +72667 -1.000000 +72668 -1.000000 +72669 -1.000000 +72670 -1.000000 +72671 -1.000000 +72672 -1.000000 +72673 -1.000000 +72674 -1.000000 +72675 -1.000000 +72676 -1.000000 +72677 -1.000000 +72678 -1.000000 +72679 -1.000000 +72680 -1.000000 +72681 -1.000000 +72682 -1.000000 +72683 -1.000000 +72684 -1.000000 +72685 -1.000000 +72686 -1.000000 +72687 -1.000000 +72689 -1.000000 +72690 -1.000000 +72691 -1.000000 +72692 -1.000000 +72693 -1.000000 +72694 -1.000000 +72695 -1.000000 +72696 -1.000000 +72697 -1.000000 +72698 -1.000000 +72699 -1.000000 +72700 -1.000000 +72701 -1.000000 +72702 -1.000000 +72703 -1.000000 +72704 -1.000000 +72705 -1.000000 +72706 -1.000000 +72707 -1.000000 +72708 -1.000000 +72709 -1.000000 +72710 -1.000000 +72711 -1.000000 +72712 -1.000000 +72713 -1.000000 +72714 -1.000000 +72715 -1.000000 +72716 -1.000000 +72717 -1.000000 +72718 -1.000000 +72719 -1.000000 +72720 -1.000000 +72721 -1.000000 +72722 -1.000000 +72723 -1.000000 +72724 -1.000000 +72725 -1.000000 +72726 -1.000000 +72727 -1.000000 +72728 -1.000000 +72729 -1.000000 +72730 -1.000000 +72731 -1.000000 +72732 -1.000000 +72733 -1.000000 +72734 -1.000000 +72735 -1.000000 +72736 -1.000000 +72737 -1.000000 +72738 -1.000000 +72739 -1.000000 +72740 -1.000000 +72741 -1.000000 +72742 -1.000000 +72743 -1.000000 +72744 -1.000000 +72745 -1.000000 +72746 -1.000000 +72747 -1.000000 +72748 -1.000000 +72749 -1.000000 +72750 -1.000000 +72751 -1.000000 +72752 -1.000000 +72753 -1.000000 +72754 -1.000000 +72755 -1.000000 +72756 -1.000000 +72757 -1.000000 +72758 -1.000000 +72759 -1.000000 +72760 -1.000000 +72761 -1.000000 +72762 -1.000000 +72763 -1.000000 +72764 -1.000000 +72765 -1.000000 +72766 -1.000000 +72767 -1.000000 +72768 -1.000000 +72769 -1.000000 +72771 -1.000000 +72772 -1.000000 +72773 -1.000000 +72774 -1.000000 +72775 -1.000000 +72776 -1.000000 +72778 -1.000000 +72779 -1.000000 +72780 -1.000000 +72781 -1.000000 +72782 -1.000000 +72783 -1.000000 +72784 -1.000000 +72785 -1.000000 +72786 -1.000000 +72787 -1.000000 +72788 -1.000000 +72789 -1.000000 +72790 -1.000000 +72791 -1.000000 +72792 -1.000000 +72793 -1.000000 +72794 -1.000000 +72803 -1.000000 +72805 -1.000000 +72806 -1.000000 +72807 -1.000000 +72808 -1.000000 +72809 -1.000000 +72810 -1.000000 +72811 -1.000000 +72812 -1.000000 +72813 -1.000000 +72814 -1.000000 +72815 -1.000000 +72816 -1.000000 +72817 -1.000000 +72818 -1.000000 +72819 -1.000000 +72820 -1.000000 +72821 -1.000000 +72822 -1.000000 +72823 -1.000000 +72824 -1.000000 +72825 -1.000000 +72826 -1.000000 +72827 -1.000000 +72828 -1.000000 +72829 -1.000000 +72830 -1.000000 +72831 -1.000000 +72832 -1.000000 +72833 -1.000000 +72834 -1.000000 +72835 -1.000000 +72836 -1.000000 +72837 -1.000000 +72838 -1.000000 +72839 -1.000000 +72840 -1.000000 +72841 -1.000000 +72842 -1.000000 +72843 -1.000000 +72844 -1.000000 +72845 -1.000000 +72846 -1.000000 +72847 -1.000000 +72848 -1.000000 +72849 -1.000000 +72850 -1.000000 +72851 -1.000000 +72852 -1.000000 +72853 -1.000000 +72854 -1.000000 +72855 -1.000000 +72856 -1.000000 +72857 -1.000000 +72858 -1.000000 +72859 -1.000000 +72860 -1.000000 +72861 -1.000000 +72862 -1.000000 +72863 -1.000000 +72864 -1.000000 +72865 -1.000000 +72866 -1.000000 +72867 -1.000000 +72868 -1.000000 +72869 -1.000000 +72870 -1.000000 +72871 -1.000000 +72872 -1.000000 +72873 -1.000000 +72874 -1.000000 +72875 -1.000000 +72876 -1.000000 +72877 -1.000000 +72878 -1.000000 +72879 -1.000000 +72880 -1.000000 +72881 -1.000000 +72882 -1.000000 +72883 -1.000000 +72884 -1.000000 +72885 -1.000000 +72886 -1.000000 +72887 -1.000000 +72888 -1.000000 +72889 -1.000000 +72890 -1.000000 +72891 -1.000000 +72892 -1.000000 +72893 -1.000000 +72894 -1.000000 +72895 -1.000000 +72896 -1.000000 +72897 -1.000000 +72898 -1.000000 +72899 -1.000000 +72900 -1.000000 +72901 -1.000000 +72902 -1.000000 +72903 -1.000000 +72904 -1.000000 +72905 -1.000000 +72906 -1.000000 +72907 -1.000000 +72908 -1.000000 +72909 -1.000000 +72910 -1.000000 +72911 -1.000000 +72912 -1.000000 +72913 -1.000000 +72914 -1.000000 +72915 -1.000000 +72916 -1.000000 +72917 -1.000000 +72918 -1.000000 +72919 -1.000000 +72920 -1.000000 +72921 -1.000000 +72922 -1.000000 +72923 -1.000000 +72924 -1.000000 +72925 -1.000000 +72926 -1.000000 +72927 -1.000000 +72928 -1.000000 +72929 -1.000000 +72930 -1.000000 +72931 -1.000000 +72932 -1.000000 +72933 -1.000000 +72934 -1.000000 +72935 -1.000000 +72936 -1.000000 +72937 -1.000000 +72938 -1.000000 +72939 -1.000000 +72940 -1.000000 +72941 -1.000000 +72942 -1.000000 +72943 -1.000000 +72944 -1.000000 +72945 -1.000000 +72946 -1.000000 +72947 -1.000000 +72948 -1.000000 +72949 -1.000000 +72950 -1.000000 +72951 -1.000000 +72952 -1.000000 +72953 -1.000000 +72954 -1.000000 +72955 -1.000000 +72956 -1.000000 +72957 -1.000000 +72958 -1.000000 +72959 -1.000000 +72960 -1.000000 +72961 -1.000000 +72962 -1.000000 +72963 -1.000000 +72964 -1.000000 +72965 -1.000000 +72966 -1.000000 +72967 -1.000000 +72968 -1.000000 +72969 -1.000000 +72970 -1.000000 +72971 -1.000000 +72972 -1.000000 +72973 -1.000000 +72974 -1.000000 +72975 -1.000000 +72976 -1.000000 +72977 -1.000000 +72978 -1.000000 +72979 -1.000000 +72980 -1.000000 +72981 -1.000000 +72982 -1.000000 +72983 -1.000000 +72984 -1.000000 +72985 -1.000000 +72986 -1.000000 +72987 -1.000000 +72988 -1.000000 +72989 -1.000000 +72990 -1.000000 +72991 -1.000000 +72992 -1.000000 +72993 -1.000000 +72994 -1.000000 +72995 -1.000000 +72996 -1.000000 +72997 -1.000000 +72998 -1.000000 +72999 -1.000000 +73000 -1.000000 +73001 -1.000000 +73002 -1.000000 +73003 -1.000000 +73004 -1.000000 +73005 -1.000000 +73006 -1.000000 +73007 -1.000000 +73008 -1.000000 +73009 -1.000000 +73010 -1.000000 +73011 -1.000000 +73012 -1.000000 +73013 -1.000000 +73014 -1.000000 +73015 -1.000000 +73016 -1.000000 +73017 -1.000000 +73018 -1.000000 +73019 -1.000000 +73020 -1.000000 +73021 -1.000000 +73022 -1.000000 +73023 -1.000000 +73024 -1.000000 +73025 -1.000000 +73026 -1.000000 +73027 -1.000000 +73028 -1.000000 +73029 -1.000000 +73030 -1.000000 +73031 -1.000000 +73032 -1.000000 +73033 -1.000000 +73034 -1.000000 +73035 -1.000000 +73036 -1.000000 +73037 -1.000000 +73038 -1.000000 +73039 -1.000000 +73040 -1.000000 +73041 -1.000000 +73042 -1.000000 +73043 -1.000000 +73044 -1.000000 +73045 -1.000000 +73046 -1.000000 +73047 -1.000000 +73048 -1.000000 +73049 -1.000000 +73050 -1.000000 +73051 -1.000000 +73052 -1.000000 +73053 -1.000000 +73054 -1.000000 +73055 -1.000000 +73056 -1.000000 +73057 -1.000000 +73058 -1.000000 +73059 -1.000000 +73060 -1.000000 +73061 -1.000000 +73062 -1.000000 +73063 -1.000000 +73064 -1.000000 +73065 -1.000000 +73066 -1.000000 +73067 -1.000000 +73068 -1.000000 +73069 -1.000000 +73070 -1.000000 +73071 -1.000000 +73072 -1.000000 +73073 -1.000000 +73074 -1.000000 +73075 -1.000000 +73076 -1.000000 +73077 -1.000000 +73078 -1.000000 +73079 -1.000000 +73080 -1.000000 +73081 -1.000000 +73082 -1.000000 +73083 -1.000000 +73084 -1.000000 +73085 -1.000000 +73086 -1.000000 +73087 -1.000000 +73088 -1.000000 +73089 -1.000000 +73090 -1.000000 +73091 -1.000000 +73092 -1.000000 +73093 -1.000000 +73094 -1.000000 +73095 -1.000000 +73096 -1.000000 +73097 -1.000000 +73098 -1.000000 +73099 -1.000000 +73100 -1.000000 +73101 -1.000000 +73102 -1.000000 +73103 -1.000000 +73104 -1.000000 +73105 -1.000000 +73106 -1.000000 +73107 -1.000000 +73108 -1.000000 +73109 -1.000000 +73110 -1.000000 +73111 -1.000000 +73112 -1.000000 +73113 -1.000000 +73114 -1.000000 +73115 -1.000000 +73116 -1.000000 +73117 -1.000000 +73118 -1.000000 +73119 -1.000000 +73120 -1.000000 +73121 -1.000000 +73122 -1.000000 +73123 -1.000000 +73124 -1.000000 +73125 -1.000000 +73126 -1.000000 +73127 -1.000000 +73128 -1.000000 +73129 -1.000000 +73130 -1.000000 +73131 -1.000000 +73132 -1.000000 +73133 -1.000000 +73134 -1.000000 +73135 -1.000000 +73136 -1.000000 +73137 -1.000000 +73138 -1.000000 +73139 -1.000000 +73140 -1.000000 +73141 -1.000000 +73142 -1.000000 +73143 -1.000000 +73144 -1.000000 +73145 -1.000000 +73146 -1.000000 +73147 -1.000000 +73148 -1.000000 +73149 -1.000000 +73150 -1.000000 +73151 -1.000000 +73152 -1.000000 +73153 -1.000000 +73154 -1.000000 +73155 -1.000000 +73156 -1.000000 +73157 -1.000000 +73158 -1.000000 +73159 -1.000000 +73160 -1.000000 +73161 -1.000000 +73162 -1.000000 +73163 -1.000000 +73164 -1.000000 +73165 -1.000000 +73166 -1.000000 +73167 -1.000000 +73168 -1.000000 +73169 -1.000000 +73170 -1.000000 +73171 -1.000000 +73172 -1.000000 +73173 -1.000000 +73174 -1.000000 +73175 -1.000000 +73176 -1.000000 +73177 -1.000000 +73178 -1.000000 +73179 -1.000000 +73180 -1.000000 +73181 -1.000000 +73182 -1.000000 +73183 -1.000000 +73184 -1.000000 +73185 -1.000000 +73186 -1.000000 +73187 -1.000000 +73188 -1.000000 +73189 -1.000000 +73190 -1.000000 +73191 -1.000000 +73192 -1.000000 +73193 -1.000000 +73194 -1.000000 +73195 -1.000000 +73196 -1.000000 +73197 -1.000000 +73198 -1.000000 +73199 -1.000000 +73200 -1.000000 +73201 -1.000000 +73202 -1.000000 +73203 -1.000000 +73204 -1.000000 +73205 -1.000000 +73206 -1.000000 +73207 -1.000000 +73208 -1.000000 +73209 -1.000000 +73210 -1.000000 +73211 -1.000000 +73212 -1.000000 +73213 -1.000000 +73214 -1.000000 +73215 -1.000000 +73216 -1.000000 +73217 -1.000000 +73218 -1.000000 +73219 -1.000000 +73220 -1.000000 +73221 -1.000000 +73222 -1.000000 +73223 -1.000000 +73224 -1.000000 +73225 -1.000000 +73226 -1.000000 +73227 -1.000000 +73228 -1.000000 +73229 -1.000000 +73230 -1.000000 +73231 -1.000000 +73232 -1.000000 +73233 -1.000000 +73234 -1.000000 +73235 -1.000000 +73236 -1.000000 +73237 -1.000000 +73238 -1.000000 +73239 -1.000000 +73240 -1.000000 +73241 -1.000000 +73242 -1.000000 +73243 -1.000000 +73244 -1.000000 +73245 -1.000000 +73246 -1.000000 +73250 -1.000000 +73251 -1.000000 +73252 -1.000000 +73253 -1.000000 +73254 -1.000000 +73255 -1.000000 +73256 -1.000000 +73257 -1.000000 +73258 -1.000000 +73259 -1.000000 +73260 -1.000000 +73261 -1.000000 +73262 -1.000000 +73263 -1.000000 +73264 -1.000000 +73265 -1.000000 +73266 -1.000000 +73267 -1.000000 +73268 -1.000000 +73269 -1.000000 +73270 -1.000000 +73271 -1.000000 +73272 -1.000000 +73273 -1.000000 +73274 -1.000000 +73275 -1.000000 +73276 -1.000000 +73277 -1.000000 +73278 -1.000000 +73279 -1.000000 +73280 -1.000000 +73281 -1.000000 +73282 -1.000000 +73283 -1.000000 +73284 -1.000000 +73285 -1.000000 +73286 -1.000000 +73287 -1.000000 +73288 -1.000000 +73289 -1.000000 +73290 -1.000000 +73291 -1.000000 +73292 -1.000000 +73293 -1.000000 +73294 -1.000000 +73295 -1.000000 +73296 -1.000000 +73297 -1.000000 +73298 -1.000000 +73299 -1.000000 +73300 -1.000000 +73301 -1.000000 +73302 -1.000000 +73303 -1.000000 +73304 -1.000000 +73305 -1.000000 +73306 -1.000000 +73307 -1.000000 +73308 -1.000000 +73309 -1.000000 +73310 -1.000000 +73311 -1.000000 +73312 -1.000000 +73313 -1.000000 +73314 -1.000000 +73315 -1.000000 +73316 -1.000000 +73317 -1.000000 +73318 -1.000000 +73319 -1.000000 +73320 -1.000000 +73321 -1.000000 +73322 -1.000000 +73323 -1.000000 +73324 -1.000000 +73325 -1.000000 +73326 -1.000000 +73327 -1.000000 +73328 -1.000000 +73329 -1.000000 +73330 -1.000000 +73331 -1.000000 +73332 -1.000000 +73333 -1.000000 +73334 -1.000000 +73335 -1.000000 +73336 -1.000000 +73337 -1.000000 +73338 -1.000000 +73339 -1.000000 +73340 -1.000000 +73341 -1.000000 +73342 -1.000000 +73343 -1.000000 +73344 -1.000000 +73345 -1.000000 +73346 -1.000000 +73347 -1.000000 +73348 -1.000000 +73349 -1.000000 +73350 -1.000000 +73351 -1.000000 +73352 -1.000000 +73353 -1.000000 +73354 -1.000000 +73355 -1.000000 +73356 -1.000000 +73357 -1.000000 +73358 -1.000000 +73359 -1.000000 +73360 -1.000000 +73361 -1.000000 +73362 -1.000000 +73363 -1.000000 +73364 -1.000000 +73365 -1.000000 +73366 -1.000000 +73367 -1.000000 +73368 -1.000000 +73369 -1.000000 +73370 -1.000000 +73371 -1.000000 +73372 -1.000000 +73373 -1.000000 +73374 -1.000000 +73375 -1.000000 +73376 -1.000000 +73377 -1.000000 +73378 -1.000000 +73379 -1.000000 +73380 -1.000000 +73381 -1.000000 +73382 -1.000000 +73383 -1.000000 +73384 -1.000000 +73389 -1.000000 +73390 -1.000000 +73391 -1.000000 +73392 -1.000000 +73393 -1.000000 +73394 -1.000000 +73395 -1.000000 +73396 -1.000000 +73397 -1.000000 +73398 -1.000000 +73399 -1.000000 +73400 -1.000000 +73401 -1.000000 +73402 -1.000000 +73403 -1.000000 +73404 -1.000000 +73405 -1.000000 +73406 -1.000000 +73407 -1.000000 +73408 -1.000000 +73409 -1.000000 +73410 -1.000000 +73411 -1.000000 +73412 -1.000000 +73413 -1.000000 +73414 -1.000000 +73415 -1.000000 +73416 -1.000000 +73417 -1.000000 +73418 -1.000000 +73419 -1.000000 +73420 -1.000000 +73421 -1.000000 +73422 -1.000000 +73423 -1.000000 +73424 -1.000000 +73425 -1.000000 +73426 -1.000000 +73427 -1.000000 +73428 -1.000000 +73429 -1.000000 +73430 -1.000000 +73431 -1.000000 +73432 -1.000000 +73433 -1.000000 +73434 -1.000000 +73435 -1.000000 +73436 -1.000000 +73437 -1.000000 +73438 -1.000000 +73439 -1.000000 +73440 -1.000000 +73441 -1.000000 +73442 -1.000000 +73443 -1.000000 +73444 -1.000000 +73445 -1.000000 +73446 -1.000000 +73447 -1.000000 +73448 -1.000000 +73449 -1.000000 +73450 -1.000000 +73451 -1.000000 +73452 -1.000000 +73453 -1.000000 +73454 -1.000000 +73455 -1.000000 +73456 -1.000000 +73457 -1.000000 +73458 -1.000000 +73459 -1.000000 +73460 -1.000000 +73461 -1.000000 +73462 -1.000000 +73463 -1.000000 +73464 -1.000000 +73465 -1.000000 +73466 -1.000000 +73467 -1.000000 +73468 -1.000000 +73469 -1.000000 +73470 -1.000000 +73471 -1.000000 +73472 -1.000000 +73473 -1.000000 +73474 -1.000000 +73475 -1.000000 +73476 -1.000000 +73477 -1.000000 +73478 -1.000000 +73479 -1.000000 +73480 -1.000000 +73481 -1.000000 +73482 -1.000000 +73483 -1.000000 +73484 -1.000000 +73485 -1.000000 +73486 -1.000000 +73487 -1.000000 +73488 -1.000000 +73489 -1.000000 +73490 -1.000000 +73491 -1.000000 +73492 -1.000000 +73493 -1.000000 +73494 -1.000000 +73495 -1.000000 +73496 -1.000000 +73497 -1.000000 +73498 -1.000000 +73499 -1.000000 +73500 -1.000000 +73501 -1.000000 +73502 -1.000000 +73503 -1.000000 +73504 -1.000000 +73505 -1.000000 +73506 -1.000000 +73507 -1.000000 +73508 -1.000000 +73509 -1.000000 +73510 -1.000000 +73511 -1.000000 +73512 -1.000000 +73513 -1.000000 +73514 -1.000000 +73515 -1.000000 +73516 -1.000000 +73517 -1.000000 +73518 -1.000000 +73519 -1.000000 +73520 -1.000000 +73521 -1.000000 +73522 -1.000000 +73523 -1.000000 +73524 -1.000000 +73525 -1.000000 +73526 -1.000000 +73527 -1.000000 +73528 -1.000000 +73529 -1.000000 +73530 -1.000000 +73531 -1.000000 +73532 -1.000000 +73533 -1.000000 +73534 -1.000000 +73535 -1.000000 +73536 -1.000000 +73537 -1.000000 +73538 -1.000000 +73539 -1.000000 +73540 -1.000000 +73541 -1.000000 +73542 -1.000000 +73543 -1.000000 +73544 -1.000000 +73545 -1.000000 +73546 -1.000000 +73547 -1.000000 +73548 -1.000000 +73549 -1.000000 +73550 -1.000000 +73552 -1.000000 +73553 -1.000000 +73554 -1.000000 +73555 -1.000000 +73556 -1.000000 +73557 -1.000000 +73558 -1.000000 +73559 -1.000000 +73560 -1.000000 +73561 -1.000000 +73562 -1.000000 +73563 -1.000000 +73564 -1.000000 +73565 -1.000000 +73566 -1.000000 +73567 -1.000000 +73568 -1.000000 +73569 -1.000000 +73570 -1.000000 +73571 -1.000000 +73572 -1.000000 +73573 -1.000000 +73574 -1.000000 +73575 -1.000000 +73576 -1.000000 +73577 -1.000000 +73578 -1.000000 +73579 -1.000000 +73580 -1.000000 +73581 -1.000000 +73582 -1.000000 +73583 -1.000000 +73584 -1.000000 +73585 -1.000000 +73586 -1.000000 +73587 -1.000000 +73591 -1.000000 +73592 -1.000000 +73593 -1.000000 +73594 -1.000000 +73595 -1.000000 +73596 -1.000000 +73597 -1.000000 +73598 -1.000000 +73599 -1.000000 +73600 -1.000000 +73601 -1.000000 +73602 -1.000000 +73603 -1.000000 +73604 -1.000000 +73605 -1.000000 +73606 -1.000000 +73607 -1.000000 +73608 -1.000000 +73609 -1.000000 +73610 -1.000000 +73611 -1.000000 +73612 -1.000000 +73613 -1.000000 +73614 -1.000000 +73615 -1.000000 +73616 -1.000000 +73617 -1.000000 +73618 -1.000000 +73619 -1.000000 +73620 -1.000000 +73621 -1.000000 +73622 -1.000000 +73623 -1.000000 +73626 -1.000000 +73627 -1.000000 +73628 -1.000000 +73629 -1.000000 +73630 -1.000000 +73631 -1.000000 +73632 -1.000000 +73633 -1.000000 +73634 -1.000000 +73635 -1.000000 +73636 -1.000000 +73637 -1.000000 +73638 -1.000000 +73639 -1.000000 +73640 -1.000000 +73641 -1.000000 +73642 -1.000000 +73643 -1.000000 +73644 -1.000000 +73645 -1.000000 +73646 -1.000000 +73647 -1.000000 +73648 -1.000000 +73649 -1.000000 +73650 -1.000000 +73651 -1.000000 +73652 -1.000000 +73653 -1.000000 +73654 -1.000000 +73655 -1.000000 +73656 -1.000000 +73657 -1.000000 +73658 -1.000000 +73659 -1.000000 +73660 -1.000000 +73661 -1.000000 +73662 -1.000000 +73663 -1.000000 +73664 -1.000000 +73665 -1.000000 +73666 -1.000000 +73667 -1.000000 +73668 -1.000000 +73669 -1.000000 +73670 -1.000000 +73671 -1.000000 +73672 -1.000000 +73673 -1.000000 +73674 -1.000000 +73675 -1.000000 +73676 -1.000000 +73677 -1.000000 +73678 -1.000000 +73679 -1.000000 +73680 -1.000000 +73681 -1.000000 +73682 -1.000000 +73683 -1.000000 +73684 -1.000000 +73685 -1.000000 +73686 -1.000000 +73687 -1.000000 +73688 -1.000000 +73689 -1.000000 +73690 -1.000000 +73691 -1.000000 +73692 -1.000000 +73693 -1.000000 +73694 -1.000000 +73695 -1.000000 +73696 -1.000000 +73697 -1.000000 +73698 -1.000000 +73699 -1.000000 +73700 -1.000000 +73701 -1.000000 +73702 -1.000000 +73703 -1.000000 +73704 -1.000000 +73705 -1.000000 +73706 -1.000000 +73707 -1.000000 +73708 -1.000000 +73709 -1.000000 +73710 -1.000000 +73711 -1.000000 +73712 -1.000000 +73713 -1.000000 +73714 -1.000000 +73715 -1.000000 +73716 -1.000000 +73717 -1.000000 +73718 -1.000000 +73719 -1.000000 +73720 -1.000000 +73721 -1.000000 +73722 -1.000000 +73723 -1.000000 +73724 -1.000000 +73725 -1.000000 +73726 -1.000000 +73727 -1.000000 +73728 -1.000000 +73729 -1.000000 +73730 -1.000000 +73731 -1.000000 +73732 -1.000000 +73733 -1.000000 +73734 -1.000000 +73735 -1.000000 +73736 -1.000000 +73737 -1.000000 +73738 -1.000000 +73739 -1.000000 +73740 -1.000000 +73741 -1.000000 +73742 -1.000000 +73743 -1.000000 +73744 -1.000000 +73745 -1.000000 +73746 -1.000000 +73747 -1.000000 +73748 -1.000000 +73749 -1.000000 +73750 -1.000000 +73751 -1.000000 +73752 -1.000000 +73753 -1.000000 +73754 -1.000000 +73755 -1.000000 +73756 -1.000000 +73757 -1.000000 +73758 -1.000000 +73759 -1.000000 +73760 -1.000000 +73761 -1.000000 +73762 -1.000000 +73763 -1.000000 +73764 -1.000000 +73765 -1.000000 +73766 -1.000000 +73767 -1.000000 +73768 -1.000000 +73769 -1.000000 +73770 -1.000000 +73771 -1.000000 +73772 -1.000000 +73773 -1.000000 +73774 -1.000000 +73775 -1.000000 +73776 -1.000000 +73777 -1.000000 +73778 -1.000000 +73779 -1.000000 +73780 -1.000000 +73781 -1.000000 +73782 -1.000000 +73783 -1.000000 +73784 -1.000000 +73785 -1.000000 +73786 -1.000000 +73787 -1.000000 +73788 -1.000000 +73789 -1.000000 +73790 -1.000000 +73791 -1.000000 +73792 -1.000000 +73793 -1.000000 +73794 -1.000000 +73795 -1.000000 +73796 -1.000000 +73797 -1.000000 +73798 -1.000000 +73799 -1.000000 +73800 -1.000000 +73801 -1.000000 +73802 -1.000000 +73803 -1.000000 +73804 -1.000000 +73805 -1.000000 +73806 -1.000000 +73807 -1.000000 +73808 -1.000000 +73809 -1.000000 +73810 -1.000000 +73811 -1.000000 +73812 -1.000000 +73813 -1.000000 +73814 -1.000000 +73815 -1.000000 +73816 -1.000000 +73817 -1.000000 +73818 -1.000000 +73819 -1.000000 +73820 -1.000000 +73821 -1.000000 +73822 -1.000000 +73823 -1.000000 +73824 -1.000000 +73825 -1.000000 +73826 -1.000000 +73827 -1.000000 +73828 -1.000000 +73829 -1.000000 +73830 -1.000000 +73831 -1.000000 +73832 -1.000000 +73833 -1.000000 +73834 -1.000000 +73835 -1.000000 +73836 -1.000000 +73837 -1.000000 +73838 -1.000000 +73839 -1.000000 +73840 -1.000000 +73841 -1.000000 +73842 -1.000000 +73843 -1.000000 +73844 -1.000000 +73845 -1.000000 +73846 -1.000000 +73847 -1.000000 +73848 -1.000000 +73849 -1.000000 +73850 -1.000000 +73851 -1.000000 +73852 -1.000000 +73853 -1.000000 +73854 -1.000000 +73855 -1.000000 +73856 -1.000000 +73857 -1.000000 +73858 -1.000000 +73859 -1.000000 +73860 -1.000000 +73861 -1.000000 +73862 -1.000000 +73863 -1.000000 +73864 -1.000000 +73865 -1.000000 +73866 -1.000000 +73867 -1.000000 +73868 -1.000000 +73869 -1.000000 +73870 -1.000000 +73871 -1.000000 +73872 -1.000000 +73873 -1.000000 +73874 -1.000000 +73875 -1.000000 +73876 -1.000000 +73877 -1.000000 +73878 -1.000000 +73879 -1.000000 +73880 -1.000000 +73881 -1.000000 +73882 -1.000000 +73883 -1.000000 +73884 -1.000000 +73885 -1.000000 +73886 -1.000000 +73887 -1.000000 +73888 -1.000000 +73889 -1.000000 +73890 -1.000000 +73891 -1.000000 +73892 -1.000000 +73893 -1.000000 +73894 -1.000000 +73895 -1.000000 +73896 -1.000000 +73897 -1.000000 +73898 -1.000000 +73899 -1.000000 +73900 -1.000000 +73901 -1.000000 +73902 -1.000000 +73903 -1.000000 +73904 -1.000000 +73905 -1.000000 +73906 -1.000000 +73907 -1.000000 +73908 -1.000000 +73909 -1.000000 +73910 -1.000000 +73911 -1.000000 +73912 -1.000000 +73913 -1.000000 +73914 -1.000000 +73915 -1.000000 +73916 -1.000000 +73917 -1.000000 +73918 -1.000000 +73919 -1.000000 +73920 -1.000000 +73921 -1.000000 +73922 -1.000000 +73923 -1.000000 +73924 -1.000000 +73925 -1.000000 +73926 -1.000000 +73927 -1.000000 +73928 -1.000000 +73929 -1.000000 +73930 -1.000000 +73931 -1.000000 +73932 -1.000000 +73933 -1.000000 +73934 -1.000000 +73935 -1.000000 +73936 -1.000000 +73937 -1.000000 +73938 -1.000000 +73939 -1.000000 +73940 -1.000000 +73941 -1.000000 +73942 -1.000000 +73943 -1.000000 +73944 -1.000000 +73945 -1.000000 +73946 -1.000000 +73947 -1.000000 +73948 -1.000000 +73949 -1.000000 +73950 -1.000000 +73951 -1.000000 +73952 -1.000000 +73953 -1.000000 +73954 -1.000000 +73955 -1.000000 +73956 -1.000000 +73957 -1.000000 +73958 -1.000000 +73959 -1.000000 +73960 -1.000000 +73961 -1.000000 +73962 -1.000000 +73963 -1.000000 +73964 -1.000000 +73965 -1.000000 +73966 -1.000000 +73967 -1.000000 +73968 -1.000000 +73969 -1.000000 +73970 -1.000000 +73971 -1.000000 +73972 -1.000000 +73973 -1.000000 +73974 -1.000000 +73975 -1.000000 +73976 -1.000000 +73977 -1.000000 +73978 -1.000000 +73979 -1.000000 +73980 -1.000000 +73981 -1.000000 +73982 -1.000000 +73983 -1.000000 +73984 -1.000000 +73985 -1.000000 +73986 -1.000000 +73987 -1.000000 +73988 -1.000000 +73989 -1.000000 +73990 -1.000000 +73991 -1.000000 +73992 -1.000000 +73993 -1.000000 +73994 -1.000000 +73995 -1.000000 +73996 -1.000000 +73997 -1.000000 +73998 -1.000000 +73999 -1.000000 +74000 -1.000000 +74001 -1.000000 +74002 -1.000000 +74003 -1.000000 +74004 -1.000000 +74005 -1.000000 +74006 -1.000000 +74007 -1.000000 +74008 -1.000000 +74009 -1.000000 +74010 -1.000000 +74011 -1.000000 +74012 -1.000000 +74013 -1.000000 +74014 -1.000000 +74015 -1.000000 +74016 -1.000000 +74017 -1.000000 +74018 -1.000000 +74019 -1.000000 +74020 -1.000000 +74021 -1.000000 +74022 -1.000000 +74023 -1.000000 +74024 -1.000000 +74025 -1.000000 +74026 -1.000000 +74027 -1.000000 +74028 -1.000000 +74029 -1.000000 +74030 -1.000000 +74031 -1.000000 +74032 -1.000000 +74033 -1.000000 +74034 -1.000000 +74035 -1.000000 +74036 -1.000000 +74037 -1.000000 +74038 -1.000000 +74039 -1.000000 +74040 -1.000000 +74041 -1.000000 +74042 -1.000000 +74043 -1.000000 +74044 -1.000000 +74045 -1.000000 +74046 -1.000000 +74047 -1.000000 +74048 -1.000000 +74049 -1.000000 +74050 -1.000000 +74051 -1.000000 +74052 -1.000000 +74053 -1.000000 +74054 -1.000000 +74055 -1.000000 +74056 -1.000000 +74057 -1.000000 +74058 -1.000000 +74059 -1.000000 +74060 -1.000000 +74061 -1.000000 +74062 -1.000000 +74063 -1.000000 +74064 -1.000000 +74065 -1.000000 +74066 -1.000000 +74067 -1.000000 +74068 -1.000000 +74069 -1.000000 +74070 -1.000000 +74071 -1.000000 +74072 -1.000000 +74073 -1.000000 +74074 -1.000000 +74075 -1.000000 +74076 -1.000000 +74077 -1.000000 +74078 -1.000000 +74079 -1.000000 +74080 -1.000000 +74081 -1.000000 +74082 -1.000000 +74083 -1.000000 +74084 -1.000000 +74085 -1.000000 +74086 -1.000000 +74087 -1.000000 +74088 -1.000000 +74089 -1.000000 +74090 -1.000000 +74091 -1.000000 +74092 -1.000000 +74093 -1.000000 +74094 -1.000000 +74095 -1.000000 +74096 -1.000000 +74097 -1.000000 +74098 -1.000000 +74099 -1.000000 +74100 -1.000000 +74101 -1.000000 +74102 -1.000000 +74103 -1.000000 +74104 -1.000000 +74105 -1.000000 +74106 -1.000000 +74107 -1.000000 +74108 -1.000000 +74109 -1.000000 +74110 -1.000000 +74111 -1.000000 +74112 -1.000000 +74113 -1.000000 +74114 -1.000000 +74115 -1.000000 +74116 -1.000000 +74117 -1.000000 +74118 -1.000000 +74119 -1.000000 +74120 -1.000000 +74121 -1.000000 +74122 -1.000000 +74123 -1.000000 +74124 -1.000000 +74126 -1.000000 +74127 -1.000000 +74128 -1.000000 +74129 -1.000000 +74130 -1.000000 +74131 -1.000000 +74132 -1.000000 +74133 -1.000000 +74134 -1.000000 +74135 -1.000000 +74136 -1.000000 +74137 -1.000000 +74138 -1.000000 +74139 -1.000000 +74140 -1.000000 +74141 -1.000000 +74142 -1.000000 +74143 -1.000000 +74144 -1.000000 +74145 -1.000000 +74146 -1.000000 +74147 -1.000000 +74148 -1.000000 +74149 -1.000000 +74150 -1.000000 +74151 -1.000000 +74153 -1.000000 +74154 -1.000000 +74155 -1.000000 +74156 -1.000000 +74157 -1.000000 +74158 -1.000000 +74159 -1.000000 +74160 -1.000000 +74161 -1.000000 +74163 -1.000000 +74164 -1.000000 +74165 -1.000000 +74166 -1.000000 +74167 -1.000000 +74168 -1.000000 +74169 -1.000000 +74170 -1.000000 +74171 -1.000000 +74172 -1.000000 +74173 -1.000000 +74174 -1.000000 +74175 -1.000000 +74176 -1.000000 +74177 -1.000000 +74178 -1.000000 +74179 -1.000000 +74180 -1.000000 +74181 -1.000000 +74183 -1.000000 +74184 -1.000000 +74185 -1.000000 +74186 -1.000000 +74187 -1.000000 +74188 -1.000000 +74189 -1.000000 +74190 -1.000000 +74191 -1.000000 +74192 -1.000000 +74193 -1.000000 +74194 -1.000000 +74195 -1.000000 +74196 -1.000000 +74197 -1.000000 +74198 -1.000000 +74199 -1.000000 +74201 -1.000000 +74202 -1.000000 +74203 -1.000000 +74204 -1.000000 +74205 -1.000000 +74206 -1.000000 +74207 -1.000000 +74208 -1.000000 +74209 -1.000000 +74210 -1.000000 +74211 -1.000000 +74212 -1.000000 +74213 -1.000000 +74214 -1.000000 +74215 -1.000000 +74216 -1.000000 +74217 -1.000000 +74218 -1.000000 +74219 -1.000000 +74220 -1.000000 +74221 -1.000000 +74222 -1.000000 +74223 -1.000000 +74224 -1.000000 +74225 -1.000000 +74226 -1.000000 +74227 -1.000000 +74228 -1.000000 +74229 -1.000000 +74230 -1.000000 +74231 -1.000000 +74232 -1.000000 +74233 -1.000000 +74234 -1.000000 +74235 -1.000000 +74236 -1.000000 +74237 -1.000000 +74238 -1.000000 +74239 -1.000000 +74240 -1.000000 +74241 -1.000000 +74242 -1.000000 +74243 -1.000000 +74244 -1.000000 +74245 -1.000000 +74246 -1.000000 +74247 -1.000000 +74248 -1.000000 +74249 -1.000000 +74250 -1.000000 +74251 -1.000000 +74252 -1.000000 +74253 -1.000000 +74254 -1.000000 +74255 -1.000000 +74256 -1.000000 +74257 -1.000000 +74258 -1.000000 +74259 -1.000000 +74260 -1.000000 +74261 -1.000000 +74262 -1.000000 +74263 -1.000000 +74264 -1.000000 +74265 -1.000000 +74266 -1.000000 +74267 -1.000000 +74268 -1.000000 +74269 -1.000000 +74270 -1.000000 +74271 -1.000000 +74272 -1.000000 +74273 -1.000000 +74274 -1.000000 +74275 -1.000000 +74276 -1.000000 +74277 -1.000000 +74278 -1.000000 +74279 -1.000000 +74280 -1.000000 +74281 -1.000000 +74282 -1.000000 +74283 -1.000000 +74284 -1.000000 +74285 -1.000000 +74286 -1.000000 +74287 -1.000000 +74288 -1.000000 +74289 -1.000000 +74290 -1.000000 +74291 -1.000000 +74292 -1.000000 +74293 -1.000000 +74294 -1.000000 +74295 -1.000000 +74296 -1.000000 +74297 -1.000000 +74298 -1.000000 +74299 -1.000000 +74300 -1.000000 +74301 -1.000000 +74302 -1.000000 +74303 -1.000000 +74304 -1.000000 +74305 -1.000000 +74306 -1.000000 +74307 -1.000000 +74308 -1.000000 +74309 -1.000000 +74310 -1.000000 +74311 -1.000000 +74312 -1.000000 +74313 -1.000000 +74314 -1.000000 +74315 -1.000000 +74316 -1.000000 +74317 -1.000000 +74318 -1.000000 +74319 -1.000000 +74320 -1.000000 +74321 -1.000000 +74322 -1.000000 +74323 -1.000000 +74324 -1.000000 +74325 -1.000000 +74326 -1.000000 +74327 -1.000000 +74328 -1.000000 +74329 -1.000000 +74330 -1.000000 +74331 -1.000000 +74332 -1.000000 +74334 -1.000000 +74335 -1.000000 +74336 -1.000000 +74337 -1.000000 +74338 -1.000000 +74339 -1.000000 +74340 -1.000000 +74341 -1.000000 +74342 -1.000000 +74343 -1.000000 +74344 -1.000000 +74345 -1.000000 +74346 -1.000000 +74347 -1.000000 +74348 -1.000000 +74349 -1.000000 +74350 -1.000000 +74351 -1.000000 +74352 -1.000000 +74353 -1.000000 +74354 -1.000000 +74355 -1.000000 +74356 -1.000000 +74357 -1.000000 +74358 -1.000000 +74359 -1.000000 +74360 -1.000000 +74361 -1.000000 +74362 -1.000000 +74363 -1.000000 +74364 -1.000000 +74365 -1.000000 +74366 -1.000000 +74367 -1.000000 +74368 -1.000000 +74369 -1.000000 +74370 -1.000000 +74371 -1.000000 +74372 -1.000000 +74373 -1.000000 +74374 -1.000000 +74375 -1.000000 +74376 -1.000000 +74377 -1.000000 +74378 -1.000000 +74379 -1.000000 +74380 -1.000000 +74381 -1.000000 +74382 -1.000000 +74383 -1.000000 +74384 -1.000000 +74385 -1.000000 +74386 -1.000000 +74387 -1.000000 +74388 -1.000000 +74389 -1.000000 +74390 -1.000000 +74391 -1.000000 +74392 -1.000000 +74393 -1.000000 +74394 -1.000000 +74395 -1.000000 +74396 -1.000000 +74397 -1.000000 +74398 -1.000000 +74399 -1.000000 +74400 -1.000000 +74401 -1.000000 +74402 -1.000000 +74403 -1.000000 +74404 -1.000000 +74405 -1.000000 +74406 -1.000000 +74407 -1.000000 +74408 -1.000000 +74409 -1.000000 +74410 -1.000000 +74411 -1.000000 +74412 -1.000000 +74413 -1.000000 +74414 -1.000000 +74415 -1.000000 +74416 -1.000000 +74417 -1.000000 +74418 -1.000000 +74419 -1.000000 +74420 -1.000000 +74421 -1.000000 +74422 -1.000000 +74423 -1.000000 +74424 -1.000000 +74425 -1.000000 +74426 -1.000000 +74427 -1.000000 +74428 -1.000000 +74429 -1.000000 +74430 -1.000000 +74431 -1.000000 +74432 -1.000000 +74433 -1.000000 +74434 -1.000000 +74435 -1.000000 +74436 -1.000000 +74437 -1.000000 +74438 -1.000000 +74439 -1.000000 +74441 -1.000000 +74442 -1.000000 +74443 -1.000000 +74444 -1.000000 +74445 -1.000000 +74446 -1.000000 +74447 -1.000000 +74448 -1.000000 +74449 -1.000000 +74450 -1.000000 +74451 -1.000000 +74452 -1.000000 +74453 -1.000000 +74454 -1.000000 +74455 -1.000000 +74456 -1.000000 +74457 -1.000000 +74458 -1.000000 +74459 -1.000000 +74460 -1.000000 +74461 -1.000000 +74462 -1.000000 +74463 -1.000000 +74464 -1.000000 +74465 -1.000000 +74466 -1.000000 +74467 -1.000000 +74468 -1.000000 +74469 -1.000000 +74470 -1.000000 +74471 -1.000000 +74472 -1.000000 +74473 -1.000000 +74474 -1.000000 +74475 -1.000000 +74476 -1.000000 +74477 -1.000000 +74478 -1.000000 +74479 -1.000000 +74480 -1.000000 +74481 -1.000000 +74482 -1.000000 +74483 -1.000000 +74484 -1.000000 +74485 -1.000000 +74486 -1.000000 +74487 -1.000000 +74488 -1.000000 +74489 -1.000000 +74490 -1.000000 +74491 -1.000000 +74492 -1.000000 +74493 -1.000000 +74494 -1.000000 +74495 -1.000000 +74496 -1.000000 +74497 -1.000000 +74498 -1.000000 +74499 -1.000000 +74500 -1.000000 +74501 -1.000000 +74502 -1.000000 +74503 -1.000000 +74504 -1.000000 +74505 -1.000000 +74506 -1.000000 +74507 -1.000000 +74508 -1.000000 +74509 -1.000000 +74510 -1.000000 +74511 -1.000000 +74512 -1.000000 +74513 -1.000000 +74514 -1.000000 +74515 -1.000000 +74516 -1.000000 +74517 -1.000000 +74518 -1.000000 +74519 -1.000000 +74520 -1.000000 +74521 -1.000000 +74522 -1.000000 +74523 -1.000000 +74524 -1.000000 +74525 -1.000000 +74526 -1.000000 +74527 -1.000000 +74528 -1.000000 +74529 -1.000000 +74530 -1.000000 +74531 -1.000000 +74532 -1.000000 +74533 -1.000000 +74534 -1.000000 +74535 -1.000000 +74536 -1.000000 +74537 -1.000000 +74538 -1.000000 +74539 -1.000000 +74540 -1.000000 +74541 -1.000000 +74542 -1.000000 +74543 -1.000000 +74544 -1.000000 +74545 -1.000000 +74546 -1.000000 +74547 -1.000000 +74548 -1.000000 +74549 -1.000000 +74550 -1.000000 +74551 -1.000000 +74552 -1.000000 +74553 -1.000000 +74554 -1.000000 +74555 -1.000000 +74556 -1.000000 +74557 -1.000000 +74558 -1.000000 +74559 -1.000000 +74561 -1.000000 +74562 -1.000000 +74563 -1.000000 +74564 -1.000000 +74565 -1.000000 +74566 -1.000000 +74567 -1.000000 +74568 -1.000000 +74569 -1.000000 +74570 -1.000000 +74571 -1.000000 +74572 -1.000000 +74573 -1.000000 +74574 -1.000000 +74575 -1.000000 +74576 -1.000000 +74577 -1.000000 +74578 -1.000000 +74579 -1.000000 +74580 -1.000000 +74581 -1.000000 +74582 -1.000000 +74583 -1.000000 +74584 -1.000000 +74585 -1.000000 +74586 -1.000000 +74588 -1.000000 +74589 -1.000000 +74590 -1.000000 +74591 -1.000000 +74592 -1.000000 +74593 -1.000000 +74594 -1.000000 +74595 -1.000000 +74596 -1.000000 +74597 -1.000000 +74598 -1.000000 +74599 -1.000000 +74600 -1.000000 +74601 -1.000000 +74602 -1.000000 +74603 -1.000000 +74604 -1.000000 +74605 -1.000000 +74606 -1.000000 +74607 -1.000000 +74608 -1.000000 +74609 -1.000000 +74610 -1.000000 +74611 -1.000000 +74612 -1.000000 +74613 -1.000000 +74614 -1.000000 +74615 -1.000000 +74616 -1.000000 +74617 -1.000000 +74618 -1.000000 +74619 -1.000000 +74620 -1.000000 +74621 -1.000000 +74622 -1.000000 +74623 -1.000000 +74624 -1.000000 +74625 -1.000000 +74626 -1.000000 +74627 -1.000000 +74628 -1.000000 +74629 -1.000000 +74630 -1.000000 +74631 -1.000000 +74632 -1.000000 +74633 -1.000000 +74634 -1.000000 +74635 -1.000000 +74636 -1.000000 +74637 -1.000000 +74638 -1.000000 +74639 -1.000000 +74640 -1.000000 +74641 -1.000000 +74642 -1.000000 +74643 -1.000000 +74644 -1.000000 +74645 -1.000000 +74646 -1.000000 +74647 -1.000000 +74648 -1.000000 +74649 -1.000000 +74650 -1.000000 +74651 -1.000000 +74652 -1.000000 +74653 -1.000000 +74654 -1.000000 +74655 -1.000000 +74656 -1.000000 +74657 -1.000000 +74658 -1.000000 +74659 -1.000000 +74660 -1.000000 +74661 -1.000000 +74662 -1.000000 +74663 -1.000000 +74664 -1.000000 +74665 -1.000000 +74666 -1.000000 +74667 -1.000000 +74668 -1.000000 +74669 -1.000000 +74670 -1.000000 +74671 -1.000000 +74672 -1.000000 +74673 -1.000000 +74674 -1.000000 +74675 -1.000000 +74676 -1.000000 +74677 -1.000000 +74678 -1.000000 +74680 -1.000000 +74681 -1.000000 +74682 -1.000000 +74683 -1.000000 +74684 -1.000000 +74685 -1.000000 +74686 -1.000000 +74687 -1.000000 +74688 -1.000000 +74689 -1.000000 +74691 -1.000000 +74692 -1.000000 +74693 -1.000000 +74694 -1.000000 +74695 -1.000000 +74696 -1.000000 +74697 -1.000000 +74698 -1.000000 +74699 -1.000000 +74700 -1.000000 +74701 -1.000000 +74702 -1.000000 +74703 -1.000000 +74704 -1.000000 +74705 -1.000000 +74706 -1.000000 +74707 -1.000000 +74708 -1.000000 +74709 -1.000000 +74710 -1.000000 +74711 -1.000000 +74712 -1.000000 +74713 -1.000000 +74714 -1.000000 +74715 -1.000000 +74716 -1.000000 +74717 -1.000000 +74718 -1.000000 +74719 -1.000000 +74720 -1.000000 +74721 -1.000000 +74722 -1.000000 +74723 -1.000000 +74724 -1.000000 +74725 -1.000000 +74726 -1.000000 +74727 -1.000000 +74728 -1.000000 +74729 -1.000000 +74730 -1.000000 +74731 -1.000000 +74732 -1.000000 +74733 -1.000000 +74734 -1.000000 +74735 -1.000000 +74736 -1.000000 +74737 -1.000000 +74738 -1.000000 +74739 -1.000000 +74740 -1.000000 +74741 -1.000000 +74742 -1.000000 +74743 -1.000000 +74744 -1.000000 +74745 -1.000000 +74746 -1.000000 +74747 -1.000000 +74748 -1.000000 +74749 -1.000000 +74750 -1.000000 +74751 -1.000000 +74752 -1.000000 +74753 -1.000000 +74754 -1.000000 +74755 -1.000000 +74756 -1.000000 +74757 -1.000000 +74758 -1.000000 +74759 -1.000000 +74760 -1.000000 +74761 -1.000000 +74762 -1.000000 +74763 -1.000000 +74764 -1.000000 +74765 -1.000000 +74766 -1.000000 +74767 -1.000000 +74768 -1.000000 +74769 -1.000000 +74770 -1.000000 +74771 -1.000000 +74772 -1.000000 +74773 -1.000000 +74774 -1.000000 +74775 -1.000000 +74776 -1.000000 +74777 -1.000000 +74778 -1.000000 +74779 -1.000000 +74780 -1.000000 +74781 -1.000000 +74782 -1.000000 +74783 -1.000000 +74784 -1.000000 +74785 -1.000000 +74786 -1.000000 +74787 -1.000000 +74788 -1.000000 +74789 -1.000000 +74790 -1.000000 +74791 -1.000000 +74792 -1.000000 +74793 -1.000000 +74794 -1.000000 +74795 -1.000000 +74796 -1.000000 +74797 -1.000000 +74798 -1.000000 +74799 -1.000000 +74800 -1.000000 +74801 -1.000000 +74802 -1.000000 +74803 -1.000000 +74804 -1.000000 +74805 -1.000000 +74806 -1.000000 +74807 -1.000000 +74808 -1.000000 +74809 -1.000000 +74810 -1.000000 +74812 -1.000000 +74813 -1.000000 +74814 -1.000000 +74815 -1.000000 +74816 -1.000000 +74817 -1.000000 +74818 -1.000000 +74819 -1.000000 +74820 -1.000000 +74821 -1.000000 +74822 -1.000000 +74823 -1.000000 +74824 -1.000000 +74825 -1.000000 +74826 -1.000000 +74827 -1.000000 +74828 -1.000000 +74829 -1.000000 +74830 -1.000000 +74831 -1.000000 +74832 -1.000000 +74833 -1.000000 +74834 -1.000000 +74835 -1.000000 +74836 -1.000000 +74837 -1.000000 +74838 -1.000000 +74839 -1.000000 +74840 -1.000000 +74841 -1.000000 +74842 -1.000000 +74843 -1.000000 +74844 -1.000000 +74845 -1.000000 +74846 -1.000000 +74847 -1.000000 +74848 -1.000000 +74849 -1.000000 +74850 -1.000000 +74852 -1.000000 +74853 -1.000000 +74854 -1.000000 +74855 -1.000000 +74856 -1.000000 +74857 -1.000000 +74858 -1.000000 +74859 -1.000000 +74860 -1.000000 +74861 -1.000000 +74862 -1.000000 +74863 -1.000000 +74864 -1.000000 +74865 -1.000000 +74866 -1.000000 +74867 -1.000000 +74868 -1.000000 +74869 -1.000000 +74870 -1.000000 +74871 -1.000000 +74872 -1.000000 +74873 -1.000000 +74874 -1.000000 +74875 -1.000000 +74876 -1.000000 +74877 -1.000000 +74878 -1.000000 +74879 -1.000000 +74880 -1.000000 +74881 -1.000000 +74882 -1.000000 +74883 -1.000000 +74884 -1.000000 +74885 -1.000000 +74886 -1.000000 +74887 -1.000000 +74888 -1.000000 +74889 -1.000000 +74890 -1.000000 +74891 -1.000000 +74892 -1.000000 +74893 -1.000000 +74894 -1.000000 +74895 -1.000000 +74896 -1.000000 +74897 -1.000000 +74898 -1.000000 +74899 -1.000000 +74900 -1.000000 +74901 -1.000000 +74902 -1.000000 +74903 -1.000000 +74904 -1.000000 +74905 -1.000000 +74906 -1.000000 +74907 -1.000000 +74908 -1.000000 +74909 -1.000000 +74910 -1.000000 +74911 -1.000000 +74912 -1.000000 +74913 -1.000000 +74914 -1.000000 +74915 -1.000000 +74916 -1.000000 +74917 -1.000000 +74918 -1.000000 +74919 -1.000000 +74920 -1.000000 +74921 -1.000000 +74922 -1.000000 +74923 -1.000000 +74924 -1.000000 +74925 -1.000000 +74926 -1.000000 +74927 -1.000000 +74928 -1.000000 +74929 -1.000000 +74930 -1.000000 +74931 -1.000000 +74932 -1.000000 +74933 -1.000000 +74934 -1.000000 +74935 -1.000000 +74936 -1.000000 +74937 -1.000000 +74938 -1.000000 +74939 -1.000000 +74940 -1.000000 +74941 -1.000000 +74942 -1.000000 +74943 -1.000000 +74944 -1.000000 +74945 -1.000000 +74946 -1.000000 +74947 -1.000000 +74948 -1.000000 +74949 -1.000000 +74950 -1.000000 +74951 -1.000000 +74952 -1.000000 +74953 -1.000000 +74954 -1.000000 +74955 -1.000000 +74956 -1.000000 +74957 -1.000000 +74958 -1.000000 +74959 -1.000000 +74960 -1.000000 +74961 -1.000000 +74962 -1.000000 +74963 -1.000000 +74964 -1.000000 +74965 -1.000000 +74966 -1.000000 +74967 -1.000000 +74968 -1.000000 +74969 -1.000000 +74970 -1.000000 +74971 -1.000000 +74972 -1.000000 +74973 -1.000000 +74974 -1.000000 +74975 -1.000000 +74976 -1.000000 +74977 -1.000000 +74978 -1.000000 +74980 -1.000000 +74981 -1.000000 +74982 -1.000000 +74983 -1.000000 +74984 -1.000000 +74985 -1.000000 +74986 -1.000000 +74987 -1.000000 +74988 -1.000000 +74989 -1.000000 +74990 -1.000000 +74991 -1.000000 +74992 -1.000000 +74993 -1.000000 +74994 -1.000000 +74995 -1.000000 +74996 -1.000000 +74997 -1.000000 +74998 -1.000000 +74999 -1.000000 +75000 -1.000000 +75001 -1.000000 +75002 -1.000000 +75003 -1.000000 +75004 -1.000000 +75005 -1.000000 +75006 -1.000000 +75007 -1.000000 +75008 -1.000000 +75009 -1.000000 +75010 -1.000000 +75011 -1.000000 +75012 -1.000000 +75013 -1.000000 +75014 -1.000000 +75015 -1.000000 +75016 -1.000000 +75017 -1.000000 +75018 -1.000000 +75019 -1.000000 +75020 -1.000000 +75021 -1.000000 +75022 -1.000000 +75023 -1.000000 +75024 -1.000000 +75025 -1.000000 +75026 -1.000000 +75027 -1.000000 +75028 -1.000000 +75029 -1.000000 +75030 -1.000000 +75031 -1.000000 +75032 -1.000000 +75033 -1.000000 +75034 -1.000000 +75035 -1.000000 +75036 -1.000000 +75037 -1.000000 +75038 -1.000000 +75039 -1.000000 +75040 -1.000000 +75041 -1.000000 +75042 -1.000000 +75043 -1.000000 +75044 -1.000000 +75045 -1.000000 +75046 -1.000000 +75047 -1.000000 +75048 -1.000000 +75049 -1.000000 +75050 -1.000000 +75051 -1.000000 +75052 -1.000000 +75053 -1.000000 +75054 -1.000000 +75055 -1.000000 +75056 -1.000000 +75057 -1.000000 +75058 -1.000000 +75059 -1.000000 +75060 -1.000000 +75061 -1.000000 +75062 -1.000000 +75063 -1.000000 +75064 -1.000000 +75065 -1.000000 +75066 -1.000000 +75067 -1.000000 +75068 -1.000000 +75069 -1.000000 +75070 -1.000000 +75071 -1.000000 +75072 -1.000000 +75073 -1.000000 +75074 -1.000000 +75075 -1.000000 +75076 -1.000000 +75077 -1.000000 +75078 -1.000000 +75079 -1.000000 +75080 -1.000000 +75081 -1.000000 +75082 -1.000000 +75083 -1.000000 +75084 -1.000000 +75085 -1.000000 +75086 -1.000000 +75087 -1.000000 +75088 -1.000000 +75089 -1.000000 +75090 -1.000000 +75091 -1.000000 +75092 -1.000000 +75093 -1.000000 +75094 -1.000000 +75095 -1.000000 +75096 -1.000000 +75097 -1.000000 +75098 -1.000000 +75100 -1.000000 +75101 -1.000000 +75102 -1.000000 +75103 -1.000000 +75104 -1.000000 +75105 -1.000000 +75106 -1.000000 +75107 -1.000000 +75108 -1.000000 +75109 -1.000000 +75110 -1.000000 +75111 -1.000000 +75112 -1.000000 +75113 -1.000000 +75114 -1.000000 +75115 -1.000000 +75116 -1.000000 +75117 -1.000000 +75118 -1.000000 +75119 -1.000000 +75120 -1.000000 +75121 -1.000000 +75122 -1.000000 +75123 -1.000000 +75124 -1.000000 +75125 -1.000000 +75126 -1.000000 +75127 -1.000000 +75128 -1.000000 +75129 -1.000000 +75130 -1.000000 +75131 -1.000000 +75132 -1.000000 +75133 -1.000000 +75134 -1.000000 +75135 -1.000000 +75136 -1.000000 +75137 -1.000000 +75138 -1.000000 +75139 -1.000000 +75140 -1.000000 +75141 -1.000000 +75142 -1.000000 +75143 -1.000000 +75144 -1.000000 +75145 -1.000000 +75146 -1.000000 +75147 -1.000000 +75148 -1.000000 +75149 -1.000000 +75150 -1.000000 +75151 -1.000000 +75152 -1.000000 +75153 -1.000000 +75154 -1.000000 +75155 -1.000000 +75156 -1.000000 +75157 -1.000000 +75158 -1.000000 +75159 -1.000000 +75160 -1.000000 +75161 -1.000000 +75162 -1.000000 +75163 -1.000000 +75164 -1.000000 +75165 -1.000000 +75166 -1.000000 +75167 -1.000000 +75168 -1.000000 +75169 -1.000000 +75170 -1.000000 +75171 -1.000000 +75172 -1.000000 +75173 -1.000000 +75174 -1.000000 +75175 -1.000000 +75176 -1.000000 +75177 -1.000000 +75178 -1.000000 +75179 -1.000000 +75180 -1.000000 +75181 -1.000000 +75182 -1.000000 +75183 -1.000000 +75184 -1.000000 +75185 -1.000000 +75186 -1.000000 +75187 -1.000000 +75188 -1.000000 +75189 -1.000000 +75190 -1.000000 +75191 -1.000000 +75192 -1.000000 +75193 -1.000000 +75194 -1.000000 +75195 -1.000000 +75196 -1.000000 +75197 -1.000000 +75198 -1.000000 +75199 -1.000000 +75200 -1.000000 +75201 -1.000000 +75202 -1.000000 +75203 -1.000000 +75204 -1.000000 +75205 -1.000000 +75206 -1.000000 +75207 -1.000000 +75208 -1.000000 +75209 -1.000000 +75210 -1.000000 +75211 -1.000000 +75212 -1.000000 +75213 -1.000000 +75214 -1.000000 +75215 -1.000000 +75216 -1.000000 +75217 -1.000000 +75218 -1.000000 +75219 -1.000000 +75220 -1.000000 +75221 -1.000000 +75222 -1.000000 +75223 -1.000000 +75224 -1.000000 +75225 -1.000000 +75226 -1.000000 +75227 -1.000000 +75228 -1.000000 +75229 -1.000000 +75230 -1.000000 +75231 -1.000000 +75232 -1.000000 +75233 -1.000000 +75234 -1.000000 +75235 -1.000000 +75236 -1.000000 +75237 -1.000000 +75238 -1.000000 +75239 -1.000000 +75240 -1.000000 +75241 -1.000000 +75242 -1.000000 +75243 -1.000000 +75244 -1.000000 +75245 -1.000000 +75246 -1.000000 +75247 -1.000000 +75248 -1.000000 +75249 -1.000000 +75250 -1.000000 +75251 -1.000000 +75252 -1.000000 +75253 -1.000000 +75254 -1.000000 +75255 -1.000000 +75257 -1.000000 +75258 -1.000000 +75259 -1.000000 +75260 -1.000000 +75261 -1.000000 +75262 -1.000000 +75263 -1.000000 +75264 -1.000000 +75265 -1.000000 +75266 -1.000000 +75267 -1.000000 +75268 -1.000000 +75269 -1.000000 +75270 -1.000000 +75271 -1.000000 +75272 -1.000000 +75274 -1.000000 +75275 -1.000000 +75276 -1.000000 +75277 -1.000000 +75278 -1.000000 +75279 -1.000000 +75280 -1.000000 +75281 -1.000000 +75282 -1.000000 +75283 -1.000000 +75285 -1.000000 +75287 -1.000000 +75288 -1.000000 +75289 -1.000000 +75290 -1.000000 +75291 -1.000000 +75292 -1.000000 +75293 -1.000000 +75294 -1.000000 +75295 -1.000000 +75296 -1.000000 +75297 -1.000000 +75298 -1.000000 +75299 -1.000000 +75300 -1.000000 +75301 -1.000000 +75302 -1.000000 +75303 -1.000000 +75304 -1.000000 +75305 -1.000000 +75306 -1.000000 +75307 -1.000000 +75308 -1.000000 +75309 -1.000000 +75310 -1.000000 +75311 -1.000000 +75312 -1.000000 +75313 -1.000000 +75314 -1.000000 +75315 -1.000000 +75316 -1.000000 +75317 -1.000000 +75318 -1.000000 +75319 -1.000000 +75320 -1.000000 +75321 -1.000000 +75322 -1.000000 +75323 -1.000000 +75324 -1.000000 +75325 -1.000000 +75326 -1.000000 +75327 -1.000000 +75328 -1.000000 +75329 -1.000000 +75330 -1.000000 +75331 -1.000000 +75332 -1.000000 +75333 -1.000000 +75334 -1.000000 +75335 -1.000000 +75336 -1.000000 +75337 -1.000000 +75338 -1.000000 +75339 -1.000000 +75340 -1.000000 +75341 -1.000000 +75342 -1.000000 +75343 -1.000000 +75344 -1.000000 +75345 -1.000000 +75346 -1.000000 +75347 -1.000000 +75348 -1.000000 +75349 -1.000000 +75350 -1.000000 +75351 -1.000000 +75352 -1.000000 +75353 -1.000000 +75354 -1.000000 +75355 -1.000000 +75356 -1.000000 +75357 -1.000000 +75358 -1.000000 +75359 -1.000000 +75360 -1.000000 +75361 -1.000000 +75362 -1.000000 +75363 -1.000000 +75364 -1.000000 +75365 -1.000000 +75366 -1.000000 +75367 -1.000000 +75368 -1.000000 +75369 -1.000000 +75370 -1.000000 +75371 -1.000000 +75372 -1.000000 +75373 -1.000000 +75374 -1.000000 +75375 -1.000000 +75376 -1.000000 +75377 -1.000000 +75378 -1.000000 +75379 -1.000000 +75380 -1.000000 +75381 -1.000000 +75382 -1.000000 +75383 -1.000000 +75384 -1.000000 +75385 -1.000000 +75386 -1.000000 +75387 -1.000000 +75388 -1.000000 +75389 -1.000000 +75390 -1.000000 +75391 -1.000000 +75395 -1.000000 +75399 -1.000000 +75401 -1.000000 +75402 -1.000000 +75403 -1.000000 +75404 -1.000000 +75405 -1.000000 +75406 -1.000000 +75407 -1.000000 +75408 -1.000000 +75409 -1.000000 +75410 -1.000000 +75411 -1.000000 +75412 -1.000000 +75413 -1.000000 +75414 -1.000000 +75415 -1.000000 +75416 -1.000000 +75417 -1.000000 +75418 -1.000000 +75419 -1.000000 +75420 -1.000000 +75421 -1.000000 +75422 -1.000000 +75423 -1.000000 +75424 -1.000000 +75425 -1.000000 +75426 -1.000000 +75427 -1.000000 +75428 -1.000000 +75429 -1.000000 +75430 -1.000000 +75431 -1.000000 +75432 -1.000000 +75433 -1.000000 +75434 -1.000000 +75435 -1.000000 +75436 -1.000000 +75437 -1.000000 +75438 -1.000000 +75439 -1.000000 +75440 -1.000000 +75441 -1.000000 +75442 -1.000000 +75443 -1.000000 +75444 -1.000000 +75445 -1.000000 +75446 -1.000000 +75447 -1.000000 +75448 -1.000000 +75449 -1.000000 +75450 -1.000000 +75451 -1.000000 +75452 -1.000000 +75453 -1.000000 +75454 -1.000000 +75455 -1.000000 +75456 -1.000000 +75457 -1.000000 +75458 -1.000000 +75459 -1.000000 +75460 -1.000000 +75461 -1.000000 +75462 -1.000000 +75463 -1.000000 +75464 -1.000000 +75465 -1.000000 +75466 -1.000000 +75467 -1.000000 +75468 -1.000000 +75469 -1.000000 +75470 -1.000000 +75471 -1.000000 +75472 -1.000000 +75473 -1.000000 +75474 -1.000000 +75475 -1.000000 +75476 -1.000000 +75477 -1.000000 +75478 -1.000000 +75479 -1.000000 +75480 -1.000000 +75481 -1.000000 +75482 -1.000000 +75483 -1.000000 +75484 -1.000000 +75485 -1.000000 +75486 -1.000000 +75487 -1.000000 +75488 -1.000000 +75489 -1.000000 +75490 -1.000000 +75491 -1.000000 +75492 -1.000000 +75493 -1.000000 +75494 -1.000000 +75495 -1.000000 +75496 -1.000000 +75497 -1.000000 +75498 -1.000000 +75499 -1.000000 +75500 -1.000000 +75501 -1.000000 +75502 -1.000000 +75503 -1.000000 +75504 -1.000000 +75505 -1.000000 +75506 -1.000000 +75507 -1.000000 +75508 -1.000000 +75509 -1.000000 +75510 -1.000000 +75511 -1.000000 +75512 -1.000000 +75513 -1.000000 +75514 -1.000000 +75515 -1.000000 +75516 -1.000000 +75517 -1.000000 +75518 -1.000000 +75519 -1.000000 +75520 -1.000000 +75521 -1.000000 +75522 -1.000000 +75523 -1.000000 +75524 -1.000000 +75525 -1.000000 +75526 -1.000000 +75527 -1.000000 +75528 -1.000000 +75529 -1.000000 +75530 -1.000000 +75531 -1.000000 +75532 -1.000000 +75533 -1.000000 +75534 -1.000000 +75535 -1.000000 +75536 -1.000000 +75537 -1.000000 +75538 -1.000000 +75539 -1.000000 +75540 -1.000000 +75541 -1.000000 +75542 -1.000000 +75543 -1.000000 +75544 -1.000000 +75545 -1.000000 +75546 -1.000000 +75547 -1.000000 +75548 -1.000000 +75549 -1.000000 +75550 -1.000000 +75551 -1.000000 +75552 -1.000000 +75553 -1.000000 +75554 -1.000000 +75555 -1.000000 +75556 -1.000000 +75557 -1.000000 +75558 -1.000000 +75559 -1.000000 +75560 -1.000000 +75561 -1.000000 +75562 -1.000000 +75563 -1.000000 +75564 -1.000000 +75565 -1.000000 +75566 -1.000000 +75567 -1.000000 +75568 -1.000000 +75570 -1.000000 +75571 -1.000000 +75572 -1.000000 +75573 -1.000000 +75574 -1.000000 +75575 -1.000000 +75576 -1.000000 +75577 -1.000000 +75578 -1.000000 +75579 -1.000000 +75580 -1.000000 +75581 -1.000000 +75582 -1.000000 +75583 -1.000000 +75584 -1.000000 +75585 -1.000000 +75586 -1.000000 +75587 -1.000000 +75588 -1.000000 +75589 -1.000000 +75590 -1.000000 +75591 -1.000000 +75592 -1.000000 +75593 -1.000000 +75594 -1.000000 +75595 -1.000000 +75596 -1.000000 +75597 -1.000000 +75598 -1.000000 +75599 -1.000000 +75600 -1.000000 +75601 -1.000000 +75602 -1.000000 +75603 -1.000000 +75604 -1.000000 +75605 -1.000000 +75606 -1.000000 +75607 -1.000000 +75608 -1.000000 +75609 -1.000000 +75610 -1.000000 +75611 -1.000000 +75612 -1.000000 +75613 -1.000000 +75614 -1.000000 +75615 -1.000000 +75616 -1.000000 +75617 -1.000000 +75618 -1.000000 +75619 -1.000000 +75620 -1.000000 +75621 -1.000000 +75622 -1.000000 +75623 -1.000000 +75624 -1.000000 +75625 -1.000000 +75626 -1.000000 +75627 -1.000000 +75628 -1.000000 +75629 -1.000000 +75630 -1.000000 +75631 -1.000000 +75632 -1.000000 +75633 -1.000000 +75634 -1.000000 +75635 -1.000000 +75636 -1.000000 +75637 -1.000000 +75638 -1.000000 +75639 -1.000000 +75640 -1.000000 +75641 -1.000000 +75642 -1.000000 +75643 -1.000000 +75644 -1.000000 +75645 -1.000000 +75646 -1.000000 +75647 -1.000000 +75648 -1.000000 +75649 -1.000000 +75650 -1.000000 +75651 -1.000000 +75652 -1.000000 +75653 -1.000000 +75654 -1.000000 +75655 -1.000000 +75656 -1.000000 +75657 -1.000000 +75658 -1.000000 +75659 -1.000000 +75660 -1.000000 +75661 -1.000000 +75662 -1.000000 +75663 -1.000000 +75664 -1.000000 +75665 -1.000000 +75666 -1.000000 +75667 -1.000000 +75668 -1.000000 +75669 -1.000000 +75670 -1.000000 +75671 -1.000000 +75672 -1.000000 +75673 -1.000000 +75674 -1.000000 +75675 -1.000000 +75676 -1.000000 +75677 -1.000000 +75678 -1.000000 +75679 -1.000000 +75680 -1.000000 +75681 -1.000000 +75682 -1.000000 +75683 -1.000000 +75684 -1.000000 +75685 -1.000000 +75686 -1.000000 +75687 -1.000000 +75688 -1.000000 +75689 -1.000000 +75690 -1.000000 +75691 -1.000000 +75692 -1.000000 +75693 -1.000000 +75694 -1.000000 +75695 -1.000000 +75696 -1.000000 +75697 -1.000000 +75698 -1.000000 +75699 -1.000000 +75700 -1.000000 +75701 -1.000000 +75702 -1.000000 +75703 -1.000000 +75704 -1.000000 +75705 -1.000000 +75706 -1.000000 +75707 -1.000000 +75708 -1.000000 +75709 -1.000000 +75710 -1.000000 +75711 -1.000000 +75712 -1.000000 +75713 -1.000000 +75714 -1.000000 +75715 -1.000000 +75716 -1.000000 +75717 -1.000000 +75718 -1.000000 +75719 -1.000000 +75720 -1.000000 +75721 -1.000000 +75722 -1.000000 +75723 -1.000000 +75724 -1.000000 +75725 -1.000000 +75726 -1.000000 +75727 -1.000000 +75728 -1.000000 +75729 -1.000000 +75730 -1.000000 +75731 -1.000000 +75732 -1.000000 +75733 -1.000000 +75734 -1.000000 +75735 -1.000000 +75736 -1.000000 +75737 -1.000000 +75738 -1.000000 +75739 -1.000000 +75740 -1.000000 +75741 -1.000000 +75742 -1.000000 +75743 -1.000000 +75744 -1.000000 +75745 -1.000000 +75746 -1.000000 +75747 -1.000000 +75748 -1.000000 +75749 -1.000000 +75750 -1.000000 +75751 -1.000000 +75752 -1.000000 +75753 -1.000000 +75754 -1.000000 +75755 -1.000000 +75756 -1.000000 +75757 -1.000000 +75758 -1.000000 +75759 -1.000000 +75760 -1.000000 +75761 -1.000000 +75762 -1.000000 +75763 -1.000000 +75764 -1.000000 +75765 -1.000000 +75766 -1.000000 +75767 -1.000000 +75768 -1.000000 +75769 -1.000000 +75770 -1.000000 +75771 -1.000000 +75772 -1.000000 +75773 -1.000000 +75774 -1.000000 +75775 -1.000000 +75776 -1.000000 +75777 -1.000000 +75778 -1.000000 +75779 -1.000000 +75780 -1.000000 +75781 -1.000000 +75782 -1.000000 +75783 -1.000000 +75784 -1.000000 +75785 -1.000000 +75786 -1.000000 +75787 -1.000000 +75788 -1.000000 +75789 -1.000000 +75790 -1.000000 +75791 -1.000000 +75792 -1.000000 +75793 -1.000000 +75794 -1.000000 +75795 -1.000000 +75796 -1.000000 +75797 -1.000000 +75798 -1.000000 +75799 -1.000000 +75800 -1.000000 +75801 -1.000000 +75802 -1.000000 +75803 -1.000000 +75804 -1.000000 +75805 -1.000000 +75806 -1.000000 +75807 -1.000000 +75808 -1.000000 +75809 -1.000000 +75810 -1.000000 +75811 -1.000000 +75812 -1.000000 +75813 -1.000000 +75814 -1.000000 +75815 -1.000000 +75816 -1.000000 +75817 -1.000000 +75818 -1.000000 +75819 -1.000000 +75820 -1.000000 +75821 -1.000000 +75822 -1.000000 +75823 -1.000000 +75824 -1.000000 +75825 -1.000000 +75826 -1.000000 +75827 -1.000000 +75828 -1.000000 +75829 -1.000000 +75830 -1.000000 +75831 -1.000000 +75832 -1.000000 +75833 -1.000000 +75834 -1.000000 +75835 -1.000000 +75836 -1.000000 +75837 -1.000000 +75838 -1.000000 +75839 -1.000000 +75840 -1.000000 +75841 -1.000000 +75842 -1.000000 +75843 -1.000000 +75844 -1.000000 +75845 -1.000000 +75846 -1.000000 +75847 -1.000000 +75848 -1.000000 +75849 -1.000000 +75850 -1.000000 +75851 -1.000000 +75852 -1.000000 +75853 -1.000000 +75854 -1.000000 +75855 -1.000000 +75856 -1.000000 +75857 -1.000000 +75858 -1.000000 +75859 -1.000000 +75860 -1.000000 +75861 -1.000000 +75862 -1.000000 +75863 -1.000000 +75864 -1.000000 +75865 -1.000000 +75866 -1.000000 +75867 -1.000000 +75868 -1.000000 +75869 -1.000000 +75870 -1.000000 +75871 -1.000000 +75872 -1.000000 +75873 -1.000000 +75874 -1.000000 +75875 -1.000000 +75876 -1.000000 +75877 -1.000000 +75878 -1.000000 +75879 -1.000000 +75880 -1.000000 +75881 -1.000000 +75882 -1.000000 +75883 -1.000000 +75884 -1.000000 +75885 -1.000000 +75886 -1.000000 +75887 -1.000000 +75888 -1.000000 +75889 -1.000000 +75890 -1.000000 +75891 -1.000000 +75892 -1.000000 +75893 -1.000000 +75894 -1.000000 +75895 -1.000000 +75896 -1.000000 +75897 -1.000000 +75898 -1.000000 +75899 -1.000000 +75900 -1.000000 +75901 -1.000000 +75902 -1.000000 +75903 -1.000000 +75904 -1.000000 +75905 -1.000000 +75906 -1.000000 +75907 -1.000000 +75908 -1.000000 +75909 -1.000000 +75910 -1.000000 +75911 -1.000000 +75912 -1.000000 +75913 -1.000000 +75914 -1.000000 +75915 -1.000000 +75916 -1.000000 +75917 -1.000000 +75918 -1.000000 +75919 -1.000000 +75920 -1.000000 +75921 -1.000000 +75922 -1.000000 +75923 -1.000000 +75924 -1.000000 +75925 -1.000000 +75926 -1.000000 +75927 -1.000000 +75928 -1.000000 +75929 -1.000000 +75930 -1.000000 +75931 -1.000000 +75932 -1.000000 +75933 -1.000000 +75934 -1.000000 +75935 -1.000000 +75936 -1.000000 +75937 -1.000000 +75938 -1.000000 +75939 -1.000000 +75940 -1.000000 +75941 -1.000000 +75942 -1.000000 +75943 -1.000000 +75944 -1.000000 +75945 -1.000000 +75946 -1.000000 +75947 -1.000000 +75948 -1.000000 +75949 -1.000000 +75950 -1.000000 +75951 -1.000000 +75952 -1.000000 +75953 -1.000000 +75954 -1.000000 +75955 -1.000000 +75956 -1.000000 +75957 -1.000000 +75958 -1.000000 +75959 -1.000000 +75960 -1.000000 +75961 -1.000000 +75962 -1.000000 +75963 -1.000000 +75964 -1.000000 +75965 -1.000000 +75966 -1.000000 +75967 -1.000000 +75968 -1.000000 +75969 -1.000000 +75970 -1.000000 +75971 -1.000000 +75972 -1.000000 +75973 -1.000000 +75974 -1.000000 +75975 -1.000000 +75976 -1.000000 +75977 -1.000000 +75978 -1.000000 +75979 -1.000000 +75980 -1.000000 +75981 -1.000000 +75982 -1.000000 +75983 -1.000000 +75984 -1.000000 +75985 -1.000000 +75986 -1.000000 +75987 -1.000000 +75988 -1.000000 +75989 -1.000000 +75990 -1.000000 +75991 -1.000000 +75992 -1.000000 +75993 -1.000000 +75994 -1.000000 +75995 -1.000000 +75996 -1.000000 +75997 -1.000000 +75998 -1.000000 +75999 -1.000000 +76000 -1.000000 +76001 -1.000000 +76002 -1.000000 +76003 -1.000000 +76004 -1.000000 +76005 -1.000000 +76006 -1.000000 +76007 -1.000000 +76008 -1.000000 +76009 -1.000000 +76010 -1.000000 +76011 -1.000000 +76012 -1.000000 +76013 -1.000000 +76014 -1.000000 +76015 -1.000000 +76016 -1.000000 +76017 -1.000000 +76018 -1.000000 +76019 -1.000000 +76020 -1.000000 +76021 -1.000000 +76022 -1.000000 +76023 -1.000000 +76024 -1.000000 +76025 -1.000000 +76026 -1.000000 +76027 -1.000000 +76028 -1.000000 +76029 -1.000000 +76030 -1.000000 +76031 -1.000000 +76032 -1.000000 +76033 -1.000000 +76034 -1.000000 +76035 -1.000000 +76036 -1.000000 +76037 -1.000000 +76038 -1.000000 +76039 -1.000000 +76040 -1.000000 +76041 -1.000000 +76042 -1.000000 +76043 -1.000000 +76044 -1.000000 +76045 -1.000000 +76046 -1.000000 +76047 -1.000000 +76048 -1.000000 +76049 -1.000000 +76050 -1.000000 +76051 -1.000000 +76052 -1.000000 +76053 -1.000000 +76054 -1.000000 +76055 -1.000000 +76056 -1.000000 +76057 -1.000000 +76058 -1.000000 +76059 -1.000000 +76060 -1.000000 +76061 -1.000000 +76062 -1.000000 +76063 -1.000000 +76064 -1.000000 +76065 -1.000000 +76066 -1.000000 +76067 -1.000000 +76068 -1.000000 +76069 -1.000000 +76070 -1.000000 +76071 -1.000000 +76072 -1.000000 +76073 -1.000000 +76074 -1.000000 +76075 -1.000000 +76076 -1.000000 +76077 -1.000000 +76078 -1.000000 +76079 -1.000000 +76080 -1.000000 +76081 -1.000000 +76082 -1.000000 +76083 -1.000000 +76084 -1.000000 +76085 -1.000000 +76086 -1.000000 +76087 -1.000000 +76088 -1.000000 +76089 -1.000000 +76090 -1.000000 +76091 -1.000000 +76092 -1.000000 +76093 -1.000000 +76094 -1.000000 +76095 -1.000000 +76096 -1.000000 +76097 -1.000000 +76098 -1.000000 +76099 -1.000000 +76100 -1.000000 +76101 -1.000000 +76102 -1.000000 +76103 -1.000000 +76104 -1.000000 +76105 -1.000000 +76106 -1.000000 +76107 -1.000000 +76108 -1.000000 +76109 -1.000000 +76110 -1.000000 +76111 -1.000000 +76112 -1.000000 +76113 -1.000000 +76114 -1.000000 +76115 -1.000000 +76116 -1.000000 +76117 -1.000000 +76118 -1.000000 +76119 -1.000000 +76120 -1.000000 +76121 -1.000000 +76122 -1.000000 +76123 -1.000000 +76124 -1.000000 +76125 -1.000000 +76126 -1.000000 +76127 -1.000000 +76128 -1.000000 +76129 -1.000000 +76130 -1.000000 +76131 -1.000000 +76132 -1.000000 +76133 -1.000000 +76134 -1.000000 +76135 -1.000000 +76136 -1.000000 +76137 -1.000000 +76138 -1.000000 +76139 -1.000000 +76140 -1.000000 +76141 -1.000000 +76142 -1.000000 +76143 -1.000000 +76144 -1.000000 +76145 -1.000000 +76146 -1.000000 +76147 -1.000000 +76148 -1.000000 +76149 -1.000000 +76150 -1.000000 +76151 -1.000000 +76152 -1.000000 +76153 -1.000000 +76154 -1.000000 +76155 -1.000000 +76156 -1.000000 +76157 -1.000000 +76158 -1.000000 +76159 -1.000000 +76160 -1.000000 +76161 -1.000000 +76162 -1.000000 +76163 -1.000000 +76164 -1.000000 +76165 -1.000000 +76166 -1.000000 +76167 -1.000000 +76168 -1.000000 +76169 -1.000000 +76170 -1.000000 +76171 -1.000000 +76172 -1.000000 +76173 -1.000000 +76174 -1.000000 +76175 -1.000000 +76176 -1.000000 +76177 -1.000000 +76178 -1.000000 +76179 -1.000000 +76180 -1.000000 +76181 -1.000000 +76182 -1.000000 +76183 -1.000000 +76184 -1.000000 +76185 -1.000000 +76186 -1.000000 +76187 -1.000000 +76189 -1.000000 +76190 -1.000000 +76191 -1.000000 +76192 -1.000000 +76193 -1.000000 +76194 -1.000000 +76195 -1.000000 +76196 -1.000000 +76197 -1.000000 +76198 -1.000000 +76199 -1.000000 +76200 -1.000000 +76201 -1.000000 +76202 -1.000000 +76203 -1.000000 +76204 -1.000000 +76205 -1.000000 +76206 -1.000000 +76207 -1.000000 +76208 -1.000000 +76209 -1.000000 +76210 -1.000000 +76211 -1.000000 +76212 -1.000000 +76213 -1.000000 +76214 -1.000000 +76215 -1.000000 +76216 -1.000000 +76217 -1.000000 +76218 -1.000000 +76219 -1.000000 +76220 -1.000000 +76221 -1.000000 +76222 -1.000000 +76223 -1.000000 +76224 -1.000000 +76232 -1.000000 +76233 -1.000000 +76234 -1.000000 +76235 -1.000000 +76236 -1.000000 +76237 -1.000000 +76239 -1.000000 +76240 -1.000000 +76241 -1.000000 +76242 -1.000000 +76243 -1.000000 +76244 -1.000000 +76245 -1.000000 +76246 -1.000000 +76247 -1.000000 +76248 -1.000000 +76249 -1.000000 +76250 -1.000000 +76251 -1.000000 +76252 -1.000000 +76253 -1.000000 +76254 -1.000000 +76255 -1.000000 +76256 -1.000000 +76257 -1.000000 +76258 -1.000000 +76259 -1.000000 +76260 -1.000000 +76261 -1.000000 +76262 -1.000000 +76263 -1.000000 +76264 -1.000000 +76265 -1.000000 +76266 -1.000000 +76267 -1.000000 +76268 -1.000000 +76269 -1.000000 +76270 -1.000000 +76271 -1.000000 +76272 -1.000000 +76273 -1.000000 +76274 -1.000000 +76275 -1.000000 +76276 -1.000000 +76278 -1.000000 +76279 -1.000000 +76280 -1.000000 +76281 -1.000000 +76282 -1.000000 +76283 -1.000000 +76284 -1.000000 +76285 -1.000000 +76286 -1.000000 +76287 -1.000000 +76288 -1.000000 +76289 -1.000000 +76290 -1.000000 +76291 -1.000000 +76292 -1.000000 +76293 -1.000000 +76294 -1.000000 +76295 -1.000000 +76296 -1.000000 +76297 -1.000000 +76298 -1.000000 +76305 -1.000000 +76306 -1.000000 +76307 -1.000000 +76308 -1.000000 +76309 -1.000000 +76310 -1.000000 +76311 -1.000000 +76312 -1.000000 +76313 -1.000000 +76314 -1.000000 +76315 -1.000000 +76316 -1.000000 +76317 -1.000000 +76318 -1.000000 +76319 -1.000000 +76320 -1.000000 +76321 -1.000000 +76322 -1.000000 +76323 -1.000000 +76324 -1.000000 +76325 -1.000000 +76326 -1.000000 +76327 -1.000000 +76328 -1.000000 +76329 -1.000000 +76330 -1.000000 +76331 -1.000000 +76332 -1.000000 +76333 -1.000000 +76334 -1.000000 +76335 -1.000000 +76336 -1.000000 +76337 -1.000000 +76338 -1.000000 +76339 -1.000000 +76340 -1.000000 +76341 -1.000000 +76342 -1.000000 +76343 -1.000000 +76344 -1.000000 +76347 -1.000000 +76348 -1.000000 +76349 -1.000000 +76350 -1.000000 +76351 -1.000000 +76352 -1.000000 +76353 -1.000000 +76354 -1.000000 +76355 -1.000000 +76356 -1.000000 +76357 -1.000000 +76358 -1.000000 +76359 -1.000000 +76360 -1.000000 +76361 -1.000000 +76362 -1.000000 +76363 -1.000000 +76364 -1.000000 +76365 -1.000000 +76366 -1.000000 +76367 -1.000000 +76368 -1.000000 +76369 -1.000000 +76370 -1.000000 +76371 -1.000000 +76372 -1.000000 +76373 -1.000000 +76374 -1.000000 +76375 -1.000000 +76376 -1.000000 +76377 -1.000000 +76378 -1.000000 +76379 -1.000000 +76380 -1.000000 +76381 -1.000000 +76382 -1.000000 +76383 -1.000000 +76384 -1.000000 +76385 -1.000000 +76386 -1.000000 +76387 -1.000000 +76388 -1.000000 +76389 -1.000000 +76390 -1.000000 +76391 -1.000000 +76392 -1.000000 +76397 -1.000000 +76398 -1.000000 +76399 -1.000000 +76400 -1.000000 +76401 -1.000000 +76402 -1.000000 +76403 -1.000000 +76404 -1.000000 +76405 -1.000000 +76406 -1.000000 +76407 -1.000000 +76408 -1.000000 +76409 -1.000000 +76410 -1.000000 +76411 -1.000000 +76412 -1.000000 +76413 -1.000000 +76414 -1.000000 +76415 -1.000000 +76416 -1.000000 +76417 -1.000000 +76418 -1.000000 +76419 -1.000000 +76420 -1.000000 +76421 -1.000000 +76422 -1.000000 +76423 -1.000000 +76424 -1.000000 +76425 -1.000000 +76426 -1.000000 +76427 -1.000000 +76428 -1.000000 +76429 -1.000000 +76430 -1.000000 +76431 -1.000000 +76432 -1.000000 +76433 -1.000000 +76434 -1.000000 +76435 -1.000000 +76436 -1.000000 +76437 -1.000000 +76438 -1.000000 +76439 -1.000000 +76440 -1.000000 +76441 -1.000000 +76442 -1.000000 +76443 -1.000000 +76444 -1.000000 +76445 -1.000000 +76446 -1.000000 +76447 -1.000000 +76448 -1.000000 +76449 -1.000000 +76450 -1.000000 +76451 -1.000000 +76452 -1.000000 +76453 -1.000000 +76454 -1.000000 +76455 -1.000000 +76456 -1.000000 +76457 -1.000000 +76458 -1.000000 +76459 -1.000000 +76461 -1.000000 +76462 -1.000000 +76463 -1.000000 +76464 -1.000000 +76465 -1.000000 +76466 -1.000000 +76467 -1.000000 +76468 -1.000000 +76469 -1.000000 +76470 -1.000000 +76471 -1.000000 +76472 -1.000000 +76473 -1.000000 +76474 -1.000000 +76475 -1.000000 +76476 -1.000000 +76477 -1.000000 +76478 -1.000000 +76479 -1.000000 +76480 -1.000000 +76481 -1.000000 +76482 -1.000000 +76483 -1.000000 +76484 -1.000000 +76485 -1.000000 +76486 -1.000000 +76487 -1.000000 +76488 -1.000000 +76489 -1.000000 +76490 -1.000000 +76491 -1.000000 +76492 -1.000000 +76493 -1.000000 +76494 -1.000000 +76495 -1.000000 +76496 -1.000000 +76497 -1.000000 +76498 -1.000000 +76499 -1.000000 +76500 -1.000000 +76501 -1.000000 +76502 -1.000000 +76503 -1.000000 +76504 -1.000000 +76505 -1.000000 +76506 -1.000000 +76507 -1.000000 +76508 -1.000000 +76509 -1.000000 +76510 -1.000000 +76511 -1.000000 +76512 -1.000000 +76513 -1.000000 +76514 -1.000000 +76515 -1.000000 +76516 -1.000000 +76517 -1.000000 +76518 -1.000000 +76519 -1.000000 +76520 -1.000000 +76521 -1.000000 +76522 -1.000000 +76523 -1.000000 +76524 -1.000000 +76525 -1.000000 +76526 -1.000000 +76527 -1.000000 +76528 -1.000000 +76529 -1.000000 +76530 -1.000000 +76531 -1.000000 +76532 -1.000000 +76533 -1.000000 +76534 -1.000000 +76535 -1.000000 +76536 -1.000000 +76537 -1.000000 +76538 -1.000000 +76539 -1.000000 +76540 -1.000000 +76541 -1.000000 +76542 -1.000000 +76543 -1.000000 +76544 -1.000000 +76545 -1.000000 +76546 -1.000000 +76547 -1.000000 +76548 -1.000000 +76549 -1.000000 +76550 -1.000000 +76551 -1.000000 +76552 -1.000000 +76553 -1.000000 +76554 -1.000000 +76555 -1.000000 +76556 -1.000000 +76557 -1.000000 +76558 -1.000000 +76559 -1.000000 +76560 -1.000000 +76561 -1.000000 +76562 -1.000000 +76563 -1.000000 +76564 -1.000000 +76565 -1.000000 +76566 -1.000000 +76567 -1.000000 +76568 -1.000000 +76569 -1.000000 +76570 -1.000000 +76571 -1.000000 +76572 -1.000000 +76573 -1.000000 +76574 -1.000000 +76575 -1.000000 +76576 -1.000000 +76577 -1.000000 +76578 -1.000000 +76579 -1.000000 +76580 -1.000000 +76581 -1.000000 +76582 -1.000000 +76583 -1.000000 +76584 -1.000000 +76585 -1.000000 +76586 -1.000000 +76587 -1.000000 +76588 -1.000000 +76589 -1.000000 +76590 -1.000000 +76591 -1.000000 +76592 -1.000000 +76593 -1.000000 +76594 -1.000000 +76597 -1.000000 +76598 -1.000000 +76599 -1.000000 +76600 -1.000000 +76601 -1.000000 +76604 -1.000000 +76605 -1.000000 +76606 -1.000000 +76607 -1.000000 +76608 -1.000000 +76609 -1.000000 +76610 -1.000000 +76611 -1.000000 +76612 -1.000000 +76613 -1.000000 +76614 -1.000000 +76615 -1.000000 +76616 -1.000000 +76617 -1.000000 +76618 -1.000000 +76619 -1.000000 +76620 -1.000000 +76621 -1.000000 +76622 -1.000000 +76623 -1.000000 +76624 -1.000000 +76625 -1.000000 +76626 -1.000000 +76627 -1.000000 +76628 -1.000000 +76629 -1.000000 +76630 -1.000000 +76631 -1.000000 +76632 -1.000000 +76633 -1.000000 +76634 -1.000000 +76635 -1.000000 +76636 -1.000000 +76637 -1.000000 +76638 -1.000000 +76639 -1.000000 +76640 -1.000000 +76641 -1.000000 +76642 -1.000000 +76643 -1.000000 +76644 -1.000000 +76645 -1.000000 +76646 -1.000000 +76647 -1.000000 +76648 -1.000000 +76649 -1.000000 +76650 -1.000000 +76651 -1.000000 +76652 -1.000000 +76653 -1.000000 +76654 -1.000000 +76655 -1.000000 +76656 -1.000000 +76657 -1.000000 +76658 -1.000000 +76659 -1.000000 +76660 -1.000000 +76661 -1.000000 +76662 -1.000000 +76663 -1.000000 +76664 -1.000000 +76665 -1.000000 +76666 -1.000000 +76667 -1.000000 +76668 -1.000000 +76669 -1.000000 +76670 -1.000000 +76671 -1.000000 +76672 -1.000000 +76673 -1.000000 +76674 -1.000000 +76675 -1.000000 +76676 -1.000000 +76677 -1.000000 +76678 -1.000000 +76679 -1.000000 +76680 -1.000000 +76681 -1.000000 +76682 -1.000000 +76683 -1.000000 +76684 -1.000000 +76685 -1.000000 +76686 -1.000000 +76687 -1.000000 +76688 -1.000000 +76689 -1.000000 +76690 -1.000000 +76691 -1.000000 +76692 -1.000000 +76693 -1.000000 +76694 -1.000000 +76695 -1.000000 +76696 -1.000000 +76697 -1.000000 +76698 -1.000000 +76699 -1.000000 +76700 -1.000000 +76701 -1.000000 +76702 -1.000000 +76703 -1.000000 +76704 -1.000000 +76705 -1.000000 +76706 -1.000000 +76707 -1.000000 +76708 -1.000000 +76709 -1.000000 +76710 -1.000000 +76711 -1.000000 +76712 -1.000000 +76713 -1.000000 +76714 -1.000000 +76715 -1.000000 +76716 -1.000000 +76717 -1.000000 +76718 -1.000000 +76719 -1.000000 +76720 -1.000000 +76721 -1.000000 +76722 -1.000000 +76723 -1.000000 +76724 -1.000000 +76725 -1.000000 +76726 -1.000000 +76727 -1.000000 +76728 -1.000000 +76729 -1.000000 +76730 -1.000000 +76731 -1.000000 +76732 -1.000000 +76733 -1.000000 +76734 -1.000000 +76735 -1.000000 +76736 -1.000000 +76737 -1.000000 +76738 -1.000000 +76739 -1.000000 +76740 -1.000000 +76741 -1.000000 +76742 -1.000000 +76743 -1.000000 +76744 -1.000000 +76745 -1.000000 +76746 -1.000000 +76747 -1.000000 +76748 -1.000000 +76749 -1.000000 +76750 -1.000000 +76751 -1.000000 +76752 -1.000000 +76753 -1.000000 +76754 -1.000000 +76755 -1.000000 +76756 -1.000000 +76757 -1.000000 +76758 -1.000000 +76759 -1.000000 +76760 -1.000000 +76761 -1.000000 +76762 -1.000000 +76763 -1.000000 +76764 -1.000000 +76765 -1.000000 +76766 -1.000000 +76767 -1.000000 +76768 -1.000000 +76769 -1.000000 +76770 -1.000000 +76771 -1.000000 +76772 -1.000000 +76773 -1.000000 +76774 -1.000000 +76775 -1.000000 +76776 -1.000000 +76777 -1.000000 +76778 -1.000000 +76779 -1.000000 +76780 -1.000000 +76781 -1.000000 +76782 -1.000000 +76783 -1.000000 +76784 -1.000000 +76785 -1.000000 +76786 -1.000000 +76787 -1.000000 +76788 -1.000000 +76789 -1.000000 +76790 -1.000000 +76791 -1.000000 +76792 -1.000000 +76793 -1.000000 +76794 -1.000000 +76795 -1.000000 +76796 -1.000000 +76797 -1.000000 +76798 -1.000000 +76799 -1.000000 +76800 -1.000000 +76801 -1.000000 +76802 -1.000000 +76803 -1.000000 +76804 -1.000000 +76805 -1.000000 +76806 -1.000000 +76807 -1.000000 +76808 -1.000000 +76809 -1.000000 +76810 -1.000000 +76811 -1.000000 +76812 -1.000000 +76813 -1.000000 +76814 -1.000000 +76815 -1.000000 +76816 -1.000000 +76817 -1.000000 +76818 -1.000000 +76819 -1.000000 +76820 -1.000000 +76821 -1.000000 +76822 -1.000000 +76823 -1.000000 +76824 -1.000000 +76825 -1.000000 +76826 -1.000000 +76827 -1.000000 +76828 -1.000000 +76829 -1.000000 +76830 -1.000000 +76831 -1.000000 +76832 -1.000000 +76833 -1.000000 +76834 -1.000000 +76835 -1.000000 +76836 -1.000000 +76837 -1.000000 +76838 -1.000000 +76839 -1.000000 +76840 -1.000000 +76841 -1.000000 +76842 -1.000000 +76843 -1.000000 +76844 -1.000000 +76845 -1.000000 +76846 -1.000000 +76847 -1.000000 +76848 -1.000000 +76849 -1.000000 +76850 -1.000000 +76851 -1.000000 +76852 -1.000000 +76853 -1.000000 +76854 -1.000000 +76855 -1.000000 +76856 -1.000000 +76857 -1.000000 +76858 -1.000000 +76859 -1.000000 +76860 -1.000000 +76861 -1.000000 +76862 -1.000000 +76863 -1.000000 +76864 -1.000000 +76865 -1.000000 +76866 -1.000000 +76867 -1.000000 +76868 -1.000000 +76869 -1.000000 +76870 -1.000000 +76871 -1.000000 +76872 -1.000000 +76873 -1.000000 +76874 -1.000000 +76875 -1.000000 +76876 -1.000000 +76877 -1.000000 +76878 -1.000000 +76879 -1.000000 +76880 -1.000000 +76881 -1.000000 +76882 -1.000000 +76883 -1.000000 +76884 -1.000000 +76885 -1.000000 +76886 -1.000000 +76887 -1.000000 +76888 -1.000000 +76889 -1.000000 +76890 -1.000000 +76891 -1.000000 +76892 -1.000000 +76893 -1.000000 +76895 -1.000000 +76896 -1.000000 +76897 -1.000000 +76898 -1.000000 +76899 -1.000000 +76900 -1.000000 +76901 -1.000000 +76902 -1.000000 +76909 -1.000000 +76910 -1.000000 +76911 -1.000000 +76912 -1.000000 +76913 -1.000000 +76914 -1.000000 +76915 -1.000000 +76916 -1.000000 +76917 -1.000000 +76918 -1.000000 +76919 -1.000000 +76920 -1.000000 +76921 -1.000000 +76922 -1.000000 +76923 -1.000000 +76924 -1.000000 +76925 -1.000000 +76926 -1.000000 +76927 -1.000000 +76928 -1.000000 +76929 -1.000000 +76930 -1.000000 +76931 -1.000000 +76932 -1.000000 +76933 -1.000000 +76934 -1.000000 +76935 -1.000000 +76936 -1.000000 +76937 -1.000000 +76938 -1.000000 +76939 -1.000000 +76940 -1.000000 +76941 -1.000000 +76942 -1.000000 +76943 -1.000000 +76944 -1.000000 +76945 -1.000000 +76946 -1.000000 +76947 -1.000000 +76948 -1.000000 +76949 -1.000000 +76950 -1.000000 +76951 -1.000000 +76952 -1.000000 +76953 -1.000000 +76954 -1.000000 +76955 -1.000000 +76956 -1.000000 +76957 -1.000000 +76958 -1.000000 +76959 -1.000000 +76960 -1.000000 +76961 -1.000000 +76962 -1.000000 +76963 -1.000000 +76964 -1.000000 +76965 -1.000000 +76966 -1.000000 +76967 -1.000000 +76968 -1.000000 +76969 -1.000000 +76970 -1.000000 +76971 -1.000000 +76972 -1.000000 +76973 -1.000000 +76974 -1.000000 +76975 -1.000000 +76976 -1.000000 +76977 -1.000000 +76978 -1.000000 +76979 -1.000000 +76980 -1.000000 +76981 -1.000000 +76982 -1.000000 +76983 -1.000000 +76984 -1.000000 +76985 -1.000000 +76986 -1.000000 +76987 -1.000000 +76988 -1.000000 +76989 -1.000000 +76990 -1.000000 +76991 -1.000000 +76992 -1.000000 +76993 -1.000000 +76994 -1.000000 +76995 -1.000000 +76996 -1.000000 +76997 -1.000000 +76998 -1.000000 +76999 -1.000000 +77000 -1.000000 +77001 -1.000000 +77002 -1.000000 +77003 -1.000000 +77004 -1.000000 +77005 -1.000000 +77006 -1.000000 +77007 -1.000000 +77008 -1.000000 +77009 -1.000000 +77010 -1.000000 +77011 -1.000000 +77012 -1.000000 +77013 -1.000000 +77014 -1.000000 +77015 -1.000000 +77016 -1.000000 +77017 -1.000000 +77018 -1.000000 +77019 -1.000000 +77020 -1.000000 +77021 -1.000000 +77022 -1.000000 +77023 -1.000000 +77024 -1.000000 +77025 -1.000000 +77026 -1.000000 +77027 -1.000000 +77028 -1.000000 +77029 -1.000000 +77030 -1.000000 +77031 -1.000000 +77032 -1.000000 +77033 -1.000000 +77034 -1.000000 +77035 -1.000000 +77036 -1.000000 +77037 -1.000000 +77038 -1.000000 +77039 -1.000000 +77040 -1.000000 +77041 -1.000000 +77042 -1.000000 +77043 -1.000000 +77044 -1.000000 +77045 -1.000000 +77046 -1.000000 +77047 -1.000000 +77048 -1.000000 +77049 -1.000000 +77050 -1.000000 +77051 -1.000000 +77052 -1.000000 +77053 -1.000000 +77054 -1.000000 +77055 -1.000000 +77056 -1.000000 +77057 -1.000000 +77058 -1.000000 +77059 -1.000000 +77060 -1.000000 +77061 -1.000000 +77062 -1.000000 +77063 -1.000000 +77064 -1.000000 +77065 -1.000000 +77066 -1.000000 +77067 -1.000000 +77068 -1.000000 +77069 -1.000000 +77070 -1.000000 +77071 -1.000000 +77072 -1.000000 +77073 -1.000000 +77074 -1.000000 +77075 -1.000000 +77076 -1.000000 +77077 -1.000000 +77078 -1.000000 +77079 -1.000000 +77080 -1.000000 +77081 -1.000000 +77082 -1.000000 +77083 -1.000000 +77084 -1.000000 +77085 -1.000000 +77086 -1.000000 +77087 -1.000000 +77088 -1.000000 +77089 -1.000000 +77090 -1.000000 +77091 -1.000000 +77092 -1.000000 +77093 -1.000000 +77094 -1.000000 +77095 -1.000000 +77096 -1.000000 +77097 -1.000000 +77098 -1.000000 +77099 -1.000000 +77100 -1.000000 +77101 -1.000000 +77102 -1.000000 +77103 -1.000000 +77104 -1.000000 +77105 -1.000000 +77106 -1.000000 +77107 -1.000000 +77108 -1.000000 +77109 -1.000000 +77110 -1.000000 +77111 -1.000000 +77112 -1.000000 +77113 -1.000000 +77114 -1.000000 +77115 -1.000000 +77116 -1.000000 +77117 -1.000000 +77118 -1.000000 +77119 -1.000000 +77120 -1.000000 +77121 -1.000000 +77122 -1.000000 +77123 -1.000000 +77124 -1.000000 +77125 -1.000000 +77126 -1.000000 +77127 -1.000000 +77128 -1.000000 +77129 -1.000000 +77130 -1.000000 +77131 -1.000000 +77132 -1.000000 +77133 -1.000000 +77134 -1.000000 +77135 -1.000000 +77136 -1.000000 +77137 -1.000000 +77138 -1.000000 +77139 -1.000000 +77140 -1.000000 +77141 -1.000000 +77142 -1.000000 +77143 -1.000000 +77144 -1.000000 +77145 -1.000000 +77146 -1.000000 +77147 -1.000000 +77148 -1.000000 +77149 -1.000000 +77150 -1.000000 +77151 -1.000000 +77152 -1.000000 +77153 -1.000000 +77154 -1.000000 +77155 -1.000000 +77156 -1.000000 +77157 -1.000000 +77158 -1.000000 +77159 -1.000000 +77160 -1.000000 +77161 -1.000000 +77162 -1.000000 +77163 -1.000000 +77164 -1.000000 +77165 -1.000000 +77166 -1.000000 +77167 -1.000000 +77168 -1.000000 +77169 -1.000000 +77170 -1.000000 +77171 -1.000000 +77172 -1.000000 +77173 -1.000000 +77174 -1.000000 +77175 -1.000000 +77176 -1.000000 +77177 -1.000000 +77178 -1.000000 +77179 -1.000000 +77180 -1.000000 +77181 -1.000000 +77182 -1.000000 +77183 -1.000000 +77184 -1.000000 +77185 -1.000000 +77186 -1.000000 +77187 -1.000000 +77188 -1.000000 +77189 -1.000000 +77190 -1.000000 +77191 -1.000000 +77192 -1.000000 +77193 -1.000000 +77194 -1.000000 +77195 -1.000000 +77196 -1.000000 +77197 -1.000000 +77199 -1.000000 +77200 -1.000000 +77201 -1.000000 +77202 -1.000000 +77203 -1.000000 +77204 -1.000000 +77206 -1.000000 +77207 -1.000000 +77212 -1.000000 +77213 -1.000000 +77214 -1.000000 +77215 -1.000000 +77216 -1.000000 +77217 -1.000000 +77218 -1.000000 +77219 -1.000000 +77220 -1.000000 +77221 -1.000000 +77223 -1.000000 +77224 -1.000000 +77225 -1.000000 +77226 -1.000000 +77227 -1.000000 +77228 -1.000000 +77229 -1.000000 +77231 -1.000000 +77232 -1.000000 +77233 -1.000000 +77234 -1.000000 +77235 -1.000000 +77236 -1.000000 +77237 -1.000000 +77238 -1.000000 +77239 -1.000000 +77240 -1.000000 +77241 -1.000000 +77242 -1.000000 +77243 -1.000000 +77244 -1.000000 +77245 -1.000000 +77246 -1.000000 +77247 -1.000000 +77248 -1.000000 +77249 -1.000000 +77250 -1.000000 +77251 -1.000000 +77252 -1.000000 +77253 -1.000000 +77254 -1.000000 +77255 -1.000000 +77256 -1.000000 +77257 -1.000000 +77258 -1.000000 +77259 -1.000000 +77260 -1.000000 +77261 -1.000000 +77262 -1.000000 +77263 -1.000000 +77264 -1.000000 +77265 -1.000000 +77266 -1.000000 +77267 -1.000000 +77268 -1.000000 +77269 -1.000000 +77270 -1.000000 +77271 -1.000000 +77272 -1.000000 +77273 -1.000000 +77274 -1.000000 +77275 -1.000000 +77276 -1.000000 +77277 -1.000000 +77278 -1.000000 +77279 -1.000000 +77280 -1.000000 +77281 -1.000000 +77282 -1.000000 +77283 -1.000000 +77284 -1.000000 +77285 -1.000000 +77286 -1.000000 +77287 -1.000000 +77288 -1.000000 +77289 -1.000000 +77290 -1.000000 +77291 -1.000000 +77292 -1.000000 +77293 -1.000000 +77294 -1.000000 +77295 -1.000000 +77296 -1.000000 +77297 -1.000000 +77298 -1.000000 +77299 -1.000000 +77300 -1.000000 +77301 -1.000000 +77302 -1.000000 +77303 -1.000000 +77304 -1.000000 +77305 -1.000000 +77306 -1.000000 +77307 -1.000000 +77308 -1.000000 +77309 -1.000000 +77310 -1.000000 +77311 -1.000000 +77312 -1.000000 +77313 -1.000000 +77314 -1.000000 +77315 -1.000000 +77316 -1.000000 +77317 -1.000000 +77318 -1.000000 +77320 -1.000000 +77321 -1.000000 +77322 -1.000000 +77323 -1.000000 +77324 -1.000000 +77325 -1.000000 +77326 -1.000000 +77327 -1.000000 +77328 -1.000000 +77329 -1.000000 +77330 -1.000000 +77331 -1.000000 +77332 -1.000000 +77333 -1.000000 +77334 -1.000000 +77335 -1.000000 +77336 -1.000000 +77337 -1.000000 +77338 -1.000000 +77339 -1.000000 +77340 -1.000000 +77341 -1.000000 +77342 -1.000000 +77343 -1.000000 +77344 -1.000000 +77345 -1.000000 +77346 -1.000000 +77347 -1.000000 +77348 -1.000000 +77349 -1.000000 +77350 -1.000000 +77351 -1.000000 +77352 -1.000000 +77353 -1.000000 +77354 -1.000000 +77355 -1.000000 +77356 -1.000000 +77357 -1.000000 +77358 -1.000000 +77359 -1.000000 +77360 -1.000000 +77361 -1.000000 +77362 -1.000000 +77363 -1.000000 +77364 -1.000000 +77365 -1.000000 +77369 -1.000000 +77370 -1.000000 +77371 -1.000000 +77372 -1.000000 +77373 -1.000000 +77374 -1.000000 +77375 -1.000000 +77376 -1.000000 +77377 -1.000000 +77378 -1.000000 +77379 -1.000000 +77380 -1.000000 +77381 -1.000000 +77382 -1.000000 +77383 -1.000000 +77384 -1.000000 +77385 -1.000000 +77386 -1.000000 +77387 -1.000000 +77388 -1.000000 +77389 -1.000000 +77390 -1.000000 +77391 -1.000000 +77392 -1.000000 +77393 -1.000000 +77394 -1.000000 +77395 -1.000000 +77396 -1.000000 +77397 -1.000000 +77398 -1.000000 +77399 -1.000000 +77400 -1.000000 +77401 -1.000000 +77402 -1.000000 +77403 -1.000000 +77404 -1.000000 +77405 -1.000000 +77406 -1.000000 +77407 -1.000000 +77408 -1.000000 +77409 -1.000000 +77410 -1.000000 +77411 -1.000000 +77412 -1.000000 +77413 -1.000000 +77414 -1.000000 +77415 -1.000000 +77416 -1.000000 +77417 -1.000000 +77418 -1.000000 +77419 -1.000000 +77420 -1.000000 +77421 -1.000000 +77422 -1.000000 +77423 -1.000000 +77424 -1.000000 +77425 -1.000000 +77426 -1.000000 +77427 -1.000000 +77428 -1.000000 +77429 -1.000000 +77430 -1.000000 +77431 -1.000000 +77432 -1.000000 +77433 -1.000000 +77434 -1.000000 +77435 -1.000000 +77436 -1.000000 +77437 -1.000000 +77438 -1.000000 +77439 -1.000000 +77440 -1.000000 +77441 -1.000000 +77442 -1.000000 +77443 -1.000000 +77444 -1.000000 +77445 -1.000000 +77446 -1.000000 +77447 -1.000000 +77448 -1.000000 +77449 -1.000000 +77450 -1.000000 +77451 -1.000000 +77452 -1.000000 +77453 -1.000000 +77454 -1.000000 +77455 -1.000000 +77456 -1.000000 +77457 -1.000000 +77458 -1.000000 +77459 -1.000000 +77460 -1.000000 +77461 -1.000000 +77462 -1.000000 +77463 -1.000000 +77464 -1.000000 +77465 -1.000000 +77466 -1.000000 +77467 -1.000000 +77468 -1.000000 +77469 -1.000000 +77470 -1.000000 +77471 -1.000000 +77472 -1.000000 +77473 -1.000000 +77474 -1.000000 +77475 -1.000000 +77476 -1.000000 +77477 -1.000000 +77478 -1.000000 +77479 -1.000000 +77480 -1.000000 +77481 -1.000000 +77482 -1.000000 +77483 -1.000000 +77484 -1.000000 +77485 -1.000000 +77486 -1.000000 +77487 -1.000000 +77488 -1.000000 +77489 -1.000000 +77490 -1.000000 +77491 -1.000000 +77492 -1.000000 +77493 -1.000000 +77494 -1.000000 +77495 -1.000000 +77496 -1.000000 +77497 -1.000000 +77498 -1.000000 +77499 -1.000000 +77500 -1.000000 +77501 -1.000000 +77502 -1.000000 +77503 -1.000000 +77504 -1.000000 +77505 -1.000000 +77506 -1.000000 +77507 -1.000000 +77508 -1.000000 +77509 -1.000000 +77510 -1.000000 +77511 -1.000000 +77512 -1.000000 +77513 -1.000000 +77514 -1.000000 +77515 -1.000000 +77516 -1.000000 +77517 -1.000000 +77518 -1.000000 +77519 -1.000000 +77520 -1.000000 +77521 -1.000000 +77522 -1.000000 +77523 -1.000000 +77524 -1.000000 +77525 -1.000000 +77526 -1.000000 +77527 -1.000000 +77528 -1.000000 +77529 -1.000000 +77530 -1.000000 +77531 -1.000000 +77532 -1.000000 +77533 -1.000000 +77534 -1.000000 +77535 -1.000000 +77536 -1.000000 +77537 -1.000000 +77538 -1.000000 +77539 -1.000000 +77540 -1.000000 +77541 -1.000000 +77542 -1.000000 +77543 -1.000000 +77544 -1.000000 +77545 -1.000000 +77546 -1.000000 +77547 -1.000000 +77548 -1.000000 +77549 -1.000000 +77550 -1.000000 +77551 -1.000000 +77552 -1.000000 +77553 -1.000000 +77554 -1.000000 +77555 -1.000000 +77556 -1.000000 +77557 -1.000000 +77558 -1.000000 +77559 -1.000000 +77560 -1.000000 +77561 -1.000000 +77562 -1.000000 +77563 -1.000000 +77564 -1.000000 +77565 -1.000000 +77566 -1.000000 +77567 -1.000000 +77568 -1.000000 +77569 -1.000000 +77570 -1.000000 +77571 -1.000000 +77572 -1.000000 +77573 -1.000000 +77574 -1.000000 +77575 -1.000000 +77576 -1.000000 +77577 -1.000000 +77578 -1.000000 +77579 -1.000000 +77580 -1.000000 +77581 -1.000000 +77582 -1.000000 +77583 -1.000000 +77584 -1.000000 +77585 -1.000000 +77586 -1.000000 +77587 -1.000000 +77588 -1.000000 +77589 -1.000000 +77590 -1.000000 +77592 -1.000000 +77593 -1.000000 +77594 -1.000000 +77595 -1.000000 +77596 -1.000000 +77597 -1.000000 +77598 -1.000000 +77599 -1.000000 +77600 -1.000000 +77601 -1.000000 +77602 -1.000000 +77603 -1.000000 +77604 -1.000000 +77605 -1.000000 +77606 -1.000000 +77607 -1.000000 +77608 -1.000000 +77609 -1.000000 +77610 -1.000000 +77611 -1.000000 +77612 -1.000000 +77613 -1.000000 +77614 -1.000000 +77615 -1.000000 +77616 -1.000000 +77617 -1.000000 +77618 -1.000000 +77619 -1.000000 +77620 -1.000000 +77621 -1.000000 +77622 -1.000000 +77623 -1.000000 +77624 -1.000000 +77625 -1.000000 +77626 -1.000000 +77627 -1.000000 +77628 -1.000000 +77629 -1.000000 +77630 -1.000000 +77631 -1.000000 +77632 -1.000000 +77633 -1.000000 +77634 -1.000000 +77635 -1.000000 +77636 -1.000000 +77637 -1.000000 +77638 -1.000000 +77639 -1.000000 +77640 -1.000000 +77641 -1.000000 +77642 -1.000000 +77643 -1.000000 +77644 -1.000000 +77645 -1.000000 +77646 -1.000000 +77647 -1.000000 +77648 -1.000000 +77649 -1.000000 +77650 -1.000000 +77651 -1.000000 +77652 -1.000000 +77653 -1.000000 +77654 -1.000000 +77655 -1.000000 +77656 -1.000000 +77657 -1.000000 +77658 -1.000000 +77659 -1.000000 +77660 -1.000000 +77661 -1.000000 +77662 -1.000000 +77663 -1.000000 +77664 -1.000000 +77665 -1.000000 +77666 -1.000000 +77667 -1.000000 +77668 -1.000000 +77669 -1.000000 +77670 -1.000000 +77671 -1.000000 +77672 -1.000000 +77673 -1.000000 +77674 -1.000000 +77675 -1.000000 +77676 -1.000000 +77677 -1.000000 +77678 -1.000000 +77679 -1.000000 +77680 -1.000000 +77681 -1.000000 +77682 -1.000000 +77683 -1.000000 +77684 -1.000000 +77685 -1.000000 +77686 -1.000000 +77687 -1.000000 +77688 -1.000000 +77689 -1.000000 +77690 -1.000000 +77691 -1.000000 +77692 -1.000000 +77693 -1.000000 +77694 -1.000000 +77695 -1.000000 +77696 -1.000000 +77697 -1.000000 +77698 -1.000000 +77699 -1.000000 +77700 -1.000000 +77701 -1.000000 +77702 -1.000000 +77703 -1.000000 +77704 -1.000000 +77705 -1.000000 +77706 -1.000000 +77707 -1.000000 +77708 -1.000000 +77709 -1.000000 +77710 -1.000000 +77711 -1.000000 +77712 -1.000000 +77713 -1.000000 +77714 -1.000000 +77715 -1.000000 +77716 -1.000000 +77717 -1.000000 +77718 -1.000000 +77719 -1.000000 +77720 -1.000000 +77721 -1.000000 +77722 -1.000000 +77723 -1.000000 +77724 -1.000000 +77725 -1.000000 +77726 -1.000000 +77727 -1.000000 +77728 -1.000000 +77729 -1.000000 +77730 -1.000000 +77731 -1.000000 +77732 -1.000000 +77733 -1.000000 +77734 -1.000000 +77735 -1.000000 +77736 -1.000000 +77737 -1.000000 +77738 -1.000000 +77739 -1.000000 +77740 -1.000000 +77741 -1.000000 +77742 -1.000000 +77743 -1.000000 +77744 -1.000000 +77745 -1.000000 +77746 -1.000000 +77747 -1.000000 +77748 -1.000000 +77749 -1.000000 +77750 -1.000000 +77751 -1.000000 +77752 -1.000000 +77753 -1.000000 +77754 -1.000000 +77755 -1.000000 +77756 -1.000000 +77757 -1.000000 +77758 -1.000000 +77759 -1.000000 +77760 -1.000000 +77761 -1.000000 +77762 -1.000000 +77763 -1.000000 +77764 -1.000000 +77765 -1.000000 +77766 -1.000000 +77767 -1.000000 +77768 -1.000000 +77769 -1.000000 +77770 -1.000000 +77771 -1.000000 +77772 -1.000000 +77773 -1.000000 +77774 -1.000000 +77775 -1.000000 +77776 -1.000000 +77777 -1.000000 +77778 -1.000000 +77779 -1.000000 +77780 -1.000000 +77781 -1.000000 +77782 -1.000000 +77783 -1.000000 +77784 -1.000000 +77785 -1.000000 +77786 -1.000000 +77787 -1.000000 +77788 -1.000000 +77789 -1.000000 +77790 -1.000000 +77791 -1.000000 +77792 -1.000000 +77793 -1.000000 +77794 -1.000000 +77795 -1.000000 +77796 -1.000000 +77797 -1.000000 +77798 -1.000000 +77799 -1.000000 +77800 -1.000000 +77801 -1.000000 +77802 -1.000000 +77803 -1.000000 +77804 -1.000000 +77805 -1.000000 +77806 -1.000000 +77807 -1.000000 +77808 -1.000000 +77809 -1.000000 +77811 -1.000000 +77812 -1.000000 +77813 -1.000000 +77814 -1.000000 +77815 -1.000000 +77816 -1.000000 +77817 -1.000000 +77818 -1.000000 +77819 -1.000000 +77820 -1.000000 +77821 -1.000000 +77822 -1.000000 +77823 -1.000000 +77824 -1.000000 +77825 -1.000000 +77826 -1.000000 +77827 -1.000000 +77828 -1.000000 +77829 -1.000000 +77830 -1.000000 +77831 -1.000000 +77832 -1.000000 +77833 -1.000000 +77834 -1.000000 +77835 -1.000000 +77836 -1.000000 +77837 -1.000000 +77838 -1.000000 +77839 -1.000000 +77840 -1.000000 +77841 -1.000000 +77842 -1.000000 +77843 -1.000000 +77844 -1.000000 +77845 -1.000000 +77846 -1.000000 +77847 -1.000000 +77848 -1.000000 +77849 -1.000000 +77850 -1.000000 +77851 -1.000000 +77852 -1.000000 +77853 -1.000000 +77854 -1.000000 +77855 -1.000000 +77856 -1.000000 +77857 -1.000000 +77858 -1.000000 +77859 -1.000000 +77860 -1.000000 +77861 -1.000000 +77862 -1.000000 +77863 -1.000000 +77864 -1.000000 +77866 -1.000000 +77867 -1.000000 +77868 -1.000000 +77869 -1.000000 +77870 -1.000000 +77871 -1.000000 +77872 -1.000000 +77873 -1.000000 +77874 -1.000000 +77875 -1.000000 +77876 -1.000000 +77877 -1.000000 +77878 -1.000000 +77879 -1.000000 +77880 -1.000000 +77881 -1.000000 +77882 -1.000000 +77883 -1.000000 +77884 -1.000000 +77885 -1.000000 +77886 -1.000000 +77887 -1.000000 +77888 -1.000000 +77889 -1.000000 +77890 -1.000000 +77891 -1.000000 +77892 -1.000000 +77893 -1.000000 +77894 -1.000000 +77895 -1.000000 +77896 -1.000000 +77897 -1.000000 +77898 -1.000000 +77899 -1.000000 +77900 -1.000000 +77901 -1.000000 +77902 -1.000000 +77903 -1.000000 +77904 -1.000000 +77905 -1.000000 +77906 -1.000000 +77907 -1.000000 +77908 -1.000000 +77909 -1.000000 +77910 -1.000000 +77911 -1.000000 +77912 -1.000000 +77913 -1.000000 +77914 -1.000000 +77915 -1.000000 +77916 -1.000000 +77917 -1.000000 +77918 -1.000000 +77920 -1.000000 +77921 -1.000000 +77922 -1.000000 +77923 -1.000000 +77924 -1.000000 +77925 -1.000000 +77926 -1.000000 +77927 -1.000000 +77928 -1.000000 +77929 -1.000000 +77930 -1.000000 +77931 -1.000000 +77932 -1.000000 +77933 -1.000000 +77934 -1.000000 +77935 -1.000000 +77936 -1.000000 +77937 -1.000000 +77938 -1.000000 +77939 -1.000000 +77940 -1.000000 +77941 -1.000000 +77942 -1.000000 +77943 -1.000000 +77944 -1.000000 +77945 -1.000000 +77946 -1.000000 +77947 -1.000000 +77948 -1.000000 +77949 -1.000000 +77951 -1.000000 +77952 -1.000000 +77953 -1.000000 +77954 -1.000000 +77955 -1.000000 +77956 -1.000000 +77957 -1.000000 +77958 -1.000000 +77959 -1.000000 +77960 -1.000000 +77961 -1.000000 +77962 -1.000000 +77963 -1.000000 +77964 -1.000000 +77965 -1.000000 +77966 -1.000000 +77967 -1.000000 +77968 -1.000000 +77969 -1.000000 +77970 -1.000000 +77971 -1.000000 +77972 -1.000000 +77973 -1.000000 +77974 -1.000000 +77975 -1.000000 +77976 -1.000000 +77977 -1.000000 +77978 -1.000000 +77979 -1.000000 +77980 -1.000000 +77981 -1.000000 +77982 -1.000000 +77983 -1.000000 +77984 -1.000000 +77985 -1.000000 +77986 -1.000000 +77987 -1.000000 +77988 -1.000000 +77989 -1.000000 +77990 -1.000000 +77991 -1.000000 +77992 -1.000000 +77993 -1.000000 +77994 -1.000000 +77995 -1.000000 +77996 -1.000000 +77997 -1.000000 +77998 -1.000000 +77999 -1.000000 +78000 -1.000000 +78001 -1.000000 +78002 -1.000000 +78003 -1.000000 +78004 -1.000000 +78005 -1.000000 +78006 -1.000000 +78007 -1.000000 +78008 -1.000000 +78009 -1.000000 +78010 -1.000000 +78011 -1.000000 +78012 -1.000000 +78013 -1.000000 +78014 -1.000000 +78015 -1.000000 +78016 -1.000000 +78017 -1.000000 +78018 -1.000000 +78019 -1.000000 +78020 -1.000000 +78021 -1.000000 +78022 -1.000000 +78023 -1.000000 +78024 -1.000000 +78025 -1.000000 +78026 -1.000000 +78027 -1.000000 +78028 -1.000000 +78029 -1.000000 +78030 -1.000000 +78031 -1.000000 +78032 -1.000000 +78033 -1.000000 +78034 -1.000000 +78035 -1.000000 +78036 -1.000000 +78037 -1.000000 +78038 -1.000000 +78039 -1.000000 +78040 -1.000000 +78041 -1.000000 +78042 -1.000000 +78043 -1.000000 +78044 -1.000000 +78045 -1.000000 +78046 -1.000000 +78047 -1.000000 +78048 -1.000000 +78049 -1.000000 +78050 -1.000000 +78051 -1.000000 +78052 -1.000000 +78053 -1.000000 +78054 -1.000000 +78055 -1.000000 +78056 -1.000000 +78057 -1.000000 +78058 -1.000000 +78059 -1.000000 +78060 -1.000000 +78061 -1.000000 +78062 -1.000000 +78063 -1.000000 +78064 -1.000000 +78065 -1.000000 +78066 -1.000000 +78067 -1.000000 +78068 -1.000000 +78069 -1.000000 +78070 -1.000000 +78071 -1.000000 +78072 -1.000000 +78073 -1.000000 +78074 -1.000000 +78075 -1.000000 +78076 -1.000000 +78077 -1.000000 +78078 -1.000000 +78079 -1.000000 +78080 -1.000000 +78081 -1.000000 +78082 -1.000000 +78083 -1.000000 +78084 -1.000000 +78085 -1.000000 +78086 -1.000000 +78087 -1.000000 +78088 -1.000000 +78089 -1.000000 +78090 -1.000000 +78091 -1.000000 +78092 -1.000000 +78093 -1.000000 +78094 -1.000000 +78095 -1.000000 +78096 -1.000000 +78097 -1.000000 +78098 -1.000000 +78099 -1.000000 +78100 -1.000000 +78101 -1.000000 +78102 -1.000000 +78103 -1.000000 +78104 -1.000000 +78105 -1.000000 +78106 -1.000000 +78107 -1.000000 +78108 -1.000000 +78109 -1.000000 +78110 -1.000000 +78111 -1.000000 +78112 -1.000000 +78113 -1.000000 +78114 -1.000000 +78115 -1.000000 +78116 -1.000000 +78117 -1.000000 +78118 -1.000000 +78119 -1.000000 +78120 -1.000000 +78121 -1.000000 +78122 -1.000000 +78123 -1.000000 +78124 -1.000000 +78125 -1.000000 +78126 -1.000000 +78127 -1.000000 +78128 -1.000000 +78129 -1.000000 +78130 -1.000000 +78131 -1.000000 +78132 -1.000000 +78133 -1.000000 +78134 -1.000000 +78135 -1.000000 +78136 -1.000000 +78137 -1.000000 +78138 -1.000000 +78139 -1.000000 +78140 -1.000000 +78141 -1.000000 +78142 -1.000000 +78143 -1.000000 +78144 -1.000000 +78145 -1.000000 +78146 -1.000000 +78147 -1.000000 +78148 -1.000000 +78149 -1.000000 +78150 -1.000000 +78151 -1.000000 +78152 -1.000000 +78153 -1.000000 +78154 -1.000000 +78155 -1.000000 +78156 -1.000000 +78157 -1.000000 +78158 -1.000000 +78159 -1.000000 +78160 -1.000000 +78161 -1.000000 +78162 -1.000000 +78163 -1.000000 +78164 -1.000000 +78165 -1.000000 +78166 -1.000000 +78167 -1.000000 +78168 -1.000000 +78169 -1.000000 +78170 -1.000000 +78171 -1.000000 +78172 -1.000000 +78173 -1.000000 +78174 -1.000000 +78175 -1.000000 +78176 -1.000000 +78177 -1.000000 +78178 -1.000000 +78179 -1.000000 +78180 -1.000000 +78181 -1.000000 +78182 -1.000000 +78183 -1.000000 +78184 -1.000000 +78185 -1.000000 +78186 -1.000000 +78187 -1.000000 +78188 -1.000000 +78189 -1.000000 +78190 -1.000000 +78191 -1.000000 +78192 -1.000000 +78193 -1.000000 +78194 -1.000000 +78195 -1.000000 +78196 -1.000000 +78197 -1.000000 +78198 -1.000000 +78199 -1.000000 +78200 -1.000000 +78201 -1.000000 +78202 -1.000000 +78203 -1.000000 +78204 -1.000000 +78205 -1.000000 +78206 -1.000000 +78207 -1.000000 +78208 -1.000000 +78209 -1.000000 +78210 -1.000000 +78211 -1.000000 +78212 -1.000000 +78213 -1.000000 +78214 -1.000000 +78215 -1.000000 +78216 -1.000000 +78217 -1.000000 +78218 -1.000000 +78219 -1.000000 +78220 -1.000000 +78221 -1.000000 +78222 -1.000000 +78223 -1.000000 +78224 -1.000000 +78225 -1.000000 +78226 -1.000000 +78227 -1.000000 +78228 -1.000000 +78229 -1.000000 +78230 -1.000000 +78231 -1.000000 +78232 -1.000000 +78233 -1.000000 +78234 -1.000000 +78235 -1.000000 +78236 -1.000000 +78237 -1.000000 +78238 -1.000000 +78239 -1.000000 +78240 -1.000000 +78241 -1.000000 +78242 -1.000000 +78243 -1.000000 +78244 -1.000000 +78245 -1.000000 +78246 -1.000000 +78247 -1.000000 +78248 -1.000000 +78249 -1.000000 +78250 -1.000000 +78251 -1.000000 +78252 -1.000000 +78253 -1.000000 +78254 -1.000000 +78255 -1.000000 +78256 -1.000000 +78257 -1.000000 +78258 -1.000000 +78259 -1.000000 +78260 -1.000000 +78261 -1.000000 +78262 -1.000000 +78263 -1.000000 +78264 -1.000000 +78265 -1.000000 +78266 -1.000000 +78267 -1.000000 +78268 -1.000000 +78269 -1.000000 +78270 -1.000000 +78271 -1.000000 +78272 -1.000000 +78273 -1.000000 +78274 -1.000000 +78275 -1.000000 +78276 -1.000000 +78277 -1.000000 +78278 -1.000000 +78279 -1.000000 +78280 -1.000000 +78281 -1.000000 +78282 -1.000000 +78283 -1.000000 +78284 -1.000000 +78285 -1.000000 +78286 -1.000000 +78287 -1.000000 +78288 -1.000000 +78289 -1.000000 +78290 -1.000000 +78291 -1.000000 +78292 -1.000000 +78293 -1.000000 +78294 -1.000000 +78295 -1.000000 +78296 -1.000000 +78297 -1.000000 +78298 -1.000000 +78299 -1.000000 +78300 -1.000000 +78301 -1.000000 +78302 -1.000000 +78303 -1.000000 +78304 -1.000000 +78305 -1.000000 +78306 -1.000000 +78307 -1.000000 +78308 -1.000000 +78309 -1.000000 +78310 -1.000000 +78311 -1.000000 +78312 -1.000000 +78313 -1.000000 +78314 -1.000000 +78315 -1.000000 +78316 -1.000000 +78317 -1.000000 +78318 -1.000000 +78319 -1.000000 +78320 -1.000000 +78321 -1.000000 +78322 -1.000000 +78323 -1.000000 +78324 -1.000000 +78325 -1.000000 +78326 -1.000000 +78327 -1.000000 +78328 -1.000000 +78329 -1.000000 +78330 -1.000000 +78331 -1.000000 +78332 -1.000000 +78333 -1.000000 +78334 -1.000000 +78335 -1.000000 +78336 -1.000000 +78337 -1.000000 +78338 -1.000000 +78339 -1.000000 +78340 -1.000000 +78341 -1.000000 +78342 -1.000000 +78343 -1.000000 +78344 -1.000000 +78345 -1.000000 +78346 -1.000000 +78347 -1.000000 +78348 -1.000000 +78349 -1.000000 +78350 -1.000000 +78351 -1.000000 +78352 -1.000000 +78353 -1.000000 +78354 -1.000000 +78355 -1.000000 +78356 -1.000000 +78357 -1.000000 +78358 -1.000000 +78359 -1.000000 +78360 -1.000000 +78361 -1.000000 +78362 -1.000000 +78363 -1.000000 +78365 -1.000000 +78366 -1.000000 +78367 -1.000000 +78368 -1.000000 +78369 -1.000000 +78370 -1.000000 +78371 -1.000000 +78372 -1.000000 +78373 -1.000000 +78374 -1.000000 +78375 -1.000000 +78376 -1.000000 +78377 -1.000000 +78378 -1.000000 +78379 -1.000000 +78380 -1.000000 +78381 -1.000000 +78382 -1.000000 +78383 -1.000000 +78384 -1.000000 +78385 -1.000000 +78386 -1.000000 +78387 -1.000000 +78388 -1.000000 +78389 -1.000000 +78390 -1.000000 +78391 -1.000000 +78392 -1.000000 +78393 -1.000000 +78394 -1.000000 +78395 -1.000000 +78396 -1.000000 +78397 -1.000000 +78398 -1.000000 +78399 -1.000000 +78400 -1.000000 +78401 -1.000000 +78402 -1.000000 +78403 -1.000000 +78404 -1.000000 +78405 -1.000000 +78406 -1.000000 +78407 -1.000000 +78408 -1.000000 +78409 -1.000000 +78410 -1.000000 +78411 -1.000000 +78412 -1.000000 +78413 -1.000000 +78414 -1.000000 +78415 -1.000000 +78416 -1.000000 +78417 -1.000000 +78418 -1.000000 +78419 -1.000000 +78420 -1.000000 +78421 -1.000000 +78422 -1.000000 +78423 -1.000000 +78424 -1.000000 +78425 -1.000000 +78426 -1.000000 +78427 -1.000000 +78428 -1.000000 +78429 -1.000000 +78430 -1.000000 +78431 -1.000000 +78432 -1.000000 +78433 -1.000000 +78434 -1.000000 +78435 -1.000000 +78436 -1.000000 +78437 -1.000000 +78438 -1.000000 +78439 -1.000000 +78440 -1.000000 +78441 -1.000000 +78442 -1.000000 +78443 -1.000000 +78444 -1.000000 +78445 -1.000000 +78446 -1.000000 +78447 -1.000000 +78448 -1.000000 +78449 -1.000000 +78450 -1.000000 +78451 -1.000000 +78452 -1.000000 +78453 -1.000000 +78454 -1.000000 +78455 -1.000000 +78457 -1.000000 +78458 -1.000000 +78459 -1.000000 +78460 -1.000000 +78461 -1.000000 +78462 -1.000000 +78463 -1.000000 +78464 -1.000000 +78465 -1.000000 +78466 -1.000000 +78467 -1.000000 +78468 -1.000000 +78469 -1.000000 +78470 -1.000000 +78471 -1.000000 +78472 -1.000000 +78473 -1.000000 +78474 -1.000000 +78475 -1.000000 +78476 -1.000000 +78477 -1.000000 +78478 -1.000000 +78479 -1.000000 +78480 -1.000000 +78481 -1.000000 +78482 -1.000000 +78483 -1.000000 +78484 -1.000000 +78485 -1.000000 +78486 -1.000000 +78487 -1.000000 +78488 -1.000000 +78489 -1.000000 +78490 -1.000000 +78491 -1.000000 +78492 -1.000000 +78493 -1.000000 +78494 -1.000000 +78495 -1.000000 +78496 -1.000000 +78497 -1.000000 +78498 -1.000000 +78499 -1.000000 +78500 -1.000000 +78501 -1.000000 +78502 -1.000000 +78503 -1.000000 +78504 -1.000000 +78505 -1.000000 +78506 -1.000000 +78507 -1.000000 +78508 -1.000000 +78509 -1.000000 +78510 -1.000000 +78511 -1.000000 +78512 -1.000000 +78513 -1.000000 +78514 -1.000000 +78515 -1.000000 +78516 -1.000000 +78517 -1.000000 +78518 -1.000000 +78519 -1.000000 +78520 -1.000000 +78521 -1.000000 +78522 -1.000000 +78523 -1.000000 +78524 -1.000000 +78525 -1.000000 +78526 -1.000000 +78527 -1.000000 +78528 -1.000000 +78529 -1.000000 +78530 -1.000000 +78531 -1.000000 +78532 -1.000000 +78533 -1.000000 +78534 -1.000000 +78535 -1.000000 +78536 -1.000000 +78537 -1.000000 +78538 -1.000000 +78539 -1.000000 +78540 -1.000000 +78541 -1.000000 +78542 -1.000000 +78543 -1.000000 +78544 -1.000000 +78546 -1.000000 +78547 -1.000000 +78548 -1.000000 +78549 -1.000000 +78550 -1.000000 +78551 -1.000000 +78552 -1.000000 +78553 -1.000000 +78554 -1.000000 +78555 -1.000000 +78556 -1.000000 +78557 -1.000000 +78558 -1.000000 +78559 -1.000000 +78560 -1.000000 +78561 -1.000000 +78562 -1.000000 +78563 -1.000000 +78564 -1.000000 +78565 -1.000000 +78566 -1.000000 +78567 -1.000000 +78568 -1.000000 +78569 -1.000000 +78570 -1.000000 +78571 -1.000000 +78572 -1.000000 +78573 -1.000000 +78574 -1.000000 +78575 -1.000000 +78576 -1.000000 +78577 -1.000000 +78578 -1.000000 +78579 -1.000000 +78580 -1.000000 +78581 -1.000000 +78582 -1.000000 +78583 -1.000000 +78584 -1.000000 +78585 -1.000000 +78586 -1.000000 +78587 -1.000000 +78588 -1.000000 +78589 -1.000000 +78590 -1.000000 +78591 -1.000000 +78592 -1.000000 +78593 -1.000000 +78594 -1.000000 +78595 -1.000000 +78596 -1.000000 +78597 -1.000000 +78598 -1.000000 +78599 -1.000000 +78600 -1.000000 +78601 -1.000000 +78602 -1.000000 +78603 -1.000000 +78604 -1.000000 +78605 -1.000000 +78606 -1.000000 +78607 -1.000000 +78608 -1.000000 +78609 -1.000000 +78610 -1.000000 +78611 -1.000000 +78612 -1.000000 +78613 -1.000000 +78614 -1.000000 +78615 -1.000000 +78616 -1.000000 +78617 -1.000000 +78618 -1.000000 +78619 -1.000000 +78620 -1.000000 +78621 -1.000000 +78622 -1.000000 +78623 -1.000000 +78624 -1.000000 +78625 -1.000000 +78626 -1.000000 +78627 -1.000000 +78628 -1.000000 +78629 -1.000000 +78630 -1.000000 +78631 -1.000000 +78632 -1.000000 +78633 -1.000000 +78634 -1.000000 +78635 -1.000000 +78636 -1.000000 +78637 -1.000000 +78638 -1.000000 +78639 -1.000000 +78640 -1.000000 +78641 -1.000000 +78642 -1.000000 +78643 -1.000000 +78644 -1.000000 +78645 -1.000000 +78646 -1.000000 +78647 -1.000000 +78648 -1.000000 +78649 -1.000000 +78650 -1.000000 +78651 -1.000000 +78652 -1.000000 +78653 -1.000000 +78654 -1.000000 +78655 -1.000000 +78656 -1.000000 +78657 -1.000000 +78658 -1.000000 +78659 -1.000000 +78660 -1.000000 +78661 -1.000000 +78662 -1.000000 +78663 -1.000000 +78664 -1.000000 +78665 -1.000000 +78666 -1.000000 +78667 -1.000000 +78668 -1.000000 +78669 -1.000000 +78670 -1.000000 +78671 -1.000000 +78672 -1.000000 +78673 -1.000000 +78674 -1.000000 +78675 -1.000000 +78676 -1.000000 +78677 -1.000000 +78678 -1.000000 +78679 -1.000000 +78680 -1.000000 +78681 -1.000000 +78682 -1.000000 +78683 -1.000000 +78684 -1.000000 +78685 -1.000000 +78686 -1.000000 +78687 -1.000000 +78688 -1.000000 +78689 -1.000000 +78690 -1.000000 +78691 -1.000000 +78692 -1.000000 +78693 -1.000000 +78694 -1.000000 +78695 -1.000000 +78696 -1.000000 +78697 -1.000000 +78698 -1.000000 +78699 -1.000000 +78700 -1.000000 +78701 -1.000000 +78702 -1.000000 +78703 -1.000000 +78704 -1.000000 +78705 -1.000000 +78706 -1.000000 +78707 -1.000000 +78708 -1.000000 +78709 -1.000000 +78710 -1.000000 +78711 -1.000000 +78712 -1.000000 +78713 -1.000000 +78714 -1.000000 +78715 -1.000000 +78716 -1.000000 +78717 -1.000000 +78718 -1.000000 +78719 -1.000000 +78720 -1.000000 +78721 -1.000000 +78722 -1.000000 +78723 -1.000000 +78724 -1.000000 +78725 -1.000000 +78726 -1.000000 +78727 -1.000000 +78728 -1.000000 +78729 -1.000000 +78730 -1.000000 +78731 -1.000000 +78732 -1.000000 +78733 -1.000000 +78734 -1.000000 +78735 -1.000000 +78736 -1.000000 +78737 -1.000000 +78738 -1.000000 +78739 -1.000000 +78740 -1.000000 +78741 -1.000000 +78742 -1.000000 +78743 -1.000000 +78744 -1.000000 +78745 -1.000000 +78746 -1.000000 +78747 -1.000000 +78748 -1.000000 +78749 -1.000000 +78750 -1.000000 +78751 -1.000000 +78752 -1.000000 +78753 -1.000000 +78754 -1.000000 +78755 -1.000000 +78756 -1.000000 +78757 -1.000000 +78758 -1.000000 +78759 -1.000000 +78760 -1.000000 +78761 -1.000000 +78762 -1.000000 +78763 -1.000000 +78764 -1.000000 +78765 -1.000000 +78766 -1.000000 +78767 -1.000000 +78768 -1.000000 +78769 -1.000000 +78770 -1.000000 +78771 -1.000000 +78772 -1.000000 +78773 -1.000000 +78774 -1.000000 +78775 -1.000000 +78776 -1.000000 +78777 -1.000000 +78778 -1.000000 +78779 -1.000000 +78780 -1.000000 +78781 -1.000000 +78782 -1.000000 +78783 -1.000000 +78784 -1.000000 +78785 -1.000000 +78786 -1.000000 +78787 -1.000000 +78788 -1.000000 +78789 -1.000000 +78790 -1.000000 +78791 -1.000000 +78792 -1.000000 +78793 -1.000000 +78794 -1.000000 +78795 -1.000000 +78796 -1.000000 +78797 -1.000000 +78798 -1.000000 +78799 -1.000000 +78800 -1.000000 +78801 -1.000000 +78802 -1.000000 +78803 -1.000000 +78804 -1.000000 +78805 -1.000000 +78806 -1.000000 +78807 -1.000000 +78808 -1.000000 +78809 -1.000000 +78810 -1.000000 +78811 -1.000000 +78812 -1.000000 +78813 -1.000000 +78814 -1.000000 +78815 -1.000000 +78816 -1.000000 +78817 -1.000000 +78818 -1.000000 +78819 -1.000000 +78820 -1.000000 +78821 -1.000000 +78822 -1.000000 +78823 -1.000000 +78824 -1.000000 +78825 -1.000000 +78826 -1.000000 +78827 -1.000000 +78828 -1.000000 +78829 -1.000000 +78830 -1.000000 +78831 -1.000000 +78832 -1.000000 +78833 -1.000000 +78834 -1.000000 +78835 -1.000000 +78836 -1.000000 +78837 -1.000000 +78838 -1.000000 +78839 -1.000000 +78840 -1.000000 +78841 -1.000000 +78842 -1.000000 +78843 -1.000000 +78844 -1.000000 +78845 -1.000000 +78846 -1.000000 +78848 -1.000000 +78849 -1.000000 +78850 -1.000000 +78851 -1.000000 +78852 -1.000000 +78853 -1.000000 +78854 -1.000000 +78855 -1.000000 +78856 -1.000000 +78857 -1.000000 +78858 -1.000000 +78859 -1.000000 +78860 -1.000000 +78861 -1.000000 +78862 -1.000000 +78863 -1.000000 +78864 -1.000000 +78865 -1.000000 +78866 -1.000000 +78867 -1.000000 +78868 -1.000000 +78869 -1.000000 +78870 -1.000000 +78871 -1.000000 +78872 -1.000000 +78873 -1.000000 +78874 -1.000000 +78875 -1.000000 +78876 -1.000000 +78877 -1.000000 +78878 -1.000000 +78879 -1.000000 +78880 -1.000000 +78881 -1.000000 +78882 -1.000000 +78883 -1.000000 +78884 -1.000000 +78885 -1.000000 +78886 -1.000000 +78887 -1.000000 +78888 -1.000000 +78889 -1.000000 +78890 -1.000000 +78891 -1.000000 +78892 -1.000000 +78893 -1.000000 +78894 -1.000000 +78896 -1.000000 +78897 -1.000000 +78898 -1.000000 +78899 -1.000000 +78900 -1.000000 +78901 -1.000000 +78902 -1.000000 +78903 -1.000000 +78904 -1.000000 +78905 -1.000000 +78906 -1.000000 +78907 -1.000000 +78908 -1.000000 +78909 -1.000000 +78910 -1.000000 +78911 -1.000000 +78912 -1.000000 +78913 -1.000000 +78914 -1.000000 +78915 -1.000000 +78916 -1.000000 +78917 -1.000000 +78918 -1.000000 +78919 -1.000000 +78920 -1.000000 +78921 -1.000000 +78922 -1.000000 +78923 -1.000000 +78924 -1.000000 +78925 -1.000000 +78926 -1.000000 +78927 -1.000000 +78928 -1.000000 +78929 -1.000000 +78930 -1.000000 +78931 -1.000000 +78932 -1.000000 +78933 -1.000000 +78934 -1.000000 +78935 -1.000000 +78936 -1.000000 +78937 -1.000000 +78938 -1.000000 +78939 -1.000000 +78940 -1.000000 +78941 -1.000000 +78942 -1.000000 +78943 -1.000000 +78944 -1.000000 +78945 -1.000000 +78946 -1.000000 +78947 -1.000000 +78948 -1.000000 +78949 -1.000000 +78950 -1.000000 +78951 -1.000000 +78952 -1.000000 +78953 -1.000000 +78954 -1.000000 +78955 -1.000000 +78956 -1.000000 +78957 -1.000000 +78958 -1.000000 +78959 -1.000000 +78960 -1.000000 +78961 -1.000000 +78962 -1.000000 +78963 -1.000000 +78964 -1.000000 +78965 -1.000000 +78966 -1.000000 +78967 -1.000000 +78968 -1.000000 +78969 -1.000000 +78970 -1.000000 +78971 -1.000000 +78972 -1.000000 +78973 -1.000000 +78974 -1.000000 +78975 -1.000000 +78976 -1.000000 +78977 -1.000000 +78978 -1.000000 +78979 -1.000000 +78980 -1.000000 +78981 -1.000000 +78982 -1.000000 +78983 -1.000000 +78984 -1.000000 +78985 -1.000000 +78986 -1.000000 +78987 -1.000000 +78988 -1.000000 +78989 -1.000000 +78990 -1.000000 +78991 -1.000000 +78992 -1.000000 +78993 -1.000000 +78994 -1.000000 +78995 -1.000000 +78996 -1.000000 +78997 -1.000000 +78998 -1.000000 +78999 -1.000000 +79000 -1.000000 +79001 -1.000000 +79002 -1.000000 +79003 -1.000000 +79004 -1.000000 +79005 -1.000000 +79006 -1.000000 +79007 -1.000000 +79008 -1.000000 +79009 -1.000000 +79010 -1.000000 +79011 -1.000000 +79012 -1.000000 +79013 -1.000000 +79014 -1.000000 +79015 -1.000000 +79016 -1.000000 +79017 -1.000000 +79018 -1.000000 +79019 -1.000000 +79020 -1.000000 +79021 -1.000000 +79022 -1.000000 +79023 -1.000000 +79024 -1.000000 +79025 -1.000000 +79026 -1.000000 +79027 -1.000000 +79028 -1.000000 +79029 -1.000000 +79030 -1.000000 +79031 -1.000000 +79032 -1.000000 +79033 -1.000000 +79034 -1.000000 +79035 -1.000000 +79036 -1.000000 +79037 -1.000000 +79038 -1.000000 +79039 -1.000000 +79040 -1.000000 +79041 -1.000000 +79042 -1.000000 +79043 -1.000000 +79044 -1.000000 +79045 -1.000000 +79046 -1.000000 +79047 -1.000000 +79048 -1.000000 +79049 -1.000000 +79050 -1.000000 +79051 -1.000000 +79052 -1.000000 +79053 -1.000000 +79054 -1.000000 +79055 -1.000000 +79056 -1.000000 +79057 -1.000000 +79058 -1.000000 +79059 -1.000000 +79060 -1.000000 +79061 -1.000000 +79062 -1.000000 +79063 -1.000000 +79064 -1.000000 +79065 -1.000000 +79066 -1.000000 +79067 -1.000000 +79068 -1.000000 +79069 -1.000000 +79070 -1.000000 +79071 -1.000000 +79072 -1.000000 +79073 -1.000000 +79074 -1.000000 +79075 -1.000000 +79076 -1.000000 +79077 -1.000000 +79078 -1.000000 +79079 -1.000000 +79080 -1.000000 +79081 -1.000000 +79082 -1.000000 +79083 -1.000000 +79084 -1.000000 +79085 -1.000000 +79086 -1.000000 +79087 -1.000000 +79088 -1.000000 +79089 -1.000000 +79090 -1.000000 +79091 -1.000000 +79092 -1.000000 +79093 -1.000000 +79094 -1.000000 +79095 -1.000000 +79096 -1.000000 +79097 -1.000000 +79098 -1.000000 +79099 -1.000000 +79100 -1.000000 +79101 -1.000000 +79102 -1.000000 +79103 -1.000000 +79104 -1.000000 +79105 -1.000000 +79106 -1.000000 +79107 -1.000000 +79108 -1.000000 +79109 -1.000000 +79110 -1.000000 +79111 -1.000000 +79112 -1.000000 +79113 -1.000000 +79114 -1.000000 +79115 -1.000000 +79116 -1.000000 +79117 -1.000000 +79118 -1.000000 +79119 -1.000000 +79120 -1.000000 +79121 -1.000000 +79122 -1.000000 +79123 -1.000000 +79124 -1.000000 +79126 -1.000000 +79127 -1.000000 +79128 -1.000000 +79129 -1.000000 +79130 -1.000000 +79131 -1.000000 +79132 -1.000000 +79133 -1.000000 +79134 -1.000000 +79135 -1.000000 +79136 -1.000000 +79137 -1.000000 +79138 -1.000000 +79139 -1.000000 +79140 -1.000000 +79141 -1.000000 +79142 -1.000000 +79143 -1.000000 +79144 -1.000000 +79145 -1.000000 +79146 -1.000000 +79147 -1.000000 +79148 -1.000000 +79149 -1.000000 +79150 -1.000000 +79151 -1.000000 +79152 -1.000000 +79153 -1.000000 +79155 -1.000000 +79156 -1.000000 +79157 -1.000000 +79158 -1.000000 +79159 -1.000000 +79160 -1.000000 +79161 -1.000000 +79162 -1.000000 +79163 -1.000000 +79164 -1.000000 +79165 -1.000000 +79166 -1.000000 +79167 -1.000000 +79168 -1.000000 +79169 -1.000000 +79171 -1.000000 +79172 -1.000000 +79173 -1.000000 +79174 -1.000000 +79175 -1.000000 +79176 -1.000000 +79177 -1.000000 +79178 -1.000000 +79179 -1.000000 +79180 -1.000000 +79181 -1.000000 +79182 -1.000000 +79183 -1.000000 +79184 -1.000000 +79185 -1.000000 +79186 -1.000000 +79187 -1.000000 +79188 -1.000000 +79189 -1.000000 +79190 -1.000000 +79191 -1.000000 +79192 -1.000000 +79193 -1.000000 +79194 -1.000000 +79195 -1.000000 +79196 -1.000000 +79197 -1.000000 +79198 -1.000000 +79199 -1.000000 +79200 -1.000000 +79202 -1.000000 +79203 -1.000000 +79204 -1.000000 +79205 -1.000000 +79206 -1.000000 +79207 -1.000000 +79208 -1.000000 +79209 -1.000000 +79210 -1.000000 +79211 -1.000000 +79212 -1.000000 +79213 -1.000000 +79214 -1.000000 +79215 -1.000000 +79216 -1.000000 +79217 -1.000000 +79218 -1.000000 +79219 -1.000000 +79220 -1.000000 +79221 -1.000000 +79222 -1.000000 +79223 -1.000000 +79224 -1.000000 +79225 -1.000000 +79226 -1.000000 +79227 -1.000000 +79228 -1.000000 +79229 -1.000000 +79230 -1.000000 +79231 -1.000000 +79232 -1.000000 +79233 -1.000000 +79234 -1.000000 +79235 -1.000000 +79236 -1.000000 +79237 -1.000000 +79238 -1.000000 +79239 -1.000000 +79240 -1.000000 +79241 -1.000000 +79242 -1.000000 +79243 -1.000000 +79244 -1.000000 +79245 -1.000000 +79246 -1.000000 +79247 -1.000000 +79248 -1.000000 +79249 -1.000000 +79250 -1.000000 +79251 -1.000000 +79252 -1.000000 +79253 -1.000000 +79254 -1.000000 +79255 -1.000000 +79256 -1.000000 +79257 -1.000000 +79258 -1.000000 +79259 -1.000000 +79260 -1.000000 +79261 -1.000000 +79262 -1.000000 +79263 -1.000000 +79264 -1.000000 +79265 -1.000000 +79266 -1.000000 +79267 -1.000000 +79268 -1.000000 +79269 -1.000000 +79270 -1.000000 +79271 -1.000000 +79272 -1.000000 +79273 -1.000000 +79274 -1.000000 +79275 -1.000000 +79276 -1.000000 +79277 -1.000000 +79278 -1.000000 +79279 -1.000000 +79280 -1.000000 +79281 -1.000000 +79282 -1.000000 +79283 -1.000000 +79284 -1.000000 +79285 -1.000000 +79286 -1.000000 +79287 -1.000000 +79288 -1.000000 +79289 -1.000000 +79290 -1.000000 +79291 -1.000000 +79292 -1.000000 +79293 -1.000000 +79294 -1.000000 +79295 -1.000000 +79296 -1.000000 +79297 -1.000000 +79298 -1.000000 +79299 -1.000000 +79300 -1.000000 +79301 -1.000000 +79302 -1.000000 +79303 -1.000000 +79304 -1.000000 +79305 -1.000000 +79306 -1.000000 +79307 -1.000000 +79308 -1.000000 +79309 -1.000000 +79310 -1.000000 +79311 -1.000000 +79312 -1.000000 +79313 -1.000000 +79314 -1.000000 +79315 -1.000000 +79316 -1.000000 +79317 -1.000000 +79318 -1.000000 +79319 -1.000000 +79320 -1.000000 +79321 -1.000000 +79322 -1.000000 +79323 -1.000000 +79324 -1.000000 +79325 -1.000000 +79326 -1.000000 +79327 -1.000000 +79328 -1.000000 +79329 -1.000000 +79330 -1.000000 +79331 -1.000000 +79332 -1.000000 +79333 -1.000000 +79334 -1.000000 +79335 -1.000000 +79336 -1.000000 +79337 -1.000000 +79338 -1.000000 +79339 -1.000000 +79340 -1.000000 +79341 -1.000000 +79342 -1.000000 +79343 -1.000000 +79344 -1.000000 +79345 -1.000000 +79346 -1.000000 +79347 -1.000000 +79348 -1.000000 +79349 -1.000000 +79350 -1.000000 +79351 -1.000000 +79352 -1.000000 +79353 -1.000000 +79354 -1.000000 +79355 -1.000000 +79356 -1.000000 +79357 -1.000000 +79358 -1.000000 +79359 -1.000000 +79360 -1.000000 +79361 -1.000000 +79362 -1.000000 +79363 -1.000000 +79364 -1.000000 +79365 -1.000000 +79366 -1.000000 +79367 -1.000000 +79368 -1.000000 +79369 -1.000000 +79370 -1.000000 +79371 -1.000000 +79372 -1.000000 +79373 -1.000000 +79374 -1.000000 +79375 -1.000000 +79376 -1.000000 +79377 -1.000000 +79378 -1.000000 +79379 -1.000000 +79380 -1.000000 +79381 -1.000000 +79382 -1.000000 +79383 -1.000000 +79384 -1.000000 +79385 -1.000000 +79386 -1.000000 +79387 -1.000000 +79388 -1.000000 +79389 -1.000000 +79390 -1.000000 +79391 -1.000000 +79392 -1.000000 +79393 -1.000000 +79394 -1.000000 +79395 -1.000000 +79396 -1.000000 +79397 -1.000000 +79398 -1.000000 +79399 -1.000000 +79400 -1.000000 +79401 -1.000000 +79402 -1.000000 +79403 -1.000000 +79404 -1.000000 +79405 -1.000000 +79406 -1.000000 +79407 -1.000000 +79408 -1.000000 +79409 -1.000000 +79410 -1.000000 +79411 -1.000000 +79412 -1.000000 +79413 -1.000000 +79414 -1.000000 +79415 -1.000000 +79416 -1.000000 +79417 -1.000000 +79418 -1.000000 +79419 -1.000000 +79420 -1.000000 +79421 -1.000000 +79422 -1.000000 +79423 -1.000000 +79424 -1.000000 +79425 -1.000000 +79426 -1.000000 +79427 -1.000000 +79428 -1.000000 +79429 -1.000000 +79430 -1.000000 +79431 -1.000000 +79432 -1.000000 +79433 -1.000000 +79434 -1.000000 +79435 -1.000000 +79436 -1.000000 +79437 -1.000000 +79438 -1.000000 +79439 -1.000000 +79440 -1.000000 +79441 -1.000000 +79442 -1.000000 +79443 -1.000000 +79444 -1.000000 +79445 -1.000000 +79446 -1.000000 +79447 -1.000000 +79448 -1.000000 +79449 -1.000000 +79450 -1.000000 +79451 -1.000000 +79452 -1.000000 +79453 -1.000000 +79454 -1.000000 +79455 -1.000000 +79456 -1.000000 +79457 -1.000000 +79458 -1.000000 +79459 -1.000000 +79460 -1.000000 +79461 -1.000000 +79462 -1.000000 +79463 -1.000000 +79464 -1.000000 +79465 -1.000000 +79466 -1.000000 +79467 -1.000000 +79468 -1.000000 +79469 -1.000000 +79470 -1.000000 +79471 -1.000000 +79472 -1.000000 +79473 -1.000000 +79474 -1.000000 +79475 -1.000000 +79476 -1.000000 +79477 -1.000000 +79478 -1.000000 +79479 -1.000000 +79480 -1.000000 +79481 -1.000000 +79482 -1.000000 +79483 -1.000000 +79484 -1.000000 +79485 -1.000000 +79486 -1.000000 +79487 -1.000000 +79488 -1.000000 +79489 -1.000000 +79490 -1.000000 +79491 -1.000000 +79492 -1.000000 +79493 -1.000000 +79494 -1.000000 +79495 -1.000000 +79496 -1.000000 +79497 -1.000000 +79498 -1.000000 +79499 -1.000000 +79500 -1.000000 +79501 -1.000000 +79502 -1.000000 +79503 -1.000000 +79504 -1.000000 +79505 -1.000000 +79506 -1.000000 +79507 -1.000000 +79508 -1.000000 +79509 -1.000000 +79510 -1.000000 +79511 -1.000000 +79512 -1.000000 +79513 -1.000000 +79514 -1.000000 +79515 -1.000000 +79516 -1.000000 +79517 -1.000000 +79518 -1.000000 +79519 -1.000000 +79520 -1.000000 +79521 -1.000000 +79522 -1.000000 +79523 -1.000000 +79524 -1.000000 +79525 -1.000000 +79526 -1.000000 +79527 -1.000000 +79528 -1.000000 +79529 -1.000000 +79530 -1.000000 +79531 -1.000000 +79532 -1.000000 +79533 -1.000000 +79534 -1.000000 +79535 -1.000000 +79536 -1.000000 +79537 -1.000000 +79538 -1.000000 +79539 -1.000000 +79540 -1.000000 +79541 -1.000000 +79542 -1.000000 +79543 -1.000000 +79544 -1.000000 +79545 -1.000000 +79546 -1.000000 +79547 -1.000000 +79548 -1.000000 +79549 -1.000000 +79550 -1.000000 +79551 -1.000000 +79552 -1.000000 +79553 -1.000000 +79554 -1.000000 +79555 -1.000000 +79556 -1.000000 +79557 -1.000000 +79558 -1.000000 +79559 -1.000000 +79560 -1.000000 +79561 -1.000000 +79562 -1.000000 +79563 -1.000000 +79564 -1.000000 +79565 -1.000000 +79566 -1.000000 +79567 -1.000000 +79568 -1.000000 +79569 -1.000000 +79570 -1.000000 +79571 -1.000000 +79572 -1.000000 +79573 -1.000000 +79574 -1.000000 +79575 -1.000000 +79576 -1.000000 +79577 -1.000000 +79578 -1.000000 +79579 -1.000000 +79580 -1.000000 +79581 -1.000000 +79582 -1.000000 +79583 -1.000000 +79584 -1.000000 +79585 -1.000000 +79586 -1.000000 +79587 -1.000000 +79588 -1.000000 +79589 -1.000000 +79590 -1.000000 +79591 -1.000000 +79592 -1.000000 +79593 -1.000000 +79594 -1.000000 +79595 -1.000000 +79596 -1.000000 +79597 -1.000000 +79598 -1.000000 +79599 -1.000000 +79600 -1.000000 +79601 -1.000000 +79602 -1.000000 +79603 -1.000000 +79604 -1.000000 +79605 -1.000000 +79606 -1.000000 +79607 -1.000000 +79608 -1.000000 +79609 -1.000000 +79610 -1.000000 +79611 -1.000000 +79612 -1.000000 +79613 -1.000000 +79614 -1.000000 +79615 -1.000000 +79616 -1.000000 +79617 -1.000000 +79618 -1.000000 +79619 -1.000000 +79620 -1.000000 +79621 -1.000000 +79622 -1.000000 +79623 -1.000000 +79624 -1.000000 +79625 -1.000000 +79626 -1.000000 +79627 -1.000000 +79628 -1.000000 +79629 -1.000000 +79630 -1.000000 +79631 -1.000000 +79632 -1.000000 +79633 -1.000000 +79634 -1.000000 +79635 -1.000000 +79636 -1.000000 +79637 -1.000000 +79638 -1.000000 +79639 -1.000000 +79640 -1.000000 +79641 -1.000000 +79642 -1.000000 +79643 -1.000000 +79644 -1.000000 +79645 -1.000000 +79646 -1.000000 +79647 -1.000000 +79648 -1.000000 +79649 -1.000000 +79650 -1.000000 +79651 -1.000000 +79652 -1.000000 +79653 -1.000000 +79654 -1.000000 +79655 -1.000000 +79656 -1.000000 +79657 -1.000000 +79658 -1.000000 +79659 -1.000000 +79660 -1.000000 +79661 -1.000000 +79662 -1.000000 +79663 -1.000000 +79664 -1.000000 +79665 -1.000000 +79666 -1.000000 +79667 -1.000000 +79668 -1.000000 +79669 -1.000000 +79670 -1.000000 +79671 -1.000000 +79672 -1.000000 +79673 -1.000000 +79674 -1.000000 +79675 -1.000000 +79676 -1.000000 +79677 -1.000000 +79678 -1.000000 +79679 -1.000000 +79680 -1.000000 +79681 -1.000000 +79682 -1.000000 +79683 -1.000000 +79684 -1.000000 +79685 -1.000000 +79686 -1.000000 +79687 -1.000000 +79688 -1.000000 +79689 -1.000000 +79690 -1.000000 +79691 -1.000000 +79692 -1.000000 +79693 -1.000000 +79694 -1.000000 +79695 -1.000000 +79696 -1.000000 +79697 -1.000000 +79698 -1.000000 +79699 -1.000000 +79700 -1.000000 +79701 -1.000000 +79702 -1.000000 +79703 -1.000000 +79704 -1.000000 +79705 -1.000000 +79706 -1.000000 +79707 -1.000000 +79708 -1.000000 +79709 -1.000000 +79710 -1.000000 +79711 -1.000000 +79712 -1.000000 +79713 -1.000000 +79714 -1.000000 +79715 -1.000000 +79716 -1.000000 +79717 -1.000000 +79718 -1.000000 +79719 -1.000000 +79720 -1.000000 +79721 -1.000000 +79722 -1.000000 +79723 -1.000000 +79724 -1.000000 +79725 -1.000000 +79726 -1.000000 +79727 -1.000000 +79728 -1.000000 +79729 -1.000000 +79730 -1.000000 +79731 -1.000000 +79732 -1.000000 +79733 -1.000000 +79734 -1.000000 +79735 -1.000000 +79736 -1.000000 +79737 -1.000000 +79738 -1.000000 +79739 -1.000000 +79740 -1.000000 +79741 -1.000000 +79742 -1.000000 +79743 -1.000000 +79744 -1.000000 +79745 -1.000000 +79746 -1.000000 +79747 -1.000000 +79748 -1.000000 +79749 -1.000000 +79750 -1.000000 +79751 -1.000000 +79752 -1.000000 +79753 -1.000000 +79754 -1.000000 +79755 -1.000000 +79756 -1.000000 +79757 -1.000000 +79758 -1.000000 +79759 -1.000000 +79760 -1.000000 +79761 -1.000000 +79762 -1.000000 +79763 -1.000000 +79764 -1.000000 +79765 -1.000000 +79766 -1.000000 +79767 -1.000000 +79768 -1.000000 +79769 -1.000000 +79770 -1.000000 +79771 -1.000000 +79772 -1.000000 +79773 -1.000000 +79774 -1.000000 +79775 -1.000000 +79776 -1.000000 +79777 -1.000000 +79778 -1.000000 +79779 -1.000000 +79780 -1.000000 +79781 -1.000000 +79782 -1.000000 +79783 -1.000000 +79784 -1.000000 +79785 -1.000000 +79786 -1.000000 +79787 -1.000000 +79788 -1.000000 +79789 -1.000000 +79790 -1.000000 +79791 -1.000000 +79792 -1.000000 +79793 -1.000000 +79794 -1.000000 +79795 -1.000000 +79796 -1.000000 +79797 -1.000000 +79798 -1.000000 +79799 -1.000000 +79800 -1.000000 +79801 -1.000000 +79802 -1.000000 +79803 -1.000000 +79804 -1.000000 +79805 -1.000000 +79806 -1.000000 +79807 -1.000000 +79808 -1.000000 +79809 -1.000000 +79810 -1.000000 +79811 -1.000000 +79812 -1.000000 +79813 -1.000000 +79814 -1.000000 +79815 -1.000000 +79816 -1.000000 +79817 -1.000000 +79818 -1.000000 +79819 -1.000000 +79820 -1.000000 +79821 -1.000000 +79822 -1.000000 +79823 -1.000000 +79824 -1.000000 +79825 -1.000000 +79826 -1.000000 +79827 -1.000000 +79828 -1.000000 +79829 -1.000000 +79830 -1.000000 +79831 -1.000000 +79832 -1.000000 +79833 -1.000000 +79834 -1.000000 +79835 -1.000000 +79836 -1.000000 +79837 -1.000000 +79838 -1.000000 +79839 -1.000000 +79840 -1.000000 +79841 -1.000000 +79842 -1.000000 +79843 -1.000000 +79844 -1.000000 +79845 -1.000000 +79846 -1.000000 +79847 -1.000000 +79848 -1.000000 +79849 -1.000000 +79850 -1.000000 +79851 -1.000000 +79852 -1.000000 +79853 -1.000000 +79854 -1.000000 +79855 -1.000000 +79856 -1.000000 +79857 -1.000000 +79858 -1.000000 +79859 -1.000000 +79860 -1.000000 +79861 -1.000000 +79862 -1.000000 +79863 -1.000000 +79864 -1.000000 +79865 -1.000000 +79866 -1.000000 +79867 -1.000000 +79868 -1.000000 +79869 -1.000000 +79870 -1.000000 +79871 -1.000000 +79872 -1.000000 +79873 -1.000000 +79874 -1.000000 +79875 -1.000000 +79876 -1.000000 +79877 -1.000000 +79878 -1.000000 +79879 -1.000000 +79880 -1.000000 +79881 -1.000000 +79882 -1.000000 +79883 -1.000000 +79884 -1.000000 +79885 -1.000000 +79886 -1.000000 +79887 -1.000000 +79888 -1.000000 +79889 -1.000000 +79890 -1.000000 +79891 -1.000000 +79892 -1.000000 +79893 -1.000000 +79894 -1.000000 +79895 -1.000000 +79896 -1.000000 +79897 -1.000000 +79898 -1.000000 +79899 -1.000000 +79900 -1.000000 +79901 -1.000000 +79902 -1.000000 +79903 -1.000000 +79904 -1.000000 +79905 -1.000000 +79906 -1.000000 +79907 -1.000000 +79908 -1.000000 +79909 -1.000000 +79910 -1.000000 +79911 -1.000000 +79912 -1.000000 +79913 -1.000000 +79914 -1.000000 +79915 -1.000000 +79916 -1.000000 +79917 -1.000000 +79918 -1.000000 +79919 -1.000000 +79920 -1.000000 +79921 -1.000000 +79922 -1.000000 +79923 -1.000000 +79924 -1.000000 +79925 -1.000000 +79926 -1.000000 +79927 -1.000000 +79928 -1.000000 +79929 -1.000000 +79930 -1.000000 +79931 -1.000000 +79932 -1.000000 +79933 -1.000000 +79934 -1.000000 +79935 -1.000000 +79936 -1.000000 +79937 -1.000000 +79938 -1.000000 +79939 -1.000000 +79940 -1.000000 +79941 -1.000000 +79942 -1.000000 +79943 -1.000000 +79944 -1.000000 +79945 -1.000000 +79946 -1.000000 +79947 -1.000000 +79948 -1.000000 +79949 -1.000000 +79950 -1.000000 +79951 -1.000000 +79952 -1.000000 +79953 -1.000000 +79954 -1.000000 +79955 -1.000000 +79956 -1.000000 +79957 -1.000000 +79958 -1.000000 +79959 -1.000000 +79960 -1.000000 +79961 -1.000000 +79962 -1.000000 +79963 -1.000000 +79964 -1.000000 +79965 -1.000000 +79966 -1.000000 +79967 -1.000000 +79968 -1.000000 +79969 -1.000000 +79970 -1.000000 +79971 -1.000000 +79972 -1.000000 +79973 -1.000000 +79974 -1.000000 +79975 -1.000000 +79976 -1.000000 +79977 -1.000000 +79978 -1.000000 +79979 -1.000000 +79980 -1.000000 +79981 -1.000000 +79982 -1.000000 +79983 -1.000000 +79984 -1.000000 +79985 -1.000000 +79986 -1.000000 +79987 -1.000000 +79988 -1.000000 +79989 -1.000000 +79990 -1.000000 +79991 -1.000000 +79992 -1.000000 +79993 -1.000000 +79994 -1.000000 +79995 -1.000000 +79996 -1.000000 +79997 -1.000000 +79998 -1.000000 +79999 -1.000000 +80000 -1.000000 +80001 -1.000000 +80002 -1.000000 +80003 -1.000000 +80004 -1.000000 +80005 -1.000000 +80006 -1.000000 +80007 -1.000000 +80008 -1.000000 +80009 -1.000000 +80010 -1.000000 +80011 -1.000000 +80012 -1.000000 +80013 -1.000000 +80014 -1.000000 +80015 -1.000000 +80016 -1.000000 +80017 -1.000000 +80018 -1.000000 +80019 -1.000000 +80020 -1.000000 +80021 -1.000000 +80022 -1.000000 +80023 -1.000000 +80024 -1.000000 +80025 -1.000000 +80026 -1.000000 +80027 -1.000000 +80028 -1.000000 +80029 -1.000000 +80030 -1.000000 +80031 -1.000000 +80032 -1.000000 +80033 -1.000000 +80034 -1.000000 +80035 -1.000000 +80036 -1.000000 +80037 -1.000000 +80038 -1.000000 +80039 -1.000000 +80040 -1.000000 +80041 -1.000000 +80042 -1.000000 +80043 -1.000000 +80044 -1.000000 +80045 -1.000000 +80046 -1.000000 +80047 -1.000000 +80048 -1.000000 +80049 -1.000000 +80050 -1.000000 +80051 -1.000000 +80052 -1.000000 +80053 -1.000000 +80054 -1.000000 +80055 -1.000000 +80056 -1.000000 +80057 -1.000000 +80058 -1.000000 +80059 -1.000000 +80060 -1.000000 +80061 -1.000000 +80062 -1.000000 +80063 -1.000000 +80064 -1.000000 +80065 -1.000000 +80066 -1.000000 +80067 -1.000000 +80068 -1.000000 +80069 -1.000000 +80070 -1.000000 +80071 -1.000000 +80072 -1.000000 +80073 -1.000000 +80074 -1.000000 +80075 -1.000000 +80076 -1.000000 +80077 -1.000000 +80078 -1.000000 +80079 -1.000000 +80080 -1.000000 +80081 -1.000000 +80082 -1.000000 +80083 -1.000000 +80084 -1.000000 +80085 -1.000000 +80086 -1.000000 +80087 -1.000000 +80088 -1.000000 +80089 -1.000000 +80090 -1.000000 +80091 -1.000000 +80092 -1.000000 +80093 -1.000000 +80094 -1.000000 +80095 -1.000000 +80096 -1.000000 +80097 -1.000000 +80098 -1.000000 +80099 -1.000000 +80100 -1.000000 +80101 -1.000000 +80102 -1.000000 +80103 -1.000000 +80104 -1.000000 +80105 -1.000000 +80106 -1.000000 +80107 -1.000000 +80108 -1.000000 +80109 -1.000000 +80110 -1.000000 +80111 -1.000000 +80112 -1.000000 +80113 -1.000000 +80114 -1.000000 +80115 -1.000000 +80116 -1.000000 +80117 -1.000000 +80118 -1.000000 +80119 -1.000000 +80120 -1.000000 +80121 -1.000000 +80122 -1.000000 +80123 -1.000000 +80124 -1.000000 +80125 -1.000000 +80126 -1.000000 +80127 -1.000000 +80128 -1.000000 +80129 -1.000000 +80130 -1.000000 +80131 -1.000000 +80132 -1.000000 +80133 -1.000000 +80134 -1.000000 +80135 -1.000000 +80136 -1.000000 +80137 -1.000000 +80138 -1.000000 +80139 -1.000000 +80140 -1.000000 +80141 -1.000000 +80142 -1.000000 +80143 -1.000000 +80144 -1.000000 +80145 -1.000000 +80146 -1.000000 +80147 -1.000000 +80148 -1.000000 +80149 -1.000000 +80150 -1.000000 +80151 -1.000000 +80152 -1.000000 +80153 -1.000000 +80154 -1.000000 +80155 -1.000000 +80156 -1.000000 +80157 -1.000000 +80158 -1.000000 +80159 -1.000000 +80160 -1.000000 +80161 -1.000000 +80162 -1.000000 +80163 -1.000000 +80164 -1.000000 +80165 -1.000000 +80166 -1.000000 +80167 -1.000000 +80168 -1.000000 +80169 -1.000000 +80170 -1.000000 +80171 -1.000000 +80172 -1.000000 +80173 -1.000000 +80174 -1.000000 +80175 -1.000000 +80176 -1.000000 +80177 -1.000000 +80178 -1.000000 +80179 -1.000000 +80180 -1.000000 +80181 -1.000000 +80182 -1.000000 +80183 -1.000000 +80184 -1.000000 +80185 -1.000000 +80186 -1.000000 +80187 -1.000000 +80188 -1.000000 +80189 -1.000000 +80190 -1.000000 +80191 -1.000000 +80192 -1.000000 +80193 -1.000000 +80194 -1.000000 +80195 -1.000000 +80196 -1.000000 +80197 -1.000000 +80198 -1.000000 +80199 -1.000000 +80200 -1.000000 +80201 -1.000000 +80202 -1.000000 +80203 -1.000000 +80204 -1.000000 +80205 -1.000000 +80206 -1.000000 +80207 -1.000000 +80208 -1.000000 +80209 -1.000000 +80210 -1.000000 +80211 -1.000000 +80212 -1.000000 +80213 -1.000000 +80214 -1.000000 +80215 -1.000000 +80216 -1.000000 +80217 -1.000000 +80218 -1.000000 +80219 -1.000000 +80220 -1.000000 +80221 -1.000000 +80222 -1.000000 +80223 -1.000000 +80224 -1.000000 +80225 -1.000000 +80226 -1.000000 +80227 -1.000000 +80228 -1.000000 +80229 -1.000000 +80230 -1.000000 +80231 -1.000000 +80232 -1.000000 +80233 -1.000000 +80234 -1.000000 +80235 -1.000000 +80236 -1.000000 +80237 -1.000000 +80238 -1.000000 +80239 -1.000000 +80240 -1.000000 +80241 -1.000000 +80243 -1.000000 +80245 -1.000000 +80246 -1.000000 +80247 -1.000000 +80248 -1.000000 +80249 -1.000000 +80250 -1.000000 +80251 -1.000000 +80252 -1.000000 +80253 -1.000000 +80254 -1.000000 +80255 -1.000000 +80256 -1.000000 +80257 -1.000000 +80258 -1.000000 +80259 -1.000000 +80260 -1.000000 +80261 -1.000000 +80262 -1.000000 +80263 -1.000000 +80264 -1.000000 +80265 -1.000000 +80266 -1.000000 +80267 -1.000000 +80268 -1.000000 +80269 -1.000000 +80270 -1.000000 +80271 -1.000000 +80272 -1.000000 +80273 -1.000000 +80274 -1.000000 +80275 -1.000000 +80276 -1.000000 +80277 -1.000000 +80278 -1.000000 +80279 -1.000000 +80280 -1.000000 +80281 -1.000000 +80282 -1.000000 +80283 -1.000000 +80284 -1.000000 +80285 -1.000000 +80286 -1.000000 +80288 -1.000000 +80289 -1.000000 +80290 -1.000000 +80291 -1.000000 +80292 -1.000000 +80295 -1.000000 +80296 -1.000000 +80306 -1.000000 +80307 -1.000000 +80308 -1.000000 +80309 -1.000000 +80310 -1.000000 +80311 -1.000000 +80312 -1.000000 +80313 -1.000000 +80314 -1.000000 +80315 -1.000000 +80316 -1.000000 +80317 -1.000000 +80318 -1.000000 +80319 -1.000000 +80320 -1.000000 +80321 -1.000000 +80322 -1.000000 +80323 -1.000000 +80324 -1.000000 +80325 -1.000000 +80326 -1.000000 +80327 -1.000000 +80328 -1.000000 +80329 -1.000000 +80330 -1.000000 +80331 -1.000000 +80332 -1.000000 +80333 -1.000000 +80334 -1.000000 +80336 -1.000000 +80337 -1.000000 +80338 -1.000000 +80339 -1.000000 +80340 -1.000000 +80341 -1.000000 +80342 -1.000000 +80343 -1.000000 +80344 -1.000000 +80345 -1.000000 +80346 -1.000000 +80347 -1.000000 +80348 -1.000000 +80349 -1.000000 +80350 -1.000000 +80351 -1.000000 +80352 -1.000000 +80353 -1.000000 +80354 -1.000000 +80355 -1.000000 +80356 -1.000000 +80357 -1.000000 +80358 -1.000000 +80359 -1.000000 +80360 -1.000000 +80361 -1.000000 +80362 -1.000000 +80363 -1.000000 +80364 -1.000000 +80365 -1.000000 +80366 -1.000000 +80367 -1.000000 +80368 -1.000000 +80369 -1.000000 +80370 -1.000000 +80371 -1.000000 +80372 -1.000000 +80373 -1.000000 +80374 -1.000000 +80375 -1.000000 +80376 -1.000000 +80377 -1.000000 +80378 -1.000000 +80379 -1.000000 +80380 -1.000000 +80381 -1.000000 +80382 -1.000000 +80383 -1.000000 +80384 -1.000000 +80385 -1.000000 +80386 -1.000000 +80387 -1.000000 +80388 -1.000000 +80389 -1.000000 +80390 -1.000000 +80391 -1.000000 +80392 -1.000000 +80393 -1.000000 +80394 -1.000000 +80395 -1.000000 +80396 -1.000000 +80397 -1.000000 +80398 -1.000000 +80399 -1.000000 +80400 -1.000000 +80401 -1.000000 +80402 -1.000000 +80403 -1.000000 +80404 -1.000000 +80405 -1.000000 +80406 -1.000000 +80407 -1.000000 +80408 -1.000000 +80409 -1.000000 +80410 -1.000000 +80411 -1.000000 +80412 -1.000000 +80413 -1.000000 +80414 -1.000000 +80415 -1.000000 +80416 -1.000000 +80417 -1.000000 +80418 -1.000000 +80419 -1.000000 +80420 -1.000000 +80421 -1.000000 +80422 -1.000000 +80423 -1.000000 +80424 -1.000000 +80425 -1.000000 +80426 -1.000000 +80427 -1.000000 +80428 -1.000000 +80429 -1.000000 +80430 -1.000000 +80431 -1.000000 +80432 -1.000000 +80433 -1.000000 +80434 -1.000000 +80435 -1.000000 +80436 -1.000000 +80437 -1.000000 +80438 -1.000000 +80439 -1.000000 +80442 -1.000000 +80443 -1.000000 +80444 -1.000000 +80445 -1.000000 +80446 -1.000000 +80447 -1.000000 +80448 -1.000000 +80449 -1.000000 +80450 -1.000000 +80451 -1.000000 +80452 -1.000000 +80453 -1.000000 +80454 -1.000000 +80455 -1.000000 +80456 -1.000000 +80457 -1.000000 +80458 -1.000000 +80459 -1.000000 +80460 -1.000000 +80461 -1.000000 +80462 -1.000000 +80463 -1.000000 +80464 -1.000000 +80465 -1.000000 +80466 -1.000000 +80467 -1.000000 +80468 -1.000000 +80469 -1.000000 +80470 -1.000000 +80471 -1.000000 +80472 -1.000000 +80473 -1.000000 +80474 -1.000000 +80475 -1.000000 +80476 -1.000000 +80477 -1.000000 +80478 -1.000000 +80479 -1.000000 +80480 -1.000000 +80481 -1.000000 +80482 -1.000000 +80483 -1.000000 +80484 -1.000000 +80489 -1.000000 +80490 -1.000000 +80491 -1.000000 +80492 -1.000000 +80493 -1.000000 +80494 -1.000000 +80495 -1.000000 +80496 -1.000000 +80497 -1.000000 +80498 -1.000000 +80499 -1.000000 +80500 -1.000000 +80501 -1.000000 +80502 -1.000000 +80503 -1.000000 +80504 -1.000000 +80505 -1.000000 +80506 -1.000000 +80507 -1.000000 +80508 -1.000000 +80509 -1.000000 +80510 -1.000000 +80511 -1.000000 +80518 -1.000000 +80519 -1.000000 +80520 -1.000000 +80521 -1.000000 +80522 -1.000000 +80523 -1.000000 +80524 -1.000000 +80525 -1.000000 +80526 -1.000000 +80527 -1.000000 +80528 -1.000000 +80529 -1.000000 +80530 -1.000000 +80531 -1.000000 +80532 -1.000000 +80533 -1.000000 +80534 -1.000000 +80539 -1.000000 +80540 -1.000000 +80541 -1.000000 +80543 -1.000000 +80544 -1.000000 +80545 -1.000000 +80550 -1.000000 +80551 -1.000000 +80552 -1.000000 +80553 -1.000000 +80554 -1.000000 +80555 -1.000000 +80556 -1.000000 +80557 -1.000000 +80558 -1.000000 +80560 -1.000000 +80561 -1.000000 +80562 -1.000000 +80563 -1.000000 +80564 -1.000000 +80565 -1.000000 +80566 -1.000000 +80567 -1.000000 +80568 -1.000000 +80569 -1.000000 +80570 -1.000000 +80571 -1.000000 +80572 -1.000000 +80573 -1.000000 +80574 -1.000000 +80575 -1.000000 +80576 -1.000000 +80577 -1.000000 +80578 -1.000000 +80579 -1.000000 +80580 -1.000000 +80581 -1.000000 +80582 -1.000000 +80583 -1.000000 +80584 -1.000000 +80585 -1.000000 +80586 -1.000000 +80587 -1.000000 +80589 -1.000000 +80592 -1.000000 +80593 -1.000000 +80594 -1.000000 +80595 -1.000000 +80596 -1.000000 +80597 -1.000000 +80598 -1.000000 +80599 -1.000000 +80600 -1.000000 +80601 -1.000000 +80602 -1.000000 +80603 -1.000000 +80604 -1.000000 +80605 -1.000000 +80606 -1.000000 +80607 -1.000000 +80608 -1.000000 +80609 -1.000000 +80610 -1.000000 +80611 -1.000000 +80612 -1.000000 +80613 -1.000000 +80614 -1.000000 +80615 -1.000000 +80616 -1.000000 +80617 -1.000000 +80618 -1.000000 +80619 -1.000000 +80620 -1.000000 +80621 -1.000000 +80622 -1.000000 +80623 -1.000000 +80624 -1.000000 +80630 -1.000000 +80631 -1.000000 +80632 -1.000000 +80637 -1.000000 +80639 -1.000000 +80640 -1.000000 +80641 -1.000000 +80642 -1.000000 +80643 -1.000000 +80644 -1.000000 +80645 -1.000000 +80646 -1.000000 +80647 -1.000000 +80648 -1.000000 +80649 -1.000000 +80650 -1.000000 +80651 -1.000000 +80652 -1.000000 +80653 -1.000000 +80654 -1.000000 +80655 -1.000000 +80656 -1.000000 +80657 -1.000000 +80658 -1.000000 +80659 -1.000000 +80660 -1.000000 +80661 -1.000000 +80662 -1.000000 +80663 -1.000000 +80664 -1.000000 +80665 -1.000000 +80666 -1.000000 +80667 -1.000000 +80668 -1.000000 +80669 -1.000000 +80670 -1.000000 +80671 -1.000000 +80672 -1.000000 +80673 -1.000000 +80674 -1.000000 +80675 -1.000000 +80676 -1.000000 +80677 -1.000000 +80678 -1.000000 +80679 -1.000000 +80680 -1.000000 +80681 -1.000000 +80682 -1.000000 +80683 -1.000000 +80684 -1.000000 +80685 -1.000000 +80687 -1.000000 +80688 -1.000000 +80689 -1.000000 +80690 -1.000000 +80691 -1.000000 +80692 -1.000000 +80693 -1.000000 +80694 -1.000000 +80695 -1.000000 +80696 -1.000000 +80697 -1.000000 +80698 -1.000000 +80699 -1.000000 +80700 -1.000000 +80701 -1.000000 +80702 -1.000000 +80703 -1.000000 +80704 -1.000000 +80705 -1.000000 +80706 -1.000000 +80707 -1.000000 +80708 -1.000000 +80709 -1.000000 +80710 -1.000000 +80711 -1.000000 +80712 -1.000000 +80713 -1.000000 +80714 -1.000000 +80715 -1.000000 +80716 -1.000000 +80717 -1.000000 +80718 -1.000000 +80719 -1.000000 +80720 -1.000000 +80721 -1.000000 +80722 -1.000000 +80723 -1.000000 +80724 -1.000000 +80725 -1.000000 +80726 -1.000000 +80727 -1.000000 +80728 -1.000000 +80729 -1.000000 +80730 -1.000000 +80731 -1.000000 +80732 -1.000000 +80733 -1.000000 +80734 -1.000000 +80735 -1.000000 +80736 -1.000000 +80737 -1.000000 +80738 -1.000000 +80739 -1.000000 +80740 -1.000000 +80741 -1.000000 +80742 -1.000000 +80743 -1.000000 +80744 -1.000000 +80745 -1.000000 +80746 -1.000000 +80747 -1.000000 +80748 -1.000000 +80749 -1.000000 +80750 -1.000000 +80751 -1.000000 +80752 -1.000000 +80753 -1.000000 +80754 -1.000000 +80755 -1.000000 +80756 -1.000000 +80757 -1.000000 +80758 -1.000000 +80759 -1.000000 +80760 -1.000000 +80761 -1.000000 +80762 -1.000000 +80763 -1.000000 +80764 -1.000000 +80765 -1.000000 +80766 -1.000000 +80767 -1.000000 +80768 -1.000000 +80769 -1.000000 +80770 -1.000000 +80771 -1.000000 +80772 -1.000000 +80773 -1.000000 +80774 -1.000000 +80775 -1.000000 +80776 -1.000000 +80777 -1.000000 +80778 -1.000000 +80779 -1.000000 +80780 -1.000000 +80781 -1.000000 +80782 -1.000000 +80783 -1.000000 +80784 -1.000000 +80785 -1.000000 +80786 -1.000000 +80787 -1.000000 +80788 -1.000000 +80790 -1.000000 +80791 -1.000000 +80792 -1.000000 +80793 -1.000000 +80794 -1.000000 +80795 -1.000000 +80796 -1.000000 +80797 -1.000000 +80798 -1.000000 +80799 -1.000000 +80800 -1.000000 +80801 -1.000000 +80802 -1.000000 +80803 -1.000000 +80804 -1.000000 +80805 -1.000000 +80806 -1.000000 +80807 -1.000000 +80808 -1.000000 +80809 -1.000000 +80810 -1.000000 +80811 -1.000000 +80812 -1.000000 +80813 -1.000000 +80814 -1.000000 +80815 -1.000000 +80816 -1.000000 +80817 -1.000000 +80818 -1.000000 +80819 -1.000000 +80820 -1.000000 +80821 -1.000000 +80822 -1.000000 +80823 -1.000000 +80824 -1.000000 +80825 -1.000000 +80826 -1.000000 +80827 -1.000000 +80828 -1.000000 +80829 -1.000000 +80830 -1.000000 +80831 -1.000000 +80832 -1.000000 +80833 -1.000000 +80834 -1.000000 +80835 -1.000000 +80836 -1.000000 +80837 -1.000000 +80838 -1.000000 +80839 -1.000000 +80840 -1.000000 +80841 -1.000000 +80842 -1.000000 +80843 -1.000000 +80844 -1.000000 +80845 -1.000000 +80846 -1.000000 +80847 -1.000000 +80848 -1.000000 +80849 -1.000000 +80850 -1.000000 +80851 -1.000000 +80852 -1.000000 +80853 -1.000000 +80854 -1.000000 +80855 -1.000000 +80856 -1.000000 +80857 -1.000000 +80858 -1.000000 +80859 -1.000000 +80860 -1.000000 +80861 -1.000000 +80862 -1.000000 +80863 -1.000000 +80864 -1.000000 +80865 -1.000000 +80866 -1.000000 +80867 -1.000000 +80868 -1.000000 +80869 -1.000000 +80870 -1.000000 +80871 -1.000000 +80872 -1.000000 +80873 -1.000000 +80874 -1.000000 +80875 -1.000000 +80876 -1.000000 +80877 -1.000000 +80878 -1.000000 +80879 -1.000000 +80880 -1.000000 +80881 -1.000000 +80882 -1.000000 +80883 -1.000000 +80884 -1.000000 +80885 -1.000000 +80886 -1.000000 +80887 -1.000000 +80888 -1.000000 +80889 -1.000000 +80890 -1.000000 +80891 -1.000000 +80892 -1.000000 +80893 -1.000000 +80894 -1.000000 +80895 -1.000000 +80896 -1.000000 +80897 -1.000000 +80898 -1.000000 +80899 -1.000000 +80900 -1.000000 +80901 -1.000000 +80902 -1.000000 +80903 -1.000000 +80904 -1.000000 +80905 -1.000000 +80906 -1.000000 +80907 -1.000000 +80908 -1.000000 +80909 -1.000000 +80910 -1.000000 +80911 -1.000000 +80912 -1.000000 +80913 -1.000000 +80914 -1.000000 +80915 -1.000000 +80916 -1.000000 +80917 -1.000000 +80918 -1.000000 +80919 -1.000000 +80920 -1.000000 +80921 -1.000000 +80922 -1.000000 +80923 -1.000000 +80924 -1.000000 +80925 -1.000000 +80926 -1.000000 +80927 -1.000000 +80928 -1.000000 +80929 -1.000000 +80930 -1.000000 +80931 -1.000000 +80932 -1.000000 +80933 -1.000000 +80934 -1.000000 +80935 -1.000000 +80936 -1.000000 +80937 -1.000000 +80938 -1.000000 +80939 -1.000000 +80940 -1.000000 +80941 -1.000000 +80942 -1.000000 +80943 -1.000000 +80944 -1.000000 +80945 -1.000000 +80949 -1.000000 +80950 -1.000000 +80951 -1.000000 +80952 -1.000000 +80953 -1.000000 +80954 -1.000000 +80955 -1.000000 +80956 -1.000000 +80957 -1.000000 +80958 -1.000000 +80959 -1.000000 +80960 -1.000000 +80961 -1.000000 +80962 -1.000000 +80963 -1.000000 +80964 -1.000000 +80965 -1.000000 +80966 -1.000000 +80967 -1.000000 +80968 -1.000000 +80969 -1.000000 +80970 -1.000000 +80971 -1.000000 +80972 -1.000000 +80973 -1.000000 +80974 -1.000000 +80975 -1.000000 +80976 -1.000000 +80977 -1.000000 +80978 -1.000000 +80979 -1.000000 +80980 -1.000000 +80981 -1.000000 +80982 -1.000000 +80983 -1.000000 +80984 -1.000000 +80985 -1.000000 +80986 -1.000000 +80987 -1.000000 +80988 -1.000000 +80989 -1.000000 +80990 -1.000000 +80991 -1.000000 +80992 -1.000000 +80993 -1.000000 +80994 -1.000000 +80995 -1.000000 +80996 -1.000000 +80997 -1.000000 +80998 -1.000000 +80999 -1.000000 +81000 -1.000000 +81001 -1.000000 +81002 -1.000000 +81003 -1.000000 +81004 -1.000000 +81005 -1.000000 +81006 -1.000000 +81007 -1.000000 +81008 -1.000000 +81009 -1.000000 +81010 -1.000000 +81011 -1.000000 +81012 -1.000000 +81013 -1.000000 +81014 -1.000000 +81015 -1.000000 +81016 -1.000000 +81017 -1.000000 +81018 -1.000000 +81019 -1.000000 +81020 -1.000000 +81021 -1.000000 +81022 -1.000000 +81023 -1.000000 +81024 -1.000000 +81025 -1.000000 +81026 -1.000000 +81027 -1.000000 +81028 -1.000000 +81029 -1.000000 +81030 -1.000000 +81031 -1.000000 +81032 -1.000000 +81033 -1.000000 +81034 -1.000000 +81035 -1.000000 +81036 -1.000000 +81037 -1.000000 +81038 -1.000000 +81039 -1.000000 +81040 -1.000000 +81041 -1.000000 +81042 -1.000000 +81043 -1.000000 +81044 -1.000000 +81045 -1.000000 +81046 -1.000000 +81047 -1.000000 +81048 -1.000000 +81049 -1.000000 +81050 -1.000000 +81051 -1.000000 +81052 -1.000000 +81053 -1.000000 +81054 -1.000000 +81055 -1.000000 +81056 -1.000000 +81057 -1.000000 +81058 -1.000000 +81059 -1.000000 +81060 -1.000000 +81061 -1.000000 +81062 -1.000000 +81063 -1.000000 +81064 -1.000000 +81065 -1.000000 +81066 -1.000000 +81067 -1.000000 +81068 -1.000000 +81069 -1.000000 +81070 -1.000000 +81071 -1.000000 +81072 -1.000000 +81073 -1.000000 +81074 -1.000000 +81075 -1.000000 +81076 -1.000000 +81077 -1.000000 +81078 -1.000000 +81079 -1.000000 +81080 -1.000000 +81081 -1.000000 +81082 -1.000000 +81083 -1.000000 +81084 -1.000000 +81085 -1.000000 +81086 -1.000000 +81087 -1.000000 +81088 -1.000000 +81089 -1.000000 +81090 -1.000000 +81091 -1.000000 +81092 -1.000000 +81093 -1.000000 +81094 -1.000000 +81095 -1.000000 +81096 -1.000000 +81097 -1.000000 +81098 -1.000000 +81099 -1.000000 +81100 -1.000000 +81101 -1.000000 +81102 -1.000000 +81103 -1.000000 +81104 -1.000000 +81105 -1.000000 +81106 -1.000000 +81107 -1.000000 +81108 -1.000000 +81109 -1.000000 +81111 -1.000000 +81112 -1.000000 +81113 -1.000000 +81114 -1.000000 +81115 -1.000000 +81116 -1.000000 +81117 -1.000000 +81118 -1.000000 +81119 -1.000000 +81120 -1.000000 +81121 -1.000000 +81122 -1.000000 +81123 -1.000000 +81124 -1.000000 +81125 -1.000000 +81126 -1.000000 +81127 -1.000000 +81128 -1.000000 +81129 -1.000000 +81130 -1.000000 +81131 -1.000000 +81132 -1.000000 +81133 -1.000000 +81134 -1.000000 +81135 -1.000000 +81136 -1.000000 +81137 -1.000000 +81138 -1.000000 +81139 -1.000000 +81140 -1.000000 +81141 -1.000000 +81142 -1.000000 +81143 -1.000000 +81144 -1.000000 +81145 -1.000000 +81146 -1.000000 +81147 -1.000000 +81148 -1.000000 +81149 -1.000000 +81150 -1.000000 +81151 -1.000000 +81152 -1.000000 +81153 -1.000000 +81154 -1.000000 +81155 -1.000000 +81156 -1.000000 +81157 -1.000000 +81158 -1.000000 +81159 -1.000000 +81160 -1.000000 +81161 -1.000000 +81162 -1.000000 +81163 -1.000000 +81164 -1.000000 +81165 -1.000000 +81166 -1.000000 +81167 -1.000000 +81168 -1.000000 +81169 -1.000000 +81170 -1.000000 +81171 -1.000000 +81172 -1.000000 +81173 -1.000000 +81174 -1.000000 +81175 -1.000000 +81176 -1.000000 +81177 -1.000000 +81178 -1.000000 +81179 -1.000000 +81180 -1.000000 +81181 -1.000000 +81182 -1.000000 +81183 -1.000000 +81184 -1.000000 +81185 -1.000000 +81186 -1.000000 +81187 -1.000000 +81188 -1.000000 +81189 -1.000000 +81190 -1.000000 +81191 -1.000000 +81192 -1.000000 +81193 -1.000000 +81194 -1.000000 +81195 -1.000000 +81196 -1.000000 +81197 -1.000000 +81198 -1.000000 +81199 -1.000000 +81200 -1.000000 +81201 -1.000000 +81202 -1.000000 +81203 -1.000000 +81204 -1.000000 +81205 -1.000000 +81206 -1.000000 +81207 -1.000000 +81208 -1.000000 +81209 -1.000000 +81210 -1.000000 +81211 -1.000000 +81212 -1.000000 +81213 -1.000000 +81214 -1.000000 +81215 -1.000000 +81216 -1.000000 +81217 -1.000000 +81218 -1.000000 +81219 -1.000000 +81220 -1.000000 +81221 -1.000000 +81222 -1.000000 +81223 -1.000000 +81224 -1.000000 +81225 -1.000000 +81226 -1.000000 +81227 -1.000000 +81228 -1.000000 +81229 -1.000000 +81230 -1.000000 +81233 -1.000000 +81234 -1.000000 +81235 -1.000000 +81236 -1.000000 +81237 -1.000000 +81238 -1.000000 +81239 -1.000000 +81240 -1.000000 +81241 -1.000000 +81242 -1.000000 +81243 -1.000000 +81244 -1.000000 +81245 -1.000000 +81246 -1.000000 +81247 -1.000000 +81248 -1.000000 +81249 -1.000000 +81250 -1.000000 +81251 -1.000000 +81252 -1.000000 +81253 -1.000000 +81254 -1.000000 +81255 -1.000000 +81256 -1.000000 +81257 -1.000000 +81258 -1.000000 +81259 -1.000000 +81260 -1.000000 +81261 -1.000000 +81262 -1.000000 +81263 -1.000000 +81264 -1.000000 +81265 -1.000000 +81266 -1.000000 +81267 -1.000000 +81268 -1.000000 +81269 -1.000000 +81270 -1.000000 +81271 -1.000000 +81272 -1.000000 +81273 -1.000000 +81274 -1.000000 +81275 -1.000000 +81276 -1.000000 +81277 -1.000000 +81278 -1.000000 +81279 -1.000000 +81280 -1.000000 +81281 -1.000000 +81282 -1.000000 +81283 -1.000000 +81284 -1.000000 +81285 -1.000000 +81286 -1.000000 +81287 -1.000000 +81288 -1.000000 +81289 -1.000000 +81290 -1.000000 +81291 -1.000000 +81292 -1.000000 +81293 -1.000000 +81294 -1.000000 +81295 -1.000000 +81296 -1.000000 +81297 -1.000000 +81298 -1.000000 +81299 -1.000000 +81300 -1.000000 +81301 -1.000000 +81302 -1.000000 +81303 -1.000000 +81304 -1.000000 +81305 -1.000000 +81306 -1.000000 +81307 -1.000000 +81308 -1.000000 +81309 -1.000000 +81310 -1.000000 +81311 -1.000000 +81312 -1.000000 +81313 -1.000000 +81314 -1.000000 +81315 -1.000000 +81316 -1.000000 +81317 -1.000000 +81318 -1.000000 +81319 -1.000000 +81320 -1.000000 +81321 -1.000000 +81322 -1.000000 +81323 -1.000000 +81324 -1.000000 +81325 -1.000000 +81326 -1.000000 +81327 -1.000000 +81328 -1.000000 +81329 -1.000000 +81330 -1.000000 +81331 -1.000000 +81332 -1.000000 +81333 -1.000000 +81334 -1.000000 +81335 -1.000000 +81336 -1.000000 +81337 -1.000000 +81338 -1.000000 +81339 -1.000000 +81340 -1.000000 +81341 -1.000000 +81342 -1.000000 +81343 -1.000000 +81344 -1.000000 +81345 -1.000000 +81346 -1.000000 +81347 -1.000000 +81348 -1.000000 +81349 -1.000000 +81350 -1.000000 +81351 -1.000000 +81352 -1.000000 +81353 -1.000000 +81354 -1.000000 +81355 -1.000000 +81356 -1.000000 +81357 -1.000000 +81358 -1.000000 +81359 -1.000000 +81360 -1.000000 +81361 -1.000000 +81362 -1.000000 +81363 -1.000000 +81364 -1.000000 +81365 -1.000000 +81366 -1.000000 +81367 -1.000000 +81368 -1.000000 +81369 -1.000000 +81370 -1.000000 +81371 -1.000000 +81372 -1.000000 +81373 -1.000000 +81374 -1.000000 +81375 -1.000000 +81376 -1.000000 +81377 -1.000000 +81378 -1.000000 +81379 -1.000000 +81380 -1.000000 +81381 -1.000000 +81382 -1.000000 +81383 -1.000000 +81384 -1.000000 +81385 -1.000000 +81386 -1.000000 +81387 -1.000000 +81388 -1.000000 +81389 -1.000000 +81390 -1.000000 +81391 -1.000000 +81392 -1.000000 +81393 -1.000000 +81394 -1.000000 +81395 -1.000000 +81396 -1.000000 +81397 -1.000000 +81398 -1.000000 +81399 -1.000000 +81400 -1.000000 +81401 -1.000000 +81402 -1.000000 +81403 -1.000000 +81404 -1.000000 +81405 -1.000000 +81406 -1.000000 +81407 -1.000000 +81408 -1.000000 +81409 -1.000000 +81410 -1.000000 +81411 -1.000000 +81412 -1.000000 +81413 -1.000000 +81414 -1.000000 +81415 -1.000000 +81416 -1.000000 +81417 -1.000000 +81418 -1.000000 +81419 -1.000000 +81420 -1.000000 +81421 -1.000000 +81422 -1.000000 +81423 -1.000000 +81424 -1.000000 +81425 -1.000000 +81426 -1.000000 +81427 -1.000000 +81428 -1.000000 +81429 -1.000000 +81430 -1.000000 +81431 -1.000000 +81432 -1.000000 +81433 -1.000000 +81434 -1.000000 +81435 -1.000000 +81436 -1.000000 +81437 -1.000000 +81438 -1.000000 +81439 -1.000000 +81440 -1.000000 +81441 -1.000000 +81442 -1.000000 +81443 -1.000000 +81444 -1.000000 +81445 -1.000000 +81446 -1.000000 +81447 -1.000000 +81448 -1.000000 +81449 -1.000000 +81450 -1.000000 +81451 -1.000000 +81452 -1.000000 +81453 -1.000000 +81454 -1.000000 +81455 -1.000000 +81456 -1.000000 +81457 -1.000000 +81458 -1.000000 +81459 -1.000000 +81460 -1.000000 +81461 -1.000000 +81462 -1.000000 +81463 -1.000000 +81464 -1.000000 +81465 -1.000000 +81466 -1.000000 +81467 -1.000000 +81468 -1.000000 +81469 -1.000000 +81470 -1.000000 +81471 -1.000000 +81472 -1.000000 +81473 -1.000000 +81474 -1.000000 +81475 -1.000000 +81476 -1.000000 +81477 -1.000000 +81478 -1.000000 +81479 -1.000000 +81480 -1.000000 +81481 -1.000000 +81482 -1.000000 +81483 -1.000000 +81484 -1.000000 +81485 -1.000000 +81486 -1.000000 +81487 -1.000000 +81488 -1.000000 +81489 -1.000000 +81490 -1.000000 +81491 -1.000000 +81492 -1.000000 +81493 -1.000000 +81494 -1.000000 +81495 -1.000000 +81496 -1.000000 +81497 -1.000000 +81498 -1.000000 +81499 -1.000000 +81500 -1.000000 +81501 -1.000000 +81502 -1.000000 +81503 -1.000000 +81504 -1.000000 +81505 -1.000000 +81506 -1.000000 +81507 -1.000000 +81508 -1.000000 +81509 -1.000000 +81510 -1.000000 +81511 -1.000000 +81512 -1.000000 +81513 -1.000000 +81514 -1.000000 +81515 -1.000000 +81516 -1.000000 +81517 -1.000000 +81518 -1.000000 +81519 -1.000000 +81520 -1.000000 +81521 -1.000000 +81522 -1.000000 +81523 -1.000000 +81524 -1.000000 +81525 -1.000000 +81526 -1.000000 +81527 -1.000000 +81528 -1.000000 +81529 -1.000000 +81530 -1.000000 +81531 -1.000000 +81532 -1.000000 +81533 -1.000000 +81534 -1.000000 +81535 -1.000000 +81536 -1.000000 +81537 -1.000000 +81538 -1.000000 +81539 -1.000000 +81540 -1.000000 +81541 -1.000000 +81542 -1.000000 +81543 -1.000000 +81544 -1.000000 +81545 -1.000000 +81546 -1.000000 +81547 -1.000000 +81548 -1.000000 +81549 -1.000000 +81550 -1.000000 +81551 -1.000000 +81552 -1.000000 +81553 -1.000000 +81554 -1.000000 +81555 -1.000000 +81556 -1.000000 +81557 -1.000000 +81558 -1.000000 +81559 -1.000000 +81560 -1.000000 +81561 -1.000000 +81562 -1.000000 +81563 -1.000000 +81564 -1.000000 +81565 -1.000000 +81566 -1.000000 +81567 -1.000000 +81568 -1.000000 +81569 -1.000000 +81570 -1.000000 +81571 -1.000000 +81572 -1.000000 +81573 -1.000000 +81574 -1.000000 +81575 -1.000000 +81576 -1.000000 +81577 -1.000000 +81578 -1.000000 +81579 -1.000000 +81580 -1.000000 +81581 -1.000000 +81582 -1.000000 +81583 -1.000000 +81584 -1.000000 +81585 -1.000000 +81586 -1.000000 +81587 -1.000000 +81588 -1.000000 +81589 -1.000000 +81590 -1.000000 +81591 -1.000000 +81592 -1.000000 +81593 -1.000000 +81594 -1.000000 +81595 -1.000000 +81596 -1.000000 +81597 -1.000000 +81598 -1.000000 +81599 -1.000000 +81600 -1.000000 +81601 -1.000000 +81602 -1.000000 +81603 -1.000000 +81604 -1.000000 +81605 -1.000000 +81606 -1.000000 +81607 -1.000000 +81608 -1.000000 +81609 -1.000000 +81610 -1.000000 +81611 -1.000000 +81612 -1.000000 +81613 -1.000000 +81614 -1.000000 +81615 -1.000000 +81617 -1.000000 +81618 -1.000000 +81619 -1.000000 +81620 -1.000000 +81621 -1.000000 +81622 -1.000000 +81623 -1.000000 +81624 -1.000000 +81625 -1.000000 +81626 -1.000000 +81627 -1.000000 +81628 -1.000000 +81630 -1.000000 +81631 -1.000000 +81632 -1.000000 +81633 -1.000000 +81634 -1.000000 +81635 -1.000000 +81636 -1.000000 +81637 -1.000000 +81638 -1.000000 +81639 -1.000000 +81640 -1.000000 +81641 -1.000000 +81642 -1.000000 +81643 -1.000000 +81644 -1.000000 +81656 -1.000000 +81657 -1.000000 +81658 -1.000000 +81659 -1.000000 +81660 -1.000000 +81661 -1.000000 +81664 -1.000000 +81666 -1.000000 +81667 -1.000000 +81668 -1.000000 +81669 -1.000000 +81670 -1.000000 +81671 -1.000000 +81672 -1.000000 +81673 -1.000000 +81674 -1.000000 +81675 -1.000000 +81676 -1.000000 +81677 -1.000000 +81678 -1.000000 +81679 -1.000000 +81680 -1.000000 +81681 -1.000000 +81682 -1.000000 +81683 -1.000000 +81685 -1.000000 +81687 -1.000000 +81688 -1.000000 +81689 -1.000000 +81690 -1.000000 +81691 -1.000000 +81692 -1.000000 +81693 -1.000000 +81695 -1.000000 +81696 -1.000000 +81697 -1.000000 +81698 -1.000000 +81699 -1.000000 +81700 -1.000000 +81701 -1.000000 +81702 -1.000000 +81703 -1.000000 +81704 -1.000000 +81705 -1.000000 +81706 -1.000000 +81707 -1.000000 +81708 -1.000000 +81709 -1.000000 +81710 -1.000000 +81711 -1.000000 +81712 -1.000000 +81713 -1.000000 +81714 -1.000000 +81715 -1.000000 +81716 -1.000000 +81717 -1.000000 +81718 -1.000000 +81719 -1.000000 +81720 -1.000000 +81721 -1.000000 +81722 -1.000000 +81723 -1.000000 +81724 -1.000000 +81725 -1.000000 +81726 -1.000000 +81727 -1.000000 +81728 -1.000000 +81729 -1.000000 +81730 -1.000000 +81731 -1.000000 +81732 -1.000000 +81733 -1.000000 +81734 -1.000000 +81735 -1.000000 +81736 -1.000000 +81737 -1.000000 +81738 -1.000000 +81739 -1.000000 +81740 -1.000000 +81741 -1.000000 +81742 -1.000000 +81743 -1.000000 +81744 -1.000000 +81745 -1.000000 +81746 -1.000000 +81748 -1.000000 +81749 -1.000000 +81750 -1.000000 +81751 -1.000000 +81752 -1.000000 +81753 -1.000000 +81755 -1.000000 +81756 -1.000000 +81757 -1.000000 +81758 -1.000000 +81759 -1.000000 +81760 -1.000000 +81761 -1.000000 +81762 -1.000000 +81763 -1.000000 +81764 -1.000000 +81765 -1.000000 +81766 -1.000000 +81767 -1.000000 +81768 -1.000000 +81770 -1.000000 +81771 -1.000000 +81772 -1.000000 +81773 -1.000000 +81774 -1.000000 +81775 -1.000000 +81776 -1.000000 +81777 -1.000000 +81778 -1.000000 +81779 -1.000000 +81780 -1.000000 +81781 -1.000000 +81782 -1.000000 +81783 -1.000000 +81784 -1.000000 +81785 -1.000000 +81786 -1.000000 +81787 -1.000000 +81788 -1.000000 +81789 -1.000000 +81790 -1.000000 +81791 -1.000000 +81792 -1.000000 +81793 -1.000000 +81794 -1.000000 +81795 -1.000000 +81796 -1.000000 +81797 -1.000000 +81798 -1.000000 +81799 -1.000000 +81800 -1.000000 +81801 -1.000000 +81802 -1.000000 +81803 -1.000000 +81804 -1.000000 +81805 -1.000000 +81806 -1.000000 +81807 -1.000000 +81808 -1.000000 +81809 -1.000000 +81810 -1.000000 +81811 -1.000000 +81812 -1.000000 +81813 -1.000000 +81814 -1.000000 +81815 -1.000000 +81816 -1.000000 +81817 -1.000000 +81818 -1.000000 +81819 -1.000000 +81820 -1.000000 +81821 -1.000000 +81822 -1.000000 +81823 -1.000000 +81824 -1.000000 +81825 -1.000000 +81826 -1.000000 +81827 -1.000000 +81828 -1.000000 +81829 -1.000000 +81830 -1.000000 +81831 -1.000000 +81832 -1.000000 +81833 -1.000000 +81834 -1.000000 +81835 -1.000000 +81836 -1.000000 +81837 -1.000000 +81838 -1.000000 +81839 -1.000000 +81840 -1.000000 +81841 -1.000000 +81842 -1.000000 +81843 -1.000000 +81844 -1.000000 +81845 -1.000000 +81846 -1.000000 +81847 -1.000000 +81848 -1.000000 +81849 -1.000000 +81850 -1.000000 +81851 -1.000000 +81852 -1.000000 +81853 -1.000000 +81854 -1.000000 +81855 -1.000000 +81856 -1.000000 +81857 -1.000000 +81858 -1.000000 +81859 -1.000000 +81860 -1.000000 +81861 -1.000000 +81862 -1.000000 +81863 -1.000000 +81864 -1.000000 +81865 -1.000000 +81866 -1.000000 +81867 -1.000000 +81868 -1.000000 +81869 -1.000000 +81870 -1.000000 +81871 -1.000000 +81872 -1.000000 +81873 -1.000000 +81874 -1.000000 +81875 -1.000000 +81876 -1.000000 +81877 -1.000000 +81878 -1.000000 +81879 -1.000000 +81880 -1.000000 +81881 -1.000000 +81882 -1.000000 +81883 -1.000000 +81884 -1.000000 +81885 -1.000000 +81886 -1.000000 +81887 -1.000000 +81888 -1.000000 +81889 -1.000000 +81890 -1.000000 +81891 -1.000000 +81905 -1.000000 +81909 -1.000000 +81910 -1.000000 +81911 -1.000000 +81912 -1.000000 +81913 -1.000000 +81914 -1.000000 +81915 -1.000000 +81916 -1.000000 +81917 -1.000000 +81918 -1.000000 +81919 -1.000000 +81920 -1.000000 +81921 -1.000000 +81922 -1.000000 +81923 -1.000000 +81924 -1.000000 +81925 -1.000000 +81926 -1.000000 +81927 -1.000000 +81928 -1.000000 +81929 -1.000000 +81930 -1.000000 +81931 -1.000000 +81932 -1.000000 +81933 -1.000000 +81935 -1.000000 +81936 -1.000000 +81937 -1.000000 +81938 -1.000000 +81939 -1.000000 +81940 -1.000000 +81941 -1.000000 +81942 -1.000000 +81943 -1.000000 +81944 -1.000000 +81945 -1.000000 +81946 -1.000000 +81947 -1.000000 +81948 -1.000000 +81949 -1.000000 +81950 -1.000000 +81951 -1.000000 +81952 -1.000000 +81953 -1.000000 +81954 -1.000000 +81955 -1.000000 +81956 -1.000000 +81957 -1.000000 +81958 -1.000000 +81959 -1.000000 +81960 -1.000000 +81961 -1.000000 +81962 -1.000000 +81963 -1.000000 +81964 -1.000000 +81965 -1.000000 +81966 -1.000000 +81967 -1.000000 +81968 -1.000000 +81969 -1.000000 +81970 -1.000000 +81971 -1.000000 +81972 -1.000000 +81973 -1.000000 +81974 -1.000000 +81975 -1.000000 +81978 -1.000000 +81979 -1.000000 +81980 -1.000000 +81981 -1.000000 +81982 -1.000000 +81983 -1.000000 +81984 -1.000000 +81986 -1.000000 +81987 -1.000000 +81988 -1.000000 +81989 -1.000000 +81990 -1.000000 +81991 -1.000000 +81992 -1.000000 +81993 -1.000000 +81994 -1.000000 +81995 -1.000000 +81996 -1.000000 +81997 -1.000000 +81998 -1.000000 +81999 -1.000000 +82000 -1.000000 +82001 -1.000000 +82002 -1.000000 +82003 -1.000000 +82004 -1.000000 +82005 -1.000000 +82006 -1.000000 +82007 -1.000000 +82008 -1.000000 +82009 -1.000000 +82010 -1.000000 +82011 -1.000000 +82012 -1.000000 +82013 -1.000000 +82014 -1.000000 +82015 -1.000000 +82016 -1.000000 +82017 -1.000000 +82018 -1.000000 +82019 -1.000000 +82020 -1.000000 +82021 -1.000000 +82022 -1.000000 +82023 -1.000000 +82024 -1.000000 +82025 -1.000000 +82026 -1.000000 +82027 -1.000000 +82028 -1.000000 +82029 -1.000000 +82030 -1.000000 +82031 -1.000000 +82032 -1.000000 +82033 -1.000000 +82034 -1.000000 +82035 -1.000000 +82036 -1.000000 +82037 -1.000000 +82038 -1.000000 +82039 -1.000000 +82040 -1.000000 +82041 -1.000000 +82042 -1.000000 +82043 -1.000000 +82044 -1.000000 +82045 -1.000000 +82046 -1.000000 +82047 -1.000000 +82048 -1.000000 +82049 -1.000000 +82050 -1.000000 +82051 -1.000000 +82052 -1.000000 +82053 -1.000000 +82054 -1.000000 +82055 -1.000000 +82056 -1.000000 +82057 -1.000000 +82058 -1.000000 +82059 -1.000000 +82060 -1.000000 +82061 -1.000000 +82062 -1.000000 +82063 -1.000000 +82064 -1.000000 +82065 -1.000000 +82066 -1.000000 +82067 -1.000000 +82068 -1.000000 +82069 -1.000000 +82070 -1.000000 +82071 -1.000000 +82072 -1.000000 +82073 -1.000000 +82074 -1.000000 +82075 -1.000000 +82076 -1.000000 +82077 -1.000000 +82078 -1.000000 +82079 -1.000000 +82080 -1.000000 +82081 -1.000000 +82082 -1.000000 +82083 -1.000000 +82084 -1.000000 +82085 -1.000000 +82086 -1.000000 +82087 -1.000000 +82088 -1.000000 +82089 -1.000000 +82090 -1.000000 +82091 -1.000000 +82092 -1.000000 +82093 -1.000000 +82094 -1.000000 +82095 -1.000000 +82096 -1.000000 +82097 -1.000000 +82098 -1.000000 +82099 -1.000000 +82100 -1.000000 +82101 -1.000000 +82102 -1.000000 +82103 -1.000000 +82104 -1.000000 +82105 -1.000000 +82106 -1.000000 +82107 -1.000000 +82108 -1.000000 +82109 -1.000000 +82110 -1.000000 +82111 -1.000000 +82112 -1.000000 +82113 -1.000000 +82114 -1.000000 +82115 -1.000000 +82116 -1.000000 +82117 -1.000000 +82118 -1.000000 +82119 -1.000000 +82120 -1.000000 +82121 -1.000000 +82122 -1.000000 +82123 -1.000000 +82124 -1.000000 +82125 -1.000000 +82126 -1.000000 +82127 -1.000000 +82128 -1.000000 +82129 -1.000000 +82130 -1.000000 +82131 -1.000000 +82132 -1.000000 +82133 -1.000000 +82134 -1.000000 +82135 -1.000000 +82136 -1.000000 +82137 -1.000000 +82138 -1.000000 +82139 -1.000000 +82140 -1.000000 +82141 -1.000000 +82142 -1.000000 +82143 -1.000000 +82144 -1.000000 +82145 -1.000000 +82146 -1.000000 +82147 -1.000000 +82148 -1.000000 +82149 -1.000000 +82150 -1.000000 +82151 -1.000000 +82152 -1.000000 +82153 -1.000000 +82154 -1.000000 +82155 -1.000000 +82156 -1.000000 +82157 -1.000000 +82158 -1.000000 +82159 -1.000000 +82160 -1.000000 +82161 -1.000000 +82162 -1.000000 +82163 -1.000000 +82164 -1.000000 +82165 -1.000000 +82166 -1.000000 +82167 -1.000000 +82168 -1.000000 +82169 -1.000000 +82170 -1.000000 +82171 -1.000000 +82172 -1.000000 +82173 -1.000000 +82174 -1.000000 +82175 -1.000000 +82176 -1.000000 +82177 -1.000000 +82178 -1.000000 +82179 -1.000000 +82180 -1.000000 +82181 -1.000000 +82182 -1.000000 +82183 -1.000000 +82184 -1.000000 +82185 -1.000000 +82186 -1.000000 +82187 -1.000000 +82188 -1.000000 +82189 -1.000000 +82190 -1.000000 +82191 -1.000000 +82192 -1.000000 +82193 -1.000000 +82194 -1.000000 +82195 -1.000000 +82196 -1.000000 +82197 -1.000000 +82198 -1.000000 +82199 -1.000000 +82200 -1.000000 +82201 -1.000000 +82202 -1.000000 +82203 -1.000000 +82204 -1.000000 +82205 -1.000000 +82206 -1.000000 +82207 -1.000000 +82208 -1.000000 +82209 -1.000000 +82210 -1.000000 +82211 -1.000000 +82212 -1.000000 +82213 -1.000000 +82214 -1.000000 +82215 -1.000000 +82216 -1.000000 +82217 -1.000000 +82218 -1.000000 +82219 -1.000000 +82220 -1.000000 +82221 -1.000000 +82222 -1.000000 +82223 -1.000000 +82224 -1.000000 +82225 -1.000000 +82226 -1.000000 +82227 -1.000000 +82228 -1.000000 +82229 -1.000000 +82230 -1.000000 +82231 -1.000000 +82232 -1.000000 +82233 -1.000000 +82234 -1.000000 +82235 -1.000000 +82236 -1.000000 +82237 -1.000000 +82238 -1.000000 +82239 -1.000000 +82240 -1.000000 +82241 -1.000000 +82242 -1.000000 +82243 -1.000000 +82244 -1.000000 +82245 -1.000000 +82246 -1.000000 +82247 -1.000000 +82248 -1.000000 +82249 -1.000000 +82250 -1.000000 +82251 -1.000000 +82252 -1.000000 +82253 -1.000000 +82254 -1.000000 +82255 -1.000000 +82256 -1.000000 +82257 -1.000000 +82258 -1.000000 +82259 -1.000000 +82260 -1.000000 +82261 -1.000000 +82262 -1.000000 +82263 -1.000000 +82264 -1.000000 +82265 -1.000000 +82266 -1.000000 +82267 -1.000000 +82268 -1.000000 +82269 -1.000000 +82270 -1.000000 +82271 -1.000000 +82272 -1.000000 +82273 -1.000000 +82274 -1.000000 +82275 -1.000000 +82276 -1.000000 +82277 -1.000000 +82278 -1.000000 +82279 -1.000000 +82280 -1.000000 +82281 -1.000000 +82282 -1.000000 +82283 -1.000000 +82284 -1.000000 +82285 -1.000000 +82286 -1.000000 +82287 -1.000000 +82288 -1.000000 +82289 -1.000000 +82290 -1.000000 +82291 -1.000000 +82292 -1.000000 +82293 -1.000000 +82294 -1.000000 +82295 -1.000000 +82296 -1.000000 +82297 -1.000000 +82298 -1.000000 +82299 -1.000000 +82300 -1.000000 +82301 -1.000000 +82302 -1.000000 +82303 -1.000000 +82304 -1.000000 +82305 -1.000000 +82306 -1.000000 +82307 -1.000000 +82308 -1.000000 +82309 -1.000000 +82310 -1.000000 +82311 -1.000000 +82312 -1.000000 +82313 -1.000000 +82314 -1.000000 +82315 -1.000000 +82316 -1.000000 +82317 -1.000000 +82318 -1.000000 +82319 -1.000000 +82320 -1.000000 +82321 -1.000000 +82322 -1.000000 +82323 -1.000000 +82324 -1.000000 +82325 -1.000000 +82326 -1.000000 +82327 -1.000000 +82328 -1.000000 +82329 -1.000000 +82330 -1.000000 +82331 -1.000000 +82332 -1.000000 +82333 -1.000000 +82334 -1.000000 +82335 -1.000000 +82336 -1.000000 +82337 -1.000000 +82338 -1.000000 +82339 -1.000000 +82340 -1.000000 +82341 -1.000000 +82342 -1.000000 +82343 -1.000000 +82344 -1.000000 +82345 -1.000000 +82346 -1.000000 +82347 -1.000000 +82348 -1.000000 +82349 -1.000000 +82350 -1.000000 +82351 -1.000000 +82352 -1.000000 +82353 -1.000000 +82354 -1.000000 +82358 -1.000000 +82359 -1.000000 +82360 -1.000000 +82361 -1.000000 +82362 -1.000000 +82363 -1.000000 +82364 -1.000000 +82365 -1.000000 +82366 -1.000000 +82367 -1.000000 +82368 -1.000000 +82369 -1.000000 +82370 -1.000000 +82371 -1.000000 +82372 -1.000000 +82373 -1.000000 +82374 -1.000000 +82375 -1.000000 +82376 -1.000000 +82377 -1.000000 +82378 -1.000000 +82379 -1.000000 +82380 -1.000000 +82381 -1.000000 +82382 -1.000000 +82383 -1.000000 +82384 -1.000000 +82385 -1.000000 +82386 -1.000000 +82387 -1.000000 +82388 -1.000000 +82389 -1.000000 +82390 -1.000000 +82391 -1.000000 +82392 -1.000000 +82393 -1.000000 +82394 -1.000000 +82395 -1.000000 +82396 -1.000000 +82397 -1.000000 +82398 -1.000000 +82399 -1.000000 +82400 -1.000000 +82401 -1.000000 +82402 -1.000000 +82403 -1.000000 +82404 -1.000000 +82405 -1.000000 +82406 -1.000000 +82407 -1.000000 +82408 -1.000000 +82409 -1.000000 +82410 -1.000000 +82411 -1.000000 +82412 -1.000000 +82413 -1.000000 +82414 -1.000000 +82415 -1.000000 +82416 -1.000000 +82417 -1.000000 +82418 -1.000000 +82419 -1.000000 +82420 -1.000000 +82421 -1.000000 +82422 -1.000000 +82423 -1.000000 +82424 -1.000000 +82425 -1.000000 +82426 -1.000000 +82427 -1.000000 +82428 -1.000000 +82429 -1.000000 +82430 -1.000000 +82431 -1.000000 +82432 -1.000000 +82433 -1.000000 +82434 -1.000000 +82435 -1.000000 +82436 -1.000000 +82437 -1.000000 +82438 -1.000000 +82439 -1.000000 +82440 -1.000000 +82441 -1.000000 +82442 -1.000000 +82443 -1.000000 +82444 -1.000000 +82445 -1.000000 +82446 -1.000000 +82447 -1.000000 +82448 -1.000000 +82449 -1.000000 +82450 -1.000000 +82451 -1.000000 +82452 -1.000000 +82453 -1.000000 +82454 -1.000000 +82455 -1.000000 +82456 -1.000000 +82457 -1.000000 +82458 -1.000000 +82459 -1.000000 +82460 -1.000000 +82461 -1.000000 +82462 -1.000000 +82463 -1.000000 +82464 -1.000000 +82465 -1.000000 +82466 -1.000000 +82467 -1.000000 +82468 -1.000000 +82469 -1.000000 +82470 -1.000000 +82471 -1.000000 +82472 -1.000000 +82473 -1.000000 +82474 -1.000000 +82475 -1.000000 +82476 -1.000000 +82477 -1.000000 +82478 -1.000000 +82479 -1.000000 +82480 -1.000000 +82481 -1.000000 +82482 -1.000000 +82483 -1.000000 +82484 -1.000000 +82485 -1.000000 +82486 -1.000000 +82487 -1.000000 +82488 -1.000000 +82489 -1.000000 +82490 -1.000000 +82491 -1.000000 +82492 -1.000000 +82493 -1.000000 +82494 -1.000000 +82495 -1.000000 +82496 -1.000000 +82497 -1.000000 +82498 -1.000000 +82499 -1.000000 +82500 -1.000000 +82501 -1.000000 +82502 -1.000000 +82503 -1.000000 +82504 -1.000000 +82505 -1.000000 +82506 -1.000000 +82507 -1.000000 +82508 -1.000000 +82509 -1.000000 +82510 -1.000000 +82511 -1.000000 +82512 -1.000000 +82513 -1.000000 +82514 -1.000000 +82515 -1.000000 +82516 -1.000000 +82517 -1.000000 +82518 -1.000000 +82519 -1.000000 +82520 -1.000000 +82521 -1.000000 +82522 -1.000000 +82523 -1.000000 +82524 -1.000000 +82525 -1.000000 +82526 -1.000000 +82527 -1.000000 +82528 -1.000000 +82529 -1.000000 +82530 -1.000000 +82531 -1.000000 +82532 -1.000000 +82533 -1.000000 +82534 -1.000000 +82535 -1.000000 +82536 -1.000000 +82537 -1.000000 +82538 -1.000000 +82539 -1.000000 +82540 -1.000000 +82541 -1.000000 +82542 -1.000000 +82543 -1.000000 +82544 -1.000000 +82545 -1.000000 +82546 -1.000000 +82547 -1.000000 +82548 -1.000000 +82549 -1.000000 +82550 -1.000000 +82551 -1.000000 +82552 -1.000000 +82553 -1.000000 +82554 -1.000000 +82555 -1.000000 +82556 -1.000000 +82557 -1.000000 +82558 -1.000000 +82559 -1.000000 +82560 -1.000000 +82561 -1.000000 +82562 -1.000000 +82563 -1.000000 +82565 -1.000000 +82566 -1.000000 +82567 -1.000000 +82568 -1.000000 +82569 -1.000000 +82570 -1.000000 +82571 -1.000000 +82572 -1.000000 +82573 -1.000000 +82574 -1.000000 +82575 -1.000000 +82576 -1.000000 +82577 -1.000000 +82578 -1.000000 +82579 -1.000000 +82580 -1.000000 +82581 -1.000000 +82582 -1.000000 +82583 -1.000000 +82584 -1.000000 +82585 -1.000000 +82586 -1.000000 +82587 -1.000000 +82588 -1.000000 +82589 -1.000000 +82590 -1.000000 +82591 -1.000000 +82592 -1.000000 +82593 -1.000000 +82594 -1.000000 +82595 -1.000000 +82596 -1.000000 +82597 -1.000000 +82598 -1.000000 +82599 -1.000000 +82600 -1.000000 +82601 -1.000000 +82602 -1.000000 +82603 -1.000000 +82604 -1.000000 +82605 -1.000000 +82606 -1.000000 +82607 -1.000000 +82608 -1.000000 +82609 -1.000000 +82610 -1.000000 +82611 -1.000000 +82612 -1.000000 +82613 -1.000000 +82614 -1.000000 +82615 -1.000000 +82616 -1.000000 +82617 -1.000000 +82618 -1.000000 +82619 -1.000000 +82620 -1.000000 +82621 -1.000000 +82622 -1.000000 +82623 -1.000000 +82624 -1.000000 +82625 -1.000000 +82626 -1.000000 +82627 -1.000000 +82629 -1.000000 +82630 -1.000000 +82631 -1.000000 +82632 -1.000000 +82633 -1.000000 +82634 -1.000000 +82635 -1.000000 +82636 -1.000000 +82637 -1.000000 +82638 -1.000000 +82639 -1.000000 +82640 -1.000000 +82641 -1.000000 +82646 -1.000000 +82648 -1.000000 +82649 -1.000000 +82650 -1.000000 +82651 -1.000000 +82652 -1.000000 +82653 -1.000000 +82654 -1.000000 +82655 -1.000000 +82656 -1.000000 +82657 -1.000000 +82658 -1.000000 +82659 -1.000000 +82660 -1.000000 +82661 -1.000000 +82662 -1.000000 +82663 -1.000000 +82664 -1.000000 +82665 -1.000000 +82666 -1.000000 +82667 -1.000000 +82668 -1.000000 +82669 -1.000000 +82670 -1.000000 +82671 -1.000000 +82672 -1.000000 +82673 -1.000000 +82674 -1.000000 +82675 -1.000000 +82676 -1.000000 +82677 -1.000000 +82678 -1.000000 +82679 -1.000000 +82680 -1.000000 +82681 -1.000000 +82682 -1.000000 +82683 -1.000000 +82684 -1.000000 +82685 -1.000000 +82686 -1.000000 +82687 -1.000000 +82688 -1.000000 +82689 -1.000000 +82690 -1.000000 +82691 -1.000000 +82692 -1.000000 +82693 -1.000000 +82694 -1.000000 +82695 -1.000000 +82696 -1.000000 +82697 -1.000000 +82698 -1.000000 +82699 -1.000000 +82700 -1.000000 +82701 -1.000000 +82702 -1.000000 +82703 -1.000000 +82704 -1.000000 +82705 -1.000000 +82706 -1.000000 +82707 -1.000000 +82708 -1.000000 +82709 -1.000000 +82710 -1.000000 +82711 -1.000000 +82712 -1.000000 +82713 -1.000000 +82714 -1.000000 +82715 -1.000000 +82716 -1.000000 +82717 -1.000000 +82718 -1.000000 +82719 -1.000000 +82720 -1.000000 +82721 -1.000000 +82722 -1.000000 +82723 -1.000000 +82724 -1.000000 +82725 -1.000000 +82726 -1.000000 +82727 -1.000000 +82728 -1.000000 +82729 -1.000000 +82730 -1.000000 +82731 -1.000000 +82732 -1.000000 +82733 -1.000000 +82734 -1.000000 +82735 -1.000000 +82736 -1.000000 +82737 -1.000000 +82738 -1.000000 +82739 -1.000000 +82740 -1.000000 +82741 -1.000000 +82742 -1.000000 +82743 -1.000000 +82744 -1.000000 +82745 -1.000000 +82746 -1.000000 +82747 -1.000000 +82748 -1.000000 +82749 -1.000000 +82750 -1.000000 +82751 -1.000000 +82752 -1.000000 +82753 -1.000000 +82759 -1.000000 +82760 -1.000000 +82761 -1.000000 +82763 -1.000000 +82764 -1.000000 +82765 -1.000000 +82766 -1.000000 +82767 -1.000000 +82768 -1.000000 +82769 -1.000000 +82770 -1.000000 +82771 -1.000000 +82772 -1.000000 +82773 -1.000000 +82774 -1.000000 +82775 -1.000000 +82776 -1.000000 +82777 -1.000000 +82778 -1.000000 +82779 -1.000000 +82780 -1.000000 +82781 -1.000000 +82782 -1.000000 +82783 -1.000000 +82784 -1.000000 +82785 -1.000000 +82786 -1.000000 +82787 -1.000000 +82788 -1.000000 +82789 -1.000000 +82790 -1.000000 +82791 -1.000000 +82792 -1.000000 +82793 -1.000000 +82794 -1.000000 +82795 -1.000000 +82796 -1.000000 +82797 -1.000000 +82798 -1.000000 +82799 -1.000000 +82800 -1.000000 +82801 -1.000000 +82802 -1.000000 +82803 -1.000000 +82804 -1.000000 +82805 -1.000000 +82806 -1.000000 +82807 -1.000000 +82808 -1.000000 +82809 -1.000000 +82810 -1.000000 +82811 -1.000000 +82812 -1.000000 +82813 -1.000000 +82814 -1.000000 +82815 -1.000000 +82816 -1.000000 +82817 -1.000000 +82818 -1.000000 +82819 -1.000000 +82820 -1.000000 +82821 -1.000000 +82822 -1.000000 +82823 -1.000000 +82824 -1.000000 +82825 -1.000000 +82826 -1.000000 +82827 -1.000000 +82828 -1.000000 +82829 -1.000000 +82830 -1.000000 +82831 -1.000000 +82832 -1.000000 +82833 -1.000000 +82834 -1.000000 +82835 -1.000000 +82836 -1.000000 +82837 -1.000000 +82838 -1.000000 +82839 -1.000000 +82840 -1.000000 +82841 -1.000000 +82842 -1.000000 +82843 -1.000000 +82844 -1.000000 +82845 -1.000000 +82846 -1.000000 +82847 -1.000000 +82848 -1.000000 +82849 -1.000000 +82850 -1.000000 +82851 -1.000000 +82852 -1.000000 +82853 -1.000000 +82854 -1.000000 +82855 -1.000000 +82856 -1.000000 +82857 -1.000000 +82858 -1.000000 +82859 -1.000000 +82860 -1.000000 +82861 -1.000000 +82862 -1.000000 +82863 -1.000000 +82864 -1.000000 +82865 -1.000000 +82866 -1.000000 +82867 -1.000000 +82868 -1.000000 +82869 -1.000000 +82870 -1.000000 +82871 -1.000000 +82872 -1.000000 +82873 -1.000000 +82874 -1.000000 +82875 -1.000000 +82876 -1.000000 +82877 -1.000000 +82878 -1.000000 +82879 -1.000000 +82880 -1.000000 +82881 -1.000000 +82882 -1.000000 +82883 -1.000000 +82884 -1.000000 +82885 -1.000000 +82886 -1.000000 +82887 -1.000000 +82888 -1.000000 +82889 -1.000000 +82890 -1.000000 +82891 -1.000000 +82892 -1.000000 +82893 -1.000000 +82894 -1.000000 +82895 -1.000000 +82896 -1.000000 +82897 -1.000000 +82898 -1.000000 +82899 -1.000000 +82900 -1.000000 +82901 -1.000000 +82902 -1.000000 +82903 -1.000000 +82904 -1.000000 +82905 -1.000000 +82906 -1.000000 +82907 -1.000000 +82908 -1.000000 +82909 -1.000000 +82910 -1.000000 +82911 -1.000000 +82912 -1.000000 +82913 -1.000000 +82914 -1.000000 +82915 -1.000000 +82916 -1.000000 +82917 -1.000000 +82918 -1.000000 +82919 -1.000000 +82920 -1.000000 +82921 -1.000000 +82922 -1.000000 +82923 -1.000000 +82924 -1.000000 +82925 -1.000000 +82926 -1.000000 +82927 -1.000000 +82928 -1.000000 +82929 -1.000000 +82930 -1.000000 +82931 -1.000000 +82932 -1.000000 +82933 -1.000000 +82934 -1.000000 +82935 -1.000000 +82936 -1.000000 +82937 -1.000000 +82938 -1.000000 +82939 -1.000000 +82940 -1.000000 +82941 -1.000000 +82942 -1.000000 +82943 -1.000000 +82944 -1.000000 +82945 -1.000000 +82946 -1.000000 +82947 -1.000000 +82948 -1.000000 +82949 -1.000000 +82950 -1.000000 +82951 -1.000000 +82952 -1.000000 +82953 -1.000000 +82954 -1.000000 +82955 -1.000000 +82956 -1.000000 +82957 -1.000000 +82958 -1.000000 +82959 -1.000000 +82960 -1.000000 +82961 -1.000000 +82962 -1.000000 +82963 -1.000000 +82964 -1.000000 +82965 -1.000000 +82966 -1.000000 +82967 -1.000000 +82968 -1.000000 +82969 -1.000000 +82970 -1.000000 +82971 -1.000000 +82972 -1.000000 +82973 -1.000000 +82974 -1.000000 +82975 -1.000000 +82976 -1.000000 +82977 -1.000000 +82978 -1.000000 +82979 -1.000000 +82980 -1.000000 +82981 -1.000000 +82982 -1.000000 +82983 -1.000000 +82984 -1.000000 +82985 -1.000000 +82986 -1.000000 +82987 -1.000000 +82988 -1.000000 +82989 -1.000000 +82990 -1.000000 +82991 -1.000000 +82992 -1.000000 +82993 -1.000000 +82994 -1.000000 +82995 -1.000000 +82996 -1.000000 +82997 -1.000000 +82998 -1.000000 +82999 -1.000000 +83000 -1.000000 +83001 -1.000000 +83002 -1.000000 +83003 -1.000000 +83004 -1.000000 +83005 -1.000000 +83006 -1.000000 +83007 -1.000000 +83008 -1.000000 +83009 -1.000000 +83010 -1.000000 +83011 -1.000000 +83012 -1.000000 +83013 -1.000000 +83014 -1.000000 +83015 -1.000000 +83016 -1.000000 +83017 -1.000000 +83018 -1.000000 +83019 -1.000000 +83020 -1.000000 +83021 -1.000000 +83022 -1.000000 +83023 -1.000000 +83024 -1.000000 +83025 -1.000000 +83026 -1.000000 +83027 -1.000000 +83028 -1.000000 +83029 -1.000000 +83030 -1.000000 +83031 -1.000000 +83032 -1.000000 +83033 -1.000000 +83034 -1.000000 +83035 -1.000000 +83036 -1.000000 +83037 -1.000000 +83038 -1.000000 +83039 -1.000000 +83040 -1.000000 +83041 -1.000000 +83042 -1.000000 +83043 -1.000000 +83044 -1.000000 +83045 -1.000000 +83046 -1.000000 +83047 -1.000000 +83048 -1.000000 +83049 -1.000000 +83050 -1.000000 +83051 -1.000000 +83052 -1.000000 +83053 -1.000000 +83054 -1.000000 +83055 -1.000000 +83056 -1.000000 +83057 -1.000000 +83058 -1.000000 +83059 -1.000000 +83060 -1.000000 +83061 -1.000000 +83062 -1.000000 +83063 -1.000000 +83064 -1.000000 +83065 -1.000000 +83066 -1.000000 +83067 -1.000000 +83068 -1.000000 +83069 -1.000000 +83070 -1.000000 +83071 -1.000000 +83072 -1.000000 +83073 -1.000000 +83074 -1.000000 +83075 -1.000000 +83076 -1.000000 +83077 -1.000000 +83078 -1.000000 +83079 -1.000000 +83080 -1.000000 +83081 -1.000000 +83082 -1.000000 +83083 -1.000000 +83084 -1.000000 +83085 -1.000000 +83086 -1.000000 +83087 -1.000000 +83088 -1.000000 +83089 -1.000000 +83090 -1.000000 +83091 -1.000000 +83092 -1.000000 +83093 -1.000000 +83094 -1.000000 +83098 -1.000000 +83099 -1.000000 +83100 -1.000000 +83101 -1.000000 +83102 -1.000000 +83103 -1.000000 +83104 -1.000000 +83105 -1.000000 +83106 -1.000000 +83107 -1.000000 +83108 -1.000000 +83109 -1.000000 +83110 -1.000000 +83111 -1.000000 +83113 -1.000000 +83114 -1.000000 +83115 -1.000000 +83116 -1.000000 +83117 -1.000000 +83118 -1.000000 +83119 -1.000000 +83120 -1.000000 +83121 -1.000000 +83122 -1.000000 +83123 -1.000000 +83124 -1.000000 +83125 -1.000000 +83126 -1.000000 +83127 -1.000000 +83128 -1.000000 +83129 -1.000000 +83130 -1.000000 +83131 -1.000000 +83132 -1.000000 +83133 -1.000000 +83134 -1.000000 +83135 -1.000000 +83136 -1.000000 +83137 -1.000000 +83138 -1.000000 +83139 -1.000000 +83140 -1.000000 +83141 -1.000000 +83142 -1.000000 +83143 -1.000000 +83144 -1.000000 +83145 -1.000000 +83146 -1.000000 +83147 -1.000000 +83148 -1.000000 +83149 -1.000000 +83150 -1.000000 +83151 -1.000000 +83152 -1.000000 +83153 -1.000000 +83154 -1.000000 +83156 -1.000000 +83158 -1.000000 +83159 -1.000000 +83160 -1.000000 +83161 -1.000000 +83162 -1.000000 +83163 -1.000000 +83164 -1.000000 +83165 -1.000000 +83166 -1.000000 +83167 -1.000000 +83168 -1.000000 +83169 -1.000000 +83170 -1.000000 +83171 -1.000000 +83172 -1.000000 +83173 -1.000000 +83174 -1.000000 +83175 -1.000000 +83176 -1.000000 +83177 -1.000000 +83178 -1.000000 +83179 -1.000000 +83180 -1.000000 +83181 -1.000000 +83182 -1.000000 +83183 -1.000000 +83184 -1.000000 +83185 -1.000000 +83186 -1.000000 +83187 -1.000000 +83188 -1.000000 +83189 -1.000000 +83190 -1.000000 +83191 -1.000000 +83192 -1.000000 +83193 -1.000000 +83194 -1.000000 +83195 -1.000000 +83196 -1.000000 +83197 -1.000000 +83198 -1.000000 +83199 -1.000000 +83200 -1.000000 +83201 -1.000000 +83202 -1.000000 +83203 -1.000000 +83204 -1.000000 +83205 -1.000000 +83206 -1.000000 +83207 -1.000000 +83208 -1.000000 +83209 -1.000000 +83210 -1.000000 +83211 -1.000000 +83212 -1.000000 +83213 -1.000000 +83214 -1.000000 +83215 -1.000000 +83216 -1.000000 +83217 -1.000000 +83218 -1.000000 +83219 -1.000000 +83220 -1.000000 +83221 -1.000000 +83222 -1.000000 +83223 -1.000000 +83224 -1.000000 +83225 -1.000000 +83226 -1.000000 +83227 -1.000000 +83228 -1.000000 +83229 -1.000000 +83230 -1.000000 +83231 -1.000000 +83232 -1.000000 +83233 -1.000000 +83234 -1.000000 +83235 -1.000000 +83236 -1.000000 +83237 -1.000000 +83238 -1.000000 +83239 -1.000000 +83240 -1.000000 +83241 -1.000000 +83242 -1.000000 +83243 -1.000000 +83244 -1.000000 +83245 -1.000000 +83246 -1.000000 +83247 -1.000000 +83248 -1.000000 +83249 -1.000000 +83250 -1.000000 +83251 -1.000000 +83252 -1.000000 +83253 -1.000000 +83254 -1.000000 +83255 -1.000000 +83256 -1.000000 +83257 -1.000000 +83258 -1.000000 +83259 -1.000000 +83260 -1.000000 +83261 -1.000000 +83262 -1.000000 +83263 -1.000000 +83264 -1.000000 +83265 -1.000000 +83266 -1.000000 +83267 -1.000000 +83268 -1.000000 +83269 -1.000000 +83270 -1.000000 +83271 -1.000000 +83272 -1.000000 +83273 -1.000000 +83274 -1.000000 +83275 -1.000000 +83276 -1.000000 +83277 -1.000000 +83278 -1.000000 +83279 -1.000000 +83280 -1.000000 +83281 -1.000000 +83282 -1.000000 +83283 -1.000000 +83284 -1.000000 +83285 -1.000000 +83286 -1.000000 +83287 -1.000000 +83288 -1.000000 +83289 -1.000000 +83290 -1.000000 +83291 -1.000000 +83292 -1.000000 +83293 -1.000000 +83294 -1.000000 +83295 -1.000000 +83296 -1.000000 +83297 -1.000000 +83298 -1.000000 +83299 -1.000000 +83300 -1.000000 +83301 -1.000000 +83302 -1.000000 +83303 -1.000000 +83304 -1.000000 +83305 -1.000000 +83306 -1.000000 +83307 -1.000000 +83308 -1.000000 +83309 -1.000000 +83310 -1.000000 +83311 -1.000000 +83312 -1.000000 +83313 -1.000000 +83314 -1.000000 +83315 -1.000000 +83316 -1.000000 +83317 -1.000000 +83318 -1.000000 +83319 -1.000000 +83320 -1.000000 +83321 -1.000000 +83322 -1.000000 +83323 -1.000000 +83324 -1.000000 +83325 -1.000000 +83326 -1.000000 +83327 -1.000000 +83328 -1.000000 +83329 -1.000000 +83330 -1.000000 +83331 -1.000000 +83332 -1.000000 +83333 -1.000000 +83334 -1.000000 +83335 -1.000000 +83336 -1.000000 +83337 -1.000000 +83338 -1.000000 +83339 -1.000000 +83340 -1.000000 +83341 -1.000000 +83342 -1.000000 +83343 -1.000000 +83344 -1.000000 +83345 -1.000000 +83346 -1.000000 +83347 -1.000000 +83348 -1.000000 +83349 -1.000000 +83350 -1.000000 +83351 -1.000000 +83352 -1.000000 +83353 -1.000000 +83354 -1.000000 +83355 -1.000000 +83356 -1.000000 +83357 -1.000000 +83358 -1.000000 +83359 -1.000000 +83360 -1.000000 +83361 -1.000000 +83362 -1.000000 +83363 -1.000000 +83364 -1.000000 +83365 -1.000000 +83366 -1.000000 +83367 -1.000000 +83368 -1.000000 +83369 -1.000000 +83370 -1.000000 +83371 -1.000000 +83372 -1.000000 +83373 -1.000000 +83374 -1.000000 +83375 -1.000000 +83376 -1.000000 +83377 -1.000000 +83378 -1.000000 +83379 -1.000000 +83380 -1.000000 +83381 -1.000000 +83382 -1.000000 +83383 -1.000000 +83384 -1.000000 +83385 -1.000000 +83387 -1.000000 +83388 -1.000000 +83389 -1.000000 +83390 -1.000000 +83391 -1.000000 +83392 -1.000000 +83393 -1.000000 +83394 -1.000000 +83395 -1.000000 +83396 -1.000000 +83397 -1.000000 +83398 -1.000000 +83399 -1.000000 +83400 -1.000000 +83401 -1.000000 +83402 -1.000000 +83403 -1.000000 +83404 -1.000000 +83405 -1.000000 +83406 -1.000000 +83407 -1.000000 +83408 -1.000000 +83409 -1.000000 +83410 -1.000000 +83411 -1.000000 +83412 -1.000000 +83413 -1.000000 +83414 -1.000000 +83415 -1.000000 +83416 -1.000000 +83417 -1.000000 +83418 -1.000000 +83419 -1.000000 +83420 -1.000000 +83421 -1.000000 +83422 -1.000000 +83423 -1.000000 +83424 -1.000000 +83425 -1.000000 +83426 -1.000000 +83427 -1.000000 +83428 -1.000000 +83429 -1.000000 +83430 -1.000000 +83431 -1.000000 +83432 -1.000000 +83433 -1.000000 +83434 -1.000000 +83435 -1.000000 +83436 -1.000000 +83437 -1.000000 +83438 -1.000000 +83439 -1.000000 +83440 -1.000000 +83441 -1.000000 +83442 -1.000000 +83443 -1.000000 +83444 -1.000000 +83445 -1.000000 +83446 -1.000000 +83447 -1.000000 +83448 -1.000000 +83449 -1.000000 +83450 -1.000000 +83451 -1.000000 +83452 -1.000000 +83453 -1.000000 +83454 -1.000000 +83455 -1.000000 +83456 -1.000000 +83457 -1.000000 +83458 -1.000000 +83459 -1.000000 +83460 -1.000000 +83461 -1.000000 +83462 -1.000000 +83463 -1.000000 +83464 -1.000000 +83465 -1.000000 +83466 -1.000000 +83467 -1.000000 +83468 -1.000000 +83469 -1.000000 +83470 -1.000000 +83471 -1.000000 +83472 -1.000000 +83473 -1.000000 +83474 -1.000000 +83475 -1.000000 +83476 -1.000000 +83477 -1.000000 +83478 -1.000000 +83479 -1.000000 +83480 -1.000000 +83481 -1.000000 +83482 -1.000000 +83483 -1.000000 +83484 -1.000000 +83485 -1.000000 +83486 -1.000000 +83487 -1.000000 +83488 -1.000000 +83489 -1.000000 +83490 -1.000000 +83491 -1.000000 +83492 -1.000000 +83493 -1.000000 +83494 -1.000000 +83495 -1.000000 +83496 -1.000000 +83497 -1.000000 +83498 -1.000000 +83499 -1.000000 +83500 -1.000000 +83501 -1.000000 +83502 -1.000000 +83503 -1.000000 +83504 -1.000000 +83505 -1.000000 +83506 -1.000000 +83507 -1.000000 +83508 -1.000000 +83509 -1.000000 +83510 -1.000000 +83511 -1.000000 +83512 -1.000000 +83513 -1.000000 +83514 -1.000000 +83515 -1.000000 +83516 -1.000000 +83517 -1.000000 +83518 -1.000000 +83519 -1.000000 +83520 -1.000000 +83521 -1.000000 +83522 -1.000000 +83523 -1.000000 +83524 -1.000000 +83525 -1.000000 +83526 -1.000000 +83527 -1.000000 +83528 -1.000000 +83529 -1.000000 +83530 -1.000000 +83531 -1.000000 +83532 -1.000000 +83533 -1.000000 +83534 -1.000000 +83535 -1.000000 +83536 -1.000000 +83537 -1.000000 +83538 -1.000000 +83539 -1.000000 +83540 -1.000000 +83541 -1.000000 +83542 -1.000000 +83543 -1.000000 +83544 -1.000000 +83545 -1.000000 +83546 -1.000000 +83547 -1.000000 +83548 -1.000000 +83549 -1.000000 +83550 -1.000000 +83551 -1.000000 +83552 -1.000000 +83553 -1.000000 +83554 -1.000000 +83555 -1.000000 +83556 -1.000000 +83557 -1.000000 +83558 -1.000000 +83559 -1.000000 +83560 -1.000000 +83561 -1.000000 +83562 -1.000000 +83563 -1.000000 +83564 -1.000000 +83565 -1.000000 +83566 -1.000000 +83567 -1.000000 +83568 -1.000000 +83569 -1.000000 +83570 -1.000000 +83571 -1.000000 +83572 -1.000000 +83573 -1.000000 +83574 -1.000000 +83575 -1.000000 +83576 -1.000000 +83577 -1.000000 +83578 -1.000000 +83579 -1.000000 +83580 -1.000000 +83581 -1.000000 +83582 -1.000000 +83583 -1.000000 +83584 -1.000000 +83585 -1.000000 +83586 -1.000000 +83587 -1.000000 +83588 -1.000000 +83589 -1.000000 +83590 -1.000000 +83591 -1.000000 +83592 -1.000000 +83593 -1.000000 +83594 -1.000000 +83595 -1.000000 +83596 -1.000000 +83597 -1.000000 +83598 -1.000000 +83599 -1.000000 +83600 -1.000000 +83601 -1.000000 +83602 -1.000000 +83603 -1.000000 +83604 -1.000000 +83605 -1.000000 +83606 -1.000000 +83607 -1.000000 +83608 -1.000000 +83609 -1.000000 +83610 -1.000000 +83611 -1.000000 +83612 -1.000000 +83613 -1.000000 +83614 -1.000000 +83615 -1.000000 +83616 -1.000000 +83617 -1.000000 +83618 -1.000000 +83619 -1.000000 +83620 -1.000000 +83621 -1.000000 +83622 -1.000000 +83623 -1.000000 +83624 -1.000000 +83625 -1.000000 +83626 -1.000000 +83627 -1.000000 +83628 -1.000000 +83629 -1.000000 +83630 -1.000000 +83631 -1.000000 +83632 -1.000000 +83633 -1.000000 +83634 -1.000000 +83635 -1.000000 +83636 -1.000000 +83637 -1.000000 +83638 -1.000000 +83639 -1.000000 +83640 -1.000000 +83641 -1.000000 +83642 -1.000000 +83643 -1.000000 +83644 -1.000000 +83645 -1.000000 +83646 -1.000000 +83647 -1.000000 +83648 -1.000000 +83649 -1.000000 +83650 -1.000000 +83651 -1.000000 +83652 -1.000000 +83653 -1.000000 +83654 -1.000000 +83655 -1.000000 +83656 -1.000000 +83657 -1.000000 +83658 -1.000000 +83659 -1.000000 +83660 -1.000000 +83661 -1.000000 +83662 -1.000000 +83663 -1.000000 +83664 -1.000000 +83666 -1.000000 +83667 -1.000000 +83668 -1.000000 +83669 -1.000000 +83670 -1.000000 +83671 -1.000000 +83672 -1.000000 +83673 -1.000000 +83674 -1.000000 +83675 -1.000000 +83676 -1.000000 +83677 -1.000000 +83678 -1.000000 +83679 -1.000000 +83680 -1.000000 +83681 -1.000000 +83682 -1.000000 +83683 -1.000000 +83684 -1.000000 +83685 -1.000000 +83686 -1.000000 +83687 -1.000000 +83688 -1.000000 +83689 -1.000000 +83690 -1.000000 +83691 -1.000000 +83692 -1.000000 +83693 -1.000000 +83694 -1.000000 +83695 -1.000000 +83696 -1.000000 +83697 -1.000000 +83698 -1.000000 +83699 -1.000000 +83700 -1.000000 +83701 -1.000000 +83702 -1.000000 +83703 -1.000000 +83704 -1.000000 +83705 -1.000000 +83706 -1.000000 +83707 -1.000000 +83708 -1.000000 +83709 -1.000000 +83710 -1.000000 +83711 -1.000000 +83712 -1.000000 +83713 -1.000000 +83714 -1.000000 +83715 -1.000000 +83716 -1.000000 +83717 -1.000000 +83718 -1.000000 +83719 -1.000000 +83720 -1.000000 +83721 -1.000000 +83722 -1.000000 +83723 -1.000000 +83724 -1.000000 +83725 -1.000000 +83726 -1.000000 +83727 -1.000000 +83728 -1.000000 +83729 -1.000000 +83730 -1.000000 +83731 -1.000000 +83732 -1.000000 +83733 -1.000000 +83734 -1.000000 +83735 -1.000000 +83736 -1.000000 +83737 -1.000000 +83738 -1.000000 +83739 -1.000000 +83740 -1.000000 +83741 -1.000000 +83742 -1.000000 +83743 -1.000000 +83744 -1.000000 +83745 -1.000000 +83746 -1.000000 +83747 -1.000000 +83748 -1.000000 +83749 -1.000000 +83750 -1.000000 +83751 -1.000000 +83752 -1.000000 +83753 -1.000000 +83754 -1.000000 +83755 -1.000000 +83756 -1.000000 +83757 -1.000000 +83758 -1.000000 +83759 -1.000000 +83760 -1.000000 +83761 -1.000000 +83762 -1.000000 +83763 -1.000000 +83764 -1.000000 +83765 -1.000000 +83766 -1.000000 +83767 -1.000000 +83768 -1.000000 +83769 -1.000000 +83770 -1.000000 +83771 -1.000000 +83772 -1.000000 +83773 -1.000000 +83774 -1.000000 +83775 -1.000000 +83776 -1.000000 +83777 -1.000000 +83778 -1.000000 +83779 -1.000000 +83780 -1.000000 +83781 -1.000000 +83782 -1.000000 +83783 -1.000000 +83784 -1.000000 +83785 -1.000000 +83786 -1.000000 +83787 -1.000000 +83788 -1.000000 +83789 -1.000000 +83790 -1.000000 +83791 -1.000000 +83792 -1.000000 +83793 -1.000000 +83794 -1.000000 +83795 -1.000000 +83796 -1.000000 +83797 -1.000000 +83798 -1.000000 +83799 -1.000000 +83800 -1.000000 +83801 -1.000000 +83802 -1.000000 +83803 -1.000000 +83804 -1.000000 +83805 -1.000000 +83806 -1.000000 +83807 -1.000000 +83808 -1.000000 +83809 -1.000000 +83810 -1.000000 +83811 -1.000000 +83812 -1.000000 +83813 -1.000000 +83814 -1.000000 +83815 -1.000000 +83817 -1.000000 +83818 -1.000000 +83819 -1.000000 +83820 -1.000000 +83821 -1.000000 +83823 -1.000000 +83824 -1.000000 +83825 -1.000000 +83826 -1.000000 +83827 -1.000000 +83828 -1.000000 +83829 -1.000000 +83830 -1.000000 +83831 -1.000000 +83832 -1.000000 +83833 -1.000000 +83834 -1.000000 +83835 -1.000000 +83836 -1.000000 +83837 -1.000000 +83838 -1.000000 +83839 -1.000000 +83840 -1.000000 +83841 -1.000000 +83842 -1.000000 +83843 -1.000000 +83844 -1.000000 +83845 -1.000000 +83846 -1.000000 +83847 -1.000000 +83848 -1.000000 +83849 -1.000000 +83850 -1.000000 +83851 -1.000000 +83852 -1.000000 +83853 -1.000000 +83854 -1.000000 +83855 -1.000000 +83856 -1.000000 +83857 -1.000000 +83858 -1.000000 +83860 -1.000000 +83861 -1.000000 +83862 -1.000000 +83863 -1.000000 +83864 -1.000000 +83865 -1.000000 +83866 -1.000000 +83867 -1.000000 +83868 -1.000000 +83869 -1.000000 +83870 -1.000000 +83871 -1.000000 +83872 -1.000000 +83873 -1.000000 +83874 -1.000000 +83875 -1.000000 +83876 -1.000000 +83877 -1.000000 +83878 -1.000000 +83879 -1.000000 +83880 -1.000000 +83881 -1.000000 +83882 -1.000000 +83883 -1.000000 +83884 -1.000000 +83885 -1.000000 +83887 -1.000000 +83888 -1.000000 +83889 -1.000000 +83893 -1.000000 +83896 -1.000000 +83897 -1.000000 +83898 -1.000000 +83899 -1.000000 +83900 -1.000000 +83902 -1.000000 +83903 -1.000000 +83904 -1.000000 +83905 -1.000000 +83906 -1.000000 +83907 -1.000000 +83908 -1.000000 +83909 -1.000000 +83910 -1.000000 +83911 -1.000000 +83913 -1.000000 +83914 -1.000000 +83915 -1.000000 +83916 -1.000000 +83917 -1.000000 +83918 -1.000000 +83919 -1.000000 +83920 -1.000000 +83921 -1.000000 +83922 -1.000000 +83923 -1.000000 +83924 -1.000000 +83927 -1.000000 +83929 -1.000000 +83930 -1.000000 +83931 -1.000000 +83932 -1.000000 +83933 -1.000000 +83934 -1.000000 +83935 -1.000000 +83936 -1.000000 +83937 -1.000000 +83938 -1.000000 +83939 -1.000000 +83940 -1.000000 +83942 -1.000000 +83943 -1.000000 +83944 -1.000000 +83945 -1.000000 +83946 -1.000000 +83947 -1.000000 +83948 -1.000000 +83949 -1.000000 +83950 -1.000000 +83951 -1.000000 +83952 -1.000000 +83953 -1.000000 +83954 -1.000000 +83955 -1.000000 +83956 -1.000000 +83957 -1.000000 +83958 -1.000000 +83959 -1.000000 +83960 -1.000000 +83961 -1.000000 +83962 -1.000000 +83963 -1.000000 +83964 -1.000000 +83965 -1.000000 +83966 -1.000000 +83967 -1.000000 +83968 -1.000000 +83969 -1.000000 +83970 -1.000000 +83972 -1.000000 +83973 -1.000000 +83974 -1.000000 +83975 -1.000000 +83976 -1.000000 +83977 -1.000000 +83978 -1.000000 +83979 -1.000000 +83980 -1.000000 +83981 -1.000000 +83982 -1.000000 +83983 -1.000000 +83984 -1.000000 +83985 -1.000000 +83986 -1.000000 +83987 -1.000000 +83988 -1.000000 +83989 -1.000000 +83990 -1.000000 +83991 -1.000000 +83992 -1.000000 +83993 -1.000000 +83994 -1.000000 +83995 -1.000000 +83996 -1.000000 +83997 -1.000000 +83998 -1.000000 +83999 -1.000000 +84000 -1.000000 +84001 -1.000000 +84002 -1.000000 +84003 -1.000000 +84004 -1.000000 +84005 -1.000000 +84006 -1.000000 +84007 -1.000000 +84008 -1.000000 +84009 -1.000000 +84010 -1.000000 +84011 -1.000000 +84012 -1.000000 +84013 -1.000000 +84014 -1.000000 +84015 -1.000000 +84016 -1.000000 +84017 -1.000000 +84018 -1.000000 +84019 -1.000000 +84020 -1.000000 +84021 -1.000000 +84022 -1.000000 +84023 -1.000000 +84024 -1.000000 +84025 -1.000000 +84026 -1.000000 +84027 -1.000000 +84028 -1.000000 +84029 -1.000000 +84030 -1.000000 +84031 -1.000000 +84032 -1.000000 +84033 -1.000000 +84034 -1.000000 +84035 -1.000000 +84036 -1.000000 +84037 -1.000000 +84038 -1.000000 +84039 -1.000000 +84040 -1.000000 +84041 -1.000000 +84042 -1.000000 +84043 -1.000000 +84044 -1.000000 +84045 -1.000000 +84046 -1.000000 +84047 -1.000000 +84048 -1.000000 +84049 -1.000000 +84050 -1.000000 +84051 -1.000000 +84052 -1.000000 +84053 -1.000000 +84054 -1.000000 +84055 -1.000000 +84056 -1.000000 +84057 -1.000000 +84058 -1.000000 +84059 -1.000000 +84060 -1.000000 +84061 -1.000000 +84062 -1.000000 +84063 -1.000000 +84064 -1.000000 +84065 -1.000000 +84066 -1.000000 +84067 -1.000000 +84068 -1.000000 +84069 -1.000000 +84070 -1.000000 +84071 -1.000000 +84072 -1.000000 +84073 -1.000000 +84074 -1.000000 +84075 -1.000000 +84076 -1.000000 +84077 -1.000000 +84078 -1.000000 +84079 -1.000000 +84080 -1.000000 +84081 -1.000000 +84082 -1.000000 +84083 -1.000000 +84084 -1.000000 +84085 -1.000000 +84086 -1.000000 +84087 -1.000000 +84088 -1.000000 +84089 -1.000000 +84090 -1.000000 +84091 -1.000000 +84092 -1.000000 +84093 -1.000000 +84094 -1.000000 +84095 -1.000000 +84096 -1.000000 +84097 -1.000000 +84098 -1.000000 +84099 -1.000000 +84100 -1.000000 +84101 -1.000000 +84102 -1.000000 +84103 -1.000000 +84104 -1.000000 +84105 -1.000000 +84106 -1.000000 +84107 -1.000000 +84108 -1.000000 +84109 -1.000000 +84110 -1.000000 +84111 -1.000000 +84112 -1.000000 +84113 -1.000000 +84114 -1.000000 +84115 -1.000000 +84116 -1.000000 +84117 -1.000000 +84118 -1.000000 +84119 -1.000000 +84120 -1.000000 +84121 -1.000000 +84122 -1.000000 +84123 -1.000000 +84124 -1.000000 +84125 -1.000000 +84126 -1.000000 +84127 -1.000000 +84128 -1.000000 +84129 -1.000000 +84130 -1.000000 +84131 -1.000000 +84132 -1.000000 +84133 -1.000000 +84134 -1.000000 +84135 -1.000000 +84136 -1.000000 +84137 -1.000000 +84138 -1.000000 +84139 -1.000000 +84140 -1.000000 +84141 -1.000000 +84142 -1.000000 +84143 -1.000000 +84144 -1.000000 +84145 -1.000000 +84146 -1.000000 +84147 -1.000000 +84148 -1.000000 +84149 -1.000000 +84150 -1.000000 +84151 -1.000000 +84152 -1.000000 +84153 -1.000000 +84154 -1.000000 +84155 -1.000000 +84156 -1.000000 +84157 -1.000000 +84158 -1.000000 +84159 -1.000000 +84160 -1.000000 +84161 -1.000000 +84162 -1.000000 +84163 -1.000000 +84164 -1.000000 +84165 -1.000000 +84166 -1.000000 +84167 -1.000000 +84168 -1.000000 +84169 -1.000000 +84170 -1.000000 +84171 -1.000000 +84172 -1.000000 +84173 -1.000000 +84174 -1.000000 +84175 -1.000000 +84176 -1.000000 +84177 -1.000000 +84178 -1.000000 +84179 -1.000000 +84180 -1.000000 +84181 -1.000000 +84182 -1.000000 +84183 -1.000000 +84184 -1.000000 +84185 -1.000000 +84186 -1.000000 +84187 -1.000000 +84188 -1.000000 +84189 -1.000000 +84190 -1.000000 +84191 -1.000000 +84192 -1.000000 +84193 -1.000000 +84194 -1.000000 +84195 -1.000000 +84196 -1.000000 +84197 -1.000000 +84198 -1.000000 +84199 -1.000000 +84200 -1.000000 +84201 -1.000000 +84202 -1.000000 +84203 -1.000000 +84204 -1.000000 +84205 -1.000000 +84206 -1.000000 +84207 -1.000000 +84208 -1.000000 +84209 -1.000000 +84210 -1.000000 +84211 -1.000000 +84212 -1.000000 +84213 -1.000000 +84214 -1.000000 +84215 -1.000000 +84216 -1.000000 +84217 -1.000000 +84218 -1.000000 +84219 -1.000000 +84220 -1.000000 +84221 -1.000000 +84222 -1.000000 +84223 -1.000000 +84224 -1.000000 +84225 -1.000000 +84226 -1.000000 +84227 -1.000000 +84228 -1.000000 +84229 -1.000000 +84230 -1.000000 +84231 -1.000000 +84232 -1.000000 +84233 -1.000000 +84234 -1.000000 +84235 -1.000000 +84236 -1.000000 +84237 -1.000000 +84238 -1.000000 +84239 -1.000000 +84240 -1.000000 +84241 -1.000000 +84242 -1.000000 +84243 -1.000000 +84244 -1.000000 +84245 -1.000000 +84246 -1.000000 +84247 -1.000000 +84248 -1.000000 +84249 -1.000000 +84250 -1.000000 +84251 -1.000000 +84252 -1.000000 +84253 -1.000000 +84254 -1.000000 +84255 -1.000000 +84256 -1.000000 +84257 -1.000000 +84258 -1.000000 +84259 -1.000000 +84260 -1.000000 +84261 -1.000000 +84262 -1.000000 +84263 -1.000000 +84264 -1.000000 +84265 -1.000000 +84266 -1.000000 +84267 -1.000000 +84268 -1.000000 +84269 -1.000000 +84270 -1.000000 +84271 -1.000000 +84272 -1.000000 +84273 -1.000000 +84274 -1.000000 +84275 -1.000000 +84276 -1.000000 +84277 -1.000000 +84278 -1.000000 +84279 -1.000000 +84280 -1.000000 +84281 -1.000000 +84282 -1.000000 +84283 -1.000000 +84284 -1.000000 +84285 -1.000000 +84286 -1.000000 +84287 -1.000000 +84288 -1.000000 +84289 -1.000000 +84290 -1.000000 +84291 -1.000000 +84292 -1.000000 +84293 -1.000000 +84294 -1.000000 +84295 -1.000000 +84296 -1.000000 +84297 -1.000000 +84298 -1.000000 +84299 -1.000000 +84300 -1.000000 +84301 -1.000000 +84302 -1.000000 +84303 -1.000000 +84304 -1.000000 +84305 -1.000000 +84306 -1.000000 +84307 -1.000000 +84308 -1.000000 +84309 -1.000000 +84310 -1.000000 +84311 -1.000000 +84312 -1.000000 +84313 -1.000000 +84314 -1.000000 +84315 -1.000000 +84316 -1.000000 +84317 -1.000000 +84318 -1.000000 +84319 -1.000000 +84320 -1.000000 +84321 -1.000000 +84322 -1.000000 +84323 -1.000000 +84324 -1.000000 +84325 -1.000000 +84326 -1.000000 +84327 -1.000000 +84328 -1.000000 +84329 -1.000000 +84330 -1.000000 +84331 -1.000000 +84332 -1.000000 +84333 -1.000000 +84334 -1.000000 +84335 -1.000000 +84336 -1.000000 +84337 -1.000000 +84338 -1.000000 +84339 -1.000000 +84340 -1.000000 +84341 -1.000000 +84342 -1.000000 +84343 -1.000000 +84344 -1.000000 +84345 -1.000000 +84346 -1.000000 +84347 -1.000000 +84348 -1.000000 +84349 -1.000000 +84350 -1.000000 +84351 -1.000000 +84352 -1.000000 +84353 -1.000000 +84354 -1.000000 +84355 -1.000000 +84356 -1.000000 +84357 -1.000000 +84358 -1.000000 +84359 -1.000000 +84360 -1.000000 +84361 -1.000000 +84362 -1.000000 +84363 -1.000000 +84364 -1.000000 +84365 -1.000000 +84366 -1.000000 +84367 -1.000000 +84368 -1.000000 +84369 -1.000000 +84370 -1.000000 +84371 -1.000000 +84372 -1.000000 +84373 -1.000000 +84374 -1.000000 +84375 -1.000000 +84376 -1.000000 +84377 -1.000000 +84378 -1.000000 +84379 -1.000000 +84380 -1.000000 +84381 -1.000000 +84382 -1.000000 +84383 -1.000000 +84384 -1.000000 +84385 -1.000000 +84386 -1.000000 +84387 -1.000000 +84388 -1.000000 +84389 -1.000000 +84390 -1.000000 +84391 -1.000000 +84392 -1.000000 +84393 -1.000000 +84394 -1.000000 +84395 -1.000000 +84396 -1.000000 +84397 -1.000000 +84398 -1.000000 +84399 -1.000000 +84400 -1.000000 +84401 -1.000000 +84402 -1.000000 +84403 -1.000000 +84404 -1.000000 +84405 -1.000000 +84406 -1.000000 +84407 -1.000000 +84408 -1.000000 +84409 -1.000000 +84410 -1.000000 +84411 -1.000000 +84412 -1.000000 +84413 -1.000000 +84414 -1.000000 +84415 -1.000000 +84416 -1.000000 +84417 -1.000000 +84418 -1.000000 +84419 -1.000000 +84420 -1.000000 +84421 -1.000000 +84422 -1.000000 +84423 -1.000000 +84424 -1.000000 +84425 -1.000000 +84426 -1.000000 +84427 -1.000000 +84428 -1.000000 +84429 -1.000000 +84430 -1.000000 +84431 -1.000000 +84432 -1.000000 +84433 -1.000000 +84434 -1.000000 +84435 -1.000000 +84436 -1.000000 +84437 -1.000000 +84438 -1.000000 +84439 -1.000000 +84440 -1.000000 +84441 -1.000000 +84442 -1.000000 +84443 -1.000000 +84444 -1.000000 +84445 -1.000000 +84446 -1.000000 +84447 -1.000000 +84448 -1.000000 +84449 -1.000000 +84450 -1.000000 +84451 -1.000000 +84452 -1.000000 +84453 -1.000000 +84454 -1.000000 +84455 -1.000000 +84456 -1.000000 +84457 -1.000000 +84458 -1.000000 +84459 -1.000000 +84460 -1.000000 +84461 -1.000000 +84462 -1.000000 +84463 -1.000000 +84464 -1.000000 +84465 -1.000000 +84466 -1.000000 +84467 -1.000000 +84469 -1.000000 +84470 -1.000000 +84471 -1.000000 +84472 -1.000000 +84473 -1.000000 +84474 -1.000000 +84475 -1.000000 +84476 -1.000000 +84477 -1.000000 +84478 -1.000000 +84479 -1.000000 +84480 -1.000000 +84481 -1.000000 +84482 -1.000000 +84483 -1.000000 +84484 -1.000000 +84485 -1.000000 +84486 -1.000000 +84487 -1.000000 +84488 -1.000000 +84489 -1.000000 +84490 -1.000000 +84491 -1.000000 +84492 -1.000000 +84493 -1.000000 +84494 -1.000000 +84495 -1.000000 +84496 -1.000000 +84497 -1.000000 +84498 -1.000000 +84499 -1.000000 +84500 -1.000000 +84501 -1.000000 +84502 -1.000000 +84503 -1.000000 +84504 -1.000000 +84505 -1.000000 +84506 -1.000000 +84507 -1.000000 +84508 -1.000000 +84509 -1.000000 +84510 -1.000000 +84511 -1.000000 +84512 -1.000000 +84513 -1.000000 +84514 -1.000000 +84515 -1.000000 +84516 -1.000000 +84517 -1.000000 +84518 -1.000000 +84519 -1.000000 +84520 -1.000000 +84521 -1.000000 +84522 -1.000000 +84523 -1.000000 +84524 -1.000000 +84525 -1.000000 +84526 -1.000000 +84527 -1.000000 +84528 -1.000000 +84529 -1.000000 +84530 -1.000000 +84531 -1.000000 +84532 -1.000000 +84533 -1.000000 +84534 -1.000000 +84535 -1.000000 +84536 -1.000000 +84537 -1.000000 +84538 -1.000000 +84539 -1.000000 +84540 -1.000000 +84541 -1.000000 +84542 -1.000000 +84543 -1.000000 +84544 -1.000000 +84545 -1.000000 +84546 -1.000000 +84547 -1.000000 +84548 -1.000000 +84549 -1.000000 +84551 -1.000000 +84552 -1.000000 +84553 -1.000000 +84554 -1.000000 +84555 -1.000000 +84556 -1.000000 +84557 -1.000000 +84558 -1.000000 +84559 -1.000000 +84560 -1.000000 +84561 -1.000000 +84562 -1.000000 +84563 -1.000000 +84564 -1.000000 +84565 -1.000000 +84566 -1.000000 +84567 -1.000000 +84568 -1.000000 +84569 -1.000000 +84570 -1.000000 +84571 -1.000000 +84572 -1.000000 +84573 -1.000000 +84574 -1.000000 +84575 -1.000000 +84576 -1.000000 +84577 -1.000000 +84578 -1.000000 +84579 -1.000000 +84580 -1.000000 +84581 -1.000000 +84582 -1.000000 +84583 -1.000000 +84584 -1.000000 +84585 -1.000000 +84586 -1.000000 +84587 -1.000000 +84588 -1.000000 +84589 -1.000000 +84590 -1.000000 +84591 -1.000000 +84592 -1.000000 +84593 -1.000000 +84594 -1.000000 +84595 -1.000000 +84598 -1.000000 +84599 -1.000000 +84600 -1.000000 +84601 -1.000000 +84602 -1.000000 +84603 -1.000000 +84604 -1.000000 +84605 -1.000000 +84606 -1.000000 +84607 -1.000000 +84608 -1.000000 +84609 -1.000000 +84610 -1.000000 +84611 -1.000000 +84612 -1.000000 +84613 -1.000000 +84614 -1.000000 +84615 -1.000000 +84616 -1.000000 +84617 -1.000000 +84618 -1.000000 +84619 -1.000000 +84620 -1.000000 +84621 -1.000000 +84622 -1.000000 +84623 -1.000000 +84624 -1.000000 +84625 -1.000000 +84626 -1.000000 +84627 -1.000000 +84629 -1.000000 +84630 -1.000000 +84631 -1.000000 +84632 -1.000000 +84633 -1.000000 +84634 -1.000000 +84635 -1.000000 +84636 -1.000000 +84637 -1.000000 +84638 -1.000000 +84639 -1.000000 +84640 -1.000000 +84641 -1.000000 +84642 -1.000000 +84643 -1.000000 +84644 -1.000000 +84645 -1.000000 +84646 -1.000000 +84647 -1.000000 +84648 -1.000000 +84649 -1.000000 +84650 -1.000000 +84651 -1.000000 +84652 -1.000000 +84653 -1.000000 +84654 -1.000000 +84655 -1.000000 +84656 -1.000000 +84657 -1.000000 +84658 -1.000000 +84659 -1.000000 +84660 -1.000000 +84661 -1.000000 +84662 -1.000000 +84663 -1.000000 +84664 -1.000000 +84665 -1.000000 +84666 -1.000000 +84667 -1.000000 +84668 -1.000000 +84669 -1.000000 +84670 -1.000000 +84671 -1.000000 +84672 -1.000000 +84673 -1.000000 +84674 -1.000000 +84675 -1.000000 +84676 -1.000000 +84677 -1.000000 +84678 -1.000000 +84679 -1.000000 +84680 -1.000000 +84681 -1.000000 +84682 -1.000000 +84683 -1.000000 +84684 -1.000000 +84685 -1.000000 +84686 -1.000000 +84687 -1.000000 +84688 -1.000000 +84689 -1.000000 +84690 -1.000000 +84691 -1.000000 +84692 -1.000000 +84693 -1.000000 +84694 -1.000000 +84695 -1.000000 +84696 -1.000000 +84697 -1.000000 +84698 -1.000000 +84699 -1.000000 +84700 -1.000000 +84701 -1.000000 +84702 -1.000000 +84703 -1.000000 +84704 -1.000000 +84706 -1.000000 +84707 -1.000000 +84708 -1.000000 +84709 -1.000000 +84710 -1.000000 +84711 -1.000000 +84712 -1.000000 +84713 -1.000000 +84714 -1.000000 +84715 -1.000000 +84716 -1.000000 +84717 -1.000000 +84718 -1.000000 +84719 -1.000000 +84720 -1.000000 +84721 -1.000000 +84722 -1.000000 +84723 -1.000000 +84724 -1.000000 +84725 -1.000000 +84726 -1.000000 +84727 -1.000000 +84728 -1.000000 +84729 -1.000000 +84730 -1.000000 +84731 -1.000000 +84732 -1.000000 +84733 -1.000000 +84734 -1.000000 +84735 -1.000000 +84736 -1.000000 +84737 -1.000000 +84738 -1.000000 +84739 -1.000000 +84740 -1.000000 +84741 -1.000000 +84742 -1.000000 +84743 -1.000000 +84744 -1.000000 +84745 -1.000000 +84746 -1.000000 +84747 -1.000000 +84748 -1.000000 +84749 -1.000000 +84750 -1.000000 +84751 -1.000000 +84752 -1.000000 +84753 -1.000000 +84754 -1.000000 +84755 -1.000000 +84756 -1.000000 +84757 -1.000000 +84758 -1.000000 +84759 -1.000000 +84760 -1.000000 +84761 -1.000000 +84762 -1.000000 +84763 -1.000000 +84764 -1.000000 +84765 -1.000000 +84766 -1.000000 +84767 -1.000000 +84768 -1.000000 +84769 -1.000000 +84770 -1.000000 +84771 -1.000000 +84772 -1.000000 +84773 -1.000000 +84774 -1.000000 +84775 -1.000000 +84776 -1.000000 +84777 -1.000000 +84778 -1.000000 +84779 -1.000000 +84780 -1.000000 +84781 -1.000000 +84782 -1.000000 +84783 -1.000000 +84784 -1.000000 +84785 -1.000000 +84786 -1.000000 +84787 -1.000000 +84788 -1.000000 +84789 -1.000000 +84790 -1.000000 +84791 -1.000000 +84792 -1.000000 +84793 -1.000000 +84794 -1.000000 +84795 -1.000000 +84796 -1.000000 +84797 -1.000000 +84798 -1.000000 +84799 -1.000000 +84800 -1.000000 +84801 -1.000000 +84802 -1.000000 +84803 -1.000000 +84804 -1.000000 +84805 -1.000000 +84806 -1.000000 +84807 -1.000000 +84808 -1.000000 +84809 -1.000000 +84810 -1.000000 +84811 -1.000000 +84812 -1.000000 +84813 -1.000000 +84814 -1.000000 +84815 -1.000000 +84816 -1.000000 +84817 -1.000000 +84818 -1.000000 +84819 -1.000000 +84820 -1.000000 +84821 -1.000000 +84822 -1.000000 +84823 -1.000000 +84824 -1.000000 +84825 -1.000000 +84826 -1.000000 +84827 -1.000000 +84828 -1.000000 +84829 -1.000000 +84830 -1.000000 +84831 -1.000000 +84832 -1.000000 +84833 -1.000000 +84834 -1.000000 +84835 -1.000000 +84836 -1.000000 +84837 -1.000000 +84838 -1.000000 +84839 -1.000000 +84840 -1.000000 +84841 -1.000000 +84842 -1.000000 +84843 -1.000000 +84844 -1.000000 +84845 -1.000000 +84846 -1.000000 +84847 -1.000000 +84848 -1.000000 +84849 -1.000000 +84850 -1.000000 +84851 -1.000000 +84852 -1.000000 +84853 -1.000000 +84854 -1.000000 +84855 -1.000000 +84856 -1.000000 +84857 -1.000000 +84858 -1.000000 +84859 -1.000000 +84860 -1.000000 +84861 -1.000000 +84862 -1.000000 +84863 -1.000000 +84864 -1.000000 +84865 -1.000000 +84866 -1.000000 +84867 -1.000000 +84868 -1.000000 +84869 -1.000000 +84870 -1.000000 +84871 -1.000000 +84872 -1.000000 +84873 -1.000000 +84874 -1.000000 +84875 -1.000000 +84876 -1.000000 +84877 -1.000000 +84878 -1.000000 +84879 -1.000000 +84880 -1.000000 +84881 -1.000000 +84882 -1.000000 +84883 -1.000000 +84884 -1.000000 +84885 -1.000000 +84886 -1.000000 +84887 -1.000000 +84888 -1.000000 +84889 -1.000000 +84890 -1.000000 +84891 -1.000000 +84892 -1.000000 +84893 -1.000000 +84894 -1.000000 +84895 -1.000000 +84896 -1.000000 +84897 -1.000000 +84898 -1.000000 +84899 -1.000000 +84900 -1.000000 +84901 -1.000000 +84902 -1.000000 +84903 -1.000000 +84904 -1.000000 +84905 -1.000000 +84906 -1.000000 +84907 -1.000000 +84908 -1.000000 +84909 -1.000000 +84910 -1.000000 +84911 -1.000000 +84912 -1.000000 +84913 -1.000000 +84914 -1.000000 +84915 -1.000000 +84916 -1.000000 +84917 -1.000000 +84918 -1.000000 +84919 -1.000000 +84920 -1.000000 +84921 -1.000000 +84922 -1.000000 +84923 -1.000000 +84925 -1.000000 +84926 -1.000000 +84927 -1.000000 +84928 -1.000000 +84929 -1.000000 +84930 -1.000000 +84931 -1.000000 +84932 -1.000000 +84933 -1.000000 +84934 -1.000000 +84935 -1.000000 +84936 -1.000000 +84937 -1.000000 +84938 -1.000000 +84939 -1.000000 +84940 -1.000000 +84941 -1.000000 +84942 -1.000000 +84943 -1.000000 +84944 -1.000000 +84945 -1.000000 +84946 -1.000000 +84947 -1.000000 +84948 -1.000000 +84949 -1.000000 +84950 -1.000000 +84951 -1.000000 +84952 -1.000000 +84953 -1.000000 +84954 -1.000000 +84955 -1.000000 +84956 -1.000000 +84957 -1.000000 +84958 -1.000000 +84959 -1.000000 +84960 -1.000000 +84961 -1.000000 +84962 -1.000000 +84963 -1.000000 +84964 -1.000000 +84965 -1.000000 +84966 -1.000000 +84967 -1.000000 +84968 -1.000000 +84969 -1.000000 +84970 -1.000000 +84971 -1.000000 +84972 -1.000000 +84973 -1.000000 +84974 -1.000000 +84975 -1.000000 +84976 -1.000000 +84977 -1.000000 +84978 -1.000000 +84979 -1.000000 +84980 -1.000000 +84981 -1.000000 +84982 -1.000000 +84983 -1.000000 +84984 -1.000000 +84985 -1.000000 +84986 -1.000000 +84987 -1.000000 +84988 -1.000000 +84989 -1.000000 +84990 -1.000000 +84992 -1.000000 +84993 -1.000000 +84994 -1.000000 +84995 -1.000000 +84996 -1.000000 +84997 -1.000000 +84998 -1.000000 +84999 -1.000000 +85000 -1.000000 +85001 -1.000000 +85002 -1.000000 +85003 -1.000000 +85004 -1.000000 +85005 -1.000000 +85007 -1.000000 +85010 -1.000000 +85011 -1.000000 +85014 -1.000000 +85015 -1.000000 +85016 -1.000000 +85017 -1.000000 +85018 -1.000000 +85019 -1.000000 +85020 -1.000000 +85021 -1.000000 +85022 -1.000000 +85023 -1.000000 +85024 -1.000000 +85025 -1.000000 +85026 -1.000000 +85027 -1.000000 +85028 -1.000000 +85029 -1.000000 +85030 -1.000000 +85031 -1.000000 +85032 -1.000000 +85033 -1.000000 +85034 -1.000000 +85035 -1.000000 +85036 -1.000000 +85037 -1.000000 +85038 -1.000000 +85039 -1.000000 +85040 -1.000000 +85041 -1.000000 +85043 -1.000000 +85044 -1.000000 +85045 -1.000000 +85046 -1.000000 +85047 -1.000000 +85048 -1.000000 +85049 -1.000000 +85050 -1.000000 +85051 -1.000000 +85052 -1.000000 +85054 -1.000000 +85055 -1.000000 +85056 -1.000000 +85057 -1.000000 +85058 -1.000000 +85059 -1.000000 +85060 -1.000000 +85061 -1.000000 +85062 -1.000000 +85063 -1.000000 +85064 -1.000000 +85065 -1.000000 +85066 -1.000000 +85067 -1.000000 +85068 -1.000000 +85069 -1.000000 +85070 -1.000000 +85072 -1.000000 +85073 -1.000000 +85074 -1.000000 +85075 -1.000000 +85076 -1.000000 +85077 -1.000000 +85078 -1.000000 +85082 -1.000000 +85084 -1.000000 +85085 -1.000000 +85086 -1.000000 +85087 -1.000000 +85088 -1.000000 +85089 -1.000000 +85090 -1.000000 +85091 -1.000000 +85092 -1.000000 +85093 -1.000000 +85094 -1.000000 +85095 -1.000000 +85104 -1.000000 +85105 -1.000000 +85106 -1.000000 +85107 -1.000000 +85108 -1.000000 +85109 -1.000000 +85110 -1.000000 +85111 -1.000000 +85112 -1.000000 +85113 -1.000000 +85114 -1.000000 +85115 -1.000000 +85116 -1.000000 +85117 -1.000000 +85120 -1.000000 +85121 -1.000000 +85122 -1.000000 +85123 -1.000000 +85124 -1.000000 +85125 -1.000000 +85126 -1.000000 +85127 -1.000000 +85128 -1.000000 +85129 -1.000000 +85130 -1.000000 +85131 -1.000000 +85132 -1.000000 +85133 -1.000000 +85134 -1.000000 +85135 -1.000000 +85137 -1.000000 +85138 -1.000000 +85139 -1.000000 +85140 -1.000000 +85141 -1.000000 +85142 -1.000000 +85143 -1.000000 +85144 -1.000000 +85145 -1.000000 +85146 -1.000000 +85147 -1.000000 +85148 -1.000000 +85149 -1.000000 +85150 -1.000000 +85151 -1.000000 +85152 -1.000000 +85153 -1.000000 +85154 -1.000000 +85155 -1.000000 +85156 -1.000000 +85157 -1.000000 +85158 -1.000000 +85159 -1.000000 +85160 -1.000000 +85161 -1.000000 +85162 -1.000000 +85163 -1.000000 +85164 -1.000000 +85165 -1.000000 +85166 -1.000000 +85167 -1.000000 +85168 -1.000000 +85169 -1.000000 +85170 -1.000000 +85171 -1.000000 +85172 -1.000000 +85173 -1.000000 +85174 -1.000000 +85175 -1.000000 +85176 -1.000000 +85177 -1.000000 +85178 -1.000000 +85179 -1.000000 +85180 -1.000000 +85181 -1.000000 +85182 -1.000000 +85183 -1.000000 +85184 -1.000000 +85185 -1.000000 +85186 -1.000000 +85187 -1.000000 +85188 -1.000000 +85189 -1.000000 +85190 -1.000000 +85191 -1.000000 +85192 -1.000000 +85193 -1.000000 +85194 -1.000000 +85195 -1.000000 +85196 -1.000000 +85197 -1.000000 +85198 -1.000000 +85199 -1.000000 +85200 -1.000000 +85201 -1.000000 +85202 -1.000000 +85203 -1.000000 +85204 -1.000000 +85206 -1.000000 +85207 -1.000000 +85208 -1.000000 +85209 -1.000000 +85210 -1.000000 +85211 -1.000000 +85212 -1.000000 +85213 -1.000000 +85214 -1.000000 +85215 -1.000000 +85216 -1.000000 +85217 -1.000000 +85218 -1.000000 +85219 -1.000000 +85220 -1.000000 +85221 -1.000000 +85222 -1.000000 +85223 -1.000000 +85224 -1.000000 +85225 -1.000000 +85226 -1.000000 +85227 -1.000000 +85228 -1.000000 +85229 -1.000000 +85230 -1.000000 +85231 -1.000000 +85232 -1.000000 +85233 -1.000000 +85234 -1.000000 +85235 -1.000000 +85236 -1.000000 +85237 -1.000000 +85238 -1.000000 +85239 -1.000000 +85240 -1.000000 +85241 -1.000000 +85242 -1.000000 +85243 -1.000000 +85244 -1.000000 +85245 -1.000000 +85246 -1.000000 +85247 -1.000000 +85248 -1.000000 +85249 -1.000000 +85250 -1.000000 +85251 -1.000000 +85252 -1.000000 +85253 -1.000000 +85254 -1.000000 +85255 -1.000000 +85256 -1.000000 +85257 -1.000000 +85258 -1.000000 +85259 -1.000000 +85260 -1.000000 +85261 -1.000000 +85262 -1.000000 +85263 -1.000000 +85264 -1.000000 +85265 -1.000000 +85266 -1.000000 +85267 -1.000000 +85268 -1.000000 +85269 -1.000000 +85270 -1.000000 +85271 -1.000000 +85272 -1.000000 +85273 -1.000000 +85274 -1.000000 +85275 -1.000000 +85276 -1.000000 +85277 -1.000000 +85278 -1.000000 +85279 -1.000000 +85280 -1.000000 +85281 -1.000000 +85282 -1.000000 +85283 -1.000000 +85284 -1.000000 +85285 -1.000000 +85286 -1.000000 +85287 -1.000000 +85288 -1.000000 +85289 -1.000000 +85290 -1.000000 +85291 -1.000000 +85292 -1.000000 +85293 -1.000000 +85294 -1.000000 +85295 -1.000000 +85296 -1.000000 +85297 -1.000000 +85298 -1.000000 +85299 -1.000000 +85300 -1.000000 +85301 -1.000000 +85302 -1.000000 +85303 -1.000000 +85304 -1.000000 +85305 -1.000000 +85306 -1.000000 +85307 -1.000000 +85308 -1.000000 +85309 -1.000000 +85310 -1.000000 +85311 -1.000000 +85312 -1.000000 +85313 -1.000000 +85314 -1.000000 +85315 -1.000000 +85316 -1.000000 +85317 -1.000000 +85318 -1.000000 +85319 -1.000000 +85320 -1.000000 +85321 -1.000000 +85322 -1.000000 +85323 -1.000000 +85324 -1.000000 +85325 -1.000000 +85326 -1.000000 +85327 -1.000000 +85328 -1.000000 +85329 -1.000000 +85331 -1.000000 +85332 -1.000000 +85333 -1.000000 +85334 -1.000000 +85335 -1.000000 +85336 -1.000000 +85337 -1.000000 +85338 -1.000000 +85339 -1.000000 +85340 -1.000000 +85341 -1.000000 +85342 -1.000000 +85343 -1.000000 +85344 -1.000000 +85345 -1.000000 +85346 -1.000000 +85347 -1.000000 +85348 -1.000000 +85349 -1.000000 +85350 -1.000000 +85351 -1.000000 +85352 -1.000000 +85353 -1.000000 +85354 -1.000000 +85355 -1.000000 +85356 -1.000000 +85357 -1.000000 +85358 -1.000000 +85359 -1.000000 +85360 -1.000000 +85361 -1.000000 +85362 -1.000000 +85363 -1.000000 +85364 -1.000000 +85365 -1.000000 +85366 -1.000000 +85367 -1.000000 +85368 -1.000000 +85369 -1.000000 +85370 -1.000000 +85371 -1.000000 +85372 -1.000000 +85373 -1.000000 +85374 -1.000000 +85375 -1.000000 +85376 -1.000000 +85377 -1.000000 +85378 -1.000000 +85379 -1.000000 +85380 -1.000000 +85381 -1.000000 +85382 -1.000000 +85383 -1.000000 +85384 -1.000000 +85385 -1.000000 +85386 -1.000000 +85387 -1.000000 +85388 -1.000000 +85389 -1.000000 +85390 -1.000000 +85391 -1.000000 +85392 -1.000000 +85393 -1.000000 +85394 -1.000000 +85395 -1.000000 +85396 -1.000000 +85397 -1.000000 +85398 -1.000000 +85399 -1.000000 +85400 -1.000000 +85401 -1.000000 +85402 -1.000000 +85403 -1.000000 +85404 -1.000000 +85405 -1.000000 +85406 -1.000000 +85407 -1.000000 +85408 -1.000000 +85409 -1.000000 +85410 -1.000000 +85411 -1.000000 +85412 -1.000000 +85413 -1.000000 +85414 -1.000000 +85415 -1.000000 +85416 -1.000000 +85417 -1.000000 +85418 -1.000000 +85419 -1.000000 +85420 -1.000000 +85421 -1.000000 +85422 -1.000000 +85423 -1.000000 +85424 -1.000000 +85425 -1.000000 +85426 -1.000000 +85427 -1.000000 +85428 -1.000000 +85429 -1.000000 +85430 -1.000000 +85431 -1.000000 +85432 -1.000000 +85433 -1.000000 +85434 -1.000000 +85435 -1.000000 +85436 -1.000000 +85437 -1.000000 +85438 -1.000000 +85439 -1.000000 +85440 -1.000000 +85441 -1.000000 +85442 -1.000000 +85443 -1.000000 +85444 -1.000000 +85445 -1.000000 +85446 -1.000000 +85447 -1.000000 +85448 -1.000000 +85449 -1.000000 +85450 -1.000000 +85451 -1.000000 +85452 -1.000000 +85453 -1.000000 +85454 -1.000000 +85455 -1.000000 +85456 -1.000000 +85457 -1.000000 +85458 -1.000000 +85459 -1.000000 +85460 -1.000000 +85461 -1.000000 +85462 -1.000000 +85463 -1.000000 +85464 -1.000000 +85465 -1.000000 +85466 -1.000000 +85467 -1.000000 +85468 -1.000000 +85469 -1.000000 +85470 -1.000000 +85471 -1.000000 +85472 -1.000000 +85473 -1.000000 +85474 -1.000000 +85475 -1.000000 +85476 -1.000000 +85477 -1.000000 +85478 -1.000000 +85479 -1.000000 +85480 -1.000000 +85481 -1.000000 +85482 -1.000000 +85483 -1.000000 +85484 -1.000000 +85485 -1.000000 +85486 -1.000000 +85487 -1.000000 +85488 -1.000000 +85489 -1.000000 +85490 -1.000000 +85491 -1.000000 +85492 -1.000000 +85493 -1.000000 +85494 -1.000000 +85495 -1.000000 +85496 -1.000000 +85497 -1.000000 +85498 -1.000000 +85499 -1.000000 +85500 -1.000000 +85501 -1.000000 +85502 -1.000000 +85503 -1.000000 +85504 -1.000000 +85505 -1.000000 +85506 -1.000000 +85507 -1.000000 +85508 -1.000000 +85509 -1.000000 +85510 -1.000000 +85511 -1.000000 +85512 -1.000000 +85513 -1.000000 +85514 -1.000000 +85515 -1.000000 +85516 -1.000000 +85517 -1.000000 +85518 -1.000000 +85519 -1.000000 +85520 -1.000000 +85521 -1.000000 +85522 -1.000000 +85523 -1.000000 +85524 -1.000000 +85525 -1.000000 +85526 -1.000000 +85527 -1.000000 +85528 -1.000000 +85529 -1.000000 +85530 -1.000000 +85531 -1.000000 +85532 -1.000000 +85533 -1.000000 +85534 -1.000000 +85535 -1.000000 +85536 -1.000000 +85537 -1.000000 +85538 -1.000000 +85539 -1.000000 +85540 -1.000000 +85541 -1.000000 +85542 -1.000000 +85543 -1.000000 +85544 -1.000000 +85545 -1.000000 +85546 -1.000000 +85547 -1.000000 +85548 -1.000000 +85549 -1.000000 +85550 -1.000000 +85551 -1.000000 +85552 -1.000000 +85553 -1.000000 +85554 -1.000000 +85555 -1.000000 +85556 -1.000000 +85557 -1.000000 +85558 -1.000000 +85559 -1.000000 +85560 -1.000000 +85561 -1.000000 +85562 -1.000000 +85570 -1.000000 +85571 -1.000000 +85572 -1.000000 +85573 -1.000000 +85574 -1.000000 +85575 -1.000000 +85576 -1.000000 +85577 -1.000000 +85578 -1.000000 +85579 -1.000000 +85580 -1.000000 +85581 -1.000000 +85582 -1.000000 +85583 -1.000000 +85584 -1.000000 +85585 -1.000000 +85586 -1.000000 +85587 -1.000000 +85588 -1.000000 +85589 -1.000000 +85590 -1.000000 +85591 -1.000000 +85592 -1.000000 +85593 -1.000000 +85594 -1.000000 +85595 -1.000000 +85596 -1.000000 +85597 -1.000000 +85598 -1.000000 +85599 -1.000000 +85600 -1.000000 +85601 -1.000000 +85602 -1.000000 +85603 -1.000000 +85604 -1.000000 +85605 -1.000000 +85606 -1.000000 +85607 -1.000000 +85608 -1.000000 +85609 -1.000000 +85610 -1.000000 +85611 -1.000000 +85612 -1.000000 +85613 -1.000000 +85614 -1.000000 +85615 -1.000000 +85617 -1.000000 +85618 -1.000000 +85619 -1.000000 +85620 -1.000000 +85621 -1.000000 +85622 -1.000000 +85623 -1.000000 +85624 -1.000000 +85625 -1.000000 +85626 -1.000000 +85627 -1.000000 +85628 -1.000000 +85629 -1.000000 +85630 -1.000000 +85631 -1.000000 +85632 -1.000000 +85633 -1.000000 +85634 -1.000000 +85635 -1.000000 +85636 -1.000000 +85637 -1.000000 +85638 -1.000000 +85639 -1.000000 +85640 -1.000000 +85641 -1.000000 +85642 -1.000000 +85643 -1.000000 +85644 -1.000000 +85645 -1.000000 +85646 -1.000000 +85647 -1.000000 +85648 -1.000000 +85649 -1.000000 +85650 -1.000000 +85651 -1.000000 +85652 -1.000000 +85653 -1.000000 +85654 -1.000000 +85655 -1.000000 +85656 -1.000000 +85657 -1.000000 +85658 -1.000000 +85659 -1.000000 +85660 -1.000000 +85661 -1.000000 +85662 -1.000000 +85663 -1.000000 +85664 -1.000000 +85665 -1.000000 +85666 -1.000000 +85667 -1.000000 +85668 -1.000000 +85669 -1.000000 +85670 -1.000000 +85671 -1.000000 +85672 -1.000000 +85673 -1.000000 +85674 -1.000000 +85675 -1.000000 +85676 -1.000000 +85677 -1.000000 +85678 -1.000000 +85679 -1.000000 +85680 -1.000000 +85681 -1.000000 +85682 -1.000000 +85683 -1.000000 +85684 -1.000000 +85685 -1.000000 +85686 -1.000000 +85687 -1.000000 +85688 -1.000000 +85689 -1.000000 +85690 -1.000000 +85691 -1.000000 +85708 -1.000000 +85709 -1.000000 +85710 -1.000000 +85711 -1.000000 +85712 -1.000000 +85713 -1.000000 +85714 -1.000000 +85715 -1.000000 +85716 -1.000000 +85717 -1.000000 +85718 -1.000000 +85719 -1.000000 +85720 -1.000000 +85721 -1.000000 +85722 -1.000000 +85723 -1.000000 +85724 -1.000000 +85725 -1.000000 +85726 -1.000000 +85727 -1.000000 +85729 -1.000000 +85730 -1.000000 +85731 -1.000000 +85732 -1.000000 +85733 -1.000000 +85734 -1.000000 +85735 -1.000000 +85736 -1.000000 +85737 -1.000000 +85738 -1.000000 +85739 -1.000000 +85740 -1.000000 +85741 -1.000000 +85742 -1.000000 +85743 -1.000000 +85744 -1.000000 +85745 -1.000000 +85746 -1.000000 +85747 -1.000000 +85748 -1.000000 +85749 -1.000000 +85750 -1.000000 +85751 -1.000000 +85752 -1.000000 +85753 -1.000000 +85754 -1.000000 +85755 -1.000000 +85756 -1.000000 +85757 -1.000000 +85758 -1.000000 +85759 -1.000000 +85760 -1.000000 +85761 -1.000000 +85762 -1.000000 +85763 -1.000000 +85764 -1.000000 +85765 -1.000000 +85766 -1.000000 +85767 -1.000000 +85768 -1.000000 +85769 -1.000000 +85770 -1.000000 +85771 -1.000000 +85772 -1.000000 +85773 -1.000000 +85774 -1.000000 +85775 -1.000000 +85776 -1.000000 +85777 -1.000000 +85778 -1.000000 +85779 -1.000000 +85780 -1.000000 +85781 -1.000000 +85782 -1.000000 +85783 -1.000000 +85784 -1.000000 +85785 -1.000000 +85786 -1.000000 +85787 -1.000000 +85788 -1.000000 +85789 -1.000000 +85790 -1.000000 +85791 -1.000000 +85792 -1.000000 +85793 -1.000000 +85794 -1.000000 +85795 -1.000000 +85796 -1.000000 +85797 -1.000000 +85798 -1.000000 +85799 -1.000000 +85800 -1.000000 +85801 -1.000000 +85802 -1.000000 +85803 -1.000000 +85804 -1.000000 +85805 -1.000000 +85806 -1.000000 +85807 -1.000000 +85808 -1.000000 +85809 -1.000000 +85810 -1.000000 +85811 -1.000000 +85813 -1.000000 +85814 -1.000000 +85815 -1.000000 +85816 -1.000000 +85817 -1.000000 +85818 -1.000000 +85819 -1.000000 +85820 -1.000000 +85821 -1.000000 +85822 -1.000000 +85823 -1.000000 +85824 -1.000000 +85825 -1.000000 +85826 -1.000000 +85827 -1.000000 +85828 -1.000000 +85829 -1.000000 +85830 -1.000000 +85831 -1.000000 +85832 -1.000000 +85833 -1.000000 +85834 -1.000000 +85835 -1.000000 +85836 -1.000000 +85837 -1.000000 +85838 -1.000000 +85839 -1.000000 +85840 -1.000000 +85841 -1.000000 +85842 -1.000000 +85843 -1.000000 +85844 -1.000000 +85845 -1.000000 +85846 -1.000000 +85847 -1.000000 +85848 -1.000000 +85849 -1.000000 +85850 -1.000000 +85851 -1.000000 +85852 -1.000000 +85853 -1.000000 +85854 -1.000000 +85855 -1.000000 +85856 -1.000000 +85857 -1.000000 +85858 -1.000000 +85859 -1.000000 +85860 -1.000000 +85861 -1.000000 +85862 -1.000000 +85863 -1.000000 +85864 -1.000000 +85865 -1.000000 +85866 -1.000000 +85867 -1.000000 +85868 -1.000000 +85869 -1.000000 +85870 -1.000000 +85871 -1.000000 +85872 -1.000000 +85873 -1.000000 +85874 -1.000000 +85875 -1.000000 +85876 -1.000000 +85877 -1.000000 +85878 -1.000000 +85879 -1.000000 +85880 -1.000000 +85881 -1.000000 +85882 -1.000000 +85883 -1.000000 +85884 -1.000000 +85885 -1.000000 +85886 -1.000000 +85887 -1.000000 +85888 -1.000000 +85889 -1.000000 +85890 -1.000000 +85891 -1.000000 +85892 -1.000000 +85893 -1.000000 +85894 -1.000000 +85895 -1.000000 +85896 -1.000000 +85897 -1.000000 +85898 -1.000000 +85899 -1.000000 +85900 -1.000000 +85901 -1.000000 +85902 -1.000000 +85903 -1.000000 +85904 -1.000000 +85905 -1.000000 +85906 -1.000000 +85907 -1.000000 +85908 -1.000000 +85909 -1.000000 +85910 -1.000000 +85911 -1.000000 +85912 -1.000000 +85913 -1.000000 +85914 -1.000000 +85915 -1.000000 +85916 -1.000000 +85917 -1.000000 +85918 -1.000000 +85919 -1.000000 +85920 -1.000000 +85921 -1.000000 +85922 -1.000000 +85923 -1.000000 +85924 -1.000000 +85925 -1.000000 +85926 -1.000000 +85927 -1.000000 +85928 -1.000000 +85929 -1.000000 +85930 -1.000000 +85931 -1.000000 +85932 -1.000000 +85933 -1.000000 +85934 -1.000000 +85935 -1.000000 +85936 -1.000000 +85937 -1.000000 +85938 -1.000000 +85939 -1.000000 +85940 -1.000000 +85941 -1.000000 +85942 -1.000000 +85943 -1.000000 +85944 -1.000000 +85945 -1.000000 +85946 -1.000000 +85947 -1.000000 +85948 -1.000000 +85949 -1.000000 +85950 -1.000000 +85951 -1.000000 +85952 -1.000000 +85953 -1.000000 +85954 -1.000000 +85955 -1.000000 +85956 -1.000000 +85957 -1.000000 +85958 -1.000000 +85959 -1.000000 +85960 -1.000000 +85961 -1.000000 +85962 -1.000000 +85963 -1.000000 +85964 -1.000000 +85965 -1.000000 +85966 -1.000000 +85967 -1.000000 +85968 -1.000000 +85969 -1.000000 +85970 -1.000000 +85971 -1.000000 +85972 -1.000000 +85973 -1.000000 +85974 -1.000000 +85975 -1.000000 +85976 -1.000000 +85977 -1.000000 +85978 -1.000000 +85979 -1.000000 +85980 -1.000000 +85981 -1.000000 +85982 -1.000000 +85983 -1.000000 +85984 -1.000000 +85985 -1.000000 +85986 -1.000000 +85987 -1.000000 +85988 -1.000000 +85989 -1.000000 +85990 -1.000000 +85991 -1.000000 +85992 -1.000000 +85993 -1.000000 +85994 -1.000000 +85995 -1.000000 +85996 -1.000000 +85997 -1.000000 +85998 -1.000000 +85999 -1.000000 +86000 -1.000000 +86001 -1.000000 +86002 -1.000000 +86003 -1.000000 +86004 -1.000000 +86005 -1.000000 +86006 -1.000000 +86007 -1.000000 +86008 -1.000000 +86009 -1.000000 +86010 -1.000000 +86011 -1.000000 +86012 -1.000000 +86013 -1.000000 +86014 -1.000000 +86015 -1.000000 +86016 -1.000000 +86017 -1.000000 +86018 -1.000000 +86019 -1.000000 +86020 -1.000000 +86021 -1.000000 +86022 -1.000000 +86023 -1.000000 +86024 -1.000000 +86025 -1.000000 +86026 -1.000000 +86027 -1.000000 +86028 -1.000000 +86029 -1.000000 +86030 -1.000000 +86031 -1.000000 +86032 -1.000000 +86033 -1.000000 +86034 -1.000000 +86035 -1.000000 +86036 -1.000000 +86037 -1.000000 +86038 -1.000000 +86039 -1.000000 +86040 -1.000000 +86041 -1.000000 +86042 -1.000000 +86043 -1.000000 +86044 -1.000000 +86045 -1.000000 +86046 -1.000000 +86047 -1.000000 +86048 -1.000000 +86049 -1.000000 +86050 -1.000000 +86051 -1.000000 +86052 -1.000000 +86053 -1.000000 +86054 -1.000000 +86055 -1.000000 +86056 -1.000000 +86057 -1.000000 +86058 -1.000000 +86059 -1.000000 +86060 -1.000000 +86061 -1.000000 +86062 -1.000000 +86063 -1.000000 +86064 -1.000000 +86065 -1.000000 +86066 -1.000000 +86067 -1.000000 +86068 -1.000000 +86069 -1.000000 +86070 -1.000000 +86071 -1.000000 +86072 -1.000000 +86073 -1.000000 +86074 -1.000000 +86075 -1.000000 +86076 -1.000000 +86077 -1.000000 +86078 -1.000000 +86079 -1.000000 +86080 -1.000000 +86081 -1.000000 +86082 -1.000000 +86083 -1.000000 +86084 -1.000000 +86085 -1.000000 +86086 -1.000000 +86087 -1.000000 +86088 -1.000000 +86089 -1.000000 +86090 -1.000000 +86091 -1.000000 +86092 -1.000000 +86093 -1.000000 +86094 -1.000000 +86095 -1.000000 +86096 -1.000000 +86097 -1.000000 +86098 -1.000000 +86099 -1.000000 +86100 -1.000000 +86101 -1.000000 +86102 -1.000000 +86103 -1.000000 +86104 -1.000000 +86105 -1.000000 +86106 -1.000000 +86107 -1.000000 +86108 -1.000000 +86109 -1.000000 +86110 -1.000000 +86111 -1.000000 +86112 -1.000000 +86113 -1.000000 +86114 -1.000000 +86115 -1.000000 +86116 -1.000000 +86117 -1.000000 +86118 -1.000000 +86119 -1.000000 +86120 -1.000000 +86121 -1.000000 +86122 -1.000000 +86123 -1.000000 +86124 -1.000000 +86125 -1.000000 +86126 -1.000000 +86127 -1.000000 +86128 -1.000000 +86129 -1.000000 +86130 -1.000000 +86131 -1.000000 +86132 -1.000000 +86133 -1.000000 +86134 -1.000000 +86135 -1.000000 +86136 -1.000000 +86137 -1.000000 +86138 -1.000000 +86139 -1.000000 +86140 -1.000000 +86141 -1.000000 +86142 -1.000000 +86143 -1.000000 +86144 -1.000000 +86145 -1.000000 +86146 -1.000000 +86147 -1.000000 +86148 -1.000000 +86149 -1.000000 +86152 -1.000000 +86153 -1.000000 +86154 -1.000000 +86155 -1.000000 +86156 -1.000000 +86157 -1.000000 +86158 -1.000000 +86159 -1.000000 +86160 -1.000000 +86161 -1.000000 +86162 -1.000000 +86163 -1.000000 +86164 -1.000000 +86165 -1.000000 +86166 -1.000000 +86167 -1.000000 +86168 -1.000000 +86169 -1.000000 +86170 -1.000000 +86171 -1.000000 +86172 -1.000000 +86173 -1.000000 +86174 -1.000000 +86175 -1.000000 +86176 -1.000000 +86177 -1.000000 +86178 -1.000000 +86179 -1.000000 +86180 -1.000000 +86181 -1.000000 +86182 -1.000000 +86183 -1.000000 +86184 -1.000000 +86185 -1.000000 +86186 -1.000000 +86187 -1.000000 +86188 -1.000000 +86189 -1.000000 +86190 -1.000000 +86191 -1.000000 +86192 -1.000000 +86193 -1.000000 +86194 -1.000000 +86195 -1.000000 +86196 -1.000000 +86197 -1.000000 +86198 -1.000000 +86199 -1.000000 +86200 -1.000000 +86201 -1.000000 +86202 -1.000000 +86203 -1.000000 +86204 -1.000000 +86205 -1.000000 +86206 -1.000000 +86207 -1.000000 +86208 -1.000000 +86209 -1.000000 +86210 -1.000000 +86211 -1.000000 +86212 -1.000000 +86213 -1.000000 +86214 -1.000000 +86215 -1.000000 +86216 -1.000000 +86217 -1.000000 +86218 -1.000000 +86219 -1.000000 +86220 -1.000000 +86221 -1.000000 +86222 -1.000000 +86223 -1.000000 +86224 -1.000000 +86225 -1.000000 +86226 -1.000000 +86227 -1.000000 +86228 -1.000000 +86229 -1.000000 +86230 -1.000000 +86231 -1.000000 +86232 -1.000000 +86233 -1.000000 +86234 -1.000000 +86235 -1.000000 +86236 -1.000000 +86237 -1.000000 +86238 -1.000000 +86239 -1.000000 +86240 -1.000000 +86241 -1.000000 +86242 -1.000000 +86243 -1.000000 +86244 -1.000000 +86245 -1.000000 +86246 -1.000000 +86247 -1.000000 +86248 -1.000000 +86249 -1.000000 +86250 -1.000000 +86251 -1.000000 +86252 -1.000000 +86253 -1.000000 +86254 -1.000000 +86255 -1.000000 +86256 -1.000000 +86257 -1.000000 +86258 -1.000000 +86259 -1.000000 +86260 -1.000000 +86261 -1.000000 +86262 -1.000000 +86263 -1.000000 +86264 -1.000000 +86265 -1.000000 +86266 -1.000000 +86267 -1.000000 +86268 -1.000000 +86269 -1.000000 +86270 -1.000000 +86271 -1.000000 +86272 -1.000000 +86273 -1.000000 +86274 -1.000000 +86275 -1.000000 +86276 -1.000000 +86277 -1.000000 +86278 -1.000000 +86279 -1.000000 +86280 -1.000000 +86281 -1.000000 +86282 -1.000000 +86283 -1.000000 +86284 -1.000000 +86285 -1.000000 +86286 -1.000000 +86287 -1.000000 +86288 -1.000000 +86289 -1.000000 +86290 -1.000000 +86291 -1.000000 +86292 -1.000000 +86293 -1.000000 +86294 -1.000000 +86295 -1.000000 +86296 -1.000000 +86297 -1.000000 +86298 -1.000000 +86299 -1.000000 +86300 -1.000000 +86301 -1.000000 +86302 -1.000000 +86303 -1.000000 +86304 -1.000000 +86305 -1.000000 +86306 -1.000000 +86307 -1.000000 +86308 -1.000000 +86309 -1.000000 +86310 -1.000000 +86311 -1.000000 +86312 -1.000000 +86313 -1.000000 +86314 -1.000000 +86315 -1.000000 +86316 -1.000000 +86317 -1.000000 +86318 -1.000000 +86319 -1.000000 +86320 -1.000000 +86321 -1.000000 +86322 -1.000000 +86323 -1.000000 +86324 -1.000000 +86325 -1.000000 +86326 -1.000000 +86327 -1.000000 +86328 -1.000000 +86329 -1.000000 +86330 -1.000000 +86331 -1.000000 +86332 -1.000000 +86333 -1.000000 +86334 -1.000000 +86335 -1.000000 +86336 -1.000000 +86337 -1.000000 +86338 -1.000000 +86339 -1.000000 +86340 -1.000000 +86341 -1.000000 +86342 -1.000000 +86343 -1.000000 +86344 -1.000000 +86345 -1.000000 +86346 -1.000000 +86347 -1.000000 +86348 -1.000000 +86349 -1.000000 +86350 -1.000000 +86351 -1.000000 +86352 -1.000000 +86353 -1.000000 +86354 -1.000000 +86355 -1.000000 +86356 -1.000000 +86357 -1.000000 +86358 -1.000000 +86359 -1.000000 +86360 -1.000000 +86361 -1.000000 +86362 -1.000000 +86363 -1.000000 +86364 -1.000000 +86365 -1.000000 +86366 -1.000000 +86367 -1.000000 +86368 -1.000000 +86369 -1.000000 +86370 -1.000000 +86371 -1.000000 +86372 -1.000000 +86373 -1.000000 +86374 -1.000000 +86375 -1.000000 +86376 -1.000000 +86377 -1.000000 +86378 -1.000000 +86379 -1.000000 +86380 -1.000000 +86381 -1.000000 +86382 -1.000000 +86383 -1.000000 +86384 -1.000000 +86385 -1.000000 +86386 -1.000000 +86387 -1.000000 +86388 -1.000000 +86389 -1.000000 +86390 -1.000000 +86391 -1.000000 +86392 -1.000000 +86393 -1.000000 +86394 -1.000000 +86395 -1.000000 +86396 -1.000000 +86397 -1.000000 +86398 -1.000000 +86399 -1.000000 +86403 -1.000000 +86404 -1.000000 +86405 -1.000000 +86406 -1.000000 +86407 -1.000000 +86408 -1.000000 +86409 -1.000000 +86410 -1.000000 +86411 -1.000000 +86412 -1.000000 +86413 -1.000000 +86414 -1.000000 +86415 -1.000000 +86416 -1.000000 +86417 -1.000000 +86418 -1.000000 +86419 -1.000000 +86420 -1.000000 +86421 -1.000000 +86422 -1.000000 +86423 -1.000000 +86424 -1.000000 +86425 -1.000000 +86426 -1.000000 +86427 -1.000000 +86428 -1.000000 +86429 -1.000000 +86430 -1.000000 +86431 -1.000000 +86432 -1.000000 +86433 -1.000000 +86434 -1.000000 +86435 -1.000000 +86436 -1.000000 +86437 -1.000000 +86438 -1.000000 +86439 -1.000000 +86440 -1.000000 +86441 -1.000000 +86442 -1.000000 +86443 -1.000000 +86444 -1.000000 +86445 -1.000000 +86446 -1.000000 +86447 -1.000000 +86448 -1.000000 +86449 -1.000000 +86450 -1.000000 +86451 -1.000000 +86452 -1.000000 +86453 -1.000000 +86454 -1.000000 +86455 -1.000000 +86456 -1.000000 +86457 -1.000000 +86458 -1.000000 +86459 -1.000000 +86460 -1.000000 +86461 -1.000000 +86462 -1.000000 +86463 -1.000000 +86464 -1.000000 +86465 -1.000000 +86466 -1.000000 +86467 -1.000000 +86468 -1.000000 +86469 -1.000000 +86470 -1.000000 +86471 -1.000000 +86472 -1.000000 +86473 -1.000000 +86474 -1.000000 +86475 -1.000000 +86476 -1.000000 +86477 -1.000000 +86478 -1.000000 +86479 -1.000000 +86480 -1.000000 +86481 -1.000000 +86482 -1.000000 +86483 -1.000000 +86484 -1.000000 +86485 -1.000000 +86486 -1.000000 +86487 -1.000000 +86488 -1.000000 +86489 -1.000000 +86490 -1.000000 +86491 -1.000000 +86492 -1.000000 +86493 -1.000000 +86494 -1.000000 +86495 -1.000000 +86496 -1.000000 +86497 -1.000000 +86498 -1.000000 +86499 -1.000000 +86500 -1.000000 +86501 -1.000000 +86502 -1.000000 +86503 -1.000000 +86504 -1.000000 +86505 -1.000000 +86506 -1.000000 +86507 -1.000000 +86508 -1.000000 +86509 -1.000000 +86510 -1.000000 +86511 -1.000000 +86512 -1.000000 +86513 -1.000000 +86514 -1.000000 +86515 -1.000000 +86516 -1.000000 +86517 -1.000000 +86518 -1.000000 +86519 -1.000000 +86520 -1.000000 +86521 -1.000000 +86522 -1.000000 +86523 -1.000000 +86524 -1.000000 +86525 -1.000000 +86526 -1.000000 +86527 -1.000000 +86528 -1.000000 +86529 -1.000000 +86530 -1.000000 +86531 -1.000000 +86532 -1.000000 +86533 -1.000000 +86534 -1.000000 +86535 -1.000000 +86536 -1.000000 +86537 -1.000000 +86538 -1.000000 +86539 -1.000000 +86540 -1.000000 +86541 -1.000000 +86542 -1.000000 +86543 -1.000000 +86544 -1.000000 +86545 -1.000000 +86546 -1.000000 +86547 -1.000000 +86548 -1.000000 +86549 -1.000000 +86550 -1.000000 +86551 -1.000000 +86552 -1.000000 +86553 -1.000000 +86554 -1.000000 +86555 -1.000000 +86556 -1.000000 +86557 -1.000000 +86558 -1.000000 +86559 -1.000000 +86560 -1.000000 +86561 -1.000000 +86562 -1.000000 +86563 -1.000000 +86564 -1.000000 +86565 -1.000000 +86566 -1.000000 +86567 -1.000000 +86568 -1.000000 +86569 -1.000000 +86570 -1.000000 +86571 -1.000000 +86572 -1.000000 +86573 -1.000000 +86574 -1.000000 +86575 -1.000000 +86576 -1.000000 +86577 -1.000000 +86578 -1.000000 +86579 -1.000000 +86580 -1.000000 +86581 -1.000000 +86582 -1.000000 +86583 -1.000000 +86584 -1.000000 +86585 -1.000000 +86586 -1.000000 +86587 -1.000000 +86588 -1.000000 +86589 -1.000000 +86590 -1.000000 +86591 -1.000000 +86592 -1.000000 +86593 -1.000000 +86594 -1.000000 +86595 -1.000000 +86596 -1.000000 +86597 -1.000000 +86598 -1.000000 +86599 -1.000000 +86600 -1.000000 +86601 -1.000000 +86602 -1.000000 +86603 -1.000000 +86604 -1.000000 +86605 -1.000000 +86606 -1.000000 +86607 -1.000000 +86608 -1.000000 +86611 -1.000000 +86612 -1.000000 +86613 -1.000000 +86614 -1.000000 +86615 -1.000000 +86616 -1.000000 +86617 -1.000000 +86618 -1.000000 +86619 -1.000000 +86620 -1.000000 +86621 -1.000000 +86622 -1.000000 +86623 -1.000000 +86624 -1.000000 +86625 -1.000000 +86626 -1.000000 +86627 -1.000000 +86628 -1.000000 +86629 -1.000000 +86630 -1.000000 +86631 -1.000000 +86632 -1.000000 +86633 -1.000000 +86634 -1.000000 +86635 -1.000000 +86636 -1.000000 +86637 -1.000000 +86638 -1.000000 +86639 -1.000000 +86640 -1.000000 +86641 -1.000000 +86642 -1.000000 +86643 -1.000000 +86644 -1.000000 +86645 -1.000000 +86646 -1.000000 +86647 -1.000000 +86648 -1.000000 +86649 -1.000000 +86650 -1.000000 +86651 -1.000000 +86652 -1.000000 +86653 -1.000000 +86654 -1.000000 +86655 -1.000000 +86656 -1.000000 +86657 -1.000000 +86658 -1.000000 +86659 -1.000000 +86660 -1.000000 +86661 -1.000000 +86662 -1.000000 +86663 -1.000000 +86664 -1.000000 +86665 -1.000000 +86666 -1.000000 +86667 -1.000000 +86668 -1.000000 +86669 -1.000000 +86670 -1.000000 +86671 -1.000000 +86672 -1.000000 +86674 -1.000000 +86675 -1.000000 +86676 -1.000000 +86677 -1.000000 +86678 -1.000000 +86679 -1.000000 +86680 -1.000000 +86681 -1.000000 +86682 -1.000000 +86683 -1.000000 +86684 -1.000000 +86685 -1.000000 +86686 -1.000000 +86687 -1.000000 +86688 -1.000000 +86689 -1.000000 +86690 -1.000000 +86691 -1.000000 +86692 -1.000000 +86693 -1.000000 +86694 -1.000000 +86695 -1.000000 +86696 -1.000000 +86697 -1.000000 +86698 -1.000000 +86699 -1.000000 +86700 -1.000000 +86701 -1.000000 +86702 -1.000000 +86703 -1.000000 +86704 -1.000000 +86705 -1.000000 +86706 -1.000000 +86707 -1.000000 +86708 -1.000000 +86709 -1.000000 +86710 -1.000000 +86711 -1.000000 +86712 -1.000000 +86713 -1.000000 +86714 -1.000000 +86715 -1.000000 +86716 -1.000000 +86717 -1.000000 +86718 -1.000000 +86719 -1.000000 +86720 -1.000000 +86721 -1.000000 +86722 -1.000000 +86723 -1.000000 +86724 -1.000000 +86725 -1.000000 +86726 -1.000000 +86727 -1.000000 +86728 -1.000000 +86729 -1.000000 +86730 -1.000000 +86731 -1.000000 +86732 -1.000000 +86733 -1.000000 +86734 -1.000000 +86735 -1.000000 +86736 -1.000000 +86737 -1.000000 +86738 -1.000000 +86739 -1.000000 +86740 -1.000000 +86741 -1.000000 +86742 -1.000000 +86743 -1.000000 +86744 -1.000000 +86745 -1.000000 +86746 -1.000000 +86747 -1.000000 +86748 -1.000000 +86749 -1.000000 +86750 -1.000000 +86751 -1.000000 +86752 -1.000000 +86753 -1.000000 +86754 -1.000000 +86755 -1.000000 +86756 -1.000000 +86757 -1.000000 +86758 -1.000000 +86759 -1.000000 +86760 -1.000000 +86761 -1.000000 +86762 -1.000000 +86763 -1.000000 +86764 -1.000000 +86765 -1.000000 +86766 -1.000000 +86767 -1.000000 +86768 -1.000000 +86769 -1.000000 +86770 -1.000000 +86771 -1.000000 +86772 -1.000000 +86773 -1.000000 +86774 -1.000000 +86775 -1.000000 +86776 -1.000000 +86777 -1.000000 +86778 -1.000000 +86779 -1.000000 +86780 -1.000000 +86781 -1.000000 +86782 -1.000000 +86783 -1.000000 +86784 -1.000000 +86786 -1.000000 +86787 -1.000000 +86788 -1.000000 +86789 -1.000000 +86790 -1.000000 +86791 -1.000000 +86792 -1.000000 +86793 -1.000000 +86794 -1.000000 +86795 -1.000000 +86796 -1.000000 +86797 -1.000000 +86798 -1.000000 +86799 -1.000000 +86800 -1.000000 +86801 -1.000000 +86802 -1.000000 +86803 -1.000000 +86804 -1.000000 +86805 -1.000000 +86806 -1.000000 +86807 -1.000000 +86808 -1.000000 +86809 -1.000000 +86810 -1.000000 +86811 -1.000000 +86812 -1.000000 +86813 -1.000000 +86814 -1.000000 +86815 -1.000000 +86816 -1.000000 +86817 -1.000000 +86818 -1.000000 +86819 -1.000000 +86820 -1.000000 +86821 -1.000000 +86822 -1.000000 +86823 -1.000000 +86824 -1.000000 +86825 -1.000000 +86826 -1.000000 +86827 -1.000000 +86828 -1.000000 +86829 -1.000000 +86830 -1.000000 +86831 -1.000000 +86832 -1.000000 +86833 -1.000000 +86834 -1.000000 +86835 -1.000000 +86836 -1.000000 +86837 -1.000000 +86838 -1.000000 +86839 -1.000000 +86840 -1.000000 +86841 -1.000000 +86842 -1.000000 +86843 -1.000000 +86844 -1.000000 +86845 -1.000000 +86846 -1.000000 +86847 -1.000000 +86848 -1.000000 +86849 -1.000000 +86850 -1.000000 +86851 -1.000000 +86852 -1.000000 +86853 -1.000000 +86854 -1.000000 +86855 -1.000000 +86856 -1.000000 +86857 -1.000000 +86858 -1.000000 +86859 -1.000000 +86860 -1.000000 +86861 -1.000000 +86862 -1.000000 +86863 -1.000000 +86864 -1.000000 +86865 -1.000000 +86866 -1.000000 +86867 -1.000000 +86868 -1.000000 +86869 -1.000000 +86870 -1.000000 +86871 -1.000000 +86872 -1.000000 +86873 -1.000000 +86874 -1.000000 +86875 -1.000000 +86876 -1.000000 +86877 -1.000000 +86878 -1.000000 +86879 -1.000000 +86880 -1.000000 +86881 -1.000000 +86882 -1.000000 +86883 -1.000000 +86884 -1.000000 +86885 -1.000000 +86886 -1.000000 +86887 -1.000000 +86888 -1.000000 +86889 -1.000000 +86890 -1.000000 +86891 -1.000000 +86892 -1.000000 +86893 -1.000000 +86894 -1.000000 +86895 -1.000000 +86896 -1.000000 +86897 -1.000000 +86898 -1.000000 +86899 -1.000000 +86900 -1.000000 +86901 -1.000000 +86902 -1.000000 +86903 -1.000000 +86904 -1.000000 +86905 -1.000000 +86906 -1.000000 +86907 -1.000000 +86908 -1.000000 +86909 -1.000000 +86910 -1.000000 +86911 -1.000000 +86912 -1.000000 +86913 -1.000000 +86914 -1.000000 +86915 -1.000000 +86916 -1.000000 +86917 -1.000000 +86918 -1.000000 +86919 -1.000000 +86920 -1.000000 +86921 -1.000000 +86922 -1.000000 +86923 -1.000000 +86924 -1.000000 +86925 -1.000000 +86926 -1.000000 +86927 -1.000000 +86928 -1.000000 +86929 -1.000000 +86930 -1.000000 +86931 -1.000000 +86932 -1.000000 +86933 -1.000000 +86934 -1.000000 +86935 -1.000000 +86936 -1.000000 +86937 -1.000000 +86938 -1.000000 +86939 -1.000000 +86940 -1.000000 +86941 -1.000000 +86942 -1.000000 +86943 -1.000000 +86944 -1.000000 +86945 -1.000000 +86946 -1.000000 +86947 -1.000000 +86948 -1.000000 +86949 -1.000000 +86950 -1.000000 +86951 -1.000000 +86952 -1.000000 +86953 -1.000000 +86954 -1.000000 +86955 -1.000000 +86956 -1.000000 +86957 -1.000000 +86959 -1.000000 +86960 -1.000000 +86961 -1.000000 +86962 -1.000000 +86963 -1.000000 +86964 -1.000000 +86965 -1.000000 +86966 -1.000000 +86967 -1.000000 +86968 -1.000000 +86969 -1.000000 +86970 -1.000000 +86971 -1.000000 +86972 -1.000000 +86973 -1.000000 +86974 -1.000000 +86975 -1.000000 +86976 -1.000000 +86977 -1.000000 +86978 -1.000000 +86979 -1.000000 +86980 -1.000000 +86981 -1.000000 +86982 -1.000000 +86983 -1.000000 +86984 -1.000000 +86985 -1.000000 +86986 -1.000000 +86987 -1.000000 +86988 -1.000000 +86989 -1.000000 +86990 -1.000000 +86991 -1.000000 +86992 -1.000000 +86993 -1.000000 +86994 -1.000000 +86995 -1.000000 +86996 -1.000000 +86997 -1.000000 +86998 -1.000000 +86999 -1.000000 +87000 -1.000000 +87001 -1.000000 +87002 -1.000000 +87003 -1.000000 +87004 -1.000000 +87005 -1.000000 +87006 -1.000000 +87007 -1.000000 +87008 -1.000000 +87009 -1.000000 +87010 -1.000000 +87011 -1.000000 +87012 -1.000000 +87013 -1.000000 +87014 -1.000000 +87015 -1.000000 +87016 -1.000000 +87017 -1.000000 +87018 -1.000000 +87019 -1.000000 +87020 -1.000000 +87021 -1.000000 +87022 -1.000000 +87023 -1.000000 +87024 -1.000000 +87025 -1.000000 +87026 -1.000000 +87027 -1.000000 +87028 -1.000000 +87029 -1.000000 +87030 -1.000000 +87031 -1.000000 +87032 -1.000000 +87033 -1.000000 +87034 -1.000000 +87035 -1.000000 +87036 -1.000000 +87037 -1.000000 +87038 -1.000000 +87039 -1.000000 +87040 -1.000000 +87041 -1.000000 +87042 -1.000000 +87043 -1.000000 +87044 -1.000000 +87045 -1.000000 +87046 -1.000000 +87047 -1.000000 +87048 -1.000000 +87049 -1.000000 +87050 -1.000000 +87051 -1.000000 +87052 -1.000000 +87053 -1.000000 +87054 -1.000000 +87055 -1.000000 +87056 -1.000000 +87057 -1.000000 +87058 -1.000000 +87059 -1.000000 +87060 -1.000000 +87061 -1.000000 +87062 -1.000000 +87063 -1.000000 +87064 -1.000000 +87065 -1.000000 +87066 -1.000000 +87067 -1.000000 +87068 -1.000000 +87069 -1.000000 +87070 -1.000000 +87071 -1.000000 +87072 -1.000000 +87073 -1.000000 +87074 -1.000000 +87075 -1.000000 +87076 -1.000000 +87077 -1.000000 +87078 -1.000000 +87079 -1.000000 +87080 -1.000000 +87081 -1.000000 +87082 -1.000000 +87083 -1.000000 +87084 -1.000000 +87085 -1.000000 +87086 -1.000000 +87087 -1.000000 +87088 -1.000000 +87089 -1.000000 +87090 -1.000000 +87091 -1.000000 +87092 -1.000000 +87093 -1.000000 +87094 -1.000000 +87095 -1.000000 +87096 -1.000000 +87097 -1.000000 +87098 -1.000000 +87099 -1.000000 +87100 -1.000000 +87101 -1.000000 +87102 -1.000000 +87103 -1.000000 +87104 -1.000000 +87105 -1.000000 +87106 -1.000000 +87107 -1.000000 +87108 -1.000000 +87109 -1.000000 +87110 -1.000000 +87111 -1.000000 +87112 -1.000000 +87113 -1.000000 +87114 -1.000000 +87115 -1.000000 +87116 -1.000000 +87117 -1.000000 +87118 -1.000000 +87119 -1.000000 +87120 -1.000000 +87121 -1.000000 +87122 -1.000000 +87123 -1.000000 +87124 -1.000000 +87125 -1.000000 +87126 -1.000000 +87127 -1.000000 +87128 -1.000000 +87129 -1.000000 +87130 -1.000000 +87131 -1.000000 +87132 -1.000000 +87133 -1.000000 +87134 -1.000000 +87135 -1.000000 +87136 -1.000000 +87137 -1.000000 +87138 -1.000000 +87139 -1.000000 +87140 -1.000000 +87141 -1.000000 +87142 -1.000000 +87143 -1.000000 +87144 -1.000000 +87145 -1.000000 +87146 -1.000000 +87147 -1.000000 +87148 -1.000000 +87149 -1.000000 +87150 -1.000000 +87151 -1.000000 +87152 -1.000000 +87153 -1.000000 +87154 -1.000000 +87155 -1.000000 +87156 -1.000000 +87157 -1.000000 +87158 -1.000000 +87159 -1.000000 +87160 -1.000000 +87161 -1.000000 +87162 -1.000000 +87163 -1.000000 +87164 -1.000000 +87165 -1.000000 +87166 -1.000000 +87167 -1.000000 +87168 -1.000000 +87169 -1.000000 +87170 -1.000000 +87171 -1.000000 +87172 -1.000000 +87173 -1.000000 +87174 -1.000000 +87175 -1.000000 +87176 -1.000000 +87177 -1.000000 +87178 -1.000000 +87179 -1.000000 +87180 -1.000000 +87181 -1.000000 +87182 -1.000000 +87183 -1.000000 +87184 -1.000000 +87185 -1.000000 +87186 -1.000000 +87187 -1.000000 +87188 -1.000000 +87189 -1.000000 +87190 -1.000000 +87191 -1.000000 +87192 -1.000000 +87193 -1.000000 +87194 -1.000000 +87195 -1.000000 +87196 -1.000000 +87197 -1.000000 +87198 -1.000000 +87199 -1.000000 +87200 -1.000000 +87201 -1.000000 +87202 -1.000000 +87203 -1.000000 +87204 -1.000000 +87205 -1.000000 +87206 -1.000000 +87207 -1.000000 +87208 -1.000000 +87209 -1.000000 +87210 -1.000000 +87211 -1.000000 +87212 -1.000000 +87213 -1.000000 +87214 -1.000000 +87215 -1.000000 +87216 -1.000000 +87217 -1.000000 +87218 -1.000000 +87219 -1.000000 +87220 -1.000000 +87221 -1.000000 +87222 -1.000000 +87223 -1.000000 +87224 -1.000000 +87225 -1.000000 +87226 -1.000000 +87227 -1.000000 +87228 -1.000000 +87229 -1.000000 +87230 -1.000000 +87231 -1.000000 +87232 -1.000000 +87233 -1.000000 +87234 -1.000000 +87235 -1.000000 +87236 -1.000000 +87237 -1.000000 +87238 -1.000000 +87239 -1.000000 +87240 -1.000000 +87241 -1.000000 +87242 -1.000000 +87243 -1.000000 +87244 -1.000000 +87245 -1.000000 +87246 -1.000000 +87247 -1.000000 +87248 -1.000000 +87249 -1.000000 +87250 -1.000000 +87251 -1.000000 +87252 -1.000000 +87253 -1.000000 +87254 -1.000000 +87264 -1.000000 +87265 -1.000000 +87266 -1.000000 +87267 -1.000000 +87268 -1.000000 +87269 -1.000000 +87270 -1.000000 +87271 -1.000000 +87272 -1.000000 +87273 -1.000000 +87274 -1.000000 +87275 -1.000000 +87276 -1.000000 +87277 -1.000000 +87278 -1.000000 +87279 -1.000000 +87280 -1.000000 +87281 -1.000000 +87282 -1.000000 +87283 -1.000000 +87284 -1.000000 +87285 -1.000000 +87286 -1.000000 +87287 -1.000000 +87288 -1.000000 +87289 -1.000000 +87290 -1.000000 +87291 -1.000000 +87292 -1.000000 +87293 -1.000000 +87294 -1.000000 +87295 -1.000000 +87296 -1.000000 +87297 -1.000000 +87298 -1.000000 +87299 -1.000000 +87300 -1.000000 +87301 -1.000000 +87302 -1.000000 +87303 -1.000000 +87304 -1.000000 +87305 -1.000000 +87306 -1.000000 +87307 -1.000000 +87308 -1.000000 +87309 -1.000000 +87310 -1.000000 +87311 -1.000000 +87312 -1.000000 +87313 -1.000000 +87314 -1.000000 +87315 -1.000000 +87316 -1.000000 +87317 -1.000000 +87318 -1.000000 +87319 -1.000000 +87321 -1.000000 +87322 -1.000000 +87323 -1.000000 +87324 -1.000000 +87325 -1.000000 +87326 -1.000000 +87327 -1.000000 +87328 -1.000000 +87329 -1.000000 +87330 -1.000000 +87331 -1.000000 +87332 -1.000000 +87333 -1.000000 +87334 -1.000000 +87335 -1.000000 +87336 -1.000000 +87337 -1.000000 +87338 -1.000000 +87339 -1.000000 +87340 -1.000000 +87341 -1.000000 +87342 -1.000000 +87343 -1.000000 +87344 -1.000000 +87345 -1.000000 +87346 -1.000000 +87347 -1.000000 +87348 -1.000000 +87349 -1.000000 +87350 -1.000000 +87351 -1.000000 +87352 -1.000000 +87353 -1.000000 +87354 -1.000000 +87355 -1.000000 +87356 -1.000000 +87357 -1.000000 +87358 -1.000000 +87359 -1.000000 +87360 -1.000000 +87361 -1.000000 +87363 -1.000000 +87364 -1.000000 +87365 -1.000000 +87366 -1.000000 +87367 -1.000000 +87368 -1.000000 +87369 -1.000000 +87370 -1.000000 +87371 -1.000000 +87372 -1.000000 +87373 -1.000000 +87374 -1.000000 +87375 -1.000000 +87376 -1.000000 +87377 -1.000000 +87378 -1.000000 +87379 -1.000000 +87380 -1.000000 +87381 -1.000000 +87382 -1.000000 +87383 -1.000000 +87384 -1.000000 +87385 -1.000000 +87386 -1.000000 +87387 -1.000000 +87388 -1.000000 +87389 -1.000000 +87390 -1.000000 +87391 -1.000000 +87392 -1.000000 +87393 -1.000000 +87394 -1.000000 +87395 -1.000000 +87396 -1.000000 +87397 -1.000000 +87398 -1.000000 +87399 -1.000000 +87400 -1.000000 +87401 -1.000000 +87402 -1.000000 +87403 -1.000000 +87404 -1.000000 +87405 -1.000000 +87406 -1.000000 +87407 -1.000000 +87408 -1.000000 +87409 -1.000000 +87410 -1.000000 +87411 -1.000000 +87412 -1.000000 +87413 -1.000000 +87414 -1.000000 +87415 -1.000000 +87416 -1.000000 +87417 -1.000000 +87418 -1.000000 +87419 -1.000000 +87420 -1.000000 +87421 -1.000000 +87422 -1.000000 +87423 -1.000000 +87424 -1.000000 +87425 -1.000000 +87426 -1.000000 +87427 -1.000000 +87428 -1.000000 +87429 -1.000000 +87430 -1.000000 +87431 -1.000000 +87432 -1.000000 +87433 -1.000000 +87434 -1.000000 +87435 -1.000000 +87436 -1.000000 +87437 -1.000000 +87438 -1.000000 +87439 -1.000000 +87440 -1.000000 +87441 -1.000000 +87442 -1.000000 +87443 -1.000000 +87444 -1.000000 +87445 -1.000000 +87446 -1.000000 +87447 -1.000000 +87448 -1.000000 +87449 -1.000000 +87450 -1.000000 +87451 -1.000000 +87452 -1.000000 +87453 -1.000000 +87454 -1.000000 +87455 -1.000000 +87456 -1.000000 +87457 -1.000000 +87458 -1.000000 +87459 -1.000000 +87460 -1.000000 +87461 -1.000000 +87462 -1.000000 +87463 -1.000000 +87464 -1.000000 +87465 -1.000000 +87466 -1.000000 +87467 -1.000000 +87468 -1.000000 +87469 -1.000000 +87470 -1.000000 +87471 -1.000000 +87472 -1.000000 +87473 -1.000000 +87474 -1.000000 +87475 -1.000000 +87476 -1.000000 +87477 -1.000000 +87478 -1.000000 +87479 -1.000000 +87480 -1.000000 +87481 -1.000000 +87482 -1.000000 +87483 -1.000000 +87484 -1.000000 +87485 -1.000000 +87486 -1.000000 +87487 -1.000000 +87488 -1.000000 +87489 -1.000000 +87490 -1.000000 +87491 -1.000000 +87492 -1.000000 +87493 -1.000000 +87494 -1.000000 +87495 -1.000000 +87496 -1.000000 +87497 -1.000000 +87498 -1.000000 +87499 -1.000000 +87500 -1.000000 +87501 -1.000000 +87502 -1.000000 +87503 -1.000000 +87504 -1.000000 +87505 -1.000000 +87506 -1.000000 +87507 -1.000000 +87508 -1.000000 +87509 -1.000000 +87510 -1.000000 +87511 -1.000000 +87512 -1.000000 +87513 -1.000000 +87514 -1.000000 +87515 -1.000000 +87516 -1.000000 +87517 -1.000000 +87518 -1.000000 +87519 -1.000000 +87520 -1.000000 +87521 -1.000000 +87522 -1.000000 +87523 -1.000000 +87524 -1.000000 +87525 -1.000000 +87526 -1.000000 +87527 -1.000000 +87528 -1.000000 +87529 -1.000000 +87530 -1.000000 +87531 -1.000000 +87532 -1.000000 +87533 -1.000000 +87534 -1.000000 +87535 -1.000000 +87536 -1.000000 +87537 -1.000000 +87538 -1.000000 +87539 -1.000000 +87540 -1.000000 +87541 -1.000000 +87542 -1.000000 +87543 -1.000000 +87544 -1.000000 +87545 -1.000000 +87546 -1.000000 +87547 -1.000000 +87548 -1.000000 +87549 -1.000000 +87550 -1.000000 +87551 -1.000000 +87552 -1.000000 +87553 -1.000000 +87554 -1.000000 +87555 -1.000000 +87556 -1.000000 +87557 -1.000000 +87558 -1.000000 +87559 -1.000000 +87560 -1.000000 +87561 -1.000000 +87562 -1.000000 +87563 -1.000000 +87564 -1.000000 +87565 -1.000000 +87566 -1.000000 +87567 -1.000000 +87568 -1.000000 +87569 -1.000000 +87570 -1.000000 +87571 -1.000000 +87572 -1.000000 +87573 -1.000000 +87574 -1.000000 +87575 -1.000000 +87576 -1.000000 +87577 -1.000000 +87578 -1.000000 +87579 -1.000000 +87580 -1.000000 +87581 -1.000000 +87582 -1.000000 +87583 -1.000000 +87584 -1.000000 +87585 -1.000000 +87586 -1.000000 +87587 -1.000000 +87588 -1.000000 +87589 -1.000000 +87590 -1.000000 +87591 -1.000000 +87592 -1.000000 +87593 -1.000000 +87594 -1.000000 +87595 -1.000000 +87596 -1.000000 +87597 -1.000000 +87598 -1.000000 +87599 -1.000000 +87600 -1.000000 +87601 -1.000000 +87602 -1.000000 +87603 -1.000000 +87604 -1.000000 +87605 -1.000000 +87606 -1.000000 +87607 -1.000000 +87608 -1.000000 +87609 -1.000000 +87610 -1.000000 +87611 -1.000000 +87612 -1.000000 +87613 -1.000000 +87614 -1.000000 +87615 -1.000000 +87616 -1.000000 +87617 -1.000000 +87618 -1.000000 +87619 -1.000000 +87620 -1.000000 +87621 -1.000000 +87622 -1.000000 +87623 -1.000000 +87624 -1.000000 +87625 -1.000000 +87626 -1.000000 +87627 -1.000000 +87628 -1.000000 +87629 -1.000000 +87630 -1.000000 +87631 -1.000000 +87632 -1.000000 +87633 -1.000000 +87634 -1.000000 +87635 -1.000000 +87636 -1.000000 +87637 -1.000000 +87638 -1.000000 +87639 -1.000000 +87640 -1.000000 +87641 -1.000000 +87642 -1.000000 +87643 -1.000000 +87644 -1.000000 +87645 -1.000000 +87646 -1.000000 +87647 -1.000000 +87648 -1.000000 +87649 -1.000000 +87650 -1.000000 +87651 -1.000000 +87652 -1.000000 +87653 -1.000000 +87654 -1.000000 +87655 -1.000000 +87656 -1.000000 +87657 -1.000000 +87658 -1.000000 +87659 -1.000000 +87660 -1.000000 +87661 -1.000000 +87662 -1.000000 +87663 -1.000000 +87664 -1.000000 +87665 -1.000000 +87666 -1.000000 +87667 -1.000000 +87668 -1.000000 +87669 -1.000000 +87670 -1.000000 +87671 -1.000000 +87672 -1.000000 +87673 -1.000000 +87674 -1.000000 +87675 -1.000000 +87676 -1.000000 +87677 -1.000000 +87678 -1.000000 +87679 -1.000000 +87680 -1.000000 +87681 -1.000000 +87682 -1.000000 +87683 -1.000000 +87684 -1.000000 +87685 -1.000000 +87686 -1.000000 +87687 -1.000000 +87688 -1.000000 +87689 -1.000000 +87690 -1.000000 +87691 -1.000000 +87692 -1.000000 +87693 -1.000000 +87694 -1.000000 +87695 -1.000000 +87696 -1.000000 +87697 -1.000000 +87698 -1.000000 +87699 -1.000000 +87700 -1.000000 +87701 -1.000000 +87702 -1.000000 +87703 -1.000000 +87704 -1.000000 +87705 -1.000000 +87706 -1.000000 +87707 -1.000000 +87708 -1.000000 +87709 -1.000000 +87710 -1.000000 +87712 -1.000000 +87713 -1.000000 +87714 -1.000000 +87715 -1.000000 +87716 -1.000000 +87717 -1.000000 +87718 -1.000000 +87719 -1.000000 +87720 -1.000000 +87721 -1.000000 +87722 -1.000000 +87723 -1.000000 +87724 -1.000000 +87725 -1.000000 +87726 -1.000000 +87727 -1.000000 +87728 -1.000000 +87729 -1.000000 +87730 -1.000000 +87731 -1.000000 +87732 -1.000000 +87733 -1.000000 +87734 -1.000000 +87735 -1.000000 +87736 -1.000000 +87737 -1.000000 +87738 -1.000000 +87739 -1.000000 +87740 -1.000000 +87741 -1.000000 +87742 -1.000000 +87743 -1.000000 +87744 -1.000000 +87745 -1.000000 +87746 -1.000000 +87747 -1.000000 +87748 -1.000000 +87749 -1.000000 +87750 -1.000000 +87751 -1.000000 +87752 -1.000000 +87753 -1.000000 +87754 -1.000000 +87755 -1.000000 +87756 -1.000000 +87757 -1.000000 +87758 -1.000000 +87759 -1.000000 +87760 -1.000000 +87761 -1.000000 +87762 -1.000000 +87763 -1.000000 +87764 -1.000000 +87765 -1.000000 +87766 -1.000000 +87767 -1.000000 +87768 -1.000000 +87769 -1.000000 +87770 -1.000000 +87771 -1.000000 +87772 -1.000000 +87773 -1.000000 +87774 -1.000000 +87775 -1.000000 +87776 -1.000000 +87777 -1.000000 +87778 -1.000000 +87779 -1.000000 +87780 -1.000000 +87781 -1.000000 +87782 -1.000000 +87783 -1.000000 +87784 -1.000000 +87785 -1.000000 +87786 -1.000000 +87787 -1.000000 +87788 -1.000000 +87789 -1.000000 +87790 -1.000000 +87791 -1.000000 +87792 -1.000000 +87793 -1.000000 +87794 -1.000000 +87795 -1.000000 +87796 -1.000000 +87797 -1.000000 +87798 -1.000000 +87799 -1.000000 +87800 -1.000000 +87801 -1.000000 +87802 -1.000000 +87803 -1.000000 +87804 -1.000000 +87805 -1.000000 +87806 -1.000000 +87807 -1.000000 +87808 -1.000000 +87809 -1.000000 +87810 -1.000000 +87811 -1.000000 +87812 -1.000000 +87813 -1.000000 +87814 -1.000000 +87815 -1.000000 +87816 -1.000000 +87817 -1.000000 +87818 -1.000000 +87819 -1.000000 +87820 -1.000000 +87821 -1.000000 +87822 -1.000000 +87823 -1.000000 +87824 -1.000000 +87825 -1.000000 +87826 -1.000000 +87827 -1.000000 +87828 -1.000000 +87829 -1.000000 +87830 -1.000000 +87831 -1.000000 +87832 -1.000000 +87833 -1.000000 +87834 -1.000000 +87835 -1.000000 +87836 -1.000000 +87837 -1.000000 +87838 -1.000000 +87839 -1.000000 +87840 -1.000000 +87841 -1.000000 +87842 -1.000000 +87843 -1.000000 +87844 -1.000000 +87845 -1.000000 +87846 -1.000000 +87847 -1.000000 +87848 -1.000000 +87849 -1.000000 +87850 -1.000000 +87851 -1.000000 +87852 -1.000000 +87853 -1.000000 +87854 -1.000000 +87855 -1.000000 +87856 -1.000000 +87857 -1.000000 +87859 -1.000000 +87860 -1.000000 +87861 -1.000000 +87862 -1.000000 +87863 -1.000000 +87864 -1.000000 +87865 -1.000000 +87866 -1.000000 +87867 -1.000000 +87868 -1.000000 +87869 -1.000000 +87870 -1.000000 +87871 -1.000000 +87872 -1.000000 +87873 -1.000000 +87874 -1.000000 +87875 -1.000000 +87876 -1.000000 +87877 -1.000000 +87878 -1.000000 +87879 -1.000000 +87880 -1.000000 +87881 -1.000000 +87882 -1.000000 +87883 -1.000000 +87884 -1.000000 +87885 -1.000000 +87886 -1.000000 +87887 -1.000000 +87888 -1.000000 +87889 -1.000000 +87890 -1.000000 +87891 -1.000000 +87892 -1.000000 +87893 -1.000000 +87894 -1.000000 +87895 -1.000000 +87896 -1.000000 +87897 -1.000000 +87898 -1.000000 +87899 -1.000000 +87900 -1.000000 +87901 -1.000000 +87902 -1.000000 +87904 -1.000000 +87905 -1.000000 +87906 -1.000000 +87907 -1.000000 +87908 -1.000000 +87909 -1.000000 +87910 -1.000000 +87911 -1.000000 +87912 -1.000000 +87913 -1.000000 +87914 -1.000000 +87915 -1.000000 +87916 -1.000000 +87917 -1.000000 +87918 -1.000000 +87919 -1.000000 +87920 -1.000000 +87921 -1.000000 +87922 -1.000000 +87923 -1.000000 +87924 -1.000000 +87925 -1.000000 +87926 -1.000000 +87927 -1.000000 +87928 -1.000000 +87929 -1.000000 +87930 -1.000000 +87931 -1.000000 +87932 -1.000000 +87933 -1.000000 +87934 -1.000000 +87935 -1.000000 +87936 -1.000000 +87937 -1.000000 +87938 -1.000000 +87939 -1.000000 +87940 -1.000000 +87941 -1.000000 +87942 -1.000000 +87943 -1.000000 +87944 -1.000000 +87945 -1.000000 +87946 -1.000000 +87947 -1.000000 +87948 -1.000000 +87949 -1.000000 +87950 -1.000000 +87951 -1.000000 +87952 -1.000000 +87953 -1.000000 +87954 -1.000000 +87955 -1.000000 +87956 -1.000000 +87957 -1.000000 +87958 -1.000000 +87959 -1.000000 +87960 -1.000000 +87961 -1.000000 +87962 -1.000000 +87963 -1.000000 +87964 -1.000000 +87965 -1.000000 +87966 -1.000000 +87968 -1.000000 +87969 -1.000000 +87970 -1.000000 +87971 -1.000000 +87972 -1.000000 +87973 -1.000000 +87974 -1.000000 +87975 -1.000000 +87976 -1.000000 +87977 -1.000000 +87978 -1.000000 +87979 -1.000000 +87980 -1.000000 +87981 -1.000000 +87982 -1.000000 +87983 -1.000000 +87984 -1.000000 +87985 -1.000000 +87986 -1.000000 +87987 -1.000000 +87988 -1.000000 +87989 -1.000000 +87990 -1.000000 +87991 -1.000000 +87992 -1.000000 +87993 -1.000000 +87994 -1.000000 +87995 -1.000000 +87996 -1.000000 +87997 -1.000000 +87998 -1.000000 +87999 -1.000000 +88000 -1.000000 +88001 -1.000000 +88002 -1.000000 +88003 -1.000000 +88004 -1.000000 +88005 -1.000000 +88006 -1.000000 +88007 -1.000000 +88008 -1.000000 +88009 -1.000000 +88010 -1.000000 +88011 -1.000000 +88012 -1.000000 +88013 -1.000000 +88014 -1.000000 +88015 -1.000000 +88016 -1.000000 +88017 -1.000000 +88018 -1.000000 +88019 -1.000000 +88020 -1.000000 +88021 -1.000000 +88022 -1.000000 +88023 -1.000000 +88024 -1.000000 +88025 -1.000000 +88026 -1.000000 +88027 -1.000000 +88028 -1.000000 +88029 -1.000000 +88030 -1.000000 +88031 -1.000000 +88032 -1.000000 +88033 -1.000000 +88034 -1.000000 +88035 -1.000000 +88036 -1.000000 +88037 -1.000000 +88038 -1.000000 +88039 -1.000000 +88040 -1.000000 +88041 -1.000000 +88042 -1.000000 +88043 -1.000000 +88044 -1.000000 +88045 -1.000000 +88046 -1.000000 +88047 -1.000000 +88048 -1.000000 +88049 -1.000000 +88050 -1.000000 +88051 -1.000000 +88052 -1.000000 +88053 -1.000000 +88054 -1.000000 +88055 -1.000000 +88056 -1.000000 +88057 -1.000000 +88058 -1.000000 +88059 -1.000000 +88060 -1.000000 +88061 -1.000000 +88062 -1.000000 +88063 -1.000000 +88064 -1.000000 +88065 -1.000000 +88066 -1.000000 +88067 -1.000000 +88069 -1.000000 +88070 -1.000000 +88071 -1.000000 +88072 -1.000000 +88073 -1.000000 +88074 -1.000000 +88075 -1.000000 +88076 -1.000000 +88077 -1.000000 +88078 -1.000000 +88079 -1.000000 +88080 -1.000000 +88081 -1.000000 +88082 -1.000000 +88083 -1.000000 +88084 -1.000000 +88085 -1.000000 +88086 -1.000000 +88087 -1.000000 +88088 -1.000000 +88089 -1.000000 +88090 -1.000000 +88091 -1.000000 +88092 -1.000000 +88093 -1.000000 +88094 -1.000000 +88095 -1.000000 +88096 -1.000000 +88097 -1.000000 +88098 -1.000000 +88099 -1.000000 +88100 -1.000000 +88101 -1.000000 +88102 -1.000000 +88103 -1.000000 +88104 -1.000000 +88105 -1.000000 +88106 -1.000000 +88107 -1.000000 +88108 -1.000000 +88109 -1.000000 +88110 -1.000000 +88111 -1.000000 +88112 -1.000000 +88113 -1.000000 +88114 -1.000000 +88115 -1.000000 +88116 -1.000000 +88117 -1.000000 +88118 -1.000000 +88119 -1.000000 +88120 -1.000000 +88121 -1.000000 +88122 -1.000000 +88123 -1.000000 +88124 -1.000000 +88125 -1.000000 +88126 -1.000000 +88127 -1.000000 +88128 -1.000000 +88129 -1.000000 +88130 -1.000000 +88131 -1.000000 +88132 -1.000000 +88134 -1.000000 +88135 -1.000000 +88136 -1.000000 +88137 -1.000000 +88138 -1.000000 +88139 -1.000000 +88140 -1.000000 +88141 -1.000000 +88142 -1.000000 +88143 -1.000000 +88144 -1.000000 +88145 -1.000000 +88146 -1.000000 +88147 -1.000000 +88148 -1.000000 +88149 -1.000000 +88150 -1.000000 +88151 -1.000000 +88152 -1.000000 +88153 -1.000000 +88154 -1.000000 +88155 -1.000000 +88156 -1.000000 +88157 -1.000000 +88158 -1.000000 +88159 -1.000000 +88160 -1.000000 +88161 -1.000000 +88162 -1.000000 +88163 -1.000000 +88164 -1.000000 +88165 -1.000000 +88166 -1.000000 +88167 -1.000000 +88168 -1.000000 +88169 -1.000000 +88170 -1.000000 +88171 -1.000000 +88172 -1.000000 +88173 -1.000000 +88174 -1.000000 +88175 -1.000000 +88176 -1.000000 +88177 -1.000000 +88178 -1.000000 +88179 -1.000000 +88180 -1.000000 +88181 -1.000000 +88182 -1.000000 +88183 -1.000000 +88185 -1.000000 +88186 -1.000000 +88187 -1.000000 +88188 -1.000000 +88189 -1.000000 +88190 -1.000000 +88191 -1.000000 +88192 -1.000000 +88193 -1.000000 +88194 -1.000000 +88195 -1.000000 +88196 -1.000000 +88197 -1.000000 +88198 -1.000000 +88199 -1.000000 +88200 -1.000000 +88201 -1.000000 +88202 -1.000000 +88203 -1.000000 +88204 -1.000000 +88205 -1.000000 +88206 -1.000000 +88207 -1.000000 +88208 -1.000000 +88209 -1.000000 +88210 -1.000000 +88211 -1.000000 +88212 -1.000000 +88213 -1.000000 +88214 -1.000000 +88215 -1.000000 +88216 -1.000000 +88217 -1.000000 +88218 -1.000000 +88219 -1.000000 +88220 -1.000000 +88221 -1.000000 +88222 -1.000000 +88223 -1.000000 +88224 -1.000000 +88225 -1.000000 +88226 -1.000000 +88227 -1.000000 +88228 -1.000000 +88229 -1.000000 +88230 -1.000000 +88231 -1.000000 +88232 -1.000000 +88233 -1.000000 +88234 -1.000000 +88235 -1.000000 +88237 -1.000000 +88238 -1.000000 +88239 -1.000000 +88240 -1.000000 +88241 -1.000000 +88242 -1.000000 +88243 -1.000000 +88244 -1.000000 +88245 -1.000000 +88246 -1.000000 +88247 -1.000000 +88248 -1.000000 +88249 -1.000000 +88250 -1.000000 +88251 -1.000000 +88252 -1.000000 +88253 -1.000000 +88254 -1.000000 +88255 -1.000000 +88256 -1.000000 +88257 -1.000000 +88258 -1.000000 +88259 -1.000000 +88260 -1.000000 +88261 -1.000000 +88262 -1.000000 +88263 -1.000000 +88264 -1.000000 +88265 -1.000000 +88266 -1.000000 +88267 -1.000000 +88268 -1.000000 +88269 -1.000000 +88270 -1.000000 +88272 -1.000000 +88273 -1.000000 +88274 -1.000000 +88275 -1.000000 +88276 -1.000000 +88277 -1.000000 +88278 -1.000000 +88279 -1.000000 +88280 -1.000000 +88281 -1.000000 +88282 -1.000000 +88283 -1.000000 +88284 -1.000000 +88285 -1.000000 +88286 -1.000000 +88287 -1.000000 +88288 -1.000000 +88289 -1.000000 +88290 -1.000000 +88291 -1.000000 +88292 -1.000000 +88293 -1.000000 +88294 -1.000000 +88295 -1.000000 +88296 -1.000000 +88297 -1.000000 +88298 -1.000000 +88299 -1.000000 +88300 -1.000000 +88301 -1.000000 +88302 -1.000000 +88303 -1.000000 +88304 -1.000000 +88305 -1.000000 +88306 -1.000000 +88307 -1.000000 +88308 -1.000000 +88309 -1.000000 +88310 -1.000000 +88311 -1.000000 +88312 -1.000000 +88313 -1.000000 +88314 -1.000000 +88315 -1.000000 +88316 -1.000000 +88317 -1.000000 +88318 -1.000000 +88319 -1.000000 +88320 -1.000000 +88321 -1.000000 +88322 -1.000000 +88323 -1.000000 +88324 -1.000000 +88325 -1.000000 +88326 -1.000000 +88327 -1.000000 +88328 -1.000000 +88329 -1.000000 +88330 -1.000000 +88331 -1.000000 +88332 -1.000000 +88333 -1.000000 +88334 -1.000000 +88335 -1.000000 +88336 -1.000000 +88337 -1.000000 +88338 -1.000000 +88339 -1.000000 +88340 -1.000000 +88341 -1.000000 +88342 -1.000000 +88343 -1.000000 +88344 -1.000000 +88345 -1.000000 +88346 -1.000000 +88347 -1.000000 +88348 -1.000000 +88349 -1.000000 +88350 -1.000000 +88351 -1.000000 +88352 -1.000000 +88353 -1.000000 +88354 -1.000000 +88355 -1.000000 +88356 -1.000000 +88357 -1.000000 +88358 -1.000000 +88359 -1.000000 +88360 -1.000000 +88361 -1.000000 +88362 -1.000000 +88363 -1.000000 +88364 -1.000000 +88365 -1.000000 +88366 -1.000000 +88367 -1.000000 +88368 -1.000000 +88369 -1.000000 +88370 -1.000000 +88371 -1.000000 +88372 -1.000000 +88373 -1.000000 +88374 -1.000000 +88375 -1.000000 +88376 -1.000000 +88377 -1.000000 +88378 -1.000000 +88379 -1.000000 +88380 -1.000000 +88381 -1.000000 +88383 -1.000000 +88384 -1.000000 +88385 -1.000000 +88386 -1.000000 +88387 -1.000000 +88388 -1.000000 +88389 -1.000000 +88390 -1.000000 +88391 -1.000000 +88392 -1.000000 +88393 -1.000000 +88394 -1.000000 +88395 -1.000000 +88396 -1.000000 +88397 -1.000000 +88398 -1.000000 +88399 -1.000000 +88400 -1.000000 +88401 -1.000000 +88402 -1.000000 +88403 -1.000000 +88404 -1.000000 +88405 -1.000000 +88406 -1.000000 +88407 -1.000000 +88408 -1.000000 +88409 -1.000000 +88410 -1.000000 +88411 -1.000000 +88412 -1.000000 +88413 -1.000000 +88414 -1.000000 +88415 -1.000000 +88416 -1.000000 +88417 -1.000000 +88418 -1.000000 +88419 -1.000000 +88420 -1.000000 +88421 -1.000000 +88422 -1.000000 +88423 -1.000000 +88424 -1.000000 +88425 -1.000000 +88426 -1.000000 +88427 -1.000000 +88428 -1.000000 +88429 -1.000000 +88430 -1.000000 +88431 -1.000000 +88432 -1.000000 +88433 -1.000000 +88434 -1.000000 +88435 -1.000000 +88436 -1.000000 +88437 -1.000000 +88438 -1.000000 +88439 -1.000000 +88440 -1.000000 +88441 -1.000000 +88442 -1.000000 +88443 -1.000000 +88444 -1.000000 +88445 -1.000000 +88446 -1.000000 +88447 -1.000000 +88448 -1.000000 +88449 -1.000000 +88450 -1.000000 +88451 -1.000000 +88452 -1.000000 +88453 -1.000000 +88454 -1.000000 +88455 -1.000000 +88456 -1.000000 +88457 -1.000000 +88458 -1.000000 +88459 -1.000000 +88460 -1.000000 +88461 -1.000000 +88462 -1.000000 +88463 -1.000000 +88464 -1.000000 +88465 -1.000000 +88466 -1.000000 +88467 -1.000000 +88468 -1.000000 +88469 -1.000000 +88470 -1.000000 +88471 -1.000000 +88472 -1.000000 +88473 -1.000000 +88474 -1.000000 +88475 -1.000000 +88476 -1.000000 +88477 -1.000000 +88478 -1.000000 +88479 -1.000000 +88480 -1.000000 +88481 -1.000000 +88482 -1.000000 +88483 -1.000000 +88484 -1.000000 +88485 -1.000000 +88486 -1.000000 +88487 -1.000000 +88488 -1.000000 +88489 -1.000000 +88490 -1.000000 +88491 -1.000000 +88492 -1.000000 +88493 -1.000000 +88494 -1.000000 +88495 -1.000000 +88496 -1.000000 +88497 -1.000000 +88498 -1.000000 +88499 -1.000000 +88500 -1.000000 +88501 -1.000000 +88502 -1.000000 +88503 -1.000000 +88504 -1.000000 +88505 -1.000000 +88506 -1.000000 +88507 -1.000000 +88508 -1.000000 +88509 -1.000000 +88510 -1.000000 +88511 -1.000000 +88512 -1.000000 +88513 -1.000000 +88514 -1.000000 +88515 -1.000000 +88516 -1.000000 +88517 -1.000000 +88518 -1.000000 +88519 -1.000000 +88520 -1.000000 +88521 -1.000000 +88522 -1.000000 +88523 -1.000000 +88524 -1.000000 +88525 -1.000000 +88526 -1.000000 +88527 -1.000000 +88528 -1.000000 +88529 -1.000000 +88530 -1.000000 +88531 -1.000000 +88532 -1.000000 +88533 -1.000000 +88534 -1.000000 +88535 -1.000000 +88536 -1.000000 +88537 -1.000000 +88538 -1.000000 +88539 -1.000000 +88540 -1.000000 +88541 -1.000000 +88542 -1.000000 +88543 -1.000000 +88545 -1.000000 +88546 -1.000000 +88547 -1.000000 +88548 -1.000000 +88549 -1.000000 +88550 -1.000000 +88551 -1.000000 +88552 -1.000000 +88553 -1.000000 +88554 -1.000000 +88555 -1.000000 +88556 -1.000000 +88557 -1.000000 +88558 -1.000000 +88559 -1.000000 +88560 -1.000000 +88561 -1.000000 +88562 -1.000000 +88563 -1.000000 +88564 -1.000000 +88565 -1.000000 +88566 -1.000000 +88567 -1.000000 +88568 -1.000000 +88569 -1.000000 +88570 -1.000000 +88571 -1.000000 +88572 -1.000000 +88573 -1.000000 +88574 -1.000000 +88575 -1.000000 +88576 -1.000000 +88577 -1.000000 +88578 -1.000000 +88579 -1.000000 +88580 -1.000000 +88581 -1.000000 +88582 -1.000000 +88583 -1.000000 +88584 -1.000000 +88585 -1.000000 +88586 -1.000000 +88587 -1.000000 +88588 -1.000000 +88589 -1.000000 +88590 -1.000000 +88591 -1.000000 +88592 -1.000000 +88593 -1.000000 +88594 -1.000000 +88595 -1.000000 +88596 -1.000000 +88597 -1.000000 +88598 -1.000000 +88599 -1.000000 +88600 -1.000000 +88601 -1.000000 +88602 -1.000000 +88603 -1.000000 +88604 -1.000000 +88605 -1.000000 +88606 -1.000000 +88607 -1.000000 +88609 -1.000000 +88610 -1.000000 +88611 -1.000000 +88612 -1.000000 +88613 -1.000000 +88614 -1.000000 +88615 -1.000000 +88616 -1.000000 +88617 -1.000000 +88618 -1.000000 +88619 -1.000000 +88620 -1.000000 +88621 -1.000000 +88622 -1.000000 +88623 -1.000000 +88624 -1.000000 +88625 -1.000000 +88626 -1.000000 +88627 -1.000000 +88628 -1.000000 +88629 -1.000000 +88630 -1.000000 +88631 -1.000000 +88632 -1.000000 +88633 -1.000000 +88634 -1.000000 +88635 -1.000000 +88636 -1.000000 +88637 -1.000000 +88638 -1.000000 +88639 -1.000000 +88640 -1.000000 +88641 -1.000000 +88642 -1.000000 +88643 -1.000000 +88644 -1.000000 +88645 -1.000000 +88646 -1.000000 +88647 -1.000000 +88649 -1.000000 +88650 -1.000000 +88651 -1.000000 +88652 -1.000000 +88653 -1.000000 +88654 -1.000000 +88655 -1.000000 +88656 -1.000000 +88657 -1.000000 +88658 -1.000000 +88659 -1.000000 +88660 -1.000000 +88661 -1.000000 +88662 -1.000000 +88663 -1.000000 +88664 -1.000000 +88665 -1.000000 +88666 -1.000000 +88667 -1.000000 +88668 -1.000000 +88669 -1.000000 +88670 -1.000000 +88671 -1.000000 +88672 -1.000000 +88673 -1.000000 +88674 -1.000000 +88675 -1.000000 +88676 -1.000000 +88677 -1.000000 +88678 -1.000000 +88679 -1.000000 +88680 -1.000000 +88681 -1.000000 +88682 -1.000000 +88683 -1.000000 +88684 -1.000000 +88685 -1.000000 +88686 -1.000000 +88687 -1.000000 +88688 -1.000000 +88689 -1.000000 +88690 -1.000000 +88691 -1.000000 +88692 -1.000000 +88693 -1.000000 +88694 -1.000000 +88695 -1.000000 +88696 -1.000000 +88697 -1.000000 +88698 -1.000000 +88699 -1.000000 +88700 -1.000000 +88701 -1.000000 +88702 -1.000000 +88703 -1.000000 +88704 -1.000000 +88705 -1.000000 +88706 -1.000000 +88707 -1.000000 +88708 -1.000000 +88709 -1.000000 +88710 -1.000000 +88711 -1.000000 +88712 -1.000000 +88713 -1.000000 +88714 -1.000000 +88715 -1.000000 +88716 -1.000000 +88717 -1.000000 +88718 -1.000000 +88719 -1.000000 +88720 -1.000000 +88721 -1.000000 +88722 -1.000000 +88723 -1.000000 +88724 -1.000000 +88725 -1.000000 +88726 -1.000000 +88727 -1.000000 +88728 -1.000000 +88729 -1.000000 +88730 -1.000000 +88731 -1.000000 +88732 -1.000000 +88733 -1.000000 +88734 -1.000000 +88735 -1.000000 +88736 -1.000000 +88737 -1.000000 +88738 -1.000000 +88739 -1.000000 +88740 -1.000000 +88741 -1.000000 +88742 -1.000000 +88743 -1.000000 +88744 -1.000000 +88745 -1.000000 +88746 -1.000000 +88747 -1.000000 +88748 -1.000000 +88749 -1.000000 +88750 -1.000000 +88751 -1.000000 +88752 -1.000000 +88753 -1.000000 +88754 -1.000000 +88755 -1.000000 +88756 -1.000000 +88757 -1.000000 +88758 -1.000000 +88759 -1.000000 +88760 -1.000000 +88761 -1.000000 +88762 -1.000000 +88763 -1.000000 +88764 -1.000000 +88765 -1.000000 +88766 -1.000000 +88767 -1.000000 +88768 -1.000000 +88769 -1.000000 +88770 -1.000000 +88771 -1.000000 +88772 -1.000000 +88773 -1.000000 +88774 -1.000000 +88775 -1.000000 +88776 -1.000000 +88777 -1.000000 +88778 -1.000000 +88779 -1.000000 +88780 -1.000000 +88781 -1.000000 +88782 -1.000000 +88783 -1.000000 +88784 -1.000000 +88785 -1.000000 +88786 -1.000000 +88787 -1.000000 +88788 -1.000000 +88789 -1.000000 +88790 -1.000000 +88791 -1.000000 +88792 -1.000000 +88793 -1.000000 +88794 -1.000000 +88795 -1.000000 +88796 -1.000000 +88797 -1.000000 +88798 -1.000000 +88799 -1.000000 +88800 -1.000000 +88801 -1.000000 +88802 -1.000000 +88803 -1.000000 +88804 -1.000000 +88805 -1.000000 +88806 -1.000000 +88807 -1.000000 +88808 -1.000000 +88809 -1.000000 +88810 -1.000000 +88811 -1.000000 +88812 -1.000000 +88813 -1.000000 +88814 -1.000000 +88815 -1.000000 +88816 -1.000000 +88817 -1.000000 +88818 -1.000000 +88819 -1.000000 +88820 -1.000000 +88821 -1.000000 +88822 -1.000000 +88823 -1.000000 +88824 -1.000000 +88825 -1.000000 +88826 -1.000000 +88827 -1.000000 +88828 -1.000000 +88829 -1.000000 +88830 -1.000000 +88831 -1.000000 +88832 -1.000000 +88833 -1.000000 +88834 -1.000000 +88835 -1.000000 +88836 -1.000000 +88837 -1.000000 +88838 -1.000000 +88839 -1.000000 +88840 -1.000000 +88841 -1.000000 +88842 -1.000000 +88843 -1.000000 +88844 -1.000000 +88845 -1.000000 +88846 -1.000000 +88847 -1.000000 +88848 -1.000000 +88849 -1.000000 +88850 -1.000000 +88851 -1.000000 +88852 -1.000000 +88853 -1.000000 +88854 -1.000000 +88855 -1.000000 +88856 -1.000000 +88857 -1.000000 +88858 -1.000000 +88859 -1.000000 +88860 -1.000000 +88861 -1.000000 +88862 -1.000000 +88863 -1.000000 +88864 -1.000000 +88865 -1.000000 +88866 -1.000000 +88867 -1.000000 +88869 -1.000000 +88870 -1.000000 +88871 -1.000000 +88872 -1.000000 +88873 -1.000000 +88874 -1.000000 +88875 -1.000000 +88876 -1.000000 +88877 -1.000000 +88878 -1.000000 +88879 -1.000000 +88880 -1.000000 +88881 -1.000000 +88882 -1.000000 +88883 -1.000000 +88884 -1.000000 +88885 -1.000000 +88886 -1.000000 +88887 -1.000000 +88888 -1.000000 +88889 -1.000000 +88890 -1.000000 +88891 -1.000000 +88892 -1.000000 +88893 -1.000000 +88894 -1.000000 +88895 -1.000000 +88896 -1.000000 +88897 -1.000000 +88898 -1.000000 +88899 -1.000000 +88900 -1.000000 +88901 -1.000000 +88902 -1.000000 +88903 -1.000000 +88904 -1.000000 +88905 -1.000000 +88906 -1.000000 +88907 -1.000000 +88908 -1.000000 +88909 -1.000000 +88910 -1.000000 +88911 -1.000000 +88912 -1.000000 +88913 -1.000000 +88914 -1.000000 +88915 -1.000000 +88916 -1.000000 +88917 -1.000000 +88918 -1.000000 +88919 -1.000000 +88920 -1.000000 +88921 -1.000000 +88922 -1.000000 +88923 -1.000000 +88924 -1.000000 +88925 -1.000000 +88926 -1.000000 +88927 -1.000000 +88928 -1.000000 +88929 -1.000000 +88930 -1.000000 +88931 -1.000000 +88932 -1.000000 +88933 -1.000000 +88934 -1.000000 +88935 -1.000000 +88936 -1.000000 +88937 -1.000000 +88938 -1.000000 +88939 -1.000000 +88940 -1.000000 +88941 -1.000000 +88942 -1.000000 +88943 -1.000000 +88944 -1.000000 +88945 -1.000000 +88946 -1.000000 +88947 -1.000000 +88948 -1.000000 +88949 -1.000000 +88950 -1.000000 +88951 -1.000000 +88952 -1.000000 +88953 -1.000000 +88954 -1.000000 +88955 -1.000000 +88956 -1.000000 +88957 -1.000000 +88958 -1.000000 +88959 -1.000000 +88960 -1.000000 +88961 -1.000000 +88962 -1.000000 +88963 -1.000000 +88964 -1.000000 +88965 -1.000000 +88966 -1.000000 +88967 -1.000000 +88968 -1.000000 +88969 -1.000000 +88970 -1.000000 +88971 -1.000000 +88972 -1.000000 +88973 -1.000000 +88974 -1.000000 +88975 -1.000000 +88976 -1.000000 +88977 -1.000000 +88978 -1.000000 +88979 -1.000000 +88980 -1.000000 +88981 -1.000000 +88982 -1.000000 +88983 -1.000000 +88984 -1.000000 +88985 -1.000000 +88986 -1.000000 +88987 -1.000000 +88988 -1.000000 +88989 -1.000000 +88990 -1.000000 +88991 -1.000000 +88992 -1.000000 +88993 -1.000000 +88994 -1.000000 +88995 -1.000000 +88996 -1.000000 +88997 -1.000000 +88998 -1.000000 +88999 -1.000000 +89000 -1.000000 +89001 -1.000000 +89002 -1.000000 +89003 -1.000000 +89004 -1.000000 +89005 -1.000000 +89006 -1.000000 +89007 -1.000000 +89008 -1.000000 +89009 -1.000000 +89010 -1.000000 +89011 -1.000000 +89012 -1.000000 +89013 -1.000000 +89014 -1.000000 +89015 -1.000000 +89016 -1.000000 +89017 -1.000000 +89018 -1.000000 +89019 -1.000000 +89020 -1.000000 +89021 -1.000000 +89022 -1.000000 +89023 -1.000000 +89024 -1.000000 +89025 -1.000000 +89026 -1.000000 +89027 -1.000000 +89028 -1.000000 +89029 -1.000000 +89030 -1.000000 +89031 -1.000000 +89032 -1.000000 +89033 -1.000000 +89034 -1.000000 +89035 -1.000000 +89036 -1.000000 +89037 -1.000000 +89038 -1.000000 +89039 -1.000000 +89040 -1.000000 +89041 -1.000000 +89042 -1.000000 +89043 -1.000000 +89044 -1.000000 +89045 -1.000000 +89046 -1.000000 +89047 -1.000000 +89048 -1.000000 +89049 -1.000000 +89050 -1.000000 +89051 -1.000000 +89052 -1.000000 +89053 -1.000000 +89054 -1.000000 +89055 -1.000000 +89056 -1.000000 +89057 -1.000000 +89058 -1.000000 +89059 -1.000000 +89060 -1.000000 +89061 -1.000000 +89062 -1.000000 +89063 -1.000000 +89064 -1.000000 +89065 -1.000000 +89066 -1.000000 +89067 -1.000000 +89068 -1.000000 +89069 -1.000000 +89070 -1.000000 +89071 -1.000000 +89072 -1.000000 +89073 -1.000000 +89074 -1.000000 +89075 -1.000000 +89076 -1.000000 +89077 -1.000000 +89078 -1.000000 +89079 -1.000000 +89080 -1.000000 +89081 -1.000000 +89082 -1.000000 +89083 -1.000000 +89084 -1.000000 +89085 -1.000000 +89086 -1.000000 +89087 -1.000000 +89088 -1.000000 +89089 -1.000000 +89090 -1.000000 +89091 -1.000000 +89092 -1.000000 +89093 -1.000000 +89094 -1.000000 +89095 -1.000000 +89096 -1.000000 +89097 -1.000000 +89098 -1.000000 +89099 -1.000000 +89100 -1.000000 +89101 -1.000000 +89102 -1.000000 +89103 -1.000000 +89104 -1.000000 +89105 -1.000000 +89106 -1.000000 +89107 -1.000000 +89108 -1.000000 +89109 -1.000000 +89110 -1.000000 +89111 -1.000000 +89112 -1.000000 +89113 -1.000000 +89114 -1.000000 +89115 -1.000000 +89116 -1.000000 +89117 -1.000000 +89118 -1.000000 +89119 -1.000000 +89120 -1.000000 +89121 -1.000000 +89122 -1.000000 +89123 -1.000000 +89124 -1.000000 +89125 -1.000000 +89126 -1.000000 +89127 -1.000000 +89128 -1.000000 +89129 -1.000000 +89130 -1.000000 +89131 -1.000000 +89132 -1.000000 +89133 -1.000000 +89134 -1.000000 +89135 -1.000000 +89136 -1.000000 +89137 -1.000000 +89138 -1.000000 +89139 -1.000000 +89140 -1.000000 +89141 -1.000000 +89142 -1.000000 +89143 -1.000000 +89144 -1.000000 +89145 -1.000000 +89146 -1.000000 +89147 -1.000000 +89148 -1.000000 +89149 -1.000000 +89150 -1.000000 +89151 -1.000000 +89152 -1.000000 +89153 -1.000000 +89154 -1.000000 +89155 -1.000000 +89156 -1.000000 +89175 -1.000000 +89176 -1.000000 +89177 -1.000000 +89178 -1.000000 +89179 -1.000000 +89180 -1.000000 +89181 -1.000000 +89182 -1.000000 +89183 -1.000000 +89184 -1.000000 +89185 -1.000000 +89186 -1.000000 +89187 -1.000000 +89188 -1.000000 +89189 -1.000000 +89190 -1.000000 +89191 -1.000000 +89192 -1.000000 +89193 -1.000000 +89194 -1.000000 +89195 -1.000000 +89196 -1.000000 +89197 -1.000000 +89198 -1.000000 +89199 -1.000000 +89200 -1.000000 +89201 -1.000000 +89202 -1.000000 +89203 -1.000000 +89204 -1.000000 +89205 -1.000000 +89206 -1.000000 +89207 -1.000000 +89208 -1.000000 +89209 -1.000000 +89210 -1.000000 +89211 -1.000000 +89212 -1.000000 +89213 -1.000000 +89214 -1.000000 +89215 -1.000000 +89216 -1.000000 +89217 -1.000000 +89218 -1.000000 +89219 -1.000000 +89220 -1.000000 +89221 -1.000000 +89222 -1.000000 +89223 -1.000000 +89224 -1.000000 +89225 -1.000000 +89226 -1.000000 +89227 -1.000000 +89228 -1.000000 +89229 -1.000000 +89230 -1.000000 +89231 -1.000000 +89232 -1.000000 +89233 -1.000000 +89234 -1.000000 +89235 -1.000000 +89236 -1.000000 +89237 -1.000000 +89238 -1.000000 +89239 -1.000000 +89240 -1.000000 +89241 -1.000000 +89242 -1.000000 +89243 -1.000000 +89244 -1.000000 +89245 -1.000000 +89246 -1.000000 +89247 -1.000000 +89248 -1.000000 +89249 -1.000000 +89250 -1.000000 +89251 -1.000000 +89252 -1.000000 +89253 -1.000000 +89254 -1.000000 +89255 -1.000000 +89256 -1.000000 +89257 -1.000000 +89258 -1.000000 +89259 -1.000000 +89260 -1.000000 +89261 -1.000000 +89262 -1.000000 +89263 -1.000000 +89264 -1.000000 +89265 -1.000000 +89266 -1.000000 +89267 -1.000000 +89268 -1.000000 +89269 -1.000000 +89270 -1.000000 +89271 -1.000000 +89274 -1.000000 +89275 -1.000000 +89276 -1.000000 +89277 -1.000000 +89278 -1.000000 +89279 -1.000000 +89280 -1.000000 +89281 -1.000000 +89282 -1.000000 +89283 -1.000000 +89284 -1.000000 +89285 -1.000000 +89286 -1.000000 +89287 -1.000000 +89288 -1.000000 +89289 -1.000000 +89290 -1.000000 +89291 -1.000000 +89292 -1.000000 +89293 -1.000000 +89294 -1.000000 +89295 -1.000000 +89296 -1.000000 +89297 -1.000000 +89298 -1.000000 +89299 -1.000000 +89300 -1.000000 +89301 -1.000000 +89302 -1.000000 +89303 -1.000000 +89304 -1.000000 +89305 -1.000000 +89306 -1.000000 +89307 -1.000000 +89308 -1.000000 +89309 -1.000000 +89310 -1.000000 +89311 -1.000000 +89312 -1.000000 +89313 -1.000000 +89314 -1.000000 +89315 -1.000000 +89316 -1.000000 +89317 -1.000000 +89318 -1.000000 +89319 -1.000000 +89320 -1.000000 +89321 -1.000000 +89322 -1.000000 +89323 -1.000000 +89324 -1.000000 +89325 -1.000000 +89326 -1.000000 +89327 -1.000000 +89328 -1.000000 +89329 -1.000000 +89330 -1.000000 +89331 -1.000000 +89332 -1.000000 +89333 -1.000000 +89334 -1.000000 +89335 -1.000000 +89336 -1.000000 +89337 -1.000000 +89338 -1.000000 +89339 -1.000000 +89340 -1.000000 +89341 -1.000000 +89342 -1.000000 +89343 -1.000000 +89344 -1.000000 +89345 -1.000000 +89346 -1.000000 +89347 -1.000000 +89348 -1.000000 +89349 -1.000000 +89350 -1.000000 +89351 -1.000000 +89352 -1.000000 +89353 -1.000000 +89354 -1.000000 +89355 -1.000000 +89356 -1.000000 +89357 -1.000000 +89358 -1.000000 +89359 -1.000000 +89360 -1.000000 +89361 -1.000000 +89362 -1.000000 +89363 -1.000000 +89364 -1.000000 +89365 -1.000000 +89366 -1.000000 +89367 -1.000000 +89368 -1.000000 +89369 -1.000000 +89370 -1.000000 +89371 -1.000000 +89372 -1.000000 +89373 -1.000000 +89374 -1.000000 +89375 -1.000000 +89376 -1.000000 +89377 -1.000000 +89378 -1.000000 +89379 -1.000000 +89380 -1.000000 +89381 -1.000000 +89382 -1.000000 +89383 -1.000000 +89384 -1.000000 +89385 -1.000000 +89386 -1.000000 +89387 -1.000000 +89388 -1.000000 +89389 -1.000000 +89390 -1.000000 +89391 -1.000000 +89392 -1.000000 +89393 -1.000000 +89394 -1.000000 +89395 -1.000000 +89396 -1.000000 +89397 -1.000000 +89398 -1.000000 +89399 -1.000000 +89400 -1.000000 +89401 -1.000000 +89402 -1.000000 +89403 -1.000000 +89404 -1.000000 +89405 -1.000000 +89406 -1.000000 +89407 -1.000000 +89408 -1.000000 +89409 -1.000000 +89410 -1.000000 +89411 -1.000000 +89412 -1.000000 +89413 -1.000000 +89414 -1.000000 +89415 -1.000000 +89416 -1.000000 +89417 -1.000000 +89418 -1.000000 +89419 -1.000000 +89420 -1.000000 +89421 -1.000000 +89422 -1.000000 +89423 -1.000000 +89424 -1.000000 +89425 -1.000000 +89426 -1.000000 +89427 -1.000000 +89428 -1.000000 +89429 -1.000000 +89430 -1.000000 +89431 -1.000000 +89432 -1.000000 +89433 -1.000000 +89434 -1.000000 +89435 -1.000000 +89436 -1.000000 +89437 -1.000000 +89438 -1.000000 +89439 -1.000000 +89440 -1.000000 +89441 -1.000000 +89442 -1.000000 +89443 -1.000000 +89444 -1.000000 +89445 -1.000000 +89446 -1.000000 +89447 -1.000000 +89448 -1.000000 +89449 -1.000000 +89450 -1.000000 +89451 -1.000000 +89452 -1.000000 +89453 -1.000000 +89454 -1.000000 +89455 -1.000000 +89456 -1.000000 +89457 -1.000000 +89458 -1.000000 +89459 -1.000000 +89460 -1.000000 +89461 -1.000000 +89462 -1.000000 +89463 -1.000000 +89464 -1.000000 +89465 -1.000000 +89466 -1.000000 +89467 -1.000000 +89468 -1.000000 +89469 -1.000000 +89470 -1.000000 +89471 -1.000000 +89472 -1.000000 +89473 -1.000000 +89474 -1.000000 +89475 -1.000000 +89476 -1.000000 +89477 -1.000000 +89478 -1.000000 +89479 -1.000000 +89480 -1.000000 +89481 -1.000000 +89482 -1.000000 +89483 -1.000000 +89484 -1.000000 +89485 -1.000000 +89486 -1.000000 +89487 -1.000000 +89488 -1.000000 +89489 -1.000000 +89490 -1.000000 +89491 -1.000000 +89492 -1.000000 +89493 -1.000000 +89494 -1.000000 +89495 -1.000000 +89496 -1.000000 +89497 -1.000000 +89498 -1.000000 +89499 -1.000000 +89500 -1.000000 +89501 -1.000000 +89502 -1.000000 +89503 -1.000000 +89504 -1.000000 +89505 -1.000000 +89506 -1.000000 +89507 -1.000000 +89508 -1.000000 +89509 -1.000000 +89510 -1.000000 +89511 -1.000000 +89512 -1.000000 +89513 -1.000000 +89514 -1.000000 +89515 -1.000000 +89516 -1.000000 +89517 -1.000000 +89518 -1.000000 +89519 -1.000000 +89520 -1.000000 +89521 -1.000000 +89522 -1.000000 +89523 -1.000000 +89524 -1.000000 +89525 -1.000000 +89526 -1.000000 +89527 -1.000000 +89528 -1.000000 +89529 -1.000000 +89530 -1.000000 +89531 -1.000000 +89532 -1.000000 +89533 -1.000000 +89534 -1.000000 +89535 -1.000000 +89536 -1.000000 +89537 -1.000000 +89538 -1.000000 +89539 -1.000000 +89540 -1.000000 +89541 -1.000000 +89542 -1.000000 +89543 -1.000000 +89544 -1.000000 +89545 -1.000000 +89546 -1.000000 +89547 -1.000000 +89548 -1.000000 +89549 -1.000000 +89550 -1.000000 +89551 -1.000000 +89552 -1.000000 +89553 -1.000000 +89554 -1.000000 +89555 -1.000000 +89556 -1.000000 +89557 -1.000000 +89558 -1.000000 +89559 -1.000000 +89560 -1.000000 +89561 -1.000000 +89562 -1.000000 +89563 -1.000000 +89564 -1.000000 +89565 -1.000000 +89566 -1.000000 +89567 -1.000000 +89568 -1.000000 +89569 -1.000000 +89570 -1.000000 +89571 -1.000000 +89572 -1.000000 +89573 -1.000000 +89574 -1.000000 +89575 -1.000000 +89576 -1.000000 +89577 -1.000000 +89578 -1.000000 +89579 -1.000000 +89580 -1.000000 +89581 -1.000000 +89582 -1.000000 +89583 -1.000000 +89584 -1.000000 +89585 -1.000000 +89586 -1.000000 +89587 -1.000000 +89588 -1.000000 +89589 -1.000000 +89590 -1.000000 +89591 -1.000000 +89592 -1.000000 +89593 -1.000000 +89594 -1.000000 +89595 -1.000000 +89596 -1.000000 +89597 -1.000000 +89598 -1.000000 +89599 -1.000000 +89600 -1.000000 +89601 -1.000000 +89602 -1.000000 +89603 -1.000000 +89604 -1.000000 +89605 -1.000000 +89606 -1.000000 +89607 -1.000000 +89608 -1.000000 +89609 -1.000000 +89610 -1.000000 +89611 -1.000000 +89612 -1.000000 +89613 -1.000000 +89614 -1.000000 +89615 -1.000000 +89616 -1.000000 +89617 -1.000000 +89618 -1.000000 +89619 -1.000000 +89620 -1.000000 +89621 -1.000000 +89622 -1.000000 +89623 -1.000000 +89624 -1.000000 +89625 -1.000000 +89626 -1.000000 +89627 -1.000000 +89628 -1.000000 +89629 -1.000000 +89630 -1.000000 +89631 -1.000000 +89632 -1.000000 +89633 -1.000000 +89634 -1.000000 +89635 -1.000000 +89638 -1.000000 +89639 -1.000000 +89640 -1.000000 +89641 -1.000000 +89642 -1.000000 +89643 -1.000000 +89644 -1.000000 +89645 -1.000000 +89646 -1.000000 +89647 -1.000000 +89648 -1.000000 +89651 -1.000000 +89652 -1.000000 +89653 -1.000000 +89654 -1.000000 +89655 -1.000000 +89656 -1.000000 +89657 -1.000000 +89658 -1.000000 +89659 -1.000000 +89660 -1.000000 +89661 -1.000000 +89662 -1.000000 +89663 -1.000000 +89664 -1.000000 +89665 -1.000000 +89666 -1.000000 +89667 -1.000000 +89668 -1.000000 +89669 -1.000000 +89670 -1.000000 +89671 -1.000000 +89672 -1.000000 +89673 -1.000000 +89674 -1.000000 +89675 -1.000000 +89676 -1.000000 +89677 -1.000000 +89678 -1.000000 +89693 -1.000000 +89694 -1.000000 +89695 -1.000000 +89696 -1.000000 +89697 -1.000000 +89698 -1.000000 +89699 -1.000000 +89700 -1.000000 +89701 -1.000000 +89702 -1.000000 +89703 -1.000000 +89704 -1.000000 +89705 -1.000000 +89706 -1.000000 +89707 -1.000000 +89708 -1.000000 +89709 -1.000000 +89710 -1.000000 +89711 -1.000000 +89712 -1.000000 +89713 -1.000000 +89714 -1.000000 +89715 -1.000000 +89716 -1.000000 +89717 -1.000000 +89718 -1.000000 +89719 -1.000000 +89720 -1.000000 +89721 -1.000000 +89722 -1.000000 +89723 -1.000000 +89724 -1.000000 +89725 -1.000000 +89726 -1.000000 +89727 -1.000000 +89728 -1.000000 +89729 -1.000000 +89730 -1.000000 +89731 -1.000000 +89732 -1.000000 +89733 -1.000000 +89734 -1.000000 +89735 -1.000000 +89736 -1.000000 +89737 -1.000000 +89738 -1.000000 +89739 -1.000000 +89740 -1.000000 +89741 -1.000000 +89742 -1.000000 +89743 -1.000000 +89744 -1.000000 +89745 -1.000000 +89746 -1.000000 +89747 -1.000000 +89748 -1.000000 +89749 -1.000000 +89750 -1.000000 +89751 -1.000000 +89752 -1.000000 +89753 -1.000000 +89754 -1.000000 +89755 -1.000000 +89756 -1.000000 +89757 -1.000000 +89758 -1.000000 +89759 -1.000000 +89760 -1.000000 +89761 -1.000000 +89762 -1.000000 +89763 -1.000000 +89764 -1.000000 +89765 -1.000000 +89766 -1.000000 +89767 -1.000000 +89768 -1.000000 +89769 -1.000000 +89770 -1.000000 +89771 -1.000000 +89772 -1.000000 +89773 -1.000000 +89774 -1.000000 +89775 -1.000000 +89776 -1.000000 +89777 -1.000000 +89778 -1.000000 +89779 -1.000000 +89780 -1.000000 +89781 -1.000000 +89782 -1.000000 +89783 -1.000000 +89784 -1.000000 +89785 -1.000000 +89786 -1.000000 +89787 -1.000000 +89788 -1.000000 +89789 -1.000000 +89790 -1.000000 +89791 -1.000000 +89792 -1.000000 +89793 -1.000000 +89794 -1.000000 +89795 -1.000000 +89796 -1.000000 +89797 -1.000000 +89798 -1.000000 +89799 -1.000000 +89800 -1.000000 +89801 -1.000000 +89802 -1.000000 +89803 -1.000000 +89804 -1.000000 +89805 -1.000000 +89806 -1.000000 +89807 -1.000000 +89808 -1.000000 +89809 -1.000000 +89810 -1.000000 +89811 -1.000000 +89812 -1.000000 +89813 -1.000000 +89814 -1.000000 +89815 -1.000000 +89816 -1.000000 +89817 -1.000000 +89818 -1.000000 +89819 -1.000000 +89820 -1.000000 +89821 -1.000000 +89822 -1.000000 +89823 -1.000000 +89824 -1.000000 +89825 -1.000000 +89826 -1.000000 +89827 -1.000000 +89828 -1.000000 +89829 -1.000000 +89830 -1.000000 +89831 -1.000000 +89832 -1.000000 +89833 -1.000000 +89834 -1.000000 +89835 -1.000000 +89836 -1.000000 +89837 -1.000000 +89838 -1.000000 +89839 -1.000000 +89840 -1.000000 +89841 -1.000000 +89842 -1.000000 +89843 -1.000000 +89844 -1.000000 +89845 -1.000000 +89846 -1.000000 +89847 -1.000000 +89848 -1.000000 +89849 -1.000000 +89850 -1.000000 +89851 -1.000000 +89852 -1.000000 +89853 -1.000000 +89854 -1.000000 +89855 -1.000000 +89856 -1.000000 +89857 -1.000000 +89858 -1.000000 +89859 -1.000000 +89860 -1.000000 +89861 -1.000000 +89862 -1.000000 +89863 -1.000000 +89864 -1.000000 +89865 -1.000000 +89866 -1.000000 +89867 -1.000000 +89868 -1.000000 +89869 -1.000000 +89870 -1.000000 +89871 -1.000000 +89872 -1.000000 +89873 -1.000000 +89874 -1.000000 +89875 -1.000000 +89876 -1.000000 +89877 -1.000000 +89878 -1.000000 +89879 -1.000000 +89880 -1.000000 +89881 -1.000000 +89882 -1.000000 +89883 -1.000000 +89884 -1.000000 +89885 -1.000000 +89886 -1.000000 +89887 -1.000000 +89888 -1.000000 +89889 -1.000000 +89890 -1.000000 +89891 -1.000000 +89892 -1.000000 +89893 -1.000000 +89894 -1.000000 +89895 -1.000000 +89896 -1.000000 +89897 -1.000000 +89898 -1.000000 +89899 -1.000000 +89900 -1.000000 +89901 -1.000000 +89902 -1.000000 +89903 -1.000000 +89904 -1.000000 +89905 -1.000000 +89906 -1.000000 +89907 -1.000000 +89908 -1.000000 +89909 -1.000000 +89910 -1.000000 +89911 -1.000000 +89912 -1.000000 +89913 -1.000000 +89914 -1.000000 +89915 -1.000000 +89916 -1.000000 +89917 -1.000000 +89918 -1.000000 +89919 -1.000000 +89920 -1.000000 +89921 -1.000000 +89922 -1.000000 +89923 -1.000000 +89924 -1.000000 +89925 -1.000000 +89926 -1.000000 +89927 -1.000000 +89928 -1.000000 +89929 -1.000000 +89930 -1.000000 +89931 -1.000000 +89932 -1.000000 +89933 -1.000000 +89934 -1.000000 +89935 -1.000000 +89936 -1.000000 +89937 -1.000000 +89938 -1.000000 +89939 -1.000000 +89940 -1.000000 +89941 -1.000000 +89942 -1.000000 +89943 -1.000000 +89944 -1.000000 +89945 -1.000000 +89946 -1.000000 +89947 -1.000000 +89948 -1.000000 +89949 -1.000000 +89950 -1.000000 +89951 -1.000000 +89952 -1.000000 +89953 -1.000000 +89954 -1.000000 +89955 -1.000000 +89956 -1.000000 +89957 -1.000000 +89958 -1.000000 +89959 -1.000000 +89960 -1.000000 +89961 -1.000000 +89962 -1.000000 +89963 -1.000000 +89964 -1.000000 +89965 -1.000000 +89966 -1.000000 +89967 -1.000000 +89968 -1.000000 +89969 -1.000000 +89970 -1.000000 +89971 -1.000000 +89972 -1.000000 +89973 -1.000000 +89974 -1.000000 +89975 -1.000000 +89976 -1.000000 +89977 -1.000000 +89978 -1.000000 +89979 -1.000000 +89980 -1.000000 +89981 -1.000000 +89982 -1.000000 +89983 -1.000000 +89984 -1.000000 +89985 -1.000000 +89986 -1.000000 +89987 -1.000000 +89988 -1.000000 +89989 -1.000000 +89990 -1.000000 +89991 -1.000000 +89992 -1.000000 +89993 -1.000000 +89994 -1.000000 +89995 -1.000000 +89996 -1.000000 +89997 -1.000000 +89998 -1.000000 +89999 -1.000000 +90000 -1.000000 +90001 -1.000000 +90002 -1.000000 +90003 -1.000000 +90004 -1.000000 +90005 -1.000000 +90006 -1.000000 +90007 -1.000000 +90008 -1.000000 +90009 -1.000000 +90010 -1.000000 +90011 -1.000000 +90012 -1.000000 +90013 -1.000000 +90014 -1.000000 +90015 -1.000000 +90016 -1.000000 +90017 -1.000000 +90018 -1.000000 +90019 -1.000000 +90020 -1.000000 +90021 -1.000000 +90022 -1.000000 +90023 -1.000000 +90024 -1.000000 +90025 -1.000000 +90026 -1.000000 +90027 -1.000000 +90028 -1.000000 +90029 -1.000000 +90030 -1.000000 +90031 -1.000000 +90032 -1.000000 +90033 -1.000000 +90034 -1.000000 +90035 -1.000000 +90036 -1.000000 +90037 -1.000000 +90038 -1.000000 +90039 -1.000000 +90040 -1.000000 +90041 -1.000000 +90042 -1.000000 +90043 -1.000000 +90044 -1.000000 +90045 -1.000000 +90046 -1.000000 +90047 -1.000000 +90048 -1.000000 +90049 -1.000000 +90050 -1.000000 +90051 -1.000000 +90052 -1.000000 +90053 -1.000000 +90054 -1.000000 +90055 -1.000000 +90056 -1.000000 +90057 -1.000000 +90058 -1.000000 +90059 -1.000000 +90060 -1.000000 +90061 -1.000000 +90062 -1.000000 +90063 -1.000000 +90064 -1.000000 +90065 -1.000000 +90066 -1.000000 +90067 -1.000000 +90068 -1.000000 +90069 -1.000000 +90070 -1.000000 +90071 -1.000000 +90072 -1.000000 +90073 -1.000000 +90074 -1.000000 +90075 -1.000000 +90076 -1.000000 +90077 -1.000000 +90078 -1.000000 +90079 -1.000000 +90080 -1.000000 +90081 -1.000000 +90082 -1.000000 +90083 -1.000000 +90084 -1.000000 +90085 -1.000000 +90086 -1.000000 +90087 -1.000000 +90088 -1.000000 +90089 -1.000000 +90090 -1.000000 +90091 -1.000000 +90092 -1.000000 +90093 -1.000000 +90094 -1.000000 +90095 -1.000000 +90096 -1.000000 +90097 -1.000000 +90098 -1.000000 +90099 -1.000000 +90100 -1.000000 +90101 -1.000000 +90102 -1.000000 +90103 -1.000000 +90104 -1.000000 +90105 -1.000000 +90106 -1.000000 +90107 -1.000000 +90108 -1.000000 +90109 -1.000000 +90110 -1.000000 +90111 -1.000000 +90112 -1.000000 +90113 -1.000000 +90114 -1.000000 +90115 -1.000000 +90116 -1.000000 +90117 -1.000000 +90118 -1.000000 +90119 -1.000000 +90120 -1.000000 +90121 -1.000000 +90122 -1.000000 +90123 -1.000000 +90124 -1.000000 +90125 -1.000000 +90126 -1.000000 +90127 -1.000000 +90128 -1.000000 +90129 -1.000000 +90130 -1.000000 +90131 -1.000000 +90132 -1.000000 +90133 -1.000000 +90134 -1.000000 +90135 -1.000000 +90136 -1.000000 +90137 -1.000000 +90138 -1.000000 +90139 -1.000000 +90140 -1.000000 +90141 -1.000000 +90142 -1.000000 +90143 -1.000000 +90144 -1.000000 +90145 -1.000000 +90146 -1.000000 +90147 -1.000000 +90148 -1.000000 +90149 -1.000000 +90150 -1.000000 +90151 -1.000000 +90152 -1.000000 +90153 -1.000000 +90154 -1.000000 +90155 -1.000000 +90156 -1.000000 +90157 -1.000000 +90158 -1.000000 +90159 -1.000000 +90160 -1.000000 +90161 -1.000000 +90162 -1.000000 +90163 -1.000000 +90164 -1.000000 +90165 -1.000000 +90166 -1.000000 +90167 -1.000000 +90168 -1.000000 +90169 -1.000000 +90170 -1.000000 +90171 -1.000000 +90172 -1.000000 +90173 -1.000000 +90174 -1.000000 +90175 -1.000000 +90176 -1.000000 +90177 -1.000000 +90178 -1.000000 +90179 -1.000000 +90180 -1.000000 +90181 -1.000000 +90182 -1.000000 +90183 -1.000000 +90184 -1.000000 +90185 -1.000000 +90186 -1.000000 +90187 -1.000000 +90188 -1.000000 +90189 -1.000000 +90190 -1.000000 +90191 -1.000000 +90192 -1.000000 +90193 -1.000000 +90194 -1.000000 +90195 -1.000000 +90196 -1.000000 +90197 -1.000000 +90198 -1.000000 +90199 -1.000000 +90200 -1.000000 +90201 -1.000000 +90202 -1.000000 +90203 -1.000000 +90204 -1.000000 +90205 -1.000000 +90206 -1.000000 +90207 -1.000000 +90208 -1.000000 +90209 -1.000000 +90210 -1.000000 +90211 -1.000000 +90212 -1.000000 +90213 -1.000000 +90214 -1.000000 +90215 -1.000000 +90216 -1.000000 +90217 -1.000000 +90218 -1.000000 +90219 -1.000000 +90220 -1.000000 +90221 -1.000000 +90222 -1.000000 +90223 -1.000000 +90224 -1.000000 +90225 -1.000000 +90226 -1.000000 +90227 -1.000000 +90228 -1.000000 +90229 -1.000000 +90230 -1.000000 +90231 -1.000000 +90232 -1.000000 +90233 -1.000000 +90234 -1.000000 +90235 -1.000000 +90236 -1.000000 +90237 -1.000000 +90238 -1.000000 +90239 -1.000000 +90240 -1.000000 +90241 -1.000000 +90242 -1.000000 +90243 -1.000000 +90244 -1.000000 +90245 -1.000000 +90246 -1.000000 +90247 -1.000000 +90248 -1.000000 +90249 -1.000000 +90250 -1.000000 +90251 -1.000000 +90252 -1.000000 +90253 -1.000000 +90254 -1.000000 +90255 -1.000000 +90256 -1.000000 +90257 -1.000000 +90258 -1.000000 +90259 -1.000000 +90260 -1.000000 +90261 -1.000000 +90262 -1.000000 +90263 -1.000000 +90264 -1.000000 +90265 -1.000000 +90266 -1.000000 +90267 -1.000000 +90268 -1.000000 +90269 -1.000000 +90270 -1.000000 +90271 -1.000000 +90272 -1.000000 +90273 -1.000000 +90274 -1.000000 +90275 -1.000000 +90276 -1.000000 +90277 -1.000000 +90278 -1.000000 +90279 -1.000000 +90280 -1.000000 +90281 -1.000000 +90282 -1.000000 +90283 -1.000000 +90284 -1.000000 +90285 -1.000000 +90286 -1.000000 +90287 -1.000000 +90288 -1.000000 +90289 -1.000000 +90290 -1.000000 +90291 -1.000000 +90292 -1.000000 +90293 -1.000000 +90294 -1.000000 +90295 -1.000000 +90296 -1.000000 +90297 -1.000000 +90298 -1.000000 +90299 -1.000000 +90300 -1.000000 +90301 -1.000000 +90302 -1.000000 +90303 -1.000000 +90304 -1.000000 +90305 -1.000000 +90306 -1.000000 +90307 -1.000000 +90308 -1.000000 +90309 -1.000000 +90310 -1.000000 +90311 -1.000000 +90312 -1.000000 +90313 -1.000000 +90314 -1.000000 +90315 -1.000000 +90316 -1.000000 +90317 -1.000000 +90318 -1.000000 +90319 -1.000000 +90320 -1.000000 +90321 -1.000000 +90322 -1.000000 +90323 -1.000000 +90324 -1.000000 +90325 -1.000000 +90326 -1.000000 +90327 -1.000000 +90328 -1.000000 +90329 -1.000000 +90330 -1.000000 +90331 -1.000000 +90332 -1.000000 +90333 -1.000000 +90334 -1.000000 +90335 -1.000000 +90336 -1.000000 +90337 -1.000000 +90338 -1.000000 +90339 -1.000000 +90340 -1.000000 +90341 -1.000000 +90342 -1.000000 +90343 -1.000000 +90344 -1.000000 +90345 -1.000000 +90346 -1.000000 +90347 -1.000000 +90348 -1.000000 +90349 -1.000000 +90350 -1.000000 +90351 -1.000000 +90352 -1.000000 +90353 -1.000000 +90354 -1.000000 +90355 -1.000000 +90356 -1.000000 +90357 -1.000000 +90358 -1.000000 +90359 -1.000000 +90360 -1.000000 +90361 -1.000000 +90362 -1.000000 +90363 -1.000000 +90364 -1.000000 +90365 -1.000000 +90366 -1.000000 +90367 -1.000000 +90368 -1.000000 +90369 -1.000000 +90370 -1.000000 +90371 -1.000000 +90372 -1.000000 +90373 -1.000000 +90374 -1.000000 +90375 -1.000000 +90376 -1.000000 +90377 -1.000000 +90378 -1.000000 +90379 -1.000000 +90380 -1.000000 +90381 -1.000000 +90382 -1.000000 +90383 -1.000000 +90384 -1.000000 +90385 -1.000000 +90386 -1.000000 +90387 -1.000000 +90388 -1.000000 +90389 -1.000000 +90390 -1.000000 +90391 -1.000000 +90392 -1.000000 +90393 -1.000000 +90394 -1.000000 +90395 -1.000000 +90396 -1.000000 +90397 -1.000000 +90399 -1.000000 +90400 -1.000000 +90401 -1.000000 +90402 -1.000000 +90403 -1.000000 +90404 -1.000000 +90405 -1.000000 +90406 -1.000000 +90407 -1.000000 +90408 -1.000000 +90409 -1.000000 +90410 -1.000000 +90411 -1.000000 +90412 -1.000000 +90413 -1.000000 +90414 -1.000000 +90415 -1.000000 +90416 -1.000000 +90417 -1.000000 +90418 -1.000000 +90419 -1.000000 +90420 -1.000000 +90421 -1.000000 +90422 -1.000000 +90423 -1.000000 +90424 -1.000000 +90425 -1.000000 +90426 -1.000000 +90427 -1.000000 +90428 -1.000000 +90429 -1.000000 +90430 -1.000000 +90431 -1.000000 +90432 -1.000000 +90433 -1.000000 +90434 -1.000000 +90435 -1.000000 +90436 -1.000000 +90437 -1.000000 +90438 -1.000000 +90439 -1.000000 +90440 -1.000000 +90441 -1.000000 +90442 -1.000000 +90443 -1.000000 +90444 -1.000000 +90445 -1.000000 +90446 -1.000000 +90447 -1.000000 +90448 -1.000000 +90449 -1.000000 +90450 -1.000000 +90451 -1.000000 +90452 -1.000000 +90453 -1.000000 +90454 -1.000000 +90455 -1.000000 +90456 -1.000000 +90457 -1.000000 +90458 -1.000000 +90459 -1.000000 +90460 -1.000000 +90461 -1.000000 +90462 -1.000000 +90463 -1.000000 +90464 -1.000000 +90465 -1.000000 +90466 -1.000000 +90467 -1.000000 +90468 -1.000000 +90469 -1.000000 +90470 -1.000000 +90471 -1.000000 +90472 -1.000000 +90473 -1.000000 +90474 -1.000000 +90475 -1.000000 +90476 -1.000000 +90477 -1.000000 +90478 -1.000000 +90479 -1.000000 +90480 -1.000000 +90481 -1.000000 +90482 -1.000000 +90483 -1.000000 +90484 -1.000000 +90485 -1.000000 +90486 -1.000000 +90487 -1.000000 +90488 -1.000000 +90489 -1.000000 +90490 -1.000000 +90491 -1.000000 +90492 -1.000000 +90493 -1.000000 +90494 -1.000000 +90495 -1.000000 +90496 -1.000000 +90497 -1.000000 +90498 -1.000000 +90499 -1.000000 +90500 -1.000000 +90501 -1.000000 +90502 -1.000000 +90503 -1.000000 +90504 -1.000000 +90505 -1.000000 +90506 -1.000000 +90507 -1.000000 +90508 -1.000000 +90509 -1.000000 +90510 -1.000000 +90511 -1.000000 +90512 -1.000000 +90513 -1.000000 +90514 -1.000000 +90515 -1.000000 +90516 -1.000000 +90517 -1.000000 +90518 -1.000000 +90519 -1.000000 +90520 -1.000000 +90521 -1.000000 +90522 -1.000000 +90523 -1.000000 +90524 -1.000000 +90525 -1.000000 +90526 -1.000000 +90527 -1.000000 +90528 -1.000000 +90529 -1.000000 +90530 -1.000000 +90531 -1.000000 +90532 -1.000000 +90533 -1.000000 +90534 -1.000000 +90535 -1.000000 +90536 -1.000000 +90537 -1.000000 +90538 -1.000000 +90539 -1.000000 +90540 -1.000000 +90541 -1.000000 +90542 -1.000000 +90543 -1.000000 +90544 -1.000000 +90545 -1.000000 +90546 -1.000000 +90547 -1.000000 +90548 -1.000000 +90549 -1.000000 +90550 -1.000000 +90551 -1.000000 +90552 -1.000000 +90553 -1.000000 +90554 -1.000000 +90555 -1.000000 +90556 -1.000000 +90557 -1.000000 +90558 -1.000000 +90559 -1.000000 +90560 -1.000000 +90561 -1.000000 +90562 -1.000000 +90563 -1.000000 +90564 -1.000000 +90565 -1.000000 +90566 -1.000000 +90567 -1.000000 +90568 -1.000000 +90569 -1.000000 +90570 -1.000000 +90571 -1.000000 +90572 -1.000000 +90573 -1.000000 +90574 -1.000000 +90575 -1.000000 +90576 -1.000000 +90577 -1.000000 +90578 -1.000000 +90579 -1.000000 +90580 -1.000000 +90581 -1.000000 +90582 -1.000000 +90583 -1.000000 +90584 -1.000000 +90585 -1.000000 +90586 -1.000000 +90587 -1.000000 +90588 -1.000000 +90589 -1.000000 +90590 -1.000000 +90591 -1.000000 +90592 -1.000000 +90593 -1.000000 +90594 -1.000000 +90595 -1.000000 +90596 -1.000000 +90597 -1.000000 +90598 -1.000000 +90599 -1.000000 +90600 -1.000000 +90601 -1.000000 +90602 -1.000000 +90603 -1.000000 +90604 -1.000000 +90605 -1.000000 +90606 -1.000000 +90607 -1.000000 +90608 -1.000000 +90609 -1.000000 +90610 -1.000000 +90611 -1.000000 +90612 -1.000000 +90613 -1.000000 +90614 -1.000000 +90615 -1.000000 +90616 -1.000000 +90617 -1.000000 +90618 -1.000000 +90619 -1.000000 +90620 -1.000000 +90621 -1.000000 +90622 -1.000000 +90623 -1.000000 +90624 -1.000000 +90625 -1.000000 +90626 -1.000000 +90627 -1.000000 +90628 -1.000000 +90629 -1.000000 +90630 -1.000000 +90631 -1.000000 +90632 -1.000000 +90633 -1.000000 +90634 -1.000000 +90635 -1.000000 +90636 -1.000000 +90637 -1.000000 +90638 -1.000000 +90639 -1.000000 +90640 -1.000000 +90641 -1.000000 +90642 -1.000000 +90643 -1.000000 +90644 -1.000000 +90645 -1.000000 +90646 -1.000000 +90647 -1.000000 +90648 -1.000000 +90649 -1.000000 +90650 -1.000000 +90651 -1.000000 +90652 -1.000000 +90653 -1.000000 +90654 -1.000000 +90655 -1.000000 +90656 -1.000000 +90657 -1.000000 +90658 -1.000000 +90659 -1.000000 +90660 -1.000000 +90661 -1.000000 +90662 -1.000000 +90663 -1.000000 +90664 -1.000000 +90665 -1.000000 +90666 -1.000000 +90667 -1.000000 +90668 -1.000000 +90669 -1.000000 +90670 -1.000000 +90671 -1.000000 +90672 -1.000000 +90673 -1.000000 +90674 -1.000000 +90675 -1.000000 +90676 -1.000000 +90677 -1.000000 +90678 -1.000000 +90679 -1.000000 +90680 -1.000000 +90681 -1.000000 +90682 -1.000000 +90683 -1.000000 +90684 -1.000000 +90685 -1.000000 +90686 -1.000000 +90687 -1.000000 +90688 -1.000000 +90689 -1.000000 +90690 -1.000000 +90691 -1.000000 +90692 -1.000000 +90693 -1.000000 +90694 -1.000000 +90695 -1.000000 +90696 -1.000000 +90697 -1.000000 +90698 -1.000000 +90699 -1.000000 +90700 -1.000000 +90701 -1.000000 +90702 -1.000000 +90703 -1.000000 +90704 -1.000000 +90705 -1.000000 +90706 -1.000000 +90707 -1.000000 +90708 -1.000000 +90709 -1.000000 +90710 -1.000000 +90711 -1.000000 +90712 -1.000000 +90713 -1.000000 +90714 -1.000000 +90715 -1.000000 +90716 -1.000000 +90717 -1.000000 +90718 -1.000000 +90719 -1.000000 +90720 -1.000000 +90721 -1.000000 +90722 -1.000000 +90723 -1.000000 +90724 -1.000000 +90725 -1.000000 +90726 -1.000000 +90727 -1.000000 +90728 -1.000000 +90729 -1.000000 +90730 -1.000000 +90731 -1.000000 +90732 -1.000000 +90733 -1.000000 +90734 -1.000000 +90735 -1.000000 +90736 -1.000000 +90737 -1.000000 +90738 -1.000000 +90739 -1.000000 +90740 -1.000000 +90741 -1.000000 +90742 -1.000000 +90743 -1.000000 +90744 -1.000000 +90745 -1.000000 +90746 -1.000000 +90747 -1.000000 +90748 -1.000000 +90749 -1.000000 +90750 -1.000000 +90751 -1.000000 +90752 -1.000000 +90753 -1.000000 +90754 -1.000000 +90755 -1.000000 +90756 -1.000000 +90757 -1.000000 +90758 -1.000000 +90759 -1.000000 +90760 -1.000000 +90761 -1.000000 +90762 -1.000000 +90763 -1.000000 +90764 -1.000000 +90765 -1.000000 +90766 -1.000000 +90767 -1.000000 +90768 -1.000000 +90769 -1.000000 +90770 -1.000000 +90771 -1.000000 +90772 -1.000000 +90773 -1.000000 +90774 -1.000000 +90775 -1.000000 +90776 -1.000000 +90777 -1.000000 +90778 -1.000000 +90779 -1.000000 +90780 -1.000000 +90781 -1.000000 +90782 -1.000000 +90783 -1.000000 +90784 -1.000000 +90785 -1.000000 +90786 -1.000000 +90787 -1.000000 +90788 -1.000000 +90789 -1.000000 +90790 -1.000000 +90791 -1.000000 +90792 -1.000000 +90793 -1.000000 +90794 -1.000000 +90795 -1.000000 +90796 -1.000000 +90797 -1.000000 +90798 -1.000000 +90799 -1.000000 +90800 -1.000000 +90801 -1.000000 +90802 -1.000000 +90803 -1.000000 +90804 -1.000000 +90805 -1.000000 +90806 -1.000000 +90807 -1.000000 +90808 -1.000000 +90809 -1.000000 +90810 -1.000000 +90811 -1.000000 +90812 -1.000000 +90813 -1.000000 +90814 -1.000000 +90815 -1.000000 +90816 -1.000000 +90817 -1.000000 +90818 -1.000000 +90819 -1.000000 +90820 -1.000000 +90821 -1.000000 +90822 -1.000000 +90823 -1.000000 +90824 -1.000000 +90825 -1.000000 +90826 -1.000000 +90827 -1.000000 +90828 -1.000000 +90830 -1.000000 +90831 -1.000000 +90832 -1.000000 +90833 -1.000000 +90834 -1.000000 +90835 -1.000000 +90836 -1.000000 +90837 -1.000000 +90838 -1.000000 +90839 -1.000000 +90840 -1.000000 +90841 -1.000000 +90842 -1.000000 +90843 -1.000000 +90844 -1.000000 +90845 -1.000000 +90846 -1.000000 +90847 -1.000000 +90848 -1.000000 +90849 -1.000000 +90850 -1.000000 +90851 -1.000000 +90852 -1.000000 +90853 -1.000000 +90854 -1.000000 +90855 -1.000000 +90856 -1.000000 +90857 -1.000000 +90858 -1.000000 +90859 -1.000000 +90860 -1.000000 +90861 -1.000000 +90862 -1.000000 +90863 -1.000000 +90864 -1.000000 +90865 -1.000000 +90866 -1.000000 +90867 -1.000000 +90868 -1.000000 +90869 -1.000000 +90870 -1.000000 +90872 -1.000000 +90873 -1.000000 +90874 -1.000000 +90887 -1.000000 +90889 -1.000000 +90890 -1.000000 +90891 -1.000000 +90892 -1.000000 +90893 -1.000000 +90894 -1.000000 +90895 -1.000000 +90896 -1.000000 +90897 -1.000000 +90898 -1.000000 +90899 -1.000000 +90900 -1.000000 +90901 -1.000000 +90902 -1.000000 +90903 -1.000000 +90904 -1.000000 +90905 -1.000000 +90906 -1.000000 +90907 -1.000000 +90908 -1.000000 +90909 -1.000000 +90910 -1.000000 +90911 -1.000000 +90912 -1.000000 +90913 -1.000000 +90914 -1.000000 +90915 -1.000000 +90916 -1.000000 +90917 -1.000000 +90918 -1.000000 +90919 -1.000000 +90920 -1.000000 +90921 -1.000000 +90922 -1.000000 +90923 -1.000000 +90924 -1.000000 +90925 -1.000000 +90926 -1.000000 +90927 -1.000000 +90928 -1.000000 +90929 -1.000000 +90930 -1.000000 +90931 -1.000000 +90932 -1.000000 +90933 -1.000000 +90934 -1.000000 +90935 -1.000000 +90936 -1.000000 +90937 -1.000000 +90938 -1.000000 +90939 -1.000000 +90940 -1.000000 +90941 -1.000000 +90942 -1.000000 +90943 -1.000000 +90944 -1.000000 +90945 -1.000000 +90946 -1.000000 +90947 -1.000000 +90948 -1.000000 +90949 -1.000000 +90950 -1.000000 +90951 -1.000000 +90952 -1.000000 +90953 -1.000000 +90954 -1.000000 +90955 -1.000000 +90956 -1.000000 +90957 -1.000000 +90958 -1.000000 +90959 -1.000000 +90960 -1.000000 +90961 -1.000000 +90962 -1.000000 +90963 -1.000000 +90964 -1.000000 +90965 -1.000000 +90966 -1.000000 +90967 -1.000000 +90968 -1.000000 +90969 -1.000000 +90970 -1.000000 +90971 -1.000000 +90972 -1.000000 +90973 -1.000000 +90977 -1.000000 +90978 -1.000000 +90979 -1.000000 +90980 -1.000000 +90981 -1.000000 +90982 -1.000000 +90983 -1.000000 +90984 -1.000000 +90985 -1.000000 +90986 -1.000000 +90987 -1.000000 +90988 -1.000000 +90989 -1.000000 +90990 -1.000000 +90991 -1.000000 +90992 -1.000000 +90993 -1.000000 +90994 -1.000000 +90995 -1.000000 +90996 -1.000000 +90997 -1.000000 +90998 -1.000000 +90999 -1.000000 +91000 -1.000000 +91001 -1.000000 +91002 -1.000000 +91003 -1.000000 +91004 -1.000000 +91005 -1.000000 +91006 -1.000000 +91007 -1.000000 +91008 -1.000000 +91009 -1.000000 +91010 -1.000000 +91011 -1.000000 +91012 -1.000000 +91013 -1.000000 +91014 -1.000000 +91015 -1.000000 +91016 -1.000000 +91017 -1.000000 +91018 -1.000000 +91019 -1.000000 +91020 -1.000000 +91021 -1.000000 +91022 -1.000000 +91023 -1.000000 +91024 -1.000000 +91025 -1.000000 +91026 -1.000000 +91028 -1.000000 +91030 -1.000000 +91032 -1.000000 +91034 -1.000000 +91039 -1.000000 +91041 -1.000000 +91043 -1.000000 +91044 -1.000000 +91047 -1.000000 +91049 -1.000000 +91051 -1.000000 +91053 -1.000000 +91054 -1.000000 +91055 -1.000000 +91056 -1.000000 +91057 -1.000000 +91058 -1.000000 +91059 -1.000000 +91060 -1.000000 +91061 -1.000000 +91062 -1.000000 +91063 -1.000000 +91064 -1.000000 +91065 -1.000000 +91066 -1.000000 +91067 -1.000000 +91068 -1.000000 +91069 -1.000000 +91070 -1.000000 +91071 -1.000000 +91072 -1.000000 +91073 -1.000000 +91074 -1.000000 +91075 -1.000000 +91076 -1.000000 +91077 -1.000000 +91078 -1.000000 +91079 -1.000000 +91080 -1.000000 +91081 -1.000000 +91082 -1.000000 +91083 -1.000000 +91084 -1.000000 +91085 -1.000000 +91086 -1.000000 +91087 -1.000000 +91088 -1.000000 +91089 -1.000000 +91090 -1.000000 +91091 -1.000000 +91092 -1.000000 +91093 -1.000000 +91094 -1.000000 +91095 -1.000000 +91096 -1.000000 +91097 -1.000000 +91098 -1.000000 +91099 -1.000000 +91100 -1.000000 +91101 -1.000000 +91102 -1.000000 +91103 -1.000000 +91104 -1.000000 +91105 -1.000000 +91106 -1.000000 +91107 -1.000000 +91108 -1.000000 +91109 -1.000000 +91110 -1.000000 +91111 -1.000000 +91112 -1.000000 +91113 -1.000000 +91114 -1.000000 +91115 -1.000000 +91116 -1.000000 +91117 -1.000000 +91118 -1.000000 +91119 -1.000000 +91120 -1.000000 +91121 -1.000000 +91122 -1.000000 +91123 -1.000000 +91124 -1.000000 +91125 -1.000000 +91126 -1.000000 +91127 -1.000000 +91128 -1.000000 +91129 -1.000000 +91130 -1.000000 +91131 -1.000000 +91132 -1.000000 +91133 -1.000000 +91134 -1.000000 +91135 -1.000000 +91136 -1.000000 +91137 -1.000000 +91138 -1.000000 +91139 -1.000000 +91140 -1.000000 +91141 -1.000000 +91142 -1.000000 +91143 -1.000000 +91144 -1.000000 +91145 -1.000000 +91146 -1.000000 +91147 -1.000000 +91148 -1.000000 +91149 -1.000000 +91150 -1.000000 +91151 -1.000000 +91152 -1.000000 +91153 -1.000000 +91154 -1.000000 +91155 -1.000000 +91156 -1.000000 +91157 -1.000000 +91158 -1.000000 +91159 -1.000000 +91160 -1.000000 +91161 -1.000000 +91162 -1.000000 +91163 -1.000000 +91164 -1.000000 +91165 -1.000000 +91166 -1.000000 +91167 -1.000000 +91168 -1.000000 +91169 -1.000000 +91170 -1.000000 +91171 -1.000000 +91172 -1.000000 +91173 -1.000000 +91174 -1.000000 +91175 -1.000000 +91176 -1.000000 +91177 -1.000000 +91178 -1.000000 +91179 -1.000000 +91180 -1.000000 +91181 -1.000000 +91182 -1.000000 +91183 -1.000000 +91184 -1.000000 +91185 -1.000000 +91186 -1.000000 +91187 -1.000000 +91188 -1.000000 +91189 -1.000000 +91190 -1.000000 +91191 -1.000000 +91192 -1.000000 +91193 -1.000000 +91194 -1.000000 +91195 -1.000000 +91196 -1.000000 +91197 -1.000000 +91198 -1.000000 +91199 -1.000000 +91200 -1.000000 +91201 -1.000000 +91202 -1.000000 +91203 -1.000000 +91204 -1.000000 +91205 -1.000000 +91206 -1.000000 +91207 -1.000000 +91208 -1.000000 +91209 -1.000000 +91210 -1.000000 +91211 -1.000000 +91212 -1.000000 +91213 -1.000000 +91214 -1.000000 +91215 -1.000000 +91216 -1.000000 +91217 -1.000000 +91218 -1.000000 +91219 -1.000000 +91220 -1.000000 +91221 -1.000000 +91222 -1.000000 +91223 -1.000000 +91224 -1.000000 +91225 -1.000000 +91226 -1.000000 +91227 -1.000000 +91228 -1.000000 +91229 -1.000000 +91230 -1.000000 +91231 -1.000000 +91232 -1.000000 +91233 -1.000000 +91234 -1.000000 +91235 -1.000000 +91236 -1.000000 +91237 -1.000000 +91238 -1.000000 +91239 -1.000000 +91240 -1.000000 +91241 -1.000000 +91242 -1.000000 +91243 -1.000000 +91244 -1.000000 +91245 -1.000000 +91246 -1.000000 +91247 -1.000000 +91248 -1.000000 +91249 -1.000000 +91250 -1.000000 +91251 -1.000000 +91252 -1.000000 +91253 -1.000000 +91254 -1.000000 +91255 -1.000000 +91256 -1.000000 +91257 -1.000000 +91258 -1.000000 +91259 -1.000000 +91260 -1.000000 +91261 -1.000000 +91262 -1.000000 +91263 -1.000000 +91264 -1.000000 +91265 -1.000000 +91266 -1.000000 +91267 -1.000000 +91268 -1.000000 +91269 -1.000000 +91270 -1.000000 +91271 -1.000000 +91272 -1.000000 +91273 -1.000000 +91274 -1.000000 +91275 -1.000000 +91276 -1.000000 +91277 -1.000000 +91278 -1.000000 +91279 -1.000000 +91280 -1.000000 +91281 -1.000000 +91282 -1.000000 +91283 -1.000000 +91284 -1.000000 +91285 -1.000000 +91286 -1.000000 +91287 -1.000000 +91288 -1.000000 +91289 -1.000000 +91290 -1.000000 +91291 -1.000000 +91292 -1.000000 +91293 -1.000000 +91294 -1.000000 +91295 -1.000000 +91296 -1.000000 +91297 -1.000000 +91298 -1.000000 +91299 -1.000000 +91300 -1.000000 +91301 -1.000000 +91302 -1.000000 +91303 -1.000000 +91304 -1.000000 +91305 -1.000000 +91306 -1.000000 +91307 -1.000000 +91308 -1.000000 +91309 -1.000000 +91310 -1.000000 +91311 -1.000000 +91312 -1.000000 +91313 -1.000000 +91314 -1.000000 +91315 -1.000000 +91316 -1.000000 +91317 -1.000000 +91318 -1.000000 +91319 -1.000000 +91320 -1.000000 +91321 -1.000000 +91322 -1.000000 +91323 -1.000000 +91324 -1.000000 +91325 -1.000000 +91326 -1.000000 +91327 -1.000000 +91328 -1.000000 +91329 -1.000000 +91330 -1.000000 +91331 -1.000000 +91332 -1.000000 +91333 -1.000000 +91334 -1.000000 +91335 -1.000000 +91336 -1.000000 +91337 -1.000000 +91338 -1.000000 +91339 -1.000000 +91340 -1.000000 +91341 -1.000000 +91342 -1.000000 +91343 -1.000000 +91344 -1.000000 +91345 -1.000000 +91346 -1.000000 +91347 -1.000000 +91348 -1.000000 +91349 -1.000000 +91350 -1.000000 +91351 -1.000000 +91352 -1.000000 +91353 -1.000000 +91354 -1.000000 +91355 -1.000000 +91356 -1.000000 +91357 -1.000000 +91358 -1.000000 +91359 -1.000000 +91360 -1.000000 +91361 -1.000000 +91362 -1.000000 +91363 -1.000000 +91364 -1.000000 +91365 -1.000000 +91366 -1.000000 +91367 -1.000000 +91368 -1.000000 +91369 -1.000000 +91370 -1.000000 +91371 -1.000000 +91372 -1.000000 +91373 -1.000000 +91374 -1.000000 +91375 -1.000000 +91376 -1.000000 +91377 -1.000000 +91378 -1.000000 +91379 -1.000000 +91380 -1.000000 +91381 -1.000000 +91382 -1.000000 +91383 -1.000000 +91384 -1.000000 +91385 -1.000000 +91386 -1.000000 +91387 -1.000000 +91388 -1.000000 +91389 -1.000000 +91390 -1.000000 +91391 -1.000000 +91392 -1.000000 +91393 -1.000000 +91394 -1.000000 +91395 -1.000000 +91396 -1.000000 +91397 -1.000000 +91398 -1.000000 +91399 -1.000000 +91400 -1.000000 +91401 -1.000000 +91402 -1.000000 +91403 -1.000000 +91404 -1.000000 +91405 -1.000000 +91406 -1.000000 +91407 -1.000000 +91408 -1.000000 +91409 -1.000000 +91410 -1.000000 +91411 -1.000000 +91412 -1.000000 +91413 -1.000000 +91414 -1.000000 +91415 -1.000000 +91416 -1.000000 +91417 -1.000000 +91418 -1.000000 +91419 -1.000000 +91420 -1.000000 +91421 -1.000000 +91422 -1.000000 +91423 -1.000000 +91424 -1.000000 +91425 -1.000000 +91426 -1.000000 +91427 -1.000000 +91428 -1.000000 +91429 -1.000000 +91430 -1.000000 +91431 -1.000000 +91432 -1.000000 +91433 -1.000000 +91434 -1.000000 +91435 -1.000000 +91436 -1.000000 +91437 -1.000000 +91438 -1.000000 +91439 -1.000000 +91440 -1.000000 +91441 -1.000000 +91442 -1.000000 +91443 -1.000000 +91444 -1.000000 +91445 -1.000000 +91446 -1.000000 +91447 -1.000000 +91448 -1.000000 +91449 -1.000000 +91450 -1.000000 +91451 -1.000000 +91452 -1.000000 +91453 -1.000000 +91454 -1.000000 +91455 -1.000000 +91456 -1.000000 +91457 -1.000000 +91458 -1.000000 +91459 -1.000000 +91460 -1.000000 +91461 -1.000000 +91462 -1.000000 +91463 -1.000000 +91464 -1.000000 +91465 -1.000000 +91466 -1.000000 +91467 -1.000000 +91468 -1.000000 +91469 -1.000000 +91470 -1.000000 +91471 -1.000000 +91472 -1.000000 +91473 -1.000000 +91474 -1.000000 +91475 -1.000000 +91476 -1.000000 +91477 -1.000000 +91478 -1.000000 +91479 -1.000000 +91480 -1.000000 +91481 -1.000000 +91482 -1.000000 +91483 -1.000000 +91484 -1.000000 +91485 -1.000000 +91486 -1.000000 +91487 -1.000000 +91488 -1.000000 +91489 -1.000000 +91490 -1.000000 +91491 -1.000000 +91492 -1.000000 +91493 -1.000000 +91494 -1.000000 +91495 -1.000000 +91496 -1.000000 +91497 -1.000000 +91498 -1.000000 +91499 -1.000000 +91500 -1.000000 +91501 -1.000000 +91502 -1.000000 +91503 -1.000000 +91504 -1.000000 +91505 -1.000000 +91506 -1.000000 +91507 -1.000000 +91508 -1.000000 +91509 -1.000000 +91510 -1.000000 +91511 -1.000000 +91512 -1.000000 +91513 -1.000000 +91514 -1.000000 +91515 -1.000000 +91516 -1.000000 +91517 -1.000000 +91518 -1.000000 +91519 -1.000000 +91520 -1.000000 +91521 -1.000000 +91522 -1.000000 +91523 -1.000000 +91524 -1.000000 +91525 -1.000000 +91526 -1.000000 +91527 -1.000000 +91528 -1.000000 +91529 -1.000000 +91530 -1.000000 +91531 -1.000000 +91532 -1.000000 +91533 -1.000000 +91534 -1.000000 +91535 -1.000000 +91536 -1.000000 +91537 -1.000000 +91538 -1.000000 +91539 -1.000000 +91540 -1.000000 +91541 -1.000000 +91542 -1.000000 +91543 -1.000000 +91544 -1.000000 +91545 -1.000000 +91546 -1.000000 +91547 -1.000000 +91548 -1.000000 +91549 -1.000000 +91550 -1.000000 +91551 -1.000000 +91552 -1.000000 +91553 -1.000000 +91554 -1.000000 +91555 -1.000000 +91556 -1.000000 +91557 -1.000000 +91558 -1.000000 +91559 -1.000000 +91560 -1.000000 +91561 -1.000000 +91562 -1.000000 +91563 -1.000000 +91564 -1.000000 +91565 -1.000000 +91566 -1.000000 +91567 -1.000000 +91568 -1.000000 +91569 -1.000000 +91570 -1.000000 +91571 -1.000000 +91572 -1.000000 +91573 -1.000000 +91574 -1.000000 +91575 -1.000000 +91576 -1.000000 +91577 -1.000000 +91578 -1.000000 +91579 -1.000000 +91580 -1.000000 +91581 -1.000000 +91582 -1.000000 +91583 -1.000000 +91584 -1.000000 +91585 -1.000000 +91586 -1.000000 +91587 -1.000000 +91588 -1.000000 +91589 -1.000000 +91590 -1.000000 +91591 -1.000000 +91592 -1.000000 +91593 -1.000000 +91594 -1.000000 +91595 -1.000000 +91596 -1.000000 +91597 -1.000000 +91598 -1.000000 +91599 -1.000000 +91600 -1.000000 +91601 -1.000000 +91602 -1.000000 +91603 -1.000000 +91604 -1.000000 +91605 -1.000000 +91606 -1.000000 +91607 -1.000000 +91608 -1.000000 +91609 -1.000000 +91610 -1.000000 +91611 -1.000000 +91612 -1.000000 +91614 -1.000000 +91615 -1.000000 +91616 -1.000000 +91617 -1.000000 +91618 -1.000000 +91619 -1.000000 +91620 -1.000000 +91621 -1.000000 +91622 -1.000000 +91623 -1.000000 +91624 -1.000000 +91625 -1.000000 +91626 -1.000000 +91627 -1.000000 +91628 -1.000000 +91629 -1.000000 +91630 -1.000000 +91631 -1.000000 +91632 -1.000000 +91634 -1.000000 +91635 -1.000000 +91636 -1.000000 +91637 -1.000000 +91638 -1.000000 +91639 -1.000000 +91640 -1.000000 +91641 -1.000000 +91642 -1.000000 +91643 -1.000000 +91644 -1.000000 +91645 -1.000000 +91646 -1.000000 +91647 -1.000000 +91648 -1.000000 +91649 -1.000000 +91650 -1.000000 +91651 -1.000000 +91652 -1.000000 +91653 -1.000000 +91654 -1.000000 +91655 -1.000000 +91656 -1.000000 +91657 -1.000000 +91658 -1.000000 +91659 -1.000000 +91660 -1.000000 +91661 -1.000000 +91662 -1.000000 +91663 -1.000000 +91664 -1.000000 +91665 -1.000000 +91666 -1.000000 +91667 -1.000000 +91668 -1.000000 +91669 -1.000000 +91670 -1.000000 +91671 -1.000000 +91672 -1.000000 +91673 -1.000000 +91674 -1.000000 +91675 -1.000000 +91676 -1.000000 +91677 -1.000000 +91678 -1.000000 +91679 -1.000000 +91680 -1.000000 +91681 -1.000000 +91682 -1.000000 +91683 -1.000000 +91684 -1.000000 +91685 -1.000000 +91686 -1.000000 +91687 -1.000000 +91688 -1.000000 +91689 -1.000000 +91690 -1.000000 +91691 -1.000000 +91692 -1.000000 +91693 -1.000000 +91694 -1.000000 +91695 -1.000000 +91696 -1.000000 +91697 -1.000000 +91698 -1.000000 +91699 -1.000000 +91700 -1.000000 +91701 -1.000000 +91702 -1.000000 +91703 -1.000000 +91704 -1.000000 +91705 -1.000000 +91706 -1.000000 +91707 -1.000000 +91708 -1.000000 +91709 -1.000000 +91710 -1.000000 +91711 -1.000000 +91712 -1.000000 +91713 -1.000000 +91714 -1.000000 +91715 -1.000000 +91716 -1.000000 +91717 -1.000000 +91718 -1.000000 +91719 -1.000000 +91720 -1.000000 +91721 -1.000000 +91722 -1.000000 +91724 -1.000000 +91725 -1.000000 +91726 -1.000000 +91727 -1.000000 +91728 -1.000000 +91729 -1.000000 +91730 -1.000000 +91731 -1.000000 +91732 -1.000000 +91733 -1.000000 +91734 -1.000000 +91735 -1.000000 +91736 -1.000000 +91737 -1.000000 +91738 -1.000000 +91739 -1.000000 +91740 -1.000000 +91741 -1.000000 +91742 -1.000000 +91743 -1.000000 +91744 -1.000000 +91745 -1.000000 +91746 -1.000000 +91747 -1.000000 +91748 -1.000000 +91749 -1.000000 +91750 -1.000000 +91751 -1.000000 +91752 -1.000000 +91753 -1.000000 +91754 -1.000000 +91755 -1.000000 +91756 -1.000000 +91757 -1.000000 +91758 -1.000000 +91759 -1.000000 +91760 -1.000000 +91761 -1.000000 +91762 -1.000000 +91763 -1.000000 +91764 -1.000000 +91765 -1.000000 +91766 -1.000000 +91767 -1.000000 +91768 -1.000000 +91769 -1.000000 +91770 -1.000000 +91771 -1.000000 +91772 -1.000000 +91773 -1.000000 +91774 -1.000000 +91775 -1.000000 +91776 -1.000000 +91777 -1.000000 +91778 -1.000000 +91779 -1.000000 +91780 -1.000000 +91781 -1.000000 +91782 -1.000000 +91783 -1.000000 +91784 -1.000000 +91785 -1.000000 +91786 -1.000000 +91787 -1.000000 +91788 -1.000000 +91789 -1.000000 +91790 -1.000000 +91791 -1.000000 +91792 -1.000000 +91793 -1.000000 +91794 -1.000000 +91795 -1.000000 +91796 -1.000000 +91797 -1.000000 +91798 -1.000000 +91799 -1.000000 +91800 -1.000000 +91801 -1.000000 +91802 -1.000000 +91803 -1.000000 +91804 -1.000000 +91805 -1.000000 +91806 -1.000000 +91807 -1.000000 +91808 -1.000000 +91809 -1.000000 +91810 -1.000000 +91811 -1.000000 +91812 -1.000000 +91813 -1.000000 +91814 -1.000000 +91815 -1.000000 +91816 -1.000000 +91817 -1.000000 +91818 -1.000000 +91819 -1.000000 +91820 -1.000000 +91821 -1.000000 +91822 -1.000000 +91823 -1.000000 +91824 -1.000000 +91825 -1.000000 +91826 -1.000000 +91827 -1.000000 +91828 -1.000000 +91829 -1.000000 +91830 -1.000000 +91831 -1.000000 +91832 -1.000000 +91833 -1.000000 +91834 -1.000000 +91835 -1.000000 +91836 -1.000000 +91837 -1.000000 +91838 -1.000000 +91839 -1.000000 +91840 -1.000000 +91841 -1.000000 +91842 -1.000000 +91843 -1.000000 +91844 -1.000000 +91845 -1.000000 +91846 -1.000000 +91847 -1.000000 +91848 -1.000000 +91849 -1.000000 +91850 -1.000000 +91851 -1.000000 +91852 -1.000000 +91853 -1.000000 +91854 -1.000000 +91855 -1.000000 +91856 -1.000000 +91857 -1.000000 +91858 -1.000000 +91859 -1.000000 +91860 -1.000000 +91861 -1.000000 +91862 -1.000000 +91863 -1.000000 +91864 -1.000000 +91865 -1.000000 +91866 -1.000000 +91867 -1.000000 +91868 -1.000000 +91869 -1.000000 +91870 -1.000000 +91871 -1.000000 +91872 -1.000000 +91873 -1.000000 +91874 -1.000000 +91876 -1.000000 +91877 -1.000000 +91878 -1.000000 +91879 -1.000000 +91880 -1.000000 +91881 -1.000000 +91882 -1.000000 +91883 -1.000000 +91884 -1.000000 +91885 -1.000000 +91886 -1.000000 +91887 -1.000000 +91888 -1.000000 +91889 -1.000000 +91890 -1.000000 +91891 -1.000000 +91892 -1.000000 +91893 -1.000000 +91894 -1.000000 +91895 -1.000000 +91896 -1.000000 +91897 -1.000000 +91898 -1.000000 +91899 -1.000000 +91900 -1.000000 +91901 -1.000000 +91902 -1.000000 +91903 -1.000000 +91904 -1.000000 +91905 -1.000000 +91906 -1.000000 +91907 -1.000000 +91908 -1.000000 +91909 -1.000000 +91910 -1.000000 +91911 -1.000000 +91912 -1.000000 +91913 -1.000000 +91914 -1.000000 +91915 -1.000000 +91916 -1.000000 +91917 -1.000000 +91918 -1.000000 +91919 -1.000000 +91920 -1.000000 +91921 -1.000000 +91922 -1.000000 +91923 -1.000000 +91924 -1.000000 +91925 -1.000000 +91926 -1.000000 +91927 -1.000000 +91928 -1.000000 +91929 -1.000000 +91930 -1.000000 +91931 -1.000000 +91932 -1.000000 +91933 -1.000000 +91934 -1.000000 +91935 -1.000000 +91936 -1.000000 +91937 -1.000000 +91938 -1.000000 +91939 -1.000000 +91940 -1.000000 +91941 -1.000000 +91942 -1.000000 +91943 -1.000000 +91944 -1.000000 +91945 -1.000000 +91946 -1.000000 +91947 -1.000000 +91948 -1.000000 +91949 -1.000000 +91950 -1.000000 +91951 -1.000000 +91952 -1.000000 +91953 -1.000000 +91954 -1.000000 +91955 -1.000000 +91956 -1.000000 +91957 -1.000000 +91958 -1.000000 +91959 -1.000000 +91960 -1.000000 +91961 -1.000000 +91962 -1.000000 +91963 -1.000000 +91964 -1.000000 +91965 -1.000000 +91966 -1.000000 +91967 -1.000000 +91968 -1.000000 +91969 -1.000000 +91970 -1.000000 +91971 -1.000000 +91972 -1.000000 +91973 -1.000000 +91974 -1.000000 +91975 -1.000000 +91976 -1.000000 +91977 -1.000000 +91978 -1.000000 +91979 -1.000000 +91980 -1.000000 +91981 -1.000000 +91982 -1.000000 +91983 -1.000000 +91984 -1.000000 +91985 -1.000000 +91986 -1.000000 +91987 -1.000000 +91988 -1.000000 +91989 -1.000000 +91990 -1.000000 +91991 -1.000000 +91992 -1.000000 +91993 -1.000000 +91994 -1.000000 +91995 -1.000000 +91996 -1.000000 +91997 -1.000000 +91998 -1.000000 +91999 -1.000000 +92000 -1.000000 +92001 -1.000000 +92002 -1.000000 +92003 -1.000000 +92004 -1.000000 +92005 -1.000000 +92006 -1.000000 +92007 -1.000000 +92008 -1.000000 +92009 -1.000000 +92010 -1.000000 +92011 -1.000000 +92012 -1.000000 +92013 -1.000000 +92014 -1.000000 +92015 -1.000000 +92016 -1.000000 +92017 -1.000000 +92018 -1.000000 +92019 -1.000000 +92020 -1.000000 +92021 -1.000000 +92022 -1.000000 +92023 -1.000000 +92024 -1.000000 +92025 -1.000000 +92026 -1.000000 +92027 -1.000000 +92028 -1.000000 +92029 -1.000000 +92030 -1.000000 +92031 -1.000000 +92032 -1.000000 +92033 -1.000000 +92034 -1.000000 +92035 -1.000000 +92036 -1.000000 +92037 -1.000000 +92038 -1.000000 +92039 -1.000000 +92040 -1.000000 +92041 -1.000000 +92042 -1.000000 +92043 -1.000000 +92044 -1.000000 +92045 -1.000000 +92046 -1.000000 +92047 -1.000000 +92048 -1.000000 +92049 -1.000000 +92050 -1.000000 +92051 -1.000000 +92052 -1.000000 +92053 -1.000000 +92054 -1.000000 +92055 -1.000000 +92056 -1.000000 +92057 -1.000000 +92058 -1.000000 +92059 -1.000000 +92060 -1.000000 +92061 -1.000000 +92062 -1.000000 +92063 -1.000000 +92064 -1.000000 +92065 -1.000000 +92066 -1.000000 +92067 -1.000000 +92068 -1.000000 +92069 -1.000000 +92070 -1.000000 +92071 -1.000000 +92072 -1.000000 +92073 -1.000000 +92074 -1.000000 +92075 -1.000000 +92076 -1.000000 +92077 -1.000000 +92078 -1.000000 +92079 -1.000000 +92080 -1.000000 +92081 -1.000000 +92082 -1.000000 +92083 -1.000000 +92084 -1.000000 +92085 -1.000000 +92086 -1.000000 +92087 -1.000000 +92088 -1.000000 +92089 -1.000000 +92090 -1.000000 +92091 -1.000000 +92092 -1.000000 +92093 -1.000000 +92094 -1.000000 +92095 -1.000000 +92096 -1.000000 +92097 -1.000000 +92098 -1.000000 +92099 -1.000000 +92100 -1.000000 +92101 -1.000000 +92102 -1.000000 +92103 -1.000000 +92104 -1.000000 +92105 -1.000000 +92106 -1.000000 +92107 -1.000000 +92108 -1.000000 +92109 -1.000000 +92110 -1.000000 +92111 -1.000000 +92112 -1.000000 +92113 -1.000000 +92114 -1.000000 +92115 -1.000000 +92116 -1.000000 +92117 -1.000000 +92118 -1.000000 +92119 -1.000000 +92120 -1.000000 +92121 -1.000000 +92122 -1.000000 +92123 -1.000000 +92124 -1.000000 +92125 -1.000000 +92126 -1.000000 +92127 -1.000000 +92128 -1.000000 +92129 -1.000000 +92130 -1.000000 +92131 -1.000000 +92132 -1.000000 +92133 -1.000000 +92134 -1.000000 +92135 -1.000000 +92136 -1.000000 +92137 -1.000000 +92138 -1.000000 +92139 -1.000000 +92140 -1.000000 +92141 -1.000000 +92142 -1.000000 +92143 -1.000000 +92144 -1.000000 +92145 -1.000000 +92146 -1.000000 +92147 -1.000000 +92148 -1.000000 +92149 -1.000000 +92150 -1.000000 +92151 -1.000000 +92152 -1.000000 +92153 -1.000000 +92154 -1.000000 +92155 -1.000000 +92156 -1.000000 +92157 -1.000000 +92158 -1.000000 +92159 -1.000000 +92160 -1.000000 +92161 -1.000000 +92162 -1.000000 +92163 -1.000000 +92164 -1.000000 +92165 -1.000000 +92166 -1.000000 +92167 -1.000000 +92168 -1.000000 +92169 -1.000000 +92170 -1.000000 +92171 -1.000000 +92172 -1.000000 +92173 -1.000000 +92174 -1.000000 +92175 -1.000000 +92176 -1.000000 +92177 -1.000000 +92178 -1.000000 +92179 -1.000000 +92180 -1.000000 +92181 -1.000000 +92182 -1.000000 +92183 -1.000000 +92184 -1.000000 +92185 -1.000000 +92186 -1.000000 +92187 -1.000000 +92188 -1.000000 +92189 -1.000000 +92190 -1.000000 +92191 -1.000000 +92192 -1.000000 +92193 -1.000000 +92194 -1.000000 +92195 -1.000000 +92196 -1.000000 +92197 -1.000000 +92198 -1.000000 +92199 -1.000000 +92200 -1.000000 +92201 -1.000000 +92202 -1.000000 +92203 -1.000000 +92204 -1.000000 +92205 -1.000000 +92206 -1.000000 +92207 -1.000000 +92208 -1.000000 +92209 -1.000000 +92210 -1.000000 +92211 -1.000000 +92212 -1.000000 +92213 -1.000000 +92214 -1.000000 +92215 -1.000000 +92216 -1.000000 +92217 -1.000000 +92218 -1.000000 +92219 -1.000000 +92220 -1.000000 +92221 -1.000000 +92222 -1.000000 +92223 -1.000000 +92224 -1.000000 +92225 -1.000000 +92226 -1.000000 +92227 -1.000000 +92228 -1.000000 +92229 -1.000000 +92230 -1.000000 +92231 -1.000000 +92232 -1.000000 +92233 -1.000000 +92234 -1.000000 +92235 -1.000000 +92236 -1.000000 +92237 -1.000000 +92238 -1.000000 +92239 -1.000000 +92240 -1.000000 +92241 -1.000000 +92243 -1.000000 +92244 -1.000000 +92245 -1.000000 +92246 -1.000000 +92247 -1.000000 +92248 -1.000000 +92249 -1.000000 +92250 -1.000000 +92251 -1.000000 +92252 -1.000000 +92253 -1.000000 +92254 -1.000000 +92255 -1.000000 +92256 -1.000000 +92257 -1.000000 +92258 -1.000000 +92259 -1.000000 +92260 -1.000000 +92261 -1.000000 +92262 -1.000000 +92263 -1.000000 +92264 -1.000000 +92265 -1.000000 +92266 -1.000000 +92267 -1.000000 +92268 -1.000000 +92269 -1.000000 +92270 -1.000000 +92271 -1.000000 +92272 -1.000000 +92273 -1.000000 +92274 -1.000000 +92275 -1.000000 +92276 -1.000000 +92277 -1.000000 +92278 -1.000000 +92279 -1.000000 +92280 -1.000000 +92281 -1.000000 +92282 -1.000000 +92283 -1.000000 +92284 -1.000000 +92285 -1.000000 +92286 -1.000000 +92287 -1.000000 +92288 -1.000000 +92289 -1.000000 +92290 -1.000000 +92291 -1.000000 +92292 -1.000000 +92293 -1.000000 +92294 -1.000000 +92295 -1.000000 +92296 -1.000000 +92297 -1.000000 +92298 -1.000000 +92299 -1.000000 +92300 -1.000000 +92301 -1.000000 +92302 -1.000000 +92303 -1.000000 +92304 -1.000000 +92305 -1.000000 +92306 -1.000000 +92307 -1.000000 +92308 -1.000000 +92309 -1.000000 +92310 -1.000000 +92311 -1.000000 +92312 -1.000000 +92313 -1.000000 +92314 -1.000000 +92315 -1.000000 +92316 -1.000000 +92317 -1.000000 +92318 -1.000000 +92319 -1.000000 +92320 -1.000000 +92321 -1.000000 +92322 -1.000000 +92323 -1.000000 +92324 -1.000000 +92325 -1.000000 +92326 -1.000000 +92327 -1.000000 +92328 -1.000000 +92329 -1.000000 +92330 -1.000000 +92331 -1.000000 +92332 -1.000000 +92333 -1.000000 +92334 -1.000000 +92335 -1.000000 +92336 -1.000000 +92337 -1.000000 +92338 -1.000000 +92339 -1.000000 +92340 -1.000000 +92341 -1.000000 +92342 -1.000000 +92343 -1.000000 +92344 -1.000000 +92345 -1.000000 +92346 -1.000000 +92347 -1.000000 +92348 -1.000000 +92349 -1.000000 +92350 -1.000000 +92351 -1.000000 +92352 -1.000000 +92353 -1.000000 +92354 -1.000000 +92355 -1.000000 +92356 -1.000000 +92357 -1.000000 +92358 -1.000000 +92359 -1.000000 +92360 -1.000000 +92361 -1.000000 +92362 -1.000000 +92363 -1.000000 +92364 -1.000000 +92365 -1.000000 +92366 -1.000000 +92367 -1.000000 +92368 -1.000000 +92369 -1.000000 +92370 -1.000000 +92371 -1.000000 +92372 -1.000000 +92373 -1.000000 +92374 -1.000000 +92375 -1.000000 +92376 -1.000000 +92377 -1.000000 +92378 -1.000000 +92379 -1.000000 +92380 -1.000000 +92381 -1.000000 +92382 -1.000000 +92383 -1.000000 +92384 -1.000000 +92385 -1.000000 +92386 -1.000000 +92387 -1.000000 +92388 -1.000000 +92389 -1.000000 +92390 -1.000000 +92391 -1.000000 +92392 -1.000000 +92393 -1.000000 +92394 -1.000000 +92395 -1.000000 +92396 -1.000000 +92397 -1.000000 +92398 -1.000000 +92399 -1.000000 +92400 -1.000000 +92401 -1.000000 +92402 -1.000000 +92403 -1.000000 +92404 -1.000000 +92405 -1.000000 +92406 -1.000000 +92407 -1.000000 +92408 -1.000000 +92409 -1.000000 +92410 -1.000000 +92411 -1.000000 +92412 -1.000000 +92413 -1.000000 +92414 -1.000000 +92415 -1.000000 +92416 -1.000000 +92417 -1.000000 +92418 -1.000000 +92419 -1.000000 +92420 -1.000000 +92421 -1.000000 +92422 -1.000000 +92423 -1.000000 +92424 -1.000000 +92425 -1.000000 +92426 -1.000000 +92427 -1.000000 +92428 -1.000000 +92429 -1.000000 +92430 -1.000000 +92431 -1.000000 +92432 -1.000000 +92433 -1.000000 +92434 -1.000000 +92435 -1.000000 +92436 -1.000000 +92437 -1.000000 +92438 -1.000000 +92439 -1.000000 +92440 -1.000000 +92441 -1.000000 +92442 -1.000000 +92443 -1.000000 +92444 -1.000000 +92445 -1.000000 +92446 -1.000000 +92447 -1.000000 +92448 -1.000000 +92449 -1.000000 +92450 -1.000000 +92451 -1.000000 +92452 -1.000000 +92453 -1.000000 +92454 -1.000000 +92455 -1.000000 +92456 -1.000000 +92457 -1.000000 +92458 -1.000000 +92459 -1.000000 +92460 -1.000000 +92461 -1.000000 +92462 -1.000000 +92463 -1.000000 +92464 -1.000000 +92465 -1.000000 +92466 -1.000000 +92467 -1.000000 +92468 -1.000000 +92469 -1.000000 +92470 -1.000000 +92471 -1.000000 +92472 -1.000000 +92473 -1.000000 +92474 -1.000000 +92475 -1.000000 +92476 -1.000000 +92477 -1.000000 +92478 -1.000000 +92479 -1.000000 +92480 -1.000000 +92481 -1.000000 +92482 -1.000000 +92483 -1.000000 +92484 -1.000000 +92485 -1.000000 +92486 -1.000000 +92487 -1.000000 +92488 -1.000000 +92489 -1.000000 +92490 -1.000000 +92491 -1.000000 +92492 -1.000000 +92493 -1.000000 +92494 -1.000000 +92495 -1.000000 +92496 -1.000000 +92497 -1.000000 +92498 -1.000000 +92499 -1.000000 +92500 -1.000000 +92501 -1.000000 +92502 -1.000000 +92503 -1.000000 +92504 -1.000000 +92505 -1.000000 +92506 -1.000000 +92507 -1.000000 +92508 -1.000000 +92509 -1.000000 +92510 -1.000000 +92511 -1.000000 +92512 -1.000000 +92513 -1.000000 +92514 -1.000000 +92515 -1.000000 +92516 -1.000000 +92517 -1.000000 +92518 -1.000000 +92519 -1.000000 +92520 -1.000000 +92521 -1.000000 +92522 -1.000000 +92523 -1.000000 +92524 -1.000000 +92525 -1.000000 +92526 -1.000000 +92527 -1.000000 +92528 -1.000000 +92529 -1.000000 +92530 -1.000000 +92531 -1.000000 +92532 -1.000000 +92533 -1.000000 +92534 -1.000000 +92535 -1.000000 +92536 -1.000000 +92537 -1.000000 +92538 -1.000000 +92539 -1.000000 +92540 -1.000000 +92541 -1.000000 +92542 -1.000000 +92543 -1.000000 +92544 -1.000000 +92545 -1.000000 +92546 -1.000000 +92547 -1.000000 +92548 -1.000000 +92549 -1.000000 +92550 -1.000000 +92551 -1.000000 +92552 -1.000000 +92553 -1.000000 +92554 -1.000000 +92555 -1.000000 +92556 -1.000000 +92557 -1.000000 +92558 -1.000000 +92559 -1.000000 +92560 -1.000000 +92561 -1.000000 +92562 -1.000000 +92563 -1.000000 +92564 -1.000000 +92565 -1.000000 +92566 -1.000000 +92567 -1.000000 +92568 -1.000000 +92569 -1.000000 +92570 -1.000000 +92571 -1.000000 +92572 -1.000000 +92573 -1.000000 +92574 -1.000000 +92575 -1.000000 +92576 -1.000000 +92577 -1.000000 +92578 -1.000000 +92579 -1.000000 +92580 -1.000000 +92581 -1.000000 +92582 -1.000000 +92583 -1.000000 +92584 -1.000000 +92585 -1.000000 +92586 -1.000000 +92587 -1.000000 +92588 -1.000000 +92589 -1.000000 +92590 -1.000000 +92591 -1.000000 +92592 -1.000000 +92593 -1.000000 +92594 -1.000000 +92595 -1.000000 +92596 -1.000000 +92597 -1.000000 +92598 -1.000000 +92599 -1.000000 +92600 -1.000000 +92601 -1.000000 +92602 -1.000000 +92603 -1.000000 +92604 -1.000000 +92605 -1.000000 +92606 -1.000000 +92607 -1.000000 +92608 -1.000000 +92609 -1.000000 +92610 -1.000000 +92611 -1.000000 +92612 -1.000000 +92613 -1.000000 +92614 -1.000000 +92615 -1.000000 +92616 -1.000000 +92617 -1.000000 +92618 -1.000000 +92619 -1.000000 +92620 -1.000000 +92621 -1.000000 +92622 -1.000000 +92623 -1.000000 +92624 -1.000000 +92625 -1.000000 +92626 -1.000000 +92627 -1.000000 +92628 -1.000000 +92629 -1.000000 +92630 -1.000000 +92631 -1.000000 +92632 -1.000000 +92633 -1.000000 +92634 -1.000000 +92635 -1.000000 +92636 -1.000000 +92637 -1.000000 +92638 -1.000000 +92639 -1.000000 +92640 -1.000000 +92641 -1.000000 +92642 -1.000000 +92643 -1.000000 +92644 -1.000000 +92645 -1.000000 +92646 -1.000000 +92647 -1.000000 +92648 -1.000000 +92649 -1.000000 +92650 -1.000000 +92651 -1.000000 +92652 -1.000000 +92653 -1.000000 +92654 -1.000000 +92655 -1.000000 +92656 -1.000000 +92657 -1.000000 +92658 -1.000000 +92659 -1.000000 +92660 -1.000000 +92661 -1.000000 +92662 -1.000000 +92663 -1.000000 +92664 -1.000000 +92665 -1.000000 +92666 -1.000000 +92667 -1.000000 +92668 -1.000000 +92669 -1.000000 +92670 -1.000000 +92671 -1.000000 +92672 -1.000000 +92673 -1.000000 +92674 -1.000000 +92675 -1.000000 +92676 -1.000000 +92677 -1.000000 +92678 -1.000000 +92679 -1.000000 +92680 -1.000000 +92681 -1.000000 +92682 -1.000000 +92683 -1.000000 +92684 -1.000000 +92685 -1.000000 +92686 -1.000000 +92687 -1.000000 +92688 -1.000000 +92689 -1.000000 +92690 -1.000000 +92691 -1.000000 +92692 -1.000000 +92693 -1.000000 +92694 -1.000000 +92695 -1.000000 +92696 -1.000000 +92697 -1.000000 +92698 -1.000000 +92699 -1.000000 +92700 -1.000000 +92701 -1.000000 +92702 -1.000000 +92703 -1.000000 +92704 -1.000000 +92705 -1.000000 +92706 -1.000000 +92707 -1.000000 +92708 -1.000000 +92709 -1.000000 +92710 -1.000000 +92711 -1.000000 +92712 -1.000000 +92713 -1.000000 +92714 -1.000000 +92715 -1.000000 +92716 -1.000000 +92717 -1.000000 +92718 -1.000000 +92719 -1.000000 +92720 -1.000000 +92721 -1.000000 +92722 -1.000000 +92723 -1.000000 +92724 -1.000000 +92725 -1.000000 +92726 -1.000000 +92727 -1.000000 +92728 -1.000000 +92729 -1.000000 +92730 -1.000000 +92731 -1.000000 +92732 -1.000000 +92733 -1.000000 +92734 -1.000000 +92735 -1.000000 +92736 -1.000000 +92737 -1.000000 +92738 -1.000000 +92739 -1.000000 +92740 -1.000000 +92741 -1.000000 +92742 -1.000000 +92743 -1.000000 +92744 -1.000000 +92745 -1.000000 +92746 -1.000000 +92747 -1.000000 +92748 -1.000000 +92749 -1.000000 +92750 -1.000000 +92751 -1.000000 +92752 -1.000000 +92753 -1.000000 +92754 -1.000000 +92755 -1.000000 +92756 -1.000000 +92757 -1.000000 +92758 -1.000000 +92759 -1.000000 +92760 -1.000000 +92761 -1.000000 +92762 -1.000000 +92763 -1.000000 +92764 -1.000000 +92765 -1.000000 +92766 -1.000000 +92767 -1.000000 +92768 -1.000000 +92769 -1.000000 +92770 -1.000000 +92771 -1.000000 +92772 -1.000000 +92773 -1.000000 +92774 -1.000000 +92775 -1.000000 +92776 -1.000000 +92777 -1.000000 +92778 -1.000000 +92779 -1.000000 +92780 -1.000000 +92781 -1.000000 +92782 -1.000000 +92783 -1.000000 +92784 -1.000000 +92785 -1.000000 +92786 -1.000000 +92787 -1.000000 +92788 -1.000000 +92789 -1.000000 +92790 -1.000000 +92791 -1.000000 +92792 -1.000000 +92793 -1.000000 +92794 -1.000000 +92795 -1.000000 +92796 -1.000000 +92797 -1.000000 +92798 -1.000000 +92805 -1.000000 +92806 -1.000000 +92807 -1.000000 +92808 -1.000000 +92809 -1.000000 +92810 -1.000000 +92811 -1.000000 +92812 -1.000000 +92813 -1.000000 +92814 -1.000000 +92815 -1.000000 +92816 -1.000000 +92817 -1.000000 +92818 -1.000000 +92819 -1.000000 +92820 -1.000000 +92821 -1.000000 +92822 -1.000000 +92823 -1.000000 +92824 -1.000000 +92825 -1.000000 +92826 -1.000000 +92827 -1.000000 +92828 -1.000000 +92829 -1.000000 +92830 -1.000000 +92831 -1.000000 +92832 -1.000000 +92833 -1.000000 +92834 -1.000000 +92835 -1.000000 +92836 -1.000000 +92837 -1.000000 +92838 -1.000000 +92839 -1.000000 +92840 -1.000000 +92841 -1.000000 +92842 -1.000000 +92843 -1.000000 +92844 -1.000000 +92845 -1.000000 +92846 -1.000000 +92847 -1.000000 +92848 -1.000000 +92849 -1.000000 +92850 -1.000000 +92851 -1.000000 +92852 -1.000000 +92853 -1.000000 +92854 -1.000000 +92855 -1.000000 +92856 -1.000000 +92857 -1.000000 +92858 -1.000000 +92859 -1.000000 +92860 -1.000000 +92861 -1.000000 +92862 -1.000000 +92863 -1.000000 +92864 -1.000000 +92865 -1.000000 +92866 -1.000000 +92867 -1.000000 +92868 -1.000000 +92869 -1.000000 +92870 -1.000000 +92871 -1.000000 +92872 -1.000000 +92873 -1.000000 +92874 -1.000000 +92875 -1.000000 +92876 -1.000000 +92877 -1.000000 +92878 -1.000000 +92879 -1.000000 +92880 -1.000000 +92881 -1.000000 +92882 -1.000000 +92883 -1.000000 +92884 -1.000000 +92885 -1.000000 +92886 -1.000000 +92887 -1.000000 +92888 -1.000000 +92889 -1.000000 +92890 -1.000000 +92891 -1.000000 +92892 -1.000000 +92893 -1.000000 +92894 -1.000000 +92895 -1.000000 +92896 -1.000000 +92897 -1.000000 +92898 -1.000000 +92899 -1.000000 +92900 -1.000000 +92901 -1.000000 +92902 -1.000000 +92903 -1.000000 +92904 -1.000000 +92905 -1.000000 +92906 -1.000000 +92907 -1.000000 +92908 -1.000000 +92909 -1.000000 +92910 -1.000000 +92911 -1.000000 +92912 -1.000000 +92913 -1.000000 +92914 -1.000000 +92915 -1.000000 +92916 -1.000000 +92917 -1.000000 +92918 -1.000000 +92919 -1.000000 +92920 -1.000000 +92921 -1.000000 +92922 -1.000000 +92923 -1.000000 +92924 -1.000000 +92925 -1.000000 +92926 -1.000000 +92927 -1.000000 +92928 -1.000000 +92929 -1.000000 +92930 -1.000000 +92931 -1.000000 +92932 -1.000000 +92933 -1.000000 +92934 -1.000000 +92935 -1.000000 +92936 -1.000000 +92937 -1.000000 +92938 -1.000000 +92939 -1.000000 +92940 -1.000000 +92941 -1.000000 +92942 -1.000000 +92943 -1.000000 +92944 -1.000000 +92945 -1.000000 +92946 -1.000000 +92947 -1.000000 +92948 -1.000000 +92949 -1.000000 +92950 -1.000000 +92951 -1.000000 +92952 -1.000000 +92953 -1.000000 +92954 -1.000000 +92955 -1.000000 +92956 -1.000000 +92957 -1.000000 +92958 -1.000000 +92959 -1.000000 +92960 -1.000000 +92961 -1.000000 +92962 -1.000000 +92963 -1.000000 +92964 -1.000000 +92965 -1.000000 +92966 -1.000000 +92967 -1.000000 +92968 -1.000000 +92969 -1.000000 +92970 -1.000000 +92971 -1.000000 +92972 -1.000000 +92973 -1.000000 +92974 -1.000000 +92975 -1.000000 +92976 -1.000000 +92977 -1.000000 +92978 -1.000000 +92979 -1.000000 +92980 -1.000000 +92981 -1.000000 +92982 -1.000000 +92983 -1.000000 +92984 -1.000000 +92985 -1.000000 +92986 -1.000000 +92987 -1.000000 +92988 -1.000000 +92989 -1.000000 +92990 -1.000000 +92991 -1.000000 +92992 -1.000000 +92993 -1.000000 +92994 -1.000000 +92995 -1.000000 +92996 -1.000000 +92997 -1.000000 +92998 -1.000000 +92999 -1.000000 +93000 -1.000000 +93001 -1.000000 +93002 -1.000000 +93003 -1.000000 +93004 -1.000000 +93005 -1.000000 +93006 -1.000000 +93007 -1.000000 +93008 -1.000000 +93009 -1.000000 +93010 -1.000000 +93011 -1.000000 +93012 -1.000000 +93013 -1.000000 +93014 -1.000000 +93015 -1.000000 +93016 -1.000000 +93017 -1.000000 +93018 -1.000000 +93019 -1.000000 +93020 -1.000000 +93021 -1.000000 +93022 -1.000000 +93023 -1.000000 +93024 -1.000000 +93025 -1.000000 +93026 -1.000000 +93027 -1.000000 +93028 -1.000000 +93029 -1.000000 +93030 -1.000000 +93031 -1.000000 +93032 -1.000000 +93033 -1.000000 +93034 -1.000000 +93035 -1.000000 +93036 -1.000000 +93037 -1.000000 +93038 -1.000000 +93039 -1.000000 +93040 -1.000000 +93041 -1.000000 +93042 -1.000000 +93043 -1.000000 +93044 -1.000000 +93045 -1.000000 +93046 -1.000000 +93047 -1.000000 +93048 -1.000000 +93049 -1.000000 +93050 -1.000000 +93051 -1.000000 +93052 -1.000000 +93053 -1.000000 +93054 -1.000000 +93055 -1.000000 +93056 -1.000000 +93057 -1.000000 +93058 -1.000000 +93059 -1.000000 +93060 -1.000000 +93061 -1.000000 +93062 -1.000000 +93063 -1.000000 +93064 -1.000000 +93065 -1.000000 +93066 -1.000000 +93067 -1.000000 +93068 -1.000000 +93069 -1.000000 +93070 -1.000000 +93071 -1.000000 +93072 -1.000000 +93073 -1.000000 +93074 -1.000000 +93075 -1.000000 +93076 -1.000000 +93077 -1.000000 +93078 -1.000000 +93079 -1.000000 +93080 -1.000000 +93081 -1.000000 +93082 -1.000000 +93083 -1.000000 +93084 -1.000000 +93085 -1.000000 +93086 -1.000000 +93087 -1.000000 +93088 -1.000000 +93089 -1.000000 +93090 -1.000000 +93091 -1.000000 +93092 -1.000000 +93093 -1.000000 +93094 -1.000000 +93095 -1.000000 +93096 -1.000000 +93097 -1.000000 +93098 -1.000000 +93099 -1.000000 +93100 -1.000000 +93101 -1.000000 +93102 -1.000000 +93103 -1.000000 +93104 -1.000000 +93105 -1.000000 +93106 -1.000000 +93107 -1.000000 +93108 -1.000000 +93109 -1.000000 +93110 -1.000000 +93111 -1.000000 +93112 -1.000000 +93113 -1.000000 +93114 -1.000000 +93115 -1.000000 +93116 -1.000000 +93117 -1.000000 +93118 -1.000000 +93119 -1.000000 +93120 -1.000000 +93121 -1.000000 +93122 -1.000000 +93123 -1.000000 +93124 -1.000000 +93125 -1.000000 +93126 -1.000000 +93127 -1.000000 +93128 -1.000000 +93129 -1.000000 +93130 -1.000000 +93131 -1.000000 +93132 -1.000000 +93133 -1.000000 +93134 -1.000000 +93135 -1.000000 +93136 -1.000000 +93137 -1.000000 +93138 -1.000000 +93139 -1.000000 +93140 -1.000000 +93141 -1.000000 +93142 -1.000000 +93143 -1.000000 +93144 -1.000000 +93145 -1.000000 +93146 -1.000000 +93147 -1.000000 +93148 -1.000000 +93149 -1.000000 +93150 -1.000000 +93151 -1.000000 +93152 -1.000000 +93153 -1.000000 +93154 -1.000000 +93155 -1.000000 +93156 -1.000000 +93157 -1.000000 +93158 -1.000000 +93159 -1.000000 +93160 -1.000000 +93161 -1.000000 +93162 -1.000000 +93163 -1.000000 +93164 -1.000000 +93165 -1.000000 +93166 -1.000000 +93167 -1.000000 +93168 -1.000000 +93169 -1.000000 +93170 -1.000000 +93171 -1.000000 +93172 -1.000000 +93173 -1.000000 +93174 -1.000000 +93175 -1.000000 +93176 -1.000000 +93177 -1.000000 +93178 -1.000000 +93179 -1.000000 +93180 -1.000000 +93181 -1.000000 +93182 -1.000000 +93183 -1.000000 +93184 -1.000000 +93185 -1.000000 +93186 -1.000000 +93187 -1.000000 +93188 -1.000000 +93189 -1.000000 +93190 -1.000000 +93191 -1.000000 +93192 -1.000000 +93193 -1.000000 +93194 -1.000000 +93195 -1.000000 +93196 -1.000000 +93197 -1.000000 +93198 -1.000000 +93199 -1.000000 +93200 -1.000000 +93201 -1.000000 +93202 -1.000000 +93203 -1.000000 +93204 -1.000000 +93205 -1.000000 +93206 -1.000000 +93207 -1.000000 +93208 -1.000000 +93209 -1.000000 +93210 -1.000000 +93211 -1.000000 +93212 -1.000000 +93213 -1.000000 +93214 -1.000000 +93215 -1.000000 +93216 -1.000000 +93217 -1.000000 +93218 -1.000000 +93219 -1.000000 +93220 -1.000000 +93221 -1.000000 +93222 -1.000000 +93223 -1.000000 +93224 -1.000000 +93225 -1.000000 +93226 -1.000000 +93227 -1.000000 +93228 -1.000000 +93229 -1.000000 +93230 -1.000000 +93231 -1.000000 +93232 -1.000000 +93233 -1.000000 +93234 -1.000000 +93235 -1.000000 +93236 -1.000000 +93237 -1.000000 +93238 -1.000000 +93239 -1.000000 +93240 -1.000000 +93241 -1.000000 +93242 -1.000000 +93243 -1.000000 +93244 -1.000000 +93245 -1.000000 +93246 -1.000000 +93247 -1.000000 +93248 -1.000000 +93249 -1.000000 +93250 -1.000000 +93251 -1.000000 +93252 -1.000000 +93253 -1.000000 +93254 -1.000000 +93255 -1.000000 +93256 -1.000000 +93257 -1.000000 +93258 -1.000000 +93259 -1.000000 +93260 -1.000000 +93261 -1.000000 +93262 -1.000000 +93263 -1.000000 +93264 -1.000000 +93265 -1.000000 +93266 -1.000000 +93267 -1.000000 +93268 -1.000000 +93269 -1.000000 +93270 -1.000000 +93271 -1.000000 +93272 -1.000000 +93273 -1.000000 +93274 -1.000000 +93275 -1.000000 +93276 -1.000000 +93277 -1.000000 +93278 -1.000000 +93279 -1.000000 +93280 -1.000000 +93281 -1.000000 +93282 -1.000000 +93283 -1.000000 +93284 -1.000000 +93285 -1.000000 +93286 -1.000000 +93287 -1.000000 +93288 -1.000000 +93289 -1.000000 +93290 -1.000000 +93291 -1.000000 +93292 -1.000000 +93293 -1.000000 +93294 -1.000000 +93295 -1.000000 +93296 -1.000000 +93297 -1.000000 +93298 -1.000000 +93299 -1.000000 +93300 -1.000000 +93301 -1.000000 +93302 -1.000000 +93303 -1.000000 +93304 -1.000000 +93305 -1.000000 +93306 -1.000000 +93307 -1.000000 +93308 -1.000000 +93309 -1.000000 +93310 -1.000000 +93311 -1.000000 +93312 -1.000000 +93313 -1.000000 +93314 -1.000000 +93315 -1.000000 +93316 -1.000000 +93317 -1.000000 +93318 -1.000000 +93319 -1.000000 +93320 -1.000000 +93321 -1.000000 +93322 -1.000000 +93323 -1.000000 +93324 -1.000000 +93325 -1.000000 +93326 -1.000000 +93327 -1.000000 +93328 -1.000000 +93329 -1.000000 +93330 -1.000000 +93331 -1.000000 +93332 -1.000000 +93333 -1.000000 +93334 -1.000000 +93335 -1.000000 +93336 -1.000000 +93337 -1.000000 +93338 -1.000000 +93339 -1.000000 +93340 -1.000000 +93341 -1.000000 +93342 -1.000000 +93343 -1.000000 +93344 -1.000000 +93345 -1.000000 +93346 -1.000000 +93347 -1.000000 +93348 -1.000000 +93349 -1.000000 +93350 -1.000000 +93351 -1.000000 +93352 -1.000000 +93353 -1.000000 +93354 -1.000000 +93355 -1.000000 +93356 -1.000000 +93357 -1.000000 +93358 -1.000000 +93359 -1.000000 +93360 -1.000000 +93361 -1.000000 +93362 -1.000000 +93363 -1.000000 +93364 -1.000000 +93365 -1.000000 +93366 -1.000000 +93367 -1.000000 +93368 -1.000000 +93369 -1.000000 +93370 -1.000000 +93371 -1.000000 +93372 -1.000000 +93373 -1.000000 +93374 -1.000000 +93375 -1.000000 +93376 -1.000000 +93377 -1.000000 +93378 -1.000000 +93379 -1.000000 +93380 -1.000000 +93381 -1.000000 +93382 -1.000000 +93383 -1.000000 +93384 -1.000000 +93385 -1.000000 +93386 -1.000000 +93387 -1.000000 +93388 -1.000000 +93389 -1.000000 +93390 -1.000000 +93391 -1.000000 +93392 -1.000000 +93393 -1.000000 +93394 -1.000000 +93395 -1.000000 +93396 -1.000000 +93397 -1.000000 +93398 -1.000000 +93399 -1.000000 +93400 -1.000000 +93401 -1.000000 +93402 -1.000000 +93403 -1.000000 +93404 -1.000000 +93405 -1.000000 +93406 -1.000000 +93407 -1.000000 +93408 -1.000000 +93409 -1.000000 +93410 -1.000000 +93411 -1.000000 +93412 -1.000000 +93413 -1.000000 +93414 -1.000000 +93415 -1.000000 +93416 -1.000000 +93417 -1.000000 +93418 -1.000000 +93419 -1.000000 +93420 -1.000000 +93421 -1.000000 +93422 -1.000000 +93423 -1.000000 +93424 -1.000000 +93425 -1.000000 +93426 -1.000000 +93427 -1.000000 +93428 -1.000000 +93429 -1.000000 +93430 -1.000000 +93431 -1.000000 +93432 -1.000000 +93433 -1.000000 +93434 -1.000000 +93435 -1.000000 +93436 -1.000000 +93437 -1.000000 +93438 -1.000000 +93439 -1.000000 +93440 -1.000000 +93441 -1.000000 +93442 -1.000000 +93443 -1.000000 +93444 -1.000000 +93445 -1.000000 +93446 -1.000000 +93447 -1.000000 +93448 -1.000000 +93449 -1.000000 +93450 -1.000000 +93451 -1.000000 +93452 -1.000000 +93453 -1.000000 +93454 -1.000000 +93455 -1.000000 +93456 -1.000000 +93457 -1.000000 +93458 -1.000000 +93459 -1.000000 +93460 -1.000000 +93461 -1.000000 +93462 -1.000000 +93463 -1.000000 +93464 -1.000000 +93465 -1.000000 +93466 -1.000000 +93467 -1.000000 +93468 -1.000000 +93469 -1.000000 +93470 -1.000000 +93471 -1.000000 +93472 -1.000000 +93473 -1.000000 +93474 -1.000000 +93475 -1.000000 +93476 -1.000000 +93477 -1.000000 +93478 -1.000000 +93479 -1.000000 +93480 -1.000000 +93481 -1.000000 +93482 -1.000000 +93483 -1.000000 +93484 -1.000000 +93485 -1.000000 +93486 -1.000000 +93487 -1.000000 +93488 -1.000000 +93489 -1.000000 +93490 -1.000000 +93491 -1.000000 +93492 -1.000000 +93493 -1.000000 +93494 -1.000000 +93495 -1.000000 +93496 -1.000000 +93497 -1.000000 +93498 -1.000000 +93499 -1.000000 +93500 -1.000000 +93501 -1.000000 +93502 -1.000000 +93503 -1.000000 +93504 -1.000000 +93505 -1.000000 +93506 -1.000000 +93507 -1.000000 +93508 -1.000000 +93509 -1.000000 +93510 -1.000000 +93511 -1.000000 +93512 -1.000000 +93513 -1.000000 +93514 -1.000000 +93515 -1.000000 +93516 -1.000000 +93517 -1.000000 +93518 -1.000000 +93519 -1.000000 +93520 -1.000000 +93521 -1.000000 +93522 -1.000000 +93523 -1.000000 +93524 -1.000000 +93525 -1.000000 +93526 -1.000000 +93527 -1.000000 +93528 -1.000000 +93529 -1.000000 +93530 -1.000000 +93531 -1.000000 +93532 -1.000000 +93533 -1.000000 +93534 -1.000000 +93535 -1.000000 +93536 -1.000000 +93537 -1.000000 +93538 -1.000000 +93539 -1.000000 +93540 -1.000000 +93541 -1.000000 +93542 -1.000000 +93543 -1.000000 +93544 -1.000000 +93545 -1.000000 +93546 -1.000000 +93547 -1.000000 +93548 -1.000000 +93549 -1.000000 +93550 -1.000000 +93551 -1.000000 +93552 -1.000000 +93553 -1.000000 +93554 -1.000000 +93555 -1.000000 +93556 -1.000000 +93557 -1.000000 +93558 -1.000000 +93559 -1.000000 +93560 -1.000000 +93561 -1.000000 +93562 -1.000000 +93563 -1.000000 +93564 -1.000000 +93565 -1.000000 +93566 -1.000000 +93567 -1.000000 +93568 -1.000000 +93569 -1.000000 +93570 -1.000000 +93571 -1.000000 +93572 -1.000000 +93573 -1.000000 +93574 -1.000000 +93575 -1.000000 +93576 -1.000000 +93577 -1.000000 +93578 -1.000000 +93579 -1.000000 +93580 -1.000000 +93581 -1.000000 +93582 -1.000000 +93583 -1.000000 +93584 -1.000000 +93585 -1.000000 +93586 -1.000000 +93587 -1.000000 +93588 -1.000000 +93589 -1.000000 +93590 -1.000000 +93591 -1.000000 +93592 -1.000000 +93593 -1.000000 +93594 -1.000000 +93595 -1.000000 +93596 -1.000000 +93597 -1.000000 +93598 -1.000000 +93599 -1.000000 +93600 -1.000000 +93601 -1.000000 +93602 -1.000000 +93603 -1.000000 +93604 -1.000000 +93606 -1.000000 +93607 -1.000000 +93608 -1.000000 +93609 -1.000000 +93610 -1.000000 +93611 -1.000000 +93612 -1.000000 +93614 -1.000000 +93615 -1.000000 +93616 -1.000000 +93617 -1.000000 +93618 -1.000000 +93619 -1.000000 +93620 -1.000000 +93621 -1.000000 +93622 -1.000000 +93623 -1.000000 +93624 -1.000000 +93625 -1.000000 +93626 -1.000000 +93627 -1.000000 +93628 -1.000000 +93629 -1.000000 +93630 -1.000000 +93631 -1.000000 +93632 -1.000000 +93633 -1.000000 +93634 -1.000000 +93635 -1.000000 +93636 -1.000000 +93637 -1.000000 +93638 -1.000000 +93639 -1.000000 +93640 -1.000000 +93641 -1.000000 +93642 -1.000000 +93643 -1.000000 +93644 -1.000000 +93645 -1.000000 +93646 -1.000000 +93647 -1.000000 +93648 -1.000000 +93649 -1.000000 +93650 -1.000000 +93651 -1.000000 +93652 -1.000000 +93653 -1.000000 +93654 -1.000000 +93655 -1.000000 +93656 -1.000000 +93657 -1.000000 +93658 -1.000000 +93659 -1.000000 +93660 -1.000000 +93661 -1.000000 +93662 -1.000000 +93663 -1.000000 +93664 -1.000000 +93665 -1.000000 +93666 -1.000000 +93667 -1.000000 +93668 -1.000000 +93669 -1.000000 +93670 -1.000000 +93671 -1.000000 +93672 -1.000000 +93673 -1.000000 +93674 -1.000000 +93675 -1.000000 +93676 -1.000000 +93677 -1.000000 +93678 -1.000000 +93679 -1.000000 +93680 -1.000000 +93681 -1.000000 +93682 -1.000000 +93684 -1.000000 +93685 -1.000000 +93686 -1.000000 +93687 -1.000000 +93688 -1.000000 +93689 -1.000000 +93690 -1.000000 +93691 -1.000000 +93692 -1.000000 +93693 -1.000000 +93694 -1.000000 +93695 -1.000000 +93696 -1.000000 +93697 -1.000000 +93698 -1.000000 +93699 -1.000000 +93700 -1.000000 +93701 -1.000000 +93702 -1.000000 +93703 -1.000000 +93704 -1.000000 +93705 -1.000000 +93706 -1.000000 +93707 -1.000000 +93708 -1.000000 +93709 -1.000000 +93710 -1.000000 +93711 -1.000000 +93712 -1.000000 +93713 -1.000000 +93714 -1.000000 +93715 -1.000000 +93716 -1.000000 +93717 -1.000000 +93718 -1.000000 +93719 -1.000000 +93720 -1.000000 +93721 -1.000000 +93722 -1.000000 +93723 -1.000000 +93724 -1.000000 +93725 -1.000000 +93726 -1.000000 +93727 -1.000000 +93728 -1.000000 +93729 -1.000000 +93730 -1.000000 +93731 -1.000000 +93732 -1.000000 +93733 -1.000000 +93734 -1.000000 +93735 -1.000000 +93736 -1.000000 +93737 -1.000000 +93738 -1.000000 +93739 -1.000000 +93740 -1.000000 +93741 -1.000000 +93742 -1.000000 +93743 -1.000000 +93744 -1.000000 +93745 -1.000000 +93746 -1.000000 +93747 -1.000000 +93748 -1.000000 +93749 -1.000000 +93750 -1.000000 +93751 -1.000000 +93752 -1.000000 +93753 -1.000000 +93754 -1.000000 +93755 -1.000000 +93756 -1.000000 +93757 -1.000000 +93758 -1.000000 +93759 -1.000000 +93760 -1.000000 +93761 -1.000000 +93762 -1.000000 +93763 -1.000000 +93764 -1.000000 +93765 -1.000000 +93766 -1.000000 +93767 -1.000000 +93768 -1.000000 +93769 -1.000000 +93770 -1.000000 +93771 -1.000000 +93772 -1.000000 +93773 -1.000000 +93774 -1.000000 +93775 -1.000000 +93776 -1.000000 +93777 -1.000000 +93778 -1.000000 +93779 -1.000000 +93780 -1.000000 +93781 -1.000000 +93782 -1.000000 +93783 -1.000000 +93784 -1.000000 +93785 -1.000000 +93786 -1.000000 +93787 -1.000000 +93788 -1.000000 +93789 -1.000000 +93790 -1.000000 +93791 -1.000000 +93792 -1.000000 +93793 -1.000000 +93794 -1.000000 +93795 -1.000000 +93796 -1.000000 +93797 -1.000000 +93798 -1.000000 +93799 -1.000000 +93800 -1.000000 +93801 -1.000000 +93802 -1.000000 +93803 -1.000000 +93804 -1.000000 +93805 -1.000000 +93806 -1.000000 +93807 -1.000000 +93808 -1.000000 +93809 -1.000000 +93810 -1.000000 +93811 -1.000000 +93812 -1.000000 +93813 -1.000000 +93814 -1.000000 +93815 -1.000000 +93816 -1.000000 +93817 -1.000000 +93818 -1.000000 +93819 -1.000000 +93820 -1.000000 +93821 -1.000000 +93822 -1.000000 +93823 -1.000000 +93824 -1.000000 +93825 -1.000000 +93826 -1.000000 +93827 -1.000000 +93828 -1.000000 +93829 -1.000000 +93830 -1.000000 +93831 -1.000000 +93832 -1.000000 +93833 -1.000000 +93834 -1.000000 +93835 -1.000000 +93836 -1.000000 +93837 -1.000000 +93838 -1.000000 +93839 -1.000000 +93840 -1.000000 +93841 -1.000000 +93842 -1.000000 +93843 -1.000000 +93844 -1.000000 +93845 -1.000000 +93846 -1.000000 +93847 -1.000000 +93848 -1.000000 +93849 -1.000000 +93850 -1.000000 +93851 -1.000000 +93852 -1.000000 +93853 -1.000000 +93854 -1.000000 +93855 -1.000000 +93856 -1.000000 +93857 -1.000000 +93858 -1.000000 +93859 -1.000000 +93860 -1.000000 +93861 -1.000000 +93862 -1.000000 +93863 -1.000000 +93864 -1.000000 +93865 -1.000000 +93866 -1.000000 +93867 -1.000000 +93868 -1.000000 +93869 -1.000000 +93870 -1.000000 +93871 -1.000000 +93872 -1.000000 +93873 -1.000000 +93874 -1.000000 +93875 -1.000000 +93876 -1.000000 +93877 -1.000000 +93878 -1.000000 +93879 -1.000000 +93880 -1.000000 +93881 -1.000000 +93882 -1.000000 +93883 -1.000000 +93884 -1.000000 +93885 -1.000000 +93886 -1.000000 +93887 -1.000000 +93888 -1.000000 +93890 -1.000000 +93891 -1.000000 +93892 -1.000000 +93893 -1.000000 +93894 -1.000000 +93895 -1.000000 +93896 -1.000000 +93897 -1.000000 +93898 -1.000000 +93899 -1.000000 +93900 -1.000000 +93901 -1.000000 +93902 -1.000000 +93903 -1.000000 +93904 -1.000000 +93905 -1.000000 +93906 -1.000000 +93907 -1.000000 +93908 -1.000000 +93909 -1.000000 +93910 -1.000000 +93911 -1.000000 +93912 -1.000000 +93913 -1.000000 +93914 -1.000000 +93915 -1.000000 +93916 -1.000000 +93917 -1.000000 +93918 -1.000000 +93919 -1.000000 +93920 -1.000000 +93921 -1.000000 +93922 -1.000000 +93923 -1.000000 +93924 -1.000000 +93925 -1.000000 +93926 -1.000000 +93927 -1.000000 +93928 -1.000000 +93929 -1.000000 +93930 -1.000000 +93931 -1.000000 +93932 -1.000000 +93933 -1.000000 +93934 -1.000000 +93935 -1.000000 +93936 -1.000000 +93937 -1.000000 +93938 -1.000000 +93939 -1.000000 +93940 -1.000000 +93941 -1.000000 +93942 -1.000000 +93943 -1.000000 +93944 -1.000000 +93945 -1.000000 +93946 -1.000000 +93947 -1.000000 +93948 -1.000000 +93949 -1.000000 +93950 -1.000000 +93951 -1.000000 +93952 -1.000000 +93953 -1.000000 +93954 -1.000000 +93955 -1.000000 +93956 -1.000000 +93957 -1.000000 +93958 -1.000000 +93959 -1.000000 +93960 -1.000000 +93961 -1.000000 +93962 -1.000000 +93963 -1.000000 +93964 -1.000000 +93965 -1.000000 +93966 -1.000000 +93967 -1.000000 +93968 -1.000000 +93969 -1.000000 +93970 -1.000000 +93971 -1.000000 +93972 -1.000000 +93973 -1.000000 +93974 -1.000000 +93975 -1.000000 +93976 -1.000000 +93977 -1.000000 +93978 -1.000000 +93979 -1.000000 +93980 -1.000000 +93981 -1.000000 +93982 -1.000000 +93983 -1.000000 +93984 -1.000000 +93985 -1.000000 +93986 -1.000000 +93987 -1.000000 +93988 -1.000000 +93989 -1.000000 +93990 -1.000000 +93991 -1.000000 +93992 -1.000000 +93993 -1.000000 +93994 -1.000000 +93995 -1.000000 +93996 -1.000000 +93999 -1.000000 +94000 -1.000000 +94001 -1.000000 +94002 -1.000000 +94003 -1.000000 +94004 -1.000000 +94005 -1.000000 +94006 -1.000000 +94007 -1.000000 +94008 -1.000000 +94009 -1.000000 +94010 -1.000000 +94011 -1.000000 +94012 -1.000000 +94013 -1.000000 +94014 -1.000000 +94015 -1.000000 +94016 -1.000000 +94017 -1.000000 +94018 -1.000000 +94019 -1.000000 +94020 -1.000000 +94021 -1.000000 +94022 -1.000000 +94023 -1.000000 +94024 -1.000000 +94025 -1.000000 +94026 -1.000000 +94027 -1.000000 +94028 -1.000000 +94029 -1.000000 +94030 -1.000000 +94031 -1.000000 +94032 -1.000000 +94033 -1.000000 +94034 -1.000000 +94035 -1.000000 +94036 -1.000000 +94037 -1.000000 +94038 -1.000000 +94039 -1.000000 +94040 -1.000000 +94041 -1.000000 +94042 -1.000000 +94043 -1.000000 +94044 -1.000000 +94045 -1.000000 +94046 -1.000000 +94047 -1.000000 +94048 -1.000000 +94049 -1.000000 +94050 -1.000000 +94051 -1.000000 +94052 -1.000000 +94053 -1.000000 +94054 -1.000000 +94055 -1.000000 +94056 -1.000000 +94057 -1.000000 +94058 -1.000000 +94059 -1.000000 +94060 -1.000000 +94061 -1.000000 +94062 -1.000000 +94063 -1.000000 +94064 -1.000000 +94065 -1.000000 +94066 -1.000000 +94067 -1.000000 +94068 -1.000000 +94069 -1.000000 +94070 -1.000000 +94071 -1.000000 +94072 -1.000000 +94073 -1.000000 +94074 -1.000000 +94075 -1.000000 +94076 -1.000000 +94077 -1.000000 +94078 -1.000000 +94079 -1.000000 +94080 -1.000000 +94081 -1.000000 +94082 -1.000000 +94083 -1.000000 +94084 -1.000000 +94085 -1.000000 +94086 -1.000000 +94087 -1.000000 +94088 -1.000000 +94089 -1.000000 +94090 -1.000000 +94091 -1.000000 +94092 -1.000000 +94093 -1.000000 +94094 -1.000000 +94095 -1.000000 +94096 -1.000000 +94097 -1.000000 +94098 -1.000000 +94099 -1.000000 +94100 -1.000000 +94101 -1.000000 +94102 -1.000000 +94103 -1.000000 +94104 -1.000000 +94105 -1.000000 +94106 -1.000000 +94107 -1.000000 +94108 -1.000000 +94109 -1.000000 +94110 -1.000000 +94111 -1.000000 +94112 -1.000000 +94113 -1.000000 +94114 -1.000000 +94115 -1.000000 +94116 -1.000000 +94117 -1.000000 +94118 -1.000000 +94119 -1.000000 +94120 -1.000000 +94121 -1.000000 +94122 -1.000000 +94123 -1.000000 +94124 -1.000000 +94125 -1.000000 +94126 -1.000000 +94127 -1.000000 +94128 -1.000000 +94129 -1.000000 +94130 -1.000000 +94131 -1.000000 +94132 -1.000000 +94133 -1.000000 +94134 -1.000000 +94135 -1.000000 +94136 -1.000000 +94137 -1.000000 +94138 -1.000000 +94139 -1.000000 +94140 -1.000000 +94141 -1.000000 +94142 -1.000000 +94144 -1.000000 +94145 -1.000000 +94146 -1.000000 +94147 -1.000000 +94148 -1.000000 +94149 -1.000000 +94150 -1.000000 +94151 -1.000000 +94152 -1.000000 +94153 -1.000000 +94154 -1.000000 +94155 -1.000000 +94156 -1.000000 +94157 -1.000000 +94158 -1.000000 +94159 -1.000000 +94160 -1.000000 +94161 -1.000000 +94162 -1.000000 +94163 -1.000000 +94164 -1.000000 +94165 -1.000000 +94166 -1.000000 +94167 -1.000000 +94168 -1.000000 +94169 -1.000000 +94170 -1.000000 +94171 -1.000000 +94172 -1.000000 +94173 -1.000000 +94174 -1.000000 +94175 -1.000000 +94176 -1.000000 +94177 -1.000000 +94178 -1.000000 +94179 -1.000000 +94180 -1.000000 +94181 -1.000000 +94182 -1.000000 +94183 -1.000000 +94184 -1.000000 +94185 -1.000000 +94186 -1.000000 +94187 -1.000000 +94188 -1.000000 +94189 -1.000000 +94190 -1.000000 +94191 -1.000000 +94192 -1.000000 +94193 -1.000000 +94194 -1.000000 +94195 -1.000000 +94196 -1.000000 +94197 -1.000000 +94198 -1.000000 +94199 -1.000000 +94200 -1.000000 +94201 -1.000000 +94202 -1.000000 +94203 -1.000000 +94204 -1.000000 +94205 -1.000000 +94206 -1.000000 +94207 -1.000000 +94208 -1.000000 +94209 -1.000000 +94210 -1.000000 +94211 -1.000000 +94212 -1.000000 +94213 -1.000000 +94214 -1.000000 +94215 -1.000000 +94216 -1.000000 +94217 -1.000000 +94218 -1.000000 +94219 -1.000000 +94220 -1.000000 +94221 -1.000000 +94222 -1.000000 +94223 -1.000000 +94224 -1.000000 +94225 -1.000000 +94226 -1.000000 +94227 -1.000000 +94228 -1.000000 +94229 -1.000000 +94230 -1.000000 +94231 -1.000000 +94232 -1.000000 +94233 -1.000000 +94234 -1.000000 +94235 -1.000000 +94236 -1.000000 +94237 -1.000000 +94238 -1.000000 +94239 -1.000000 +94240 -1.000000 +94241 -1.000000 +94242 -1.000000 +94243 -1.000000 +94244 -1.000000 +94245 -1.000000 +94246 -1.000000 +94247 -1.000000 +94248 -1.000000 +94249 -1.000000 +94250 -1.000000 +94251 -1.000000 +94252 -1.000000 +94253 -1.000000 +94254 -1.000000 +94255 -1.000000 +94256 -1.000000 +94257 -1.000000 +94258 -1.000000 +94259 -1.000000 +94260 -1.000000 +94261 -1.000000 +94262 -1.000000 +94263 -1.000000 +94264 -1.000000 +94265 -1.000000 +94266 -1.000000 +94267 -1.000000 +94268 -1.000000 +94269 -1.000000 +94270 -1.000000 +94271 -1.000000 +94272 -1.000000 +94273 -1.000000 +94274 -1.000000 +94275 -1.000000 +94276 -1.000000 +94277 -1.000000 +94278 -1.000000 +94279 -1.000000 +94280 -1.000000 +94281 -1.000000 +94282 -1.000000 +94283 -1.000000 +94284 -1.000000 +94285 -1.000000 +94286 -1.000000 +94287 -1.000000 +94288 -1.000000 +94289 -1.000000 +94290 -1.000000 +94291 -1.000000 +94292 -1.000000 +94293 -1.000000 +94294 -1.000000 +94295 -1.000000 +94296 -1.000000 +94297 -1.000000 +94298 -1.000000 +94299 -1.000000 +94300 -1.000000 +94301 -1.000000 +94302 -1.000000 +94303 -1.000000 +94304 -1.000000 +94305 -1.000000 +94306 -1.000000 +94307 -1.000000 +94308 -1.000000 +94309 -1.000000 +94310 -1.000000 +94311 -1.000000 +94312 -1.000000 +94313 -1.000000 +94314 -1.000000 +94315 -1.000000 +94316 -1.000000 +94317 -1.000000 +94318 -1.000000 +94319 -1.000000 +94320 -1.000000 +94321 -1.000000 +94322 -1.000000 +94323 -1.000000 +94324 -1.000000 +94325 -1.000000 +94326 -1.000000 +94327 -1.000000 +94328 -1.000000 +94329 -1.000000 +94330 -1.000000 +94331 -1.000000 +94336 -1.000000 +94337 -1.000000 +94340 -1.000000 +94341 -1.000000 +94342 -1.000000 +94349 -1.000000 +94350 -1.000000 +94351 -1.000000 +94352 -1.000000 +94353 -1.000000 +94354 -1.000000 +94356 -1.000000 +94357 -1.000000 +94358 -1.000000 +94359 -1.000000 +94360 -1.000000 +94361 -1.000000 +94362 -1.000000 +94363 -1.000000 +94364 -1.000000 +94365 -1.000000 +94366 -1.000000 +94367 -1.000000 +94368 -1.000000 +94369 -1.000000 +94370 -1.000000 +94371 -1.000000 +94372 -1.000000 +94373 -1.000000 +94374 -1.000000 +94375 -1.000000 +94376 -1.000000 +94377 -1.000000 +94378 -1.000000 +94379 -1.000000 +94380 -1.000000 +94381 -1.000000 +94382 -1.000000 +94383 -1.000000 +94384 -1.000000 +94385 -1.000000 +94386 -1.000000 +94387 -1.000000 +94388 -1.000000 +94389 -1.000000 +94390 -1.000000 +94391 -1.000000 +94392 -1.000000 +94394 -1.000000 +94395 -1.000000 +94396 -1.000000 +94397 -1.000000 +94398 -1.000000 +94399 -1.000000 +94400 -1.000000 +94401 -1.000000 +94402 -1.000000 +94403 -1.000000 +94405 -1.000000 +94406 -1.000000 +94407 -1.000000 +94408 -1.000000 +94409 -1.000000 +94410 -1.000000 +94411 -1.000000 +94412 -1.000000 +94413 -1.000000 +94414 -1.000000 +94415 -1.000000 +94416 -1.000000 +94417 -1.000000 +94418 -1.000000 +94419 -1.000000 +94420 -1.000000 +94421 -1.000000 +94422 -1.000000 +94423 -1.000000 +94424 -1.000000 +94425 -1.000000 +94426 -1.000000 +94427 -1.000000 +94428 -1.000000 +94429 -1.000000 +94430 -1.000000 +94431 -1.000000 +94432 -1.000000 +94433 -1.000000 +94434 -1.000000 +94435 -1.000000 +94436 -1.000000 +94437 -1.000000 +94438 -1.000000 +94439 -1.000000 +94440 -1.000000 +94441 -1.000000 +94442 -1.000000 +94443 -1.000000 +94444 -1.000000 +94445 -1.000000 +94446 -1.000000 +94447 -1.000000 +94448 -1.000000 +94449 -1.000000 +94450 -1.000000 +94451 -1.000000 +94452 -1.000000 +94453 -1.000000 +94454 -1.000000 +94455 -1.000000 +94456 -1.000000 +94457 -1.000000 +94458 -1.000000 +94459 -1.000000 +94460 -1.000000 +94461 -1.000000 +94462 -1.000000 +94463 -1.000000 +94464 -1.000000 +94465 -1.000000 +94466 -1.000000 +94467 -1.000000 +94468 -1.000000 +94469 -1.000000 +94470 -1.000000 +94471 -1.000000 +94472 -1.000000 +94473 -1.000000 +94474 -1.000000 +94475 -1.000000 +94476 -1.000000 +94477 -1.000000 +94478 -1.000000 +94479 -1.000000 +94480 -1.000000 +94481 -1.000000 +94482 -1.000000 +94483 -1.000000 +94484 -1.000000 +94485 -1.000000 +94486 -1.000000 +94487 -1.000000 +94488 -1.000000 +94489 -1.000000 +94490 -1.000000 +94491 -1.000000 +94492 -1.000000 +94493 -1.000000 +94494 -1.000000 +94495 -1.000000 +94496 -1.000000 +94497 -1.000000 +94498 -1.000000 +94499 -1.000000 +94500 -1.000000 +94501 -1.000000 +94502 -1.000000 +94503 -1.000000 +94504 -1.000000 +94505 -1.000000 +94506 -1.000000 +94507 -1.000000 +94508 -1.000000 +94509 -1.000000 +94510 -1.000000 +94511 -1.000000 +94512 -1.000000 +94513 -1.000000 +94514 -1.000000 +94515 -1.000000 +94516 -1.000000 +94517 -1.000000 +94518 -1.000000 +94519 -1.000000 +94520 -1.000000 +94521 -1.000000 +94522 -1.000000 +94523 -1.000000 +94524 -1.000000 +94525 -1.000000 +94526 -1.000000 +94527 -1.000000 +94528 -1.000000 +94529 -1.000000 +94530 -1.000000 +94531 -1.000000 +94532 -1.000000 +94533 -1.000000 +94534 -1.000000 +94535 -1.000000 +94536 -1.000000 +94537 -1.000000 +94538 -1.000000 +94539 -1.000000 +94540 -1.000000 +94541 -1.000000 +94542 -1.000000 +94543 -1.000000 +94544 -1.000000 +94545 -1.000000 +94546 -1.000000 +94547 -1.000000 +94548 -1.000000 +94549 -1.000000 +94550 -1.000000 +94551 -1.000000 +94552 -1.000000 +94553 -1.000000 +94554 -1.000000 +94555 -1.000000 +94556 -1.000000 +94557 -1.000000 +94558 -1.000000 +94559 -1.000000 +94560 -1.000000 +94561 -1.000000 +94562 -1.000000 +94563 -1.000000 +94564 -1.000000 +94565 -1.000000 +94566 -1.000000 +94567 -1.000000 +94568 -1.000000 +94569 -1.000000 +94570 -1.000000 +94571 -1.000000 +94572 -1.000000 +94573 -1.000000 +94574 -1.000000 +94575 -1.000000 +94576 -1.000000 +94577 -1.000000 +94578 -1.000000 +94579 -1.000000 +94580 -1.000000 +94581 -1.000000 +94582 -1.000000 +94583 -1.000000 +94584 -1.000000 +94585 -1.000000 +94586 -1.000000 +94587 -1.000000 +94588 -1.000000 +94589 -1.000000 +94590 -1.000000 +94591 -1.000000 +94592 -1.000000 +94593 -1.000000 +94594 -1.000000 +94595 -1.000000 +94596 -1.000000 +94597 -1.000000 +94598 -1.000000 +94599 -1.000000 +94600 -1.000000 +94601 -1.000000 +94602 -1.000000 +94603 -1.000000 +94604 -1.000000 +94605 -1.000000 +94606 -1.000000 +94607 -1.000000 +94608 -1.000000 +94609 -1.000000 +94610 -1.000000 +94611 -1.000000 +94612 -1.000000 +94613 -1.000000 +94614 -1.000000 +94615 -1.000000 +94616 -1.000000 +94617 -1.000000 +94618 -1.000000 +94619 -1.000000 +94620 -1.000000 +94621 -1.000000 +94622 -1.000000 +94624 -1.000000 +94625 -1.000000 +94626 -1.000000 +94627 -1.000000 +94628 -1.000000 +94629 -1.000000 +94630 -1.000000 +94631 -1.000000 +94632 -1.000000 +94633 -1.000000 +94634 -1.000000 +94635 -1.000000 +94636 -1.000000 +94637 -1.000000 +94638 -1.000000 +94639 -1.000000 +94640 -1.000000 +94641 -1.000000 +94642 -1.000000 +94643 -1.000000 +94644 -1.000000 +94645 -1.000000 +94646 -1.000000 +94647 -1.000000 +94648 -1.000000 +94649 -1.000000 +94650 -1.000000 +94651 -1.000000 +94652 -1.000000 +94653 -1.000000 +94654 -1.000000 +94655 -1.000000 +94656 -1.000000 +94657 -1.000000 +94658 -1.000000 +94659 -1.000000 +94660 -1.000000 +94661 -1.000000 +94662 -1.000000 +94663 -1.000000 +94664 -1.000000 +94665 -1.000000 +94666 -1.000000 +94667 -1.000000 +94668 -1.000000 +94669 -1.000000 +94670 -1.000000 +94671 -1.000000 +94672 -1.000000 +94673 -1.000000 +94674 -1.000000 +94675 -1.000000 +94676 -1.000000 +94677 -1.000000 +94678 -1.000000 +94679 -1.000000 +94680 -1.000000 +94681 -1.000000 +94682 -1.000000 +94683 -1.000000 +94684 -1.000000 +94685 -1.000000 +94686 -1.000000 +94687 -1.000000 +94688 -1.000000 +94689 -1.000000 +94690 -1.000000 +94691 -1.000000 +94692 -1.000000 +94693 -1.000000 +94694 -1.000000 +94695 -1.000000 +94696 -1.000000 +94697 -1.000000 +94698 -1.000000 +94699 -1.000000 +94700 -1.000000 +94701 -1.000000 +94702 -1.000000 +94703 -1.000000 +94704 -1.000000 +94705 -1.000000 +94706 -1.000000 +94707 -1.000000 +94708 -1.000000 +94709 -1.000000 +94710 -1.000000 +94711 -1.000000 +94712 -1.000000 +94713 -1.000000 +94714 -1.000000 +94715 -1.000000 +94716 -1.000000 +94717 -1.000000 +94718 -1.000000 +94719 -1.000000 +94720 -1.000000 +94721 -1.000000 +94722 -1.000000 +94723 -1.000000 +94724 -1.000000 +94725 -1.000000 +94726 -1.000000 +94727 -1.000000 +94728 -1.000000 +94729 -1.000000 +94730 -1.000000 +94731 -1.000000 +94732 -1.000000 +94733 -1.000000 +94734 -1.000000 +94735 -1.000000 +94736 -1.000000 +94737 -1.000000 +94738 -1.000000 +94739 -1.000000 +94740 -1.000000 +94741 -1.000000 +94742 -1.000000 +94743 -1.000000 +94744 -1.000000 +94745 -1.000000 +94746 -1.000000 +94747 -1.000000 +94748 -1.000000 +94749 -1.000000 +94750 -1.000000 +94751 -1.000000 +94752 -1.000000 +94753 -1.000000 +94754 -1.000000 +94755 -1.000000 +94756 -1.000000 +94757 -1.000000 +94758 -1.000000 +94759 -1.000000 +94760 -1.000000 +94761 -1.000000 +94762 -1.000000 +94763 -1.000000 +94764 -1.000000 +94765 -1.000000 +94766 -1.000000 +94767 -1.000000 +94768 -1.000000 +94769 -1.000000 +94770 -1.000000 +94771 -1.000000 +94772 -1.000000 +94773 -1.000000 +94774 -1.000000 +94775 -1.000000 +94776 -1.000000 +94777 -1.000000 +94778 -1.000000 +94779 -1.000000 +94780 -1.000000 +94781 -1.000000 +94782 -1.000000 +94783 -1.000000 +94784 -1.000000 +94785 -1.000000 +94786 -1.000000 +94787 -1.000000 +94788 -1.000000 +94789 -1.000000 +94790 -1.000000 +94791 -1.000000 +94792 -1.000000 +94793 -1.000000 +94794 -1.000000 +94795 -1.000000 +94796 -1.000000 +94797 -1.000000 +94798 -1.000000 +94799 -1.000000 +94800 -1.000000 +94801 -1.000000 +94802 -1.000000 +94803 -1.000000 +94804 -1.000000 +94805 -1.000000 +94806 -1.000000 +94807 -1.000000 +94808 -1.000000 +94809 -1.000000 +94810 -1.000000 +94811 -1.000000 +94812 -1.000000 +94813 -1.000000 +94814 -1.000000 +94815 -1.000000 +94816 -1.000000 +94817 -1.000000 +94818 -1.000000 +94819 -1.000000 +94820 -1.000000 +94821 -1.000000 +94822 -1.000000 +94823 -1.000000 +94824 -1.000000 +94825 -1.000000 +94826 -1.000000 +94827 -1.000000 +94828 -1.000000 +94829 -1.000000 +94830 -1.000000 +94831 -1.000000 +94832 -1.000000 +94833 -1.000000 +94834 -1.000000 +94835 -1.000000 +94836 -1.000000 +94837 -1.000000 +94838 -1.000000 +94839 -1.000000 +94840 -1.000000 +94841 -1.000000 +94842 -1.000000 +94843 -1.000000 +94844 -1.000000 +94845 -1.000000 +94846 -1.000000 +94847 -1.000000 +94848 -1.000000 +94849 -1.000000 +94850 -1.000000 +94851 -1.000000 +94852 -1.000000 +94853 -1.000000 +94854 -1.000000 +94855 -1.000000 +94856 -1.000000 +94857 -1.000000 +94858 -1.000000 +94859 -1.000000 +94860 -1.000000 +94861 -1.000000 +94862 -1.000000 +94864 -1.000000 +94865 -1.000000 +94866 -1.000000 +94867 -1.000000 +94868 -1.000000 +94869 -1.000000 +94870 -1.000000 +94871 -1.000000 +94872 -1.000000 +94873 -1.000000 +94874 -1.000000 +94875 -1.000000 +94876 -1.000000 +94877 -1.000000 +94878 -1.000000 +94879 -1.000000 +94880 -1.000000 +94881 -1.000000 +94882 -1.000000 +94883 -1.000000 +94884 -1.000000 +94885 -1.000000 +94886 -1.000000 +94887 -1.000000 +94888 -1.000000 +94889 -1.000000 +94890 -1.000000 +94891 -1.000000 +94892 -1.000000 +94893 -1.000000 +94894 -1.000000 +94895 -1.000000 +94896 -1.000000 +94897 -1.000000 +94898 -1.000000 +94899 -1.000000 +94900 -1.000000 +94901 -1.000000 +94902 -1.000000 +94903 -1.000000 +94904 -1.000000 +94905 -1.000000 +94906 -1.000000 +94907 -1.000000 +94908 -1.000000 +94909 -1.000000 +94910 -1.000000 +94911 -1.000000 +94912 -1.000000 +94913 -1.000000 +94914 -1.000000 +94915 -1.000000 +94916 -1.000000 +94917 -1.000000 +94918 -1.000000 +94920 -1.000000 +94921 -1.000000 +94923 -1.000000 +94924 -1.000000 +94925 -1.000000 +94928 -1.000000 +94929 -1.000000 +94930 -1.000000 +94931 -1.000000 +94932 -1.000000 +94933 -1.000000 +94934 -1.000000 +94935 -1.000000 +94936 -1.000000 +94937 -1.000000 +94938 -1.000000 +94939 -1.000000 +94940 -1.000000 +94941 -1.000000 +94942 -1.000000 +94943 -1.000000 +94944 -1.000000 +94945 -1.000000 +94946 -1.000000 +94947 -1.000000 +94948 -1.000000 +94949 -1.000000 +94950 -1.000000 +94951 -1.000000 +94952 -1.000000 +94953 -1.000000 +94954 -1.000000 +94955 -1.000000 +94956 -1.000000 +94957 -1.000000 +94958 -1.000000 +94959 -1.000000 +94960 -1.000000 +94961 -1.000000 +94962 -1.000000 +94963 -1.000000 +94964 -1.000000 +94965 -1.000000 +94966 -1.000000 +94967 -1.000000 +94968 -1.000000 +94969 -1.000000 +94970 -1.000000 +94973 -1.000000 +94974 -1.000000 +94975 -1.000000 +94976 -1.000000 +94977 -1.000000 +94978 -1.000000 +94979 -1.000000 +94980 -1.000000 +94981 -1.000000 +94982 -1.000000 +94983 -1.000000 +94985 -1.000000 +94986 -1.000000 +94987 -1.000000 +94988 -1.000000 +94989 -1.000000 +94990 -1.000000 +94991 -1.000000 +94992 -1.000000 +94993 -1.000000 +94994 -1.000000 +94995 -1.000000 +94996 -1.000000 +94997 -1.000000 +94998 -1.000000 +94999 -1.000000 +95000 -1.000000 +95001 -1.000000 +95002 -1.000000 +95003 -1.000000 +95004 -1.000000 +95005 -1.000000 +95006 -1.000000 +95007 -1.000000 +95008 -1.000000 +95009 -1.000000 +95010 -1.000000 +95011 -1.000000 +95012 -1.000000 +95013 -1.000000 +95014 -1.000000 +95015 -1.000000 +95016 -1.000000 +95017 -1.000000 +95018 -1.000000 +95019 -1.000000 +95020 -1.000000 +95021 -1.000000 +95022 -1.000000 +95023 -1.000000 +95024 -1.000000 +95025 -1.000000 +95026 -1.000000 +95027 -1.000000 +95028 -1.000000 +95029 -1.000000 +95030 -1.000000 +95031 -1.000000 +95032 -1.000000 +95033 -1.000000 +95034 -1.000000 +95035 -1.000000 +95036 -1.000000 +95037 -1.000000 +95038 -1.000000 +95039 -1.000000 +95040 -1.000000 +95041 -1.000000 +95042 -1.000000 +95043 -1.000000 +95044 -1.000000 +95045 -1.000000 +95046 -1.000000 +95047 -1.000000 +95048 -1.000000 +95049 -1.000000 +95050 -1.000000 +95051 -1.000000 +95052 -1.000000 +95053 -1.000000 +95054 -1.000000 +95055 -1.000000 +95056 -1.000000 +95057 -1.000000 +95058 -1.000000 +95059 -1.000000 +95060 -1.000000 +95061 -1.000000 +95062 -1.000000 +95063 -1.000000 +95064 -1.000000 +95065 -1.000000 +95066 -1.000000 +95067 -1.000000 +95068 -1.000000 +95069 -1.000000 +95070 -1.000000 +95071 -1.000000 +95072 -1.000000 +95073 -1.000000 +95074 -1.000000 +95075 -1.000000 +95076 -1.000000 +95077 -1.000000 +95078 -1.000000 +95079 -1.000000 +95080 -1.000000 +95081 -1.000000 +95082 -1.000000 +95083 -1.000000 +95084 -1.000000 +95085 -1.000000 +95086 -1.000000 +95087 -1.000000 +95088 -1.000000 +95089 -1.000000 +95090 -1.000000 +95091 -1.000000 +95092 -1.000000 +95093 -1.000000 +95094 -1.000000 +95095 -1.000000 +95096 -1.000000 +95097 -1.000000 +95098 -1.000000 +95099 -1.000000 +95100 -1.000000 +95101 -1.000000 +95102 -1.000000 +95103 -1.000000 +95104 -1.000000 +95105 -1.000000 +95106 -1.000000 +95107 -1.000000 +95108 -1.000000 +95109 -1.000000 +95110 -1.000000 +95111 -1.000000 +95112 -1.000000 +95113 -1.000000 +95114 -1.000000 +95115 -1.000000 +95116 -1.000000 +95117 -1.000000 +95118 -1.000000 +95119 -1.000000 +95120 -1.000000 +95121 -1.000000 +95122 -1.000000 +95123 -1.000000 +95124 -1.000000 +95125 -1.000000 +95126 -1.000000 +95127 -1.000000 +95128 -1.000000 +95129 -1.000000 +95130 -1.000000 +95131 -1.000000 +95132 -1.000000 +95133 -1.000000 +95134 -1.000000 +95135 -1.000000 +95136 -1.000000 +95137 -1.000000 +95138 -1.000000 +95139 -1.000000 +95140 -1.000000 +95141 -1.000000 +95142 -1.000000 +95143 -1.000000 +95144 -1.000000 +95145 -1.000000 +95146 -1.000000 +95147 -1.000000 +95148 -1.000000 +95149 -1.000000 +95150 -1.000000 +95151 -1.000000 +95152 -1.000000 +95153 -1.000000 +95154 -1.000000 +95155 -1.000000 +95156 -1.000000 +95157 -1.000000 +95158 -1.000000 +95159 -1.000000 +95160 -1.000000 +95161 -1.000000 +95162 -1.000000 +95163 -1.000000 +95164 -1.000000 +95165 -1.000000 +95166 -1.000000 +95167 -1.000000 +95168 -1.000000 +95169 -1.000000 +95170 -1.000000 +95171 -1.000000 +95172 -1.000000 +95173 -1.000000 +95174 -1.000000 +95175 -1.000000 +95176 -1.000000 +95177 -1.000000 +95178 -1.000000 +95179 -1.000000 +95180 -1.000000 +95181 -1.000000 +95182 -1.000000 +95183 -1.000000 +95184 -1.000000 +95185 -1.000000 +95186 -1.000000 +95187 -1.000000 +95188 -1.000000 +95189 -1.000000 +95190 -1.000000 +95191 -1.000000 +95192 -1.000000 +95193 -1.000000 +95194 -1.000000 +95195 -1.000000 +95196 -1.000000 +95197 -1.000000 +95198 -1.000000 +95199 -1.000000 +95200 -1.000000 +95201 -1.000000 +95202 -1.000000 +95203 -1.000000 +95204 -1.000000 +95205 -1.000000 +95206 -1.000000 +95207 -1.000000 +95208 -1.000000 +95209 -1.000000 +95210 -1.000000 +95211 -1.000000 +95212 -1.000000 +95213 -1.000000 +95214 -1.000000 +95215 -1.000000 +95216 -1.000000 +95217 -1.000000 +95218 -1.000000 +95219 -1.000000 +95220 -1.000000 +95221 -1.000000 +95222 -1.000000 +95223 -1.000000 +95224 -1.000000 +95225 -1.000000 +95226 -1.000000 +95227 -1.000000 +95228 -1.000000 +95229 -1.000000 +95230 -1.000000 +95231 -1.000000 +95232 -1.000000 +95233 -1.000000 +95234 -1.000000 +95235 -1.000000 +95236 -1.000000 +95237 -1.000000 +95238 -1.000000 +95239 -1.000000 +95240 -1.000000 +95241 -1.000000 +95242 -1.000000 +95243 -1.000000 +95244 -1.000000 +95245 -1.000000 +95246 -1.000000 +95247 -1.000000 +95248 -1.000000 +95249 -1.000000 +95250 -1.000000 +95251 -1.000000 +95252 -1.000000 +95253 -1.000000 +95254 -1.000000 +95255 -1.000000 +95256 -1.000000 +95257 -1.000000 +95258 -1.000000 +95259 -1.000000 +95260 -1.000000 +95261 -1.000000 +95262 -1.000000 +95263 -1.000000 +95264 -1.000000 +95265 -1.000000 +95266 -1.000000 +95267 -1.000000 +95268 -1.000000 +95269 -1.000000 +95270 -1.000000 +95271 -1.000000 +95272 -1.000000 +95273 -1.000000 +95274 -1.000000 +95275 -1.000000 +95276 -1.000000 +95277 -1.000000 +95278 -1.000000 +95279 -1.000000 +95280 -1.000000 +95281 -1.000000 +95282 -1.000000 +95283 -1.000000 +95284 -1.000000 +95285 -1.000000 +95286 -1.000000 +95287 -1.000000 +95288 -1.000000 +95289 -1.000000 +95290 -1.000000 +95291 -1.000000 +95292 -1.000000 +95293 -1.000000 +95294 -1.000000 +95295 -1.000000 +95296 -1.000000 +95297 -1.000000 +95298 -1.000000 +95299 -1.000000 +95300 -1.000000 +95301 -1.000000 +95302 -1.000000 +95303 -1.000000 +95304 -1.000000 +95305 -1.000000 +95306 -1.000000 +95307 -1.000000 +95308 -1.000000 +95309 -1.000000 +95310 -1.000000 +95311 -1.000000 +95312 -1.000000 +95313 -1.000000 +95314 -1.000000 +95315 -1.000000 +95316 -1.000000 +95317 -1.000000 +95318 -1.000000 +95319 -1.000000 +95320 -1.000000 +95321 -1.000000 +95322 -1.000000 +95323 -1.000000 +95324 -1.000000 +95325 -1.000000 +95326 -1.000000 +95327 -1.000000 +95328 -1.000000 +95329 -1.000000 +95330 -1.000000 +95331 -1.000000 +95332 -1.000000 +95333 -1.000000 +95334 -1.000000 +95335 -1.000000 +95336 -1.000000 +95337 -1.000000 +95338 -1.000000 +95339 -1.000000 +95340 -1.000000 +95341 -1.000000 +95342 -1.000000 +95343 -1.000000 +95344 -1.000000 +95345 -1.000000 +95346 -1.000000 +95347 -1.000000 +95348 -1.000000 +95349 -1.000000 +95350 -1.000000 +95351 -1.000000 +95352 -1.000000 +95353 -1.000000 +95354 -1.000000 +95355 -1.000000 +95356 -1.000000 +95357 -1.000000 +95358 -1.000000 +95359 -1.000000 +95360 -1.000000 +95361 -1.000000 +95362 -1.000000 +95363 -1.000000 +95364 -1.000000 +95365 -1.000000 +95366 -1.000000 +95367 -1.000000 +95368 -1.000000 +95369 -1.000000 +95370 -1.000000 +95371 -1.000000 +95372 -1.000000 +95373 -1.000000 +95374 -1.000000 +95375 -1.000000 +95376 -1.000000 +95377 -1.000000 +95378 -1.000000 +95379 -1.000000 +95380 -1.000000 +95381 -1.000000 +95382 -1.000000 +95383 -1.000000 +95384 -1.000000 +95385 -1.000000 +95386 -1.000000 +95387 -1.000000 +95388 -1.000000 +95389 -1.000000 +95390 -1.000000 +95391 -1.000000 +95392 -1.000000 +95393 -1.000000 +95394 -1.000000 +95395 -1.000000 +95396 -1.000000 +95397 -1.000000 +95398 -1.000000 +95399 -1.000000 +95400 -1.000000 +95401 -1.000000 +95402 -1.000000 +95404 -1.000000 +95405 -1.000000 +95406 -1.000000 +95407 -1.000000 +95408 -1.000000 +95409 -1.000000 +95410 -1.000000 +95411 -1.000000 +95412 -1.000000 +95413 -1.000000 +95414 -1.000000 +95415 -1.000000 +95416 -1.000000 +95417 -1.000000 +95418 -1.000000 +95419 -1.000000 +95420 -1.000000 +95421 -1.000000 +95422 -1.000000 +95423 -1.000000 +95424 -1.000000 +95425 -1.000000 +95426 -1.000000 +95427 -1.000000 +95428 -1.000000 +95429 -1.000000 +95430 -1.000000 +95431 -1.000000 +95432 -1.000000 +95433 -1.000000 +95434 -1.000000 +95435 -1.000000 +95436 -1.000000 +95437 -1.000000 +95438 -1.000000 +95439 -1.000000 +95440 -1.000000 +95441 -1.000000 +95442 -1.000000 +95443 -1.000000 +95444 -1.000000 +95445 -1.000000 +95446 -1.000000 +95447 -1.000000 +95448 -1.000000 +95449 -1.000000 +95450 -1.000000 +95451 -1.000000 +95452 -1.000000 +95453 -1.000000 +95454 -1.000000 +95455 -1.000000 +95456 -1.000000 +95457 -1.000000 +95458 -1.000000 +95459 -1.000000 +95460 -1.000000 +95461 -1.000000 +95462 -1.000000 +95463 -1.000000 +95464 -1.000000 +95465 -1.000000 +95466 -1.000000 +95467 -1.000000 +95468 -1.000000 +95469 -1.000000 +95470 -1.000000 +95471 -1.000000 +95472 -1.000000 +95473 -1.000000 +95474 -1.000000 +95475 -1.000000 +95476 -1.000000 +95477 -1.000000 +95478 -1.000000 +95479 -1.000000 +95480 -1.000000 +95481 -1.000000 +95482 -1.000000 +95483 -1.000000 +95484 -1.000000 +95485 -1.000000 +95486 -1.000000 +95487 -1.000000 +95488 -1.000000 +95489 -1.000000 +95490 -1.000000 +95491 -1.000000 +95492 -1.000000 +95493 -1.000000 +95494 -1.000000 +95495 -1.000000 +95496 -1.000000 +95497 -1.000000 +95498 -1.000000 +95499 -1.000000 +95500 -1.000000 +95501 -1.000000 +95502 -1.000000 +95503 -1.000000 +95504 -1.000000 +95505 -1.000000 +95506 -1.000000 +95507 -1.000000 +95508 -1.000000 +95509 -1.000000 +95510 -1.000000 +95511 -1.000000 +95512 -1.000000 +95513 -1.000000 +95514 -1.000000 +95515 -1.000000 +95516 -1.000000 +95517 -1.000000 +95518 -1.000000 +95519 -1.000000 +95520 -1.000000 +95521 -1.000000 +95522 -1.000000 +95523 -1.000000 +95524 -1.000000 +95525 -1.000000 +95526 -1.000000 +95527 -1.000000 +95528 -1.000000 +95529 -1.000000 +95530 -1.000000 +95531 -1.000000 +95532 -1.000000 +95533 -1.000000 +95534 -1.000000 +95535 -1.000000 +95536 -1.000000 +95537 -1.000000 +95538 -1.000000 +95539 -1.000000 +95540 -1.000000 +95541 -1.000000 +95542 -1.000000 +95543 -1.000000 +95544 -1.000000 +95545 -1.000000 +95546 -1.000000 +95547 -1.000000 +95548 -1.000000 +95549 -1.000000 +95550 -1.000000 +95551 -1.000000 +95552 -1.000000 +95553 -1.000000 +95554 -1.000000 +95555 -1.000000 +95556 -1.000000 +95557 -1.000000 +95558 -1.000000 +95559 -1.000000 +95560 -1.000000 +95561 -1.000000 +95562 -1.000000 +95564 -1.000000 +95565 -1.000000 +95566 -1.000000 +95567 -1.000000 +95568 -1.000000 +95569 -1.000000 +95571 -1.000000 +95572 -1.000000 +95573 -1.000000 +95574 -1.000000 +95575 -1.000000 +95576 -1.000000 +95577 -1.000000 +95578 -1.000000 +95579 -1.000000 +95580 -1.000000 +95581 -1.000000 +95582 -1.000000 +95583 -1.000000 +95584 -1.000000 +95585 -1.000000 +95586 -1.000000 +95587 -1.000000 +95588 -1.000000 +95589 -1.000000 +95590 -1.000000 +95591 -1.000000 +95592 -1.000000 +95593 -1.000000 +95594 -1.000000 +95595 -1.000000 +95596 -1.000000 +95597 -1.000000 +95598 -1.000000 +95599 -1.000000 +95600 -1.000000 +95601 -1.000000 +95602 -1.000000 +95603 -1.000000 +95604 -1.000000 +95605 -1.000000 +95606 -1.000000 +95607 -1.000000 +95608 -1.000000 +95609 -1.000000 +95610 -1.000000 +95611 -1.000000 +95612 -1.000000 +95613 -1.000000 +95614 -1.000000 +95615 -1.000000 +95616 -1.000000 +95617 -1.000000 +95618 -1.000000 +95619 -1.000000 +95620 -1.000000 +95621 -1.000000 +95622 -1.000000 +95623 -1.000000 +95624 -1.000000 +95625 -1.000000 +95626 -1.000000 +95627 -1.000000 +95628 -1.000000 +95629 -1.000000 +95630 -1.000000 +95631 -1.000000 +95632 -1.000000 +95633 -1.000000 +95634 -1.000000 +95635 -1.000000 +95636 -1.000000 +95637 -1.000000 +95638 -1.000000 +95639 -1.000000 +95640 -1.000000 +95641 -1.000000 +95642 -1.000000 +95643 -1.000000 +95644 -1.000000 +95645 -1.000000 +95646 -1.000000 +95647 -1.000000 +95648 -1.000000 +95649 -1.000000 +95650 -1.000000 +95651 -1.000000 +95652 -1.000000 +95653 -1.000000 +95654 -1.000000 +95655 -1.000000 +95656 -1.000000 +95657 -1.000000 +95658 -1.000000 +95659 -1.000000 +95660 -1.000000 +95661 -1.000000 +95662 -1.000000 +95663 -1.000000 +95664 -1.000000 +95665 -1.000000 +95666 -1.000000 +95667 -1.000000 +95668 -1.000000 +95669 -1.000000 +95670 -1.000000 +95671 -1.000000 +95672 -1.000000 +95673 -1.000000 +95674 -1.000000 +95675 -1.000000 +95676 -1.000000 +95677 -1.000000 +95678 -1.000000 +95679 -1.000000 +95680 -1.000000 +95681 -1.000000 +95682 -1.000000 +95683 -1.000000 +95684 -1.000000 +95685 -1.000000 +95686 -1.000000 +95687 -1.000000 +95688 -1.000000 +95689 -1.000000 +95690 -1.000000 +95691 -1.000000 +95692 -1.000000 +95693 -1.000000 +95694 -1.000000 +95695 -1.000000 +95696 -1.000000 +95697 -1.000000 +95698 -1.000000 +95699 -1.000000 +95700 -1.000000 +95701 -1.000000 +95702 -1.000000 +95703 -1.000000 +95704 -1.000000 +95705 -1.000000 +95706 -1.000000 +95707 -1.000000 +95708 -1.000000 +95709 -1.000000 +95710 -1.000000 +95711 -1.000000 +95712 -1.000000 +95713 -1.000000 +95714 -1.000000 +95717 -1.000000 +95718 -1.000000 +95719 -1.000000 +95720 -1.000000 +95721 -1.000000 +95722 -1.000000 +95723 -1.000000 +95724 -1.000000 +95725 -1.000000 +95726 -1.000000 +95727 -1.000000 +95728 -1.000000 +95729 -1.000000 +95730 -1.000000 +95731 -1.000000 +95732 -1.000000 +95733 -1.000000 +95734 -1.000000 +95735 -1.000000 +95736 -1.000000 +95737 -1.000000 +95738 -1.000000 +95739 -1.000000 +95740 -1.000000 +95741 -1.000000 +95742 -1.000000 +95743 -1.000000 +95744 -1.000000 +95745 -1.000000 +95746 -1.000000 +95747 -1.000000 +95748 -1.000000 +95749 -1.000000 +95750 -1.000000 +95751 -1.000000 +95752 -1.000000 +95753 -1.000000 +95754 -1.000000 +95755 -1.000000 +95756 -1.000000 +95757 -1.000000 +95758 -1.000000 +95759 -1.000000 +95760 -1.000000 +95761 -1.000000 +95762 -1.000000 +95763 -1.000000 +95764 -1.000000 +95765 -1.000000 +95766 -1.000000 +95767 -1.000000 +95768 -1.000000 +95769 -1.000000 +95770 -1.000000 +95771 -1.000000 +95772 -1.000000 +95773 -1.000000 +95774 -1.000000 +95775 -1.000000 +95776 -1.000000 +95777 -1.000000 +95778 -1.000000 +95779 -1.000000 +95780 -1.000000 +95781 -1.000000 +95782 -1.000000 +95783 -1.000000 +95784 -1.000000 +95785 -1.000000 +95786 -1.000000 +95787 -1.000000 +95788 -1.000000 +95789 -1.000000 +95790 -1.000000 +95791 -1.000000 +95792 -1.000000 +95793 -1.000000 +95794 -1.000000 +95795 -1.000000 +95796 -1.000000 +95797 -1.000000 +95798 -1.000000 +95799 -1.000000 +95800 -1.000000 +95801 -1.000000 +95802 -1.000000 +95803 -1.000000 +95804 -1.000000 +95805 -1.000000 +95806 -1.000000 +95807 -1.000000 +95808 -1.000000 +95809 -1.000000 +95810 -1.000000 +95811 -1.000000 +95812 -1.000000 +95813 -1.000000 +95814 -1.000000 +95815 -1.000000 +95816 -1.000000 +95817 -1.000000 +95818 -1.000000 +95819 -1.000000 +95820 -1.000000 +95821 -1.000000 +95822 -1.000000 +95823 -1.000000 +95824 -1.000000 +95825 -1.000000 +95826 -1.000000 +95827 -1.000000 +95828 -1.000000 +95829 -1.000000 +95830 -1.000000 +95831 -1.000000 +95832 -1.000000 +95833 -1.000000 +95834 -1.000000 +95835 -1.000000 +95836 -1.000000 +95837 -1.000000 +95838 -1.000000 +95839 -1.000000 +95840 -1.000000 +95841 -1.000000 +95842 -1.000000 +95843 -1.000000 +95844 -1.000000 +95845 -1.000000 +95846 -1.000000 +95847 -1.000000 +95848 -1.000000 +95849 -1.000000 +95850 -1.000000 +95851 -1.000000 +95852 -1.000000 +95853 -1.000000 +95854 -1.000000 +95855 -1.000000 +95856 -1.000000 +95857 -1.000000 +95858 -1.000000 +95859 -1.000000 +95860 -1.000000 +95861 -1.000000 +95862 -1.000000 +95863 -1.000000 +95864 -1.000000 +95865 -1.000000 +95866 -1.000000 +95867 -1.000000 +95868 -1.000000 +95869 -1.000000 +95870 -1.000000 +95871 -1.000000 +95872 -1.000000 +95873 -1.000000 +95874 -1.000000 +95875 -1.000000 +95876 -1.000000 +95877 -1.000000 +95878 -1.000000 +95879 -1.000000 +95880 -1.000000 +95881 -1.000000 +95882 -1.000000 +95883 -1.000000 +95884 -1.000000 +95885 -1.000000 +95886 -1.000000 +95887 -1.000000 +95888 -1.000000 +95889 -1.000000 +95890 -1.000000 +95891 -1.000000 +95892 -1.000000 +95893 -1.000000 +95894 -1.000000 +95895 -1.000000 +95896 -1.000000 +95897 -1.000000 +95898 -1.000000 +95899 -1.000000 +95900 -1.000000 +95901 -1.000000 +95902 -1.000000 +95903 -1.000000 +95904 -1.000000 +95905 -1.000000 +95906 -1.000000 +95907 -1.000000 +95908 -1.000000 +95909 -1.000000 +95910 -1.000000 +95911 -1.000000 +95912 -1.000000 +95913 -1.000000 +95914 -1.000000 +95915 -1.000000 +95916 -1.000000 +95917 -1.000000 +95918 -1.000000 +95919 -1.000000 +95920 -1.000000 +95921 -1.000000 +95922 -1.000000 +95923 -1.000000 +95924 -1.000000 +95925 -1.000000 +95926 -1.000000 +95927 -1.000000 +95928 -1.000000 +95929 -1.000000 +95930 -1.000000 +95931 -1.000000 +95932 -1.000000 +95933 -1.000000 +95934 -1.000000 +95935 -1.000000 +95936 -1.000000 +95937 -1.000000 +95938 -1.000000 +95939 -1.000000 +95940 -1.000000 +95941 -1.000000 +95942 -1.000000 +95943 -1.000000 +95944 -1.000000 +95945 -1.000000 +95946 -1.000000 +95947 -1.000000 +95948 -1.000000 +95949 -1.000000 +95950 -1.000000 +95951 -1.000000 +95952 -1.000000 +95953 -1.000000 +95954 -1.000000 +95955 -1.000000 +95956 -1.000000 +95957 -1.000000 +95958 -1.000000 +95959 -1.000000 +95960 -1.000000 +95961 -1.000000 +95962 -1.000000 +95963 -1.000000 +95964 -1.000000 +95965 -1.000000 +95966 -1.000000 +95967 -1.000000 +95968 -1.000000 +95969 -1.000000 +95970 -1.000000 +95971 -1.000000 +95972 -1.000000 +95973 -1.000000 +95974 -1.000000 +95975 -1.000000 +95976 -1.000000 +95977 -1.000000 +95978 -1.000000 +95979 -1.000000 +95980 -1.000000 +95981 -1.000000 +95982 -1.000000 +95983 -1.000000 +95984 -1.000000 +95985 -1.000000 +95986 -1.000000 +95987 -1.000000 +95988 -1.000000 +95989 -1.000000 +95990 -1.000000 +95991 -1.000000 +95992 -1.000000 +95993 -1.000000 +95994 -1.000000 +95995 -1.000000 +95996 -1.000000 +95997 -1.000000 +95998 -1.000000 +95999 -1.000000 +96000 -1.000000 +96001 -1.000000 +96002 -1.000000 +96003 -1.000000 +96004 -1.000000 +96005 -1.000000 +96006 -1.000000 +96007 -1.000000 +96008 -1.000000 +96009 -1.000000 +96010 -1.000000 +96011 -1.000000 +96012 -1.000000 +96013 -1.000000 +96014 -1.000000 +96015 -1.000000 +96016 -1.000000 +96017 -1.000000 +96018 -1.000000 +96019 -1.000000 +96020 -1.000000 +96021 -1.000000 +96022 -1.000000 +96023 -1.000000 +96024 -1.000000 +96025 -1.000000 +96026 -1.000000 +96027 -1.000000 +96028 -1.000000 +96029 -1.000000 +96030 -1.000000 +96031 -1.000000 +96032 -1.000000 +96033 -1.000000 +96034 -1.000000 +96035 -1.000000 +96036 -1.000000 +96037 -1.000000 +96038 -1.000000 +96039 -1.000000 +96040 -1.000000 +96041 -1.000000 +96042 -1.000000 +96043 -1.000000 +96044 -1.000000 +96045 -1.000000 +96046 -1.000000 +96047 -1.000000 +96048 -1.000000 +96049 -1.000000 +96050 -1.000000 +96051 -1.000000 +96052 -1.000000 +96053 -1.000000 +96054 -1.000000 +96055 -1.000000 +96056 -1.000000 +96057 -1.000000 +96058 -1.000000 +96059 -1.000000 +96060 -1.000000 +96061 -1.000000 +96062 -1.000000 +96063 -1.000000 +96064 -1.000000 +96065 -1.000000 +96066 -1.000000 +96067 -1.000000 +96068 -1.000000 +96069 -1.000000 +96070 -1.000000 +96071 -1.000000 +96072 -1.000000 +96073 -1.000000 +96074 -1.000000 +96075 -1.000000 +96076 -1.000000 +96077 -1.000000 +96078 -1.000000 +96079 -1.000000 +96080 -1.000000 +96081 -1.000000 +96082 -1.000000 +96083 -1.000000 +96084 -1.000000 +96085 -1.000000 +96086 -1.000000 +96087 -1.000000 +96088 -1.000000 +96089 -1.000000 +96090 -1.000000 +96091 -1.000000 +96092 -1.000000 +96093 -1.000000 +96094 -1.000000 +96095 -1.000000 +96096 -1.000000 +96097 -1.000000 +96098 -1.000000 +96099 -1.000000 +96100 -1.000000 +96101 -1.000000 +96102 -1.000000 +96103 -1.000000 +96104 -1.000000 +96105 -1.000000 +96106 -1.000000 +96107 -1.000000 +96108 -1.000000 +96109 -1.000000 +96110 -1.000000 +96111 -1.000000 +96112 -1.000000 +96113 -1.000000 +96114 -1.000000 +96115 -1.000000 +96116 -1.000000 +96117 -1.000000 +96118 -1.000000 +96119 -1.000000 +96120 -1.000000 +96121 -1.000000 +96122 -1.000000 +96123 -1.000000 +96124 -1.000000 +96125 -1.000000 +96126 -1.000000 +96127 -1.000000 +96128 -1.000000 +96129 -1.000000 +96130 -1.000000 +96131 -1.000000 +96132 -1.000000 +96133 -1.000000 +96134 -1.000000 +96135 -1.000000 +96136 -1.000000 +96137 -1.000000 +96138 -1.000000 +96139 -1.000000 +96140 -1.000000 +96141 -1.000000 +96142 -1.000000 +96143 -1.000000 +96144 -1.000000 +96145 -1.000000 +96146 -1.000000 +96147 -1.000000 +96148 -1.000000 +96149 -1.000000 +96150 -1.000000 +96151 -1.000000 +96152 -1.000000 +96153 -1.000000 +96154 -1.000000 +96155 -1.000000 +96156 -1.000000 +96157 -1.000000 +96158 -1.000000 +96159 -1.000000 +96160 -1.000000 +96161 -1.000000 +96162 -1.000000 +96163 -1.000000 +96164 -1.000000 +96165 -1.000000 +96166 -1.000000 +96167 -1.000000 +96168 -1.000000 +96169 -1.000000 +96170 -1.000000 +96171 -1.000000 +96172 -1.000000 +96173 -1.000000 +96174 -1.000000 +96175 -1.000000 +96176 -1.000000 +96177 -1.000000 +96178 -1.000000 +96179 -1.000000 +96180 -1.000000 +96181 -1.000000 +96182 -1.000000 +96183 -1.000000 +96184 -1.000000 +96185 -1.000000 +96186 -1.000000 +96187 -1.000000 +96188 -1.000000 +96189 -1.000000 +96190 -1.000000 +96191 -1.000000 +96192 -1.000000 +96193 -1.000000 +96194 -1.000000 +96195 -1.000000 +96196 -1.000000 +96197 -1.000000 +96198 -1.000000 +96199 -1.000000 +96200 -1.000000 +96201 -1.000000 +96202 -1.000000 +96203 -1.000000 +96204 -1.000000 +96205 -1.000000 +96206 -1.000000 +96207 -1.000000 +96208 -1.000000 +96209 -1.000000 +96210 -1.000000 +96211 -1.000000 +96212 -1.000000 +96213 -1.000000 +96214 -1.000000 +96215 -1.000000 +96216 -1.000000 +96217 -1.000000 +96218 -1.000000 +96219 -1.000000 +96220 -1.000000 +96221 -1.000000 +96222 -1.000000 +96223 -1.000000 +96224 -1.000000 +96225 -1.000000 +96226 -1.000000 +96227 -1.000000 +96228 -1.000000 +96229 -1.000000 +96230 -1.000000 +96231 -1.000000 +96232 -1.000000 +96233 -1.000000 +96234 -1.000000 +96235 -1.000000 +96236 -1.000000 +96237 -1.000000 +96238 -1.000000 +96239 -1.000000 +96240 -1.000000 +96241 -1.000000 +96242 -1.000000 +96243 -1.000000 +96244 -1.000000 +96245 -1.000000 +96246 -1.000000 +96247 -1.000000 +96248 -1.000000 +96249 -1.000000 +96250 -1.000000 +96251 -1.000000 +96252 -1.000000 +96253 -1.000000 +96254 -1.000000 +96255 -1.000000 +96256 -1.000000 +96257 -1.000000 +96258 -1.000000 +96259 -1.000000 +96260 -1.000000 +96261 -1.000000 +96262 -1.000000 +96263 -1.000000 +96264 -1.000000 +96265 -1.000000 +96266 -1.000000 +96267 -1.000000 +96268 -1.000000 +96269 -1.000000 +96270 -1.000000 +96271 -1.000000 +96272 -1.000000 +96273 -1.000000 +96274 -1.000000 +96275 -1.000000 +96276 -1.000000 +96277 -1.000000 +96278 -1.000000 +96279 -1.000000 +96280 -1.000000 +96281 -1.000000 +96282 -1.000000 +96283 -1.000000 +96284 -1.000000 +96285 -1.000000 +96286 -1.000000 +96287 -1.000000 +96288 -1.000000 +96289 -1.000000 +96290 -1.000000 +96291 -1.000000 +96292 -1.000000 +96293 -1.000000 +96294 -1.000000 +96295 -1.000000 +96296 -1.000000 +96297 -1.000000 +96298 -1.000000 +96299 -1.000000 +96300 -1.000000 +96301 -1.000000 +96302 -1.000000 +96303 -1.000000 +96304 -1.000000 +96305 -1.000000 +96306 -1.000000 +96307 -1.000000 +96308 -1.000000 +96309 -1.000000 +96310 -1.000000 +96311 -1.000000 +96312 -1.000000 +96313 -1.000000 +96314 -1.000000 +96315 -1.000000 +96316 -1.000000 +96317 -1.000000 +96318 -1.000000 +96319 -1.000000 +96320 -1.000000 +96321 -1.000000 +96322 -1.000000 +96323 -1.000000 +96324 -1.000000 +96325 -1.000000 +96326 -1.000000 +96327 -1.000000 +96328 -1.000000 +96329 -1.000000 +96330 -1.000000 +96331 -1.000000 +96332 -1.000000 +96333 -1.000000 +96334 -1.000000 +96335 -1.000000 +96336 -1.000000 +96337 -1.000000 +96338 -1.000000 +96339 -1.000000 +96340 -1.000000 +96341 -1.000000 +96342 -1.000000 +96343 -1.000000 +96344 -1.000000 +96345 -1.000000 +96346 -1.000000 +96347 -1.000000 +96348 -1.000000 +96349 -1.000000 +96350 -1.000000 +96351 -1.000000 +96352 -1.000000 +96353 -1.000000 +96354 -1.000000 +96355 -1.000000 +96356 -1.000000 +96357 -1.000000 +96358 -1.000000 +96359 -1.000000 +96360 -1.000000 +96361 -1.000000 +96362 -1.000000 +96363 -1.000000 +96364 -1.000000 +96365 -1.000000 +96366 -1.000000 +96367 -1.000000 +96368 -1.000000 +96369 -1.000000 +96370 -1.000000 +96371 -1.000000 +96372 -1.000000 +96373 -1.000000 +96374 -1.000000 +96375 -1.000000 +96376 -1.000000 +96377 -1.000000 +96378 -1.000000 +96379 -1.000000 +96380 -1.000000 +96381 -1.000000 +96382 -1.000000 +96383 -1.000000 +96384 -1.000000 +96385 -1.000000 +96386 -1.000000 +96387 -1.000000 +96388 -1.000000 +96389 -1.000000 +96390 -1.000000 +96391 -1.000000 +96392 -1.000000 +96393 -1.000000 +96394 -1.000000 +96395 -1.000000 +96396 -1.000000 +96397 -1.000000 +96398 -1.000000 +96399 -1.000000 +96400 -1.000000 +96401 -1.000000 +96402 -1.000000 +96403 -1.000000 +96404 -1.000000 +96405 -1.000000 +96406 -1.000000 +96407 -1.000000 +96408 -1.000000 +96409 -1.000000 +96410 -1.000000 +96411 -1.000000 +96412 -1.000000 +96413 -1.000000 +96414 -1.000000 +96415 -1.000000 +96416 -1.000000 +96417 -1.000000 +96418 -1.000000 +96419 -1.000000 +96420 -1.000000 +96421 -1.000000 +96422 -1.000000 +96423 -1.000000 +96424 -1.000000 +96425 -1.000000 +96426 -1.000000 +96427 -1.000000 +96428 -1.000000 +96429 -1.000000 +96430 -1.000000 +96431 -1.000000 +96432 -1.000000 +96433 -1.000000 +96434 -1.000000 +96435 -1.000000 +96436 -1.000000 +96437 -1.000000 +96438 -1.000000 +96439 -1.000000 +96440 -1.000000 +96441 -1.000000 +96442 -1.000000 +96443 -1.000000 +96444 -1.000000 +96445 -1.000000 +96446 -1.000000 +96447 -1.000000 +96448 -1.000000 +96449 -1.000000 +96450 -1.000000 +96451 -1.000000 +96452 -1.000000 +96453 -1.000000 +96454 -1.000000 +96455 -1.000000 +96456 -1.000000 +96457 -1.000000 +96458 -1.000000 +96459 -1.000000 +96460 -1.000000 +96461 -1.000000 +96462 -1.000000 +96463 -1.000000 +96464 -1.000000 +96465 -1.000000 +96466 -1.000000 +96467 -1.000000 +96468 -1.000000 +96469 -1.000000 +96470 -1.000000 +96471 -1.000000 +96472 -1.000000 +96473 -1.000000 +96474 -1.000000 +96475 -1.000000 +96476 -1.000000 +96477 -1.000000 +96478 -1.000000 +96479 -1.000000 +96480 -1.000000 +96481 -1.000000 +96482 -1.000000 +96483 -1.000000 +96484 -1.000000 +96485 -1.000000 +96486 -1.000000 +96487 -1.000000 +96488 -1.000000 +96489 -1.000000 +96490 -1.000000 +96491 -1.000000 +96492 -1.000000 +96493 -1.000000 +96494 -1.000000 +96495 -1.000000 +96496 -1.000000 +96497 -1.000000 +96498 -1.000000 +96499 -1.000000 +96500 -1.000000 +96501 -1.000000 +96502 -1.000000 +96503 -1.000000 +96504 -1.000000 +96505 -1.000000 +96506 -1.000000 +96507 -1.000000 +96508 -1.000000 +96509 -1.000000 +96510 -1.000000 +96511 -1.000000 +96512 -1.000000 +96513 -1.000000 +96514 -1.000000 +96515 -1.000000 +96516 -1.000000 +96517 -1.000000 +96518 -1.000000 +96519 -1.000000 +96520 -1.000000 +96521 -1.000000 +96522 -1.000000 +96523 -1.000000 +96524 -1.000000 +96525 -1.000000 +96526 -1.000000 +96527 -1.000000 +96528 -1.000000 +96529 -1.000000 +96530 -1.000000 +96531 -1.000000 +96532 -1.000000 +96533 -1.000000 +96534 -1.000000 +96535 -1.000000 +96536 -1.000000 +96537 -1.000000 +96538 -1.000000 +96539 -1.000000 +96540 -1.000000 +96541 -1.000000 +96542 -1.000000 +96543 -1.000000 +96544 -1.000000 +96545 -1.000000 +96546 -1.000000 +96547 -1.000000 +96548 -1.000000 +96549 -1.000000 +96550 -1.000000 +96551 -1.000000 +96552 -1.000000 +96553 -1.000000 +96554 -1.000000 +96555 -1.000000 +96556 -1.000000 +96557 -1.000000 +96558 -1.000000 +96559 -1.000000 +96560 -1.000000 +96561 -1.000000 +96562 -1.000000 +96563 -1.000000 +96564 -1.000000 +96565 -1.000000 +96566 -1.000000 +96567 -1.000000 +96568 -1.000000 +96569 -1.000000 +96570 -1.000000 +96571 -1.000000 +96572 -1.000000 +96573 -1.000000 +96574 -1.000000 +96575 -1.000000 +96576 -1.000000 +96577 -1.000000 +96578 -1.000000 +96579 -1.000000 +96580 -1.000000 +96581 -1.000000 +96582 -1.000000 +96583 -1.000000 +96584 -1.000000 +96585 -1.000000 +96586 -1.000000 +96587 -1.000000 +96588 -1.000000 +96589 -1.000000 +96590 -1.000000 +96591 -1.000000 +96592 -1.000000 +96593 -1.000000 +96594 -1.000000 +96595 -1.000000 +96596 -1.000000 +96597 -1.000000 +96598 -1.000000 +96599 -1.000000 +96600 -1.000000 +96601 -1.000000 +96602 -1.000000 +96603 -1.000000 +96604 -1.000000 +96605 -1.000000 +96606 -1.000000 +96607 -1.000000 +96608 -1.000000 +96609 -1.000000 +96610 -1.000000 +96611 -1.000000 +96612 -1.000000 +96613 -1.000000 +96614 -1.000000 +96615 -1.000000 +96616 -1.000000 +96617 -1.000000 +96618 -1.000000 +96619 -1.000000 +96620 -1.000000 +96621 -1.000000 +96622 -1.000000 +96623 -1.000000 +96624 -1.000000 +96625 -1.000000 +96626 -1.000000 +96627 -1.000000 +96628 -1.000000 +96629 -1.000000 +96630 -1.000000 +96631 -1.000000 +96632 -1.000000 +96633 -1.000000 +96634 -1.000000 +96635 -1.000000 +96636 -1.000000 +96637 -1.000000 +96638 -1.000000 +96639 -1.000000 +96640 -1.000000 +96641 -1.000000 +96642 -1.000000 +96643 -1.000000 +96644 -1.000000 +96645 -1.000000 +96646 -1.000000 +96647 -1.000000 +96648 -1.000000 +96649 -1.000000 +96650 -1.000000 +96651 -1.000000 +96652 -1.000000 +96653 -1.000000 +96654 -1.000000 +96655 -1.000000 +96656 -1.000000 +96657 -1.000000 +96658 -1.000000 +96659 -1.000000 +96660 -1.000000 +96661 -1.000000 +96662 -1.000000 +96663 -1.000000 +96664 -1.000000 +96665 -1.000000 +96666 -1.000000 +96667 -1.000000 +96668 -1.000000 +96669 -1.000000 +96670 -1.000000 +96671 -1.000000 +96672 -1.000000 +96673 -1.000000 +96674 -1.000000 +96675 -1.000000 +96676 -1.000000 +96677 -1.000000 +96678 -1.000000 +96679 -1.000000 +96680 -1.000000 +96681 -1.000000 +96682 -1.000000 +96683 -1.000000 +96684 -1.000000 +96685 -1.000000 +96686 -1.000000 +96687 -1.000000 +96688 -1.000000 +96689 -1.000000 +96690 -1.000000 +96691 -1.000000 +96692 -1.000000 +96693 -1.000000 +96694 -1.000000 +96695 -1.000000 +96696 -1.000000 +96697 -1.000000 +96698 -1.000000 +96699 -1.000000 +96700 -1.000000 +96701 -1.000000 +96702 -1.000000 +96703 -1.000000 +96704 -1.000000 +96705 -1.000000 +96706 -1.000000 +96707 -1.000000 +96708 -1.000000 +96709 -1.000000 +96710 -1.000000 +96711 -1.000000 +96712 -1.000000 +96713 -1.000000 +96714 -1.000000 +96715 -1.000000 +96716 -1.000000 +96717 -1.000000 +96718 -1.000000 +96719 -1.000000 +96720 -1.000000 +96721 -1.000000 +96722 -1.000000 +96723 -1.000000 +96724 -1.000000 +96725 -1.000000 +96726 -1.000000 +96727 -1.000000 +96728 -1.000000 +96729 -1.000000 +96730 -1.000000 +96731 -1.000000 +96732 -1.000000 +96733 -1.000000 +96734 -1.000000 +96735 -1.000000 +96736 -1.000000 +96737 -1.000000 +96738 -1.000000 +96739 -1.000000 +96740 -1.000000 +96741 -1.000000 +96742 -1.000000 +96743 -1.000000 +96744 -1.000000 +96745 -1.000000 +96746 -1.000000 +96747 -1.000000 +96748 -1.000000 +96749 -1.000000 +96750 -1.000000 +96751 -1.000000 +96752 -1.000000 +96753 -1.000000 +96754 -1.000000 +96755 -1.000000 +96756 -1.000000 +96757 -1.000000 +96758 -1.000000 +96759 -1.000000 +96760 -1.000000 +96761 -1.000000 +96762 -1.000000 +96763 -1.000000 +96764 -1.000000 +96765 -1.000000 +96766 -1.000000 +96767 -1.000000 +96768 -1.000000 +96769 -1.000000 +96770 -1.000000 +96771 -1.000000 +96772 -1.000000 +96773 -1.000000 +96774 -1.000000 +96775 -1.000000 +96776 -1.000000 +96777 -1.000000 +96778 -1.000000 +96779 -1.000000 +96780 -1.000000 +96781 -1.000000 +96782 -1.000000 +96783 -1.000000 +96784 -1.000000 +96785 -1.000000 +96786 -1.000000 +96787 -1.000000 +96788 -1.000000 +96789 -1.000000 +96790 -1.000000 +96791 -1.000000 +96792 -1.000000 +96793 -1.000000 +96794 -1.000000 +96795 -1.000000 +96796 -1.000000 +96797 -1.000000 +96798 -1.000000 +96799 -1.000000 +96800 -1.000000 +96801 -1.000000 +96802 -1.000000 +96803 -1.000000 +96804 -1.000000 +96805 -1.000000 +96806 -1.000000 +96807 -1.000000 +96808 -1.000000 +96809 -1.000000 +96810 -1.000000 +96811 -1.000000 +96812 -1.000000 +96813 -1.000000 +96814 -1.000000 +96815 -1.000000 +96816 -1.000000 +96817 -1.000000 +96818 -1.000000 +96819 -1.000000 +96820 -1.000000 +96821 -1.000000 +96822 -1.000000 +96823 -1.000000 +96824 -1.000000 +96825 -1.000000 +96826 -1.000000 +96827 -1.000000 +96828 -1.000000 +96829 -1.000000 +96830 -1.000000 +96831 -1.000000 +96832 -1.000000 +96833 -1.000000 +96834 -1.000000 +96835 -1.000000 +96836 -1.000000 +96837 -1.000000 +96838 -1.000000 +96839 -1.000000 +96840 -1.000000 +96841 -1.000000 +96842 -1.000000 +96843 -1.000000 +96844 -1.000000 +96845 -1.000000 +96846 -1.000000 +96847 -1.000000 +96848 -1.000000 +96849 -1.000000 +96850 -1.000000 +96851 -1.000000 +96852 -1.000000 +96853 -1.000000 +96854 -1.000000 +96855 -1.000000 +96856 -1.000000 +96857 -1.000000 +96858 -1.000000 +96859 -1.000000 +96860 -1.000000 +96861 -1.000000 +96862 -1.000000 +96863 -1.000000 +96864 -1.000000 +96865 -1.000000 +96866 -1.000000 +96867 -1.000000 +96868 -1.000000 +96869 -1.000000 +96870 -1.000000 +96871 -1.000000 +96872 -1.000000 +96873 -1.000000 +96874 -1.000000 +96875 -1.000000 +96876 -1.000000 +96877 -1.000000 +96878 -1.000000 +96879 -1.000000 +96880 -1.000000 +96881 -1.000000 +96882 -1.000000 +96883 -1.000000 +96884 -1.000000 +96885 -1.000000 +96886 -1.000000 +96887 -1.000000 +96888 -1.000000 +96889 -1.000000 +96890 -1.000000 +96891 -1.000000 +96892 -1.000000 +96893 -1.000000 +96894 -1.000000 +96895 -1.000000 +96896 -1.000000 +96897 -1.000000 +96898 -1.000000 +96899 -1.000000 +96900 -1.000000 +96901 -1.000000 +96902 -1.000000 +96903 -1.000000 +96904 -1.000000 +96905 -1.000000 +96906 -1.000000 +96907 -1.000000 +96908 -1.000000 +96909 -1.000000 +96910 -1.000000 +96911 -1.000000 +96912 -1.000000 +96913 -1.000000 +96914 -1.000000 +96915 -1.000000 +96916 -1.000000 +96917 -1.000000 +96918 -1.000000 +96919 -1.000000 +96920 -1.000000 +96921 -1.000000 +96922 -1.000000 +96923 -1.000000 +96924 -1.000000 +96925 -1.000000 +96926 -1.000000 +96927 -1.000000 +96928 -1.000000 +96929 -1.000000 +96930 -1.000000 +96931 -1.000000 +96932 -1.000000 +96933 -1.000000 +96934 -1.000000 +96935 -1.000000 +96936 -1.000000 +96937 -1.000000 +96938 -1.000000 +96939 -1.000000 +96940 -1.000000 +96941 -1.000000 +96942 -1.000000 +96943 -1.000000 +96944 -1.000000 +96945 -1.000000 +96946 -1.000000 +96947 -1.000000 +96948 -1.000000 +96949 -1.000000 +96950 -1.000000 +96951 -1.000000 +96952 -1.000000 +96953 -1.000000 +96954 -1.000000 +96955 -1.000000 +96956 -1.000000 +96957 -1.000000 +96958 -1.000000 +96959 -1.000000 +96960 -1.000000 +96961 -1.000000 +96962 -1.000000 +96963 -1.000000 +96964 -1.000000 +96965 -1.000000 +96966 -1.000000 +96967 -1.000000 +96968 -1.000000 +96969 -1.000000 +96970 -1.000000 +96971 -1.000000 +96972 -1.000000 +96973 -1.000000 +96974 -1.000000 +96975 -1.000000 +96976 -1.000000 +96977 -1.000000 +96978 -1.000000 +96979 -1.000000 +96980 -1.000000 +96981 -1.000000 +96982 -1.000000 +96983 -1.000000 +96984 -1.000000 +96985 -1.000000 +96986 -1.000000 +96987 -1.000000 +96988 -1.000000 +96989 -1.000000 +96990 -1.000000 +96991 -1.000000 +96992 -1.000000 +96993 -1.000000 +96994 -1.000000 +96995 -1.000000 +96996 -1.000000 +96997 -1.000000 +96998 -1.000000 +96999 -1.000000 +97000 -1.000000 +97001 -1.000000 +97002 -1.000000 +97003 -1.000000 +97004 -1.000000 +97005 -1.000000 +97006 -1.000000 +97007 -1.000000 +97008 -1.000000 +97009 -1.000000 +97010 -1.000000 +97011 -1.000000 +97012 -1.000000 +97013 -1.000000 +97014 -1.000000 +97015 -1.000000 +97016 -1.000000 +97017 -1.000000 +97018 -1.000000 +97019 -1.000000 +97020 -1.000000 +97021 -1.000000 +97022 -1.000000 +97023 -1.000000 +97024 -1.000000 +97025 -1.000000 +97026 -1.000000 +97027 -1.000000 +97028 -1.000000 +97029 -1.000000 +97030 -1.000000 +97031 -1.000000 +97032 -1.000000 +97042 -1.000000 +97043 -1.000000 +97044 -1.000000 +97045 -1.000000 +97046 -1.000000 +97047 -1.000000 +97048 -1.000000 +97049 -1.000000 +97050 -1.000000 +97051 -1.000000 +97052 -1.000000 +97053 -1.000000 +97054 -1.000000 +97055 -1.000000 +97059 -1.000000 +97060 -1.000000 +97061 -1.000000 +97062 -1.000000 +97063 -1.000000 +97064 -1.000000 +97070 -1.000000 +97072 -1.000000 +97073 -1.000000 +97074 -1.000000 +97075 -1.000000 +97077 -1.000000 +97078 -1.000000 +97079 -1.000000 +97080 -1.000000 +97082 -1.000000 +97083 -1.000000 +97084 -1.000000 +97085 -1.000000 +97086 -1.000000 +97087 -1.000000 +97088 -1.000000 +97089 -1.000000 +97091 -1.000000 +97092 -1.000000 +97093 -1.000000 +97095 -1.000000 +97096 -1.000000 +97097 -1.000000 +97105 -1.000000 +97124 -1.000000 +97125 -1.000000 +97126 -1.000000 +97128 -1.000000 +97129 -1.000000 +97130 -1.000000 +97132 -1.000000 +97133 -1.000000 +97134 -1.000000 +97158 -1.000000 +97159 -1.000000 +97160 -1.000000 +97162 -1.000000 +97163 -1.000000 +97164 -1.000000 +97166 -1.000000 +97167 -1.000000 +97169 -1.000000 +97171 -1.000000 +97172 -1.000000 +97173 -1.000000 +97175 -1.000000 +97176 -1.000000 +97177 -1.000000 +97179 -1.000000 +97180 -1.000000 +97181 -1.000000 +97183 -1.000000 +97191 -1.000000 +97192 -1.000000 +97193 -1.000000 +97195 -1.000000 +97196 -1.000000 +97197 -1.000000 +97198 -1.000000 +97199 -1.000000 +97200 -1.000000 +97201 -1.000000 +97202 -1.000000 +97208 -1.000000 +97209 -1.000000 +97210 -1.000000 +97212 -1.000000 +97213 -1.000000 +97214 -1.000000 +97217 -1.000000 +97218 -1.000000 +97219 -1.000000 +97221 -1.000000 +97222 -1.000000 +97223 -1.000000 +97225 -1.000000 +97226 -1.000000 +97227 -1.000000 +97229 -1.000000 +97230 -1.000000 +97231 -1.000000 +97233 -1.000000 +97234 -1.000000 +97235 -1.000000 +97237 -1.000000 +97238 -1.000000 +97239 -1.000000 +97241 -1.000000 +97242 -1.000000 +97244 -1.000000 +97246 -1.000000 +97247 -1.000000 +97248 -1.000000 +97250 -1.000000 +97251 -1.000000 +97252 -1.000000 +97254 -1.000000 +97255 -1.000000 +97256 -1.000000 +97258 -1.000000 +97273 -1.000000 +97274 -1.000000 +97275 -1.000000 +97277 -1.000000 +97278 -1.000000 +97284 -1.000000 +97285 -1.000000 +97286 -1.000000 +97288 -1.000000 +97289 -1.000000 +97290 -1.000000 +97292 -1.000000 +97293 -1.000000 +97294 -1.000000 +97296 -1.000000 +97297 -1.000000 +97298 -1.000000 +97300 -1.000000 +97301 -1.000000 +97302 -1.000000 +97304 -1.000000 +97305 -1.000000 +97306 -1.000000 +97308 -1.000000 +97309 -1.000000 +97310 -1.000000 +97312 -1.000000 +97313 -1.000000 +97314 -1.000000 +97316 -1.000000 +97317 -1.000000 +97318 -1.000000 +97319 -1.000000 +97320 -1.000000 +97321 -1.000000 +97322 -1.000000 +97323 -1.000000 +97324 -1.000000 +97325 -1.000000 +97326 -1.000000 +97327 -1.000000 +97328 -1.000000 +97329 -1.000000 +97330 -1.000000 +97331 -1.000000 +97332 -1.000000 +97333 -1.000000 +97334 -1.000000 +97335 -1.000000 +97336 -1.000000 +97337 -1.000000 +97338 -1.000000 +97339 -1.000000 +97340 -1.000000 +97341 -1.000000 +97342 -1.000000 +97343 -1.000000 +97344 -1.000000 +97345 -1.000000 +97346 -1.000000 +97347 -1.000000 +97348 -1.000000 +97349 -1.000000 +97350 -1.000000 +97351 -1.000000 +97352 -1.000000 +97353 -1.000000 +97354 -1.000000 +97355 -1.000000 +97356 -1.000000 +97357 -1.000000 +97358 -1.000000 +97359 -1.000000 +97360 -1.000000 +97361 -1.000000 +97362 -1.000000 +97363 -1.000000 +97364 -1.000000 +97365 -1.000000 +97366 -1.000000 +97367 -1.000000 +97373 -1.000000 +97374 -1.000000 +97375 -1.000000 +97376 -1.000000 +97377 -1.000000 +97378 -1.000000 +97379 -1.000000 +97380 -1.000000 +97381 -1.000000 +97382 -1.000000 +97383 -1.000000 +97384 -1.000000 +97385 -1.000000 +97386 -1.000000 +97387 -1.000000 +97388 -1.000000 +97389 -1.000000 +97390 -1.000000 +97391 -1.000000 +97392 -1.000000 +97393 -1.000000 +97394 -1.000000 +97395 -1.000000 +97396 -1.000000 +97397 -1.000000 +97398 -1.000000 +97399 -1.000000 +97400 -1.000000 +97401 -1.000000 +97402 -1.000000 +97403 -1.000000 +97404 -1.000000 +97405 -1.000000 +97406 -1.000000 +97407 -1.000000 +97408 -1.000000 +97409 -1.000000 +97410 -1.000000 +97411 -1.000000 +97412 -1.000000 +97413 -1.000000 +97414 -1.000000 +97415 -1.000000 +97416 -1.000000 +97418 -1.000000 +97419 -1.000000 +97420 -1.000000 +97421 -1.000000 +97422 -1.000000 +97423 -1.000000 +97424 -1.000000 +97425 -1.000000 +97426 -1.000000 +97427 -1.000000 +97428 -1.000000 +97429 -1.000000 +97430 -1.000000 +97431 -1.000000 +97432 -1.000000 +97433 -1.000000 +97434 -1.000000 +97435 -1.000000 +97436 -1.000000 +97437 -1.000000 +97438 -1.000000 +97439 -1.000000 +97440 -1.000000 +97441 -1.000000 +97443 -1.000000 +97444 -1.000000 +97445 -1.000000 +97446 -1.000000 +97447 -1.000000 +97448 -1.000000 +97449 -1.000000 +97450 -1.000000 +97451 -1.000000 +97452 -1.000000 +97453 -1.000000 +97454 -1.000000 +97455 -1.000000 +97456 -1.000000 +97457 -1.000000 +97458 -1.000000 +97459 -1.000000 +97460 -1.000000 +97461 -1.000000 +97462 -1.000000 +97463 -1.000000 +97464 -1.000000 +97465 -1.000000 +97466 -1.000000 +97467 -1.000000 +97468 -1.000000 +97469 -1.000000 +97470 -1.000000 +97471 -1.000000 +97472 -1.000000 +97473 -1.000000 +97474 -1.000000 +97475 -1.000000 +97476 -1.000000 +97477 -1.000000 +97478 -1.000000 +97479 -1.000000 +97480 -1.000000 +97481 -1.000000 +97482 -1.000000 +97483 -1.000000 +97484 -1.000000 +97485 -1.000000 +97486 -1.000000 +97487 -1.000000 +97488 -1.000000 +97489 -1.000000 +97490 -1.000000 +97491 -1.000000 +97492 -1.000000 +97493 -1.000000 +97494 -1.000000 +97495 -1.000000 +97496 -1.000000 +97497 -1.000000 +97498 -1.000000 +97499 -1.000000 +97500 -1.000000 +97501 -1.000000 +97502 -1.000000 +97503 -1.000000 +97504 -1.000000 +97505 -1.000000 +97506 -1.000000 +97507 -1.000000 +97508 -1.000000 +97509 -1.000000 +97510 -1.000000 +97511 -1.000000 +97512 -1.000000 +97513 -1.000000 +97514 -1.000000 +97515 -1.000000 +97516 -1.000000 +97517 -1.000000 +97518 -1.000000 +97519 -1.000000 +97520 -1.000000 +97521 -1.000000 +97522 -1.000000 +97523 -1.000000 +97524 -1.000000 +97525 -1.000000 +97526 -1.000000 +97527 -1.000000 +97528 -1.000000 +97529 -1.000000 +97530 -1.000000 +97531 -1.000000 +97532 -1.000000 +97533 -1.000000 +97534 -1.000000 +97535 -1.000000 +97536 -1.000000 +97537 -1.000000 +97538 -1.000000 +97539 -1.000000 +97540 -1.000000 +97541 -1.000000 +97542 -1.000000 +97543 -1.000000 +97544 -1.000000 +97545 -1.000000 +97546 -1.000000 +97547 -1.000000 +97548 -1.000000 +97549 -1.000000 +97550 -1.000000 +97551 -1.000000 +97552 -1.000000 +97553 -1.000000 +97554 -1.000000 +97555 -1.000000 +97556 -1.000000 +97557 -1.000000 +97558 -1.000000 +97559 -1.000000 +97560 -1.000000 +97561 -1.000000 +97562 -1.000000 +97563 -1.000000 +97564 -1.000000 +97565 -1.000000 +97566 -1.000000 +97567 -1.000000 +97568 -1.000000 +97569 -1.000000 +97570 -1.000000 +97571 -1.000000 +97572 -1.000000 +97573 -1.000000 +97574 -1.000000 +97575 -1.000000 +97576 -1.000000 +97577 -1.000000 +97578 -1.000000 +97579 -1.000000 +97580 -1.000000 +97581 -1.000000 +97582 -1.000000 +97583 -1.000000 +97584 -1.000000 +97585 -1.000000 +97586 -1.000000 +97587 -1.000000 +97588 -1.000000 +97589 -1.000000 +97590 -1.000000 +97591 -1.000000 +97592 -1.000000 +97593 -1.000000 +97594 -1.000000 +97595 -1.000000 +97596 -1.000000 +97597 -1.000000 +97598 -1.000000 +97599 -1.000000 +97600 -1.000000 +97601 -1.000000 +97602 -1.000000 +97603 -1.000000 +97604 -1.000000 +97605 -1.000000 +97606 -1.000000 +97607 -1.000000 +97608 -1.000000 +97609 -1.000000 +97610 -1.000000 +97611 -1.000000 +97612 -1.000000 +97613 -1.000000 +97614 -1.000000 +97615 -1.000000 +97616 -1.000000 +97617 -1.000000 +97618 -1.000000 +97619 -1.000000 +97620 -1.000000 +97621 -1.000000 +97622 -1.000000 +97623 -1.000000 +97624 -1.000000 +97625 -1.000000 +97626 -1.000000 +97627 -1.000000 +97628 -1.000000 +97629 -1.000000 +97630 -1.000000 +97631 -1.000000 +97632 -1.000000 +97633 -1.000000 +97634 -1.000000 +97635 -1.000000 +97636 -1.000000 +97637 -1.000000 +97638 -1.000000 +97639 -1.000000 +97640 -1.000000 +97641 -1.000000 +97642 -1.000000 +97643 -1.000000 +97644 -1.000000 +97645 -1.000000 +97646 -1.000000 +97647 -1.000000 +97648 -1.000000 +97649 -1.000000 +97650 -1.000000 +97651 -1.000000 +97652 -1.000000 +97653 -1.000000 +97654 -1.000000 +97655 -1.000000 +97656 -1.000000 +97657 -1.000000 +97658 -1.000000 +97659 -1.000000 +97660 -1.000000 +97661 -1.000000 +97662 -1.000000 +97663 -1.000000 +97664 -1.000000 +97665 -1.000000 +97666 -1.000000 +97667 -1.000000 +97668 -1.000000 +97669 -1.000000 +97670 -1.000000 +97671 -1.000000 +97672 -1.000000 +97673 -1.000000 +97680 -1.000000 +97681 -1.000000 +97682 -1.000000 +97686 -1.000000 +97688 -1.000000 +97689 -1.000000 +97690 -1.000000 +97691 -1.000000 +97692 -1.000000 +97693 -1.000000 +97694 -1.000000 +97695 -1.000000 +97696 -1.000000 +97697 -1.000000 +97698 -1.000000 +97699 -1.000000 +97702 -1.000000 +97703 -1.000000 +97705 -1.000000 +97706 -1.000000 +97707 -1.000000 +97708 -1.000000 +97709 -1.000000 +97710 -1.000000 +97711 -1.000000 +97712 -1.000000 +97713 -1.000000 +97714 -1.000000 +97715 -1.000000 +97716 -1.000000 +97717 -1.000000 +97718 -1.000000 +97719 -1.000000 +97720 -1.000000 +97723 -1.000000 +97724 -1.000000 +97725 -1.000000 +97726 -1.000000 +97727 -1.000000 +97728 -1.000000 +97729 -1.000000 +97730 -1.000000 +97731 -1.000000 +97732 -1.000000 +97733 -1.000000 +97734 -1.000000 +97735 -1.000000 +97736 -1.000000 +97737 -1.000000 +97738 -1.000000 +97739 -1.000000 +97740 -1.000000 +97741 -1.000000 +97742 -1.000000 +97743 -1.000000 +97744 -1.000000 +97745 -1.000000 +97746 -1.000000 +97747 -1.000000 +97748 -1.000000 +97749 -1.000000 +97763 -1.000000 +97764 -1.000000 +97765 -1.000000 +97766 -1.000000 +97767 -1.000000 +97768 -1.000000 +97769 -1.000000 +97770 -1.000000 +97771 -1.000000 +97772 -1.000000 +97773 -1.000000 +97774 -1.000000 +97775 -1.000000 +97776 -1.000000 +97777 -1.000000 +97778 -1.000000 +97781 -1.000000 +97782 -1.000000 +97783 -1.000000 +97784 -1.000000 +97785 -1.000000 +97786 -1.000000 +97787 -1.000000 +97788 -1.000000 +97789 -1.000000 +97790 -1.000000 +97791 -1.000000 +97792 -1.000000 +97793 -1.000000 +97794 -1.000000 +97795 -1.000000 +97796 -1.000000 +97797 -1.000000 +97798 -1.000000 +97799 -1.000000 +97800 -1.000000 +97801 -1.000000 +97802 -1.000000 +97803 -1.000000 +97804 -1.000000 +97805 -1.000000 +97806 -1.000000 +97809 -1.000000 +97810 -1.000000 +97811 -1.000000 +97812 -1.000000 +97813 -1.000000 +97814 -1.000000 +97815 -1.000000 +97816 -1.000000 +97817 -1.000000 +97818 -1.000000 +97819 -1.000000 +97820 -1.000000 +97821 -1.000000 +97822 -1.000000 +97823 -1.000000 +97824 -1.000000 +97825 -1.000000 +97826 -1.000000 +97827 -1.000000 +97828 -1.000000 +97829 -1.000000 +97830 -1.000000 +97831 -1.000000 +97832 -1.000000 +97833 -1.000000 +97835 -1.000000 +97836 -1.000000 +97837 -1.000000 +97838 -1.000000 +97841 -1.000000 +97842 -1.000000 +97843 -1.000000 +97844 -1.000000 +97845 -1.000000 +97846 -1.000000 +97847 -1.000000 +97848 -1.000000 +97849 -1.000000 +97850 -1.000000 +97851 -1.000000 +97852 -1.000000 +97853 -1.000000 +97854 -1.000000 +97855 -1.000000 +97856 -1.000000 +97857 -1.000000 +97858 -1.000000 +97859 -1.000000 +97860 -1.000000 +97861 -1.000000 +97862 -1.000000 +97863 -1.000000 +97872 -1.000000 +97873 -1.000000 +97874 -1.000000 +97875 -1.000000 +97876 -1.000000 +97877 -1.000000 +97878 -1.000000 +97879 -1.000000 +97880 -1.000000 +97881 -1.000000 +97882 -1.000000 +97883 -1.000000 +97885 -1.000000 +97886 -1.000000 +97887 -1.000000 +97888 -1.000000 +97889 -1.000000 +97890 -1.000000 +97891 -1.000000 +97892 -1.000000 +97893 -1.000000 +97894 -1.000000 +97895 -1.000000 +97896 -1.000000 +97897 -1.000000 +97898 -1.000000 +97899 -1.000000 +97900 -1.000000 +97901 -1.000000 +97902 -1.000000 +97903 -1.000000 +97915 -1.000000 +97916 -1.000000 +97917 -1.000000 +97918 -1.000000 +97919 -1.000000 +97920 -1.000000 +97921 -1.000000 +97922 -1.000000 +97923 -1.000000 +97924 -1.000000 +97925 -1.000000 +97926 -1.000000 +97927 -1.000000 +97928 -1.000000 +97929 -1.000000 +97930 -1.000000 +97931 -1.000000 +97932 -1.000000 +97933 -1.000000 +97934 -1.000000 +97935 -1.000000 +97936 -1.000000 +97937 -1.000000 +97938 -1.000000 +97939 -1.000000 +97940 -1.000000 +97941 -1.000000 +97942 -1.000000 +97943 -1.000000 +97944 -1.000000 +97947 -1.000000 +97948 -1.000000 +97949 -1.000000 +97950 -1.000000 +97951 -1.000000 +97952 -1.000000 +97953 -1.000000 +97954 -1.000000 +97955 -1.000000 +97956 -1.000000 +97957 -1.000000 +97958 -1.000000 +97959 -1.000000 +97960 -1.000000 +97961 -1.000000 +97962 -1.000000 +97963 -1.000000 +97964 -1.000000 +97965 -1.000000 +97966 -1.000000 +97967 -1.000000 +97968 -1.000000 +97969 -1.000000 +97970 -1.000000 +97971 -1.000000 +97972 -1.000000 +97973 -1.000000 +97974 -1.000000 +97975 -1.000000 +97976 -1.000000 +97977 -1.000000 +97978 -1.000000 +97979 -1.000000 +97980 -1.000000 +97983 -1.000000 +97984 -1.000000 +97985 -1.000000 +97986 -1.000000 +97987 -1.000000 +97988 -1.000000 +97989 -1.000000 +97990 -1.000000 +97991 -1.000000 +97992 -1.000000 +97993 -1.000000 +97994 -1.000000 +97995 -1.000000 +97996 -1.000000 +97997 -1.000000 +97998 -1.000000 +97999 -1.000000 +98000 -1.000000 +98001 -1.000000 +98002 -1.000000 +98003 -1.000000 +98004 -1.000000 +98005 -1.000000 +98006 -1.000000 +98007 -1.000000 +98008 -1.000000 +98009 -1.000000 +98010 -1.000000 +98011 -1.000000 +98012 -1.000000 +98013 -1.000000 +98014 -1.000000 +98015 -1.000000 +98016 -1.000000 +98024 -1.000000 +98025 -1.000000 +98026 -1.000000 +98027 -1.000000 +98028 -1.000000 +98029 -1.000000 +98030 -1.000000 +98031 -1.000000 +98032 -1.000000 +98033 -1.000000 +98034 -1.000000 +98035 -1.000000 +98036 -1.000000 +98037 -1.000000 +98038 -1.000000 +98039 -1.000000 +98040 -1.000000 +98041 -1.000000 +98042 -1.000000 +98043 -1.000000 +98044 -1.000000 +98045 -1.000000 +98046 -1.000000 +98047 -1.000000 +98048 -1.000000 +98049 -1.000000 +98050 -1.000000 +98051 -1.000000 +98052 -1.000000 +98053 -1.000000 +98054 -1.000000 +98055 -1.000000 +98078 -1.000000 +98079 -1.000000 +98080 -1.000000 +98081 -1.000000 +98082 -1.000000 +98083 -1.000000 +98084 -1.000000 +98085 -1.000000 +98086 -1.000000 +98087 -1.000000 +98088 -1.000000 +98089 -1.000000 +98090 -1.000000 +98091 -1.000000 +98092 -1.000000 +98093 -1.000000 +98094 -1.000000 +98095 -1.000000 +98096 -1.000000 +98097 -1.000000 +98098 -1.000000 +98099 -1.000000 +98100 -1.000000 +98105 -1.000000 +98106 -1.000000 +98107 -1.000000 +98108 -1.000000 +98109 -1.000000 +98110 -1.000000 +98111 -1.000000 +98112 -1.000000 +98113 -1.000000 +98114 -1.000000 +98115 -1.000000 +98116 -1.000000 +98117 -1.000000 +98118 -1.000000 +98119 -1.000000 +98120 -1.000000 +98121 -1.000000 +98122 -1.000000 +98124 -1.000000 +98125 -1.000000 +98126 -1.000000 +98127 -1.000000 +98128 -1.000000 +98129 -1.000000 +98130 -1.000000 +98131 -1.000000 +98132 -1.000000 +98177 -1.000000 +98178 -1.000000 +98179 -1.000000 +98180 -1.000000 +98181 -1.000000 +98182 -1.000000 +98183 -1.000000 +98184 -1.000000 +98185 -1.000000 +98186 -1.000000 +98187 -1.000000 +98188 -1.000000 +98189 -1.000000 +98190 -1.000000 +98191 -1.000000 +98192 -1.000000 +98193 -1.000000 +98194 -1.000000 +98195 -1.000000 +98196 -1.000000 +98197 -1.000000 +98198 -1.000000 +98199 -1.000000 +98200 -1.000000 +98201 -1.000000 +98202 -1.000000 +98203 -1.000000 +98204 -1.000000 +98205 -1.000000 +98206 -1.000000 +98207 -1.000000 +98208 -1.000000 +98209 -1.000000 +98210 -1.000000 +98211 -1.000000 +98212 -1.000000 +98213 -1.000000 +98214 -1.000000 +98215 -1.000000 +98216 -1.000000 +98217 -1.000000 +98218 -1.000000 +98219 -1.000000 +98220 -1.000000 +98221 -1.000000 +98222 -1.000000 +98223 -1.000000 +98224 -1.000000 +98225 -1.000000 +98226 -1.000000 +98227 -1.000000 +98228 -1.000000 +98229 -1.000000 +98230 -1.000000 +98231 -1.000000 +98245 -1.000000 +98246 -1.000000 +98252 -1.000000 +98253 -1.000000 +98254 -1.000000 +98255 -1.000000 +98256 -1.000000 +98257 -1.000000 +98258 -1.000000 +98259 -1.000000 +98260 -1.000000 +98261 -1.000000 +98262 -1.000000 +98263 -1.000000 +98264 -1.000000 +98265 -1.000000 +98266 -1.000000 +98267 -1.000000 +98268 -1.000000 +98269 -1.000000 +98270 -1.000000 +98271 -1.000000 +98272 -1.000000 +98273 -1.000000 +98274 -1.000000 +98275 -1.000000 +98276 -1.000000 +98277 -1.000000 +98278 -1.000000 +98281 -1.000000 +98282 -1.000000 +98283 -1.000000 +98284 -1.000000 +98285 -1.000000 +98286 -1.000000 +98287 -1.000000 +98288 -1.000000 +98289 -1.000000 +98290 -1.000000 +98291 -1.000000 +98292 -1.000000 +98293 -1.000000 +98294 -1.000000 +98295 -1.000000 +98296 -1.000000 +98297 -1.000000 +98298 -1.000000 +98299 -1.000000 +98300 -1.000000 +98301 -1.000000 +98302 -1.000000 +98303 -1.000000 +98305 -1.000000 +98306 -1.000000 +98307 -1.000000 +98308 -1.000000 +98309 -1.000000 +98310 -1.000000 +98311 -1.000000 +98312 -1.000000 +98313 -1.000000 +98314 -1.000000 +98315 -1.000000 +98316 -1.000000 +98317 -1.000000 +98318 -1.000000 +98319 -1.000000 +98320 -1.000000 +98321 -1.000000 +98322 -1.000000 +98323 -1.000000 +98324 -1.000000 +98325 -1.000000 +98326 -1.000000 +98327 -1.000000 +98328 -1.000000 +98329 -1.000000 +98330 -1.000000 +98331 -1.000000 +98332 -1.000000 +98333 -1.000000 +98334 -1.000000 +98335 -1.000000 +98336 -1.000000 +98337 -1.000000 +98338 -1.000000 +98339 -1.000000 +98340 -1.000000 +98341 -1.000000 +98342 -1.000000 +98343 -1.000000 +98344 -1.000000 +98345 -1.000000 +98346 -1.000000 +98347 -1.000000 +98348 -1.000000 +98349 -1.000000 +98350 -1.000000 +98351 -1.000000 +98352 -1.000000 +98353 -1.000000 +98354 -1.000000 +98355 -1.000000 +98356 -1.000000 +98357 -1.000000 +98358 -1.000000 +98359 -1.000000 +98360 -1.000000 +98361 -1.000000 +98362 -1.000000 +98363 -1.000000 +98364 -1.000000 +98365 -1.000000 +98366 -1.000000 +98367 -1.000000 +98368 -1.000000 +98369 -1.000000 +98370 -1.000000 +98371 -1.000000 +98372 -1.000000 +98373 -1.000000 +98374 -1.000000 +98375 -1.000000 +98376 -1.000000 +98377 -1.000000 +98378 -1.000000 +98379 -1.000000 +98380 -1.000000 +98381 -1.000000 +98384 -1.000000 +98385 -1.000000 +98386 -1.000000 +98387 -1.000000 +98388 -1.000000 +98389 -1.000000 +98390 -1.000000 +98391 -1.000000 +98392 -1.000000 +98393 -1.000000 +98394 -1.000000 +98395 -1.000000 +98396 -1.000000 +98397 -1.000000 +98398 -1.000000 +98399 -1.000000 +98400 -1.000000 +98401 -1.000000 +98402 -1.000000 +98403 -1.000000 +98404 -1.000000 +98405 -1.000000 +98406 -1.000000 +98407 -1.000000 +98408 -1.000000 +98409 -1.000000 +98410 -1.000000 +98411 -1.000000 +98412 -1.000000 +98414 -1.000000 +98415 -1.000000 +98416 -1.000000 +98417 -1.000000 +98418 -1.000000 +98419 -1.000000 +98420 -1.000000 +98421 -1.000000 +98422 -1.000000 +98423 -1.000000 +98424 -1.000000 +98425 -1.000000 +98426 -1.000000 +98427 -1.000000 +98428 -1.000000 +98429 -1.000000 +98430 -1.000000 +98431 -1.000000 +98432 -1.000000 +98433 -1.000000 +98434 -1.000000 +98435 -1.000000 +98436 -1.000000 +98437 -1.000000 +98438 -1.000000 +98439 -1.000000 +98440 -1.000000 +98441 -1.000000 +98442 -1.000000 +98443 -1.000000 +98444 -1.000000 +98445 -1.000000 +98446 -1.000000 +98447 -1.000000 +98448 -1.000000 +98449 -1.000000 +98450 -1.000000 +98451 -1.000000 +98452 -1.000000 +98453 -1.000000 +98454 -1.000000 +98455 -1.000000 +98456 -1.000000 +98457 -1.000000 +98458 -1.000000 +98459 -1.000000 +98460 -1.000000 +98461 -1.000000 +98462 -1.000000 +98463 -1.000000 +98464 -1.000000 +98465 -1.000000 +98466 -1.000000 +98467 -1.000000 +98468 -1.000000 +98469 -1.000000 +98470 -1.000000 +98471 -1.000000 +98472 -1.000000 +98473 -1.000000 +98474 -1.000000 +98475 -1.000000 +98476 -1.000000 +98477 -1.000000 +98478 -1.000000 +98479 -1.000000 +98480 -1.000000 +98481 -1.000000 +98482 -1.000000 +98489 -1.000000 +98490 -1.000000 +98491 -1.000000 +98492 -1.000000 +98493 -1.000000 +98494 -1.000000 +98495 -1.000000 +98496 -1.000000 +98497 -1.000000 +98498 -1.000000 +98499 -1.000000 +98500 -1.000000 +98501 -1.000000 +98503 -1.000000 +98504 -1.000000 +98505 -1.000000 +98506 -1.000000 +98507 -1.000000 +98508 -1.000000 +98509 -1.000000 +98510 -1.000000 +98511 -1.000000 +98512 -1.000000 +98513 -1.000000 +98514 -1.000000 +98515 -1.000000 +98516 -1.000000 +98517 -1.000000 +98518 -1.000000 +98519 -1.000000 +98520 -1.000000 +98521 -1.000000 +98522 -1.000000 +98523 -1.000000 +98524 -1.000000 +98525 -1.000000 +98526 -1.000000 +98529 -1.000000 +98530 -1.000000 +98531 -1.000000 +98532 -1.000000 +98533 -1.000000 +98534 -1.000000 +98535 -1.000000 +98536 -1.000000 +98537 -1.000000 +98538 -1.000000 +98539 -1.000000 +98540 -1.000000 +98541 -1.000000 +98542 -1.000000 +98543 -1.000000 +98545 -1.000000 +98546 -1.000000 +98547 -1.000000 +98548 -1.000000 +98549 -1.000000 +98550 -1.000000 +98551 -1.000000 +98552 -1.000000 +98553 -1.000000 +98554 -1.000000 +98555 -1.000000 +98556 -1.000000 +98557 -1.000000 +98558 -1.000000 +98559 -1.000000 +98560 -1.000000 +98561 -1.000000 +98562 -1.000000 +98563 -1.000000 +98564 -1.000000 +98565 -1.000000 +98566 -1.000000 +98567 -1.000000 +98568 -1.000000 +98569 -1.000000 +98570 -1.000000 +98571 -1.000000 +98572 -1.000000 +98573 -1.000000 +98574 -1.000000 +98575 -1.000000 +98576 -1.000000 +98577 -1.000000 +98578 -1.000000 +98579 -1.000000 +98580 -1.000000 +98584 -1.000000 +98585 -1.000000 +98586 -1.000000 +98587 -1.000000 +98588 -1.000000 +98589 -1.000000 +98590 -1.000000 +98591 -1.000000 +98592 -1.000000 +98593 -1.000000 +98594 -1.000000 +98595 -1.000000 +98596 -1.000000 +98597 -1.000000 +98598 -1.000000 +98599 -1.000000 +98600 -1.000000 +98601 -1.000000 +98602 -1.000000 +98603 -1.000000 +98604 -1.000000 +98605 -1.000000 +98606 -1.000000 +98607 -1.000000 +98608 -1.000000 +98609 -1.000000 +98610 -1.000000 +98611 -1.000000 +98660 -1.000000 +98661 -1.000000 +98662 -1.000000 +98663 -1.000000 +98664 -1.000000 +98665 -1.000000 +98666 -1.000000 +98667 -1.000000 +98668 -1.000000 +98669 -1.000000 +98670 -1.000000 +98671 -1.000000 +98672 -1.000000 +98673 -1.000000 +98674 -1.000000 +98675 -1.000000 +98676 -1.000000 +98677 -1.000000 +98678 -1.000000 +98679 -1.000000 +98680 -1.000000 +98681 -1.000000 +98682 -1.000000 +98683 -1.000000 +98684 -1.000000 +98685 -1.000000 +98686 -1.000000 +98687 -1.000000 +98688 -1.000000 +98689 -1.000000 +98690 -1.000000 +98691 -1.000000 +98692 -1.000000 +98693 -1.000000 +98694 -1.000000 +98695 -1.000000 +98696 -1.000000 +98697 -1.000000 +98698 -1.000000 +98699 -1.000000 +98700 -1.000000 +98701 -1.000000 +98702 -1.000000 +98703 -1.000000 +98704 -1.000000 +98705 -1.000000 +98706 -1.000000 +98707 -1.000000 +98708 -1.000000 +98709 -1.000000 +98710 -1.000000 +98711 -1.000000 +98712 -1.000000 +98713 -1.000000 +98714 -1.000000 +98715 -1.000000 +98716 -1.000000 +98717 -1.000000 +98719 -1.000000 +98720 -1.000000 +98721 -1.000000 +98722 -1.000000 +98723 -1.000000 +98724 -1.000000 +98725 -1.000000 +98726 -1.000000 +98727 -1.000000 +98728 -1.000000 +98729 -1.000000 +98730 -1.000000 +98731 -1.000000 +98732 -1.000000 +98733 -1.000000 +98734 -1.000000 +98735 -1.000000 +98736 -1.000000 +98737 -1.000000 +98738 -1.000000 +98740 -1.000000 +98741 -1.000000 +98742 -1.000000 +98743 -1.000000 +98744 -1.000000 +98745 -1.000000 +98746 -1.000000 +98747 -1.000000 +98748 -1.000000 +98749 -1.000000 +98750 -1.000000 +98751 -1.000000 +98752 -1.000000 +98753 -1.000000 +98754 -1.000000 +98755 -1.000000 +98756 -1.000000 +98757 -1.000000 +98758 -1.000000 +98759 -1.000000 +98760 -1.000000 +98761 -1.000000 +98762 -1.000000 +98765 -1.000000 +98766 -1.000000 +98767 -1.000000 +98768 -1.000000 +98769 -1.000000 +98770 -1.000000 +98771 -1.000000 +98772 -1.000000 +98773 -1.000000 +98774 -1.000000 +98775 -1.000000 +98776 -1.000000 +98777 -1.000000 +98778 -1.000000 +98779 -1.000000 +98780 -1.000000 +98781 -1.000000 +98782 -1.000000 +98783 -1.000000 +98784 -1.000000 +98785 -1.000000 +98786 -1.000000 +98787 -1.000000 +98788 -1.000000 +98789 -1.000000 +98790 -1.000000 +98791 -1.000000 +98792 -1.000000 +98793 -1.000000 +98794 -1.000000 +98795 -1.000000 +98796 -1.000000 +98799 -1.000000 +98800 -1.000000 +98801 -1.000000 +98802 -1.000000 +98803 -1.000000 +98804 -1.000000 +98805 -1.000000 +98806 -1.000000 +98807 -1.000000 +98808 -1.000000 +98809 -1.000000 +98810 -1.000000 +98811 -1.000000 +98812 -1.000000 +98813 -1.000000 +98814 -1.000000 +98815 -1.000000 +98816 -1.000000 +98817 -1.000000 +98818 -1.000000 +98819 -1.000000 +98820 -1.000000 +98821 -1.000000 +98822 -1.000000 +98823 -1.000000 +98824 -1.000000 +98825 -1.000000 +98829 -1.000000 +98830 -1.000000 +98831 -1.000000 +98832 -1.000000 +98833 -1.000000 +98834 -1.000000 +98835 -1.000000 +98836 -1.000000 +98837 -1.000000 +98838 -1.000000 +98839 -1.000000 +98840 -1.000000 +98841 -1.000000 +98842 -1.000000 +98843 -1.000000 +98844 -1.000000 +98845 -1.000000 +98846 -1.000000 +98847 -1.000000 +98848 -1.000000 +98849 -1.000000 +98850 -1.000000 +98851 -1.000000 +98852 -1.000000 +98853 -1.000000 +98854 -1.000000 +98855 -1.000000 +98856 -1.000000 +98857 -1.000000 +98859 -1.000000 +98860 -1.000000 +98861 -1.000000 +98862 -1.000000 +98863 -1.000000 +98864 -1.000000 +98865 -1.000000 +98866 -1.000000 +98867 -1.000000 +98868 -1.000000 +98869 -1.000000 +98870 -1.000000 +98871 -1.000000 +98872 -1.000000 +98873 -1.000000 +98874 -1.000000 +98875 -1.000000 +98876 -1.000000 +98877 -1.000000 +98878 -1.000000 +98879 -1.000000 +98880 -1.000000 +98881 -1.000000 +98882 -1.000000 +98883 -1.000000 +98884 -1.000000 +98885 -1.000000 +98886 -1.000000 +98887 -1.000000 +98888 -1.000000 +98889 -1.000000 +98890 -1.000000 +98891 -1.000000 +98892 -1.000000 +98893 -1.000000 +98895 -1.000000 +98896 -1.000000 +98897 -1.000000 +98898 -1.000000 +98899 -1.000000 +98900 -1.000000 +98901 -1.000000 +98902 -1.000000 +98903 -1.000000 +98904 -1.000000 +98905 -1.000000 +98906 -1.000000 +98907 -1.000000 +98908 -1.000000 +98909 -1.000000 +98910 -1.000000 +98911 -1.000000 +98912 -1.000000 +98913 -1.000000 +98914 -1.000000 +98915 -1.000000 +98916 -1.000000 +98917 -1.000000 +98918 -1.000000 +98919 -1.000000 +98920 -1.000000 +98921 -1.000000 +98922 -1.000000 +98923 -1.000000 +98924 -1.000000 +98925 -1.000000 +98926 -1.000000 +98927 -1.000000 +98928 -1.000000 +98929 -1.000000 +98955 -1.000000 +98956 -1.000000 +98957 -1.000000 +98958 -1.000000 +98959 -1.000000 +98960 -1.000000 +98961 -1.000000 +98962 -1.000000 +98963 -1.000000 +98964 -1.000000 +98965 -1.000000 +98966 -1.000000 +98967 -1.000000 +98968 -1.000000 +98969 -1.000000 +98970 -1.000000 +98971 -1.000000 +98972 -1.000000 +98973 -1.000000 +98974 -1.000000 +98975 -1.000000 +98976 -1.000000 +98977 -1.000000 +98978 -1.000000 +98979 -1.000000 +98980 -1.000000 +98981 -1.000000 +98982 -1.000000 +98983 -1.000000 +98984 -1.000000 +98985 -1.000000 +98986 -1.000000 +98989 -1.000000 +98990 -1.000000 +98991 -1.000000 +98992 -1.000000 +98993 -1.000000 +98994 -1.000000 +98995 -1.000000 +98996 -1.000000 +98997 -1.000000 +98998 -1.000000 +98999 -1.000000 +99000 -1.000000 +99001 -1.000000 +99002 -1.000000 +99003 -1.000000 +99004 -1.000000 +99005 -1.000000 +99006 -1.000000 +99007 -1.000000 +99008 -1.000000 +99009 -1.000000 +99010 -1.000000 +99011 -1.000000 +99012 -1.000000 +99013 -1.000000 +99014 -1.000000 +99015 -1.000000 +99016 -1.000000 +99017 -1.000000 +99018 -1.000000 +99019 -1.000000 +99020 -1.000000 +99021 -1.000000 +99022 -1.000000 +99023 -1.000000 +99024 -1.000000 +99025 -1.000000 +99026 -1.000000 +99027 -1.000000 +99028 -1.000000 +99030 -1.000000 +99031 -1.000000 +99032 -1.000000 +99033 -1.000000 +99034 -1.000000 +99035 -1.000000 +99036 -1.000000 +99037 -1.000000 +99038 -1.000000 +99039 -1.000000 +99040 -1.000000 +99041 -1.000000 +99042 -1.000000 +99043 -1.000000 +99044 -1.000000 +99045 -1.000000 +99046 -1.000000 +99047 -1.000000 +99048 -1.000000 +99049 -1.000000 +99050 -1.000000 +99051 -1.000000 +99052 -1.000000 +99053 -1.000000 +99054 -1.000000 +99055 -1.000000 +99056 -1.000000 +99057 -1.000000 +99058 -1.000000 +99059 -1.000000 +99060 -1.000000 +99061 -1.000000 +99062 -1.000000 +99063 -1.000000 +99066 -1.000000 +99067 -1.000000 +99068 -1.000000 +99069 -1.000000 +99070 -1.000000 +99071 -1.000000 +99072 -1.000000 +99073 -1.000000 +99074 -1.000000 +99075 -1.000000 +99076 -1.000000 +99077 -1.000000 +99078 -1.000000 +99079 -1.000000 +99080 -1.000000 +99081 -1.000000 +99082 -1.000000 +99083 -1.000000 +99084 -1.000000 +99085 -1.000000 +99086 -1.000000 +99087 -1.000000 +99088 -1.000000 +99089 -1.000000 +99090 -1.000000 +99091 -1.000000 +99092 -1.000000 +99093 -1.000000 +99094 -1.000000 +99095 -1.000000 +99098 -1.000000 +99099 -1.000000 +99100 -1.000000 +99101 -1.000000 +99102 -1.000000 +99103 -1.000000 +99104 -1.000000 +99105 -1.000000 +99106 -1.000000 +99107 -1.000000 +99108 -1.000000 +99109 -1.000000 +99110 -1.000000 +99111 -1.000000 +99112 -1.000000 +99113 -1.000000 +99114 -1.000000 +99115 -1.000000 +99116 -1.000000 +99117 -1.000000 +99118 -1.000000 +99119 -1.000000 +99120 -1.000000 +99121 -1.000000 +99122 -1.000000 +99123 -1.000000 +99124 -1.000000 +99125 -1.000000 +99127 -1.000000 +99128 -1.000000 +99129 -1.000000 +99130 -1.000000 +99131 -1.000000 +99132 -1.000000 +99133 -1.000000 +99134 -1.000000 +99135 -1.000000 +99136 -1.000000 +99137 -1.000000 +99138 -1.000000 +99139 -1.000000 +99140 -1.000000 +99141 -1.000000 +99142 -1.000000 +99143 -1.000000 +99144 -1.000000 +99145 -1.000000 +99146 -1.000000 +99147 -1.000000 +99148 -1.000000 +99149 -1.000000 +99150 -1.000000 +99151 -1.000000 +99152 -1.000000 +99153 -1.000000 +99154 -1.000000 +99155 -1.000000 +99156 -1.000000 +99158 -1.000000 +99159 -1.000000 +99160 -1.000000 +99161 -1.000000 +99162 -1.000000 +99163 -1.000000 +99164 -1.000000 +99165 -1.000000 +99166 -1.000000 +99167 -1.000000 +99168 -1.000000 +99169 -1.000000 +99170 -1.000000 +99171 -1.000000 +99172 -1.000000 +99173 -1.000000 +99174 -1.000000 +99175 -1.000000 +99176 -1.000000 +99177 -1.000000 +99178 -1.000000 +99179 -1.000000 +99180 -1.000000 +99181 -1.000000 +99182 -1.000000 +99183 -1.000000 +99184 -1.000000 +99185 -1.000000 +99187 -1.000000 +99188 -1.000000 +99189 -1.000000 +99190 -1.000000 +99191 -1.000000 +99192 -1.000000 +99193 -1.000000 +99194 -1.000000 +99195 -1.000000 +99196 -1.000000 +99197 -1.000000 +99198 -1.000000 +99199 -1.000000 +99200 -1.000000 +99201 -1.000000 +99202 -1.000000 +99203 -1.000000 +99204 -1.000000 +99205 -1.000000 +99206 -1.000000 +99207 -1.000000 +99208 -1.000000 +99209 -1.000000 +99210 -1.000000 +99211 -1.000000 +99212 -1.000000 +99213 -1.000000 +99214 -1.000000 +99215 -1.000000 +99216 -1.000000 +99217 -1.000000 +99218 -1.000000 +99219 -1.000000 +99220 -1.000000 +99224 -1.000000 +99225 -1.000000 +99226 -1.000000 +99227 -1.000000 +99228 -1.000000 +99229 -1.000000 +99230 -1.000000 +99231 -1.000000 +99232 -1.000000 +99233 -1.000000 +99234 -1.000000 +99235 -1.000000 +99236 -1.000000 +99237 -1.000000 +99238 -1.000000 +99239 -1.000000 +99240 -1.000000 +99241 -1.000000 +99242 -1.000000 +99243 -1.000000 +99244 -1.000000 +99245 -1.000000 +99246 -1.000000 +99247 -1.000000 +99248 -1.000000 +99249 -1.000000 +99250 -1.000000 +99251 -1.000000 +99252 -1.000000 +99253 -1.000000 +99254 -1.000000 +99255 -1.000000 +99256 -1.000000 +99257 -1.000000 +99258 -1.000000 +99259 -1.000000 +99260 -1.000000 +99261 -1.000000 +99262 -1.000000 +99263 -1.000000 +99264 -1.000000 +99265 -1.000000 +99266 -1.000000 +99267 -1.000000 +99268 -1.000000 +99304 -1.000000 +99305 -1.000000 +99306 -1.000000 +99307 -1.000000 +99308 -1.000000 +99309 -1.000000 +99310 -1.000000 +99311 -1.000000 +99312 -1.000000 +99313 -1.000000 +99314 -1.000000 +99315 -1.000000 +99316 -1.000000 +99317 -1.000000 +99318 -1.000000 +99319 -1.000000 +99320 -1.000000 +99328 -1.000000 +99329 -1.000000 +99330 -1.000000 +99331 -1.000000 +99332 -1.000000 +99333 -1.000000 +99334 -1.000000 +99335 -1.000000 +99336 -1.000000 +99337 -1.000000 +99338 -1.000000 +99339 -1.000000 +99340 -1.000000 +99341 -1.000000 +99342 -1.000000 +99343 -1.000000 +99344 -1.000000 +99345 -1.000000 +99346 -1.000000 +99347 -1.000000 +99348 -1.000000 +99349 -1.000000 +99350 -1.000000 +99351 -1.000000 +99352 -1.000000 +99353 -1.000000 +99354 -1.000000 +99355 -1.000000 +99356 -1.000000 +99357 -1.000000 +99359 -1.000000 +99360 -1.000000 +99361 -1.000000 +99362 -1.000000 +99363 -1.000000 +99364 -1.000000 +99365 -1.000000 +99366 -1.000000 +99367 -1.000000 +99368 -1.000000 +99369 -1.000000 +99370 -1.000000 +99371 -1.000000 +99372 -1.000000 +99373 -1.000000 +99374 -1.000000 +99375 -1.000000 +99376 -1.000000 +99377 -1.000000 +99378 -1.000000 +99379 -1.000000 +99380 -1.000000 +99382 -1.000000 +99383 -1.000000 +99384 -1.000000 +99385 -1.000000 +99386 -1.000000 +99387 -1.000000 +99388 -1.000000 +99389 -1.000000 +99390 -1.000000 +99391 -1.000000 +99392 -1.000000 +99393 -1.000000 +99394 -1.000000 +99395 -1.000000 +99396 -1.000000 +99397 -1.000000 +99398 -1.000000 +99399 -1.000000 +99400 -1.000000 +99401 -1.000000 +99402 -1.000000 +99403 -1.000000 +99404 -1.000000 +99405 -1.000000 +99406 -1.000000 +99407 -1.000000 +99408 -1.000000 +99409 -1.000000 +99410 -1.000000 +99411 -1.000000 +99414 -1.000000 +99415 -1.000000 +99416 -1.000000 +99417 -1.000000 +99418 -1.000000 +99419 -1.000000 +99420 -1.000000 +99421 -1.000000 +99422 -1.000000 +99423 -1.000000 +99424 -1.000000 +99425 -1.000000 +99426 -1.000000 +99427 -1.000000 +99428 -1.000000 +99429 -1.000000 +99430 -1.000000 +99431 -1.000000 +99432 -1.000000 +99433 -1.000000 +99434 -1.000000 +99435 -1.000000 +99436 -1.000000 +99437 -1.000000 +99438 -1.000000 +99439 -1.000000 +99440 -1.000000 +99441 -1.000000 +99442 -1.000000 +99443 -1.000000 +99444 -1.000000 +99445 -1.000000 +99446 -1.000000 +99447 -1.000000 +99448 -1.000000 +99449 -1.000000 +99450 -1.000000 +99458 -1.000000 +99459 -1.000000 +99460 -1.000000 +99461 -1.000000 +99462 -1.000000 +99463 -1.000000 +99464 -1.000000 +99465 -1.000000 +99466 -1.000000 +99467 -1.000000 +99468 -1.000000 +99469 -1.000000 +99470 -1.000000 +99471 -1.000000 +99472 -1.000000 +99473 -1.000000 +99474 -1.000000 +99475 -1.000000 +99476 -1.000000 +99477 -1.000000 +99478 -1.000000 +99479 -1.000000 +99480 -1.000000 +99481 -1.000000 +99482 -1.000000 +99483 -1.000000 +99484 -1.000000 +99485 -1.000000 +99486 -1.000000 +99487 -1.000000 +99488 -1.000000 +99489 -1.000000 +99493 -1.000000 +99494 -1.000000 +99495 -1.000000 +99496 -1.000000 +99497 -1.000000 +99498 -1.000000 +99499 -1.000000 +99500 -1.000000 +99501 -1.000000 +99502 -1.000000 +99503 -1.000000 +99504 -1.000000 +99505 -1.000000 +99506 -1.000000 +99507 -1.000000 +99508 -1.000000 +99509 -1.000000 +99510 -1.000000 +99511 -1.000000 +99512 -1.000000 +99513 -1.000000 +99514 -1.000000 +99515 -1.000000 +99516 -1.000000 +99517 -1.000000 +99518 -1.000000 +99519 -1.000000 +99520 -1.000000 +99521 -1.000000 +99522 -1.000000 +99523 -1.000000 +99524 -1.000000 +99526 -1.000000 +99527 -1.000000 +99528 -1.000000 +99529 -1.000000 +99530 -1.000000 +99531 -1.000000 +99532 -1.000000 +99533 -1.000000 +99534 -1.000000 +99535 -1.000000 +99536 -1.000000 +99537 -1.000000 +99538 -1.000000 +99539 -1.000000 +99540 -1.000000 +99541 -1.000000 +99542 -1.000000 +99543 -1.000000 +99545 -1.000000 +99546 -1.000000 +99547 -1.000000 +99548 -1.000000 +99549 -1.000000 +99550 -1.000000 +99551 -1.000000 +99552 -1.000000 +99553 -1.000000 +99554 -1.000000 +99555 -1.000000 +99556 -1.000000 +99557 -1.000000 +99558 -1.000000 +99559 -1.000000 +99560 -1.000000 +99561 -1.000000 +99562 -1.000000 +99563 -1.000000 +99564 -1.000000 +99565 -1.000000 +99566 -1.000000 +99567 -1.000000 +99568 -1.000000 +99569 -1.000000 +99570 -1.000000 +99571 -1.000000 +99572 -1.000000 +99573 -1.000000 +99574 -1.000000 +99575 -1.000000 +99576 -1.000000 +99577 -1.000000 +99578 -1.000000 +99579 -1.000000 +99580 -1.000000 +99581 -1.000000 +99582 -1.000000 +99609 -1.000000 +99610 -1.000000 +99611 -1.000000 +99612 -1.000000 +99613 -1.000000 +99614 -1.000000 +99635 -1.000000 +99636 -1.000000 +99637 -1.000000 +99638 -1.000000 +99639 -1.000000 +99640 -1.000000 +99641 -1.000000 +99642 -1.000000 +99643 -1.000000 +99644 -1.000000 +99645 -1.000000 +99646 -1.000000 +99647 -1.000000 +99648 -1.000000 +99649 -1.000000 +99650 -1.000000 +99651 -1.000000 +99652 -1.000000 +99653 -1.000000 +99654 -1.000000 +99655 -1.000000 +99656 -1.000000 +99657 -1.000000 +99658 -1.000000 +99659 -1.000000 +99660 -1.000000 +99661 -1.000000 +99664 -1.000000 +99665 -1.000000 +99666 -1.000000 +99667 -1.000000 +99668 -1.000000 +99671 -1.000000 +99672 -1.000000 +99673 -1.000000 +99674 -1.000000 +99675 -1.000000 +99676 -1.000000 +99677 -1.000000 +99678 -1.000000 +99679 -1.000000 +99680 -1.000000 +99681 -1.000000 +99682 -1.000000 +99683 -1.000000 +99684 -1.000000 +99685 -1.000000 +99686 -1.000000 +99687 -1.000000 +99688 -1.000000 +99689 -1.000000 +99690 -1.000000 +99691 -1.000000 +99692 -1.000000 +99693 -1.000000 +99694 -1.000000 +99695 -1.000000 +99696 -1.000000 +99697 -1.000000 +99698 -1.000000 +99699 -1.000000 +99701 -1.000000 +99702 -1.000000 +99703 -1.000000 +99704 -1.000000 +99705 -1.000000 +99706 -1.000000 +99707 -1.000000 +99708 -1.000000 +99709 -1.000000 +99710 -1.000000 +99711 -1.000000 +99712 -1.000000 +99713 -1.000000 +99714 -1.000000 +99715 -1.000000 +99716 -1.000000 +99717 -1.000000 +99718 -1.000000 +99719 -1.000000 +99720 -1.000000 +99721 -1.000000 +99722 -1.000000 +99723 -1.000000 +99724 -1.000000 +99725 -1.000000 +99726 -1.000000 +99727 -1.000000 +99728 -1.000000 +99729 -1.000000 +99730 -1.000000 +99732 -1.000000 +99733 -1.000000 +99734 -1.000000 +99735 -1.000000 +99736 -1.000000 +99737 -1.000000 +99738 -1.000000 +99739 -1.000000 +99740 -1.000000 +99741 -1.000000 +99742 -1.000000 +99743 -1.000000 +99744 -1.000000 +99745 -1.000000 +99746 -1.000000 +99747 -1.000000 +99748 -1.000000 +99749 -1.000000 +99750 -1.000000 +99751 -1.000000 +99752 -1.000000 +99753 -1.000000 +99754 -1.000000 +99755 -1.000000 +99756 -1.000000 +99757 -1.000000 +99758 -1.000000 +99759 -1.000000 +99760 -1.000000 +99761 -1.000000 +99762 -1.000000 +99763 -1.000000 +99765 -1.000000 +99766 -1.000000 +99767 -1.000000 +99768 -1.000000 +99769 -1.000000 +99770 -1.000000 +99771 -1.000000 +99772 -1.000000 +99773 -1.000000 +99774 -1.000000 +99775 -1.000000 +99776 -1.000000 +99777 -1.000000 +99778 -1.000000 +99779 -1.000000 +99780 -1.000000 +99781 -1.000000 +99782 -1.000000 +99783 -1.000000 +99784 -1.000000 +99785 -1.000000 +99786 -1.000000 +99787 -1.000000 +99788 -1.000000 +99789 -1.000000 +99790 -1.000000 +99791 -1.000000 +99792 -1.000000 +99793 -1.000000 +99794 -1.000000 +99795 -1.000000 +99797 -1.000000 +99798 -1.000000 +99799 -1.000000 +99800 -1.000000 +99801 -1.000000 +99802 -1.000000 +99803 -1.000000 +99804 -1.000000 +99805 -1.000000 +99806 -1.000000 +99807 -1.000000 +99808 -1.000000 +99809 -1.000000 +99810 -1.000000 +99811 -1.000000 +99812 -1.000000 +99813 -1.000000 +99814 -1.000000 +99815 -1.000000 +99816 -1.000000 +99817 -1.000000 +99818 -1.000000 +99819 -1.000000 +99820 -1.000000 +99821 -1.000000 +99822 -1.000000 +99823 -1.000000 +99824 -1.000000 +99825 -1.000000 +99826 -1.000000 +99827 -1.000000 +99828 -1.000000 +99829 -1.000000 +99830 -1.000000 +99831 -1.000000 +99832 -1.000000 +99833 -1.000000 +99835 -1.000000 +99836 -1.000000 +99837 -1.000000 +99838 -1.000000 +99839 -1.000000 +99840 -1.000000 +99841 -1.000000 +99842 -1.000000 +99843 -1.000000 +99844 -1.000000 +99845 -1.000000 +99846 -1.000000 +99847 -1.000000 +99848 -1.000000 +99849 -1.000000 +99850 -1.000000 +99851 -1.000000 +99852 -1.000000 +99853 -1.000000 +99854 -1.000000 +99855 -1.000000 +99856 -1.000000 +99857 -1.000000 +99858 -1.000000 +99859 -1.000000 +99860 -1.000000 +99863 -1.000000 +99864 -1.000000 +99865 -1.000000 +99866 -1.000000 +99867 -1.000000 +99868 -1.000000 +99869 -1.000000 +99870 -1.000000 +99871 -1.000000 +99872 -1.000000 +99873 -1.000000 +99874 -1.000000 +99875 -1.000000 +99876 -1.000000 +99877 -1.000000 +99878 -1.000000 +99879 -1.000000 +99880 -1.000000 +99881 -1.000000 +99882 -1.000000 +99883 -1.000000 +99884 -1.000000 +99885 -1.000000 +99988 -1.000000 +99989 -1.000000 +99990 -1.000000 +99991 -1.000000 +99992 -1.000000 +99993 -1.000000 +99994 -1.000000 +99995 -1.000000 +99996 -1.000000 +99997 -1.000000 +99998 -1.000000 +99999 -1.000000 +100002 -1.000000 +100003 -1.000000 +100004 -1.000000 +100005 -1.000000 +100006 -1.000000 +100008 -1.000000 +100009 -1.000000 +100010 -1.000000 +100011 -1.000000 +100012 -1.000000 +100013 -1.000000 +100014 -1.000000 +100015 -1.000000 +100023 -1.000000 +100024 -1.000000 +100027 -1.000000 +100028 -1.000000 +100029 -1.000000 +100031 -1.000000 +100032 -1.000000 +100034 -1.000000 +100035 -1.000000 +100036 -1.000000 +100039 -1.000000 +100042 -1.000000 +100043 -1.000000 +100044 -1.000000 +100052 -1.000000 +100056 -1.000000 +100058 -1.000000 +100059 -1.000000 +100062 -1.000000 +100063 -1.000000 +100064 -1.000000 +100065 -1.000000 +100066 -1.000000 +100070 -1.000000 +100072 -1.000000 +100076 -1.000000 +100080 -1.000000 +100081 -1.000000 +100084 -1.000000 +100086 -1.000000 +100089 -1.000000 +100090 -1.000000 +100091 -1.000000 +100092 -1.000000 +100093 -1.000000 +100095 -1.000000 +100101 -1.000000 +100102 -1.000000 +100103 -1.000000 +100104 -1.000000 +100105 -1.000000 +100106 -1.000000 +100108 -1.000000 +100109 -1.000000 +100110 -1.000000 +100111 -1.000000 +100116 -1.000000 +100117 -1.000000 +100118 -1.000000 +100119 -1.000000 +100121 -1.000000 +100122 -1.000000 +100123 -1.000000 +100124 -1.000000 +100125 -1.000000 +100126 -1.000000 +100127 -1.000000 +100128 -1.000000 +100129 -1.000000 +100130 -1.000000 +100131 -1.000000 +100145 -1.000000 +100146 -1.000000 +100147 -1.000000 +100148 -1.000000 +100149 -1.000000 +100151 -1.000000 +100152 -1.000000 +100155 -1.000000 +100156 -1.000000 +100157 -1.000000 +100158 -1.000000 +100159 -1.000000 +100160 -1.000000 +100161 -1.000000 +100162 -1.000000 +100163 -1.000000 +100164 -1.000000 +100165 -1.000000 +100166 -1.000000 +100167 -1.000000 +100168 -1.000000 +100169 -1.000000 +100170 -1.000000 +100171 -1.000000 +100173 -1.000000 +100174 -1.000000 +100175 -1.000000 +100180 -1.000000 +100181 -1.000000 +100182 -1.000000 +100183 -1.000000 +100185 -1.000000 +100186 -1.000000 +100187 -1.000000 +100189 -1.000000 +100190 -1.000000 +100193 -1.000000 +100194 -1.000000 +100195 -1.000000 +100196 -1.000000 +100197 -1.000000 +100198 -1.000000 +100199 -1.000000 +100201 -1.000000 +100202 -1.000000 +100203 -1.000000 +100204 -1.000000 +100209 -1.000000 +100215 -1.000000 +100220 -1.000000 +100227 -1.000000 +100229 -1.000000 +100253 -1.000000 +100260 -1.000000 +100261 -1.000000 +100263 -1.000000 +100264 -1.000000 +100265 -1.000000 +100266 -1.000000 +100267 -1.000000 +100268 -1.000000 +100269 -1.000000 +100270 -1.000000 +100271 -1.000000 +100272 -1.000000 +100273 -1.000000 +100278 -1.000000 +100290 -1.000000 +100291 -1.000000 +100292 -1.000000 +100293 -1.000000 +100295 -1.000000 +100300 -1.000000 +100301 -1.000000 +100322 -1.000000 +100323 -1.000000 +100328 -1.000000 +100329 -1.000000 +100330 -1.000000 +100331 -1.000000 +100333 -1.000000 +100335 -1.000000 +100336 -1.000000 +100337 -1.000000 +100338 -1.000000 +100339 -1.000000 +100340 -1.000000 +100341 -1.000000 +100342 -1.000000 +100344 -1.000000 +100345 -1.000000 +100346 -1.000000 +100347 -1.000000 +100375 -1.000000 +100376 -1.000000 +100383 -1.000000 +100384 -1.000000 +100387 -1.000000 +100388 -1.000000 +100399 -1.000000 +100404 -1.000000 +100405 -1.000000 +100409 -1.000000 +100410 -1.000000 +100411 -1.000000 +100412 -1.000000 +100413 -1.000000 +100414 -1.000000 +100415 -1.000000 +100416 -1.000000 +100417 -1.000000 +100418 -1.000000 +100419 -1.000000 +100420 -1.000000 +100421 -1.000000 +100422 -1.000000 +100423 -1.000000 +100424 -1.000000 +100425 -1.000000 +100426 -1.000000 +100427 -1.000000 +100428 -1.000000 +100429 -1.000000 +100430 -1.000000 +100431 -1.000000 +100432 -1.000000 +100433 -1.000000 +100434 -1.000000 +100435 -1.000000 +100436 -1.000000 +100437 -1.000000 +100438 -1.000000 +100439 -1.000000 +100440 -1.000000 +100441 -1.000000 +100442 -1.000000 +100443 -1.000000 +100444 -1.000000 +100445 -1.000000 +100446 -1.000000 +100447 -1.000000 +100448 -1.000000 +100449 -1.000000 +100450 -1.000000 +100451 -1.000000 +100452 -1.000000 +100453 -1.000000 +100454 -1.000000 +100455 -1.000000 +100456 -1.000000 +100457 -1.000000 +100458 -1.000000 +100459 -1.000000 +100460 -1.000000 +100461 -1.000000 +100462 -1.000000 +100463 -1.000000 +100464 -1.000000 +100465 -1.000000 +100466 -1.000000 +100467 -1.000000 +100468 -1.000000 +100469 -1.000000 +100471 -1.000000 +100472 -1.000000 +100473 -1.000000 +100474 -1.000000 +100475 -1.000000 +100476 -1.000000 +100477 -1.000000 +100478 -1.000000 +100479 -1.000000 +100480 -1.000000 +100481 -1.000000 +100482 -1.000000 +100483 -1.000000 +100484 -1.000000 +100485 -1.000000 +100486 -1.000000 +100487 -1.000000 +100488 -1.000000 +100489 -1.000000 +100490 -1.000000 +100491 -1.000000 +100492 -1.000000 +100504 -1.000000 +100505 -1.000000 +100506 -1.000000 +100507 -1.000000 +100508 -1.000000 +100509 -1.000000 +100510 -1.000000 +100511 -1.000000 +100512 -1.000000 +100700 -1.000000 +100701 -1.000000 +100702 -1.000000 +100703 -1.000000 +100704 -1.000000 +100705 -1.000000 +100706 -1.000000 +100707 -1.000000 +100708 -1.000000 +100709 -1.000000 +100710 -1.000000 +100711 -1.000000 +100712 -1.000000 +100713 -1.000000 +100714 -1.000000 +100715 -1.000000 +100716 -1.000000 +100717 -1.000000 +100718 -1.000000 +100719 -1.000000 +100720 -1.000000 +100721 -1.000000 +100722 -1.000000 +100723 -1.000000 +100725 -1.000000 +100726 -1.000000 +100727 -1.000000 +100728 -1.000000 +100729 -1.000000 +100730 -1.000000 +100731 -1.000000 +100732 -1.000000 +100733 -1.000000 +100734 -1.000000 +100735 -1.000000 +100736 -1.000000 +100737 -1.000000 +100738 -1.000000 +100739 -1.000000 +100740 -1.000000 +100741 -1.000000 +100742 -1.000000 +100743 -1.000000 +100744 -1.000000 +100745 -1.000000 +100746 -1.000000 +100747 -1.000000 +100748 -1.000000 +100749 -1.000000 +100750 -1.000000 +100751 -1.000000 +100752 -1.000000 +100753 -1.000000 +100754 -1.000000 +100755 -1.000000 +100756 -1.000000 +100757 -1.000000 +100760 -1.000000 +100761 -1.000000 +100762 -1.000000 +100763 -1.000000 +100764 -1.000000 +100765 -1.000000 +100766 -1.000000 +100767 -1.000000 +100768 -1.000000 +100769 -1.000000 +100770 -1.000000 +100771 -1.000000 +100772 -1.000000 +100773 -1.000000 +100774 -1.000000 +100775 -1.000000 +100776 -1.000000 +100777 -1.000000 +100778 -1.000000 +100779 -1.000000 +100784 -1.000000 +100786 -1.000000 +100790 -1.000000 +100791 -1.000000 +100793 -1.000000 +100794 -1.000000 +100797 -1.000000 +100798 -1.000000 +100800 -1.000000 +100801 -1.000000 +100803 -1.000000 +100804 -1.000000 +100805 -1.000000 +100806 -1.000000 +100807 -1.000000 +100817 -1.000000 +100818 -1.000000 +100821 -1.000000 +100822 -1.000000 +100823 -1.000000 +100824 -1.000000 +100825 -1.000000 +100826 -1.000000 +100827 -1.000000 +100828 -1.000000 +100829 -1.000000 +100832 -1.000000 +100833 -1.000000 +100834 -1.000000 +100835 -1.000000 +100836 -1.000000 +100837 -1.000000 +100838 -1.000000 +100839 -1.000000 +100840 -1.000000 +100841 -1.000000 +100842 -1.000000 +100843 -1.000000 +100844 -1.000000 +100846 -1.000000 +100847 -1.000000 +100848 -1.000000 +100849 -1.000000 +100850 -1.000000 +100851 -1.000000 +100852 -1.000000 +100853 -1.000000 +100854 -1.000000 +100855 -1.000000 +100856 -1.000000 +100857 -1.000000 +100858 -1.000000 +100859 -1.000000 +100861 -1.000000 +100862 -1.000000 +100863 -1.000000 +100864 -1.000000 +100865 -1.000000 +100866 -1.000000 +100867 -1.000000 +100868 -1.000000 +100869 -1.000000 +100871 -1.000000 +100872 -1.000000 +100873 -1.000000 +100874 -1.000000 +100875 -1.000000 +100877 -1.000000 +100880 -1.000000 +100882 -1.000000 +100883 -1.000000 +100884 -1.000000 +100885 -1.000000 +100886 -1.000000 +100887 -1.000000 +100888 -1.000000 +100889 -1.000000 +100890 -1.000000 +100891 -1.000000 +100892 -1.000000 +100893 -1.000000 +100894 -1.000000 +100895 -1.000000 +100896 -1.000000 +100897 -1.000000 +100898 -1.000000 +100899 -1.000000 +100900 -1.000000 +100901 -1.000000 +100902 -1.000000 +100903 -1.000000 +100904 -1.000000 +100905 -1.000000 +100906 -1.000000 +100907 -1.000000 +100908 -1.000000 +100909 -1.000000 +100910 -1.000000 +100911 -1.000000 +100912 -1.000000 +100913 -1.000000 +100914 -1.000000 +100915 -1.000000 +100916 -1.000000 +100917 -1.000000 +100918 -1.000000 +100919 -1.000000 +100920 -1.000000 +100921 -1.000000 +100922 -1.000000 +100923 -1.000000 +100924 -1.000000 +100925 -1.000000 +100926 -1.000000 +100927 -1.000000 +100928 -1.000000 +100929 -1.000000 +100930 -1.000000 +100931 -1.000000 +100932 -1.000000 +100933 -1.000000 +100934 -1.000000 +100935 -1.000000 +100936 -1.000000 +100937 -1.000000 +100938 -1.000000 +100939 -1.000000 +100940 -1.000000 +100941 -1.000000 +100942 -1.000000 +100943 -1.000000 +100944 -1.000000 +100945 -1.000000 +100946 -1.000000 +100947 -1.000000 +100948 -1.000000 +100949 -1.000000 +100950 -1.000000 +100951 -1.000000 +100952 -1.000000 +100953 -1.000000 +100954 -1.000000 +100955 -1.000000 +100956 -1.000000 +100958 -1.000000 +100959 -1.000000 +100960 -1.000000 +100961 -1.000000 +100962 -1.000000 +100963 -1.000000 +100964 -1.000000 +100965 -1.000000 +100966 -1.000000 +100969 -1.000000 +100970 -1.000000 +100971 -1.000000 +100972 -1.000000 +100973 -1.000000 +100974 -1.000000 +100975 -1.000000 +100976 -1.000000 +100977 -1.000000 +100978 -1.000000 +100979 -1.000000 +100980 -1.000000 +100981 -1.000000 +100982 -1.000000 +100983 -1.000000 +100984 -1.000000 +100985 -1.000000 +100986 -1.000000 +100987 -1.000000 +100988 -1.000000 +100989 -1.000000 +100990 -1.000000 +100991 -1.000000 +100992 -1.000000 +100993 -1.000000 +100994 -1.000000 +100995 -1.000000 +100996 -1.000000 +100997 -1.000000 +100998 -1.000000 +100999 -1.000000 +101000 -1.000000 +101001 -1.000000 +101002 -1.000000 +101003 -1.000000 +101004 -1.000000 +101005 -1.000000 +101006 -1.000000 +101007 -1.000000 +101008 -1.000000 +101009 -1.000000 +101010 -1.000000 +101011 -1.000000 +101012 -1.000000 +101013 -1.000000 +101014 -1.000000 +101015 -1.000000 +101016 -1.000000 +101017 -1.000000 +101018 -1.000000 +101019 -1.000000 +101020 -1.000000 +101021 -1.000000 +101022 -1.000000 +101023 -1.000000 +101024 -1.000000 +101025 -1.000000 +101026 -1.000000 +101027 -1.000000 +101028 -1.000000 +101029 -1.000000 +101030 -1.000000 +101031 -1.000000 +101032 -1.000000 +101033 -1.000000 +101034 -1.000000 +101035 -1.000000 +101036 -1.000000 +101037 -1.000000 +101038 -1.000000 +101039 -1.000000 +101040 -1.000000 +101041 -1.000000 +101042 -1.000000 +101043 -1.000000 +101044 -1.000000 +101045 -1.000000 +101046 -1.000000 +101047 -1.000000 +101048 -1.000000 +101049 -1.000000 +101050 -1.000000 +101051 -1.000000 +101052 -1.000000 +101055 -1.000000 +101057 -1.000000 +101058 -1.000000 +101059 -1.000000 +101060 -1.000000 +101061 -1.000000 +101068 -1.000000 +101069 -1.000000 +101070 -1.000000 +101071 -1.000000 +101072 -1.000000 +101073 -1.000000 +101074 -1.000000 +101075 -1.000000 +101076 -1.000000 +101077 -1.000000 +101078 -1.000000 +101079 -1.000000 +101080 -1.000000 +101081 -1.000000 +101082 -1.000000 +101083 -1.000000 +101084 -1.000000 +101085 -1.000000 +101086 -1.000000 +101087 -1.000000 +101089 -1.000000 +101090 -1.000000 +101091 -1.000000 +101092 -1.000000 +101094 -1.000000 +101095 -1.000000 +101097 -1.000000 +101098 -1.000000 +101101 -1.000000 +101102 -1.000000 +101103 -1.000000 +101104 -1.000000 +101105 -1.000000 +101106 -1.000000 +101107 -1.000000 +101108 -1.000000 +101109 -1.000000 +101110 -1.000000 +101111 -1.000000 +101112 -1.000000 +101113 -1.000000 +101114 -1.000000 +101115 -1.000000 +101116 -1.000000 +101117 -1.000000 +101118 -1.000000 +101119 -1.000000 +101121 -1.000000 +101123 -1.000000 +101124 -1.000000 +101126 -1.000000 +101127 -1.000000 +101128 -1.000000 +101129 -1.000000 +101131 -1.000000 +101134 -1.000000 +101135 -1.000000 +101139 -1.000000 +101140 -1.000000 +101141 -1.000000 +101142 -1.000000 +101143 -1.000000 +101144 -1.000000 +101145 -1.000000 +101146 -1.000000 +101148 -1.000000 +101151 -1.000000 +101152 -1.000000 +101159 -1.000000 +101161 -1.000000 +101162 -1.000000 +101165 -1.000000 +101166 -1.000000 +101167 -1.000000 +101168 -1.000000 +101169 -1.000000 +101172 -1.000000 +101173 -1.000000 +101174 -1.000000 +101175 -1.000000 +101177 -1.000000 +101178 -1.000000 +101179 -1.000000 +101182 -1.000000 +101186 -1.000000 +101187 -1.000000 +101189 -1.000000 +101192 -1.000000 +101194 -1.000000 +101196 -1.000000 +101197 -1.000000 +101198 -1.000000 +101199 -1.000000 +101200 -1.000000 +101201 -1.000000 +101204 -1.000000 +101205 -1.000000 +101206 -1.000000 +101207 -1.000000 +101208 -1.000000 +101209 -1.000000 +101210 -1.000000 +101211 -1.000000 +101212 -1.000000 +101213 -1.000000 +101214 -1.000000 +101215 -1.000000 +101217 -1.000000 +101218 -1.000000 +101219 -1.000000 +101220 -1.000000 +101221 -1.000000 +101222 -1.000000 +101223 -1.000000 +101225 -1.000000 +101228 -1.000000 +101229 -1.000000 +101231 -1.000000 +101232 -1.000000 +101234 -1.000000 +101248 -1.000000 +101249 -1.000000 +101250 -1.000000 +101251 -1.000000 +101252 -1.000000 +101254 -1.000000 +101256 -1.000000 +101258 -1.000000 +101260 -1.000000 +101261 -1.000000 +101262 -1.000000 +101263 -1.000000 +101264 -1.000000 +101265 -1.000000 +101267 -1.000000 +101269 -1.000000 +101270 -1.000000 +101271 -1.000000 +101272 -1.000000 +101275 -1.000000 +101276 -1.000000 +101278 -1.000000 +101279 -1.000000 +101280 -1.000000 +101281 -1.000000 +101282 -1.000000 +101283 -1.000000 +101284 -1.000000 +101285 -1.000000 +101286 -1.000000 +101287 -1.000000 +101288 -1.000000 +101289 -1.000000 +101291 -1.000000 +101294 -1.000000 +101296 -1.000000 +101297 -1.000000 +101298 -1.000000 +101300 -1.000000 +101301 -1.000000 +101302 -1.000000 +101303 -1.000000 +101304 -1.000000 +101305 -1.000000 +101306 -1.000000 +101307 -1.000000 +101308 -1.000000 +101309 -1.000000 +101310 -1.000000 +101311 -1.000000 +101312 -1.000000 +101313 -1.000000 +101314 -1.000000 +101315 -1.000000 +101316 -1.000000 +101317 -1.000000 +101318 -1.000000 +101319 -1.000000 +101320 -1.000000 +101322 -1.000000 +101323 -1.000000 +101324 -1.000000 +101325 -1.000000 +101326 -1.000000 +101327 -1.000000 +101328 -1.000000 +101329 -1.000000 +101330 -1.000000 +101331 -1.000000 +101332 -1.000000 +101333 -1.000000 +101334 -1.000000 +101335 -1.000000 +101336 -1.000000 +101337 -1.000000 +101338 -1.000000 +101339 -1.000000 +101340 -1.000000 +101341 -1.000000 +101342 -1.000000 +101343 -1.000000 +101344 -1.000000 +101345 -1.000000 +101347 -1.000000 +101350 -1.000000 +101352 -1.000000 +101354 -1.000000 +101357 -1.000000 +101358 -1.000000 +101359 -1.000000 +101360 -1.000000 +101361 -1.000000 +101362 -1.000000 +101364 -1.000000 +101365 -1.000000 +101369 -1.000000 +101370 -1.000000 +101373 -1.000000 +101374 -1.000000 +101376 -1.000000 +101377 -1.000000 +101380 -1.000000 +101382 -1.000000 +101383 -1.000000 +101385 -1.000000 +101386 -1.000000 +101387 -1.000000 +101388 -1.000000 +101389 -1.000000 +101390 -1.000000 +101391 -1.000000 +101392 -1.000000 +101393 -1.000000 +101394 -1.000000 +101395 -1.000000 +101396 -1.000000 +101397 -1.000000 +101408 -1.000000 +101410 -1.000000 +101411 -1.000000 +101412 -1.000000 +101413 -1.000000 +101414 -1.000000 +101415 -1.000000 +101416 -1.000000 +101419 -1.000000 +101420 -1.000000 +101421 -1.000000 +101422 -1.000000 +101423 -1.000000 +101424 -1.000000 +101425 -1.000000 +101426 -1.000000 +101430 -1.000000 +101431 -1.000000 +101432 -1.000000 +101433 -1.000000 +101434 -1.000000 +101435 -1.000000 +101436 -1.000000 +101437 -1.000000 +101438 -1.000000 +101439 -1.000000 +101440 -1.000000 +101443 -1.000000 +101446 -1.000000 +101448 -1.000000 +101449 -1.000000 +101451 -1.000000 +101452 -1.000000 +101456 -1.000000 +101457 -1.000000 +101458 -1.000000 +101464 -1.000000 +101465 -1.000000 +101466 -1.000000 +101467 -1.000000 +101468 -1.000000 +101469 -1.000000 +101471 -1.000000 +101472 -1.000000 +101474 -1.000000 +101475 -1.000000 +101476 -1.000000 +101477 -1.000000 +101478 -1.000000 +101479 -1.000000 +101522 -1.000000 +101523 -1.000000 +101528 -1.000000 +101529 -1.000000 +101531 -1.000000 +101532 -1.000000 +101533 -1.000000 +101534 -1.000000 +101535 -1.000000 +101536 -1.000000 +101537 -1.000000 +101538 -1.000000 +101539 -1.000000 +101540 -1.000000 +101541 -1.000000 +101542 -1.000000 +101543 -1.000000 +101544 -1.000000 +101545 -1.000000 +101546 -1.000000 +101551 -1.000000 +101552 -1.000000 +101554 -1.000000 +101575 -1.000000 +101577 -1.000000 +101578 -1.000000 +101579 -1.000000 +101580 -1.000000 +101581 -1.000000 +101582 -1.000000 +101583 -1.000000 +101584 -1.000000 +101585 -1.000000 +101586 -1.000000 +101587 -1.000000 +101588 -1.000000 +101589 -1.000000 +101590 -1.000000 +101591 -1.000000 +101592 -1.000000 +101593 -1.000000 +101594 -1.000000 +101595 -1.000000 +101596 -1.000000 +101597 -1.000000 +101598 -1.000000 +101599 -1.000000 +101600 -1.000000 +101601 -1.000000 +101604 -1.000000 +101606 -1.000000 +101607 -1.000000 +101608 -1.000000 +101609 -1.000000 +101610 -1.000000 +101616 -1.000000 +101618 -1.000000 +101622 -1.000000 +101630 -1.000000 +101631 -1.000000 +101632 -1.000000 +101633 -1.000000 +101634 -1.000000 +101640 -1.000000 +101642 -1.000000 +101645 -1.000000 +101646 -1.000000 +101647 -1.000000 +101648 -1.000000 +101654 -1.000000 +101655 -1.000000 +101656 -1.000000 +101657 -1.000000 +101660 -1.000000 +101665 -1.000000 +101829 -1.000000 +101830 -1.000000 +101831 -1.000000 +101832 -1.000000 +101833 -1.000000 +101834 -1.000000 +101835 -1.000000 +101836 -1.000000 +101837 -1.000000 +101838 -1.000000 +101839 -1.000000 +101840 -1.000000 +101841 -1.000000 +101842 -1.000000 +101843 -1.000000 +101844 -1.000000 +101846 -1.000000 +101847 -1.000000 +101848 -1.000000 +101849 -1.000000 +101850 -1.000000 +101856 -1.000000 +101858 -1.000000 +101863 -1.000000 +101864 -1.000000 +101886 -1.000000 +101893 -1.000000 +101898 -1.000000 +101902 -1.000000 +101904 -1.000000 +101905 -1.000000 +101906 -1.000000 +101907 -1.000000 +101908 -1.000000 +101910 -1.000000 +101912 -1.000000 +101913 -1.000000 +101914 -1.000000 +101916 -1.000000 +101925 -1.000000 +101926 -1.000000 +101929 -1.000000 +101932 -1.000000 +101933 -1.000000 +101934 -1.000000 +101940 -1.000000 +101941 -1.000000 +101942 -1.000000 +101943 -1.000000 +101944 -1.000000 +101945 -1.000000 +101946 -1.000000 +101947 -1.000000 +101948 -1.000000 +101949 -1.000000 +101950 -1.000000 +101951 -1.000000 +101952 -1.000000 +101953 -1.000000 +101954 -1.000000 +101955 -1.000000 +101956 -1.000000 +101957 -1.000000 +101958 -1.000000 +101959 -1.000000 +101963 -1.000000 +101964 -1.000000 +101965 -1.000000 +101969 -1.000000 +101970 -1.000000 +101972 -1.000000 +101973 -1.000000 +101975 -1.000000 +101978 -1.000000 +101979 -1.000000 +101980 -1.000000 +101982 -1.000000 +101985 -1.000000 +101986 -1.000000 +101989 -1.000000 +102000 -1.000000 +102012 -1.000000 +102023 -1.000000 +102032 -1.000000 +102040 -1.000000 +102041 -1.000000 +102042 -1.000000 +102043 -1.000000 +102044 -1.000000 +102045 -1.000000 +102046 -1.000000 +102062 -1.000000 +102066 -1.000000 +102072 -1.000000 +102073 -1.000000 +102075 -1.000000 +102076 -1.000000 +102078 -1.000000 +102080 -1.000000 +102087 -1.000000 +102089 -1.000000 +102092 -1.000000 +102094 -1.000000 +102102 -1.000000 +102103 -1.000000 +102104 -1.000000 +102105 -1.000000 +102106 -1.000000 +102108 -1.000000 +102109 -1.000000 +102112 -1.000000 +102121 -1.000000 +102123 -1.000000 +102124 -1.000000 +102125 -1.000000 +102126 -1.000000 +102127 -1.000000 +102128 -1.000000 +102129 -1.000000 +102133 -1.000000 +102134 -1.000000 +102135 -1.000000 +102136 -1.000000 +102137 -1.000000 +102138 -1.000000 +102139 -1.000000 +102140 -1.000000 +102141 -1.000000 +102142 -1.000000 +102143 -1.000000 +102144 -1.000000 +102145 -1.000000 +102146 -1.000000 +102147 -1.000000 +102246 -1.000000 +102247 -1.000000 +102249 -1.000000 +102250 -1.000000 +102251 -1.000000 +102252 -1.000000 +102253 -1.000000 +102254 -1.000000 +102257 -1.000000 +102258 -1.000000 +102264 -1.000000 +102265 -1.000000 +102266 -1.000000 +102267 -1.000000 +102269 -1.000000 +102271 -1.000000 +102272 -1.000000 +102273 -1.000000 +102274 -1.000000 +102275 -1.000000 +102276 -1.000000 +102277 -1.000000 +102284 -1.000000 +102294 -1.000000 +102312 -1.000000 +102314 -1.000000 +102315 -1.000000 +102319 -1.000000 +102320 -1.000000 +102323 -1.000000 +102326 -1.000000 +102327 -1.000000 +102329 -1.000000 +102330 -1.000000 +102332 -1.000000 +102333 -1.000000 +102334 -1.000000 +102335 -1.000000 +102336 -1.000000 +102337 -1.000000 +102338 -1.000000 +102339 -1.000000 +102340 -1.000000 +102341 -1.000000 +102342 -1.000000 +102343 -1.000000 +102346 -1.000000 +102347 -1.000000 +102350 -1.000000 +102352 -1.000000 +102353 -1.000000 +102354 -1.000000 +102355 -1.000000 +102356 -1.000000 +102357 -1.000000 +102358 -1.000000 +102359 -1.000000 +102360 -1.000000 +102361 -1.000000 +102362 -1.000000 +102363 -1.000000 +102364 -1.000000 +102365 -1.000000 +102367 -1.000000 +102370 -1.000000 +102388 -1.000000 +102389 -1.000000 +102390 -1.000000 +102391 -1.000000 +102399 -1.000000 +102402 -1.000000 +102404 -1.000000 +102406 -1.000000 +102422 -1.000000 +102423 -1.000000 +102424 -1.000000 +102425 -1.000000 +102427 -1.000000 +102428 -1.000000 +102429 -1.000000 +102431 -1.000000 +102433 -1.000000 +102434 -1.000000 +102437 -1.000000 +102438 -1.000000 +102439 -1.000000 +102440 -1.000000 +102441 -1.000000 +102443 -1.000000 +102444 -1.000000 +102445 -1.000000 +102446 -1.000000 +102451 -1.000000 +102452 -1.000000 +102467 -1.000000 +102468 -1.000000 +102469 -1.000000 +102470 -1.000000 +102471 -1.000000 +102472 -1.000000 +102473 -1.000000 +102474 -1.000000 +102475 -1.000000 +102583 -1.000000 +102584 -1.000000 +102589 -1.000000 +102590 -1.000000 +102596 -1.000000 +102597 -1.000000 +102598 -1.000000 +102599 -1.000000 +102600 -1.000000 +102601 -1.000000 +102602 -1.000000 +102603 -1.000000 +102604 -1.000000 +102605 -1.000000 +102611 -1.000000 +102617 -1.000000 +102618 -1.000000 +102619 -1.000000 +102620 -1.000000 +102621 -1.000000 +102622 -1.000000 +102624 -1.000000 +102625 -1.000000 +102627 -1.000000 +102636 -1.000000 +102639 -1.000000 +102640 -1.000000 +102641 -1.000000 +102642 -1.000000 +102644 -1.000000 +102645 -1.000000 +102646 -1.000000 +102647 -1.000000 +102648 -1.000000 +102649 -1.000000 +102650 -1.000000 +102651 -1.000000 +102652 -1.000000 +102653 -1.000000 +102654 -1.000000 +102655 -1.000000 +102657 -1.000000 +102658 -1.000000 +102659 -1.000000 +102660 -1.000000 +102667 -1.000000 +102669 -1.000000 +102674 -1.000000 +102675 -1.000000 +102676 -1.000000 +102677 -1.000000 +102678 -1.000000 +102679 -1.000000 +102680 -1.000000 +102681 -1.000000 +102682 -1.000000 +102683 -1.000000 +102684 -1.000000 +102686 -1.000000 +102692 -1.000000 +102693 -1.000000 +102694 -1.000000 +102695 -1.000000 +102696 -1.000000 +102697 -1.000000 +102698 -1.000000 +102699 -1.000000 +102700 -1.000000 +102701 -1.000000 +102702 -1.000000 +102703 -1.000000 +102704 -1.000000 +102705 -1.000000 +102706 -1.000000 +102707 -1.000000 +102708 -1.000000 +102709 -1.000000 +102710 -1.000000 +102711 -1.000000 +102712 -1.000000 +102713 -1.000000 +102714 -1.000000 +102715 -1.000000 +102716 -1.000000 +102717 -1.000000 +102718 -1.000000 +102721 -1.000000 +102722 -1.000000 +102723 -1.000000 +102724 -1.000000 +102725 -1.000000 +102726 -1.000000 +102727 -1.000000 +102728 -1.000000 +102729 -1.000000 +102730 -1.000000 +102731 -1.000000 +102734 -1.000000 +102735 -1.000000 +102759 -1.000000 +102760 -1.000000 +102761 -1.000000 +102769 -1.000000 +102770 -1.000000 +102771 -1.000000 +102772 -1.000000 +102773 -1.000000 +102774 -1.000000 +102775 -1.000000 +102776 -1.000000 +102777 -1.000000 +102778 -1.000000 +102779 -1.000000 +102780 -1.000000 +102781 -1.000000 +102782 -1.000000 +102783 -1.000000 +102784 -1.000000 +102785 -1.000000 +102786 -1.000000 +102787 -1.000000 +102788 -1.000000 +102789 -1.000000 +102790 -1.000000 +102791 -1.000000 +102792 -1.000000 +102793 -1.000000 +102794 -1.000000 +102795 -1.000000 +102796 -1.000000 +102797 -1.000000 +102798 -1.000000 +102799 -1.000000 +102800 -1.000000 +102801 -1.000000 +102802 -1.000000 +102803 -1.000000 +102804 -1.000000 +102807 -1.000000 +102808 -1.000000 +102809 -1.000000 +102810 -1.000000 +102815 -1.000000 +102818 -1.000000 +102819 -1.000000 +102820 -1.000000 +102821 -1.000000 +102822 -1.000000 +102823 -1.000000 +102827 -1.000000 +102841 -1.000000 +102849 -1.000000 +102850 -1.000000 +102851 -1.000000 +102852 -1.000000 +102853 -1.000000 +102854 -1.000000 +102855 -1.000000 +102860 -1.000000 +102861 -1.000000 +102862 -1.000000 +102864 -1.000000 +102880 -1.000000 +102891 -1.000000 +102893 -1.000000 +102894 -1.000000 +102896 -1.000000 +102897 -1.000000 +102898 -1.000000 +102900 -1.000000 +102902 -1.000000 +102904 -1.000000 +102905 -1.000000 +102915 -1.000000 +102918 -1.000000 +102921 -1.000000 +102928 -1.000000 +102934 -1.000000 +102939 -1.000000 +102949 -1.000000 +102953 -1.000000 +102954 -1.000000 +102965 -1.000000 +102968 -1.000000 +102969 -1.000000 +102976 -1.000000 +102978 -1.000000 +102979 -1.000000 +102980 -1.000000 +102984 -1.000000 +102985 -1.000000 +102987 -1.000000 +102989 -1.000000 +102990 -1.000000 +102991 -1.000000 +102993 -1.000000 +102996 -1.000000 +102999 -1.000000 +103000 -1.000000 +103002 -1.000000 +103003 -1.000000 +103004 -1.000000 +103005 -1.000000 +103009 -1.000000 +103012 -1.000000 +103013 -1.000000 +103014 -1.000000 +103015 -1.000000 +103016 -1.000000 +103017 -1.000000 +103018 -1.000000 +103019 -1.000000 +103020 -1.000000 +103021 -1.000000 +103022 -1.000000 +103023 -1.000000 +103024 -1.000000 +103025 -1.000000 +103026 -1.000000 +103027 -1.000000 +103032 -1.000000 +103066 -1.000000 +103067 -1.000000 +103068 -1.000000 +103069 -1.000000 +103070 -1.000000 +103071 -1.000000 +103072 -1.000000 +103073 -1.000000 +103074 -1.000000 +103086 -1.000000 +103087 -1.000000 +103093 -1.000000 +103094 -1.000000 +103095 -1.000000 +103097 -1.000000 +103098 -1.000000 +103099 -1.000000 +103100 -1.000000 +103101 -1.000000 +103103 -1.000000 +103104 -1.000000 +103105 -1.000000 +103107 -1.000000 +103111 -1.000000 +103113 -1.000000 +103115 -1.000000 +103116 -1.000000 +103117 -1.000000 +103118 -1.000000 +103119 -1.000000 +103120 -1.000000 +103122 -1.000000 +103124 -1.000000 +103125 -1.000000 +103127 -1.000000 +103133 -1.000000 +103134 -1.000000 +103135 -1.000000 +103136 -1.000000 +103137 -1.000000 +103138 -1.000000 +103139 -1.000000 +103140 -1.000000 +103141 -1.000000 +103142 -1.000000 +103143 -1.000000 +103144 -1.000000 +103145 -1.000000 +103146 -1.000000 +103147 -1.000000 +103148 -1.000000 +103150 -1.000000 +103173 -1.000000 +103181 -1.000000 +103182 -1.000000 +103185 -1.000000 +103187 -1.000000 +103191 -1.000000 +103193 -1.000000 +103194 -1.000000 +103196 -1.000000 +103197 -1.000000 +103198 -1.000000 +103200 -1.000000 +103201 -1.000000 +103202 -1.000000 +103203 -1.000000 +103205 -1.000000 +103212 -1.000000 +103214 -1.000000 +103216 -1.000000 +103220 -1.000000 +103221 -1.000000 +103228 -1.000000 +103234 -1.000000 +103236 -1.000000 +103239 -1.000000 +103243 -1.000000 +103245 -1.000000 +103257 -1.000000 +103261 -1.000000 +103262 -1.000000 +103268 -1.000000 +103272 -1.000000 +103273 -1.000000 +103274 -1.000000 +103282 -1.000000 +103283 -1.000000 +103284 -1.000000 +103285 -1.000000 +103286 -1.000000 +103287 -1.000000 +103288 -1.000000 +103289 -1.000000 +103290 -1.000000 +103291 -1.000000 +103292 -1.000000 +103293 -1.000000 +103294 -1.000000 +103296 -1.000000 +103301 -1.000000 +103309 -1.000000 +103310 -1.000000 +103316 -1.000000 +103323 -1.000000 +103324 -1.000000 +103325 -1.000000 +103326 -1.000000 +103331 -1.000000 +103332 -1.000000 +103335 -1.000000 +103337 -1.000000 +103338 -1.000000 +103340 -1.000000 +103341 -1.000000 +103342 -1.000000 +103343 -1.000000 +103346 -1.000000 +103348 -1.000000 +103349 -1.000000 +103350 -1.000000 +103351 -1.000000 +103352 -1.000000 +103353 -1.000000 +103354 -1.000000 +103355 -1.000000 +103356 -1.000000 +103362 -1.000000 +103365 -1.000000 +103368 -1.000000 +103391 -1.000000 +103392 -1.000000 +103393 -1.000000 +103394 -1.000000 +103395 -1.000000 +103396 -1.000000 +103397 -1.000000 +103399 -1.000000 +103415 -1.000000 +103428 -1.000000 +103435 -1.000000 +103440 -1.000000 +103447 -1.000000 +103458 -1.000000 +103459 -1.000000 +103460 -1.000000 +103462 -1.000000 +103470 -1.000000 +103479 -1.000000 +103494 -1.000000 +103495 -1.000000 +103497 -1.000000 +103514 -1.000000 +103521 -1.000000 +103523 -1.000000 +103534 -1.000000 +103536 -1.000000 +103537 -1.000000 +103538 -1.000000 +103539 -1.000000 +103540 -1.000000 +103541 -1.000000 +103542 -1.000000 +103543 -1.000000 +103544 -1.000000 +103545 -1.000000 +103546 -1.000000 +103548 -1.000000 +103549 -1.000000 +103550 -1.000000 +103551 -1.000000 +103552 -1.000000 +103553 -1.000000 +103554 -1.000000 +103555 -1.000000 +103556 -1.000000 +103557 -1.000000 +103558 -1.000000 +103559 -1.000000 +103560 -1.000000 +103561 -1.000000 +103562 -1.000000 +103563 -1.000000 +103564 -1.000000 +103565 -1.000000 +103566 -1.000000 +103567 -1.000000 +103568 -1.000000 +103569 -1.000000 +103570 -1.000000 +103571 -1.000000 +103572 -1.000000 +103573 -1.000000 +103574 -1.000000 +103575 -1.000000 +103576 -1.000000 +103577 -1.000000 +103578 -1.000000 +103579 -1.000000 +103580 -1.000000 +103581 -1.000000 +103636 -1.000000 +103637 -1.000000 +103639 -1.000000 +103640 -1.000000 +103641 -1.000000 +103642 -1.000000 +103643 -1.000000 +103644 -1.000000 +103647 -1.000000 +103648 -1.000000 +103649 -1.000000 +103650 -1.000000 +103652 -1.000000 +103653 -1.000000 +103654 -1.000000 +103661 -1.000000 +103665 -1.000000 +103666 -1.000000 +103667 -1.000000 +103674 -1.000000 +103677 -1.000000 +103678 -1.000000 +103680 -1.000000 +103681 -1.000000 +103682 -1.000000 +103683 -1.000000 +103689 -1.000000 +103690 -1.000000 +103692 -1.000000 +103693 -1.000000 +103697 -1.000000 +103698 -1.000000 +103700 -1.000000 +103702 -1.000000 +103707 -1.000000 +103708 -1.000000 +103709 -1.000000 +103710 -1.000000 +103711 -1.000000 +103712 -1.000000 +103713 -1.000000 +103714 -1.000000 +103716 -1.000000 +103717 -1.000000 +103722 -1.000000 +103723 -1.000000 +103731 -1.000000 +103733 -1.000000 +103737 -1.000000 +103738 -1.000000 +103739 -1.000000 +103740 -1.000000 +103758 -1.000000 +103760 -1.000000 +103761 -1.000000 +103765 -1.000000 +103767 -1.000000 +103768 -1.000000 +103769 -1.000000 +103770 -1.000000 +103771 -1.000000 +103773 -1.000000 +103775 -1.000000 +103776 -1.000000 +103777 -1.000000 +103778 -1.000000 +103779 -1.000000 +103780 -1.000000 +103783 -1.000000 +103785 -1.000000 +103786 -1.000000 +103787 -1.000000 +103788 -1.000000 +103791 -1.000000 +103793 -1.000000 +103796 -1.000000 +103798 -1.000000 +103800 -1.000000 +103801 -1.000000 +103802 -1.000000 +103803 -1.000000 +103804 -1.000000 +103805 -1.000000 +103806 -1.000000 +103807 -1.000000 +103808 -1.000000 +103809 -1.000000 +103810 -1.000000 +103811 -1.000000 +103813 -1.000000 +103814 -1.000000 +103816 -1.000000 +103818 -1.000000 +103819 -1.000000 +103820 -1.000000 +103822 -1.000000 +103824 -1.000000 +103825 -1.000000 +103826 -1.000000 +103829 -1.000000 +103840 -1.000000 +103842 -1.000000 +103844 -1.000000 +103845 -1.000000 +103846 -1.000000 +103848 -1.000000 +103849 -1.000000 +103851 -1.000000 +103853 -1.000000 +103855 -1.000000 +103862 -1.000000 +103863 -1.000000 +103866 -1.000000 +103867 -1.000000 +103868 -1.000000 +103875 -1.000000 +103877 -1.000000 +103879 -1.000000 +103880 -1.000000 +103889 -1.000000 +103890 -1.000000 +103891 -1.000000 +103893 -1.000000 +103894 -1.000000 +103898 -1.000000 +103901 -1.000000 +103906 -1.000000 +103925 -1.000000 +103929 -1.000000 +103931 -1.000000 +103932 -1.000000 +103934 -1.000000 +103936 -1.000000 +103937 -1.000000 +103938 -1.000000 +103939 -1.000000 +103941 -1.000000 +103942 -1.000000 +103943 -1.000000 +103944 -1.000000 +103945 -1.000000 +103946 -1.000000 +103947 -1.000000 +103948 -1.000000 +103949 -1.000000 +103950 -1.000000 +103951 -1.000000 +103952 -1.000000 +103953 -1.000000 +103954 -1.000000 +103955 -1.000000 +103956 -1.000000 +103957 -1.000000 +103958 -1.000000 +103959 -1.000000 +103960 -1.000000 +103961 -1.000000 +103962 -1.000000 +103963 -1.000000 +103964 -1.000000 +103965 -1.000000 +103966 -1.000000 +103967 -1.000000 +103968 -1.000000 +103969 -1.000000 +103970 -1.000000 +103971 -1.000000 +103972 -1.000000 +103973 -1.000000 +103974 -1.000000 +103975 -1.000000 +103976 -1.000000 +103977 -1.000000 +103978 -1.000000 +103979 -1.000000 +103980 -1.000000 +103981 -1.000000 +103982 -1.000000 +103983 -1.000000 +103985 -1.000000 +103986 -1.000000 +103988 -1.000000 +103989 -1.000000 +103991 -1.000000 +103992 -1.000000 +103994 -1.000000 +103996 -1.000000 +103997 -1.000000 +103998 -1.000000 +103999 -1.000000 +104000 -1.000000 +104001 -1.000000 +104002 -1.000000 +104003 -1.000000 +104004 -1.000000 +104005 -1.000000 +104006 -1.000000 +104007 -1.000000 +104008 -1.000000 +104009 -1.000000 +104010 -1.000000 +104011 -1.000000 +104012 -1.000000 +104013 -1.000000 +104014 -1.000000 +104015 -1.000000 +104016 -1.000000 +104017 -1.000000 +104018 -1.000000 +104019 -1.000000 +104020 -1.000000 +104021 -1.000000 +104022 -1.000000 +104023 -1.000000 +104024 -1.000000 +104025 -1.000000 +104033 -1.000000 +104035 -1.000000 +104036 -1.000000 +104037 -1.000000 +104038 -1.000000 +104039 -1.000000 +104040 -1.000000 +104041 -1.000000 +104042 -1.000000 +104043 -1.000000 +104044 -1.000000 +104045 -1.000000 +104046 -1.000000 +104047 -1.000000 +104048 -1.000000 +104049 -1.000000 +104050 -1.000000 +104051 -1.000000 +104052 -1.000000 +104053 -1.000000 +104054 -1.000000 +104055 -1.000000 +104056 -1.000000 +104057 -1.000000 +104059 -1.000000 +104060 -1.000000 +104061 -1.000000 +104062 -1.000000 +104063 -1.000000 +104065 -1.000000 +104066 -1.000000 +104067 -1.000000 +104069 -1.000000 +104070 -1.000000 +104072 -1.000000 +104073 -1.000000 +104074 -1.000000 +104076 -1.000000 +104082 -1.000000 +104083 -1.000000 +104085 -1.000000 +104086 -1.000000 +104087 -1.000000 +104088 -1.000000 +104090 -1.000000 +104091 -1.000000 +104095 -1.000000 +104096 -1.000000 +104097 -1.000000 +104098 -1.000000 +104100 -1.000000 +104102 -1.000000 +104103 -1.000000 +104104 -1.000000 +104105 -1.000000 +104106 -1.000000 +104107 -1.000000 +104108 -1.000000 +104109 -1.000000 +104110 -1.000000 +104111 -1.000000 +104112 -1.000000 +104113 -1.000000 +104114 -1.000000 +104116 -1.000000 +104117 -1.000000 +104118 -1.000000 +104119 -1.000000 +104120 -1.000000 +104121 -1.000000 +104122 -1.000000 +104124 -1.000000 +104126 -1.000000 +104128 -1.000000 +104129 -1.000000 +104130 -1.000000 +104132 -1.000000 +104133 -1.000000 +104134 -1.000000 +104136 -1.000000 +104137 -1.000000 +104138 -1.000000 +104139 -1.000000 +104140 -1.000000 +104141 -1.000000 +104142 -1.000000 +104143 -1.000000 +104144 -1.000000 +104145 -1.000000 +104147 -1.000000 +104158 -1.000000 +104159 -1.000000 +104163 -1.000000 +104165 -1.000000 +104166 -1.000000 +104168 -1.000000 +104170 -1.000000 +104171 -1.000000 +104173 -1.000000 +104174 -1.000000 +104176 -1.000000 +104177 -1.000000 +104181 -1.000000 +104183 -1.000000 +104185 -1.000000 +104186 -1.000000 +104187 -1.000000 +104188 -1.000000 +104189 -1.000000 +104190 -1.000000 +104191 -1.000000 +104193 -1.000000 +104194 -1.000000 +104195 -1.000000 +104196 -1.000000 +104197 -1.000000 +104199 -1.000000 +104200 -1.000000 +104201 -1.000000 +104203 -1.000000 +104205 -1.000000 +104207 -1.000000 +104209 -1.000000 +104211 -1.000000 +104212 -1.000000 +104216 -1.000000 +104218 -1.000000 +104219 -1.000000 +104220 -1.000000 +104221 -1.000000 +104222 -1.000000 +104223 -1.000000 +104224 -1.000000 +104225 -1.000000 +104226 -1.000000 +104229 -1.000000 +104230 -1.000000 +104231 -1.000000 +104232 -1.000000 +104233 -1.000000 +104235 -1.000000 +104236 -1.000000 +104237 -1.000000 +104238 -1.000000 +104241 -1.000000 +104242 -1.000000 +104243 -1.000000 +104244 -1.000000 +104245 -1.000000 +104246 -1.000000 +104247 -1.000000 +104248 -1.000000 +104251 -1.000000 +104254 -1.000000 +104256 -1.000000 +104260 -1.000000 +104267 -1.000000 +104275 -1.000000 +104288 -1.000000 +104291 -1.000000 +104292 -1.000000 +104293 -1.000000 +104294 -1.000000 +104295 -1.000000 +104296 -1.000000 +104297 -1.000000 +104298 -1.000000 +104299 -1.000000 +104300 -1.000000 +104303 -1.000000 +104306 -1.000000 +104310 -1.000000 +104314 -1.000000 +104320 -1.000000 +104326 -1.000000 +104339 -1.000000 +104756 -1.000000 +104757 -1.000000 +104758 -1.000000 +104760 -1.000000 +104761 -1.000000 +104762 -1.000000 +104764 -1.000000 +104766 -1.000000 +104769 -1.000000 +104772 -1.000000 +104773 -1.000000 +104778 -1.000000 +104795 -1.000000 +104796 -1.000000 +104797 -1.000000 +104798 -1.000000 +104799 -1.000000 +104800 -1.000000 +104801 -1.000000 +104802 -1.000000 +104803 -1.000000 +104804 -1.000000 +104805 -1.000000 +104806 -1.000000 +104807 -1.000000 +104808 -1.000000 +104809 -1.000000 +104810 -1.000000 +104811 -1.000000 +104812 -1.000000 +104813 -1.000000 +104816 -1.000000 +104817 -1.000000 +104819 -1.000000 +104832 -1.000000 +104835 -1.000000 +104836 -1.000000 +104840 -1.000000 +104841 -1.000000 +104844 -1.000000 +104848 -1.000000 +104849 -1.000000 +104854 -1.000000 +104855 -1.000000 +104856 -1.000000 +104861 -1.000000 +104862 -1.000000 +104863 -1.000000 +104864 -1.000000 +104865 -1.000000 +104866 -1.000000 +104868 -1.000000 +104876 -1.000000 +104882 -1.000000 +104883 -1.000000 +104884 -1.000000 +104887 -1.000000 +104888 -1.000000 +104889 -1.000000 +104890 -1.000000 +104891 -1.000000 +104894 -1.000000 +104898 -1.000000 +104955 -1.000000 +104957 -1.000000 +104958 -1.000000 +104959 -1.000000 +104960 -1.000000 +104961 -1.000000 +104962 -1.000000 +104963 -1.000000 +104964 -1.000000 +104965 -1.000000 +104966 -1.000000 +104967 -1.000000 +104969 -1.000000 +104981 -1.000000 +104983 -1.000000 +105000 -1.000000 +105001 -1.000000 +105002 -1.000000 +105003 -1.000000 +105004 -1.000000 +105007 -1.000000 +105010 -1.000000 +105011 -1.000000 +105012 -1.000000 +105013 -1.000000 +105014 -1.000000 +105015 -1.000000 +105016 -1.000000 +105028 -1.000000 +105040 -1.000000 +105041 -1.000000 +105042 -1.000000 +105043 -1.000000 +105044 -1.000000 +105047 -1.000000 +105048 -1.000000 +105049 -1.000000 +105050 -1.000000 +105051 -1.000000 +105052 -1.000000 +105053 -1.000000 +105054 -1.000000 +105055 -1.000000 +105056 -1.000000 +105057 -1.000000 +105058 -1.000000 +105059 -1.000000 +105060 -1.000000 +105061 -1.000000 +105062 -1.000000 +105067 -1.000000 +105069 -1.000000 +105070 -1.000000 +105071 -1.000000 +105080 -1.000000 +105081 -1.000000 +105082 -1.000000 +105117 -1.000000 +105118 -1.000000 +105125 -1.000000 +105133 -1.000000 +105134 -1.000000 +105135 -1.000000 +105136 -1.000000 +105160 -1.000000 +105161 -1.000000 +105162 -1.000000 +105163 -1.000000 +105164 -1.000000 +105165 -1.000000 +105166 -1.000000 +105167 -1.000000 +105168 -1.000000 +105169 -1.000000 +105170 -1.000000 +105171 -1.000000 +105174 -1.000000 +105175 -1.000000 +105176 -1.000000 +105177 -1.000000 +105178 -1.000000 +105179 -1.000000 +105180 -1.000000 +105184 -1.000000 +105185 -1.000000 +105201 -1.000000 +105215 -1.000000 +105216 -1.000000 +105217 -1.000000 +105221 -1.000000 +105227 -1.000000 +105228 -1.000000 +105229 -1.000000 +105230 -1.000000 +105246 -1.000000 +105254 -1.000000 +105255 -1.000000 +105266 -1.000000 +105267 -1.000000 +105272 -1.000000 +105275 -1.000000 +105293 -1.000000 +105304 -1.000000 +105320 -1.000000 +105321 -1.000000 +105323 -1.000000 +105324 -1.000000 +105327 -1.000000 +105328 -1.000000 +105329 -1.000000 +105330 -1.000000 +105331 -1.000000 +105332 -1.000000 +105333 -1.000000 +105334 -1.000000 +105335 -1.000000 +105336 -1.000000 +105340 -1.000000 +105342 -1.000000 +105343 -1.000000 +105344 -1.000000 +105345 -1.000000 +105346 -1.000000 +105347 -1.000000 +105348 -1.000000 +105349 -1.000000 +105350 -1.000000 +105351 -1.000000 +105352 -1.000000 +105353 -1.000000 +105354 -1.000000 +105355 -1.000000 +105356 -1.000000 +105357 -1.000000 +105358 -1.000000 +105359 -1.000000 +105360 -1.000000 +105364 -1.000000 +105371 -1.000000 +105399 -1.000000 +105400 -1.000000 +105401 -1.000000 +105402 -1.000000 +105403 -1.000000 +105404 -1.000000 +105405 -1.000000 +105406 -1.000000 +105407 -1.000000 +105408 -1.000000 +105409 -1.000000 +105410 -1.000000 +105411 -1.000000 +105412 -1.000000 +105413 -1.000000 +105414 -1.000000 +105415 -1.000000 +105416 -1.000000 +105417 -1.000000 +105418 -1.000000 +105420 -1.000000 +105423 -1.000000 +105427 -1.000000 +105428 -1.000000 +105430 -1.000000 +105431 -1.000000 +105433 -1.000000 +105437 -1.000000 +105438 -1.000000 +105439 -1.000000 +105440 -1.000000 +105441 -1.000000 +105442 -1.000000 +105443 -1.000000 +105444 -1.000000 +105445 -1.000000 +105446 -1.000000 +105447 -1.000000 +105449 -1.000000 +105451 -1.000000 +105453 -1.000000 +105455 -1.000000 +105459 -1.000000 +105463 -1.000000 +105464 -1.000000 +105465 -1.000000 +105466 -1.000000 +105467 -1.000000 +105468 -1.000000 +105469 -1.000000 +105470 -1.000000 +105471 -1.000000 +105472 -1.000000 +105473 -1.000000 +105475 -1.000000 +105481 -1.000000 +105483 -1.000000 +105484 -1.000000 +105487 -1.000000 +105488 -1.000000 +105492 -1.000000 +105495 -1.000000 +105496 -1.000000 +105516 -1.000000 +105517 -1.000000 +105518 -1.000000 +105519 -1.000000 +105526 -1.000000 +105558 -1.000000 +105559 -1.000000 +105561 -1.000000 +105562 -1.000000 +105564 -1.000000 +105565 -1.000000 +105566 -1.000000 +105567 -1.000000 +105569 -1.000000 +105570 -1.000000 +105571 -1.000000 +105572 -1.000000 +105573 -1.000000 +105574 -1.000000 +105576 -1.000000 +105578 -1.000000 +105579 -1.000000 +105581 -1.000000 +105582 -1.000000 +105584 -1.000000 +105585 -1.000000 +105586 -1.000000 +105588 -1.000000 +105591 -1.000000 +105594 -1.000000 +105595 -1.000000 +105597 -1.000000 +105598 -1.000000 +105599 -1.000000 +105600 -1.000000 +105602 -1.000000 +105603 -1.000000 +105604 -1.000000 +105605 -1.000000 +105606 -1.000000 +105607 -1.000000 +105609 -1.000000 +105610 -1.000000 +105611 -1.000000 +105612 -1.000000 +105613 -1.000000 +105620 -1.000000 +105622 -1.000000 +105623 -1.000000 +105624 -1.000000 +105628 -1.000000 +105633 -1.000000 +105635 -1.000000 +105655 -1.000000 +105656 -1.000000 +105657 -1.000000 +105659 -1.000000 +105660 -1.000000 +105661 -1.000000 +105662 -1.000000 +105663 -1.000000 +105664 -1.000000 +105665 -1.000000 +105666 -1.000000 +105668 -1.000000 +105669 -1.000000 +105670 -1.000000 +105671 -1.000000 +105672 -1.000000 +105673 -1.000000 +105674 -1.000000 +105675 -1.000000 +105676 -1.000000 +105677 -1.000000 +105678 -1.000000 +105679 -1.000000 +105744 -1.000000 +105745 -1.000000 +105746 -1.000000 +105747 -1.000000 +105748 -1.000000 +105751 -1.000000 +105752 -1.000000 +105755 -1.000000 +105756 -1.000000 +105757 -1.000000 +105758 -1.000000 +105769 -1.000000 +105771 -1.000000 +105794 -1.000000 +105805 -1.000000 +105806 -1.000000 +105807 -1.000000 +105808 -1.000000 +105809 -1.000000 +105810 -1.000000 +105811 -1.000000 +105812 -1.000000 +105820 -1.000000 +105822 -1.000000 +105823 -1.000000 +105824 -1.000000 +105825 -1.000000 +105826 -1.000000 +105827 -1.000000 +105828 -1.000000 +105831 -1.000000 +105832 -1.000000 +105833 -1.000000 +105834 -1.000000 +105835 -1.000000 +105838 -1.000000 +105839 -1.000000 +105845 -1.000000 +105846 -1.000000 +105863 -1.000000 +105865 -1.000000 +105868 -1.000000 +105869 -1.000000 +105872 -1.000000 +105873 -1.000000 +105874 -1.000000 +105878 -1.000000 +105879 -1.000000 +105880 -1.000000 +105881 -1.000000 +105882 -1.000000 +105883 -1.000000 +105884 -1.000000 +105886 -1.000000 +105887 -1.000000 +105888 -1.000000 +105889 -1.000000 +105890 -1.000000 +105891 -1.000000 +105893 -1.000000 +105894 -1.000000 +105895 -1.000000 +105898 -1.000000 +105907 -1.000000 +105909 -1.000000 +105912 -1.000000 +105913 -1.000000 +105914 -1.000000 +105916 -1.000000 +105918 -1.000000 +105919 -1.000000 +105923 -1.000000 +105933 -1.000000 +105934 -1.000000 +105935 -1.000000 +105936 -1.000000 +105938 -1.000000 +105942 -1.000000 +105944 -1.000000 +105947 -1.000000 +105956 -1.000000 +105960 -1.000000 +105964 -1.000000 +105965 -1.000000 +105966 -1.000000 +105969 -1.000000 +105971 -1.000000 +105974 -1.000000 +105975 -1.000000 +105976 -1.000000 +105979 -1.000000 +105981 -1.000000 +105982 -1.000000 +105983 -1.000000 +105984 -1.000000 +105985 -1.000000 +105986 -1.000000 +105987 -1.000000 +105988 -1.000000 +105992 -1.000000 +105998 -1.000000 +106001 -1.000000 +106017 -1.000000 +106023 -1.000000 +106027 -1.000000 +106042 -1.000000 +106043 -1.000000 +106044 -1.000000 +106045 -1.000000 +106046 -1.000000 +106048 -1.000000 +106049 -1.000000 +106061 -1.000000 +106063 -1.000000 +106065 -1.000000 +106068 -1.000000 +106071 -1.000000 +106073 -1.000000 +106074 -1.000000 +106076 -1.000000 +106077 -1.000000 +106078 -1.000000 +106079 -1.000000 +106080 -1.000000 +106082 -1.000000 +106083 -1.000000 +106084 -1.000000 +106085 -1.000000 +106086 -1.000000 +106091 -1.000000 +106092 -1.000000 +106093 -1.000000 +106094 -1.000000 +106095 -1.000000 +106096 -1.000000 +106097 -1.000000 +106098 -1.000000 +106099 -1.000000 +106101 -1.000000 +106102 -1.000000 +106103 -1.000000 +106104 -1.000000 +106105 -1.000000 +106106 -1.000000 +106107 -1.000000 +106108 -1.000000 +106109 -1.000000 +106110 -1.000000 +106111 -1.000000 +106112 -1.000000 +106113 -1.000000 +106114 -1.000000 +106115 -1.000000 +106116 -1.000000 +106117 -1.000000 +106118 -1.000000 +106119 -1.000000 +106121 -1.000000 +106122 -1.000000 +106124 -1.000000 +106126 -1.000000 +106127 -1.000000 +106128 -1.000000 +106129 -1.000000 +106130 -1.000000 +106131 -1.000000 +106132 -1.000000 +106133 -1.000000 +106134 -1.000000 +106135 -1.000000 +106136 -1.000000 +106138 -1.000000 +106139 -1.000000 +106140 -1.000000 +106142 -1.000000 +106143 -1.000000 +106144 -1.000000 +106145 -1.000000 +106146 -1.000000 +106147 -1.000000 +106149 -1.000000 +106150 -1.000000 +106152 -1.000000 +106153 -1.000000 +106154 -1.000000 +106155 -1.000000 +106156 -1.000000 +106157 -1.000000 +106158 -1.000000 +106159 -1.000000 +106160 -1.000000 +106161 -1.000000 +106162 -1.000000 +106163 -1.000000 +106164 -1.000000 +106165 -1.000000 +106166 -1.000000 +106167 -1.000000 +106168 -1.000000 +106169 -1.000000 +106170 -1.000000 +106171 -1.000000 +106172 -1.000000 +106173 -1.000000 +106175 -1.000000 +106177 -1.000000 +106186 -1.000000 +106187 -1.000000 +106188 -1.000000 +106190 -1.000000 +106191 -1.000000 +106192 -1.000000 +106194 -1.000000 +106195 -1.000000 +106196 -1.000000 +106197 -1.000000 +106202 -1.000000 +106203 -1.000000 +106204 -1.000000 +106206 -1.000000 +106207 -1.000000 +106208 -1.000000 +106216 -1.000000 +106218 -1.000000 +106219 -1.000000 +106220 -1.000000 +106221 -1.000000 +106222 -1.000000 +106225 -1.000000 +106235 -1.000000 +106240 -1.000000 +106249 -1.000000 +106251 -1.000000 +106252 -1.000000 +106253 -1.000000 +106254 -1.000000 +106255 -1.000000 +106256 -1.000000 +106257 -1.000000 +106258 -1.000000 +106259 -1.000000 +106260 -1.000000 +106261 -1.000000 +106262 -1.000000 +106263 -1.000000 +106264 -1.000000 +106265 -1.000000 +106266 -1.000000 +106267 -1.000000 +106268 -1.000000 +106269 -1.000000 +106270 -1.000000 +106271 -1.000000 +106272 -1.000000 +106273 -1.000000 +106274 -1.000000 +106275 -1.000000 +106278 -1.000000 +106279 -1.000000 +106285 -1.000000 +106286 -1.000000 +106287 -1.000000 +106288 -1.000000 +106289 -1.000000 +106291 -1.000000 +106292 -1.000000 +106293 -1.000000 +106294 -1.000000 +106295 -1.000000 +106296 -1.000000 +106297 -1.000000 +106299 -1.000000 +106300 -1.000000 +106301 -1.000000 +106302 -1.000000 +106303 -1.000000 +106304 -1.000000 +106306 -1.000000 +106307 -1.000000 +106308 -1.000000 +106309 -1.000000 +106310 -1.000000 +106311 -1.000000 +106312 -1.000000 +106313 -1.000000 +106314 -1.000000 +106315 -1.000000 +106316 -1.000000 +106318 -1.000000 +106321 -1.000000 +106322 -1.000000 +106323 -1.000000 +106332 -1.000000 +106342 -1.000000 +106343 -1.000000 +106344 -1.000000 +106345 -1.000000 +106346 -1.000000 +106347 -1.000000 +106348 -1.000000 +106349 -1.000000 +106350 -1.000000 +106351 -1.000000 +106352 -1.000000 +106353 -1.000000 +106354 -1.000000 +106355 -1.000000 +106356 -1.000000 +106357 -1.000000 +106358 -1.000000 +106359 -1.000000 +106360 -1.000000 +106361 -1.000000 +106362 -1.000000 +106363 -1.000000 +106364 -1.000000 +106365 -1.000000 +106366 -1.000000 +106367 -1.000000 +106368 -1.000000 +106369 -1.000000 +106370 -1.000000 +106371 -1.000000 +106372 -1.000000 +106377 -1.000000 +106440 -1.000000 +106441 -1.000000 +106442 -1.000000 +106443 -1.000000 +106444 -1.000000 +106447 -1.000000 +106448 -1.000000 +106450 -1.000000 +106457 -1.000000 +106458 -1.000000 +106459 -1.000000 +106462 -1.000000 +106465 -1.000000 +106469 -1.000000 +106470 -1.000000 +106471 -1.000000 +106472 -1.000000 +106473 -1.000000 +106474 -1.000000 +106475 -1.000000 +106476 -1.000000 +106477 -1.000000 +106478 -1.000000 +106479 -1.000000 +106480 -1.000000 +106481 -1.000000 +106482 -1.000000 +106483 -1.000000 +106484 -1.000000 +106485 -1.000000 +106486 -1.000000 +106487 -1.000000 +106488 -1.000000 +106489 -1.000000 +106490 -1.000000 +106491 -1.000000 +106492 -1.000000 +106493 -1.000000 +106494 -1.000000 +106495 -1.000000 +106496 -1.000000 +106498 -1.000000 +106499 -1.000000 +106502 -1.000000 +106503 -1.000000 +106504 -1.000000 +106506 -1.000000 +106510 -1.000000 +106511 -1.000000 +106512 -1.000000 +106513 -1.000000 +106514 -1.000000 +106515 -1.000000 +106516 -1.000000 +106517 -1.000000 +106518 -1.000000 +106520 -1.000000 +106521 -1.000000 +106522 -1.000000 +106523 -1.000000 +106527 -1.000000 +106529 -1.000000 +106530 -1.000000 +106531 -1.000000 +106533 -1.000000 +106534 -1.000000 +106537 -1.000000 +106539 -1.000000 +106546 -1.000000 +106547 -1.000000 +106548 -1.000000 +106549 -1.000000 +106550 -1.000000 +106551 -1.000000 +106552 -1.000000 +106554 -1.000000 +106555 -1.000000 +106556 -1.000000 +106557 -1.000000 +106558 -1.000000 +106559 -1.000000 +106560 -1.000000 +106561 -1.000000 +106562 -1.000000 +106564 -1.000000 +106565 -1.000000 +106567 -1.000000 +106568 -1.000000 +106569 -1.000000 +106570 -1.000000 +106571 -1.000000 +106572 -1.000000 +106573 -1.000000 +106574 -1.000000 +106575 -1.000000 +106577 -1.000000 +106578 -1.000000 +106582 -1.000000 +106583 -1.000000 +106584 -1.000000 +106585 -1.000000 +106586 -1.000000 +106588 -1.000000 +106589 -1.000000 +106591 -1.000000 +106592 -1.000000 +106593 -1.000000 +106595 -1.000000 +106596 -1.000000 +106597 -1.000000 +106598 -1.000000 +106599 -1.000000 +106602 -1.000000 +106604 -1.000000 +106605 -1.000000 +106608 -1.000000 +106609 -1.000000 +106610 -1.000000 +106612 -1.000000 +106614 -1.000000 +106617 -1.000000 +106621 -1.000000 +106638 -1.000000 +106649 -1.000000 +106652 -1.000000 +106654 -1.000000 +106662 -1.000000 +106664 -1.000000 +106665 -1.000000 +106676 -1.000000 +106681 -1.000000 +106683 -1.000000 +106684 -1.000000 +106685 -1.000000 +106686 -1.000000 +106687 -1.000000 +106691 -1.000000 +106692 -1.000000 +106693 -1.000000 +106694 -1.000000 +106695 -1.000000 +106696 -1.000000 +106697 -1.000000 +106698 -1.000000 +106700 -1.000000 +106701 -1.000000 +106703 -1.000000 +106704 -1.000000 +106705 -1.000000 +106706 -1.000000 +106707 -1.000000 +106708 -1.000000 +106709 -1.000000 +106710 -1.000000 +106711 -1.000000 +106712 -1.000000 +106713 -1.000000 +106714 -1.000000 +106715 -1.000000 +106718 -1.000000 +106719 -1.000000 +106720 -1.000000 +106724 -1.000000 +106725 -1.000000 +106726 -1.000000 +106728 -1.000000 +106732 -1.000000 +106733 -1.000000 +106736 -1.000000 +106737 -1.000000 +106739 -1.000000 +106740 -1.000000 +106742 -1.000000 +106743 -1.000000 +106744 -1.000000 +106745 -1.000000 +106746 -1.000000 +106747 -1.000000 +106748 -1.000000 +106749 -1.000000 +106750 -1.000000 +106751 -1.000000 +106752 -1.000000 +106753 -1.000000 +106754 -1.000000 +106755 -1.000000 +106756 -1.000000 +106757 -1.000000 +106758 -1.000000 +106759 -1.000000 +106762 -1.000000 +106763 -1.000000 +106764 -1.000000 +106765 -1.000000 +106766 -1.000000 +106767 -1.000000 +106769 -1.000000 +106770 -1.000000 +106771 -1.000000 +106773 -1.000000 +106774 -1.000000 +106775 -1.000000 +106776 -1.000000 +106780 -1.000000 +106781 -1.000000 +106782 -1.000000 +106783 -1.000000 +106786 -1.000000 +106787 -1.000000 +106789 -1.000000 +106790 -1.000000 +106791 -1.000000 +106792 -1.000000 +106793 -1.000000 +106794 -1.000000 +106795 -1.000000 +106796 -1.000000 +106797 -1.000000 +106798 -1.000000 +106799 -1.000000 +106800 -1.000000 +106801 -1.000000 +106802 -1.000000 +106803 -1.000000 +106804 -1.000000 +106805 -1.000000 +106806 -1.000000 +106807 -1.000000 +106808 -1.000000 +106809 -1.000000 +106810 -1.000000 +106811 -1.000000 +106812 -1.000000 +106813 -1.000000 +106814 -1.000000 +106815 -1.000000 +106816 -1.000000 +106817 -1.000000 +106820 -1.000000 +106841 -1.000000 +106845 -1.000000 +106846 -1.000000 +106847 -1.000000 +106848 -1.000000 +106849 -1.000000 +106850 -1.000000 +106852 -1.000000 +106854 -1.000000 +106856 -1.000000 +106857 -1.000000 +106858 -1.000000 +106860 -1.000000 +106878 -1.000000 +106879 -1.000000 +106880 -1.000000 +106882 -1.000000 +106884 -1.000000 +106885 -1.000000 +106888 -1.000000 +106889 -1.000000 +106890 -1.000000 +106891 -1.000000 +106893 -1.000000 +106894 -1.000000 +106896 -1.000000 +106897 -1.000000 +106900 -1.000000 +106903 -1.000000 +106909 -1.000000 +106910 -1.000000 +106912 -1.000000 +106913 -1.000000 +106916 -1.000000 +106918 -1.000000 +106919 -1.000000 +106921 -1.000000 +106927 -1.000000 +106929 -1.000000 +106930 -1.000000 +106931 -1.000000 +106932 -1.000000 +106933 -1.000000 +106934 -1.000000 +106935 -1.000000 +106936 -1.000000 +106938 -1.000000 +106939 -1.000000 +106940 -1.000000 +106941 -1.000000 +106942 -1.000000 +106946 -1.000000 +106947 -1.000000 +106949 -1.000000 +106950 -1.000000 +106951 -1.000000 +106955 -1.000000 +106959 -1.000000 +106960 -1.000000 +106962 -1.000000 +106963 -1.000000 +106964 -1.000000 +106965 -1.000000 +106967 -1.000000 +106968 -1.000000 +106969 -1.000000 +106970 -1.000000 +106971 -1.000000 +106972 -1.000000 +106973 -1.000000 +106974 -1.000000 +106975 -1.000000 +106976 -1.000000 +106977 -1.000000 +106979 -1.000000 +106982 -1.000000 +106983 -1.000000 +106986 -1.000000 +106988 -1.000000 +106989 -1.000000 +106992 -1.000000 +106993 -1.000000 +106997 -1.000000 +106999 -1.000000 +107001 -1.000000 +107083 -1.000000 +107089 -1.000000 +107090 -1.000000 +107093 -1.000000 +107099 -1.000000 +107100 -1.000000 +107101 -1.000000 +107102 -1.000000 +107103 -1.000000 +107104 -1.000000 +107105 -1.000000 +107108 -1.000000 +107109 -1.000000 +107110 -1.000000 +107112 -1.000000 +107113 -1.000000 +107114 -1.000000 +107116 -1.000000 +107117 -1.000000 +107118 -1.000000 +107119 -1.000000 +107120 -1.000000 +107121 -1.000000 +107122 -1.000000 +107123 -1.000000 +107124 -1.000000 +107127 -1.000000 +107128 -1.000000 +107129 -1.000000 +107132 -1.000000 +107133 -1.000000 +107134 -1.000000 +107135 -1.000000 +107136 -1.000000 +107137 -1.000000 +107138 -1.000000 +107139 -1.000000 +107141 -1.000000 +107143 -1.000000 +107144 -1.000000 +107145 -1.000000 +107146 -1.000000 +107147 -1.000000 +107148 -1.000000 +107149 -1.000000 +107154 -1.000000 +107155 -1.000000 +107156 -1.000000 +107157 -1.000000 +107158 -1.000000 +107159 -1.000000 +107160 -1.000000 +107161 -1.000000 +107162 -1.000000 +107163 -1.000000 +107164 -1.000000 +107165 -1.000000 +107166 -1.000000 +107167 -1.000000 +107168 -1.000000 +107169 -1.000000 +107170 -1.000000 +107171 -1.000000 +107172 -1.000000 +107173 -1.000000 +107175 -1.000000 +107176 -1.000000 +107177 -1.000000 +107180 -1.000000 +107183 -1.000000 +107187 -1.000000 +107188 -1.000000 +107191 -1.000000 +107195 -1.000000 +107197 -1.000000 +107199 -1.000000 +107200 -1.000000 +107201 -1.000000 +107205 -1.000000 +107208 -1.000000 +107210 -1.000000 +107211 -1.000000 +107212 -1.000000 +107213 -1.000000 +107214 -1.000000 +107215 -1.000000 +107216 -1.000000 +107217 -1.000000 +107218 -1.000000 +107220 -1.000000 +107221 -1.000000 +107222 -1.000000 +107223 -1.000000 +107224 -1.000000 +107226 -1.000000 +107228 -1.000000 +107229 -1.000000 +107230 -1.000000 +107231 -1.000000 +107232 -1.000000 +107235 -1.000000 +107236 -1.000000 +107237 -1.000000 +107238 -1.000000 +107239 -1.000000 +107240 -1.000000 +107242 -1.000000 +107243 -1.000000 +107244 -1.000000 +107245 -1.000000 +107248 -1.000000 +107249 -1.000000 +107252 -1.000000 +107253 -1.000000 +107254 -1.000000 +107255 -1.000000 +107256 -1.000000 +107261 -1.000000 +107262 -1.000000 +107287 -1.000000 +107296 -1.000000 +107297 -1.000000 +107301 -1.000000 +107307 -1.000000 +107308 -1.000000 +107309 -1.000000 +107310 -1.000000 +107311 -1.000000 +107312 -1.000000 +107325 -1.000000 +107327 -1.000000 +107330 -1.000000 +107331 -1.000000 +107332 -1.000000 +107333 -1.000000 +107334 -1.000000 +107336 -1.000000 +107337 -1.000000 +107347 -1.000000 +107362 -1.000000 +107364 -1.000000 +107376 -1.000000 +107377 -1.000000 +107379 -1.000000 +107380 -1.000000 +107382 -1.000000 +107383 -1.000000 +107384 -1.000000 +107385 -1.000000 +107386 -1.000000 +107387 -1.000000 +107388 -1.000000 +107389 -1.000000 +107390 -1.000000 +107392 -1.000000 +107393 -1.000000 +107400 -1.000000 +107406 -1.000000 +107412 -1.000000 +107413 -1.000000 +107414 -1.000000 +107416 -1.000000 +107420 -1.000000 +107423 -1.000000 +107429 -1.000000 +107434 -1.000000 +107436 -1.000000 +107437 -1.000000 +107438 -1.000000 +107439 -1.000000 +107440 -1.000000 +107441 -1.000000 +107442 -1.000000 +107443 -1.000000 +107444 -1.000000 +107446 -1.000000 +107447 -1.000000 +107449 -1.000000 +107450 -1.000000 +107451 -1.000000 +107452 -1.000000 +107453 -1.000000 +107455 -1.000000 +107456 -1.000000 +107458 -1.000000 +107459 -1.000000 +107466 -1.000000 +107467 -1.000000 +107469 -1.000000 +107470 -1.000000 +107471 -1.000000 +107473 -1.000000 +107474 -1.000000 +107475 -1.000000 +107476 -1.000000 +107477 -1.000000 +107478 -1.000000 +107480 -1.000000 +107482 -1.000000 +107483 -1.000000 +107484 -1.000000 +107485 -1.000000 +107487 -1.000000 +107488 -1.000000 +107489 -1.000000 +107490 -1.000000 +107491 -1.000000 +107492 -1.000000 +107497 -1.000000 +107501 -1.000000 +107502 -1.000000 +107503 -1.000000 +107504 -1.000000 +107505 -1.000000 +107506 -1.000000 +107507 -1.000000 +107508 -1.000000 +107510 -1.000000 +107511 -1.000000 +107512 -1.000000 +107514 -1.000000 +107517 -1.000000 +107519 -1.000000 +107521 -1.000000 +107522 -1.000000 +107524 -1.000000 +107525 -1.000000 +107529 -1.000000 +107535 -1.000000 +107537 -1.000000 +107538 -1.000000 +107544 -1.000000 +107557 -1.000000 +107560 -1.000000 +107563 -1.000000 +107568 -1.000000 +107569 -1.000000 +107570 -1.000000 +107571 -1.000000 +107572 -1.000000 +107573 -1.000000 +107574 -1.000000 +107575 -1.000000 +107576 -1.000000 +107577 -1.000000 +107583 -1.000000 +107584 -1.000000 +107586 -1.000000 +107594 -1.000000 +107599 -1.000000 +107601 -1.000000 +107602 -1.000000 +107603 -1.000000 +107605 -1.000000 +107606 -1.000000 +107607 -1.000000 +107609 -1.000000 +107610 -1.000000 +107630 -1.000000 +107646 -1.000000 +107647 -1.000000 +107655 -1.000000 +107656 -1.000000 +107665 -1.000000 +107666 -1.000000 +107673 -1.000000 +107708 -1.000000 +107711 -1.000000 +107712 -1.000000 +107713 -1.000000 +107714 -1.000000 +107715 -1.000000 +107716 -1.000000 +107717 -1.000000 +107718 -1.000000 +107719 -1.000000 +107720 -1.000000 +107721 -1.000000 +107722 -1.000000 +107723 -1.000000 +107725 -1.000000 +107726 -1.000000 +107727 -1.000000 +107731 -1.000000 +107734 -1.000000 +107735 -1.000000 +107737 -1.000000 +107738 -1.000000 +107739 -1.000000 +107749 -1.000000 +107750 -1.000000 +107757 -1.000000 +107759 -1.000000 +107761 -1.000000 +107763 -1.000000 +107764 -1.000000 +107767 -1.000000 +107768 -1.000000 +107769 -1.000000 +107770 -1.000000 +107778 -1.000000 +107783 -1.000000 +107794 -1.000000 +107795 -1.000000 +107796 -1.000000 +107797 -1.000000 +107798 -1.000000 +107807 -1.000000 +107808 -1.000000 +107809 -1.000000 +107810 -1.000000 +107811 -1.000000 +107812 -1.000000 +107813 -1.000000 +107814 -1.000000 +107816 -1.000000 +107837 -1.000000 +107839 -1.000000 +107842 -1.000000 +107849 -1.000000 +107858 -1.000000 +108571 -1.000000 +108572 -1.000000 +108691 -1.000000 +108692 -1.000000 +108693 -1.000000 +108694 -1.000000 +108699 -1.000000 +108700 -1.000000 +108701 -1.000000 +108702 -1.000000 +108704 -1.000000 +108713 -1.000000 +108716 -1.000000 +108718 -1.000000 +108719 -1.000000 +108722 -1.000000 +108725 -1.000000 +108727 -1.000000 +108729 -1.000000 +108730 -1.000000 +108731 -1.000000 +108733 -1.000000 +108744 -1.000000 +108745 -1.000000 +108746 -1.000000 +108747 -1.000000 +108750 -1.000000 +108753 -1.000000 +108754 -1.000000 +108756 -1.000000 +108757 -1.000000 +108759 -1.000000 +108763 -1.000000 +108765 -1.000000 +108768 -1.000000 +108769 -1.000000 +108775 -1.000000 +108780 -1.000000 +108782 -1.000000 +108783 -1.000000 +108785 -1.000000 +108786 -1.000000 +108817 -1.000000 +108871 -1.000000 +108873 -1.000000 +108875 -1.000000 +108876 -1.000000 +108878 -1.000000 +108879 -1.000000 +108881 -1.000000 +108901 -1.000000 +108902 -1.000000 +108903 -1.000000 +108908 -1.000000 +108910 -1.000000 +108912 -1.000000 +108913 -1.000000 +108915 -1.000000 +108916 -1.000000 +108917 -1.000000 +108918 -1.000000 +108921 -1.000000 +108947 -1.000000 +108957 -1.000000 +108958 -1.000000 +108969 -1.000000 +108973 -1.000000 +108974 -1.000000 +108975 -1.000000 +108976 -1.000000 +108977 -1.000000 +108978 -1.000000 +108981 -1.000000 +109010 -1.000000 +109011 -1.000000 +109012 -1.000000 +109013 -1.000000 +109016 -1.000000 +109017 -1.000000 +109018 -1.000000 +109019 -1.000000 +109020 -1.000000 +109021 -1.000000 +109023 -1.000000 +109026 -1.000000 +109030 -1.000000 +109031 -1.000000 +109044 -1.000000 +109047 -1.000000 +109048 -1.000000 +109050 -1.000000 +109054 -1.000000 +109056 -1.000000 +109058 -1.000000 +109060 -1.000000 +109062 -1.000000 +109084 -1.000000 +109085 -1.000000 +109086 -1.000000 +109089 -1.000000 +109092 -1.000000 +109094 -1.000000 +109099 -1.000000 +109100 -1.000000 +109101 -1.000000 +109103 -1.000000 +109104 -1.000000 +109117 -1.000000 +109119 -1.000000 +109121 -1.000000 +109122 -1.000000 +109123 -1.000000 +109124 -1.000000 +109125 -1.000000 +109126 -1.000000 +109127 -1.000000 +109128 -1.000000 +109130 -1.000000 +109132 -1.000000 +109133 -1.000000 +109134 -1.000000 +109135 -1.000000 +109136 -1.000000 +109137 -1.000000 +109139 -1.000000 +109141 -1.000000 +109142 -1.000000 +109143 -1.000000 +109144 -1.000000 +109145 -1.000000 +109146 -1.000000 +109147 -1.000000 +109148 -1.000000 +109149 -1.000000 +109150 -1.000000 +109151 -1.000000 +109152 -1.000000 +109153 -1.000000 +109154 -1.000000 +109155 -1.000000 +109156 -1.000000 +109157 -1.000000 +109158 -1.000000 +109159 -1.000000 +109161 -1.000000 +109163 -1.000000 +109164 -1.000000 +109172 -1.000000 +109178 -1.000000 +109183 -1.000000 +109192 -1.000000 +109194 -1.000000 +109195 -1.000000 +109196 -1.000000 +109197 -1.000000 +109198 -1.000000 +109199 -1.000000 +109200 -1.000000 +109201 -1.000000 +109202 -1.000000 +109203 -1.000000 +109204 -1.000000 +109205 -1.000000 +109213 -1.000000 +109217 -1.000000 +109219 -1.000000 +109220 -1.000000 +109221 -1.000000 +109222 -1.000000 +109223 -1.000000 +109224 -1.000000 +109225 -1.000000 +109226 -1.000000 +109228 -1.000000 +109229 -1.000000 +109230 -1.000000 +109231 -1.000000 +109232 -1.000000 +109233 -1.000000 +109234 -1.000000 +109237 -1.000000 +109238 -1.000000 +109241 -1.000000 +109242 -1.000000 +109244 -1.000000 +109245 -1.000000 +109246 -1.000000 +109247 -1.000000 +109256 -1.000000 +109257 -1.000000 +109258 -1.000000 +109262 -1.000000 +109264 -1.000000 +109269 -1.000000 +109270 -1.000000 +109287 -1.000000 +109290 -1.000000 +109291 -1.000000 +109292 -1.000000 +109293 -1.000000 +109294 -1.000000 +109295 -1.000000 +109296 -1.000000 +109297 -1.000000 +109299 -1.000000 +109302 -1.000000 +109303 -1.000000 +109304 -1.000000 +109305 -1.000000 +109306 -1.000000 +109307 -1.000000 +109308 -1.000000 +109453 -1.000000 +109455 -1.000000 +109456 -1.000000 +109457 -1.000000 +109458 -1.000000 +109462 -1.000000 +109463 -1.000000 +109464 -1.000000 +109465 -1.000000 +109466 -1.000000 +109467 -1.000000 +109468 -1.000000 +109469 -1.000000 +109475 -1.000000 +109476 -1.000000 +109479 -1.000000 +109480 -1.000000 +109484 -1.000000 +109496 -1.000000 +109497 -1.000000 +109498 -1.000000 +109499 -1.000000 +109522 -1.000000 +109523 -1.000000 +109547 -1.000000 +109551 -1.000000 +109552 -1.000000 +109554 -1.000000 +109555 -1.000000 +109557 -1.000000 +109561 -1.000000 +109565 -1.000000 +109566 -1.000000 +109567 -1.000000 +109568 -1.000000 +109569 -1.000000 +109570 -1.000000 +109571 -1.000000 +109573 -1.000000 +109574 -1.000000 +109575 -1.000000 +109577 -1.000000 +109578 -1.000000 +109579 -1.000000 +109580 -1.000000 +109581 -1.000000 +109582 -1.000000 +109583 -1.000000 +109585 -1.000000 +109586 -1.000000 +109587 -1.000000 +109603 -1.000000 +109604 -1.000000 +109605 -1.000000 +109606 -1.000000 +109608 -1.000000 +109609 -1.000000 +109611 -1.000000 +109613 -1.000000 +109614 -1.000000 +109615 -1.000000 +109616 -1.000000 +109618 -1.000000 +109619 -1.000000 +109620 -1.000000 +109621 -1.000000 +109622 -1.000000 +109623 -1.000000 +109624 -1.000000 +109625 -1.000000 +109628 -1.000000 +109634 -1.000000 +109635 -1.000000 +109636 -1.000000 +109637 -1.000000 +109638 -1.000000 +109639 -1.000000 +109640 -1.000000 +109641 -1.000000 +109642 -1.000000 +109643 -1.000000 +109644 -1.000000 +109645 -1.000000 +109646 -1.000000 +109647 -1.000000 +109648 -1.000000 +109649 -1.000000 +109650 -1.000000 +109651 -1.000000 +109652 -1.000000 +109653 -1.000000 +109654 -1.000000 +109655 -1.000000 +109656 -1.000000 +109657 -1.000000 +109658 -1.000000 +109659 -1.000000 +109660 -1.000000 +109661 -1.000000 +109666 -1.000000 +109667 -1.000000 +109668 -1.000000 +109669 -1.000000 +109670 -1.000000 +109672 -1.000000 +109673 -1.000000 +109684 -1.000000 +109685 -1.000000 +109702 -1.000000 +109714 -1.000000 +109721 -1.000000 +109730 -1.000000 +109736 -1.000000 +109738 -1.000000 +109739 -1.000000 +109741 -1.000000 +109742 -1.000000 +109743 -1.000000 +109744 -1.000000 +109745 -1.000000 +109746 -1.000000 +109750 -1.000000 +109751 -1.000000 +109752 -1.000000 +109753 -1.000000 +109754 -1.000000 +109755 -1.000000 +109756 -1.000000 +109757 -1.000000 +109758 -1.000000 +109759 -1.000000 +109760 -1.000000 +109761 -1.000000 +109762 -1.000000 +109763 -1.000000 +109764 -1.000000 +109765 -1.000000 +109766 -1.000000 +109767 -1.000000 +109768 -1.000000 +109769 -1.000000 +109772 -1.000000 +109773 -1.000000 +109774 -1.000000 +109776 -1.000000 +109777 -1.000000 +109778 -1.000000 +109779 -1.000000 +109782 -1.000000 +109783 -1.000000 +109784 -1.000000 +109785 -1.000000 +109789 -1.000000 +109790 -1.000000 +109792 -1.000000 +109794 -1.000000 +109805 -1.000000 +109830 -1.000000 +109864 -1.000000 +109866 -1.000000 +109867 -1.000000 +109868 -1.000000 +109869 -1.000000 +109870 -1.000000 +109871 -1.000000 +109872 -1.000000 +109874 -1.000000 +109875 -1.000000 +109877 -1.000000 +109878 -1.000000 +109881 -1.000000 +109884 -1.000000 +109885 -1.000000 +109890 -1.000000 +109891 -1.000000 +109892 -1.000000 +109899 -1.000000 +109900 -1.000000 +109901 -1.000000 +109902 -1.000000 +109906 -1.000000 +109907 -1.000000 +109908 -1.000000 +109909 -1.000000 +109912 -1.000000 +109913 -1.000000 +109919 -1.000000 +109920 -1.000000 +109922 -1.000000 +109923 -1.000000 +109927 -1.000000 +109929 -1.000000 +109935 -1.000000 +109937 -1.000000 +109939 -1.000000 +109942 -1.000000 +109945 -1.000000 +109946 -1.000000 +109947 -1.000000 +109948 -1.000000 +109949 -1.000000 +109950 -1.000000 +109951 -1.000000 +109952 -1.000000 +109953 -1.000000 +109954 -1.000000 +109955 -1.000000 +109956 -1.000000 +109957 -1.000000 +109958 -1.000000 +109959 -1.000000 +109960 -1.000000 +109961 -1.000000 +109962 -1.000000 +109967 -1.000000 +109972 -1.000000 +109981 -1.000000 +109982 -1.000000 +109983 -1.000000 +109984 -1.000000 +109986 -1.000000 +109987 -1.000000 +109988 -1.000000 +109989 -1.000000 +109990 -1.000000 +109991 -1.000000 +109992 -1.000000 +109996 -1.000000 +110000 -1.000000 +110001 -1.000000 +110002 -1.000000 +110003 -1.000000 +110004 -1.000000 +110005 -1.000000 +110006 -1.000000 +110008 -1.000000 +110009 -1.000000 +110010 -1.000000 +110011 -1.000000 +110012 -1.000000 +110013 -1.000000 +110015 -1.000000 +110017 -1.000000 +110018 -1.000000 +110019 -1.000000 +110020 -1.000000 +110021 -1.000000 +110024 -1.000000 +110027 -1.000000 +110030 -1.000000 +110035 -1.000000 +110037 -1.000000 +110038 -1.000000 +110040 -1.000000 +110042 -1.000000 +110043 -1.000000 +110048 -1.000000 +110051 -1.000000 +110052 -1.000000 +110056 -1.000000 +110059 -1.000000 +110062 -1.000000 +110063 -1.000000 +110064 -1.000000 +110068 -1.000000 +110069 -1.000000 +110070 -1.000000 +110071 -1.000000 +110072 -1.000000 +110074 -1.000000 +110075 -1.000000 +110076 -1.000000 +110077 -1.000000 +110080 -1.000000 +110081 -1.000000 +110082 -1.000000 +110093 -1.000000 +110094 -1.000000 +110099 -1.000000 +110102 -1.000000 +110103 -1.000000 +110104 -1.000000 +110110 -1.000000 +110126 -1.000000 +110132 -1.000000 +110133 -1.000000 +110145 -1.000000 +110155 -1.000000 +110157 -1.000000 +110158 -1.000000 +110163 -1.000000 +110170 -1.000000 +110171 -1.000000 +110172 -1.000000 +110176 -1.000000 +110177 -1.000000 +110178 -1.000000 +110183 -1.000000 +110184 -1.000000 +110185 -1.000000 +110186 -1.000000 +110187 -1.000000 +110188 -1.000000 +110198 -1.000000 +110199 -1.000000 +110200 -1.000000 +110201 -1.000000 +110202 -1.000000 +110203 -1.000000 +110204 -1.000000 +110205 -1.000000 +110207 -1.000000 +110220 -1.000000 +110223 -1.000000 +110224 -1.000000 +110238 -1.000000 +110239 -1.000000 +110240 -1.000000 +110242 -1.000000 +110243 -1.000000 +110244 -1.000000 +110288 -1.000000 +110293 -1.000000 +110294 -1.000000 +110297 -1.000000 +110298 -1.000000 +110299 -1.000000 +110300 -1.000000 +110302 -1.000000 +110305 -1.000000 +110306 -1.000000 +110307 -1.000000 +110308 -1.000000 +110309 -1.000000 +110342 -1.000000 +110343 -1.000000 +110346 -1.000000 +110348 -1.000000 +110349 -1.000000 +110350 -1.000000 +110351 -1.000000 +110352 -1.000000 +110353 -1.000000 +110354 -1.000000 +110355 -1.000000 +110356 -1.000000 +110357 -1.000000 +110358 -1.000000 +110359 -1.000000 +110360 -1.000000 +110362 -1.000000 +110363 -1.000000 +110364 -1.000000 +110371 -1.000000 +110372 -1.000000 +110376 -1.000000 +110378 -1.000000 +110379 -1.000000 +110380 -1.000000 +110381 -1.000000 +110382 -1.000000 +110383 -1.000000 +110385 -1.000000 +110386 -1.000000 +110387 -1.000000 +110388 -1.000000 +110389 -1.000000 +110390 -1.000000 +110391 -1.000000 +110394 -1.000000 +110397 -1.000000 +110399 -1.000000 +110400 -1.000000 +110401 -1.000000 +110402 -1.000000 +110403 -1.000000 +110404 -1.000000 +110406 -1.000000 +110408 -1.000000 +110409 -1.000000 +110412 -1.000000 +110414 -1.000000 +110416 -1.000000 +110419 -1.000000 +110428 -1.000000 +110430 -1.000000 +110431 -1.000000 +110432 -1.000000 +110433 -1.000000 +110434 -1.000000 +110435 -1.000000 +110437 -1.000000 +110444 -1.000000 +110445 -1.000000 +110446 -1.000000 +110447 -1.000000 +110448 -1.000000 +110449 -1.000000 +110450 -1.000000 +110451 -1.000000 +110452 -1.000000 +110453 -1.000000 +110454 -1.000000 +110455 -1.000000 +110456 -1.000000 +110457 -1.000000 +110458 -1.000000 +110468 -1.000000 +110472 -1.000000 +110473 -1.000000 +110526 -1.000000 +110527 -1.000000 +110528 -1.000000 +110539 -1.000000 +110545 -1.000000 +110549 -1.000000 +110550 -1.000000 +110551 -1.000000 +110552 -1.000000 +110553 -1.000000 +110554 -1.000000 +110558 -1.000000 +110560 -1.000000 +110562 -1.000000 +110563 -1.000000 +110565 -1.000000 +110566 -1.000000 +110567 -1.000000 +110568 -1.000000 +110569 -1.000000 +110570 -1.000000 +110572 -1.000000 +110573 -1.000000 +110576 -1.000000 +110577 -1.000000 +110578 -1.000000 +110581 -1.000000 +110584 -1.000000 +110586 -1.000000 +110588 -1.000000 +110589 -1.000000 +110590 -1.000000 +110591 -1.000000 +110592 -1.000000 +110593 -1.000000 +110594 -1.000000 +110595 -1.000000 +110596 -1.000000 +110597 -1.000000 +110598 -1.000000 +110599 -1.000000 +110600 -1.000000 +110601 -1.000000 +110602 -1.000000 +110603 -1.000000 +110605 -1.000000 +110606 -1.000000 +110607 -1.000000 +110608 -1.000000 +110609 -1.000000 +110610 -1.000000 +110611 -1.000000 +110612 -1.000000 +110613 -1.000000 +110614 -1.000000 +110616 -1.000000 +110617 -1.000000 +110618 -1.000000 +110622 -1.000000 +110642 -1.000000 +110646 -1.000000 +110647 -1.000000 +110651 -1.000000 +110653 -1.000000 +110655 -1.000000 +110657 -1.000000 +110659 -1.000000 +110662 -1.000000 +110663 -1.000000 +110665 -1.000000 +110666 -1.000000 +110667 -1.000000 +110668 -1.000000 +110672 -1.000000 +110674 -1.000000 +110677 -1.000000 +110678 -1.000000 +110679 -1.000000 +110681 -1.000000 +110683 -1.000000 +110684 -1.000000 +110685 -1.000000 +110688 -1.000000 +110689 -1.000000 +110692 -1.000000 +110693 -1.000000 +110694 -1.000000 +110695 -1.000000 +110698 -1.000000 +110705 -1.000000 +110708 -1.000000 +110711 -1.000000 +110714 -1.000000 +110743 -1.000000 +110745 -1.000000 +110746 -1.000000 +110747 -1.000000 +110748 -1.000000 +110750 -1.000000 +110751 -1.000000 +110753 -1.000000 +110754 -1.000000 +110755 -1.000000 +110756 -1.000000 +110758 -1.000000 +110759 -1.000000 +110760 -1.000000 +110761 -1.000000 +110762 -1.000000 +110763 -1.000000 +110765 -1.000000 +110769 -1.000000 +110770 -1.000000 +110771 -1.000000 +110773 -1.000000 +110774 -1.000000 +110775 -1.000000 +110780 -1.000000 +110785 -1.000000 +110787 -1.000000 +110789 -1.000000 +110790 -1.000000 +110792 -1.000000 +110794 -1.000000 +110801 -1.000000 +110808 -1.000000 +110811 -1.000000 +110812 -1.000000 +110818 -1.000000 +110821 -1.000000 +110824 -1.000000 +110825 -1.000000 +110832 -1.000000 +110833 -1.000000 +110835 -1.000000 +110837 -1.000000 +110838 -1.000000 +110840 -1.000000 +110841 -1.000000 +110842 -1.000000 +110844 -1.000000 +110846 -1.000000 +110847 -1.000000 +110848 -1.000000 +110849 -1.000000 +110850 -1.000000 +110851 -1.000000 +110852 -1.000000 +110853 -1.000000 +110854 -1.000000 +110855 -1.000000 +110856 -1.000000 +110857 -1.000000 +110858 -1.000000 +110867 -1.000000 +110868 -1.000000 +110870 -1.000000 +110872 -1.000000 +110873 -1.000000 +110874 -1.000000 +110875 -1.000000 +110876 -1.000000 +110878 -1.000000 +110880 -1.000000 +110881 -1.000000 +110882 -1.000000 +110883 -1.000000 +110885 -1.000000 +110887 -1.000000 +110888 -1.000000 +110889 -1.000000 +110890 -1.000000 +110892 -1.000000 +110900 -1.000000 +110902 -1.000000 +110906 -1.000000 +110907 -1.000000 +110917 -1.000000 +110918 -1.000000 +110919 -1.000000 +111018 -1.000000 +111051 -1.000000 +111052 -1.000000 +111053 -1.000000 +111058 -1.000000 +111061 -1.000000 +111068 -1.000000 +111069 -1.000000 +111072 -1.000000 +111074 -1.000000 +111075 -1.000000 +111076 -1.000000 +111077 -1.000000 +111078 -1.000000 +111091 -1.000000 +111092 -1.000000 +111113 -1.000000 +111118 -1.000000 +111125 -1.000000 +111139 -1.000000 +111146 -1.000000 +111158 -1.000000 +111188 -1.000000 +111191 -1.000000 +111193 -1.000000 +111195 -1.000000 +111196 -1.000000 +111197 -1.000000 +111198 -1.000000 +111199 -1.000000 +111200 -1.000000 +111201 -1.000000 +111202 -1.000000 +111203 -1.000000 +111205 -1.000000 +111206 -1.000000 +111207 -1.000000 +111208 -1.000000 +111209 -1.000000 +111210 -1.000000 +111212 -1.000000 +111214 -1.000000 +111215 -1.000000 +111216 -1.000000 +111217 -1.000000 +111218 -1.000000 +111219 -1.000000 +111221 -1.000000 +111224 -1.000000 +111226 -1.000000 +111228 -1.000000 +111229 -1.000000 +111231 -1.000000 +111234 -1.000000 +111235 -1.000000 +111236 -1.000000 +111238 -1.000000 +111248 -1.000000 +111249 -1.000000 +111250 -1.000000 +111251 -1.000000 +111252 -1.000000 +111255 -1.000000 +111256 -1.000000 +111257 -1.000000 +111258 -1.000000 +111262 -1.000000 +111263 -1.000000 +111271 -1.000000 +111273 -1.000000 +111286 -1.000000 +111287 -1.000000 +111292 -1.000000 +111295 -1.000000 +111296 -1.000000 +111297 -1.000000 +111298 -1.000000 +111299 -1.000000 +111300 -1.000000 +111301 -1.000000 +111302 -1.000000 +111303 -1.000000 +111304 -1.000000 +111318 -1.000000 +111319 -1.000000 +111320 -1.000000 +111322 -1.000000 +111323 -1.000000 +111324 -1.000000 +111325 -1.000000 +111326 -1.000000 +111327 -1.000000 +111328 -1.000000 +111329 -1.000000 +111330 -1.000000 +111332 -1.000000 +111333 -1.000000 +111334 -1.000000 +111335 -1.000000 +111341 -1.000000 +111347 -1.000000 +111357 -1.000000 +111362 -1.000000 +111365 -1.000000 +111367 -1.000000 +111373 -1.000000 +111378 -1.000000 +111379 -1.000000 +111393 -1.000000 +111394 -1.000000 +111396 -1.000000 +111397 -1.000000 +111398 -1.000000 +111399 -1.000000 +111400 -1.000000 +111401 -1.000000 +111404 -1.000000 +111406 -1.000000 +111407 -1.000000 +111408 -1.000000 +111409 -1.000000 +111410 -1.000000 +111433 -1.000000 +111454 -1.000000 +111455 -1.000000 +111456 -1.000000 +111457 -1.000000 +111458 -1.000000 +111459 -1.000000 +111460 -1.000000 +111461 -1.000000 +111462 -1.000000 +111463 -1.000000 +111464 -1.000000 +111465 -1.000000 +111466 -1.000000 +111467 -1.000000 +111468 -1.000000 +111469 -1.000000 +111470 -1.000000 +111520 -1.000000 +111572 -1.000000 +111573 -1.000000 +111576 -1.000000 +111577 -1.000000 +111578 -1.000000 +111579 -1.000000 +111580 -1.000000 +111581 -1.000000 +111585 -1.000000 +111587 -1.000000 +111588 -1.000000 +111589 -1.000000 +111590 -1.000000 +111591 -1.000000 +111592 -1.000000 +111593 -1.000000 +111598 -1.000000 +111602 -1.000000 +111603 -1.000000 +111604 -1.000000 +111605 -1.000000 +111606 -1.000000 +111608 -1.000000 +111609 -1.000000 +111610 -1.000000 +111614 -1.000000 +111616 -1.000000 +111617 -1.000000 +111618 -1.000000 +111624 -1.000000 +111626 -1.000000 +111627 -1.000000 +111628 -1.000000 +111629 -1.000000 +111630 -1.000000 +111631 -1.000000 +111632 -1.000000 +111635 -1.000000 +111636 -1.000000 +111637 -1.000000 +111638 -1.000000 +111640 -1.000000 +111641 -1.000000 +111643 -1.000000 +111644 -1.000000 +111645 -1.000000 +111647 -1.000000 +111648 -1.000000 +111649 -1.000000 +111651 -1.000000 +111662 -1.000000 +111663 -1.000000 +111664 -1.000000 +111665 -1.000000 +111666 -1.000000 +111667 -1.000000 +111670 -1.000000 +111672 -1.000000 +111673 -1.000000 +111676 -1.000000 +111695 -1.000000 +111696 -1.000000 +111697 -1.000000 +111698 -1.000000 +111699 -1.000000 +111704 -1.000000 +111705 -1.000000 +111706 -1.000000 +111707 -1.000000 +111708 -1.000000 +111709 -1.000000 +111710 -1.000000 +111711 -1.000000 +111712 -1.000000 +111713 -1.000000 +111714 -1.000000 +111715 -1.000000 +111716 -1.000000 +111721 -1.000000 +111725 -1.000000 +111726 -1.000000 +111727 -1.000000 +111744 -1.000000 +111745 -1.000000 +111750 -1.000000 +111752 -1.000000 +111753 -1.000000 +111755 -1.000000 +111756 -1.000000 +111761 -1.000000 +111762 -1.000000 +111763 -1.000000 +111764 -1.000000 +111766 -1.000000 +111770 -1.000000 +111774 -1.000000 +111777 -1.000000 +111778 -1.000000 +111798 -1.000000 +111801 -1.000000 +111805 -1.000000 +111807 -1.000000 +111808 -1.000000 +111810 -1.000000 +111811 -1.000000 +111813 -1.000000 +111856 -1.000000 +111857 -1.000000 +111874 -1.000000 +111876 -1.000000 +111894 -1.000000 +111895 -1.000000 +111896 -1.000000 +112031 -1.000000 +112081 -1.000000 +112082 -1.000000 +112085 -1.000000 +112086 -1.000000 +112087 -1.000000 +112088 -1.000000 +112089 -1.000000 +112090 -1.000000 +112091 -1.000000 +112093 -1.000000 +112094 -1.000000 +112095 -1.000000 +112096 -1.000000 +112097 -1.000000 +112098 -1.000000 +112099 -1.000000 +112100 -1.000000 +112101 -1.000000 +112102 -1.000000 +112104 -1.000000 +112178 -1.000000 +112181 -1.000000 +112183 -1.000000 +112188 -1.000000 +112189 -1.000000 +112190 -1.000000 +112193 -1.000000 +112194 -1.000000 +112205 -1.000000 +112206 -1.000000 +112207 -1.000000 +112208 -1.000000 +112209 -1.000000 +112210 -1.000000 +112212 -1.000000 +112213 -1.000000 +112214 -1.000000 +112215 -1.000000 +112216 -1.000000 +112217 -1.000000 +112218 -1.000000 +112219 -1.000000 +112220 -1.000000 +112221 -1.000000 +112222 -1.000000 +112223 -1.000000 +112224 -1.000000 +112236 -1.000000 +112237 -1.000000 +112238 -1.000000 +112240 -1.000000 +112243 -1.000000 +112244 -1.000000 +112245 -1.000000 +112247 -1.000000 +112250 -1.000000 +112253 -1.000000 +112254 -1.000000 +112255 -1.000000 +112256 -1.000000 +112258 -1.000000 +112259 -1.000000 +112260 -1.000000 +112261 -1.000000 +112262 -1.000000 +112263 -1.000000 +112264 -1.000000 +112265 -1.000000 +112266 -1.000000 +112267 -1.000000 +112268 -1.000000 +112269 -1.000000 +112270 -1.000000 +112271 -1.000000 +112275 -1.000000 +112278 -1.000000 +112279 -1.000000 +112280 -1.000000 +112281 -1.000000 +112282 -1.000000 +112283 -1.000000 +112284 -1.000000 +112285 -1.000000 +112286 -1.000000 +112287 -1.000000 +112288 -1.000000 +112289 -1.000000 +112290 -1.000000 +112291 -1.000000 +112292 -1.000000 +112293 -1.000000 +112294 -1.000000 +112295 -1.000000 +112296 -1.000000 +112297 -1.000000 +112298 -1.000000 +112299 -1.000000 +112302 -1.000000 +112303 -1.000000 +112306 -1.000000 +112308 -1.000000 +112309 -1.000000 +112310 -1.000000 +112311 -1.000000 +112312 -1.000000 +112316 -1.000000 +112317 -1.000000 +112318 -1.000000 +112319 -1.000000 +112320 -1.000000 +112321 -1.000000 +112322 -1.000000 +112323 -1.000000 +112340 -1.000000 +112341 -1.000000 +112360 -1.000000 +112361 -1.000000 +112396 -1.000000 +112437 -1.000000 +112439 -1.000000 +112440 -1.000000 +112441 -1.000000 +112442 -1.000000 +112443 -1.000000 +112444 -1.000000 +112445 -1.000000 +112446 -1.000000 +112448 -1.000000 +112450 -1.000000 +112452 -1.000000 +112453 -1.000000 +112455 -1.000000 +112456 -1.000000 +112460 -1.000000 +112461 -1.000000 +112462 -1.000000 +112463 -1.000000 +112465 -1.000000 +112466 -1.000000 +112467 -1.000000 +112468 -1.000000 +112469 -1.000000 +112470 -1.000000 +112471 -1.000000 +112472 -1.000000 +112473 -1.000000 +112474 -1.000000 +112475 -1.000000 +112476 -1.000000 +112481 -1.000000 +112482 -1.000000 +112485 -1.000000 +112486 -1.000000 +112487 -1.000000 +112488 -1.000000 +112489 -1.000000 +112490 -1.000000 +112491 -1.000000 +112494 -1.000000 +112495 -1.000000 +112496 -1.000000 +112497 -1.000000 +112498 -1.000000 +112499 -1.000000 +112500 -1.000000 +112502 -1.000000 +112503 -1.000000 +112504 -1.000000 +112505 -1.000000 +112506 -1.000000 +112507 -1.000000 +112508 -1.000000 +112509 -1.000000 +112510 -1.000000 +112511 -1.000000 +112512 -1.000000 +112514 -1.000000 +112515 -1.000000 +112519 -1.000000 +112520 -1.000000 +112530 -1.000000 +112532 -1.000000 +112536 -1.000000 +112537 -1.000000 +112548 -1.000000 +112549 -1.000000 +112550 -1.000000 +112552 -1.000000 +112553 -1.000000 +112554 -1.000000 +112555 -1.000000 +112556 -1.000000 +112557 -1.000000 +112558 -1.000000 +112559 -1.000000 +112560 -1.000000 +112561 -1.000000 +112562 -1.000000 +112565 -1.000000 +112566 -1.000000 +112573 -1.000000 +112574 -1.000000 +112575 -1.000000 +112576 -1.000000 +112577 -1.000000 +112578 -1.000000 +112579 -1.000000 +112580 -1.000000 +112581 -1.000000 +112582 -1.000000 +112583 -1.000000 +112584 -1.000000 +112587 -1.000000 +112588 -1.000000 +112591 -1.000000 +112592 -1.000000 +112593 -1.000000 +112594 -1.000000 +112595 -1.000000 +112618 -1.000000 +112619 -1.000000 +112620 -1.000000 +112621 -1.000000 +112622 -1.000000 +112623 -1.000000 +112624 -1.000000 +112625 -1.000000 +112626 -1.000000 +112628 -1.000000 +112629 -1.000000 +112630 -1.000000 +112631 -1.000000 +112632 -1.000000 +112633 -1.000000 +112634 -1.000000 +112635 -1.000000 +112636 -1.000000 +112637 -1.000000 +112638 -1.000000 +112639 -1.000000 +112640 -1.000000 +112642 -1.000000 +112643 -1.000000 +112644 -1.000000 +112645 -1.000000 +112669 -1.000000 +112670 -1.000000 +112671 -1.000000 +112676 -1.000000 +112677 -1.000000 +112681 -1.000000 +112685 -1.000000 +112694 -1.000000 +112695 -1.000000 +112698 -1.000000 +112699 -1.000000 +112756 -1.000000 +112757 -1.000000 +112758 -1.000000 +112760 -1.000000 +112761 -1.000000 +112762 -1.000000 +112763 -1.000000 +112764 -1.000000 +112765 -1.000000 +112772 -1.000000 +112775 -1.000000 +112776 -1.000000 +112777 -1.000000 +112778 -1.000000 +112779 -1.000000 +112780 -1.000000 +112781 -1.000000 +112790 -1.000000 +112791 -1.000000 +112793 -1.000000 +112797 -1.000000 +112810 -1.000000 +112812 -1.000000 +112814 -1.000000 +112815 -1.000000 +112818 -1.000000 +112827 -1.000000 +112829 -1.000000 +112832 -1.000000 +112833 -1.000000 +112834 -1.000000 +112835 -1.000000 +112839 -1.000000 +112841 -1.000000 +112842 -1.000000 +112843 -1.000000 +112844 -1.000000 +112845 -1.000000 +112846 -1.000000 +112847 -1.000000 +112848 -1.000000 +112849 -1.000000 +112850 -1.000000 +112853 -1.000000 +112854 -1.000000 +112855 -1.000000 +112859 -1.000000 +112860 -1.000000 +112861 -1.000000 +112862 -1.000000 +112866 -1.000000 +112869 -1.000000 +112871 -1.000000 +112873 -1.000000 +112874 -1.000000 +112875 -1.000000 +112876 -1.000000 +112877 -1.000000 +112878 -1.000000 +112879 -1.000000 +112880 -1.000000 +112881 -1.000000 +112882 -1.000000 +112890 -1.000000 +112894 -1.000000 +112895 -1.000000 +112896 -1.000000 +112897 -1.000000 +112898 -1.000000 +112899 -1.000000 +112900 -1.000000 +112901 -1.000000 +112902 -1.000000 +112903 -1.000000 +112904 -1.000000 +112905 -1.000000 +112906 -1.000000 +112907 -1.000000 +112908 -1.000000 +112909 -1.000000 +112910 -1.000000 +112911 -1.000000 +112912 -1.000000 +112921 -1.000000 +112935 -1.000000 +112936 -1.000000 +112967 -1.000000 +112968 -1.000000 +112970 -1.000000 +112978 -1.000000 +112979 -1.000000 +112989 -1.000000 +112990 -1.000000 +112991 -1.000000 +112992 -1.000000 +112993 -1.000000 +112994 -1.000000 +112995 -1.000000 +112996 -1.000000 +112997 -1.000000 +112998 -1.000000 +113000 -1.000000 +113001 -1.000000 +113003 -1.000000 +113004 -1.000000 +113005 -1.000000 +113006 -1.000000 +113007 -1.000000 +113010 -1.000000 +113013 -1.000000 +113014 -1.000000 +113015 -1.000000 +113016 -1.000000 +113017 -1.000000 +113018 -1.000000 +113019 -1.000000 +113020 -1.000000 +113021 -1.000000 +113022 -1.000000 +113023 -1.000000 +113024 -1.000000 +113025 -1.000000 +113026 -1.000000 +113027 -1.000000 +113028 -1.000000 +113029 -1.000000 +113030 -1.000000 +113031 -1.000000 +113032 -1.000000 +113033 -1.000000 +113034 -1.000000 +113035 -1.000000 +113037 -1.000000 +113038 -1.000000 +113039 -1.000000 +113040 -1.000000 +113041 -1.000000 +113042 -1.000000 +113043 -1.000000 +113046 -1.000000 +113049 -1.000000 +113050 -1.000000 +113051 -1.000000 +113052 -1.000000 +113053 -1.000000 +113054 -1.000000 +113055 -1.000000 +113056 -1.000000 +113058 -1.000000 +113059 -1.000000 +113060 -1.000000 +113064 -1.000000 +113078 -1.000000 +113088 -1.000000 +113092 -1.000000 +113093 -1.000000 +113095 -1.000000 +113124 -1.000000 +113127 -1.000000 +113129 -1.000000 +113130 -1.000000 +113131 -1.000000 +113132 -1.000000 +113133 -1.000000 +113138 -1.000000 +113139 -1.000000 +113140 -1.000000 +113141 -1.000000 +113142 -1.000000 +113143 -1.000000 +113144 -1.000000 +113146 -1.000000 +113147 -1.000000 +113148 -1.000000 +113154 -1.000000 +113155 -1.000000 +113157 -1.000000 +113158 -1.000000 +113160 -1.000000 +113161 -1.000000 +113163 -1.000000 +113164 -1.000000 +113165 -1.000000 +113166 -1.000000 +113167 -1.000000 +113168 -1.000000 +113169 -1.000000 +113170 -1.000000 +113172 -1.000000 +113174 -1.000000 +113175 -1.000000 +113177 -1.000000 +113178 -1.000000 +113179 -1.000000 +113181 -1.000000 +113182 -1.000000 +113189 -1.000000 +113191 -1.000000 +113193 -1.000000 +113209 -1.000000 +113210 -1.000000 +113211 -1.000000 +113214 -1.000000 +113217 -1.000000 +113222 -1.000000 +113224 -1.000000 +113225 -1.000000 +113227 -1.000000 +113229 -1.000000 +113245 -1.000000 +113247 -1.000000 +113249 -1.000000 +113250 -1.000000 +113251 -1.000000 +113252 -1.000000 +113254 -1.000000 +113256 -1.000000 +113259 -1.000000 +113302 -1.000000 +113308 -1.000000 +113309 -1.000000 +113310 -1.000000 +113311 -1.000000 +113321 -1.000000 +113324 -1.000000 +113332 -1.000000 +113333 -1.000000 +113335 -1.000000 +113354 -1.000000 +113355 -1.000000 +113357 -1.000000 +113358 -1.000000 +113359 -1.000000 +113361 -1.000000 +113362 -1.000000 +113363 -1.000000 +113365 -1.000000 +113403 -1.000000 +113404 -1.000000 +113414 -1.000000 +113455 -1.000000 +113456 -1.000000 +113457 -1.000000 +113458 -1.000000 +113459 -1.000000 +113460 -1.000000 +113462 -1.000000 +113464 -1.000000 +113470 -1.000000 +113477 -1.000000 +113478 -1.000000 +113479 -1.000000 +113480 -1.000000 +113481 -1.000000 +113482 -1.000000 +113483 -1.000000 +113484 -1.000000 +113485 -1.000000 +113486 -1.000000 +113487 -1.000000 +113488 -1.000000 +113489 -1.000000 +113490 -1.000000 +113491 -1.000000 +113492 -1.000000 +113493 -1.000000 +113494 -1.000000 +113496 -1.000000 +113497 -1.000000 +113499 -1.000000 +113500 -1.000000 +113501 -1.000000 +113502 -1.000000 +113504 -1.000000 +113505 -1.000000 +113506 -1.000000 +113507 -1.000000 +113508 -1.000000 +113509 -1.000000 +113510 -1.000000 +113512 -1.000000 +113513 -1.000000 +113514 -1.000000 +113515 -1.000000 +113516 -1.000000 +113517 -1.000000 +113518 -1.000000 +113519 -1.000000 +113520 -1.000000 +113524 -1.000000 +113526 -1.000000 +113527 -1.000000 +113541 -1.000000 +113542 -1.000000 +113543 -1.000000 +113544 -1.000000 +113556 -1.000000 +113558 -1.000000 +113559 -1.000000 +113561 -1.000000 +113562 -1.000000 +113563 -1.000000 +113564 -1.000000 +113565 -1.000000 +113566 -1.000000 +113567 -1.000000 +113568 -1.000000 +113569 -1.000000 +113575 -1.000000 +113576 -1.000000 +113577 -1.000000 +113628 -1.000000 +113632 -1.000000 +113633 -1.000000 +113634 -1.000000 +113635 -1.000000 +113639 -1.000000 +113650 -1.000000 +113654 -1.000000 +113656 -1.000000 +113657 -1.000000 +113658 -1.000000 +113659 -1.000000 +113660 -1.000000 +113662 -1.000000 +113663 -1.000000 +113664 -1.000000 +113667 -1.000000 +113668 -1.000000 +113669 -1.000000 +113670 -1.000000 +113672 -1.000000 +113677 -1.000000 +113683 -1.000000 +113685 -1.000000 +113686 -1.000000 +113687 -1.000000 +113688 -1.000000 +113689 -1.000000 +113690 -1.000000 +113692 -1.000000 +113693 -1.000000 +113694 -1.000000 +113697 -1.000000 +113698 -1.000000 +113702 -1.000000 +113805 -1.000000 +113807 -1.000000 +113808 -1.000000 +113809 -1.000000 +113810 -1.000000 +113811 -1.000000 +113814 -1.000000 +113815 -1.000000 +113817 -1.000000 +113819 -1.000000 +113820 -1.000000 +113821 -1.000000 +113822 -1.000000 +113823 -1.000000 +113824 -1.000000 +113825 -1.000000 +113826 -1.000000 +113827 -1.000000 +113828 -1.000000 +113829 -1.000000 +113832 -1.000000 +113834 -1.000000 +113835 -1.000000 +113836 -1.000000 +113838 -1.000000 +113839 -1.000000 +113840 -1.000000 +113841 -1.000000 +113842 -1.000000 +113843 -1.000000 +113844 -1.000000 +113845 -1.000000 +113846 -1.000000 +113847 -1.000000 +113848 -1.000000 +113849 -1.000000 +113850 -1.000000 +113851 -1.000000 +113855 -1.000000 +113857 -1.000000 +113859 -1.000000 +113870 -1.000000 +113874 -1.000000 +113875 -1.000000 +113876 -1.000000 +113877 -1.000000 +113878 -1.000000 +113881 -1.000000 +113882 -1.000000 +113886 -1.000000 +113888 -1.000000 +113889 -1.000000 +113890 -1.000000 +113892 -1.000000 +113893 -1.000000 +113895 -1.000000 +113899 -1.000000 +113905 -1.000000 +113910 -1.000000 +113911 -1.000000 +113912 -1.000000 +113914 -1.000000 +113915 -1.000000 +113916 -1.000000 +113917 -1.000000 +113919 -1.000000 +113921 -1.000000 +113922 -1.000000 +113923 -1.000000 +113924 -1.000000 +113928 -1.000000 +113934 -1.000000 +113942 -1.000000 +113967 -1.000000 +113972 -1.000000 +113974 -1.000000 +113975 -1.000000 +113976 -1.000000 +113977 -1.000000 +113978 -1.000000 +113979 -1.000000 +113982 -1.000000 +113983 -1.000000 +113987 -1.000000 +113988 -1.000000 +113989 -1.000000 +113991 -1.000000 +113992 -1.000000 +113993 -1.000000 +113994 -1.000000 +113995 -1.000000 +113996 -1.000000 +114002 -1.000000 +114019 -1.000000 +114020 -1.000000 +114021 -1.000000 +114022 -1.000000 +114025 -1.000000 +114026 -1.000000 +114036 -1.000000 +114037 -1.000000 +114038 -1.000000 +114040 -1.000000 +114041 -1.000000 +114042 -1.000000 +114043 -1.000000 +114044 -1.000000 +114045 -1.000000 +114046 -1.000000 +114047 -1.000000 +114049 -1.000000 +114050 -1.000000 +114051 -1.000000 +114053 -1.000000 +114054 -1.000000 +114055 -1.000000 +114056 -1.000000 +114057 -1.000000 +114058 -1.000000 +114059 -1.000000 +114060 -1.000000 +114061 -1.000000 +114062 -1.000000 +114064 -1.000000 +114066 -1.000000 +114067 -1.000000 +114068 -1.000000 +114069 -1.000000 +114070 -1.000000 +114071 -1.000000 +114072 -1.000000 +114073 -1.000000 +114074 -1.000000 +114075 -1.000000 +114076 -1.000000 +114077 -1.000000 +114078 -1.000000 +114081 -1.000000 +114082 -1.000000 +114083 -1.000000 +114084 -1.000000 +114085 -1.000000 +114087 -1.000000 +114091 -1.000000 +114096 -1.000000 +114166 -1.000000 +114168 -1.000000 +114170 -1.000000 +114171 -1.000000 +114172 -1.000000 +114173 -1.000000 +114175 -1.000000 +114176 -1.000000 +114177 -1.000000 +114178 -1.000000 +114179 -1.000000 +114180 -1.000000 +114181 -1.000000 +114183 -1.000000 +114184 -1.000000 +114185 -1.000000 +114186 -1.000000 +114197 -1.000000 +114199 -1.000000 +114200 -1.000000 +114201 -1.000000 +114202 -1.000000 +114203 -1.000000 +114205 -1.000000 +114206 -1.000000 +114208 -1.000000 +114209 -1.000000 +114210 -1.000000 +114211 -1.000000 +114212 -1.000000 +114213 -1.000000 +114214 -1.000000 +114215 -1.000000 +114216 -1.000000 +114217 -1.000000 +114218 -1.000000 +114219 -1.000000 +114220 -1.000000 +114221 -1.000000 +114222 -1.000000 +114223 -1.000000 +114224 -1.000000 +114226 -1.000000 +114231 -1.000000 +114232 -1.000000 +114237 -1.000000 +114238 -1.000000 +114241 -1.000000 +114249 -1.000000 +114253 -1.000000 +114254 -1.000000 +114255 -1.000000 +114260 -1.000000 +114261 -1.000000 +114262 -1.000000 +114302 -1.000000 +114303 -1.000000 +114304 -1.000000 +114305 -1.000000 +114307 -1.000000 +114308 -1.000000 +114309 -1.000000 +114310 -1.000000 +114318 -1.000000 +114323 -1.000000 +114325 -1.000000 +114328 -1.000000 +114331 -1.000000 +114332 -1.000000 +114333 -1.000000 +114334 -1.000000 +114335 -1.000000 +114336 -1.000000 +114337 -1.000000 +114338 -1.000000 +114339 -1.000000 +114340 -1.000000 +114341 -1.000000 +114342 -1.000000 +114354 -1.000000 +114356 -1.000000 +114359 -1.000000 +114362 -1.000000 +114372 -1.000000 +114373 -1.000000 +114374 -1.000000 +114375 -1.000000 +114382 -1.000000 +114384 -1.000000 +114385 -1.000000 +114386 -1.000000 +114387 -1.000000 +114391 -1.000000 +114392 -1.000000 +114393 -1.000000 +114395 -1.000000 +114396 -1.000000 +114397 -1.000000 +114398 -1.000000 +114399 -1.000000 +114400 -1.000000 +114401 -1.000000 +114402 -1.000000 +114403 -1.000000 +114404 -1.000000 +114405 -1.000000 +114406 -1.000000 +114407 -1.000000 +114409 -1.000000 +114410 -1.000000 +114411 -1.000000 +114416 -1.000000 +114423 -1.000000 +114424 -1.000000 +114425 -1.000000 +114426 -1.000000 +114427 -1.000000 +114428 -1.000000 +114430 -1.000000 +114431 -1.000000 +114433 -1.000000 +114436 -1.000000 +114437 -1.000000 +114439 -1.000000 +114444 -1.000000 +114452 -1.000000 +114453 -1.000000 +114454 -1.000000 +114455 -1.000000 +114458 -1.000000 +114459 -1.000000 +114460 -1.000000 +114469 -1.000000 +114471 -1.000000 +114472 -1.000000 +114492 -1.000000 +114493 -1.000000 +114496 -1.000000 +114497 -1.000000 +114498 -1.000000 +114499 -1.000000 +114500 -1.000000 +114501 -1.000000 +114502 -1.000000 +114503 -1.000000 +114504 -1.000000 +114509 -1.000000 +114514 -1.000000 +114515 -1.000000 +114516 -1.000000 +114517 -1.000000 +114518 -1.000000 +114519 -1.000000 +114520 -1.000000 +114521 -1.000000 +114522 -1.000000 +114523 -1.000000 +114524 -1.000000 +114529 -1.000000 +114531 -1.000000 +114532 -1.000000 +114533 -1.000000 +114534 -1.000000 +114535 -1.000000 +114546 -1.000000 +114551 -1.000000 +114558 -1.000000 +114559 -1.000000 +114560 -1.000000 +114565 -1.000000 +114568 -1.000000 +114573 -1.000000 +114574 -1.000000 +114575 -1.000000 +114576 -1.000000 +114579 -1.000000 +114580 -1.000000 +114586 -1.000000 +114587 -1.000000 +114588 -1.000000 +114589 -1.000000 +114590 -1.000000 +114591 -1.000000 +114592 -1.000000 +114593 -1.000000 +114594 -1.000000 +114595 -1.000000 +114596 -1.000000 +114597 -1.000000 +114598 -1.000000 +114600 -1.000000 +114601 -1.000000 +114602 -1.000000 +114603 -1.000000 +114604 -1.000000 +114611 -1.000000 +114616 -1.000000 +114620 -1.000000 +114625 -1.000000 +114643 -1.000000 +114648 -1.000000 +114668 -1.000000 +114674 -1.000000 +114675 -1.000000 +114678 -1.000000 +114681 -1.000000 +114683 -1.000000 +114684 -1.000000 +114685 -1.000000 +114686 -1.000000 +114687 -1.000000 +114688 -1.000000 +114689 -1.000000 +114690 -1.000000 +114692 -1.000000 +114693 -1.000000 +114694 -1.000000 +114699 -1.000000 +114700 -1.000000 +114701 -1.000000 +114706 -1.000000 +114709 -1.000000 +114710 -1.000000 +114711 -1.000000 +114713 -1.000000 +114715 -1.000000 +114720 -1.000000 +114722 -1.000000 +114733 -1.000000 +114734 -1.000000 +114736 -1.000000 +114737 -1.000000 +114738 -1.000000 +114739 -1.000000 +114742 -1.000000 +114743 -1.000000 +114745 -1.000000 +114747 -1.000000 +114769 -1.000000 +114780 -1.000000 +114781 -1.000000 +114783 -1.000000 +114799 -1.000000 +114800 -1.000000 +114802 -1.000000 +114804 -1.000000 +114805 -1.000000 +114807 -1.000000 +114808 -1.000000 +114809 -1.000000 +114810 -1.000000 +114811 -1.000000 +114812 -1.000000 +114817 -1.000000 +114818 -1.000000 +114820 -1.000000 +114821 -1.000000 +114822 -1.000000 +114824 -1.000000 +114826 -1.000000 +114831 -1.000000 +114841 -1.000000 +114842 -1.000000 +114845 -1.000000 +114848 -1.000000 +114861 -1.000000 +114868 -1.000000 +114869 -1.000000 +114870 -1.000000 +114871 -1.000000 +114872 -1.000000 +114875 -1.000000 +114876 -1.000000 +114877 -1.000000 +114880 -1.000000 +114884 -1.000000 +114886 -1.000000 +114887 -1.000000 +114888 -1.000000 +114894 -1.000000 +114903 -1.000000 +114904 -1.000000 +114905 -1.000000 +114906 -1.000000 +114907 -1.000000 +114908 -1.000000 +114909 -1.000000 +114910 -1.000000 +114911 -1.000000 +114913 -1.000000 +114914 -1.000000 +114915 -1.000000 +114916 -1.000000 +114917 -1.000000 +114918 -1.000000 +114922 -1.000000 +114923 -1.000000 +114926 -1.000000 +114929 -1.000000 +114930 -1.000000 +114931 -1.000000 +114932 -1.000000 +114933 -1.000000 +114935 -1.000000 +114937 -1.000000 +114938 -1.000000 +114939 -1.000000 +114940 -1.000000 +114941 -1.000000 +114943 -1.000000 +114945 -1.000000 +114946 -1.000000 +114947 -1.000000 +114948 -1.000000 +114949 -1.000000 +114950 -1.000000 +114951 -1.000000 +114952 -1.000000 +114953 -1.000000 +114954 -1.000000 +114957 -1.000000 +114966 -1.000000 +114969 -1.000000 +114972 -1.000000 +114974 -1.000000 +114977 -1.000000 +114978 -1.000000 +114979 -1.000000 +114980 -1.000000 +114981 -1.000000 +114984 -1.000000 +114985 -1.000000 +114986 -1.000000 +114987 -1.000000 +114989 -1.000000 +114990 -1.000000 +114993 -1.000000 +114996 -1.000000 +115000 -1.000000 +115038 -1.000000 +115044 -1.000000 +115045 -1.000000 +115046 -1.000000 +115048 -1.000000 +115049 -1.000000 +115051 -1.000000 +115052 -1.000000 +115053 -1.000000 +115054 -1.000000 +115055 -1.000000 +115056 -1.000000 +115057 -1.000000 +115058 -1.000000 +115059 -1.000000 +115060 -1.000000 +115062 -1.000000 +115063 -1.000000 +115064 -1.000000 +115065 -1.000000 +115066 -1.000000 +115067 -1.000000 +115068 -1.000000 +115073 -1.000000 +115074 -1.000000 +115075 -1.000000 +115076 -1.000000 +115077 -1.000000 +115078 -1.000000 +115079 -1.000000 +115080 -1.000000 +115081 -1.000000 +115083 -1.000000 +115085 -1.000000 +115086 -1.000000 +115088 -1.000000 +115090 -1.000000 +115091 -1.000000 +115094 -1.000000 +115095 -1.000000 +115096 -1.000000 +115097 -1.000000 +115098 -1.000000 +115099 -1.000000 +115100 -1.000000 +115106 -1.000000 +115107 -1.000000 +115108 -1.000000 +115110 -1.000000 +115111 -1.000000 +115115 -1.000000 +115116 -1.000000 +115117 -1.000000 +115118 -1.000000 +115119 -1.000000 +115120 -1.000000 +115121 -1.000000 +115123 -1.000000 +115124 -1.000000 +115129 -1.000000 +115132 -1.000000 +115133 -1.000000 +115134 -1.000000 +115135 -1.000000 +115136 -1.000000 +115137 -1.000000 +115141 -1.000000 +115142 -1.000000 +115143 -1.000000 +115144 -1.000000 +115145 -1.000000 +115146 -1.000000 +115147 -1.000000 +115148 -1.000000 +115149 -1.000000 +115150 -1.000000 +115151 -1.000000 +115152 -1.000000 +115153 -1.000000 +115155 -1.000000 +115156 -1.000000 +115157 -1.000000 +115158 -1.000000 +115159 -1.000000 +115160 -1.000000 +115161 -1.000000 +115162 -1.000000 +115163 -1.000000 +115164 -1.000000 +115165 -1.000000 +115166 -1.000000 +115167 -1.000000 +115168 -1.000000 +115169 -1.000000 +115170 -1.000000 +115171 -1.000000 +115172 -1.000000 +115173 -1.000000 +115174 -1.000000 +115176 -1.000000 +115177 -1.000000 +115178 -1.000000 +115179 -1.000000 +115180 -1.000000 +115181 -1.000000 +115191 -1.000000 +115192 -1.000000 +115193 -1.000000 +115194 -1.000000 +115195 -1.000000 +115197 -1.000000 +115199 -1.000000 +115200 -1.000000 +115203 -1.000000 +115204 -1.000000 +115211 -1.000000 +115212 -1.000000 +115213 -1.000000 +115214 -1.000000 +115215 -1.000000 +115216 -1.000000 +115217 -1.000000 +115218 -1.000000 +115219 -1.000000 +115220 -1.000000 +115221 -1.000000 +115222 -1.000000 +115223 -1.000000 +115224 -1.000000 +115225 -1.000000 +115226 -1.000000 +115227 -1.000000 +115229 -1.000000 +115238 -1.000000 +115241 -1.000000 +115246 -1.000000 +115247 -1.000000 +115248 -1.000000 +115249 -1.000000 +115250 -1.000000 +115253 -1.000000 +115254 -1.000000 +115255 -1.000000 +115256 -1.000000 +115258 -1.000000 +115259 -1.000000 +115261 -1.000000 +115262 -1.000000 +115263 -1.000000 +115264 -1.000000 +115265 -1.000000 +115266 -1.000000 +115271 -1.000000 +115275 -1.000000 +115277 -1.000000 +115278 -1.000000 +115279 -1.000000 +115280 -1.000000 +115281 -1.000000 +115282 -1.000000 +115283 -1.000000 +115284 -1.000000 +115285 -1.000000 +115286 -1.000000 +115287 -1.000000 +115293 -1.000000 +115296 -1.000000 +115298 -1.000000 +115300 -1.000000 +115301 -1.000000 +115302 -1.000000 +115303 -1.000000 +115304 -1.000000 +115305 -1.000000 +115309 -1.000000 +115311 -1.000000 +115314 -1.000000 +115316 -1.000000 +115317 -1.000000 +115318 -1.000000 +115319 -1.000000 +115320 -1.000000 +115321 -1.000000 +115322 -1.000000 +115324 -1.000000 +115326 -1.000000 +115327 -1.000000 +115328 -1.000000 +115329 -1.000000 +115330 -1.000000 +115335 -1.000000 +115336 -1.000000 +115338 -1.000000 +115340 -1.000000 +115349 -1.000000 +115354 -1.000000 +115355 -1.000000 +115356 -1.000000 +115357 -1.000000 +115358 -1.000000 +115359 -1.000000 +115360 -1.000000 +115361 -1.000000 +115362 -1.000000 +115363 -1.000000 +115364 -1.000000 +115365 -1.000000 +115366 -1.000000 +115367 -1.000000 +115368 -1.000000 +115372 -1.000000 +115375 -1.000000 +115376 -1.000000 +115397 -1.000000 +115399 -1.000000 +115403 -1.000000 +115404 -1.000000 +115407 -1.000000 +115410 -1.000000 +115412 -1.000000 +115414 -1.000000 +115417 -1.000000 +115420 -1.000000 +115424 -1.000000 +115425 -1.000000 +115427 -1.000000 +115438 -1.000000 +115441 -1.000000 +115442 -1.000000 +115443 -1.000000 +115445 -1.000000 +115448 -1.000000 +115449 -1.000000 +115450 -1.000000 +115451 -1.000000 +115453 -1.000000 +115455 -1.000000 +115457 -1.000000 +115458 -1.000000 +115460 -1.000000 +115461 -1.000000 +115464 -1.000000 +115465 -1.000000 +115468 -1.000000 +115469 -1.000000 +115471 -1.000000 +115474 -1.000000 +115475 -1.000000 +115477 -1.000000 +115478 -1.000000 +115479 -1.000000 +115481 -1.000000 +115482 -1.000000 +115483 -1.000000 +115485 -1.000000 +115486 -1.000000 +115487 -1.000000 +115488 -1.000000 +115489 -1.000000 +115490 -1.000000 +115491 -1.000000 +115494 -1.000000 +115496 -1.000000 +115497 -1.000000 +115500 -1.000000 +115501 -1.000000 +115511 -1.000000 +115521 -1.000000 +115529 -1.000000 +115530 -1.000000 +115531 -1.000000 +115541 -1.000000 +115552 -1.000000 +115554 -1.000000 +115560 -1.000000 +115563 -1.000000 +115567 -1.000000 +115568 -1.000000 +115569 -1.000000 +115570 -1.000000 +115571 -1.000000 +115572 -1.000000 +115573 -1.000000 +115574 -1.000000 +115575 -1.000000 +115576 -1.000000 +115577 -1.000000 +115578 -1.000000 +115579 -1.000000 +115580 -1.000000 +115582 -1.000000 +115583 -1.000000 +115584 -1.000000 +115585 -1.000000 +115586 -1.000000 +115587 -1.000000 +115588 -1.000000 +115589 -1.000000 +115590 -1.000000 +115591 -1.000000 +115592 -1.000000 +115593 -1.000000 +115594 -1.000000 +115595 -1.000000 +115597 -1.000000 +115598 -1.000000 +115603 -1.000000 +115605 -1.000000 +115606 -1.000000 +115607 -1.000000 +115608 -1.000000 +115609 -1.000000 +115610 -1.000000 +115611 -1.000000 +115616 -1.000000 +115617 -1.000000 +115618 -1.000000 +115620 -1.000000 +115621 -1.000000 +115629 -1.000000 +115630 -1.000000 +115636 -1.000000 +115637 -1.000000 +115638 -1.000000 +115639 -1.000000 +115640 -1.000000 +115643 -1.000000 +115644 -1.000000 +115645 -1.000000 +115646 -1.000000 +115647 -1.000000 +115648 -1.000000 +115649 -1.000000 +115650 -1.000000 +115652 -1.000000 +115653 -1.000000 +115654 -1.000000 +115655 -1.000000 +115658 -1.000000 +115661 -1.000000 +115662 -1.000000 +115663 -1.000000 +115664 -1.000000 +115668 -1.000000 +115669 -1.000000 +115671 -1.000000 +115672 -1.000000 +115674 -1.000000 +115675 -1.000000 +115676 -1.000000 +115677 -1.000000 +115678 -1.000000 +115679 -1.000000 +115680 -1.000000 +115681 -1.000000 +115682 -1.000000 +115683 -1.000000 +115684 -1.000000 +115687 -1.000000 +115688 -1.000000 +115689 -1.000000 +115690 -1.000000 +115691 -1.000000 +115692 -1.000000 +115693 -1.000000 +115696 -1.000000 +115698 -1.000000 +115699 -1.000000 +115700 -1.000000 +115783 -1.000000 +115785 -1.000000 +115787 -1.000000 +115789 -1.000000 +115791 -1.000000 +115796 -1.000000 +115798 -1.000000 +115799 -1.000000 +115800 -1.000000 +115801 -1.000000 +115802 -1.000000 +115803 -1.000000 +115804 -1.000000 +115805 -1.000000 +115806 -1.000000 +115810 -1.000000 +115811 -1.000000 +115812 -1.000000 +115819 -1.000000 +115820 -1.000000 +115822 -1.000000 +115824 -1.000000 +115825 -1.000000 +115826 -1.000000 +115827 -1.000000 +115829 -1.000000 +115832 -1.000000 +115833 -1.000000 +115835 -1.000000 +115836 -1.000000 +115837 -1.000000 +115845 -1.000000 +115846 -1.000000 +115850 -1.000000 +115853 -1.000000 +115854 -1.000000 +115859 -1.000000 +115861 -1.000000 +115863 -1.000000 +115866 -1.000000 +115874 -1.000000 +115875 -1.000000 +115895 -1.000000 +115896 -1.000000 +115897 -1.000000 +115910 -1.000000 +115915 -1.000000 +115919 -1.000000 +115921 -1.000000 +115933 -1.000000 +115934 -1.000000 +115935 -1.000000 +115939 -1.000000 +115940 -1.000000 +115942 -1.000000 +115948 -1.000000 +115949 -1.000000 +115952 -1.000000 +115953 -1.000000 +115954 -1.000000 +115955 -1.000000 +115956 -1.000000 +115957 -1.000000 +115961 -1.000000 +115962 -1.000000 +115963 -1.000000 +115964 -1.000000 +115966 -1.000000 +115970 -1.000000 +115971 -1.000000 +115974 -1.000000 +115978 -1.000000 +115979 -1.000000 +115982 -1.000000 +115984 -1.000000 +115985 -1.000000 +115986 -1.000000 +115990 -1.000000 +115991 -1.000000 +115992 -1.000000 +115993 -1.000000 +115994 -1.000000 +115995 -1.000000 +115996 -1.000000 +115997 -1.000000 +115998 -1.000000 +115999 -1.000000 +116004 -1.000000 +116008 -1.000000 +116040 -1.000000 +116041 -1.000000 +116042 -1.000000 +116055 -1.000000 +116056 -1.000000 +116057 -1.000000 +116058 -1.000000 +116059 -1.000000 +116060 -1.000000 +116061 -1.000000 +116062 -1.000000 +116072 -1.000000 +116080 -1.000000 +116081 -1.000000 +116082 -1.000000 +116083 -1.000000 +116084 -1.000000 +116085 -1.000000 +116086 -1.000000 +116087 -1.000000 +116089 -1.000000 +116090 -1.000000 +116091 -1.000000 +116092 -1.000000 +116093 -1.000000 +116094 -1.000000 +116096 -1.000000 +116097 -1.000000 +116098 -1.000000 +116099 -1.000000 +116101 -1.000000 +116102 -1.000000 +116103 -1.000000 +116104 -1.000000 +116105 -1.000000 +116110 -1.000000 +116111 -1.000000 +116112 -1.000000 +116117 -1.000000 +116118 -1.000000 +116120 -1.000000 +116121 -1.000000 +116123 -1.000000 +116124 -1.000000 +116125 -1.000000 +116126 -1.000000 +116127 -1.000000 +116128 -1.000000 +116129 -1.000000 +116130 -1.000000 +116132 -1.000000 +116134 -1.000000 +116135 -1.000000 +116199 -1.000000 +116200 -1.000000 +116201 -1.000000 +116202 -1.000000 +116203 -1.000000 +116204 -1.000000 +116205 -1.000000 +116206 -1.000000 +116207 -1.000000 +116208 -1.000000 +116209 -1.000000 +116210 -1.000000 +116211 -1.000000 +116212 -1.000000 +116213 -1.000000 +116214 -1.000000 +116215 -1.000000 +116216 -1.000000 +116217 -1.000000 +116218 -1.000000 +116219 -1.000000 +116220 -1.000000 +116221 -1.000000 +116222 -1.000000 +116223 -1.000000 +116224 -1.000000 +116225 -1.000000 +116226 -1.000000 +116234 -1.000000 +116235 -1.000000 +116236 -1.000000 +116238 -1.000000 +116239 -1.000000 +116240 -1.000000 +116241 -1.000000 +116242 -1.000000 +116243 -1.000000 +116244 -1.000000 +116245 -1.000000 +116246 -1.000000 +116247 -1.000000 +116248 -1.000000 +116249 -1.000000 +116250 -1.000000 +116251 -1.000000 +116252 -1.000000 +116253 -1.000000 +116254 -1.000000 +116255 -1.000000 +116256 -1.000000 +116257 -1.000000 +116258 -1.000000 +116259 -1.000000 +116260 -1.000000 +116261 -1.000000 +116262 -1.000000 +116263 -1.000000 +116264 -1.000000 +116707 -1.000000 +116713 -1.000000 +116714 -1.000000 +116715 -1.000000 +116721 -1.000000 +116722 -1.000000 +116723 -1.000000 +116724 -1.000000 +116727 -1.000000 +116730 -1.000000 +116731 -1.000000 +116732 -1.000000 +116733 -1.000000 +116734 -1.000000 +116735 -1.000000 +116737 -1.000000 +116738 -1.000000 +116739 -1.000000 +116740 -1.000000 +116741 -1.000000 +116742 -1.000000 +116743 -1.000000 +116744 -1.000000 +116745 -1.000000 +116746 -1.000000 +116747 -1.000000 +116748 -1.000000 +116749 -1.000000 +116754 -1.000000 +116756 -1.000000 +116758 -1.000000 +116762 -1.000000 +116764 -1.000000 +116766 -1.000000 +116767 -1.000000 +116769 -1.000000 +116770 -1.000000 +116771 -1.000000 +116777 -1.000000 +116778 -1.000000 +116779 -1.000000 +116780 -1.000000 +116781 -1.000000 +116782 -1.000000 +116787 -1.000000 +116790 -1.000000 +116795 -1.000000 +116798 -1.000000 +116799 -1.000000 +116810 -1.000000 +116811 -1.000000 +116812 -1.000000 +116813 -1.000000 +116825 -1.000000 +116826 -1.000000 +116855 -1.000000 +116876 -1.000000 +116889 -1.000000 +116890 -1.000000 +116928 -1.000000 +116930 -1.000000 +116932 -1.000000 +116937 -1.000000 +116939 -1.000000 +116940 -1.000000 +116943 -1.000000 +116946 -1.000000 +116947 -1.000000 +116978 -1.000000 +116980 -1.000000 +116984 -1.000000 +116994 -1.000000 +116995 -1.000000 +117031 -1.000000 +117032 -1.000000 +117033 -1.000000 +117034 -1.000000 +117036 -1.000000 +117037 -1.000000 +117038 -1.000000 +117039 -1.000000 +117040 -1.000000 +117042 -1.000000 +117047 -1.000000 +117048 -1.000000 +117049 -1.000000 +117050 -1.000000 +117051 -1.000000 +117052 -1.000000 +117053 -1.000000 +117055 -1.000000 +117057 -1.000000 +117058 -1.000000 +117059 -1.000000 +117060 -1.000000 +117061 -1.000000 +117062 -1.000000 +117063 -1.000000 +117066 -1.000000 +117067 -1.000000 +117068 -1.000000 +117069 -1.000000 +117070 -1.000000 +117076 -1.000000 +117077 -1.000000 +117078 -1.000000 +117079 -1.000000 +117080 -1.000000 +117081 -1.000000 +117082 -1.000000 +117083 -1.000000 +117085 -1.000000 +117086 -1.000000 +117087 -1.000000 +117088 -1.000000 +117089 -1.000000 +117090 -1.000000 +117091 -1.000000 +117092 -1.000000 +117093 -1.000000 +117094 -1.000000 +117096 -1.000000 +117098 -1.000000 +117100 -1.000000 +117105 -1.000000 +117106 -1.000000 +117108 -1.000000 +117117 -1.000000 +117118 -1.000000 +117119 -1.000000 +117120 -1.000000 +117122 -1.000000 +117123 -1.000000 +117129 -1.000000 +117132 -1.000000 +117133 -1.000000 +117139 -1.000000 +117140 -1.000000 +117142 -1.000000 +117144 -1.000000 +117150 -1.000000 +117151 -1.000000 +117154 -1.000000 +117155 -1.000000 +117161 -1.000000 +117162 -1.000000 +117163 -1.000000 +117165 -1.000000 +117166 -1.000000 +117169 -1.000000 +117172 -1.000000 +117173 -1.000000 +117174 -1.000000 +117176 -1.000000 +117177 -1.000000 +117178 -1.000000 +117179 -1.000000 +117180 -1.000000 +117181 -1.000000 +117182 -1.000000 +117188 -1.000000 +117194 -1.000000 +117198 -1.000000 +117199 -1.000000 +117200 -1.000000 +117201 -1.000000 +117203 -1.000000 +117205 -1.000000 +117207 -1.000000 +117209 -1.000000 +117210 -1.000000 +117211 -1.000000 +117212 -1.000000 +117213 -1.000000 +117214 -1.000000 +117215 -1.000000 +117220 -1.000000 +117222 -1.000000 +117224 -1.000000 +117227 -1.000000 +117228 -1.000000 +117231 -1.000000 +117232 -1.000000 +117233 -1.000000 +117234 -1.000000 +117235 -1.000000 +117236 -1.000000 +117243 -1.000000 +117244 -1.000000 +117245 -1.000000 +117246 -1.000000 +117247 -1.000000 +117249 -1.000000 +117250 -1.000000 +117251 -1.000000 +117252 -1.000000 +117254 -1.000000 +117255 -1.000000 +117257 -1.000000 +117258 -1.000000 +117260 -1.000000 +117261 -1.000000 +117262 -1.000000 +117263 -1.000000 +117264 -1.000000 +117268 -1.000000 +117271 -1.000000 +117272 -1.000000 +117273 -1.000000 +117274 -1.000000 +117276 -1.000000 +117285 -1.000000 +117286 -1.000000 +117296 -1.000000 +117297 -1.000000 +117305 -1.000000 +117311 -1.000000 +117312 -1.000000 +117320 -1.000000 +117321 -1.000000 +117323 -1.000000 +117336 -1.000000 +117347 -1.000000 +117349 -1.000000 +117355 -1.000000 +117396 -1.000000 +117400 -1.000000 +117401 -1.000000 +117410 -1.000000 +117411 -1.000000 +117412 -1.000000 +117413 -1.000000 +117416 -1.000000 +117418 -1.000000 +117419 -1.000000 +117420 -1.000000 +117421 -1.000000 +117422 -1.000000 +117426 -1.000000 +117427 -1.000000 +117432 -1.000000 +117433 -1.000000 +117446 -1.000000 +117452 -1.000000 +117463 -1.000000 +117466 -1.000000 +117479 -1.000000 +117480 -1.000000 +117481 -1.000000 +117491 -1.000000 +117492 -1.000000 +117525 -1.000000 +117527 -1.000000 +117530 -1.000000 +117535 -1.000000 +117537 -1.000000 +117538 -1.000000 +117539 -1.000000 +117540 -1.000000 +117541 -1.000000 +117544 -1.000000 +117545 -1.000000 +117555 -1.000000 +117556 -1.000000 +117559 -1.000000 +117561 -1.000000 +117562 -1.000000 +117563 -1.000000 +117564 -1.000000 +117565 -1.000000 +117566 -1.000000 +117567 -1.000000 +117568 -1.000000 +117569 -1.000000 +117570 -1.000000 +117572 -1.000000 +117575 -1.000000 +117576 -1.000000 +117577 -1.000000 +117578 -1.000000 +117579 -1.000000 +117580 -1.000000 +117582 -1.000000 +117583 -1.000000 +117584 -1.000000 +117585 -1.000000 +117587 -1.000000 +117588 -1.000000 +117589 -1.000000 +117597 -1.000000 +117605 -1.000000 +117606 -1.000000 +117607 -1.000000 +117608 -1.000000 +117609 -1.000000 +117610 -1.000000 +117611 -1.000000 +117612 -1.000000 +117613 -1.000000 +117616 -1.000000 +117617 -1.000000 +117618 -1.000000 +117620 -1.000000 +117621 -1.000000 +117622 -1.000000 +117624 -1.000000 +117641 -1.000000 +117642 -1.000000 +117643 -1.000000 +117644 -1.000000 +117645 -1.000000 +117660 -1.000000 +117672 -1.000000 +117673 -1.000000 +117678 -1.000000 +117681 -1.000000 +117684 -1.000000 +117685 -1.000000 +117686 -1.000000 +117688 -1.000000 +117690 -1.000000 +117691 -1.000000 +117692 -1.000000 +117693 -1.000000 +117694 -1.000000 +117695 -1.000000 +117696 -1.000000 +117697 -1.000000 +117698 -1.000000 +117699 -1.000000 +117700 -1.000000 +117705 -1.000000 +117706 -1.000000 +117707 -1.000000 +117709 -1.000000 +117710 -1.000000 +117712 -1.000000 +117714 -1.000000 +117715 -1.000000 +117726 -1.000000 +117734 -1.000000 +117735 -1.000000 +117738 -1.000000 +117739 -1.000000 +117740 -1.000000 +117741 -1.000000 +117742 -1.000000 +117743 -1.000000 +117744 -1.000000 +117745 -1.000000 +117746 -1.000000 +117747 -1.000000 +117748 -1.000000 +117749 -1.000000 +117751 -1.000000 +117752 -1.000000 +117753 -1.000000 +117754 -1.000000 +117755 -1.000000 +117756 -1.000000 +117757 -1.000000 +117758 -1.000000 +117759 -1.000000 +117760 -1.000000 +117761 -1.000000 +117762 -1.000000 +117763 -1.000000 +117764 -1.000000 +117765 -1.000000 +117766 -1.000000 +117774 -1.000000 +117776 -1.000000 +117777 -1.000000 +117778 -1.000000 +117779 -1.000000 +117780 -1.000000 +117781 -1.000000 +117782 -1.000000 +117783 -1.000000 +117784 -1.000000 +117785 -1.000000 +117786 -1.000000 +117787 -1.000000 +117788 -1.000000 +117790 -1.000000 +117794 -1.000000 +117796 -1.000000 +117797 -1.000000 +117798 -1.000000 +117799 -1.000000 +117802 -1.000000 +117804 -1.000000 +117805 -1.000000 +117806 -1.000000 +117811 -1.000000 +117812 -1.000000 +117813 -1.000000 +117819 -1.000000 +117820 -1.000000 +117821 -1.000000 +117822 -1.000000 +117823 -1.000000 +117824 -1.000000 +117825 -1.000000 +117830 -1.000000 +117831 -1.000000 +117833 -1.000000 +117835 -1.000000 +117837 -1.000000 +117839 -1.000000 +117840 -1.000000 +117841 -1.000000 +117842 -1.000000 +117843 -1.000000 +117847 -1.000000 +117848 -1.000000 +117849 -1.000000 +117850 -1.000000 +117851 -1.000000 +117852 -1.000000 +117853 -1.000000 +117854 -1.000000 +117855 -1.000000 +117856 -1.000000 +117857 -1.000000 +117858 -1.000000 +117859 -1.000000 +117860 -1.000000 +117861 -1.000000 +117862 -1.000000 +117870 -1.000000 +117872 -1.000000 +117873 -1.000000 +117876 -1.000000 +117877 -1.000000 +117878 -1.000000 +117882 -1.000000 +117883 -1.000000 +117884 -1.000000 +117888 -1.000000 +117889 -1.000000 +117890 -1.000000 +117892 -1.000000 +117894 -1.000000 +117895 -1.000000 +117898 -1.000000 +117900 -1.000000 +117901 -1.000000 +117905 -1.000000 +117914 -1.000000 +117917 -1.000000 +117924 -1.000000 +117925 -1.000000 +117926 -1.000000 +117927 -1.000000 +117928 -1.000000 +117929 -1.000000 +117930 -1.000000 +117931 -1.000000 +117932 -1.000000 +117933 -1.000000 +117934 -1.000000 +117935 -1.000000 +117936 -1.000000 +117937 -1.000000 +117938 -1.000000 +117939 -1.000000 +117940 -1.000000 +117941 -1.000000 +117942 -1.000000 +117943 -1.000000 +117944 -1.000000 +117945 -1.000000 +117946 -1.000000 +117947 -1.000000 +117948 -1.000000 +117949 -1.000000 +117950 -1.000000 +117951 -1.000000 +117954 -1.000000 +117956 -1.000000 +117959 -1.000000 +117962 -1.000000 +117963 -1.000000 +117964 -1.000000 +117965 -1.000000 +117966 -1.000000 +117967 -1.000000 +117968 -1.000000 +117970 -1.000000 +117971 -1.000000 +117973 -1.000000 +117975 -1.000000 +117978 -1.000000 +117980 -1.000000 +117981 -1.000000 +117982 -1.000000 +117983 -1.000000 +117984 -1.000000 +117986 -1.000000 +117990 -1.000000 +117992 -1.000000 +117993 -1.000000 +117994 -1.000000 +117995 -1.000000 +117996 -1.000000 +117998 -1.000000 +117999 -1.000000 +118000 -1.000000 +118001 -1.000000 +118002 -1.000000 +118003 -1.000000 +118004 -1.000000 +118005 -1.000000 +118006 -1.000000 +118007 -1.000000 +118008 -1.000000 +118009 -1.000000 +118010 -1.000000 +118011 -1.000000 +118012 -1.000000 +118013 -1.000000 +118014 -1.000000 +118015 -1.000000 +118016 -1.000000 +118041 -1.000000 +118047 -1.000000 +118049 -1.000000 +118050 -1.000000 +118051 -1.000000 +118054 -1.000000 +118059 -1.000000 +118060 -1.000000 +118061 -1.000000 +118062 -1.000000 +118064 -1.000000 +118066 -1.000000 +118074 -1.000000 +118100 -1.000000 +118111 -1.000000 +118112 -1.000000 +118113 -1.000000 +118134 -1.000000 +118135 -1.000000 +118136 -1.000000 +118137 -1.000000 +118140 -1.000000 +118141 -1.000000 +118142 -1.000000 +118143 -1.000000 +118144 -1.000000 +118145 -1.000000 +118146 -1.000000 +118147 -1.000000 +118148 -1.000000 +118149 -1.000000 +118150 -1.000000 +118151 -1.000000 +118152 -1.000000 +118159 -1.000000 +118162 -1.000000 +118164 -1.000000 +118165 -1.000000 +118166 -1.000000 +118168 -1.000000 +118170 -1.000000 +118171 -1.000000 +118173 -1.000000 +118174 -1.000000 +118175 -1.000000 +118178 -1.000000 +118180 -1.000000 +118181 -1.000000 +118184 -1.000000 +118201 -1.000000 +118203 -1.000000 +118205 -1.000000 +118206 -1.000000 +118207 -1.000000 +118209 -1.000000 +118214 -1.000000 +118215 -1.000000 +118219 -1.000000 +118234 -1.000000 +118235 -1.000000 +118239 -1.000000 +118240 -1.000000 +118241 -1.000000 +118243 -1.000000 +118245 -1.000000 +118247 -1.000000 +118248 -1.000000 +118253 -1.000000 +118260 -1.000000 +118261 -1.000000 +118264 -1.000000 +118268 -1.000000 +118269 -1.000000 +118270 -1.000000 +118271 -1.000000 +118272 -1.000000 +118273 -1.000000 +118274 -1.000000 +118275 -1.000000 +118276 -1.000000 +118278 -1.000000 +118279 -1.000000 +118280 -1.000000 +118281 -1.000000 +118283 -1.000000 +118284 -1.000000 +118285 -1.000000 +118286 -1.000000 +118287 -1.000000 +118288 -1.000000 +118289 -1.000000 +118290 -1.000000 +118291 -1.000000 +118292 -1.000000 +118293 -1.000000 +118298 -1.000000 +118300 -1.000000 +118321 -1.000000 +118323 -1.000000 +118327 -1.000000 +118328 -1.000000 +118329 -1.000000 +118330 -1.000000 +118332 -1.000000 +118333 -1.000000 +118334 -1.000000 +118335 -1.000000 +118336 -1.000000 +118337 -1.000000 +118338 -1.000000 +118339 -1.000000 +118340 -1.000000 +118341 -1.000000 +118342 -1.000000 +118343 -1.000000 +118344 -1.000000 +118346 -1.000000 +118347 -1.000000 +118349 -1.000000 +118351 -1.000000 +118352 -1.000000 +118359 -1.000000 +118360 -1.000000 +118361 -1.000000 +118364 -1.000000 +118365 -1.000000 +118366 -1.000000 +118368 -1.000000 +118369 -1.000000 +118370 -1.000000 +118371 -1.000000 +118372 -1.000000 +118373 -1.000000 +118374 -1.000000 +118375 -1.000000 +118376 -1.000000 +118377 -1.000000 +118378 -1.000000 +118380 -1.000000 +118381 -1.000000 +118384 -1.000000 +118385 -1.000000 +118386 -1.000000 +118387 -1.000000 +118391 -1.000000 +118392 -1.000000 +118393 -1.000000 +118394 -1.000000 +118395 -1.000000 +118396 -1.000000 +118398 -1.000000 +118399 -1.000000 +118400 -1.000000 +118401 -1.000000 +118403 -1.000000 +118404 -1.000000 +118406 -1.000000 +118407 -1.000000 +118408 -1.000000 +118409 -1.000000 +118412 -1.000000 +118413 -1.000000 +118414 -1.000000 +118415 -1.000000 +118417 -1.000000 +118418 -1.000000 +118419 -1.000000 +118420 -1.000000 +118422 -1.000000 +118423 -1.000000 +118425 -1.000000 +118426 -1.000000 +118432 -1.000000 +118433 -1.000000 +118434 -1.000000 +118435 -1.000000 +118436 -1.000000 +118438 -1.000000 +118440 -1.000000 +118441 -1.000000 +118442 -1.000000 +118443 -1.000000 +118445 -1.000000 +118446 -1.000000 +118459 -1.000000 +118460 -1.000000 +118461 -1.000000 +118462 -1.000000 +118463 -1.000000 +118465 -1.000000 +118470 -1.000000 +118473 -1.000000 +118474 -1.000000 +118475 -1.000000 +118476 -1.000000 +118477 -1.000000 +118478 -1.000000 +118479 -1.000000 +118481 -1.000000 +118482 -1.000000 +118483 -1.000000 +118484 -1.000000 +118485 -1.000000 +118486 -1.000000 +118487 -1.000000 +118488 -1.000000 +118489 -1.000000 +118490 -1.000000 +118491 -1.000000 +118492 -1.000000 +118493 -1.000000 +118495 -1.000000 +118497 -1.000000 +118499 -1.000000 +118503 -1.000000 +118504 -1.000000 +118507 -1.000000 +118508 -1.000000 +118509 -1.000000 +118510 -1.000000 +118511 -1.000000 +118525 -1.000000 +118526 -1.000000 +118533 -1.000000 +118535 -1.000000 +118536 -1.000000 +118542 -1.000000 +118543 -1.000000 +118547 -1.000000 +118550 -1.000000 +118551 -1.000000 +118552 -1.000000 +118553 -1.000000 +118554 -1.000000 +118555 -1.000000 +118556 -1.000000 +118557 -1.000000 +118558 -1.000000 +118559 -1.000000 +118560 -1.000000 +118561 -1.000000 +118563 -1.000000 +118565 -1.000000 +118568 -1.000000 +118569 -1.000000 +118570 -1.000000 +118572 -1.000000 +118576 -1.000000 +118578 -1.000000 +118581 -1.000000 +118582 -1.000000 +118590 -1.000000 +118592 -1.000000 +118609 -1.000000 +118610 -1.000000 +118622 -1.000000 +118623 -1.000000 +118629 -1.000000 +118644 -1.000000 +118655 -1.000000 +118657 -1.000000 +118659 -1.000000 +118660 -1.000000 +118661 -1.000000 +118662 -1.000000 +118663 -1.000000 +118664 -1.000000 +118670 -1.000000 +118671 -1.000000 +118674 -1.000000 +118675 -1.000000 +118676 -1.000000 +118677 -1.000000 +118678 -1.000000 +118687 -1.000000 +118688 -1.000000 +118692 -1.000000 +118693 -1.000000 +118694 -1.000000 +118695 -1.000000 +118700 -1.000000 +118702 -1.000000 +118705 -1.000000 +118708 -1.000000 +118711 -1.000000 +118713 -1.000000 +118717 -1.000000 +118718 -1.000000 +118719 -1.000000 +118721 -1.000000 +118732 -1.000000 +118734 -1.000000 +118735 -1.000000 +118736 -1.000000 +118737 -1.000000 +118738 -1.000000 +118739 -1.000000 +118740 -1.000000 +118741 -1.000000 +118742 -1.000000 +118743 -1.000000 +118744 -1.000000 +118745 -1.000000 +118746 -1.000000 +118747 -1.000000 +118748 -1.000000 +118749 -1.000000 +118750 -1.000000 +118751 -1.000000 +118753 -1.000000 +118754 -1.000000 +118755 -1.000000 +118756 -1.000000 +118758 -1.000000 +118761 -1.000000 +118789 -1.000000 +118791 -1.000000 +118802 -1.000000 +118803 -1.000000 +118809 -1.000000 +118813 -1.000000 +118824 -1.000000 +118825 -1.000000 +118842 -1.000000 +118843 -1.000000 +118844 -1.000000 +118845 -1.000000 +118846 -1.000000 +118847 -1.000000 +118848 -1.000000 +118849 -1.000000 +118850 -1.000000 +118851 -1.000000 +118852 -1.000000 +118853 -1.000000 +118854 -1.000000 +118855 -1.000000 +118856 -1.000000 +118857 -1.000000 +118858 -1.000000 +118859 -1.000000 +118860 -1.000000 +118861 -1.000000 +118862 -1.000000 +118863 -1.000000 +118864 -1.000000 +118865 -1.000000 +118866 -1.000000 +118867 -1.000000 +118868 -1.000000 +118869 -1.000000 +118870 -1.000000 +118871 -1.000000 +118872 -1.000000 +118873 -1.000000 +118874 -1.000000 +118876 -1.000000 +118877 -1.000000 +118881 -1.000000 +118883 -1.000000 +118884 -1.000000 +118885 -1.000000 +118907 -1.000000 +118909 -1.000000 +118910 -1.000000 +118911 -1.000000 +118912 -1.000000 +118913 -1.000000 +118914 -1.000000 +118915 -1.000000 +118918 -1.000000 +118919 -1.000000 +118920 -1.000000 +118921 -1.000000 +118922 -1.000000 +118923 -1.000000 +118924 -1.000000 +118925 -1.000000 +118926 -1.000000 +118927 -1.000000 +118929 -1.000000 +118930 -1.000000 +118932 -1.000000 +118934 -1.000000 +118935 -1.000000 +118937 -1.000000 +118938 -1.000000 +118940 -1.000000 +118942 -1.000000 +118952 -1.000000 +118954 -1.000000 +118963 -1.000000 +118965 -1.000000 +118970 -1.000000 +118974 -1.000000 +118976 -1.000000 +118978 -1.000000 +118979 -1.000000 +118980 -1.000000 +118981 -1.000000 +118982 -1.000000 +118983 -1.000000 +118984 -1.000000 +118985 -1.000000 +118986 -1.000000 +118987 -1.000000 +118988 -1.000000 +118989 -1.000000 +118990 -1.000000 +118991 -1.000000 +118992 -1.000000 +118993 -1.000000 +118994 -1.000000 +118995 -1.000000 +118996 -1.000000 +118998 -1.000000 +119000 -1.000000 +119001 -1.000000 +119002 -1.000000 +119003 -1.000000 +119004 -1.000000 +119005 -1.000000 +119006 -1.000000 +119007 -1.000000 +119009 -1.000000 +119010 -1.000000 +119011 -1.000000 +119012 -1.000000 +119013 -1.000000 +119014 -1.000000 +119015 -1.000000 +119016 -1.000000 +119017 -1.000000 +119018 -1.000000 +119019 -1.000000 +119021 -1.000000 +119022 -1.000000 +119023 -1.000000 +119024 -1.000000 +119025 -1.000000 +119026 -1.000000 +119027 -1.000000 +119028 -1.000000 +119042 -1.000000 +119044 -1.000000 +119045 -1.000000 +119048 -1.000000 +119049 -1.000000 +119052 -1.000000 +119054 -1.000000 +119055 -1.000000 +119056 -1.000000 +119059 -1.000000 +119062 -1.000000 +119066 -1.000000 +119071 -1.000000 +119072 -1.000000 +119076 -1.000000 +119077 -1.000000 +119078 -1.000000 +119084 -1.000000 +119085 -1.000000 +119086 -1.000000 +119090 -1.000000 +119091 -1.000000 +119093 -1.000000 +119105 -1.000000 +119106 -1.000000 +119107 -1.000000 +119108 -1.000000 +119109 -1.000000 +119110 -1.000000 +119111 -1.000000 +119112 -1.000000 +119113 -1.000000 +119114 -1.000000 +119115 -1.000000 +119116 -1.000000 +119117 -1.000000 +119118 -1.000000 +119119 -1.000000 +119120 -1.000000 +119121 -1.000000 +119122 -1.000000 +119123 -1.000000 +119125 -1.000000 +119126 -1.000000 +119128 -1.000000 +119129 -1.000000 +119130 -1.000000 +119131 -1.000000 +119133 -1.000000 +119134 -1.000000 +119135 -1.000000 +119136 -1.000000 +119140 -1.000000 +119142 -1.000000 +119143 -1.000000 +119144 -1.000000 +119145 -1.000000 +119146 -1.000000 +119147 -1.000000 +119148 -1.000000 +119149 -1.000000 +119150 -1.000000 +119151 -1.000000 +119152 -1.000000 +119153 -1.000000 +119155 -1.000000 +119156 -1.000000 +119159 -1.000000 +119161 -1.000000 +119162 -1.000000 +119166 -1.000000 +119167 -1.000000 +119168 -1.000000 +119170 -1.000000 +119171 -1.000000 +119172 -1.000000 +119173 -1.000000 +119174 -1.000000 +119175 -1.000000 +119176 -1.000000 +119177 -1.000000 +119178 -1.000000 +119179 -1.000000 +119180 -1.000000 +119181 -1.000000 +119182 -1.000000 +119183 -1.000000 +119184 -1.000000 +119185 -1.000000 +119191 -1.000000 +119192 -1.000000 +119193 -1.000000 +119194 -1.000000 +119195 -1.000000 +119196 -1.000000 +119197 -1.000000 +119200 -1.000000 +119201 -1.000000 +119210 -1.000000 +119214 -1.000000 +119215 -1.000000 +119220 -1.000000 +119221 -1.000000 +119230 -1.000000 +119231 -1.000000 +119232 -1.000000 +119233 -1.000000 +119234 -1.000000 +119235 -1.000000 +119237 -1.000000 +119238 -1.000000 +119239 -1.000000 +119240 -1.000000 +119243 -1.000000 +119244 -1.000000 +119245 -1.000000 +119260 -1.000000 +119261 -1.000000 +119262 -1.000000 +119263 -1.000000 +119268 -1.000000 +119272 -1.000000 +119273 -1.000000 +119277 -1.000000 +119278 -1.000000 +119279 -1.000000 +119282 -1.000000 +119298 -1.000000 +119303 -1.000000 +119305 -1.000000 +119321 -1.000000 +119325 -1.000000 +119328 -1.000000 +119331 -1.000000 +119333 -1.000000 +119337 -1.000000 +119338 -1.000000 +119340 -1.000000 +119344 -1.000000 +119345 -1.000000 +119349 -1.000000 +119350 -1.000000 +119351 -1.000000 +119352 -1.000000 +119353 -1.000000 +119354 -1.000000 +119356 -1.000000 +119358 -1.000000 +119359 -1.000000 +119362 -1.000000 +119363 -1.000000 +119367 -1.000000 +119373 -1.000000 +119380 -1.000000 +119382 -1.000000 +119383 -1.000000 +119384 -1.000000 +119385 -1.000000 +119386 -1.000000 +119387 -1.000000 +119388 -1.000000 +119389 -1.000000 +119390 -1.000000 +119391 -1.000000 +119392 -1.000000 +119393 -1.000000 +119395 -1.000000 +119397 -1.000000 +119400 -1.000000 +119401 -1.000000 +119402 -1.000000 +119403 -1.000000 +119404 -1.000000 +119407 -1.000000 +119409 -1.000000 +119410 -1.000000 +119411 -1.000000 +119420 -1.000000 +119422 -1.000000 +119424 -1.000000 +119426 -1.000000 +119428 -1.000000 +119429 -1.000000 +119430 -1.000000 +119431 -1.000000 +119432 -1.000000 +119433 -1.000000 +119434 -1.000000 +119435 -1.000000 +119437 -1.000000 +119446 -1.000000 +119448 -1.000000 +119450 -1.000000 +119460 -1.000000 +119461 -1.000000 +119462 -1.000000 +119463 -1.000000 +119464 -1.000000 +119466 -1.000000 +119467 -1.000000 +119468 -1.000000 +119469 -1.000000 +119470 -1.000000 +119471 -1.000000 +119472 -1.000000 +119473 -1.000000 +119474 -1.000000 +119475 -1.000000 +119484 -1.000000 +119486 -1.000000 +119487 -1.000000 +119488 -1.000000 +119489 -1.000000 +119493 -1.000000 +119494 -1.000000 +119495 -1.000000 +119496 -1.000000 +119497 -1.000000 +119498 -1.000000 +119499 -1.000000 +119500 -1.000000 +119501 -1.000000 +119503 -1.000000 +119504 -1.000000 +119505 -1.000000 +119506 -1.000000 +119507 -1.000000 +119508 -1.000000 +119509 -1.000000 +119510 -1.000000 +119511 -1.000000 +119512 -1.000000 +119513 -1.000000 +119514 -1.000000 +119515 -1.000000 +119516 -1.000000 +119518 -1.000000 +119519 -1.000000 +119520 -1.000000 +119521 -1.000000 +119522 -1.000000 +119523 -1.000000 +119524 -1.000000 +119525 -1.000000 +119526 -1.000000 +119527 -1.000000 +119528 -1.000000 +119529 -1.000000 +119530 -1.000000 +119531 -1.000000 +119532 -1.000000 +119533 -1.000000 +119534 -1.000000 +119535 -1.000000 +119536 -1.000000 +119538 -1.000000 +119539 -1.000000 +119540 -1.000000 +119541 -1.000000 +119542 -1.000000 +119544 -1.000000 +119545 -1.000000 +119546 -1.000000 +119547 -1.000000 +119548 -1.000000 +119549 -1.000000 +119550 -1.000000 +119551 -1.000000 +119554 -1.000000 +119555 -1.000000 +119557 -1.000000 +119558 -1.000000 +119559 -1.000000 +119560 -1.000000 +119561 -1.000000 +119563 -1.000000 +119565 -1.000000 +119566 -1.000000 +119567 -1.000000 +119571 -1.000000 +119572 -1.000000 +119573 -1.000000 +119574 -1.000000 +119575 -1.000000 +119576 -1.000000 +119577 -1.000000 +119578 -1.000000 +119579 -1.000000 +119580 -1.000000 +119581 -1.000000 +119582 -1.000000 +119583 -1.000000 +119584 -1.000000 +119585 -1.000000 +119586 -1.000000 +119587 -1.000000 +119588 -1.000000 +119591 -1.000000 +119594 -1.000000 +119595 -1.000000 +119596 -1.000000 +119597 -1.000000 +119598 -1.000000 +119599 -1.000000 +119601 -1.000000 +119602 -1.000000 +119603 -1.000000 +119604 -1.000000 +119605 -1.000000 +119607 -1.000000 +119608 -1.000000 +119609 -1.000000 +119610 -1.000000 +119611 -1.000000 +119612 -1.000000 +119613 -1.000000 +119614 -1.000000 +119615 -1.000000 +119616 -1.000000 +119617 -1.000000 +119618 -1.000000 +119619 -1.000000 +119620 -1.000000 +119623 -1.000000 +119624 -1.000000 +119625 -1.000000 +119627 -1.000000 +119630 -1.000000 +119634 -1.000000 +119637 -1.000000 +119646 -1.000000 +119647 -1.000000 +119648 -1.000000 +119649 -1.000000 +119652 -1.000000 +119657 -1.000000 +119665 -1.000000 +119668 -1.000000 +119679 -1.000000 +119686 -1.000000 +119687 -1.000000 +119688 -1.000000 +119689 -1.000000 +119690 -1.000000 +119691 -1.000000 +119692 -1.000000 +119693 -1.000000 +119696 -1.000000 +119697 -1.000000 +119698 -1.000000 +119699 -1.000000 +119700 -1.000000 +119701 -1.000000 +119702 -1.000000 +119703 -1.000000 +119704 -1.000000 +119705 -1.000000 +119706 -1.000000 +119707 -1.000000 +119708 -1.000000 +119711 -1.000000 +119715 -1.000000 +119716 -1.000000 +119723 -1.000000 +119724 -1.000000 +119725 -1.000000 +119726 -1.000000 +119727 -1.000000 +119729 -1.000000 +119730 -1.000000 +119731 -1.000000 +119732 -1.000000 +119733 -1.000000 +119735 -1.000000 +119737 -1.000000 +119738 -1.000000 +119744 -1.000000 +119748 -1.000000 +119750 -1.000000 +119751 -1.000000 +119754 -1.000000 +119755 -1.000000 +119757 -1.000000 +119761 -1.000000 +119762 -1.000000 +119763 -1.000000 +119764 -1.000000 +119765 -1.000000 +119766 -1.000000 +119767 -1.000000 +119768 -1.000000 +119769 -1.000000 +119770 -1.000000 +119771 -1.000000 +119772 -1.000000 +119773 -1.000000 +119774 -1.000000 +119775 -1.000000 +119776 -1.000000 +119777 -1.000000 +119778 -1.000000 +119779 -1.000000 +119780 -1.000000 +119781 -1.000000 +119782 -1.000000 +119783 -1.000000 +119784 -1.000000 +119785 -1.000000 +119786 -1.000000 +119787 -1.000000 +119788 -1.000000 +119790 -1.000000 +119791 -1.000000 +119793 -1.000000 +119794 -1.000000 +119795 -1.000000 +119797 -1.000000 +119798 -1.000000 +119801 -1.000000 +119806 -1.000000 +119818 -1.000000 +119819 -1.000000 +119847 -1.000000 +119849 -1.000000 +119850 -1.000000 +119851 -1.000000 +119852 -1.000000 +119853 -1.000000 +119856 -1.000000 +119857 -1.000000 +119861 -1.000000 +119868 -1.000000 +119872 -1.000000 +119874 -1.000000 +119879 -1.000000 +119887 -1.000000 +119889 -1.000000 +119890 -1.000000 +119891 -1.000000 +119892 -1.000000 +119893 -1.000000 +119894 -1.000000 +119895 -1.000000 +119896 -1.000000 +119897 -1.000000 +119898 -1.000000 +119899 -1.000000 +119900 -1.000000 +119901 -1.000000 +119902 -1.000000 +119903 -1.000000 +119904 -1.000000 +119905 -1.000000 +119907 -1.000000 +119908 -1.000000 +119909 -1.000000 +119911 -1.000000 +119914 -1.000000 +119916 -1.000000 +119917 -1.000000 +119918 -1.000000 +119919 -1.000000 +119920 -1.000000 +119921 -1.000000 +119922 -1.000000 +119923 -1.000000 +119924 -1.000000 +119925 -1.000000 +119926 -1.000000 +119927 -1.000000 +119928 -1.000000 +119929 -1.000000 +119930 -1.000000 +119932 -1.000000 +119933 -1.000000 +119934 -1.000000 +119935 -1.000000 +119936 -1.000000 +119937 -1.000000 +119939 -1.000000 +119941 -1.000000 +119943 -1.000000 +119946 -1.000000 +119954 -1.000000 +119955 -1.000000 +119957 -1.000000 +119958 -1.000000 +119959 -1.000000 +119960 -1.000000 +119961 -1.000000 +119962 -1.000000 +119974 -1.000000 +119975 -1.000000 +119976 -1.000000 +119977 -1.000000 +119978 -1.000000 +119979 -1.000000 +119980 -1.000000 +119981 -1.000000 +119982 -1.000000 +119983 -1.000000 +119996 -1.000000 +120015 -1.000000 +120018 -1.000000 +120021 -1.000000 +120023 -1.000000 +120030 -1.000000 +120033 -1.000000 +120034 -1.000000 +120035 -1.000000 +120036 -1.000000 +120037 -1.000000 +120038 -1.000000 +120039 -1.000000 +120042 -1.000000 +120044 -1.000000 +120047 -1.000000 +120048 -1.000000 +120049 -1.000000 +120050 -1.000000 +120051 -1.000000 +120052 -1.000000 +120053 -1.000000 +120054 -1.000000 +120055 -1.000000 +120056 -1.000000 +120059 -1.000000 +120060 -1.000000 +120062 -1.000000 +120063 -1.000000 +120065 -1.000000 +120066 -1.000000 +120067 -1.000000 +120069 -1.000000 +120070 -1.000000 +120074 -1.000000 +120075 -1.000000 +120076 -1.000000 +120077 -1.000000 +120078 -1.000000 +120079 -1.000000 +120080 -1.000000 +120081 -1.000000 +120082 -1.000000 +120083 -1.000000 +120084 -1.000000 +120085 -1.000000 +120086 -1.000000 +120087 -1.000000 +120088 -1.000000 +120089 -1.000000 +120090 -1.000000 +120091 -1.000000 +120092 -1.000000 +120093 -1.000000 +120095 -1.000000 +120096 -1.000000 +120097 -1.000000 +120098 -1.000000 +120099 -1.000000 +120100 -1.000000 +120101 -1.000000 +120102 -1.000000 +120103 -1.000000 +120104 -1.000000 +120105 -1.000000 +120109 -1.000000 +120110 -1.000000 +120111 -1.000000 +120112 -1.000000 +120113 -1.000000 +120114 -1.000000 +120115 -1.000000 +120116 -1.000000 +120117 -1.000000 +120118 -1.000000 +120119 -1.000000 +120120 -1.000000 +120121 -1.000000 +120122 -1.000000 +120123 -1.000000 +120124 -1.000000 +120125 -1.000000 +120126 -1.000000 +120127 -1.000000 +120128 -1.000000 +120129 -1.000000 +120130 -1.000000 +120132 -1.000000 +120133 -1.000000 +120134 -1.000000 +120135 -1.000000 +120136 -1.000000 +120137 -1.000000 +120138 -1.000000 +120139 -1.000000 +120140 -1.000000 +120144 -1.000000 +120145 -1.000000 +120147 -1.000000 +120149 -1.000000 +120150 -1.000000 +120153 -1.000000 +120154 -1.000000 +120155 -1.000000 +120156 -1.000000 +120157 -1.000000 +120158 -1.000000 +120159 -1.000000 +120160 -1.000000 +120161 -1.000000 +120162 -1.000000 +120163 -1.000000 +120164 -1.000000 +120165 -1.000000 +120166 -1.000000 +120167 -1.000000 +120168 -1.000000 +120170 -1.000000 +120171 -1.000000 +120172 -1.000000 +120173 -1.000000 +120174 -1.000000 +120175 -1.000000 +120176 -1.000000 +120178 -1.000000 +120179 -1.000000 +120181 -1.000000 +120182 -1.000000 +120183 -1.000000 +120185 -1.000000 +120195 -1.000000 +120203 -1.000000 +120204 -1.000000 +120206 -1.000000 +120207 -1.000000 +120208 -1.000000 +120211 -1.000000 +120212 -1.000000 +120214 -1.000000 +120215 -1.000000 +120237 -1.000000 +120245 -1.000000 +120247 -1.000000 +120249 -1.000000 +120254 -1.000000 +120256 -1.000000 +120264 -1.000000 +120271 -1.000000 +120273 -1.000000 +120275 -1.000000 +120276 -1.000000 +120277 -1.000000 +120281 -1.000000 +120284 -1.000000 +120286 -1.000000 +120287 -1.000000 +120289 -1.000000 +120290 -1.000000 +120291 -1.000000 +120292 -1.000000 +120293 -1.000000 +120296 -1.000000 +120297 -1.000000 +120298 -1.000000 +120305 -1.000000 +120313 -1.000000 +120314 -1.000000 +120315 -1.000000 +120316 -1.000000 +120317 -1.000000 +120318 -1.000000 +120319 -1.000000 +120320 -1.000000 +120322 -1.000000 +120325 -1.000000 +120326 -1.000000 +120327 -1.000000 +120328 -1.000000 +120329 -1.000000 +120331 -1.000000 +120332 -1.000000 +120333 -1.000000 +120334 -1.000000 +120335 -1.000000 +120336 -1.000000 +120337 -1.000000 +120339 -1.000000 +120340 -1.000000 +120341 -1.000000 +120342 -1.000000 +120343 -1.000000 +120344 -1.000000 +120347 -1.000000 +120348 -1.000000 +120349 -1.000000 +120350 -1.000000 +120351 -1.000000 +120352 -1.000000 +120362 -1.000000 +120363 -1.000000 +120364 -1.000000 +120365 -1.000000 +120366 -1.000000 +120368 -1.000000 +120369 -1.000000 +120370 -1.000000 +120372 -1.000000 +120373 -1.000000 +120374 -1.000000 +120375 -1.000000 +120376 -1.000000 +120380 -1.000000 +120381 -1.000000 +120385 -1.000000 +120388 -1.000000 +120389 -1.000000 +120415 -1.000000 +120416 -1.000000 +120419 -1.000000 +120427 -1.000000 +120433 -1.000000 +120435 -1.000000 +120436 -1.000000 +120438 -1.000000 +120440 -1.000000 +120444 -1.000000 +120445 -1.000000 +120447 -1.000000 +120452 -1.000000 +120453 -1.000000 +120454 -1.000000 +120455 -1.000000 +120456 -1.000000 +120457 -1.000000 +120458 -1.000000 +120459 -1.000000 +120461 -1.000000 +120464 -1.000000 +120465 -1.000000 +120466 -1.000000 +120467 -1.000000 +120470 -1.000000 +120473 -1.000000 +120475 -1.000000 +120476 -1.000000 +120479 -1.000000 +120480 -1.000000 +120481 -1.000000 +120482 -1.000000 +120485 -1.000000 +120486 -1.000000 +120490 -1.000000 +120491 -1.000000 +120492 -1.000000 +120493 -1.000000 +120494 -1.000000 +120495 -1.000000 +120496 -1.000000 +120497 -1.000000 +120498 -1.000000 +120499 -1.000000 +120500 -1.000000 +120501 -1.000000 +120502 -1.000000 +120503 -1.000000 +120504 -1.000000 +120505 -1.000000 +120506 -1.000000 +120507 -1.000000 +120509 -1.000000 +120510 -1.000000 +120511 -1.000000 +120512 -1.000000 +120513 -1.000000 +120514 -1.000000 +120515 -1.000000 +120516 -1.000000 +120518 -1.000000 +120530 -1.000000 +120531 -1.000000 +120532 -1.000000 +120533 -1.000000 +120535 -1.000000 +120536 -1.000000 +120537 -1.000000 +120538 -1.000000 +120541 -1.000000 +120542 -1.000000 +120563 -1.000000 +120567 -1.000000 +120575 -1.000000 +120576 -1.000000 +120577 -1.000000 +120581 -1.000000 +120591 -1.000000 +120603 -1.000000 +120604 -1.000000 +120606 -1.000000 +120607 -1.000000 +120608 -1.000000 +120610 -1.000000 +120611 -1.000000 +120615 -1.000000 +120616 -1.000000 +120617 -1.000000 +120618 -1.000000 +120619 -1.000000 +120622 -1.000000 +120623 -1.000000 +120624 -1.000000 +120625 -1.000000 +120626 -1.000000 +120627 -1.000000 +120628 -1.000000 +120629 -1.000000 +120630 -1.000000 +120631 -1.000000 +120632 -1.000000 +120633 -1.000000 +120635 -1.000000 +120636 -1.000000 +120637 -1.000000 +120638 -1.000000 +120639 -1.000000 +120641 -1.000000 +120642 -1.000000 +120643 -1.000000 +120644 -1.000000 +120645 -1.000000 +120646 -1.000000 +120647 -1.000000 +120648 -1.000000 +120649 -1.000000 +120651 -1.000000 +120654 -1.000000 +120655 -1.000000 +120656 -1.000000 +120657 -1.000000 +120658 -1.000000 +120659 -1.000000 +120661 -1.000000 +120663 -1.000000 +120664 -1.000000 +120665 -1.000000 +120667 -1.000000 +120670 -1.000000 +120672 -1.000000 +120673 -1.000000 +120674 -1.000000 +120679 -1.000000 +120687 -1.000000 +120696 -1.000000 +120698 -1.000000 +120699 -1.000000 +120704 -1.000000 +120705 -1.000000 +120706 -1.000000 +120707 -1.000000 +120708 -1.000000 +120709 -1.000000 +120710 -1.000000 +120711 -1.000000 +120713 -1.000000 +120714 -1.000000 +120715 -1.000000 +120716 -1.000000 +120717 -1.000000 +120718 -1.000000 +120719 -1.000000 +120720 -1.000000 +120721 -1.000000 +120726 -1.000000 +120727 -1.000000 +120728 -1.000000 +120729 -1.000000 +120733 -1.000000 +120734 -1.000000 +120736 -1.000000 +120757 -1.000000 +120758 -1.000000 +120759 -1.000000 +120760 -1.000000 +120761 -1.000000 +120762 -1.000000 +120763 -1.000000 +120764 -1.000000 +120765 -1.000000 +120766 -1.000000 +120767 -1.000000 +120768 -1.000000 +120769 -1.000000 +120771 -1.000000 +120772 -1.000000 +120773 -1.000000 +120774 -1.000000 +120775 -1.000000 +120776 -1.000000 +120777 -1.000000 +120778 -1.000000 +120780 -1.000000 +120781 -1.000000 +120782 -1.000000 +120787 -1.000000 +120789 -1.000000 +120791 -1.000000 +120793 -1.000000 +120794 -1.000000 +120795 -1.000000 +120797 -1.000000 +120798 -1.000000 +120799 -1.000000 +120801 -1.000000 +120802 -1.000000 +120803 -1.000000 +120804 -1.000000 +120805 -1.000000 +120807 -1.000000 +120808 -1.000000 +120813 -1.000000 +120814 -1.000000 +120816 -1.000000 +120819 -1.000000 +120820 -1.000000 +120822 -1.000000 +120825 -1.000000 +120827 -1.000000 +120828 -1.000000 +120829 -1.000000 +120830 -1.000000 +120831 -1.000000 +120832 -1.000000 +120833 -1.000000 +120834 -1.000000 +120835 -1.000000 +120836 -1.000000 +120838 -1.000000 +120841 -1.000000 +120842 -1.000000 +120847 -1.000000 +120851 -1.000000 +120854 -1.000000 +120856 -1.000000 +120858 -1.000000 +120862 -1.000000 +120866 -1.000000 +120869 -1.000000 +120871 -1.000000 +120872 -1.000000 +120873 -1.000000 +120874 -1.000000 +120875 -1.000000 +120876 -1.000000 +120877 -1.000000 +120878 -1.000000 +120879 -1.000000 +120880 -1.000000 +120881 -1.000000 +120882 -1.000000 +120883 -1.000000 +120884 -1.000000 +120885 -1.000000 +120886 -1.000000 +120887 -1.000000 +120888 -1.000000 +120889 -1.000000 +120890 -1.000000 +120891 -1.000000 +120892 -1.000000 +120893 -1.000000 +120894 -1.000000 +120895 -1.000000 +120896 -1.000000 +120897 -1.000000 +120898 -1.000000 +120901 -1.000000 +120902 -1.000000 +120903 -1.000000 +120904 -1.000000 +120905 -1.000000 +120906 -1.000000 +120907 -1.000000 +120908 -1.000000 +120909 -1.000000 +120910 -1.000000 +120911 -1.000000 +120912 -1.000000 +120913 -1.000000 +120914 -1.000000 +120915 -1.000000 +120916 -1.000000 +120917 -1.000000 +120918 -1.000000 +120919 -1.000000 +120920 -1.000000 +120922 -1.000000 +120926 -1.000000 +120931 -1.000000 +120932 -1.000000 +120933 -1.000000 +120934 -1.000000 +120936 -1.000000 +120937 -1.000000 +120940 -1.000000 +120942 -1.000000 +120945 -1.000000 +120950 -1.000000 +120953 -1.000000 +120954 -1.000000 +120955 -1.000000 +120956 -1.000000 +120961 -1.000000 +120968 -1.000000 +120969 -1.000000 +120970 -1.000000 +120971 -1.000000 +120972 -1.000000 +120973 -1.000000 +120974 -1.000000 +120975 -1.000000 +120976 -1.000000 +120977 -1.000000 +120978 -1.000000 +120980 -1.000000 +120983 -1.000000 +120998 -1.000000 +120999 -1.000000 +121023 -1.000000 +121047 -1.000000 +121050 -1.000000 +121051 -1.000000 +121052 -1.000000 +121053 -1.000000 +121054 -1.000000 +121055 -1.000000 +121056 -1.000000 +121057 -1.000000 +121058 -1.000000 +121059 -1.000000 +121060 -1.000000 +121061 -1.000000 +121062 -1.000000 +121063 -1.000000 +121065 -1.000000 +121074 -1.000000 +121075 -1.000000 +121077 -1.000000 +121078 -1.000000 +121079 -1.000000 +121080 -1.000000 +121081 -1.000000 +121082 -1.000000 +121083 -1.000000 +121084 -1.000000 +121085 -1.000000 +121086 -1.000000 +121087 -1.000000 +121088 -1.000000 +121089 -1.000000 +121090 -1.000000 +121092 -1.000000 +121093 -1.000000 +121094 -1.000000 +121095 -1.000000 +121096 -1.000000 +121097 -1.000000 +121098 -1.000000 +121099 -1.000000 +121100 -1.000000 +121101 -1.000000 +121102 -1.000000 +121103 -1.000000 +121104 -1.000000 +121105 -1.000000 +121106 -1.000000 +121107 -1.000000 +121108 -1.000000 +121109 -1.000000 +121110 -1.000000 +121111 -1.000000 +121112 -1.000000 +121113 -1.000000 +121114 -1.000000 +121115 -1.000000 +121116 -1.000000 +121118 -1.000000 +121119 -1.000000 +121120 -1.000000 +121121 -1.000000 +121122 -1.000000 +121123 -1.000000 +121124 -1.000000 +121125 -1.000000 +121127 -1.000000 +121129 -1.000000 +121134 -1.000000 +121135 -1.000000 +121136 -1.000000 +121137 -1.000000 +121138 -1.000000 +121139 -1.000000 +121141 -1.000000 +121142 -1.000000 +121143 -1.000000 +121144 -1.000000 +121145 -1.000000 +121146 -1.000000 +121148 -1.000000 +121151 -1.000000 +121152 -1.000000 +121156 -1.000000 +121160 -1.000000 +121162 -1.000000 +121164 -1.000000 +121183 -1.000000 +121199 -1.000000 +121202 -1.000000 +121203 -1.000000 +121204 -1.000000 +121205 -1.000000 +121237 -1.000000 +121239 -1.000000 +121242 -1.000000 +121274 -1.000000 +121275 -1.000000 +121277 -1.000000 +121283 -1.000000 +121285 -1.000000 +121316 -1.000000 +121319 -1.000000 +121320 -1.000000 +121321 -1.000000 +121322 -1.000000 +121323 -1.000000 +121324 -1.000000 +121325 -1.000000 +121326 -1.000000 +121327 -1.000000 +121330 -1.000000 +121335 -1.000000 +121337 -1.000000 +121338 -1.000000 +121341 -1.000000 +121342 -1.000000 +121347 -1.000000 +121348 -1.000000 +121356 -1.000000 +121372 -1.000000 +121378 -1.000000 +121380 -1.000000 +121381 -1.000000 +121382 -1.000000 +121383 -1.000000 +121384 -1.000000 +121385 -1.000000 +121387 -1.000000 +121392 -1.000000 +121405 -1.000000 +121408 -1.000000 +121412 -1.000000 +121413 -1.000000 +121419 -1.000000 +121420 -1.000000 +121424 -1.000000 +121425 -1.000000 +121426 -1.000000 +121428 -1.000000 +121429 -1.000000 +121430 -1.000000 +121431 -1.000000 +121432 -1.000000 +121433 -1.000000 +121434 -1.000000 +121435 -1.000000 +121436 -1.000000 +121437 -1.000000 +121441 -1.000000 +121442 -1.000000 +121447 -1.000000 +121451 -1.000000 +121452 -1.000000 +121453 -1.000000 +121454 -1.000000 +121455 -1.000000 +121462 -1.000000 +121467 -1.000000 +121473 -1.000000 +121485 -1.000000 +121486 -1.000000 +121490 -1.000000 +121495 -1.000000 +121499 -1.000000 +121500 -1.000000 +121512 -1.000000 +121520 -1.000000 +121523 -1.000000 +121524 -1.000000 +121525 -1.000000 +121526 -1.000000 +121527 -1.000000 +121528 -1.000000 +121529 -1.000000 +121530 -1.000000 +121531 -1.000000 +121532 -1.000000 +121541 -1.000000 +121546 -1.000000 +121547 -1.000000 +121548 -1.000000 +121550 -1.000000 +121551 -1.000000 +121552 -1.000000 +121553 -1.000000 +121555 -1.000000 +121556 -1.000000 +121559 -1.000000 +121560 -1.000000 +121561 -1.000000 +121562 -1.000000 +121565 -1.000000 +121566 -1.000000 +121567 -1.000000 +121568 -1.000000 +121569 -1.000000 +121571 -1.000000 +121573 -1.000000 +121576 -1.000000 +121577 -1.000000 +121578 -1.000000 +121580 -1.000000 +121581 -1.000000 +121584 -1.000000 +121585 -1.000000 +121591 -1.000000 +121612 -1.000000 +121613 -1.000000 +121616 -1.000000 +121619 -1.000000 +121621 -1.000000 +121626 -1.000000 +121629 -1.000000 +121630 -1.000000 +121631 -1.000000 +121632 -1.000000 +121633 -1.000000 +121634 -1.000000 +121635 -1.000000 +121636 -1.000000 +121637 -1.000000 +121638 -1.000000 +121639 -1.000000 +121640 -1.000000 +121672 -1.000000 +121674 -1.000000 +121687 -1.000000 +121695 -1.000000 +121697 -1.000000 +121699 -1.000000 +121701 -1.000000 +121705 -1.000000 +121706 -1.000000 +121708 -1.000000 +121709 -1.000000 +121712 -1.000000 +121713 -1.000000 +121714 -1.000000 +121715 -1.000000 +121716 -1.000000 +121717 -1.000000 +121721 -1.000000 +121723 -1.000000 +121729 -1.000000 +121730 -1.000000 +121733 -1.000000 +121739 -1.000000 +121742 -1.000000 +121744 -1.000000 +121745 -1.000000 +121747 -1.000000 +121748 -1.000000 +121749 -1.000000 +121751 -1.000000 +121752 -1.000000 +121753 -1.000000 +121756 -1.000000 +121757 -1.000000 +121758 -1.000000 +121759 -1.000000 +121760 -1.000000 +121761 -1.000000 +121762 -1.000000 +121763 -1.000000 +121764 -1.000000 +121765 -1.000000 +121766 -1.000000 +121768 -1.000000 +121769 -1.000000 +121770 -1.000000 +121771 -1.000000 +121772 -1.000000 +121774 -1.000000 +121775 -1.000000 +121776 -1.000000 +121777 -1.000000 +121778 -1.000000 +121779 -1.000000 +121780 -1.000000 +121782 -1.000000 +121785 -1.000000 +121789 -1.000000 +121795 -1.000000 +121797 -1.000000 +121799 -1.000000 +121801 -1.000000 +121803 -1.000000 +121804 -1.000000 +121805 -1.000000 +121808 -1.000000 +121812 -1.000000 +121816 -1.000000 +121817 -1.000000 +121818 -1.000000 +121819 -1.000000 +121823 -1.000000 +121840 -1.000000 +121843 -1.000000 +121844 -1.000000 +121845 -1.000000 +121846 -1.000000 +121855 -1.000000 +121856 -1.000000 +121857 -1.000000 +121858 -1.000000 +121861 -1.000000 +121865 -1.000000 +121866 -1.000000 +121867 -1.000000 +121868 -1.000000 +121873 -1.000000 +121875 -1.000000 +121876 -1.000000 +121877 -1.000000 +121878 -1.000000 +121880 -1.000000 +121881 -1.000000 +121882 -1.000000 +121885 -1.000000 +121886 -1.000000 +121887 -1.000000 +121888 -1.000000 +121889 -1.000000 +121890 -1.000000 +121891 -1.000000 +121892 -1.000000 +121893 -1.000000 +121894 -1.000000 +121895 -1.000000 +121896 -1.000000 +121897 -1.000000 +121898 -1.000000 +121899 -1.000000 +121900 -1.000000 +121901 -1.000000 +121902 -1.000000 +121903 -1.000000 +121904 -1.000000 +121905 -1.000000 +121906 -1.000000 +121907 -1.000000 +121909 -1.000000 +121912 -1.000000 +121913 -1.000000 +121914 -1.000000 +121915 -1.000000 +121916 -1.000000 +121917 -1.000000 +121918 -1.000000 +121919 -1.000000 +121920 -1.000000 +121921 -1.000000 +121922 -1.000000 +121923 -1.000000 +121924 -1.000000 +121927 -1.000000 +121929 -1.000000 +121930 -1.000000 +121931 -1.000000 +121933 -1.000000 +121934 -1.000000 +121935 -1.000000 +121936 -1.000000 +121937 -1.000000 +121938 -1.000000 +121939 -1.000000 +121940 -1.000000 +121941 -1.000000 +121942 -1.000000 +121943 -1.000000 +121944 -1.000000 +121948 -1.000000 +121950 -1.000000 +121951 -1.000000 +121952 -1.000000 +121954 -1.000000 +121955 -1.000000 +121956 -1.000000 +121957 -1.000000 +121958 -1.000000 +121959 -1.000000 +121960 -1.000000 +121961 -1.000000 +121964 -1.000000 +121965 -1.000000 +121966 -1.000000 +121967 -1.000000 +121969 -1.000000 +121977 -1.000000 +121979 -1.000000 +121981 -1.000000 +121983 -1.000000 +121984 -1.000000 +121985 -1.000000 +121986 -1.000000 +121988 -1.000000 +121990 -1.000000 +121992 -1.000000 +121993 -1.000000 +121994 -1.000000 +121995 -1.000000 +121996 -1.000000 +121998 -1.000000 +121999 -1.000000 +122000 -1.000000 +122001 -1.000000 +122002 -1.000000 +122004 -1.000000 +122005 -1.000000 +122006 -1.000000 +122007 -1.000000 +122008 -1.000000 +122010 -1.000000 +122011 -1.000000 +122013 -1.000000 +122014 -1.000000 +122015 -1.000000 +122016 -1.000000 +122019 -1.000000 +122020 -1.000000 +122021 -1.000000 +122023 -1.000000 +122024 -1.000000 +122026 -1.000000 +122028 -1.000000 +122029 -1.000000 +122030 -1.000000 +122031 -1.000000 +122032 -1.000000 +122033 -1.000000 +122041 -1.000000 +122042 -1.000000 +122050 -1.000000 +122052 -1.000000 +122053 -1.000000 +122054 -1.000000 +122056 -1.000000 +122059 -1.000000 +122060 -1.000000 +122061 -1.000000 +122062 -1.000000 +122063 -1.000000 +122064 -1.000000 +122065 -1.000000 +122066 -1.000000 +122067 -1.000000 +122068 -1.000000 +122069 -1.000000 +122071 -1.000000 +122074 -1.000000 +122075 -1.000000 +122076 -1.000000 +122077 -1.000000 +122078 -1.000000 +122079 -1.000000 +122080 -1.000000 +122081 -1.000000 +122082 -1.000000 +122083 -1.000000 +122084 -1.000000 +122085 -1.000000 +122086 -1.000000 +122088 -1.000000 +122089 -1.000000 +122100 -1.000000 +122103 -1.000000 +122107 -1.000000 +122108 -1.000000 +122109 -1.000000 +122110 -1.000000 +122111 -1.000000 +122112 -1.000000 +122115 -1.000000 +122116 -1.000000 +122117 -1.000000 +122118 -1.000000 +122120 -1.000000 +122121 -1.000000 +122122 -1.000000 +122123 -1.000000 +122124 -1.000000 +122125 -1.000000 +122126 -1.000000 +122128 -1.000000 +122129 -1.000000 +122130 -1.000000 +122131 -1.000000 +122137 -1.000000 +122140 -1.000000 +122141 -1.000000 +122142 -1.000000 +122144 -1.000000 +122145 -1.000000 +122147 -1.000000 +122150 -1.000000 +122151 -1.000000 +122152 -1.000000 +122153 -1.000000 +122154 -1.000000 +122156 -1.000000 +122157 -1.000000 +122158 -1.000000 +122159 -1.000000 +122161 -1.000000 +122162 -1.000000 +122163 -1.000000 +122164 -1.000000 +122166 -1.000000 +122171 -1.000000 +122173 -1.000000 +122174 -1.000000 +122175 -1.000000 +122176 -1.000000 +122179 -1.000000 +122183 -1.000000 +122184 -1.000000 +122186 -1.000000 +122187 -1.000000 +122188 -1.000000 +122189 -1.000000 +122190 -1.000000 +122191 -1.000000 +122192 -1.000000 +122193 -1.000000 +122194 -1.000000 +122195 -1.000000 +122196 -1.000000 +122197 -1.000000 +122198 -1.000000 +122199 -1.000000 +122200 -1.000000 +122201 -1.000000 +122202 -1.000000 +122204 -1.000000 +122212 -1.000000 +122213 -1.000000 +122215 -1.000000 +122216 -1.000000 +122217 -1.000000 +122218 -1.000000 +122219 -1.000000 +122220 -1.000000 +122221 -1.000000 +122222 -1.000000 +122223 -1.000000 +122224 -1.000000 +122226 -1.000000 +122232 -1.000000 +122233 -1.000000 +122235 -1.000000 +122237 -1.000000 +122239 -1.000000 +122240 -1.000000 +122245 -1.000000 +122247 -1.000000 +122248 -1.000000 +122249 -1.000000 +122261 -1.000000 +122262 -1.000000 +122263 -1.000000 +122264 -1.000000 +122265 -1.000000 +122266 -1.000000 +122267 -1.000000 +122268 -1.000000 +122269 -1.000000 +122270 -1.000000 +122271 -1.000000 +122272 -1.000000 +122276 -1.000000 +122284 -1.000000 +122286 -1.000000 +122290 -1.000000 +122292 -1.000000 +122293 -1.000000 +122294 -1.000000 +122299 -1.000000 +122303 -1.000000 +122305 -1.000000 +122306 -1.000000 +122307 -1.000000 +122309 -1.000000 +122311 -1.000000 +122312 -1.000000 +122316 -1.000000 +122319 -1.000000 +122321 -1.000000 +122322 -1.000000 +122323 -1.000000 +122324 -1.000000 +122336 -1.000000 +122337 -1.000000 +122338 -1.000000 +122339 -1.000000 +122341 -1.000000 +122342 -1.000000 +122343 -1.000000 +122344 -1.000000 +122370 -1.000000 +122371 -1.000000 +122409 -1.000000 +122414 -1.000000 +122416 -1.000000 +122417 -1.000000 +122418 -1.000000 +122419 -1.000000 +122420 -1.000000 +122421 -1.000000 +122422 -1.000000 +122423 -1.000000 +122424 -1.000000 +122425 -1.000000 +122426 -1.000000 +122427 -1.000000 +122428 -1.000000 +122429 -1.000000 +122430 -1.000000 +122434 -1.000000 +122435 -1.000000 +122437 -1.000000 +122438 -1.000000 +122439 -1.000000 +122443 -1.000000 +122444 -1.000000 +122445 -1.000000 +122447 -1.000000 +122450 -1.000000 +122451 -1.000000 +122452 -1.000000 +122455 -1.000000 +122457 -1.000000 +122458 -1.000000 +122462 -1.000000 +122465 -1.000000 +122467 -1.000000 +122470 -1.000000 +122475 -1.000000 +122480 -1.000000 +122481 -1.000000 +122482 -1.000000 +122483 -1.000000 +122486 -1.000000 +122487 -1.000000 +122489 -1.000000 +122490 -1.000000 +122491 -1.000000 +122492 -1.000000 +122495 -1.000000 +122497 -1.000000 +122501 -1.000000 +122504 -1.000000 +122511 -1.000000 +122512 -1.000000 +122513 -1.000000 +122514 -1.000000 +122519 -1.000000 +122525 -1.000000 +122526 -1.000000 +122527 -1.000000 +122528 -1.000000 +122529 -1.000000 +122530 -1.000000 +122531 -1.000000 +122533 -1.000000 +122536 -1.000000 +122537 -1.000000 +122539 -1.000000 +122541 -1.000000 +122544 -1.000000 +122545 -1.000000 +122546 -1.000000 +122547 -1.000000 +122548 -1.000000 +122549 -1.000000 +122550 -1.000000 +122551 -1.000000 +122552 -1.000000 +122553 -1.000000 +122554 -1.000000 +122556 -1.000000 +122557 -1.000000 +122558 -1.000000 +122560 -1.000000 +122561 -1.000000 +122563 -1.000000 +122564 -1.000000 +122568 -1.000000 +122569 -1.000000 +122570 -1.000000 +122571 -1.000000 +122572 -1.000000 +122573 -1.000000 +122574 -1.000000 +122575 -1.000000 +122576 -1.000000 +122577 -1.000000 +122578 -1.000000 +122579 -1.000000 +122580 -1.000000 +122581 -1.000000 +122582 -1.000000 +122583 -1.000000 +122587 -1.000000 +122590 -1.000000 +122591 -1.000000 +122593 -1.000000 +122595 -1.000000 +122597 -1.000000 +122598 -1.000000 +122599 -1.000000 +122600 -1.000000 +122601 -1.000000 +122602 -1.000000 +122603 -1.000000 +122604 -1.000000 +122605 -1.000000 +122607 -1.000000 +122608 -1.000000 +122616 -1.000000 +122620 -1.000000 +122627 -1.000000 +122630 -1.000000 +122632 -1.000000 +122633 -1.000000 +122634 -1.000000 +122635 -1.000000 +122637 -1.000000 +122638 -1.000000 +122639 -1.000000 +122642 -1.000000 +122645 -1.000000 +122649 -1.000000 +122651 -1.000000 +122652 -1.000000 +122655 -1.000000 +122656 -1.000000 +122659 -1.000000 +122660 -1.000000 +122661 -1.000000 +122662 -1.000000 +122663 -1.000000 +122664 -1.000000 +122665 -1.000000 +122666 -1.000000 +122668 -1.000000 +122669 -1.000000 +122670 -1.000000 +122671 -1.000000 +122672 -1.000000 +122673 -1.000000 +122675 -1.000000 +122676 -1.000000 +122677 -1.000000 +122678 -1.000000 +122679 -1.000000 +122680 -1.000000 +122681 -1.000000 +122682 -1.000000 +122683 -1.000000 +122684 -1.000000 +122685 -1.000000 +122686 -1.000000 +122687 -1.000000 +122688 -1.000000 +122689 -1.000000 +122690 -1.000000 +122693 -1.000000 +122695 -1.000000 +122696 -1.000000 +122697 -1.000000 +122699 -1.000000 +122700 -1.000000 +122701 -1.000000 +122702 -1.000000 +122703 -1.000000 +122704 -1.000000 +122705 -1.000000 +122706 -1.000000 +122707 -1.000000 +122708 -1.000000 +122711 -1.000000 +122713 -1.000000 +122714 -1.000000 +122715 -1.000000 +122716 -1.000000 +122717 -1.000000 +122718 -1.000000 +122719 -1.000000 +122721 -1.000000 +122722 -1.000000 +122723 -1.000000 +122725 -1.000000 +122726 -1.000000 +122727 -1.000000 +122728 -1.000000 +122733 -1.000000 +122736 -1.000000 +122738 -1.000000 +122739 -1.000000 +122740 -1.000000 +122741 -1.000000 +122744 -1.000000 +122745 -1.000000 +122746 -1.000000 +122748 -1.000000 +122749 -1.000000 +122750 -1.000000 +122751 -1.000000 +122752 -1.000000 +122753 -1.000000 +122754 -1.000000 +122755 -1.000000 +122756 -1.000000 +122757 -1.000000 +122758 -1.000000 +122759 -1.000000 +122760 -1.000000 +122761 -1.000000 +122762 -1.000000 +122765 -1.000000 +122766 -1.000000 +122767 -1.000000 +122768 -1.000000 +122769 -1.000000 +122770 -1.000000 +122771 -1.000000 +122772 -1.000000 +122773 -1.000000 +122774 -1.000000 +122775 -1.000000 +122780 -1.000000 +122781 -1.000000 +122782 -1.000000 +122783 -1.000000 +122784 -1.000000 +122788 -1.000000 +122789 -1.000000 +122790 -1.000000 +122792 -1.000000 +122794 -1.000000 +122801 -1.000000 +122802 -1.000000 +122808 -1.000000 +122816 -1.000000 +122817 -1.000000 +122820 -1.000000 +122823 -1.000000 +122833 -1.000000 +122834 -1.000000 +122835 -1.000000 +122838 -1.000000 +122841 -1.000000 +122844 -1.000000 +122845 -1.000000 +122846 -1.000000 +122847 -1.000000 +122848 -1.000000 +122849 -1.000000 +122850 -1.000000 +122851 -1.000000 +122852 -1.000000 +122853 -1.000000 +122854 -1.000000 +122855 -1.000000 +122856 -1.000000 +122857 -1.000000 +122858 -1.000000 +122859 -1.000000 +122860 -1.000000 +122861 -1.000000 +122862 -1.000000 +122863 -1.000000 +122864 -1.000000 +122865 -1.000000 +122866 -1.000000 +122868 -1.000000 +122869 -1.000000 +122871 -1.000000 +122872 -1.000000 +122874 -1.000000 +122875 -1.000000 +122879 -1.000000 +122880 -1.000000 +122881 -1.000000 +122882 -1.000000 +122884 -1.000000 +122885 -1.000000 +122886 -1.000000 +122887 -1.000000 +122888 -1.000000 +122889 -1.000000 +122890 -1.000000 +122891 -1.000000 +122892 -1.000000 +122893 -1.000000 +122894 -1.000000 +122895 -1.000000 +122896 -1.000000 +122897 -1.000000 +122898 -1.000000 +122899 -1.000000 +122903 -1.000000 +122904 -1.000000 +122905 -1.000000 +122906 -1.000000 +122907 -1.000000 +122908 -1.000000 +122909 -1.000000 +122910 -1.000000 +122912 -1.000000 +122914 -1.000000 +122916 -1.000000 +122918 -1.000000 +122919 -1.000000 +122921 -1.000000 +122922 -1.000000 +122923 -1.000000 +122924 -1.000000 +122925 -1.000000 +122928 -1.000000 +122931 -1.000000 +122934 -1.000000 +122935 -1.000000 +122936 -1.000000 +122937 -1.000000 +122948 -1.000000 +122949 -1.000000 +122951 -1.000000 +122955 -1.000000 +122958 -1.000000 +122960 -1.000000 +122961 -1.000000 +122965 -1.000000 +122966 -1.000000 +122967 -1.000000 +122968 -1.000000 +122969 -1.000000 +122970 -1.000000 +122973 -1.000000 +122974 -1.000000 +122975 -1.000000 +122977 -1.000000 +122978 -1.000000 +122981 -1.000000 +122983 -1.000000 +122984 -1.000000 +122985 -1.000000 +122987 -1.000000 +122989 -1.000000 +122990 -1.000000 +122992 -1.000000 +122994 -1.000000 +122995 -1.000000 +122997 -1.000000 +122998 -1.000000 +123003 -1.000000 +123006 -1.000000 +123012 -1.000000 +123017 -1.000000 +123018 -1.000000 +123019 -1.000000 +123020 -1.000000 +123021 -1.000000 +123027 -1.000000 +123031 -1.000000 +123032 -1.000000 +123033 -1.000000 +123034 -1.000000 +123035 -1.000000 +123036 -1.000000 +123037 -1.000000 +123038 -1.000000 +123039 -1.000000 +123041 -1.000000 +123042 -1.000000 +123043 -1.000000 +123044 -1.000000 +123045 -1.000000 +123046 -1.000000 +123047 -1.000000 +123048 -1.000000 +123049 -1.000000 +123050 -1.000000 +123051 -1.000000 +123052 -1.000000 +123054 -1.000000 +123055 -1.000000 +123056 -1.000000 +123057 -1.000000 +123058 -1.000000 +123059 -1.000000 +123060 -1.000000 +123061 -1.000000 +123062 -1.000000 +123063 -1.000000 +123064 -1.000000 +123066 -1.000000 +123067 -1.000000 +123068 -1.000000 +123069 -1.000000 +123070 -1.000000 +123072 -1.000000 +123073 -1.000000 +123074 -1.000000 +123075 -1.000000 +123076 -1.000000 +123077 -1.000000 +123078 -1.000000 +123079 -1.000000 +123080 -1.000000 +123081 -1.000000 +123082 -1.000000 +123083 -1.000000 +123084 -1.000000 +123086 -1.000000 +123087 -1.000000 +123088 -1.000000 +123089 -1.000000 +123090 -1.000000 +123091 -1.000000 +123092 -1.000000 +123093 -1.000000 +123096 -1.000000 +123097 -1.000000 +123098 -1.000000 +123099 -1.000000 +123100 -1.000000 +123101 -1.000000 +123102 -1.000000 +123103 -1.000000 +123106 -1.000000 +123108 -1.000000 +123109 -1.000000 +123110 -1.000000 +123111 -1.000000 +123112 -1.000000 +123113 -1.000000 +123114 -1.000000 +123115 -1.000000 +123116 -1.000000 +123117 -1.000000 +123118 -1.000000 +123119 -1.000000 +123120 -1.000000 +123121 -1.000000 +123122 -1.000000 +123123 -1.000000 +123124 -1.000000 +123125 -1.000000 +123126 -1.000000 +123127 -1.000000 +123128 -1.000000 +123129 -1.000000 +123130 -1.000000 +123131 -1.000000 +123132 -1.000000 +123133 -1.000000 +123134 -1.000000 +123136 -1.000000 +123137 -1.000000 +123138 -1.000000 +123139 -1.000000 +123140 -1.000000 +123141 -1.000000 +123142 -1.000000 +123143 -1.000000 +123144 -1.000000 +123145 -1.000000 +123146 -1.000000 +123147 -1.000000 +123148 -1.000000 +123149 -1.000000 +123150 -1.000000 +123151 -1.000000 +123152 -1.000000 +123153 -1.000000 +123155 -1.000000 +123157 -1.000000 +123158 -1.000000 +123159 -1.000000 +123160 -1.000000 +123161 -1.000000 +123162 -1.000000 +123163 -1.000000 +123164 -1.000000 +123165 -1.000000 +123169 -1.000000 +123170 -1.000000 +123171 -1.000000 +123172 -1.000000 +123173 -1.000000 +123174 -1.000000 +123175 -1.000000 +123176 -1.000000 +123177 -1.000000 +123182 -1.000000 +123183 -1.000000 +123184 -1.000000 +123188 -1.000000 +123189 -1.000000 +123190 -1.000000 +123192 -1.000000 +123197 -1.000000 +123199 -1.000000 +123202 -1.000000 +123203 -1.000000 +123204 -1.000000 +123205 -1.000000 +123206 -1.000000 +123207 -1.000000 +123208 -1.000000 +123209 -1.000000 +123212 -1.000000 +123213 -1.000000 +123214 -1.000000 +123235 -1.000000 +123236 -1.000000 +123239 -1.000000 +123240 -1.000000 +123242 -1.000000 +123243 -1.000000 +123244 -1.000000 +123246 -1.000000 +123248 -1.000000 +123249 -1.000000 +123250 -1.000000 +123251 -1.000000 +123252 -1.000000 +123253 -1.000000 +123254 -1.000000 +123255 -1.000000 +123256 -1.000000 +123257 -1.000000 +123258 -1.000000 +123259 -1.000000 +123260 -1.000000 +123261 -1.000000 +123262 -1.000000 +123263 -1.000000 +123264 -1.000000 +123265 -1.000000 +123266 -1.000000 +123267 -1.000000 +123268 -1.000000 +123269 -1.000000 +123270 -1.000000 +123271 -1.000000 +123272 -1.000000 +123273 -1.000000 +123274 -1.000000 +123275 -1.000000 +123277 -1.000000 +123279 -1.000000 +123281 -1.000000 +123282 -1.000000 +123286 -1.000000 +123287 -1.000000 +123288 -1.000000 +123292 -1.000000 +123298 -1.000000 +123299 -1.000000 +123300 -1.000000 +123301 -1.000000 +123302 -1.000000 +123303 -1.000000 +123304 -1.000000 +123305 -1.000000 +123306 -1.000000 +123307 -1.000000 +123308 -1.000000 +123309 -1.000000 +123310 -1.000000 +123313 -1.000000 +123316 -1.000000 +123317 -1.000000 +123318 -1.000000 +123322 -1.000000 +123323 -1.000000 +123324 -1.000000 +123325 -1.000000 +123326 -1.000000 +123327 -1.000000 +123329 -1.000000 +123331 -1.000000 +123333 -1.000000 +123334 -1.000000 +123335 -1.000000 +123336 -1.000000 +123337 -1.000000 +123338 -1.000000 +123339 -1.000000 +123341 -1.000000 +123342 -1.000000 +123344 -1.000000 +123345 -1.000000 +123346 -1.000000 +123347 -1.000000 +123348 -1.000000 +123349 -1.000000 +123350 -1.000000 +123351 -1.000000 +123352 -1.000000 +123353 -1.000000 +123354 -1.000000 +123355 -1.000000 +123356 -1.000000 +123357 -1.000000 +123359 -1.000000 +123371 -1.000000 +123372 -1.000000 +123374 -1.000000 +123382 -1.000000 +123383 -1.000000 +123384 -1.000000 +123385 -1.000000 +123387 -1.000000 +123388 -1.000000 +123389 -1.000000 +123395 -1.000000 +123396 -1.000000 +123397 -1.000000 +123398 -1.000000 +123399 -1.000000 +123400 -1.000000 +123401 -1.000000 +123402 -1.000000 +123405 -1.000000 +123410 -1.000000 +123413 -1.000000 +123414 -1.000000 +123416 -1.000000 +123417 -1.000000 +123419 -1.000000 +123471 -1.000000 +123474 -1.000000 +123507 -1.000000 +123508 -1.000000 +123509 -1.000000 +123510 -1.000000 +123512 -1.000000 +123519 -1.000000 +123521 -1.000000 +123522 -1.000000 +123526 -1.000000 +123569 -1.000000 +123573 -1.000000 +124004 -1.000000 +124183 -1.000000 +124201 -1.000000 +124202 -1.000000 +124343 -1.000000 +124348 -1.000000 +124349 -1.000000 +124350 -1.000000 +124351 -1.000000 +124352 -1.000000 +124356 -1.000000 +124357 -1.000000 +124358 -1.000000 +124361 -1.000000 +124363 -1.000000 +124364 -1.000000 +124371 -1.000000 +124375 -1.000000 +124376 -1.000000 +124379 -1.000000 +124382 -1.000000 +124384 -1.000000 +124385 -1.000000 +124386 -1.000000 +124387 -1.000000 +124388 -1.000000 +124391 -1.000000 +124392 -1.000000 +124394 -1.000000 +124395 -1.000000 +124396 -1.000000 +124397 -1.000000 +124399 -1.000000 +124400 -1.000000 +124401 -1.000000 +124402 -1.000000 +124404 -1.000000 +124405 -1.000000 +124408 -1.000000 +124413 -1.000000 +124415 -1.000000 +124416 -1.000000 +124417 -1.000000 +124418 -1.000000 +124419 -1.000000 +124420 -1.000000 +124421 -1.000000 +124422 -1.000000 +124423 -1.000000 +124424 -1.000000 +124425 -1.000000 +124427 -1.000000 +124433 -1.000000 +124435 -1.000000 +124436 -1.000000 +124437 -1.000000 +124438 -1.000000 +124446 -1.000000 +124447 -1.000000 +124455 -1.000000 +124456 -1.000000 +124457 -1.000000 +124461 -1.000000 +124462 -1.000000 +124465 -1.000000 +124466 -1.000000 +124467 -1.000000 +124468 -1.000000 +124469 -1.000000 +124470 -1.000000 +124471 -1.000000 +124472 -1.000000 +124473 -1.000000 +124474 -1.000000 +124475 -1.000000 +124476 -1.000000 +124477 -1.000000 +124486 -1.000000 +124487 -1.000000 +124488 -1.000000 +124492 -1.000000 +124494 -1.000000 +124495 -1.000000 +124496 -1.000000 +124497 -1.000000 +124498 -1.000000 +124499 -1.000000 +124500 -1.000000 +124501 -1.000000 +124503 -1.000000 +124505 -1.000000 +124506 -1.000000 +124509 -1.000000 +124511 -1.000000 +124512 -1.000000 +124513 -1.000000 +124514 -1.000000 +124515 -1.000000 +124516 -1.000000 +124517 -1.000000 +124518 -1.000000 +124519 -1.000000 +124520 -1.000000 +124521 -1.000000 +124522 -1.000000 +124523 -1.000000 +124524 -1.000000 +124525 -1.000000 +124526 -1.000000 +124527 -1.000000 +124531 -1.000000 +124533 -1.000000 +124534 -1.000000 +124535 -1.000000 +124536 -1.000000 +124537 -1.000000 +124538 -1.000000 +124539 -1.000000 +124540 -1.000000 +124541 -1.000000 +124542 -1.000000 +124543 -1.000000 +124544 -1.000000 +124545 -1.000000 +124546 -1.000000 +124547 -1.000000 +124548 -1.000000 +124549 -1.000000 +124550 -1.000000 +124551 -1.000000 +124552 -1.000000 +124561 -1.000000 +124563 -1.000000 +124565 -1.000000 +124572 -1.000000 +124599 -1.000000 +124602 -1.000000 +124623 -1.000000 +124629 -1.000000 +124634 -1.000000 +124635 -1.000000 +124636 -1.000000 +124665 -1.000000 +124667 -1.000000 +124672 -1.000000 +124673 -1.000000 +124674 -1.000000 +124675 -1.000000 +124676 -1.000000 +124677 -1.000000 +124678 -1.000000 +124679 -1.000000 +124680 -1.000000 +124681 -1.000000 +124682 -1.000000 +124683 -1.000000 +124684 -1.000000 +124685 -1.000000 +124686 -1.000000 +124694 -1.000000 +124695 -1.000000 +124696 -1.000000 +124697 -1.000000 +124698 -1.000000 +124699 -1.000000 +124700 -1.000000 +124702 -1.000000 +124703 -1.000000 +124704 -1.000000 +124705 -1.000000 +124706 -1.000000 +124708 -1.000000 +124716 -1.000000 +124717 -1.000000 +124718 -1.000000 +124720 -1.000000 +124721 -1.000000 +124722 -1.000000 +124723 -1.000000 +124724 -1.000000 +124725 -1.000000 +124726 -1.000000 +124727 -1.000000 +124732 -1.000000 +124757 -1.000000 +124761 -1.000000 +124763 -1.000000 +124765 -1.000000 +124785 -1.000000 +124786 -1.000000 +124787 -1.000000 +124788 -1.000000 +124789 -1.000000 +124790 -1.000000 +124791 -1.000000 +124792 -1.000000 +124793 -1.000000 +124797 -1.000000 +124808 -1.000000 +124809 -1.000000 +124813 -1.000000 +124818 -1.000000 +124821 -1.000000 +124823 -1.000000 +124824 -1.000000 +124825 -1.000000 +124826 -1.000000 +124827 -1.000000 +124828 -1.000000 +124830 -1.000000 +124831 -1.000000 +124832 -1.000000 +124833 -1.000000 +124834 -1.000000 +124835 -1.000000 +124837 -1.000000 +124838 -1.000000 +124839 -1.000000 +124840 -1.000000 +124841 -1.000000 +124842 -1.000000 +124843 -1.000000 +124844 -1.000000 +124845 -1.000000 +124849 -1.000000 +124856 -1.000000 +124857 -1.000000 +124858 -1.000000 +124859 -1.000000 +124864 -1.000000 +124866 -1.000000 +124867 -1.000000 +124868 -1.000000 +124869 -1.000000 +124871 -1.000000 +124872 -1.000000 +124873 -1.000000 +124874 -1.000000 +124875 -1.000000 +124876 -1.000000 +124877 -1.000000 +124889 -1.000000 +124890 -1.000000 +124891 -1.000000 +124892 -1.000000 +124893 -1.000000 +124895 -1.000000 +124896 -1.000000 +124897 -1.000000 +124898 -1.000000 +124900 -1.000000 +124904 -1.000000 +124907 -1.000000 +124908 -1.000000 +124909 -1.000000 +124910 -1.000000 +124911 -1.000000 +124912 -1.000000 +124913 -1.000000 +124914 -1.000000 +124915 -1.000000 +124916 -1.000000 +124917 -1.000000 +124918 -1.000000 +124919 -1.000000 +124920 -1.000000 +124921 -1.000000 +124922 -1.000000 +124923 -1.000000 +124924 -1.000000 +124925 -1.000000 +124926 -1.000000 +124927 -1.000000 +124928 -1.000000 +124929 -1.000000 +124947 -1.000000 +124948 -1.000000 +124951 -1.000000 +124952 -1.000000 +124953 -1.000000 +124954 -1.000000 +124955 -1.000000 +124966 -1.000000 +124967 -1.000000 +124968 -1.000000 +124972 -1.000000 +124973 -1.000000 +124974 -1.000000 +124975 -1.000000 +124976 -1.000000 +124977 -1.000000 +124978 -1.000000 +124979 -1.000000 +124980 -1.000000 +124985 -1.000000 +124986 -1.000000 +124987 -1.000000 +125000 -1.000000 +125001 -1.000000 +125003 -1.000000 +125004 -1.000000 +125006 -1.000000 +125009 -1.000000 +125010 -1.000000 +125020 -1.000000 +125021 -1.000000 +125022 -1.000000 +125023 -1.000000 +125024 -1.000000 +125025 -1.000000 +125030 -1.000000 +125031 -1.000000 +125033 -1.000000 +125034 -1.000000 +125035 -1.000000 +125036 -1.000000 +125037 -1.000000 +125038 -1.000000 +125039 -1.000000 +125040 -1.000000 +125041 -1.000000 +125042 -1.000000 +125043 -1.000000 +125045 -1.000000 +125046 -1.000000 +125047 -1.000000 +125048 -1.000000 +125049 -1.000000 +125050 -1.000000 +125051 -1.000000 +125052 -1.000000 +125053 -1.000000 +125054 -1.000000 +125056 -1.000000 +125057 -1.000000 +125058 -1.000000 +125059 -1.000000 +125060 -1.000000 +125061 -1.000000 +125062 -1.000000 +125063 -1.000000 +125066 -1.000000 +125067 -1.000000 +125078 -1.000000 +125079 -1.000000 +125081 -1.000000 +125082 -1.000000 +125086 -1.000000 +125088 -1.000000 +125089 -1.000000 +125090 -1.000000 +125092 -1.000000 +125095 -1.000000 +125099 -1.000000 +125100 -1.000000 +125101 -1.000000 +125102 -1.000000 +125104 -1.000000 +125116 -1.000000 +125118 -1.000000 +125120 -1.000000 +125125 -1.000000 +125126 -1.000000 +125127 -1.000000 +125128 -1.000000 +125129 -1.000000 +125130 -1.000000 +125134 -1.000000 +125135 -1.000000 +125139 -1.000000 +125140 -1.000000 +125141 -1.000000 +125144 -1.000000 +125145 -1.000000 +125146 -1.000000 +125147 -1.000000 +125148 -1.000000 +125149 -1.000000 +125150 -1.000000 +125151 -1.000000 +125152 -1.000000 +125153 -1.000000 +125154 -1.000000 +125155 -1.000000 +125156 -1.000000 +125157 -1.000000 +125159 -1.000000 +125160 -1.000000 +125161 -1.000000 +125162 -1.000000 +125163 -1.000000 +125164 -1.000000 +125165 -1.000000 +125166 -1.000000 +125167 -1.000000 +125168 -1.000000 +125169 -1.000000 +125170 -1.000000 +125171 -1.000000 +125172 -1.000000 +125173 -1.000000 +125174 -1.000000 +125176 -1.000000 +125178 -1.000000 +125180 -1.000000 +125181 -1.000000 +125182 -1.000000 +125183 -1.000000 +125185 -1.000000 +125186 -1.000000 +125188 -1.000000 +125189 -1.000000 +125190 -1.000000 +125191 -1.000000 +125192 -1.000000 +125193 -1.000000 +125194 -1.000000 +125195 -1.000000 +125196 -1.000000 +125197 -1.000000 +125198 -1.000000 +125199 -1.000000 +125200 -1.000000 +125201 -1.000000 +125202 -1.000000 +125203 -1.000000 +125204 -1.000000 +125205 -1.000000 +125206 -1.000000 +125207 -1.000000 +125208 -1.000000 +125209 -1.000000 +125210 -1.000000 +125211 -1.000000 +125212 -1.000000 +125213 -1.000000 +125214 -1.000000 +125215 -1.000000 +125217 -1.000000 +125225 -1.000000 +125226 -1.000000 +125228 -1.000000 +125229 -1.000000 +125230 -1.000000 +125231 -1.000000 +125232 -1.000000 +125233 -1.000000 +125234 -1.000000 +125235 -1.000000 +125236 -1.000000 +125237 -1.000000 +125238 -1.000000 +125239 -1.000000 +125240 -1.000000 +125241 -1.000000 +125243 -1.000000 +125244 -1.000000 +125245 -1.000000 +125246 -1.000000 +125248 -1.000000 +125249 -1.000000 +125255 -1.000000 +125263 -1.000000 +125264 -1.000000 +125266 -1.000000 +125267 -1.000000 +125268 -1.000000 +125269 -1.000000 +125273 -1.000000 +125274 -1.000000 +125277 -1.000000 +125278 -1.000000 +125279 -1.000000 +125280 -1.000000 +125281 -1.000000 +125282 -1.000000 +125283 -1.000000 +125285 -1.000000 +125286 -1.000000 +125287 -1.000000 +125291 -1.000000 +125297 -1.000000 +125298 -1.000000 +125299 -1.000000 +125300 -1.000000 +125303 -1.000000 +125304 -1.000000 +125305 -1.000000 +125307 -1.000000 +125309 -1.000000 +125310 -1.000000 +125311 -1.000000 +125312 -1.000000 +125313 -1.000000 +125314 -1.000000 +125315 -1.000000 +125320 -1.000000 +125321 -1.000000 +125322 -1.000000 +125324 -1.000000 +125325 -1.000000 +125326 -1.000000 +125327 -1.000000 +125336 -1.000000 +125338 -1.000000 +125340 -1.000000 +125341 -1.000000 +125346 -1.000000 +125365 -1.000000 +125368 -1.000000 +125379 -1.000000 +125385 -1.000000 +125395 -1.000000 +125401 -1.000000 +125402 -1.000000 +125403 -1.000000 +125404 -1.000000 +125405 -1.000000 +125406 -1.000000 +125407 -1.000000 +125410 -1.000000 +125413 -1.000000 +125418 -1.000000 +125419 -1.000000 +125420 -1.000000 +125421 -1.000000 +125422 -1.000000 +125423 -1.000000 +125424 -1.000000 +125425 -1.000000 +125427 -1.000000 +125428 -1.000000 +125430 -1.000000 +125432 -1.000000 +125447 -1.000000 +125448 -1.000000 +125452 -1.000000 +125456 -1.000000 +125458 -1.000000 +125460 -1.000000 +125461 -1.000000 +125462 -1.000000 +125463 -1.000000 +125464 -1.000000 +125466 -1.000000 +125468 -1.000000 +125469 -1.000000 +125471 -1.000000 +125472 -1.000000 +125474 -1.000000 +125475 -1.000000 +125477 -1.000000 +125478 -1.000000 +125479 -1.000000 +125480 -1.000000 +125481 -1.000000 +125482 -1.000000 +125483 -1.000000 +125487 -1.000000 +125488 -1.000000 +125489 -1.000000 +125490 -1.000000 +125491 -1.000000 +125493 -1.000000 +125494 -1.000000 +125495 -1.000000 +125496 -1.000000 +125497 -1.000000 +125498 -1.000000 +125499 -1.000000 +125502 -1.000000 +125503 -1.000000 +125504 -1.000000 +125505 -1.000000 +125506 -1.000000 +125507 -1.000000 +125509 -1.000000 +125510 -1.000000 +125511 -1.000000 +125512 -1.000000 +125513 -1.000000 +125514 -1.000000 +125515 -1.000000 +125516 -1.000000 +125519 -1.000000 +125523 -1.000000 +125524 -1.000000 +125525 -1.000000 +125526 -1.000000 +125527 -1.000000 +125528 -1.000000 +125529 -1.000000 +125530 -1.000000 +125531 -1.000000 +125532 -1.000000 +125533 -1.000000 +125534 -1.000000 +125535 -1.000000 +125536 -1.000000 +125537 -1.000000 +125538 -1.000000 +125539 -1.000000 +125540 -1.000000 +125541 -1.000000 +125542 -1.000000 +125543 -1.000000 +125544 -1.000000 +125545 -1.000000 +125546 -1.000000 +125552 -1.000000 +125566 -1.000000 +125567 -1.000000 +125568 -1.000000 +125569 -1.000000 +125570 -1.000000 +125571 -1.000000 +125572 -1.000000 +125573 -1.000000 +125574 -1.000000 +125575 -1.000000 +125576 -1.000000 +125577 -1.000000 +125578 -1.000000 +125579 -1.000000 +125580 -1.000000 +125581 -1.000000 +125582 -1.000000 +125583 -1.000000 +125584 -1.000000 +125587 -1.000000 +125589 -1.000000 +125591 -1.000000 +125599 -1.000000 +125604 -1.000000 +125606 -1.000000 +125607 -1.000000 +125618 -1.000000 +125620 -1.000000 +125621 -1.000000 +125622 -1.000000 +125623 -1.000000 +125624 -1.000000 +125625 -1.000000 +125627 -1.000000 +125629 -1.000000 +125630 -1.000000 +125633 -1.000000 +125635 -1.000000 +125638 -1.000000 +125639 -1.000000 +125650 -1.000000 +125653 -1.000000 +125654 -1.000000 +125655 -1.000000 +125656 -1.000000 +125657 -1.000000 +125658 -1.000000 +125663 -1.000000 +125665 -1.000000 +125667 -1.000000 +125668 -1.000000 +125669 -1.000000 +125670 -1.000000 +125672 -1.000000 +125675 -1.000000 +125678 -1.000000 +125679 -1.000000 +125682 -1.000000 +125684 -1.000000 +125690 -1.000000 +125695 -1.000000 +125696 -1.000000 +125698 -1.000000 +125700 -1.000000 +125701 -1.000000 +125705 -1.000000 +125714 -1.000000 +125716 -1.000000 +125718 -1.000000 +125719 -1.000000 +125720 -1.000000 +125721 -1.000000 +125724 -1.000000 +125725 -1.000000 +125727 -1.000000 +125729 -1.000000 +125733 -1.000000 +125734 -1.000000 +125736 -1.000000 +125737 -1.000000 +125738 -1.000000 +125741 -1.000000 +125742 -1.000000 +125748 -1.000000 +125749 -1.000000 +125755 -1.000000 +125759 -1.000000 +125761 -1.000000 +125763 -1.000000 +125764 -1.000000 +125767 -1.000000 +125770 -1.000000 +125773 -1.000000 +125774 -1.000000 +125775 -1.000000 +125776 -1.000000 +125778 -1.000000 +125790 -1.000000 +125792 -1.000000 +125797 -1.000000 +125798 -1.000000 +125799 -1.000000 +125801 -1.000000 +125803 -1.000000 +125804 -1.000000 +125806 -1.000000 +125807 -1.000000 +125808 -1.000000 +125812 -1.000000 +125813 -1.000000 +125815 -1.000000 +125816 -1.000000 +125818 -1.000000 +125820 -1.000000 +125824 -1.000000 +125829 -1.000000 +125839 -1.000000 +125840 -1.000000 +125841 -1.000000 +125842 -1.000000 +125843 -1.000000 +125844 -1.000000 +125845 -1.000000 +125847 -1.000000 +125849 -1.000000 +125850 -1.000000 +125851 -1.000000 +125852 -1.000000 +125856 -1.000000 +125857 -1.000000 +125858 -1.000000 +125861 -1.000000 +125862 -1.000000 +125863 -1.000000 +125864 -1.000000 +125865 -1.000000 +125866 -1.000000 +125867 -1.000000 +125868 -1.000000 +125869 -1.000000 +125870 -1.000000 +125871 -1.000000 +125874 -1.000000 +125875 -1.000000 +125877 -1.000000 +125878 -1.000000 +125879 -1.000000 +125880 -1.000000 +125881 -1.000000 +125882 -1.000000 +125883 -1.000000 +125884 -1.000000 +125885 -1.000000 +125887 -1.000000 +125888 -1.000000 +125889 -1.000000 +125892 -1.000000 +125894 -1.000000 +125895 -1.000000 +125896 -1.000000 +125899 -1.000000 +125903 -1.000000 +125905 -1.000000 +125915 -1.000000 +125918 -1.000000 +125920 -1.000000 +125922 -1.000000 +125924 -1.000000 +125953 -1.000000 +125954 -1.000000 +125955 -1.000000 +125956 -1.000000 +125957 -1.000000 +125958 -1.000000 +125959 -1.000000 +125960 -1.000000 +125961 -1.000000 +125962 -1.000000 +125963 -1.000000 +125964 -1.000000 +125965 -1.000000 +125966 -1.000000 +125967 -1.000000 +125970 -1.000000 +125971 -1.000000 +125972 -1.000000 +125973 -1.000000 +125975 -1.000000 +125976 -1.000000 +125977 -1.000000 +125978 -1.000000 +125979 -1.000000 +125980 -1.000000 +125981 -1.000000 +125982 -1.000000 +125985 -1.000000 +125991 -1.000000 +125994 -1.000000 +125995 -1.000000 +125999 -1.000000 +126000 -1.000000 +126015 -1.000000 +126016 -1.000000 +126017 -1.000000 +126020 -1.000000 +126021 -1.000000 +126023 -1.000000 +126024 -1.000000 +126036 -1.000000 +126038 -1.000000 +126039 -1.000000 +126044 -1.000000 +126047 -1.000000 +126048 -1.000000 +126049 -1.000000 +126050 -1.000000 +126051 -1.000000 +126052 -1.000000 +126053 -1.000000 +126054 -1.000000 +126056 -1.000000 +126058 -1.000000 +126059 -1.000000 +126060 -1.000000 +126061 -1.000000 +126062 -1.000000 +126063 -1.000000 +126064 -1.000000 +126065 -1.000000 +126066 -1.000000 +126067 -1.000000 +126068 -1.000000 +126070 -1.000000 +126071 -1.000000 +126072 -1.000000 +126073 -1.000000 +126074 -1.000000 +126079 -1.000000 +126082 -1.000000 +126083 -1.000000 +126084 -1.000000 +126093 -1.000000 +126109 -1.000000 +126110 -1.000000 +126112 -1.000000 +126113 -1.000000 +126115 -1.000000 +126116 -1.000000 +126120 -1.000000 +126122 -1.000000 +126123 -1.000000 +126124 -1.000000 +126125 -1.000000 +126129 -1.000000 +126131 -1.000000 +126132 -1.000000 +126133 -1.000000 +126134 -1.000000 +126135 -1.000000 +126136 -1.000000 +126137 -1.000000 +126138 -1.000000 +126140 -1.000000 +126141 -1.000000 +126142 -1.000000 +126143 -1.000000 +126146 -1.000000 +126151 -1.000000 +126155 -1.000000 +126157 -1.000000 +126158 -1.000000 +126160 -1.000000 +126165 -1.000000 +126166 -1.000000 +126167 -1.000000 +126168 -1.000000 +126170 -1.000000 +126171 -1.000000 +126172 -1.000000 +126173 -1.000000 +126174 -1.000000 +126176 -1.000000 +126177 -1.000000 +126178 -1.000000 +126179 -1.000000 +126180 -1.000000 +126181 -1.000000 +126182 -1.000000 +126183 -1.000000 +126184 -1.000000 +126185 -1.000000 +126186 -1.000000 +126187 -1.000000 +126188 -1.000000 +126189 -1.000000 +126190 -1.000000 +126192 -1.000000 +126194 -1.000000 +126198 -1.000000 +126200 -1.000000 +126201 -1.000000 +126202 -1.000000 +126203 -1.000000 +126204 -1.000000 +126205 -1.000000 +126206 -1.000000 +126207 -1.000000 +126210 -1.000000 +126212 -1.000000 +126213 -1.000000 +126214 -1.000000 +126215 -1.000000 +126216 -1.000000 +126218 -1.000000 +126219 -1.000000 +126220 -1.000000 +126222 -1.000000 +126223 -1.000000 +126224 -1.000000 +126225 -1.000000 +126226 -1.000000 +126230 -1.000000 +126232 -1.000000 +126233 -1.000000 +126234 -1.000000 +126235 -1.000000 +126236 -1.000000 +126237 -1.000000 +126238 -1.000000 +126239 -1.000000 +126240 -1.000000 +126241 -1.000000 +126242 -1.000000 +126243 -1.000000 +126244 -1.000000 +126245 -1.000000 +126246 -1.000000 +126247 -1.000000 +126248 -1.000000 +126249 -1.000000 +126250 -1.000000 +126251 -1.000000 +126252 -1.000000 +126253 -1.000000 +126254 -1.000000 +126255 -1.000000 +126256 -1.000000 +126257 -1.000000 +126258 -1.000000 +126259 -1.000000 +126260 -1.000000 +126261 -1.000000 +126262 -1.000000 +126263 -1.000000 +126264 -1.000000 +126276 -1.000000 +126277 -1.000000 +126278 -1.000000 +126279 -1.000000 +126280 -1.000000 +126282 -1.000000 +126283 -1.000000 +126284 -1.000000 +126285 -1.000000 +126286 -1.000000 +126287 -1.000000 +126288 -1.000000 +126289 -1.000000 +126291 -1.000000 +126292 -1.000000 +126293 -1.000000 +126294 -1.000000 +126295 -1.000000 +126296 -1.000000 +126297 -1.000000 +126298 -1.000000 +126299 -1.000000 +126300 -1.000000 +126301 -1.000000 +126302 -1.000000 +126303 -1.000000 +126304 -1.000000 +126306 -1.000000 +126310 -1.000000 +126312 -1.000000 +126313 -1.000000 +126314 -1.000000 +126315 -1.000000 +126316 -1.000000 +126317 -1.000000 +126318 -1.000000 +126319 -1.000000 +126320 -1.000000 +126321 -1.000000 +126322 -1.000000 +126323 -1.000000 +126324 -1.000000 +126325 -1.000000 +126326 -1.000000 +126327 -1.000000 +126328 -1.000000 +126329 -1.000000 +126330 -1.000000 +126331 -1.000000 +126332 -1.000000 +126336 -1.000000 +126337 -1.000000 +126338 -1.000000 +126339 -1.000000 +126340 -1.000000 +126341 -1.000000 +126342 -1.000000 +126345 -1.000000 +126346 -1.000000 +126347 -1.000000 +126348 -1.000000 +126349 -1.000000 +126351 -1.000000 +126352 -1.000000 +126353 -1.000000 +126354 -1.000000 +126355 -1.000000 +126356 -1.000000 +126357 -1.000000 +126358 -1.000000 +126359 -1.000000 +126360 -1.000000 +126361 -1.000000 +126362 -1.000000 +126364 -1.000000 +126365 -1.000000 +126366 -1.000000 +126367 -1.000000 +126368 -1.000000 +126369 -1.000000 +126370 -1.000000 +126371 -1.000000 +126374 -1.000000 +126375 -1.000000 +126377 -1.000000 +126378 -1.000000 +126379 -1.000000 +126381 -1.000000 +126389 -1.000000 +126390 -1.000000 +126391 -1.000000 +126392 -1.000000 +126393 -1.000000 +126394 -1.000000 +126395 -1.000000 +126397 -1.000000 +126399 -1.000000 +126400 -1.000000 +126401 -1.000000 +126402 -1.000000 +126403 -1.000000 +126404 -1.000000 +126405 -1.000000 +126408 -1.000000 +126411 -1.000000 +126412 -1.000000 +126413 -1.000000 +126423 -1.000000 +126427 -1.000000 +126428 -1.000000 +126429 -1.000000 +126431 -1.000000 +126434 -1.000000 +126435 -1.000000 +126437 -1.000000 +126439 -1.000000 +126441 -1.000000 +126448 -1.000000 +126449 -1.000000 +126452 -1.000000 +126454 -1.000000 +126455 -1.000000 +126456 -1.000000 +126457 -1.000000 +126458 -1.000000 +126459 -1.000000 +126460 -1.000000 +126461 -1.000000 +126462 -1.000000 +126464 -1.000000 +126465 -1.000000 +126466 -1.000000 +126467 -1.000000 +126468 -1.000000 +126469 -1.000000 +126470 -1.000000 +126471 -1.000000 +126472 -1.000000 +126473 -1.000000 +126474 -1.000000 +126475 -1.000000 +126476 -1.000000 +126477 -1.000000 +126478 -1.000000 +126479 -1.000000 +126480 -1.000000 +126481 -1.000000 +126482 -1.000000 +126483 -1.000000 +126484 -1.000000 +126485 -1.000000 +126486 -1.000000 +126489 -1.000000 +126490 -1.000000 +126493 -1.000000 +126494 -1.000000 +126495 -1.000000 +126496 -1.000000 +126497 -1.000000 +126498 -1.000000 +126499 -1.000000 +126500 -1.000000 +126501 -1.000000 +126502 -1.000000 +126503 -1.000000 +126504 -1.000000 +126505 -1.000000 +126507 -1.000000 +126509 -1.000000 +126510 -1.000000 +126511 -1.000000 +126512 -1.000000 +126513 -1.000000 +126514 -1.000000 +126515 -1.000000 +126516 -1.000000 +126517 -1.000000 +126518 -1.000000 +126519 -1.000000 +126520 -1.000000 +126521 -1.000000 +126523 -1.000000 +126524 -1.000000 +126525 -1.000000 +126526 -1.000000 +126527 -1.000000 +126528 -1.000000 +126531 -1.000000 +126532 -1.000000 +126533 -1.000000 +126534 -1.000000 +126536 -1.000000 +126541 -1.000000 +126545 -1.000000 +126553 -1.000000 +126554 -1.000000 +126555 -1.000000 +126556 -1.000000 +126558 -1.000000 +126562 -1.000000 +126563 -1.000000 +126564 -1.000000 +126565 -1.000000 +126566 -1.000000 +126567 -1.000000 +126568 -1.000000 +126569 -1.000000 +126570 -1.000000 +126573 -1.000000 +126576 -1.000000 +126577 -1.000000 +126579 -1.000000 +126583 -1.000000 +126587 -1.000000 +126588 -1.000000 +126589 -1.000000 +126590 -1.000000 +126592 -1.000000 +126593 -1.000000 +126595 -1.000000 +126596 -1.000000 +126597 -1.000000 +126598 -1.000000 +126599 -1.000000 +126600 -1.000000 +126601 -1.000000 +126602 -1.000000 +126603 -1.000000 +126604 -1.000000 +126606 -1.000000 +126607 -1.000000 +126626 -1.000000 +126627 -1.000000 +126629 -1.000000 +126634 -1.000000 +126635 -1.000000 +126642 -1.000000 +126643 -1.000000 +126644 -1.000000 +126645 -1.000000 +126657 -1.000000 +126660 -1.000000 +126661 -1.000000 +126664 -1.000000 +126668 -1.000000 +126670 -1.000000 +126675 -1.000000 +126678 -1.000000 +126679 -1.000000 +126680 -1.000000 +126681 -1.000000 +126683 -1.000000 +126685 -1.000000 +126690 -1.000000 +126692 -1.000000 +126700 -1.000000 +126705 -1.000000 +126706 -1.000000 +126707 -1.000000 +126708 -1.000000 +126711 -1.000000 +126712 -1.000000 +126713 -1.000000 +126714 -1.000000 +126715 -1.000000 +126716 -1.000000 +126717 -1.000000 +126718 -1.000000 +126719 -1.000000 +126720 -1.000000 +126721 -1.000000 +126722 -1.000000 +126723 -1.000000 +126724 -1.000000 +126725 -1.000000 +126726 -1.000000 +126727 -1.000000 +126728 -1.000000 +126729 -1.000000 +126730 -1.000000 +126731 -1.000000 +126734 -1.000000 +126735 -1.000000 +126737 -1.000000 +126738 -1.000000 +126740 -1.000000 +126742 -1.000000 +126743 -1.000000 +126744 -1.000000 +126745 -1.000000 +126746 -1.000000 +126747 -1.000000 +126748 -1.000000 +126749 -1.000000 +126750 -1.000000 +126751 -1.000000 +126752 -1.000000 +126753 -1.000000 +126754 -1.000000 +126755 -1.000000 +126756 -1.000000 +126757 -1.000000 +126758 -1.000000 +126760 -1.000000 +126761 -1.000000 +126762 -1.000000 +126763 -1.000000 +126764 -1.000000 +126765 -1.000000 +126766 -1.000000 +126768 -1.000000 +126770 -1.000000 +126771 -1.000000 +126772 -1.000000 +126773 -1.000000 +126774 -1.000000 +126775 -1.000000 +126776 -1.000000 +126777 -1.000000 +126778 -1.000000 +126779 -1.000000 +126780 -1.000000 +126781 -1.000000 +126782 -1.000000 +126783 -1.000000 +126784 -1.000000 +126785 -1.000000 +126786 -1.000000 +126787 -1.000000 +126788 -1.000000 +126789 -1.000000 +126790 -1.000000 +126791 -1.000000 +126792 -1.000000 +126793 -1.000000 +126794 -1.000000 +126795 -1.000000 +126796 -1.000000 +126798 -1.000000 +126799 -1.000000 +126800 -1.000000 +126801 -1.000000 +126802 -1.000000 +126803 -1.000000 +126804 -1.000000 +126805 -1.000000 +126806 -1.000000 +126811 -1.000000 +126812 -1.000000 +126813 -1.000000 +126814 -1.000000 +126815 -1.000000 +126816 -1.000000 +126817 -1.000000 +126818 -1.000000 +126819 -1.000000 +126820 -1.000000 +126822 -1.000000 +126824 -1.000000 +126825 -1.000000 +126826 -1.000000 +126827 -1.000000 +126828 -1.000000 +126829 -1.000000 +126830 -1.000000 +126831 -1.000000 +126833 -1.000000 +126834 -1.000000 +126835 -1.000000 +126836 -1.000000 +126839 -1.000000 +126840 -1.000000 +126842 -1.000000 +126843 -1.000000 +126845 -1.000000 +126846 -1.000000 +126847 -1.000000 +126848 -1.000000 +126849 -1.000000 +126850 -1.000000 +126851 -1.000000 +126860 -1.000000 +126861 -1.000000 +126862 -1.000000 +126863 -1.000000 +126864 -1.000000 +126865 -1.000000 +126866 -1.000000 +126867 -1.000000 +126868 -1.000000 +126869 -1.000000 +126875 -1.000000 +126878 -1.000000 +126879 -1.000000 +126880 -1.000000 +126881 -1.000000 +126882 -1.000000 +126883 -1.000000 +126884 -1.000000 +126885 -1.000000 +126889 -1.000000 +126890 -1.000000 +126891 -1.000000 +126894 -1.000000 +126897 -1.000000 +126898 -1.000000 +126899 -1.000000 +126907 -1.000000 +126908 -1.000000 +126912 -1.000000 +126914 -1.000000 +126915 -1.000000 +126916 -1.000000 +126917 -1.000000 +126918 -1.000000 +126919 -1.000000 +126920 -1.000000 +126921 -1.000000 +126922 -1.000000 +126923 -1.000000 +126924 -1.000000 +126925 -1.000000 +126927 -1.000000 +126929 -1.000000 +126930 -1.000000 +126937 -1.000000 +126938 -1.000000 +126940 -1.000000 +126941 -1.000000 +126943 -1.000000 +126944 -1.000000 +126947 -1.000000 +126948 -1.000000 +126950 -1.000000 +126951 -1.000000 +126952 -1.000000 +126953 -1.000000 +126955 -1.000000 +126956 -1.000000 +126958 -1.000000 +126959 -1.000000 +126960 -1.000000 +126961 -1.000000 +126962 -1.000000 +126963 -1.000000 +126973 -1.000000 +126997 -1.000000 +126998 -1.000000 +126999 -1.000000 +127002 -1.000000 +127003 -1.000000 +127004 -1.000000 +127065 -1.000000 +127066 -1.000000 +127067 -1.000000 +127069 -1.000000 +127070 -1.000000 +127071 -1.000000 +127073 -1.000000 +127076 -1.000000 +127077 -1.000000 +127078 -1.000000 +127081 -1.000000 +127082 -1.000000 +127083 -1.000000 +127084 -1.000000 +127085 -1.000000 +127086 -1.000000 +127088 -1.000000 +127090 -1.000000 +127091 -1.000000 +127092 -1.000000 +127093 -1.000000 +127094 -1.000000 +127096 -1.000000 +127097 -1.000000 +127329 -1.000000 +127333 -1.000000 +127334 -1.000000 +127335 -1.000000 +127336 -1.000000 +127337 -1.000000 +127338 -1.000000 +127339 -1.000000 +127340 -1.000000 +127341 -1.000000 +127343 -1.000000 +127344 -1.000000 +127345 -1.000000 +127346 -1.000000 +127347 -1.000000 +127349 -1.000000 +127353 -1.000000 +127354 -1.000000 +127355 -1.000000 +127356 -1.000000 +127357 -1.000000 +127358 -1.000000 +127359 -1.000000 +127361 -1.000000 +127363 -1.000000 +127364 -1.000000 +127365 -1.000000 +127373 -1.000000 +127374 -1.000000 +127378 -1.000000 +127379 -1.000000 +127380 -1.000000 +127381 -1.000000 +127382 -1.000000 +127383 -1.000000 +127386 -1.000000 +127389 -1.000000 +127394 -1.000000 +127395 -1.000000 +127397 -1.000000 +127398 -1.000000 +127399 -1.000000 +127401 -1.000000 +127402 -1.000000 +127403 -1.000000 +127404 -1.000000 +127405 -1.000000 +127406 -1.000000 +127407 -1.000000 +127408 -1.000000 +127409 -1.000000 +127410 -1.000000 +127411 -1.000000 +127412 -1.000000 +127414 -1.000000 +127416 -1.000000 +127417 -1.000000 +127418 -1.000000 +127419 -1.000000 +127420 -1.000000 +127421 -1.000000 +127422 -1.000000 +127423 -1.000000 +127424 -1.000000 +127425 -1.000000 +127426 -1.000000 +127427 -1.000000 +127428 -1.000000 +127429 -1.000000 +127430 -1.000000 +127431 -1.000000 +127432 -1.000000 +127433 -1.000000 +127434 -1.000000 +127435 -1.000000 +127436 -1.000000 +127437 -1.000000 +127438 -1.000000 +127439 -1.000000 +127440 -1.000000 +127441 -1.000000 +127442 -1.000000 +127443 -1.000000 +127445 -1.000000 +127446 -1.000000 +127448 -1.000000 +127449 -1.000000 +127451 -1.000000 +127452 -1.000000 +127453 -1.000000 +127454 -1.000000 +127455 -1.000000 +127457 -1.000000 +127459 -1.000000 +127460 -1.000000 +127461 -1.000000 +127462 -1.000000 +127535 -1.000000 +127536 -1.000000 +127537 -1.000000 +127541 -1.000000 +127544 -1.000000 +127557 -1.000000 +127558 -1.000000 +127559 -1.000000 +127560 -1.000000 +127561 -1.000000 +127562 -1.000000 +127579 -1.000000 +127587 -1.000000 +127602 -1.000000 +127603 -1.000000 +127614 -1.000000 +127615 -1.000000 +127616 -1.000000 +127617 -1.000000 +127618 -1.000000 +127619 -1.000000 +127620 -1.000000 +127622 -1.000000 +127623 -1.000000 +127624 -1.000000 +127625 -1.000000 +127626 -1.000000 +127629 -1.000000 +127630 -1.000000 +127631 -1.000000 +127632 -1.000000 +127633 -1.000000 +127636 -1.000000 +127637 -1.000000 +127638 -1.000000 +127639 -1.000000 +127640 -1.000000 +127641 -1.000000 +127642 -1.000000 +127643 -1.000000 +127644 -1.000000 +127645 -1.000000 +127646 -1.000000 +127647 -1.000000 +127648 -1.000000 +127649 -1.000000 +127650 -1.000000 +127651 -1.000000 +127654 -1.000000 +127655 -1.000000 +127656 -1.000000 +127657 -1.000000 +127665 -1.000000 +127667 -1.000000 +127669 -1.000000 +127670 -1.000000 +127671 -1.000000 +127672 -1.000000 +127673 -1.000000 +127674 -1.000000 +127693 -1.000000 +127699 -1.000000 +127717 -1.000000 +127718 -1.000000 +127723 -1.000000 +127724 -1.000000 +127728 -1.000000 +127730 -1.000000 +127731 -1.000000 +127732 -1.000000 +127733 -1.000000 +127734 -1.000000 +127735 -1.000000 +127736 -1.000000 +127737 -1.000000 +127739 -1.000000 +127740 -1.000000 +127741 -1.000000 +127742 -1.000000 +127743 -1.000000 +127744 -1.000000 +127747 -1.000000 +127748 -1.000000 +127749 -1.000000 +127751 -1.000000 +127752 -1.000000 +127753 -1.000000 +127758 -1.000000 +127759 -1.000000 +127760 -1.000000 +127761 -1.000000 +127763 -1.000000 +127765 -1.000000 +127769 -1.000000 +127775 -1.000000 +127779 -1.000000 +127782 -1.000000 +127783 -1.000000 +127784 -1.000000 +127796 -1.000000 +127798 -1.000000 +127802 -1.000000 +127805 -1.000000 +127806 -1.000000 +127807 -1.000000 +127808 -1.000000 +127817 -1.000000 +127818 -1.000000 +127829 -1.000000 +127832 -1.000000 +127835 -1.000000 +127839 -1.000000 +127840 -1.000000 +127841 -1.000000 +127842 -1.000000 +127843 -1.000000 +127844 -1.000000 +127845 -1.000000 +127846 -1.000000 +127847 -1.000000 +127851 -1.000000 +127852 -1.000000 +127854 -1.000000 +127856 -1.000000 +127857 -1.000000 +127859 -1.000000 +127865 -1.000000 +127869 -1.000000 +127873 -1.000000 +127874 -1.000000 +127877 -1.000000 +127891 -1.000000 +127893 -1.000000 +127894 -1.000000 +127895 -1.000000 +127896 -1.000000 +127897 -1.000000 +127898 -1.000000 +127899 -1.000000 +127900 -1.000000 +127901 -1.000000 +127902 -1.000000 +127903 -1.000000 +127904 -1.000000 +127905 -1.000000 +127906 -1.000000 +127907 -1.000000 +127908 -1.000000 +127909 -1.000000 +127910 -1.000000 +127911 -1.000000 +127914 -1.000000 +127915 -1.000000 +127916 -1.000000 +127917 -1.000000 +127920 -1.000000 +127922 -1.000000 +127923 -1.000000 +127925 -1.000000 +127926 -1.000000 +127927 -1.000000 +127928 -1.000000 +127929 -1.000000 +127930 -1.000000 +127931 -1.000000 +127932 -1.000000 +127933 -1.000000 +127934 -1.000000 +127935 -1.000000 +127936 -1.000000 +127937 -1.000000 +127940 -1.000000 +127942 -1.000000 +127943 -1.000000 +127944 -1.000000 +127945 -1.000000 +127946 -1.000000 +127949 -1.000000 +127951 -1.000000 +127967 -1.000000 +127968 -1.000000 +127969 -1.000000 +127970 -1.000000 +127971 -1.000000 +127972 -1.000000 +127973 -1.000000 +127974 -1.000000 +127975 -1.000000 +127976 -1.000000 +127987 -1.000000 +127988 -1.000000 +127989 -1.000000 +127990 -1.000000 +127991 -1.000000 +127992 -1.000000 +127993 -1.000000 +127994 -1.000000 +127996 -1.000000 +127997 -1.000000 +127998 -1.000000 +128000 -1.000000 +128003 -1.000000 +128004 -1.000000 +128005 -1.000000 +128007 -1.000000 +128008 -1.000000 +128010 -1.000000 +128011 -1.000000 +128018 -1.000000 +128148 -1.000000 +128151 -1.000000 +128158 -1.000000 +128159 -1.000000 +128173 -1.000000 +128174 -1.000000 +128175 -1.000000 +128176 -1.000000 +128177 -1.000000 +128178 -1.000000 +128179 -1.000000 +128181 -1.000000 +128182 -1.000000 +128184 -1.000000 +128186 -1.000000 +128194 -1.000000 +128198 -1.000000 +128199 -1.000000 +128200 -1.000000 +128201 -1.000000 +128202 -1.000000 +128204 -1.000000 +128205 -1.000000 +128208 -1.000000 +128209 -1.000000 +128210 -1.000000 +128211 -1.000000 +128215 -1.000000 +128217 -1.000000 +128220 -1.000000 +128221 -1.000000 +128228 -1.000000 +128237 -1.000000 +128238 -1.000000 +128239 -1.000000 +128240 -1.000000 +128241 -1.000000 +128242 -1.000000 +128243 -1.000000 +128244 -1.000000 +128245 -1.000000 +128246 -1.000000 +128248 -1.000000 +128249 -1.000000 +128250 -1.000000 +128251 -1.000000 +128252 -1.000000 +128253 -1.000000 +128254 -1.000000 +128255 -1.000000 +128259 -1.000000 +128260 -1.000000 +128262 -1.000000 +128263 -1.000000 +128264 -1.000000 +128265 -1.000000 +128266 -1.000000 +128271 -1.000000 +128272 -1.000000 +128273 -1.000000 +128276 -1.000000 +128278 -1.000000 +128279 -1.000000 +128283 -1.000000 +128285 -1.000000 +128286 -1.000000 +128291 -1.000000 +128292 -1.000000 +128294 -1.000000 +128303 -1.000000 +128304 -1.000000 +128305 -1.000000 +128306 -1.000000 +128307 -1.000000 +128312 -1.000000 +128313 -1.000000 +128314 -1.000000 +128315 -1.000000 +128316 -1.000000 +128325 -1.000000 +128326 -1.000000 +128334 -1.000000 +128335 -1.000000 +128336 -1.000000 +128338 -1.000000 +128339 -1.000000 +128344 -1.000000 +128346 -1.000000 +128347 -1.000000 +128348 -1.000000 +128353 -1.000000 +128354 -1.000000 +128355 -1.000000 +128356 -1.000000 +128359 -1.000000 +128363 -1.000000 +128366 -1.000000 +128370 -1.000000 +128371 -1.000000 +128372 -1.000000 +128373 -1.000000 +128375 -1.000000 +128376 -1.000000 +128377 -1.000000 +128379 -1.000000 +128380 -1.000000 +128382 -1.000000 +128383 -1.000000 +128384 -1.000000 +128385 -1.000000 +128386 -1.000000 +128387 -1.000000 +128388 -1.000000 +128389 -1.000000 +128390 -1.000000 +128391 -1.000000 +128392 -1.000000 +128393 -1.000000 +128394 -1.000000 +128395 -1.000000 +128396 -1.000000 +128397 -1.000000 +128399 -1.000000 +128401 -1.000000 +128403 -1.000000 +128405 -1.000000 +128407 -1.000000 +128408 -1.000000 +128411 -1.000000 +128412 -1.000000 +128417 -1.000000 +128420 -1.000000 +128421 -1.000000 +128428 -1.000000 +128430 -1.000000 +128432 -1.000000 +128434 -1.000000 +128435 -1.000000 +128436 -1.000000 +128439 -1.000000 +128442 -1.000000 +128444 -1.000000 +128445 -1.000000 +128446 -1.000000 +128447 -1.000000 +128448 -1.000000 +128457 -1.000000 +128458 -1.000000 +128459 -1.000000 +128460 -1.000000 +128461 -1.000000 +128462 -1.000000 +128463 -1.000000 +128464 -1.000000 +128465 -1.000000 +128466 -1.000000 +128469 -1.000000 +128470 -1.000000 +128480 -1.000000 +128481 -1.000000 +128484 -1.000000 +128486 -1.000000 +128487 -1.000000 +128489 -1.000000 +128490 -1.000000 +128491 -1.000000 +128492 -1.000000 +128493 -1.000000 +128494 -1.000000 +128495 -1.000000 +128497 -1.000000 +128498 -1.000000 +128501 -1.000000 +128508 -1.000000 +128509 -1.000000 +128513 -1.000000 +128514 -1.000000 +128515 -1.000000 +128517 -1.000000 +128518 -1.000000 +128522 -1.000000 +128523 -1.000000 +128524 -1.000000 +128525 -1.000000 +128526 -1.000000 +128532 -1.000000 +128535 -1.000000 +128536 -1.000000 +128539 -1.000000 +128540 -1.000000 +128546 -1.000000 +128553 -1.000000 +128554 -1.000000 +128555 -1.000000 +128556 -1.000000 +128557 -1.000000 +128558 -1.000000 +128559 -1.000000 +128560 -1.000000 +128561 -1.000000 +128562 -1.000000 +128563 -1.000000 +128564 -1.000000 +128565 -1.000000 +128566 -1.000000 +128567 -1.000000 +128569 -1.000000 +128570 -1.000000 +128571 -1.000000 +128572 -1.000000 +128573 -1.000000 +128574 -1.000000 +128578 -1.000000 +128579 -1.000000 +128580 -1.000000 +128586 -1.000000 +128587 -1.000000 +128589 -1.000000 +128590 -1.000000 +128591 -1.000000 +128592 -1.000000 +128593 -1.000000 +128594 -1.000000 +128595 -1.000000 +128597 -1.000000 +128598 -1.000000 +128599 -1.000000 +128600 -1.000000 +128601 -1.000000 +128602 -1.000000 +128603 -1.000000 +128604 -1.000000 +128605 -1.000000 +128606 -1.000000 +128607 -1.000000 +128608 -1.000000 +128609 -1.000000 +128610 -1.000000 +128612 -1.000000 +128613 -1.000000 +128614 -1.000000 +128615 -1.000000 +128617 -1.000000 +128619 -1.000000 +128621 -1.000000 +128622 -1.000000 +128623 -1.000000 +128624 -1.000000 +128625 -1.000000 +128626 -1.000000 +128627 -1.000000 +128629 -1.000000 +128630 -1.000000 +128631 -1.000000 +128632 -1.000000 +128633 -1.000000 +128634 -1.000000 +128635 -1.000000 +128636 -1.000000 +128647 -1.000000 +128663 -1.000000 +128664 -1.000000 +128665 -1.000000 +128666 -1.000000 +128667 -1.000000 +128668 -1.000000 +128669 -1.000000 +128670 -1.000000 +128672 -1.000000 +128673 -1.000000 +128675 -1.000000 +128676 -1.000000 +128754 -1.000000 +128755 -1.000000 +128760 -1.000000 +128763 -1.000000 +128764 -1.000000 +128767 -1.000000 +128768 -1.000000 +128772 -1.000000 +128773 -1.000000 +128774 -1.000000 +128775 -1.000000 +128776 -1.000000 +128779 -1.000000 +128780 -1.000000 +128784 -1.000000 +128786 -1.000000 +128788 -1.000000 +128789 -1.000000 +128790 -1.000000 +128791 -1.000000 +128792 -1.000000 +128793 -1.000000 +128795 -1.000000 +128807 -1.000000 +128808 -1.000000 +128809 -1.000000 +128810 -1.000000 +128811 -1.000000 +128813 -1.000000 +128819 -1.000000 +128821 -1.000000 +128822 -1.000000 +128823 -1.000000 +128825 -1.000000 +128827 -1.000000 +128828 -1.000000 +128829 -1.000000 +128830 -1.000000 +128835 -1.000000 +128836 -1.000000 +128837 -1.000000 +128849 -1.000000 +128853 -1.000000 +128856 -1.000000 +128858 -1.000000 +128859 -1.000000 +128863 -1.000000 +128864 -1.000000 +128868 -1.000000 +128869 -1.000000 +128870 -1.000000 +128871 -1.000000 +128873 -1.000000 +128875 -1.000000 +128877 -1.000000 +128878 -1.000000 +128880 -1.000000 +128883 -1.000000 +128884 -1.000000 +128885 -1.000000 +128887 -1.000000 +128888 -1.000000 +128908 -1.000000 +128910 -1.000000 +128911 -1.000000 +128912 -1.000000 +128913 -1.000000 +128914 -1.000000 +128915 -1.000000 +128916 -1.000000 +128917 -1.000000 +128918 -1.000000 +128919 -1.000000 +128921 -1.000000 +128922 -1.000000 +128923 -1.000000 +128924 -1.000000 +128925 -1.000000 +128926 -1.000000 +128927 -1.000000 +128928 -1.000000 +128929 -1.000000 +128930 -1.000000 +128931 -1.000000 +128932 -1.000000 +128933 -1.000000 +128935 -1.000000 +128936 -1.000000 +128944 -1.000000 +128945 -1.000000 +128953 -1.000000 +128956 -1.000000 +128957 -1.000000 +128959 -1.000000 +128960 -1.000000 +128962 -1.000000 +128964 -1.000000 +128965 -1.000000 +128973 -1.000000 +128974 -1.000000 +128978 -1.000000 +128980 -1.000000 +128981 -1.000000 +128983 -1.000000 +128984 -1.000000 +128985 -1.000000 +128987 -1.000000 +128994 -1.000000 +129000 -1.000000 +129001 -1.000000 +129002 -1.000000 +129003 -1.000000 +129004 -1.000000 +129007 -1.000000 +129012 -1.000000 +129027 -1.000000 +129028 -1.000000 +129029 -1.000000 +129034 -1.000000 +129035 -1.000000 +129037 -1.000000 +129038 -1.000000 +129039 -1.000000 +129040 -1.000000 +129042 -1.000000 +129043 -1.000000 +129044 -1.000000 +129046 -1.000000 +129048 -1.000000 +129049 -1.000000 +129050 -1.000000 +129051 -1.000000 +129052 -1.000000 +129054 -1.000000 +129058 -1.000000 +129059 -1.000000 +129060 -1.000000 +129061 -1.000000 +129062 -1.000000 +129065 -1.000000 +129067 -1.000000 +129068 -1.000000 +129070 -1.000000 +129072 -1.000000 +129073 -1.000000 +129074 -1.000000 +129075 -1.000000 +129078 -1.000000 +129079 -1.000000 +129085 -1.000000 +129086 -1.000000 +129087 -1.000000 +129088 -1.000000 +129089 -1.000000 +129091 -1.000000 +129095 -1.000000 +129098 -1.000000 +129099 -1.000000 +129100 -1.000000 +129101 -1.000000 +129102 -1.000000 +129103 -1.000000 +129105 -1.000000 +129106 -1.000000 +129107 -1.000000 +129108 -1.000000 +129109 -1.000000 +129110 -1.000000 +129111 -1.000000 +129112 -1.000000 +129113 -1.000000 +129114 -1.000000 +129115 -1.000000 +129116 -1.000000 +129117 -1.000000 +129120 -1.000000 +129122 -1.000000 +129124 -1.000000 +129125 -1.000000 +129126 -1.000000 +129127 -1.000000 +129128 -1.000000 +129129 -1.000000 +129130 -1.000000 +129131 -1.000000 +129132 -1.000000 +129133 -1.000000 +129134 -1.000000 +129135 -1.000000 +129136 -1.000000 +129137 -1.000000 +129139 -1.000000 +129140 -1.000000 +129141 -1.000000 +129142 -1.000000 +129143 -1.000000 +129144 -1.000000 +129145 -1.000000 +129146 -1.000000 +129147 -1.000000 +129148 -1.000000 +129151 -1.000000 +129152 -1.000000 +129153 -1.000000 +129155 -1.000000 +129157 -1.000000 +129160 -1.000000 +129161 -1.000000 +129167 -1.000000 +129168 -1.000000 +129169 -1.000000 +129170 -1.000000 +129176 -1.000000 +129178 -1.000000 +129180 -1.000000 +129185 -1.000000 +129186 -1.000000 +129194 -1.000000 +129195 -1.000000 +129199 -1.000000 +129202 -1.000000 +129217 -1.000000 +129220 -1.000000 +129221 -1.000000 +129223 -1.000000 +129224 -1.000000 +129225 -1.000000 +129226 -1.000000 +129228 -1.000000 +129229 -1.000000 +129230 -1.000000 +129232 -1.000000 +129233 -1.000000 +129234 -1.000000 +129235 -1.000000 +129236 -1.000000 +129237 -1.000000 +129238 -1.000000 +129239 -1.000000 +129240 -1.000000 +129241 -1.000000 +129242 -1.000000 +129244 -1.000000 +129245 -1.000000 +129246 -1.000000 +129247 -1.000000 +129248 -1.000000 +129252 -1.000000 +129253 -1.000000 +129254 -1.000000 +129255 -1.000000 +129256 -1.000000 +129257 -1.000000 +129258 -1.000000 +129260 -1.000000 +129261 -1.000000 +129262 -1.000000 +129263 -1.000000 +129264 -1.000000 +129265 -1.000000 +129266 -1.000000 +129267 -1.000000 +129268 -1.000000 +129269 -1.000000 +129272 -1.000000 +129273 -1.000000 +129274 -1.000000 +129275 -1.000000 +129276 -1.000000 +129277 -1.000000 +129278 -1.000000 +129279 -1.000000 +129282 -1.000000 +129283 -1.000000 +129284 -1.000000 +129285 -1.000000 +129287 -1.000000 +129292 -1.000000 +129293 -1.000000 +129294 -1.000000 +129296 -1.000000 +129299 -1.000000 +129300 -1.000000 +129302 -1.000000 +129303 -1.000000 +129304 -1.000000 +129307 -1.000000 +129310 -1.000000 +129311 -1.000000 +129313 -1.000000 +129316 -1.000000 +129317 -1.000000 +129318 -1.000000 +129319 -1.000000 +129320 -1.000000 +129321 -1.000000 +129324 -1.000000 +129325 -1.000000 +129332 -1.000000 +129333 -1.000000 +129334 -1.000000 +129335 -1.000000 +129336 -1.000000 +129337 -1.000000 +129338 -1.000000 +129339 -1.000000 +129340 -1.000000 +129341 -1.000000 +129342 -1.000000 +129343 -1.000000 +129344 -1.000000 +129345 -1.000000 +129347 -1.000000 +129348 -1.000000 +129349 -1.000000 +129350 -1.000000 +129351 -1.000000 +129353 -1.000000 +129354 -1.000000 +129355 -1.000000 +129358 -1.000000 +129359 -1.000000 +129361 -1.000000 +129362 -1.000000 +129363 -1.000000 +129364 -1.000000 +129365 -1.000000 +129366 -1.000000 +129367 -1.000000 +129368 -1.000000 +129369 -1.000000 +129370 -1.000000 +129371 -1.000000 +129372 -1.000000 +129373 -1.000000 +129374 -1.000000 +129376 -1.000000 +129392 -1.000000 +129393 -1.000000 +129394 -1.000000 +129396 -1.000000 +129399 -1.000000 +129400 -1.000000 +129401 -1.000000 +129402 -1.000000 +129403 -1.000000 +129404 -1.000000 +129405 -1.000000 +129406 -1.000000 +129409 -1.000000 +129410 -1.000000 +129411 -1.000000 +129412 -1.000000 +129413 -1.000000 +129414 -1.000000 +129418 -1.000000 +129419 -1.000000 +129421 -1.000000 +129422 -1.000000 +129423 -1.000000 +129425 -1.000000 +129426 -1.000000 +129427 -1.000000 +129430 -1.000000 +129431 -1.000000 +129432 -1.000000 +129434 -1.000000 +129435 -1.000000 +129436 -1.000000 +129437 -1.000000 +129438 -1.000000 +129440 -1.000000 +129441 -1.000000 +129442 -1.000000 +129444 -1.000000 +129445 -1.000000 +129449 -1.000000 +129453 -1.000000 +129454 -1.000000 +129455 -1.000000 +129456 -1.000000 +129457 -1.000000 +129458 -1.000000 +129459 -1.000000 +129460 -1.000000 +129461 -1.000000 +129462 -1.000000 +129463 -1.000000 +129464 -1.000000 +129465 -1.000000 +129466 -1.000000 +129468 -1.000000 +129469 -1.000000 +129470 -1.000000 +129473 -1.000000 +129474 -1.000000 +129475 -1.000000 +129476 -1.000000 +129477 -1.000000 +129478 -1.000000 +129479 -1.000000 +129480 -1.000000 +129482 -1.000000 +129483 -1.000000 +129487 -1.000000 +129488 -1.000000 +129497 -1.000000 +129498 -1.000000 +129499 -1.000000 +129500 -1.000000 +129503 -1.000000 +129504 -1.000000 +129505 -1.000000 +129506 -1.000000 +129507 -1.000000 +129508 -1.000000 +129509 -1.000000 +129510 -1.000000 +129511 -1.000000 +129512 -1.000000 +129513 -1.000000 +129514 -1.000000 +129515 -1.000000 +129522 -1.000000 +129523 -1.000000 +129524 -1.000000 +129525 -1.000000 +129527 -1.000000 +129528 -1.000000 +129529 -1.000000 +129530 -1.000000 +129531 -1.000000 +129532 -1.000000 +129533 -1.000000 +129534 -1.000000 +129535 -1.000000 +129536 -1.000000 +129537 -1.000000 +129538 -1.000000 +129541 -1.000000 +129542 -1.000000 +129543 -1.000000 +129544 -1.000000 +129545 -1.000000 +129546 -1.000000 +129547 -1.000000 +129548 -1.000000 +129549 -1.000000 +129550 -1.000000 +129556 -1.000000 +129557 -1.000000 +129558 -1.000000 +129560 -1.000000 +129565 -1.000000 +129571 -1.000000 +129572 -1.000000 +129573 -1.000000 +129574 -1.000000 +129575 -1.000000 +129576 -1.000000 +129577 -1.000000 +129578 -1.000000 +129579 -1.000000 +129580 -1.000000 +129581 -1.000000 +129583 -1.000000 +129585 -1.000000 +129586 -1.000000 +129587 -1.000000 +129588 -1.000000 +129590 -1.000000 +129592 -1.000000 +129594 -1.000000 +129596 -1.000000 +129597 -1.000000 +129599 -1.000000 +129601 -1.000000 +129604 -1.000000 +129606 -1.000000 +129607 -1.000000 +129608 -1.000000 +129609 -1.000000 +129610 -1.000000 +129611 -1.000000 +129613 -1.000000 +129615 -1.000000 +129616 -1.000000 +129617 -1.000000 +129621 -1.000000 +129622 -1.000000 +129623 -1.000000 +129624 -1.000000 +129625 -1.000000 +129626 -1.000000 +129629 -1.000000 +129630 -1.000000 +129631 -1.000000 +129632 -1.000000 +129633 -1.000000 +129634 -1.000000 +129635 -1.000000 +129636 -1.000000 +129638 -1.000000 +129639 -1.000000 +129640 -1.000000 +129641 -1.000000 +129642 -1.000000 +129644 -1.000000 +129646 -1.000000 +129648 -1.000000 +129649 -1.000000 +129650 -1.000000 +129651 -1.000000 +129652 -1.000000 +129653 -1.000000 +129654 -1.000000 +129655 -1.000000 +129656 -1.000000 +129657 -1.000000 +129658 -1.000000 +129659 -1.000000 +129660 -1.000000 +129661 -1.000000 +129665 -1.000000 +129666 -1.000000 +129667 -1.000000 +129668 -1.000000 +129669 -1.000000 +129670 -1.000000 +129671 -1.000000 +129672 -1.000000 +129673 -1.000000 +129674 -1.000000 +129675 -1.000000 +129676 -1.000000 +129677 -1.000000 +129680 -1.000000 +129681 -1.000000 +129682 -1.000000 +129684 -1.000000 +129685 -1.000000 +129686 -1.000000 +129687 -1.000000 +129688 -1.000000 +129689 -1.000000 +129690 -1.000000 +129691 -1.000000 +129692 -1.000000 +129693 -1.000000 +129695 -1.000000 +129710 -1.000000 +129711 -1.000000 +129712 -1.000000 +129713 -1.000000 +129714 -1.000000 +129716 -1.000000 +129717 -1.000000 +129718 -1.000000 +129719 -1.000000 +129722 -1.000000 +129725 -1.000000 +129726 -1.000000 +129728 -1.000000 +129729 -1.000000 +129730 -1.000000 +129733 -1.000000 +129734 -1.000000 +129736 -1.000000 +129738 -1.000000 +129770 -1.000000 +129771 -1.000000 +129772 -1.000000 +129773 -1.000000 +129774 -1.000000 +129778 -1.000000 +129785 -1.000000 +129786 -1.000000 +129788 -1.000000 +129791 -1.000000 +129793 -1.000000 +129796 -1.000000 +129800 -1.000000 +129803 -1.000000 +129805 -1.000000 +129806 -1.000000 +129807 -1.000000 +129808 -1.000000 +129809 -1.000000 +129810 -1.000000 +129811 -1.000000 +129812 -1.000000 +129813 -1.000000 +129814 -1.000000 +129815 -1.000000 +129816 -1.000000 +129817 -1.000000 +129818 -1.000000 +129819 -1.000000 +129820 -1.000000 +129822 -1.000000 +129823 -1.000000 +129824 -1.000000 +129825 -1.000000 +129826 -1.000000 +129827 -1.000000 +129828 -1.000000 +129829 -1.000000 +129830 -1.000000 +129831 -1.000000 +129832 -1.000000 +129836 -1.000000 +129837 -1.000000 +129838 -1.000000 +129839 -1.000000 +129840 -1.000000 +129841 -1.000000 +129842 -1.000000 +129843 -1.000000 +129844 -1.000000 +129845 -1.000000 +129846 -1.000000 +129847 -1.000000 +129849 -1.000000 +129850 -1.000000 +129851 -1.000000 +129852 -1.000000 +129864 -1.000000 +129865 -1.000000 +129866 -1.000000 +129872 -1.000000 +129873 -1.000000 +129874 -1.000000 +129875 -1.000000 +129876 -1.000000 +129877 -1.000000 +129878 -1.000000 +129879 -1.000000 +129880 -1.000000 +129881 -1.000000 +129884 -1.000000 +129885 -1.000000 +129886 -1.000000 +129887 -1.000000 +129892 -1.000000 +129896 -1.000000 +129897 -1.000000 +129898 -1.000000 +129899 -1.000000 +129901 -1.000000 +129902 -1.000000 +129903 -1.000000 +129904 -1.000000 +129905 -1.000000 +129906 -1.000000 +129907 -1.000000 +129908 -1.000000 +129909 -1.000000 +129910 -1.000000 +129911 -1.000000 +129912 -1.000000 +129913 -1.000000 +129915 -1.000000 +129916 -1.000000 +129917 -1.000000 +129918 -1.000000 +129919 -1.000000 +129920 -1.000000 +129921 -1.000000 +129924 -1.000000 +129926 -1.000000 +129927 -1.000000 +129928 -1.000000 +129929 -1.000000 +129930 -1.000000 +129931 -1.000000 +129932 -1.000000 +129933 -1.000000 +129934 -1.000000 +129935 -1.000000 +129936 -1.000000 +129937 -1.000000 +129938 -1.000000 +129943 -1.000000 +129945 -1.000000 +129954 -1.000000 +129958 -1.000000 +129972 -1.000000 +129975 -1.000000 +129978 -1.000000 +129981 -1.000000 +129982 -1.000000 +129983 -1.000000 +129984 -1.000000 +129985 -1.000000 +129986 -1.000000 +129987 -1.000000 +129988 -1.000000 +129991 -1.000000 +129992 -1.000000 +129993 -1.000000 +129994 -1.000000 +129995 -1.000000 +129997 -1.000000 +130003 -1.000000 +130006 -1.000000 +130008 -1.000000 +130010 -1.000000 +130012 -1.000000 +130013 -1.000000 +130014 -1.000000 +130015 -1.000000 +130016 -1.000000 +130017 -1.000000 +130018 -1.000000 +130019 -1.000000 +130020 -1.000000 +130021 -1.000000 +130022 -1.000000 +130023 -1.000000 +130024 -1.000000 +130025 -1.000000 +130026 -1.000000 +130027 -1.000000 +130028 -1.000000 +130029 -1.000000 +130030 -1.000000 +130031 -1.000000 +130032 -1.000000 +130033 -1.000000 +130034 -1.000000 +130035 -1.000000 +130036 -1.000000 +130037 -1.000000 +130038 -1.000000 +130039 -1.000000 +130040 -1.000000 +130041 -1.000000 +130044 -1.000000 +130045 -1.000000 +130046 -1.000000 +130047 -1.000000 +130048 -1.000000 +130049 -1.000000 +130050 -1.000000 +130051 -1.000000 +130052 -1.000000 +130057 -1.000000 +130063 -1.000000 +130064 -1.000000 +130065 -1.000000 +130066 -1.000000 +130067 -1.000000 +130068 -1.000000 +130069 -1.000000 +130070 -1.000000 +130071 -1.000000 +130072 -1.000000 +130075 -1.000000 +130076 -1.000000 +130077 -1.000000 +130078 -1.000000 +130079 -1.000000 +130080 -1.000000 +130081 -1.000000 +130082 -1.000000 +130083 -1.000000 +130084 -1.000000 +130085 -1.000000 +130086 -1.000000 +130087 -1.000000 +130088 -1.000000 +130089 -1.000000 +130090 -1.000000 +130091 -1.000000 +130093 -1.000000 +130094 -1.000000 +130110 -1.000000 +130111 -1.000000 +130136 -1.000000 +130137 -1.000000 +130142 -1.000000 +130143 -1.000000 +130150 -1.000000 +130151 -1.000000 +130155 -1.000000 +130156 -1.000000 +130159 -1.000000 +130162 -1.000000 +130166 -1.000000 +130168 -1.000000 +130170 -1.000000 +130171 -1.000000 +130176 -1.000000 +130183 -1.000000 +130184 -1.000000 +130185 -1.000000 +130186 -1.000000 +130187 -1.000000 +130188 -1.000000 +130189 -1.000000 +130190 -1.000000 +130191 -1.000000 +130192 -1.000000 +130217 -1.000000 +130218 -1.000000 +130233 -1.000000 +130235 -1.000000 +130236 -1.000000 +130273 -1.000000 +130277 -1.000000 +130284 -1.000000 +130285 -1.000000 +130286 -1.000000 +130287 -1.000000 +130288 -1.000000 +130289 -1.000000 +130290 -1.000000 +130291 -1.000000 +130292 -1.000000 +130293 -1.000000 +130294 -1.000000 +130295 -1.000000 +130298 -1.000000 +130299 -1.000000 +130300 -1.000000 +130301 -1.000000 +130302 -1.000000 +130303 -1.000000 +130304 -1.000000 +130305 -1.000000 +130306 -1.000000 +130307 -1.000000 +130403 -1.000000 +130405 -1.000000 +130406 -1.000000 +130407 -1.000000 +130408 -1.000000 +130409 -1.000000 +130410 -1.000000 +130411 -1.000000 +130412 -1.000000 +130413 -1.000000 +130414 -1.000000 +130415 -1.000000 +130416 -1.000000 +130417 -1.000000 +130418 -1.000000 +130419 -1.000000 +130420 -1.000000 +130421 -1.000000 +130422 -1.000000 +130423 -1.000000 +130424 -1.000000 +130425 -1.000000 +130426 -1.000000 +130427 -1.000000 +130428 -1.000000 +130429 -1.000000 +130430 -1.000000 +130432 -1.000000 +130433 -1.000000 +130434 -1.000000 +130435 -1.000000 +130436 -1.000000 +130437 -1.000000 +130438 -1.000000 +130439 -1.000000 +130440 -1.000000 +130441 -1.000000 +130442 -1.000000 +130443 -1.000000 +130444 -1.000000 +130445 -1.000000 +130446 -1.000000 +130447 -1.000000 +130448 -1.000000 +130449 -1.000000 +130452 -1.000000 +130453 -1.000000 +130454 -1.000000 +130455 -1.000000 +130456 -1.000000 +130457 -1.000000 +130458 -1.000000 +130459 -1.000000 +130460 -1.000000 +130461 -1.000000 +130462 -1.000000 +130463 -1.000000 +130464 -1.000000 +130465 -1.000000 +130466 -1.000000 +130467 -1.000000 +130468 -1.000000 +130469 -1.000000 +130470 -1.000000 +130471 -1.000000 +130472 -1.000000 +130473 -1.000000 +130474 -1.000000 +130475 -1.000000 +130476 -1.000000 +130477 -1.000000 +130478 -1.000000 +130479 -1.000000 +130480 -1.000000 +130481 -1.000000 +130482 -1.000000 +130483 -1.000000 +130484 -1.000000 +130485 -1.000000 +130486 -1.000000 +130487 -1.000000 +130488 -1.000000 +130489 -1.000000 +130490 -1.000000 +130491 -1.000000 +130492 -1.000000 +130493 -1.000000 +130494 -1.000000 +130495 -1.000000 +130496 -1.000000 +130497 -1.000000 +130498 -1.000000 +130499 -1.000000 +130500 -1.000000 +130501 -1.000000 +130502 -1.000000 +130503 -1.000000 +130505 -1.000000 +130508 -1.000000 +130509 -1.000000 +130510 -1.000000 +130511 -1.000000 +130512 -1.000000 +130513 -1.000000 +130514 -1.000000 +130515 -1.000000 +130516 -1.000000 +130517 -1.000000 +130518 -1.000000 +130519 -1.000000 +130520 -1.000000 +130521 -1.000000 +130522 -1.000000 +130523 -1.000000 +130524 -1.000000 +130525 -1.000000 +130526 -1.000000 +130527 -1.000000 +130528 -1.000000 +130529 -1.000000 +130530 -1.000000 +130531 -1.000000 +130532 -1.000000 +130533 -1.000000 +130534 -1.000000 +130535 -1.000000 +130536 -1.000000 +130537 -1.000000 +130538 -1.000000 +130539 -1.000000 +130540 -1.000000 +130541 -1.000000 +130542 -1.000000 +130543 -1.000000 +130544 -1.000000 +130545 -1.000000 +130546 -1.000000 +130547 -1.000000 +130548 -1.000000 +130549 -1.000000 +130568 -1.000000 +130569 -1.000000 +130570 -1.000000 +130571 -1.000000 +130572 -1.000000 +130573 -1.000000 +130574 -1.000000 +130575 -1.000000 +130576 -1.000000 +130577 -1.000000 +130578 -1.000000 +130579 -1.000000 +130580 -1.000000 +130581 -1.000000 +130582 -1.000000 +130583 -1.000000 +130625 -1.000000 +130626 -1.000000 +130627 -1.000000 +130628 -1.000000 +130629 -1.000000 +130630 -1.000000 +130631 -1.000000 +130632 -1.000000 +130638 -1.000000 +130641 -1.000000 +130642 -1.000000 +130643 -1.000000 +130644 -1.000000 +130645 -1.000000 +130646 -1.000000 +130647 -1.000000 +130648 -1.000000 +130649 -1.000000 +130650 -1.000000 +130652 -1.000000 +130653 -1.000000 +130654 -1.000000 +130655 -1.000000 +130656 -1.000000 +130657 -1.000000 +130659 -1.000000 +130660 -1.000000 +130661 -1.000000 +130671 -1.000000 +130674 -1.000000 +130676 -1.000000 +130677 -1.000000 +130678 -1.000000 +130680 -1.000000 +130681 -1.000000 +130682 -1.000000 +130683 -1.000000 +130684 -1.000000 +130686 -1.000000 +130687 -1.000000 +130688 -1.000000 +130689 -1.000000 +130690 -1.000000 +130691 -1.000000 +130692 -1.000000 +130693 -1.000000 +130694 -1.000000 +130695 -1.000000 +130696 -1.000000 +130697 -1.000000 +130701 -1.000000 +130702 -1.000000 +130703 -1.000000 +130718 -1.000000 +130720 -1.000000 +130721 -1.000000 +130722 -1.000000 +130723 -1.000000 +130724 -1.000000 +130725 -1.000000 +130726 -1.000000 +130727 -1.000000 +130728 -1.000000 +130729 -1.000000 +130730 -1.000000 +130731 -1.000000 +130733 -1.000000 +130734 -1.000000 +130735 -1.000000 +130736 -1.000000 +130737 -1.000000 +130740 -1.000000 +130741 -1.000000 +130742 -1.000000 +130743 -1.000000 +130745 -1.000000 +130746 -1.000000 +130749 -1.000000 +130750 -1.000000 +130751 -1.000000 +130752 -1.000000 +130753 -1.000000 +130754 -1.000000 +130755 -1.000000 +130756 -1.000000 +130757 -1.000000 +130758 -1.000000 +130759 -1.000000 +130762 -1.000000 +130764 -1.000000 +130765 -1.000000 +130766 -1.000000 +130767 -1.000000 +130768 -1.000000 +130769 -1.000000 +130770 -1.000000 +130771 -1.000000 +130772 -1.000000 +130773 -1.000000 +130774 -1.000000 +130775 -1.000000 +130776 -1.000000 +130777 -1.000000 +130778 -1.000000 +130780 -1.000000 +130781 -1.000000 +130782 -1.000000 +130783 -1.000000 +130784 -1.000000 +130785 -1.000000 +130786 -1.000000 +130787 -1.000000 +130788 -1.000000 +130789 -1.000000 +130790 -1.000000 +130791 -1.000000 +130792 -1.000000 +130793 -1.000000 +130794 -1.000000 +130795 -1.000000 +130796 -1.000000 +130797 -1.000000 +130798 -1.000000 +130799 -1.000000 +130800 -1.000000 +130801 -1.000000 +130802 -1.000000 +130803 -1.000000 +130805 -1.000000 +130806 -1.000000 +130807 -1.000000 +130808 -1.000000 +130809 -1.000000 +130810 -1.000000 +130811 -1.000000 +130812 -1.000000 +130813 -1.000000 +130814 -1.000000 +130815 -1.000000 +130816 -1.000000 +130817 -1.000000 +130818 -1.000000 +130819 -1.000000 +130820 -1.000000 +130821 -1.000000 +130822 -1.000000 +130823 -1.000000 +130824 -1.000000 +130825 -1.000000 +130826 -1.000000 +130827 -1.000000 +130828 -1.000000 +130829 -1.000000 +130830 -1.000000 +130831 -1.000000 +130832 -1.000000 +130833 -1.000000 +130834 -1.000000 +130835 -1.000000 +130836 -1.000000 +130837 -1.000000 +130838 -1.000000 +130839 -1.000000 +130840 -1.000000 +130841 -1.000000 +130842 -1.000000 +130843 -1.000000 +130844 -1.000000 +130845 -1.000000 +130847 -1.000000 +130848 -1.000000 +130849 -1.000000 +130850 -1.000000 +130851 -1.000000 +130852 -1.000000 +130853 -1.000000 +130854 -1.000000 +130855 -1.000000 +130856 -1.000000 +130861 -1.000000 +130868 -1.000000 +130869 -1.000000 +130870 -1.000000 +130871 -1.000000 +130872 -1.000000 +130873 -1.000000 +130874 -1.000000 +130875 -1.000000 +130876 -1.000000 +130877 -1.000000 +130880 -1.000000 +130881 -1.000000 +130882 -1.000000 +130884 -1.000000 +130885 -1.000000 +130886 -1.000000 +130887 -1.000000 +130888 -1.000000 +130890 -1.000000 +130891 -1.000000 +130895 -1.000000 +130907 -1.000000 +130908 -1.000000 +130916 -1.000000 +130917 -1.000000 +130918 -1.000000 +130919 -1.000000 +130921 -1.000000 +130922 -1.000000 +130923 -1.000000 +130924 -1.000000 +130927 -1.000000 +130928 -1.000000 +130929 -1.000000 +130931 -1.000000 +130932 -1.000000 +130934 -1.000000 +130936 -1.000000 +130937 -1.000000 +130938 -1.000000 +130939 -1.000000 +130940 -1.000000 +130941 -1.000000 +130942 -1.000000 +130943 -1.000000 +130944 -1.000000 +130945 -1.000000 +130946 -1.000000 +130947 -1.000000 +130948 -1.000000 +130949 -1.000000 +130950 -1.000000 +130951 -1.000000 +130952 -1.000000 +130953 -1.000000 +130954 -1.000000 +130955 -1.000000 +130956 -1.000000 +130957 -1.000000 +130958 -1.000000 +130963 -1.000000 +130964 -1.000000 +130965 -1.000000 +130966 -1.000000 +130967 -1.000000 +130968 -1.000000 +130969 -1.000000 +130970 -1.000000 +130971 -1.000000 +130972 -1.000000 +130973 -1.000000 +130974 -1.000000 +130975 -1.000000 +130976 -1.000000 +130977 -1.000000 +130978 -1.000000 +130979 -1.000000 +130980 -1.000000 +130981 -1.000000 +130982 -1.000000 +130983 -1.000000 +130984 -1.000000 +130985 -1.000000 +130986 -1.000000 +130987 -1.000000 +130989 -1.000000 +130990 -1.000000 +130991 -1.000000 +130992 -1.000000 +130993 -1.000000 +130994 -1.000000 +130995 -1.000000 +130996 -1.000000 +130997 -1.000000 +130998 -1.000000 +130999 -1.000000 +131000 -1.000000 +131002 -1.000000 +131003 -1.000000 +131004 -1.000000 +131007 -1.000000 +131008 -1.000000 +131009 -1.000000 +131011 -1.000000 +131012 -1.000000 +131013 -1.000000 +131014 -1.000000 +131015 -1.000000 +131016 -1.000000 +131017 -1.000000 +131018 -1.000000 +131056 -1.000000 +131057 -1.000000 +131060 -1.000000 +131061 -1.000000 +131062 -1.000000 +131063 -1.000000 +131064 -1.000000 +131065 -1.000000 +131066 -1.000000 +131067 -1.000000 +131068 -1.000000 +131069 -1.000000 +131070 -1.000000 +131072 -1.000000 +131080 -1.000000 +131081 -1.000000 +131082 -1.000000 +131083 -1.000000 +131084 -1.000000 +131085 -1.000000 +131086 -1.000000 +131087 -1.000000 +131090 -1.000000 +131091 -1.000000 +131107 -1.000000 +131114 -1.000000 +131115 -1.000000 +131116 -1.000000 +131117 -1.000000 +131118 -1.000000 +131119 -1.000000 +131120 -1.000000 +131126 -1.000000 +131127 -1.000000 +131128 -1.000000 +131129 -1.000000 +131130 -1.000000 +131131 -1.000000 +131132 -1.000000 +131133 -1.000000 +131135 -1.000000 +131136 -1.000000 +131137 -1.000000 +131138 -1.000000 +131141 -1.000000 +131142 -1.000000 +131150 -1.000000 +131151 -1.000000 +131152 -1.000000 +131155 -1.000000 +131159 -1.000000 +131160 -1.000000 +131161 -1.000000 +131162 -1.000000 +131163 -1.000000 +131167 -1.000000 +131168 -1.000000 +131169 -1.000000 +131170 -1.000000 +131171 -1.000000 +131178 -1.000000 +131184 -1.000000 +131185 -1.000000 +131186 -1.000000 +131187 -1.000000 +131189 -1.000000 +131190 -1.000000 +131192 -1.000000 +131194 -1.000000 +131196 -1.000000 +131198 -1.000000 +131199 -1.000000 +131201 -1.000000 +131203 -1.000000 +131204 -1.000000 +131205 -1.000000 +131206 -1.000000 +131208 -1.000000 +131209 -1.000000 +131212 -1.000000 +131215 -1.000000 +131233 -1.000000 +131234 -1.000000 +131235 -1.000000 +131236 -1.000000 +131237 -1.000000 +131238 -1.000000 +131239 -1.000000 +131240 -1.000000 +131241 -1.000000 +131242 -1.000000 +131243 -1.000000 +131244 -1.000000 +131245 -1.000000 +131246 -1.000000 +131247 -1.000000 +131262 -1.000000 +131265 -1.000000 +131266 -1.000000 +131267 -1.000000 +131268 -1.000000 +131271 -1.000000 +131272 -1.000000 +131273 -1.000000 +131274 -1.000000 +131275 -1.000000 +131276 -1.000000 +131277 -1.000000 +131278 -1.000000 +131279 -1.000000 +131280 -1.000000 +131281 -1.000000 +131282 -1.000000 +131310 -1.000000 +131312 -1.000000 +131313 -1.000000 +131314 -1.000000 +131315 -1.000000 +131316 -1.000000 +131317 -1.000000 +131318 -1.000000 +131319 -1.000000 +131320 -1.000000 +131321 -1.000000 +131322 -1.000000 +131323 -1.000000 +131324 -1.000000 +131325 -1.000000 +131326 -1.000000 +131327 -1.000000 +131328 -1.000000 +131329 -1.000000 +131330 -1.000000 +131331 -1.000000 +131332 -1.000000 +131333 -1.000000 +131334 -1.000000 +131335 -1.000000 +131336 -1.000000 +131339 -1.000000 +131345 -1.000000 +131346 -1.000000 +131347 -1.000000 +131351 -1.000000 +131362 -1.000000 +131363 -1.000000 +131365 -1.000000 +131368 -1.000000 +131369 -1.000000 +131373 -1.000000 +131374 -1.000000 +131379 -1.000000 +131380 -1.000000 +131383 -1.000000 +131384 -1.000000 +131385 -1.000000 +131386 -1.000000 +131389 -1.000000 +131392 -1.000000 +131394 -1.000000 +131395 -1.000000 +131396 -1.000000 +131397 -1.000000 +131398 -1.000000 +131399 -1.000000 +131400 -1.000000 +131401 -1.000000 +131402 -1.000000 +131403 -1.000000 +131404 -1.000000 +131405 -1.000000 +131406 -1.000000 +131407 -1.000000 +131408 -1.000000 +131409 -1.000000 +131411 -1.000000 +131412 -1.000000 +131415 -1.000000 +131416 -1.000000 +131417 -1.000000 +131418 -1.000000 +131419 -1.000000 +131420 -1.000000 +131422 -1.000000 +131427 -1.000000 +131428 -1.000000 +131429 -1.000000 +131430 -1.000000 +131431 -1.000000 +131432 -1.000000 +131444 -1.000000 +131445 -1.000000 +131446 -1.000000 +131447 -1.000000 +131448 -1.000000 +131451 -1.000000 +131452 -1.000000 +131453 -1.000000 +131454 -1.000000 +131455 -1.000000 +131456 -1.000000 +131457 -1.000000 +131458 -1.000000 +131460 -1.000000 +131461 -1.000000 +131462 -1.000000 +131463 -1.000000 +131466 -1.000000 +131467 -1.000000 +131468 -1.000000 +131472 -1.000000 +131473 -1.000000 +131475 -1.000000 +131477 -1.000000 +131482 -1.000000 +131485 -1.000000 +131487 -1.000000 +131488 -1.000000 +131489 -1.000000 +131490 -1.000000 +131491 -1.000000 +131492 -1.000000 +131493 -1.000000 +131497 -1.000000 +131499 -1.000000 +131500 -1.000000 +131521 -1.000000 +131526 -1.000000 +131532 -1.000000 +131545 -1.000000 +131615 -1.000000 +131618 -1.000000 +131619 -1.000000 +131620 -1.000000 +131621 -1.000000 +131626 -1.000000 +131627 -1.000000 +131628 -1.000000 +131630 -1.000000 +131634 -1.000000 +131638 -1.000000 +131640 -1.000000 +131663 -1.000000 +131671 -1.000000 +131672 -1.000000 +131673 -1.000000 +131674 -1.000000 +131676 -1.000000 +131677 -1.000000 +131678 -1.000000 +131679 -1.000000 +131681 -1.000000 +131682 -1.000000 +131683 -1.000000 +131698 -1.000000 +131699 -1.000000 +131701 -1.000000 +131702 -1.000000 +131703 -1.000000 +131704 -1.000000 +131706 -1.000000 +131707 -1.000000 +131708 -1.000000 +131709 -1.000000 +131710 -1.000000 +131711 -1.000000 +131712 -1.000000 +131713 -1.000000 +131714 -1.000000 +131715 -1.000000 +131716 -1.000000 +131717 -1.000000 +131718 -1.000000 +131719 -1.000000 +131721 -1.000000 +131722 -1.000000 +131723 -1.000000 +131724 -1.000000 +131725 -1.000000 +131726 -1.000000 +131727 -1.000000 +131729 -1.000000 +131731 -1.000000 +131732 -1.000000 +131733 -1.000000 +131734 -1.000000 +131735 -1.000000 +131736 -1.000000 +131737 -1.000000 +131738 -1.000000 +131739 -1.000000 +131740 -1.000000 +131741 -1.000000 +131742 -1.000000 +131745 -1.000000 +131746 -1.000000 +131747 -1.000000 +131748 -1.000000 +131749 -1.000000 +131750 -1.000000 +131751 -1.000000 +131752 -1.000000 +131753 -1.000000 +131754 -1.000000 +131755 -1.000000 +131756 -1.000000 +131757 -1.000000 +131758 -1.000000 +131759 -1.000000 +131760 -1.000000 +131761 -1.000000 +131762 -1.000000 +131763 -1.000000 +131764 -1.000000 +131765 -1.000000 +131766 -1.000000 +131767 -1.000000 +131768 -1.000000 +131769 -1.000000 +131771 -1.000000 +131773 -1.000000 +131774 -1.000000 +131775 -1.000000 +131776 -1.000000 +131777 -1.000000 +131778 -1.000000 +131779 -1.000000 +131780 -1.000000 +131781 -1.000000 +131782 -1.000000 +131783 -1.000000 +131784 -1.000000 +131785 -1.000000 +131805 -1.000000 +131806 -1.000000 +131807 -1.000000 +131815 -1.000000 +131820 -1.000000 +131822 -1.000000 +131824 -1.000000 +131825 -1.000000 +131826 -1.000000 +131827 -1.000000 +131828 -1.000000 +131829 -1.000000 +131830 -1.000000 +131831 -1.000000 +131832 -1.000000 +131833 -1.000000 +131834 -1.000000 +131835 -1.000000 +131836 -1.000000 +131837 -1.000000 +131838 -1.000000 +131839 -1.000000 +131840 -1.000000 +131841 -1.000000 +131842 -1.000000 +131843 -1.000000 +131845 -1.000000 +131846 -1.000000 +131848 -1.000000 +131849 -1.000000 +131850 -1.000000 +131852 -1.000000 +131854 -1.000000 +131855 -1.000000 +131856 -1.000000 +131857 -1.000000 +131858 -1.000000 +131859 -1.000000 +131860 -1.000000 +131861 -1.000000 +131862 -1.000000 +131863 -1.000000 +131864 -1.000000 +131865 -1.000000 +131866 -1.000000 +131867 -1.000000 +131868 -1.000000 +131869 -1.000000 +131874 -1.000000 +131875 -1.000000 +131876 -1.000000 +131877 -1.000000 +131878 -1.000000 +131879 -1.000000 +131881 -1.000000 +131885 -1.000000 +131888 -1.000000 +131889 -1.000000 +131890 -1.000000 +131891 -1.000000 +131892 -1.000000 +131893 -1.000000 +131894 -1.000000 +131895 -1.000000 +131896 -1.000000 +131897 -1.000000 +131898 -1.000000 +131899 -1.000000 +131900 -1.000000 +131901 -1.000000 +131902 -1.000000 +131906 -1.000000 +131907 -1.000000 +131910 -1.000000 +131913 -1.000000 +131915 -1.000000 +131917 -1.000000 +131918 -1.000000 +131919 -1.000000 +131920 -1.000000 +131921 -1.000000 +131922 -1.000000 +131923 -1.000000 +131924 -1.000000 +131931 -1.000000 +131932 -1.000000 +131933 -1.000000 +131934 -1.000000 +131935 -1.000000 +131938 -1.000000 +131939 -1.000000 +131940 -1.000000 +131942 -1.000000 +131946 -1.000000 +131947 -1.000000 +131948 -1.000000 +131950 -1.000000 +131952 -1.000000 +131953 -1.000000 +131954 -1.000000 +131955 -1.000000 +131957 -1.000000 +131958 -1.000000 +131961 -1.000000 +131964 -1.000000 +131965 -1.000000 +131966 -1.000000 +131967 -1.000000 +131968 -1.000000 +131969 -1.000000 +131971 -1.000000 +131975 -1.000000 +131976 -1.000000 +131977 -1.000000 +131978 -1.000000 +131979 -1.000000 +131980 -1.000000 +131981 -1.000000 +131982 -1.000000 +131983 -1.000000 +131984 -1.000000 +131985 -1.000000 +131986 -1.000000 +131987 -1.000000 +131989 -1.000000 +131993 -1.000000 +131994 -1.000000 +131996 -1.000000 +132000 -1.000000 +132003 -1.000000 +132006 -1.000000 +132010 -1.000000 +132011 -1.000000 +132012 -1.000000 +132013 -1.000000 +132014 -1.000000 +132015 -1.000000 +132016 -1.000000 +132017 -1.000000 +132018 -1.000000 +132019 -1.000000 +132027 -1.000000 +132028 -1.000000 +132029 -1.000000 +132030 -1.000000 +132031 -1.000000 +132032 -1.000000 +132033 -1.000000 +132034 -1.000000 +132035 -1.000000 +132036 -1.000000 +132037 -1.000000 +132038 -1.000000 +132039 -1.000000 +132040 -1.000000 +132041 -1.000000 +132042 -1.000000 +132043 -1.000000 +132044 -1.000000 +132045 -1.000000 +132046 -1.000000 +132047 -1.000000 +132051 -1.000000 +132052 -1.000000 +132053 -1.000000 +132055 -1.000000 +132056 -1.000000 +132057 -1.000000 +132058 -1.000000 +132059 -1.000000 +132063 -1.000000 +132064 -1.000000 +132065 -1.000000 +132066 -1.000000 +132067 -1.000000 +132068 -1.000000 +132069 -1.000000 +132070 -1.000000 +132071 -1.000000 +132072 -1.000000 +132073 -1.000000 +132074 -1.000000 +132075 -1.000000 +132076 -1.000000 +132077 -1.000000 +132078 -1.000000 +132079 -1.000000 +132081 -1.000000 +132082 -1.000000 +132083 -1.000000 +132084 -1.000000 +132085 -1.000000 +132087 -1.000000 +132096 -1.000000 +132097 -1.000000 +132098 -1.000000 +132099 -1.000000 +132108 -1.000000 +132146 -1.000000 +132147 -1.000000 +132149 -1.000000 +132153 -1.000000 +132170 -1.000000 +132181 -1.000000 +132182 -1.000000 +132184 -1.000000 +132188 -1.000000 +132191 -1.000000 +132193 -1.000000 +132195 -1.000000 +132201 -1.000000 +132202 -1.000000 +132203 -1.000000 +132204 -1.000000 +132206 -1.000000 +132210 -1.000000 +132213 -1.000000 +132214 -1.000000 +132215 -1.000000 +132216 -1.000000 +132217 -1.000000 +132218 -1.000000 +132219 -1.000000 +132220 -1.000000 +132221 -1.000000 +132222 -1.000000 +132223 -1.000000 +132224 -1.000000 +132225 -1.000000 +132226 -1.000000 +132227 -1.000000 +132228 -1.000000 +132229 -1.000000 +132236 -1.000000 +132237 -1.000000 +132238 -1.000000 +132239 -1.000000 +132240 -1.000000 +132242 -1.000000 +132243 -1.000000 +132244 -1.000000 +132245 -1.000000 +132246 -1.000000 +132247 -1.000000 +132248 -1.000000 +132249 -1.000000 +132250 -1.000000 +132251 -1.000000 +132252 -1.000000 +132253 -1.000000 +132255 -1.000000 +132256 -1.000000 +132257 -1.000000 +132258 -1.000000 +132259 -1.000000 +132260 -1.000000 +132261 -1.000000 +132262 -1.000000 +132263 -1.000000 +132264 -1.000000 +132265 -1.000000 +132266 -1.000000 +132267 -1.000000 +132268 -1.000000 +132269 -1.000000 +132270 -1.000000 +132271 -1.000000 +132272 -1.000000 +132273 -1.000000 +132276 -1.000000 +132279 -1.000000 +132280 -1.000000 +132281 -1.000000 +132282 -1.000000 +132284 -1.000000 +132285 -1.000000 +132286 -1.000000 +132287 -1.000000 +132288 -1.000000 +132290 -1.000000 +132292 -1.000000 +132293 -1.000000 +132294 -1.000000 +132295 -1.000000 +132296 -1.000000 +132297 -1.000000 +132299 -1.000000 +132300 -1.000000 +132301 -1.000000 +132302 -1.000000 +132303 -1.000000 +132304 -1.000000 +132305 -1.000000 +132306 -1.000000 +132311 -1.000000 +132312 -1.000000 +132313 -1.000000 +132315 -1.000000 +132317 -1.000000 +132318 -1.000000 +132319 -1.000000 +132320 -1.000000 +132321 -1.000000 +132336 -1.000000 +132338 -1.000000 +132340 -1.000000 +132341 -1.000000 +132343 -1.000000 +132344 -1.000000 +132345 -1.000000 +132346 -1.000000 +132348 -1.000000 +132349 -1.000000 +132350 -1.000000 +132352 -1.000000 +132354 -1.000000 +132355 -1.000000 +132356 -1.000000 +132357 -1.000000 +132358 -1.000000 +132359 -1.000000 +132360 -1.000000 +132362 -1.000000 +132363 -1.000000 +132364 -1.000000 +132367 -1.000000 +132368 -1.000000 +132370 -1.000000 +132371 -1.000000 +132373 -1.000000 +132374 -1.000000 +132377 -1.000000 +132380 -1.000000 +132381 -1.000000 +132382 -1.000000 +132384 -1.000000 +132391 -1.000000 +132392 -1.000000 +132394 -1.000000 +132398 -1.000000 +132399 -1.000000 +132400 -1.000000 +132401 -1.000000 +132402 -1.000000 +132403 -1.000000 +132406 -1.000000 +132407 -1.000000 +132411 -1.000000 +132414 -1.000000 +132415 -1.000000 +132416 -1.000000 +132417 -1.000000 +132418 -1.000000 +132419 -1.000000 +132420 -1.000000 +132423 -1.000000 +132424 -1.000000 +132425 -1.000000 +132426 -1.000000 +132427 -1.000000 +132428 -1.000000 +132429 -1.000000 +132430 -1.000000 +132431 -1.000000 +132432 -1.000000 +132433 -1.000000 +132435 -1.000000 +132436 -1.000000 +132438 -1.000000 +132439 -1.000000 +132440 -1.000000 +132441 -1.000000 +132443 -1.000000 +132444 -1.000000 +132445 -1.000000 +132446 -1.000000 +132447 -1.000000 +132448 -1.000000 +132449 -1.000000 +132450 -1.000000 +132451 -1.000000 +132452 -1.000000 +132453 -1.000000 +132455 -1.000000 +132456 -1.000000 +132457 -1.000000 +132459 -1.000000 +132461 -1.000000 +132465 -1.000000 +132467 -1.000000 +132468 -1.000000 +132471 -1.000000 +132478 -1.000000 +132481 -1.000000 +132482 -1.000000 +132483 -1.000000 +132484 -1.000000 +132485 -1.000000 +132486 -1.000000 +132487 -1.000000 +132489 -1.000000 +132493 -1.000000 +132494 -1.000000 +132503 -1.000000 +132504 -1.000000 +132505 -1.000000 +132506 -1.000000 +132507 -1.000000 +132508 -1.000000 +132509 -1.000000 +132511 -1.000000 +132512 -1.000000 +132513 -1.000000 +132514 -1.000000 +132516 -1.000000 +132517 -1.000000 +132518 -1.000000 +132519 -1.000000 +132520 -1.000000 +132521 -1.000000 +132522 -1.000000 +132527 -1.000000 +132528 -1.000000 +132530 -1.000000 +132532 -1.000000 +132533 -1.000000 +132534 -1.000000 +132535 -1.000000 +132536 -1.000000 +132537 -1.000000 +132538 -1.000000 +132542 -1.000000 +132543 -1.000000 +132544 -1.000000 +132545 -1.000000 +132546 -1.000000 +132547 -1.000000 +132548 -1.000000 +132549 -1.000000 +132550 -1.000000 +132551 -1.000000 +132552 -1.000000 +132553 -1.000000 +132554 -1.000000 +132557 -1.000000 +132558 -1.000000 +132575 -1.000000 +132580 -1.000000 +132590 -1.000000 +132592 -1.000000 +132593 -1.000000 +132594 -1.000000 +132595 -1.000000 +132596 -1.000000 +132597 -1.000000 +132598 -1.000000 +132599 -1.000000 +132600 -1.000000 +132601 -1.000000 +132602 -1.000000 +132603 -1.000000 +132604 -1.000000 +132605 -1.000000 +132606 -1.000000 +132607 -1.000000 +132609 -1.000000 +132610 -1.000000 +132611 -1.000000 +132612 -1.000000 +132613 -1.000000 +132614 -1.000000 +132615 -1.000000 +132625 -1.000000 +132626 -1.000000 +132633 -1.000000 +132634 -1.000000 +132645 -1.000000 +132646 -1.000000 +132647 -1.000000 +132650 -1.000000 +132651 -1.000000 +132652 -1.000000 +132653 -1.000000 +132654 -1.000000 +132655 -1.000000 +132658 -1.000000 +132659 -1.000000 +132669 -1.000000 +132672 -1.000000 +132673 -1.000000 +132674 -1.000000 +132676 -1.000000 +132678 -1.000000 +132679 -1.000000 +132681 -1.000000 +132683 -1.000000 +132684 -1.000000 +132685 -1.000000 +132686 -1.000000 +132687 -1.000000 +132688 -1.000000 +132689 -1.000000 +132690 -1.000000 +132691 -1.000000 +132692 -1.000000 +132693 -1.000000 +132695 -1.000000 +132696 -1.000000 +132697 -1.000000 +132699 -1.000000 +132700 -1.000000 +132701 -1.000000 +132702 -1.000000 +132703 -1.000000 +132704 -1.000000 +132705 -1.000000 +132707 -1.000000 +132708 -1.000000 +132709 -1.000000 +132710 -1.000000 +132711 -1.000000 +132712 -1.000000 +132713 -1.000000 +132714 -1.000000 +132715 -1.000000 +132716 -1.000000 +132717 -1.000000 +132718 -1.000000 +132719 -1.000000 +132722 -1.000000 +132737 -1.000000 +132738 -1.000000 +132740 -1.000000 +132746 -1.000000 +132747 -1.000000 +132748 -1.000000 +132752 -1.000000 +132753 -1.000000 +132754 -1.000000 +132756 -1.000000 +132758 -1.000000 +132760 -1.000000 +132761 -1.000000 +132763 -1.000000 +132764 -1.000000 +132765 -1.000000 +132766 -1.000000 +132779 -1.000000 +132782 -1.000000 +132783 -1.000000 +132784 -1.000000 +132785 -1.000000 +132786 -1.000000 +132789 -1.000000 +132791 -1.000000 +132794 -1.000000 +132796 -1.000000 +132797 -1.000000 +132798 -1.000000 +132799 -1.000000 +132800 -1.000000 +132801 -1.000000 +132802 -1.000000 +132803 -1.000000 +132804 -1.000000 +132805 -1.000000 +132816 -1.000000 +132848 -1.000000 +132850 -1.000000 +132851 -1.000000 +132873 -1.000000 +132881 -1.000000 +132884 -1.000000 +132886 -1.000000 +132887 -1.000000 +132889 -1.000000 +132904 -1.000000 +132907 -1.000000 +132908 -1.000000 +132910 -1.000000 +132917 -1.000000 +132926 -1.000000 +132927 -1.000000 +132932 -1.000000 +132933 -1.000000 +132934 -1.000000 +132935 -1.000000 +132936 -1.000000 +132937 -1.000000 +132938 -1.000000 +132939 -1.000000 +132940 -1.000000 +132941 -1.000000 +132942 -1.000000 +132943 -1.000000 +132944 -1.000000 +132945 -1.000000 +132946 -1.000000 +132947 -1.000000 +132948 -1.000000 +132949 -1.000000 +132950 -1.000000 +132951 -1.000000 +132952 -1.000000 +132953 -1.000000 +132954 -1.000000 +132955 -1.000000 +132956 -1.000000 +132957 -1.000000 +132958 -1.000000 +132960 -1.000000 +132961 -1.000000 +132966 -1.000000 +132967 -1.000000 +132968 -1.000000 +132969 -1.000000 +132970 -1.000000 +132971 -1.000000 +132972 -1.000000 +132973 -1.000000 +132974 -1.000000 +132976 -1.000000 +132977 -1.000000 +132978 -1.000000 +132979 -1.000000 +132980 -1.000000 +132981 -1.000000 +132982 -1.000000 +132983 -1.000000 +132984 -1.000000 +132985 -1.000000 +132986 -1.000000 +132987 -1.000000 +132988 -1.000000 +132989 -1.000000 +132990 -1.000000 +132991 -1.000000 +132992 -1.000000 +132993 -1.000000 +132994 -1.000000 +132995 -1.000000 +132998 -1.000000 +133016 -1.000000 +133029 -1.000000 +133033 -1.000000 +133034 -1.000000 +133039 -1.000000 +133047 -1.000000 +133051 -1.000000 +133052 -1.000000 +133055 -1.000000 +133063 -1.000000 +133074 -1.000000 +133075 -1.000000 +133076 -1.000000 +133078 -1.000000 +133079 -1.000000 +133080 -1.000000 +133081 -1.000000 +133082 -1.000000 +133083 -1.000000 +133086 -1.000000 +133088 -1.000000 +133089 -1.000000 +133090 -1.000000 +133091 -1.000000 +133092 -1.000000 +133093 -1.000000 +133094 -1.000000 +133095 -1.000000 +133096 -1.000000 +133097 -1.000000 +133098 -1.000000 +133100 -1.000000 +133101 -1.000000 +133102 -1.000000 +133103 -1.000000 +133110 -1.000000 +133118 -1.000000 +133119 -1.000000 +133120 -1.000000 +133121 -1.000000 +133125 -1.000000 +133126 -1.000000 +133127 -1.000000 +133135 -1.000000 +133136 -1.000000 +133145 -1.000000 +133146 -1.000000 +133149 -1.000000 +133162 -1.000000 +133165 -1.000000 +133167 -1.000000 +133168 -1.000000 +133169 -1.000000 +133170 -1.000000 +133171 -1.000000 +133172 -1.000000 +133173 -1.000000 +133174 -1.000000 +133175 -1.000000 +133176 -1.000000 +133178 -1.000000 +133180 -1.000000 +133181 -1.000000 +133182 -1.000000 +133183 -1.000000 +133184 -1.000000 +133185 -1.000000 +133186 -1.000000 +133187 -1.000000 +133188 -1.000000 +133189 -1.000000 +133190 -1.000000 +133191 -1.000000 +133192 -1.000000 +133193 -1.000000 +133194 -1.000000 +133197 -1.000000 +133198 -1.000000 +133201 -1.000000 +133202 -1.000000 +133203 -1.000000 +133204 -1.000000 +133206 -1.000000 +133207 -1.000000 +133208 -1.000000 +133210 -1.000000 +133211 -1.000000 +133212 -1.000000 +133213 -1.000000 +133214 -1.000000 +133215 -1.000000 +133216 -1.000000 +133217 -1.000000 +133218 -1.000000 +133219 -1.000000 +133220 -1.000000 +133221 -1.000000 +133222 -1.000000 +133223 -1.000000 +133225 -1.000000 +133227 -1.000000 +133229 -1.000000 +133230 -1.000000 +133236 -1.000000 +133241 -1.000000 +133245 -1.000000 +133247 -1.000000 +133250 -1.000000 +133251 -1.000000 +133252 -1.000000 +133253 -1.000000 +133256 -1.000000 +133257 -1.000000 +133258 -1.000000 +133270 -1.000000 +133271 -1.000000 +133272 -1.000000 +133273 -1.000000 +133277 -1.000000 +133278 -1.000000 +133279 -1.000000 +133280 -1.000000 +133281 -1.000000 +133282 -1.000000 +133283 -1.000000 +133284 -1.000000 +133285 -1.000000 +133286 -1.000000 +133287 -1.000000 +133288 -1.000000 +133289 -1.000000 +133290 -1.000000 +133291 -1.000000 +133296 -1.000000 +133302 -1.000000 +133305 -1.000000 +133306 -1.000000 +133307 -1.000000 +133310 -1.000000 +133311 -1.000000 +133312 -1.000000 +133314 -1.000000 +133315 -1.000000 +133316 -1.000000 +133317 -1.000000 +133318 -1.000000 +133319 -1.000000 +133320 -1.000000 +133321 -1.000000 +133326 -1.000000 +133327 -1.000000 +133328 -1.000000 +133329 -1.000000 +133332 -1.000000 +133334 -1.000000 +133335 -1.000000 +133336 -1.000000 +133338 -1.000000 +133339 -1.000000 +133340 -1.000000 +133341 -1.000000 +133342 -1.000000 +133343 -1.000000 +133344 -1.000000 +133345 -1.000000 +133351 -1.000000 +133352 -1.000000 +133353 -1.000000 +133354 -1.000000 +133355 -1.000000 +133357 -1.000000 +133358 -1.000000 +133359 -1.000000 +133360 -1.000000 +133361 -1.000000 +133362 -1.000000 +133363 -1.000000 +133365 -1.000000 +133366 -1.000000 +133367 -1.000000 +133369 -1.000000 +133374 -1.000000 +133380 -1.000000 +133381 -1.000000 +133382 -1.000000 +133385 -1.000000 +133395 -1.000000 +133396 -1.000000 +133399 -1.000000 +133416 -1.000000 +133417 -1.000000 +133418 -1.000000 +133419 -1.000000 +133421 -1.000000 +133422 -1.000000 +133423 -1.000000 +133424 -1.000000 +133425 -1.000000 +133426 -1.000000 +133427 -1.000000 +133429 -1.000000 +133430 -1.000000 +133440 -1.000000 +133443 -1.000000 +133452 -1.000000 +133454 -1.000000 +133466 -1.000000 +133470 -1.000000 +133476 -1.000000 +133480 -1.000000 +133481 -1.000000 +133482 -1.000000 +133483 -1.000000 +133487 -1.000000 +133489 -1.000000 +133490 -1.000000 +133491 -1.000000 +133498 -1.000000 +133499 -1.000000 +133501 -1.000000 +133502 -1.000000 +133503 -1.000000 +133504 -1.000000 +133505 -1.000000 +133506 -1.000000 +133507 -1.000000 +133508 -1.000000 +133520 -1.000000 +133527 -1.000000 +133528 -1.000000 +133529 -1.000000 +133530 -1.000000 +133531 -1.000000 +133532 -1.000000 +133533 -1.000000 +133534 -1.000000 +133536 -1.000000 +133537 -1.000000 +133538 -1.000000 +133541 -1.000000 +133542 -1.000000 +133543 -1.000000 +133544 -1.000000 +133545 -1.000000 +133547 -1.000000 +133548 -1.000000 +133549 -1.000000 +133550 -1.000000 +133552 -1.000000 +133554 -1.000000 +133556 -1.000000 +133558 -1.000000 +133561 -1.000000 +133563 -1.000000 +133566 -1.000000 +133567 -1.000000 +133568 -1.000000 +133569 -1.000000 +133570 -1.000000 +133571 -1.000000 +133572 -1.000000 +133585 -1.000000 +133588 -1.000000 +133590 -1.000000 +133591 -1.000000 +133592 -1.000000 +133596 -1.000000 +133597 -1.000000 +133598 -1.000000 +133599 -1.000000 +133600 -1.000000 +133601 -1.000000 +133602 -1.000000 +133603 -1.000000 +133604 -1.000000 +133606 -1.000000 +133607 -1.000000 +133608 -1.000000 +133609 -1.000000 +133610 -1.000000 +133612 -1.000000 +133613 -1.000000 +133614 -1.000000 +133615 -1.000000 +133617 -1.000000 +133618 -1.000000 +133619 -1.000000 +133620 -1.000000 +133621 -1.000000 +133622 -1.000000 +133623 -1.000000 +133624 -1.000000 +133625 -1.000000 +133626 -1.000000 +133640 -1.000000 +133643 -1.000000 +133646 -1.000000 +133656 -1.000000 +133660 -1.000000 +133664 -1.000000 +133665 -1.000000 +133666 -1.000000 +133667 -1.000000 +133668 -1.000000 +133669 -1.000000 +133670 -1.000000 +133671 -1.000000 +133672 -1.000000 +133673 -1.000000 +133674 -1.000000 +133675 -1.000000 +133676 -1.000000 +133677 -1.000000 +133678 -1.000000 +133679 -1.000000 +133680 -1.000000 +133681 -1.000000 +133682 -1.000000 +133683 -1.000000 +133684 -1.000000 +133685 -1.000000 +133686 -1.000000 +133687 -1.000000 +133688 -1.000000 +133689 -1.000000 +133690 -1.000000 +133691 -1.000000 +133692 -1.000000 +133693 -1.000000 +133694 -1.000000 +133695 -1.000000 +133696 -1.000000 +133699 -1.000000 +133700 -1.000000 +133701 -1.000000 +133702 -1.000000 +133705 -1.000000 +133706 -1.000000 +133707 -1.000000 +133710 -1.000000 +133714 -1.000000 +133721 -1.000000 +133722 -1.000000 +133723 -1.000000 +133724 -1.000000 +133725 -1.000000 +133726 -1.000000 +133727 -1.000000 +133728 -1.000000 +133729 -1.000000 +133730 -1.000000 +133731 -1.000000 +133733 -1.000000 +133735 -1.000000 +133737 -1.000000 +133738 -1.000000 +133740 -1.000000 +133741 -1.000000 +133742 -1.000000 +133747 -1.000000 +133748 -1.000000 +133749 -1.000000 +133750 -1.000000 +133751 -1.000000 +133752 -1.000000 +133753 -1.000000 +133754 -1.000000 +133755 -1.000000 +133757 -1.000000 +133764 -1.000000 +133765 -1.000000 +133766 -1.000000 +133767 -1.000000 +133769 -1.000000 +133770 -1.000000 +133771 -1.000000 +133772 -1.000000 +133773 -1.000000 +133774 -1.000000 +133775 -1.000000 +133776 -1.000000 +133778 -1.000000 +133779 -1.000000 +133781 -1.000000 +133785 -1.000000 +133786 -1.000000 +133790 -1.000000 +133793 -1.000000 +133796 -1.000000 +133797 -1.000000 +133798 -1.000000 +133799 -1.000000 +133800 -1.000000 +133801 -1.000000 +133802 -1.000000 +133803 -1.000000 +133804 -1.000000 +133805 -1.000000 +133806 -1.000000 +133807 -1.000000 +133808 -1.000000 +133809 -1.000000 +133810 -1.000000 +133811 -1.000000 +133813 -1.000000 +133816 -1.000000 +133822 -1.000000 +133829 -1.000000 +133830 -1.000000 +133832 -1.000000 +133833 -1.000000 +133834 -1.000000 +133836 -1.000000 +133838 -1.000000 +133839 -1.000000 +133840 -1.000000 +133841 -1.000000 +133843 -1.000000 +133844 -1.000000 +133845 -1.000000 +133846 -1.000000 +133847 -1.000000 +133848 -1.000000 +133849 -1.000000 +133850 -1.000000 +133852 -1.000000 +133858 -1.000000 +133861 -1.000000 +133862 -1.000000 +133863 -1.000000 +133866 -1.000000 +133868 -1.000000 +133870 -1.000000 +133871 -1.000000 +133872 -1.000000 +133873 -1.000000 +133874 -1.000000 +133875 -1.000000 +133877 -1.000000 +133879 -1.000000 +133880 -1.000000 +133881 -1.000000 +133882 -1.000000 +133883 -1.000000 +133884 -1.000000 +133888 -1.000000 +133889 -1.000000 +133891 -1.000000 +133892 -1.000000 +133894 -1.000000 +133895 -1.000000 +133896 -1.000000 +133897 -1.000000 +133898 -1.000000 +133900 -1.000000 +133901 -1.000000 +133903 -1.000000 +133904 -1.000000 +133905 -1.000000 +133907 -1.000000 +133908 -1.000000 +133910 -1.000000 +133923 -1.000000 +133924 -1.000000 +133926 -1.000000 +133931 -1.000000 +133932 -1.000000 +133933 -1.000000 +133934 -1.000000 +133935 -1.000000 +133936 -1.000000 +133937 -1.000000 +133939 -1.000000 +133940 -1.000000 +133942 -1.000000 +133943 -1.000000 +133944 -1.000000 +133948 -1.000000 +133949 -1.000000 +133950 -1.000000 +133953 -1.000000 +133954 -1.000000 +133956 -1.000000 +133957 -1.000000 +133958 -1.000000 +133960 -1.000000 +133961 -1.000000 +133962 -1.000000 +133963 -1.000000 +133964 -1.000000 +133965 -1.000000 +133966 -1.000000 +133967 -1.000000 +133968 -1.000000 +133969 -1.000000 +133970 -1.000000 +133971 -1.000000 +133972 -1.000000 +133973 -1.000000 +133980 -1.000000 +133981 -1.000000 +133982 -1.000000 +133985 -1.000000 +133987 -1.000000 +133988 -1.000000 +133990 -1.000000 +133992 -1.000000 +133996 -1.000000 +134000 -1.000000 +134002 -1.000000 +134003 -1.000000 +134004 -1.000000 +134005 -1.000000 +134007 -1.000000 +134008 -1.000000 +134009 -1.000000 +134011 -1.000000 +134012 -1.000000 +134013 -1.000000 +134015 -1.000000 +134016 -1.000000 +134018 -1.000000 +134019 -1.000000 +134020 -1.000000 +134021 -1.000000 +134024 -1.000000 +134025 -1.000000 +134026 -1.000000 +134027 -1.000000 +134028 -1.000000 +134029 -1.000000 +134030 -1.000000 +134043 -1.000000 +134045 -1.000000 +134046 -1.000000 +134047 -1.000000 +134048 -1.000000 +134049 -1.000000 +134050 -1.000000 +134051 -1.000000 +134052 -1.000000 +134053 -1.000000 +134055 -1.000000 +134057 -1.000000 +134058 -1.000000 +134059 -1.000000 +134060 -1.000000 +134062 -1.000000 +134063 -1.000000 +134064 -1.000000 +134066 -1.000000 +134069 -1.000000 +134070 -1.000000 +134071 -1.000000 +134072 -1.000000 +134073 -1.000000 +134074 -1.000000 +134076 -1.000000 +134077 -1.000000 +134078 -1.000000 +134079 -1.000000 +134080 -1.000000 +134081 -1.000000 +134082 -1.000000 +134083 -1.000000 +134085 -1.000000 +134087 -1.000000 +134090 -1.000000 +134091 -1.000000 +134094 -1.000000 +134095 -1.000000 +134097 -1.000000 +134098 -1.000000 +134099 -1.000000 +134100 -1.000000 +134101 -1.000000 +134102 -1.000000 +134105 -1.000000 +134106 -1.000000 +134107 -1.000000 +134108 -1.000000 +134109 -1.000000 +134110 -1.000000 +134111 -1.000000 +134112 -1.000000 +134113 -1.000000 +134114 -1.000000 +134115 -1.000000 +134116 -1.000000 +134117 -1.000000 +134118 -1.000000 +134119 -1.000000 +134122 -1.000000 +134123 -1.000000 +134124 -1.000000 +134129 -1.000000 +134131 -1.000000 +134132 -1.000000 +134133 -1.000000 +134134 -1.000000 +134135 -1.000000 +134137 -1.000000 +134138 -1.000000 +134145 -1.000000 +134146 -1.000000 +134147 -1.000000 +134148 -1.000000 +134149 -1.000000 +134150 -1.000000 +134151 -1.000000 +134152 -1.000000 +134153 -1.000000 +134155 -1.000000 +134156 -1.000000 +134157 -1.000000 +134169 -1.000000 +134170 -1.000000 +134171 -1.000000 +134172 -1.000000 +134173 -1.000000 +134174 -1.000000 +134175 -1.000000 +134176 -1.000000 +134178 -1.000000 +134179 -1.000000 +134180 -1.000000 +134181 -1.000000 +134182 -1.000000 +134183 -1.000000 +134185 -1.000000 +134186 -1.000000 +134188 -1.000000 +134189 -1.000000 +134196 -1.000000 +134197 -1.000000 +134198 -1.000000 +134199 -1.000000 +134200 -1.000000 +134201 -1.000000 +134202 -1.000000 +134208 -1.000000 +134209 -1.000000 +134210 -1.000000 +134211 -1.000000 +134212 -1.000000 +134213 -1.000000 +134215 -1.000000 +134216 -1.000000 +134217 -1.000000 +134218 -1.000000 +134219 -1.000000 +134220 -1.000000 +134221 -1.000000 +134222 -1.000000 +134223 -1.000000 +134224 -1.000000 +134225 -1.000000 +134226 -1.000000 +134227 -1.000000 +134228 -1.000000 +134229 -1.000000 +134230 -1.000000 +134231 -1.000000 +134232 -1.000000 +134233 -1.000000 +134234 -1.000000 +134235 -1.000000 +134236 -1.000000 +134237 -1.000000 +134238 -1.000000 +134239 -1.000000 +134241 -1.000000 +134242 -1.000000 +134243 -1.000000 +134244 -1.000000 +134245 -1.000000 +134246 -1.000000 +134247 -1.000000 +134248 -1.000000 +134249 -1.000000 +134250 -1.000000 +134251 -1.000000 +134252 -1.000000 +134253 -1.000000 +134254 -1.000000 +134255 -1.000000 +134256 -1.000000 +134257 -1.000000 +134258 -1.000000 +134259 -1.000000 +134260 -1.000000 +134261 -1.000000 +134262 -1.000000 +134263 -1.000000 +134264 -1.000000 +134265 -1.000000 +134266 -1.000000 +134267 -1.000000 +134268 -1.000000 +134269 -1.000000 +134270 -1.000000 +134271 -1.000000 +134272 -1.000000 +134273 -1.000000 +134274 -1.000000 +134275 -1.000000 +134277 -1.000000 +134278 -1.000000 +134279 -1.000000 +134280 -1.000000 +134281 -1.000000 +134284 -1.000000 +134287 -1.000000 +134289 -1.000000 +134312 -1.000000 +134313 -1.000000 +134314 -1.000000 +134315 -1.000000 +134316 -1.000000 +134317 -1.000000 +134318 -1.000000 +134319 -1.000000 +134345 -1.000000 +134347 -1.000000 +134348 -1.000000 +134349 -1.000000 +134350 -1.000000 +134351 -1.000000 +134352 -1.000000 +134353 -1.000000 +134354 -1.000000 +134355 -1.000000 +134356 -1.000000 +134357 -1.000000 +134358 -1.000000 +134359 -1.000000 +134360 -1.000000 +134361 -1.000000 +134362 -1.000000 +134363 -1.000000 +134364 -1.000000 +134365 -1.000000 +134366 -1.000000 +134367 -1.000000 +134368 -1.000000 +134369 -1.000000 +134371 -1.000000 +134372 -1.000000 +134373 -1.000000 +134375 -1.000000 +134377 -1.000000 +134378 -1.000000 +134379 -1.000000 +134380 -1.000000 +134381 -1.000000 +134382 -1.000000 +134385 -1.000000 +134386 -1.000000 +134387 -1.000000 +134388 -1.000000 +134389 -1.000000 +134390 -1.000000 +134391 -1.000000 +134393 -1.000000 +134394 -1.000000 +134395 -1.000000 +134396 -1.000000 +134397 -1.000000 +134398 -1.000000 +134399 -1.000000 +134400 -1.000000 +134401 -1.000000 +134402 -1.000000 +134403 -1.000000 +134404 -1.000000 +134405 -1.000000 +134406 -1.000000 +134407 -1.000000 +134408 -1.000000 +134409 -1.000000 +134410 -1.000000 +134411 -1.000000 +134412 -1.000000 +134416 -1.000000 +134417 -1.000000 +134418 -1.000000 +134428 -1.000000 +134432 -1.000000 +134433 -1.000000 +134434 -1.000000 +134436 -1.000000 +134437 -1.000000 +134438 -1.000000 +134439 -1.000000 +134440 -1.000000 +134441 -1.000000 +134442 -1.000000 +134443 -1.000000 +134444 -1.000000 +134445 -1.000000 +134446 -1.000000 +134448 -1.000000 +134452 -1.000000 +134453 -1.000000 +134454 -1.000000 +134455 -1.000000 +134456 -1.000000 +134457 -1.000000 +134462 -1.000000 +134463 -1.000000 +134468 -1.000000 +134469 -1.000000 +134470 -1.000000 +134471 -1.000000 +134472 -1.000000 +134473 -1.000000 +134474 -1.000000 +134475 -1.000000 +134476 -1.000000 +134477 -1.000000 +134478 -1.000000 +134480 -1.000000 +134481 -1.000000 +134482 -1.000000 +134483 -1.000000 +134484 -1.000000 +134485 -1.000000 +134486 -1.000000 +134487 -1.000000 +134488 -1.000000 +134489 -1.000000 +134490 -1.000000 +134491 -1.000000 +134492 -1.000000 +134495 -1.000000 +134497 -1.000000 +134498 -1.000000 +134500 -1.000000 +134501 -1.000000 +134502 -1.000000 +134503 -1.000000 +134505 -1.000000 +134506 -1.000000 +134507 -1.000000 +134508 -1.000000 +134509 -1.000000 +134510 -1.000000 +134511 -1.000000 +134513 -1.000000 +134514 -1.000000 +134515 -1.000000 +134516 -1.000000 +134517 -1.000000 +134518 -1.000000 +134519 -1.000000 +134520 -1.000000 +134521 -1.000000 +134522 -1.000000 +134523 -1.000000 +134524 -1.000000 +134526 -1.000000 +134527 -1.000000 +134528 -1.000000 +134530 -1.000000 +134531 -1.000000 +134533 -1.000000 +134534 -1.000000 +134535 -1.000000 +134536 -1.000000 +134537 -1.000000 +134538 -1.000000 +134539 -1.000000 +134540 -1.000000 +134541 -1.000000 +134543 -1.000000 +134545 -1.000000 +134546 -1.000000 +134551 -1.000000 +134552 -1.000000 +134557 -1.000000 +134560 -1.000000 +134561 -1.000000 +134562 -1.000000 +134563 -1.000000 +134564 -1.000000 +134565 -1.000000 +134566 -1.000000 +134567 -1.000000 +134568 -1.000000 +134569 -1.000000 +134570 -1.000000 +134571 -1.000000 +134572 -1.000000 +134574 -1.000000 +134575 -1.000000 +134576 -1.000000 +134577 -1.000000 +134578 -1.000000 +134579 -1.000000 +134580 -1.000000 +134581 -1.000000 +134582 -1.000000 +134583 -1.000000 +134584 -1.000000 +134585 -1.000000 +134586 -1.000000 +134587 -1.000000 +134588 -1.000000 +134589 -1.000000 +134590 -1.000000 +134591 -1.000000 +134592 -1.000000 +134593 -1.000000 +134594 -1.000000 +134595 -1.000000 +134596 -1.000000 +134597 -1.000000 +134640 -1.000000 +134641 -1.000000 +134652 -1.000000 +135123 -1.000000 +135124 -1.000000 +135125 -1.000000 +135126 -1.000000 +135127 -1.000000 +135128 -1.000000 +135129 -1.000000 +135130 -1.000000 +135131 -1.000000 +135132 -1.000000 +135133 -1.000000 +135134 -1.000000 +135135 -1.000000 +135136 -1.000000 +135137 -1.000000 +135138 -1.000000 +135139 -1.000000 +135140 -1.000000 +135141 -1.000000 +135142 -1.000000 +135143 -1.000000 +135144 -1.000000 +135145 -1.000000 +135146 -1.000000 +135147 -1.000000 +135155 -1.000000 +135156 -1.000000 +135157 -1.000000 +135158 -1.000000 +135159 -1.000000 +135160 -1.000000 +135161 -1.000000 +135162 -1.000000 +135163 -1.000000 +135164 -1.000000 +135165 -1.000000 +135166 -1.000000 +135167 -1.000000 +135168 -1.000000 +135169 -1.000000 +135170 -1.000000 +135171 -1.000000 +135173 -1.000000 +135174 -1.000000 +135175 -1.000000 +135176 -1.000000 +135177 -1.000000 +135178 -1.000000 +135179 -1.000000 +135183 -1.000000 +135184 -1.000000 +135186 -1.000000 +135187 -1.000000 +135188 -1.000000 +135189 -1.000000 +135190 -1.000000 +135191 -1.000000 +135194 -1.000000 +135195 -1.000000 +135196 -1.000000 +135197 -1.000000 +135198 -1.000000 +135199 -1.000000 +135205 -1.000000 +135209 -1.000000 +135210 -1.000000 +135211 -1.000000 +135212 -1.000000 +135213 -1.000000 +135214 -1.000000 +135215 -1.000000 +135216 -1.000000 +135220 -1.000000 +135222 -1.000000 +135225 -1.000000 +135226 -1.000000 +135227 -1.000000 +135228 -1.000000 +135229 -1.000000 +135230 -1.000000 +135232 -1.000000 +135233 -1.000000 +135234 -1.000000 +135235 -1.000000 +135237 -1.000000 +135240 -1.000000 +135241 -1.000000 +135242 -1.000000 +135243 -1.000000 +135244 -1.000000 +135245 -1.000000 +135246 -1.000000 +135247 -1.000000 +135248 -1.000000 +135249 -1.000000 +135250 -1.000000 +135251 -1.000000 +135252 -1.000000 +135253 -1.000000 +135258 -1.000000 +135259 -1.000000 +135260 -1.000000 +135261 -1.000000 +135263 -1.000000 +135264 -1.000000 +135266 -1.000000 +135267 -1.000000 +135270 -1.000000 +135271 -1.000000 +135272 -1.000000 +135274 -1.000000 +135277 -1.000000 +135283 -1.000000 +135285 -1.000000 +135286 -1.000000 +135287 -1.000000 +135288 -1.000000 +135289 -1.000000 +135290 -1.000000 +135291 -1.000000 +135292 -1.000000 +135293 -1.000000 +135294 -1.000000 +135295 -1.000000 +135296 -1.000000 +135297 -1.000000 +135298 -1.000000 +135299 -1.000000 +135300 -1.000000 +135301 -1.000000 +135304 -1.000000 +135305 -1.000000 +135306 -1.000000 +135308 -1.000000 +135311 -1.000000 +135314 -1.000000 +135315 -1.000000 +135317 -1.000000 +135321 -1.000000 +135322 -1.000000 +135324 -1.000000 +135325 -1.000000 +135328 -1.000000 +135329 -1.000000 +135331 -1.000000 +135332 -1.000000 +135335 -1.000000 +135336 -1.000000 +135337 -1.000000 +135338 -1.000000 +135339 -1.000000 +135340 -1.000000 +135345 -1.000000 +135354 -1.000000 +135357 -1.000000 +135359 -1.000000 +135371 -1.000000 +135373 -1.000000 +135374 -1.000000 +135379 -1.000000 +135390 -1.000000 +135396 -1.000000 +135399 -1.000000 +135405 -1.000000 +135406 -1.000000 +135407 -1.000000 +135408 -1.000000 +135410 -1.000000 +135412 -1.000000 +135413 -1.000000 +135416 -1.000000 +135417 -1.000000 +135418 -1.000000 +135419 -1.000000 +135420 -1.000000 +135421 -1.000000 +135422 -1.000000 +135423 -1.000000 +135424 -1.000000 +135425 -1.000000 +135426 -1.000000 +135427 -1.000000 +135429 -1.000000 +135434 -1.000000 +135435 -1.000000 +135437 -1.000000 +135442 -1.000000 +135443 -1.000000 +135444 -1.000000 +135445 -1.000000 +135446 -1.000000 +135447 -1.000000 +135448 -1.000000 +135449 -1.000000 +135450 -1.000000 +135459 -1.000000 +135467 -1.000000 +135470 -1.000000 +135471 -1.000000 +135472 -1.000000 +135473 -1.000000 +135474 -1.000000 +135475 -1.000000 +135476 -1.000000 +135477 -1.000000 +135479 -1.000000 +135480 -1.000000 +135481 -1.000000 +135482 -1.000000 +135483 -1.000000 +135484 -1.000000 +135485 -1.000000 +135486 -1.000000 +135487 -1.000000 +135489 -1.000000 +135490 -1.000000 +135491 -1.000000 +135492 -1.000000 +135493 -1.000000 +135494 -1.000000 +135495 -1.000000 +135510 -1.000000 +135511 -1.000000 +135516 -1.000000 +135518 -1.000000 +135519 -1.000000 +135521 -1.000000 +135522 -1.000000 +135524 -1.000000 +135525 -1.000000 +135526 -1.000000 +135529 -1.000000 +135534 -1.000000 +135540 -1.000000 +135543 -1.000000 +135553 -1.000000 +135554 -1.000000 +135556 -1.000000 +135557 -1.000000 +135558 -1.000000 +135560 -1.000000 +135561 -1.000000 +135562 -1.000000 +135563 -1.000000 +135564 -1.000000 +135568 -1.000000 +135571 -1.000000 +135572 -1.000000 +135578 -1.000000 +135592 -1.000000 +135593 -1.000000 +135594 -1.000000 +135595 -1.000000 +135596 -1.000000 +135597 -1.000000 +135598 -1.000000 +135601 -1.000000 +135603 -1.000000 +135605 -1.000000 +135608 -1.000000 +135610 -1.000000 +135614 -1.000000 +135616 -1.000000 +135617 -1.000000 +135643 -1.000000 +135648 -1.000000 +135649 -1.000000 +135650 -1.000000 +135652 -1.000000 +135653 -1.000000 +135654 -1.000000 +135686 -1.000000 +135687 -1.000000 +135688 -1.000000 +135689 -1.000000 +135691 -1.000000 +135692 -1.000000 +135693 -1.000000 +135694 -1.000000 +135695 -1.000000 +135696 -1.000000 +135697 -1.000000 +135698 -1.000000 +135699 -1.000000 +135700 -1.000000 +135701 -1.000000 +135702 -1.000000 +135703 -1.000000 +135704 -1.000000 +135705 -1.000000 +135706 -1.000000 +135714 -1.000000 +135715 -1.000000 +135716 -1.000000 +135717 -1.000000 +135718 -1.000000 +135719 -1.000000 +135720 -1.000000 +135722 -1.000000 +135725 -1.000000 +135726 -1.000000 +135727 -1.000000 +135728 -1.000000 +135729 -1.000000 +135730 -1.000000 +135731 -1.000000 +135733 -1.000000 +135737 -1.000000 +135739 -1.000000 +135740 -1.000000 +135741 -1.000000 +135743 -1.000000 +135746 -1.000000 +135747 -1.000000 +135751 -1.000000 +135752 -1.000000 +135753 -1.000000 +135756 -1.000000 +135758 -1.000000 +135759 -1.000000 +135760 -1.000000 +135761 -1.000000 +135762 -1.000000 +135763 -1.000000 +135764 -1.000000 +135765 -1.000000 +135767 -1.000000 +135768 -1.000000 +135769 -1.000000 +135770 -1.000000 +135771 -1.000000 +135774 -1.000000 +135777 -1.000000 +135778 -1.000000 +135779 -1.000000 +135780 -1.000000 +135782 -1.000000 +135786 -1.000000 +135804 -1.000000 +135806 -1.000000 +135807 -1.000000 +135808 -1.000000 +135809 -1.000000 +135810 -1.000000 +135811 -1.000000 +135812 -1.000000 +135813 -1.000000 +135816 -1.000000 +135817 -1.000000 +135818 -1.000000 +135822 -1.000000 +135823 -1.000000 +135832 -1.000000 +135833 -1.000000 +135834 -1.000000 +135835 -1.000000 +135836 -1.000000 +135837 -1.000000 +135838 -1.000000 +135839 -1.000000 +135840 -1.000000 +135841 -1.000000 +135842 -1.000000 +135855 -1.000000 +135858 -1.000000 +135859 -1.000000 +135860 -1.000000 +135862 -1.000000 +135863 -1.000000 +135864 -1.000000 +135865 -1.000000 +135867 -1.000000 +135870 -1.000000 +135879 -1.000000 +135885 -1.000000 +135891 -1.000000 +135892 -1.000000 +135893 -1.000000 +135896 -1.000000 +135897 -1.000000 +135898 -1.000000 +135900 -1.000000 +135901 -1.000000 +135902 -1.000000 +135904 -1.000000 +135905 -1.000000 +135907 -1.000000 +135908 -1.000000 +135912 -1.000000 +135915 -1.000000 +135921 -1.000000 +135925 -1.000000 +135930 -1.000000 +135931 -1.000000 +135932 -1.000000 +135933 -1.000000 +135934 -1.000000 +135935 -1.000000 +135936 -1.000000 +135937 -1.000000 +135960 -1.000000 +135987 -1.000000 +135991 -1.000000 +135992 -1.000000 +135993 -1.000000 +135994 -1.000000 +135998 -1.000000 +136000 -1.000000 +136002 -1.000000 +136003 -1.000000 +136004 -1.000000 +136005 -1.000000 +136006 -1.000000 +136007 -1.000000 +136008 -1.000000 +136010 -1.000000 +136011 -1.000000 +136013 -1.000000 +136018 -1.000000 +136020 -1.000000 +136034 -1.000000 +136035 -1.000000 +136045 -1.000000 +136046 -1.000000 +136048 -1.000000 +136049 -1.000000 +136050 -1.000000 +136051 -1.000000 +136052 -1.000000 +136053 -1.000000 +136054 -1.000000 +136056 -1.000000 +136057 -1.000000 +136059 -1.000000 +136061 -1.000000 +136062 -1.000000 +136068 -1.000000 +136069 -1.000000 +136070 -1.000000 +136071 -1.000000 +136072 -1.000000 +136073 -1.000000 +136076 -1.000000 +136077 -1.000000 +136078 -1.000000 +136079 -1.000000 +136080 -1.000000 +136081 -1.000000 +136082 -1.000000 +136084 -1.000000 +136085 -1.000000 +136087 -1.000000 +136088 -1.000000 +136089 -1.000000 +136091 -1.000000 +136092 -1.000000 +136093 -1.000000 +136100 -1.000000 +136101 -1.000000 +136105 -1.000000 +136106 -1.000000 +136107 -1.000000 +136119 -1.000000 +136122 -1.000000 +136126 -1.000000 +136128 -1.000000 +136134 -1.000000 +136137 -1.000000 +136138 -1.000000 +136139 -1.000000 +136140 -1.000000 +136141 -1.000000 +136155 -1.000000 +136156 -1.000000 +136161 -1.000000 +136171 -1.000000 +136175 -1.000000 +136176 -1.000000 +136177 -1.000000 +136179 -1.000000 +136184 -1.000000 +136186 -1.000000 +136187 -1.000000 +136188 -1.000000 +136189 -1.000000 +136190 -1.000000 +136192 -1.000000 +136193 -1.000000 +136194 -1.000000 +136195 -1.000000 +136196 -1.000000 +136197 -1.000000 +136198 -1.000000 +136199 -1.000000 +136200 -1.000000 +136201 -1.000000 +136202 -1.000000 +136203 -1.000000 +136204 -1.000000 +136205 -1.000000 +136206 -1.000000 +136207 -1.000000 +136208 -1.000000 +136209 -1.000000 +136210 -1.000000 +136211 -1.000000 +136212 -1.000000 +136213 -1.000000 +136214 -1.000000 +136216 -1.000000 +136222 -1.000000 +136224 -1.000000 +136248 -1.000000 +136249 -1.000000 +136250 -1.000000 +136280 -1.000000 +136288 -1.000000 +136298 -1.000000 +136299 -1.000000 +136300 -1.000000 +136301 -1.000000 +136302 -1.000000 +136303 -1.000000 +136305 -1.000000 +136306 -1.000000 +136307 -1.000000 +136312 -1.000000 +136313 -1.000000 +136314 -1.000000 +136315 -1.000000 +136316 -1.000000 +136318 -1.000000 +136320 -1.000000 +136321 -1.000000 +136322 -1.000000 +136323 -1.000000 +136326 -1.000000 +136327 -1.000000 +136334 -1.000000 +136338 -1.000000 +136343 -1.000000 +136345 -1.000000 +136448 -1.000000 +136452 -1.000000 +136455 -1.000000 +136459 -1.000000 +136461 -1.000000 +136475 -1.000000 +136476 -1.000000 +136490 -1.000000 +136491 -1.000000 +136508 -1.000000 +136510 -1.000000 +136511 -1.000000 +136512 -1.000000 +136513 -1.000000 +136514 -1.000000 +136515 -1.000000 +136516 -1.000000 +136517 -1.000000 +136518 -1.000000 +136519 -1.000000 +136520 -1.000000 +136521 -1.000000 +136522 -1.000000 +136523 -1.000000 +136524 -1.000000 +136525 -1.000000 +136526 -1.000000 +136528 -1.000000 +136530 -1.000000 +136531 -1.000000 +136532 -1.000000 +136533 -1.000000 +136534 -1.000000 +136535 -1.000000 +136536 -1.000000 +136539 -1.000000 +136540 -1.000000 +136541 -1.000000 +136544 -1.000000 +136546 -1.000000 +136550 -1.000000 +136551 -1.000000 +136553 -1.000000 +136555 -1.000000 +136556 -1.000000 +136557 -1.000000 +136558 -1.000000 +136563 -1.000000 +136565 -1.000000 +136566 -1.000000 +136568 -1.000000 +136569 -1.000000 +136580 -1.000000 +136581 -1.000000 +136587 -1.000000 +136593 -1.000000 +136594 -1.000000 +136595 -1.000000 +136597 -1.000000 +136602 -1.000000 +136603 -1.000000 +136604 -1.000000 +136605 -1.000000 +136606 -1.000000 +136607 -1.000000 +136608 -1.000000 +136609 -1.000000 +136611 -1.000000 +136612 -1.000000 +136649 -1.000000 +136650 -1.000000 +136651 -1.000000 +136652 -1.000000 +136653 -1.000000 +136654 -1.000000 +136655 -1.000000 +136656 -1.000000 +136657 -1.000000 +136658 -1.000000 +136659 -1.000000 +136660 -1.000000 +136661 -1.000000 +136662 -1.000000 +136663 -1.000000 +136664 -1.000000 +136665 -1.000000 +136669 -1.000000 +136670 -1.000000 +136671 -1.000000 +136672 -1.000000 +136673 -1.000000 +136675 -1.000000 +136680 -1.000000 +136683 -1.000000 +136686 -1.000000 +136688 -1.000000 +136689 -1.000000 +136690 -1.000000 +136691 -1.000000 +136692 -1.000000 +136693 -1.000000 +136694 -1.000000 +136697 -1.000000 +136698 -1.000000 +136700 -1.000000 +136701 -1.000000 +136702 -1.000000 +136703 -1.000000 +136704 -1.000000 +136705 -1.000000 +136706 -1.000000 +136707 -1.000000 +136708 -1.000000 +136710 -1.000000 +136711 -1.000000 +136713 -1.000000 +136714 -1.000000 +136715 -1.000000 +136717 -1.000000 +136722 -1.000000 +136723 -1.000000 +136724 -1.000000 +136726 -1.000000 +136728 -1.000000 +136729 -1.000000 +136730 -1.000000 +136731 -1.000000 +136732 -1.000000 +136733 -1.000000 +136735 -1.000000 +136736 -1.000000 +136739 -1.000000 +136740 -1.000000 +136741 -1.000000 +136742 -1.000000 +136745 -1.000000 +136746 -1.000000 +136749 -1.000000 +136755 -1.000000 +136757 -1.000000 +136758 -1.000000 +136759 -1.000000 +136761 -1.000000 +136762 -1.000000 +136764 -1.000000 +136766 -1.000000 +136768 -1.000000 +136769 -1.000000 +136770 -1.000000 +136771 -1.000000 +136774 -1.000000 +136775 -1.000000 +136781 -1.000000 +136782 -1.000000 +136783 -1.000000 +136784 -1.000000 +136785 -1.000000 +136791 -1.000000 +136792 -1.000000 +136793 -1.000000 +136794 -1.000000 +136796 -1.000000 +136797 -1.000000 +136798 -1.000000 +136799 -1.000000 +136800 -1.000000 +136801 -1.000000 +136802 -1.000000 +136803 -1.000000 +136804 -1.000000 +136805 -1.000000 +136806 -1.000000 +136807 -1.000000 +136808 -1.000000 +136809 -1.000000 +136810 -1.000000 +136811 -1.000000 +136812 -1.000000 +136813 -1.000000 +136815 -1.000000 +136818 -1.000000 +136824 -1.000000 +136825 -1.000000 +136826 -1.000000 +136827 -1.000000 +136829 -1.000000 +136830 -1.000000 +136831 -1.000000 +136832 -1.000000 +136833 -1.000000 +136834 -1.000000 +136835 -1.000000 +136836 -1.000000 +136838 -1.000000 +136839 -1.000000 +136840 -1.000000 +136842 -1.000000 +136843 -1.000000 +136844 -1.000000 +136845 -1.000000 +136846 -1.000000 +136847 -1.000000 +136848 -1.000000 +136849 -1.000000 +136850 -1.000000 +136851 -1.000000 +136852 -1.000000 +136853 -1.000000 +136854 -1.000000 +136855 -1.000000 +136861 -1.000000 +136862 -1.000000 +136869 -1.000000 +136870 -1.000000 +136871 -1.000000 +136872 -1.000000 +136874 -1.000000 +136875 -1.000000 +136877 -1.000000 +136879 -1.000000 +136894 -1.000000 +136895 -1.000000 +136896 -1.000000 +136898 -1.000000 +136899 -1.000000 +136900 -1.000000 +136901 -1.000000 +136902 -1.000000 +136903 -1.000000 +136904 -1.000000 +136905 -1.000000 +136907 -1.000000 +136908 -1.000000 +136909 -1.000000 +136910 -1.000000 +136921 -1.000000 +136923 -1.000000 +136927 -1.000000 +136928 -1.000000 +136929 -1.000000 +136930 -1.000000 +136931 -1.000000 +136932 -1.000000 +136933 -1.000000 +136934 -1.000000 +136935 -1.000000 +136936 -1.000000 +136937 -1.000000 +136938 -1.000000 +136939 -1.000000 +136940 -1.000000 +136941 -1.000000 +136942 -1.000000 +136943 -1.000000 +136944 -1.000000 +136948 -1.000000 +136949 -1.000000 +136958 -1.000000 +136959 -1.000000 +136960 -1.000000 +136963 -1.000000 +136964 -1.000000 +136965 -1.000000 +136966 -1.000000 +136967 -1.000000 +136968 -1.000000 +136969 -1.000000 +136970 -1.000000 +136971 -1.000000 +136972 -1.000000 +136973 -1.000000 +136974 -1.000000 +136975 -1.000000 +136976 -1.000000 +136977 -1.000000 +136978 -1.000000 +136979 -1.000000 +136980 -1.000000 +136981 -1.000000 +136982 -1.000000 +136983 -1.000000 +136984 -1.000000 +136985 -1.000000 +136986 -1.000000 +136987 -1.000000 +136988 -1.000000 +136989 -1.000000 +136990 -1.000000 +136991 -1.000000 +136992 -1.000000 +136993 -1.000000 +136994 -1.000000 +136995 -1.000000 +136996 -1.000000 +136997 -1.000000 +137102 -1.000000 +137110 -1.000000 +137112 -1.000000 +137117 -1.000000 +137118 -1.000000 +137119 -1.000000 +137122 -1.000000 +137126 -1.000000 +137130 -1.000000 +137131 -1.000000 +137158 -1.000000 +137159 -1.000000 +137160 -1.000000 +137161 -1.000000 +137162 -1.000000 +137163 -1.000000 +137164 -1.000000 +137165 -1.000000 +137166 -1.000000 +137167 -1.000000 +137168 -1.000000 +137169 -1.000000 +137172 -1.000000 +137174 -1.000000 +137176 -1.000000 +137177 -1.000000 +137179 -1.000000 +137180 -1.000000 +137181 -1.000000 +137185 -1.000000 +137190 -1.000000 +137192 -1.000000 +137193 -1.000000 +137194 -1.000000 +137197 -1.000000 +137199 -1.000000 +137201 -1.000000 +137202 -1.000000 +137207 -1.000000 +137221 -1.000000 +137224 -1.000000 +137225 -1.000000 +137226 -1.000000 +137227 -1.000000 +137228 -1.000000 +137229 -1.000000 +137231 -1.000000 +137236 -1.000000 +137237 -1.000000 +137238 -1.000000 +137239 -1.000000 +137240 -1.000000 +137241 -1.000000 +137242 -1.000000 +137243 -1.000000 +137244 -1.000000 +137245 -1.000000 +137246 -1.000000 +137247 -1.000000 +137248 -1.000000 +137249 -1.000000 +137250 -1.000000 +137251 -1.000000 +137252 -1.000000 +137253 -1.000000 +137254 -1.000000 +137255 -1.000000 +137256 -1.000000 +137261 -1.000000 +137262 -1.000000 +137266 -1.000000 +137268 -1.000000 +137269 -1.000000 +137270 -1.000000 +137271 -1.000000 +137272 -1.000000 +137273 -1.000000 +137274 -1.000000 +137275 -1.000000 +137278 -1.000000 +137279 -1.000000 +137280 -1.000000 +137281 -1.000000 +137283 -1.000000 +137285 -1.000000 +137286 -1.000000 +137288 -1.000000 +137289 -1.000000 +137290 -1.000000 +137291 -1.000000 +137292 -1.000000 +137293 -1.000000 +137294 -1.000000 +137295 -1.000000 +137296 -1.000000 +137299 -1.000000 +137300 -1.000000 +137301 -1.000000 +137303 -1.000000 +137304 -1.000000 +137306 -1.000000 +137307 -1.000000 +137308 -1.000000 +137309 -1.000000 +137310 -1.000000 +137311 -1.000000 +137312 -1.000000 +137313 -1.000000 +137314 -1.000000 +137315 -1.000000 +137316 -1.000000 +137317 -1.000000 +137318 -1.000000 +137319 -1.000000 +137320 -1.000000 +137321 -1.000000 +137322 -1.000000 +137323 -1.000000 +137324 -1.000000 +137325 -1.000000 +137326 -1.000000 +137327 -1.000000 +137328 -1.000000 +137329 -1.000000 +137330 -1.000000 +137331 -1.000000 +137332 -1.000000 +137335 -1.000000 +137336 -1.000000 +137337 -1.000000 +137338 -1.000000 +137339 -1.000000 +137340 -1.000000 +137341 -1.000000 +137342 -1.000000 +137343 -1.000000 +137344 -1.000000 +137345 -1.000000 +137346 -1.000000 +137347 -1.000000 +137348 -1.000000 +137349 -1.000000 +137350 -1.000000 +137351 -1.000000 +137352 -1.000000 +137353 -1.000000 +137354 -1.000000 +137355 -1.000000 +137356 -1.000000 +137357 -1.000000 +137358 -1.000000 +137359 -1.000000 +137360 -1.000000 +137361 -1.000000 +137362 -1.000000 +137364 -1.000000 +137365 -1.000000 +137366 -1.000000 +137377 -1.000000 +137378 -1.000000 +137380 -1.000000 +137381 -1.000000 +137382 -1.000000 +137383 -1.000000 +137384 -1.000000 +137385 -1.000000 +137386 -1.000000 +137387 -1.000000 +137388 -1.000000 +137389 -1.000000 +137390 -1.000000 +137392 -1.000000 +137393 -1.000000 +137394 -1.000000 +137395 -1.000000 +137396 -1.000000 +137397 -1.000000 +137398 -1.000000 +137400 -1.000000 +137401 -1.000000 +137402 -1.000000 +137408 -1.000000 +137409 -1.000000 +137410 -1.000000 +137411 -1.000000 +137412 -1.000000 +137413 -1.000000 +137414 -1.000000 +137415 -1.000000 +137416 -1.000000 +137417 -1.000000 +137418 -1.000000 +137419 -1.000000 +137420 -1.000000 +137421 -1.000000 +137422 -1.000000 +137423 -1.000000 +137424 -1.000000 +137425 -1.000000 +137426 -1.000000 +137427 -1.000000 +137428 -1.000000 +137429 -1.000000 +137430 -1.000000 +137431 -1.000000 +137434 -1.000000 +137435 -1.000000 +137436 -1.000000 +137437 -1.000000 +137443 -1.000000 +137444 -1.000000 +137445 -1.000000 +137446 -1.000000 +137447 -1.000000 +137450 -1.000000 +137451 -1.000000 +137452 -1.000000 +137453 -1.000000 +137454 -1.000000 +137455 -1.000000 +137456 -1.000000 +137457 -1.000000 +137458 -1.000000 +137459 -1.000000 +137460 -1.000000 +137461 -1.000000 +137462 -1.000000 +137463 -1.000000 +137464 -1.000000 +137465 -1.000000 +137466 -1.000000 +137467 -1.000000 +137468 -1.000000 +137469 -1.000000 +137470 -1.000000 +137471 -1.000000 +137472 -1.000000 +137473 -1.000000 +137477 -1.000000 +137478 -1.000000 +137480 -1.000000 +137481 -1.000000 +137482 -1.000000 +137483 -1.000000 +137484 -1.000000 +137485 -1.000000 +137486 -1.000000 +137487 -1.000000 +137488 -1.000000 +137489 -1.000000 +137490 -1.000000 +137491 -1.000000 +137492 -1.000000 +137493 -1.000000 +137494 -1.000000 +137495 -1.000000 +137496 -1.000000 +137497 -1.000000 +137498 -1.000000 +137499 -1.000000 +137500 -1.000000 +137501 -1.000000 +137502 -1.000000 +137503 -1.000000 +137504 -1.000000 +137505 -1.000000 +137506 -1.000000 +137509 -1.000000 +137510 -1.000000 +137515 -1.000000 +137516 -1.000000 +137518 -1.000000 +137519 -1.000000 +137520 -1.000000 +137521 -1.000000 +137522 -1.000000 +137524 -1.000000 +137529 -1.000000 +137530 -1.000000 +137531 -1.000000 +137532 -1.000000 +137533 -1.000000 +137534 -1.000000 +137535 -1.000000 +137536 -1.000000 +137537 -1.000000 +137538 -1.000000 +137539 -1.000000 +137541 -1.000000 +137542 -1.000000 +137543 -1.000000 +137544 -1.000000 +137545 -1.000000 +137546 -1.000000 +137547 -1.000000 +137548 -1.000000 +137549 -1.000000 +137556 -1.000000 +137557 -1.000000 +137558 -1.000000 +137559 -1.000000 +137560 -1.000000 +137561 -1.000000 +137562 -1.000000 +137563 -1.000000 +137564 -1.000000 +137565 -1.000000 +137566 -1.000000 +137567 -1.000000 +137568 -1.000000 +137570 -1.000000 +137571 -1.000000 +137572 -1.000000 +137573 -1.000000 +137574 -1.000000 +137575 -1.000000 +137576 -1.000000 +137577 -1.000000 +137578 -1.000000 +137579 -1.000000 +137581 -1.000000 +137583 -1.000000 +137587 -1.000000 +137588 -1.000000 +137596 -1.000000 +137597 -1.000000 +137598 -1.000000 +137599 -1.000000 +137706 -1.000000 +137708 -1.000000 +137709 -1.000000 +137710 -1.000000 +137711 -1.000000 +137712 -1.000000 +137713 -1.000000 +137714 -1.000000 +137715 -1.000000 +137716 -1.000000 +137717 -1.000000 +137718 -1.000000 +137719 -1.000000 +137720 -1.000000 +137721 -1.000000 +137722 -1.000000 +137723 -1.000000 +137863 -1.000000 +137864 -1.000000 +137867 -1.000000 +137868 -1.000000 +137878 -1.000000 +137880 -1.000000 +137881 -1.000000 +137889 -1.000000 +137890 -1.000000 +137891 -1.000000 +137892 -1.000000 +137895 -1.000000 +137896 -1.000000 +137897 -1.000000 +137899 -1.000000 +137902 -1.000000 +137903 -1.000000 +137904 -1.000000 +137905 -1.000000 +137906 -1.000000 +137907 -1.000000 +137908 -1.000000 +137909 -1.000000 +137910 -1.000000 +137911 -1.000000 +137915 -1.000000 +137916 -1.000000 +137917 -1.000000 +137918 -1.000000 +137931 -1.000000 +137932 -1.000000 +137933 -1.000000 +137934 -1.000000 +137935 -1.000000 +137936 -1.000000 +137937 -1.000000 +137938 -1.000000 +137939 -1.000000 +137940 -1.000000 +137941 -1.000000 +137942 -1.000000 +137943 -1.000000 +137945 -1.000000 +137950 -1.000000 +137951 -1.000000 +137953 -1.000000 +137954 -1.000000 +137955 -1.000000 +137956 -1.000000 +137957 -1.000000 +137959 -1.000000 +137961 -1.000000 +137963 -1.000000 +137965 -1.000000 +137973 -1.000000 +137976 -1.000000 +137997 -1.000000 +137998 -1.000000 +138011 -1.000000 +138016 -1.000000 +138018 -1.000000 +138020 -1.000000 +138022 -1.000000 +138023 -1.000000 +138025 -1.000000 +138026 -1.000000 +138030 -1.000000 +138031 -1.000000 +138034 -1.000000 +138035 -1.000000 +138036 -1.000000 +138037 -1.000000 +138038 -1.000000 +138039 -1.000000 +138040 -1.000000 +138041 -1.000000 +138042 -1.000000 +138043 -1.000000 +138044 -1.000000 +138045 -1.000000 +138046 -1.000000 +138047 -1.000000 +138049 -1.000000 +138050 -1.000000 +138051 -1.000000 +138052 -1.000000 +138053 -1.000000 +138054 -1.000000 +138105 -1.000000 +138130 -1.000000 +138131 -1.000000 +138132 -1.000000 +138133 -1.000000 +138135 -1.000000 +138136 -1.000000 +138137 -1.000000 +138138 -1.000000 +138140 -1.000000 +138141 -1.000000 +138142 -1.000000 +138143 -1.000000 +138144 -1.000000 +138147 -1.000000 +138151 -1.000000 +138152 -1.000000 +138153 -1.000000 +138154 -1.000000 +138162 -1.000000 +138185 -1.000000 +138186 -1.000000 +138187 -1.000000 +138188 -1.000000 +138192 -1.000000 +138193 -1.000000 +138194 -1.000000 +138199 -1.000000 +138200 -1.000000 +138201 -1.000000 +138203 -1.000000 +138211 -1.000000 +138216 -1.000000 +138219 -1.000000 +138220 -1.000000 +138221 -1.000000 +138222 -1.000000 +138223 -1.000000 +138225 -1.000000 +138226 -1.000000 +138227 -1.000000 +138228 -1.000000 +138229 -1.000000 +138230 -1.000000 +138234 -1.000000 +138235 -1.000000 +138236 -1.000000 +138237 -1.000000 +138239 -1.000000 +138240 -1.000000 +138241 -1.000000 +138242 -1.000000 +138243 -1.000000 +138244 -1.000000 +138247 -1.000000 +138257 -1.000000 +138258 -1.000000 +138303 -1.000000 +138305 -1.000000 +138307 -1.000000 +138308 -1.000000 +138309 -1.000000 +138310 -1.000000 +138311 -1.000000 +138312 -1.000000 +138313 -1.000000 +138314 -1.000000 +138315 -1.000000 +138317 -1.000000 +138318 -1.000000 +138319 -1.000000 +138320 -1.000000 +138321 -1.000000 +138322 -1.000000 +138323 -1.000000 +138324 -1.000000 +138325 -1.000000 +138326 -1.000000 +138327 -1.000000 +138328 -1.000000 +138329 -1.000000 +138330 -1.000000 +138334 -1.000000 +138335 -1.000000 +138336 -1.000000 +138337 -1.000000 +138338 -1.000000 +138340 -1.000000 +138341 -1.000000 +138342 -1.000000 +138343 -1.000000 +138344 -1.000000 +138345 -1.000000 +138358 -1.000000 +138359 -1.000000 +138360 -1.000000 +138362 -1.000000 +138363 -1.000000 +138364 -1.000000 +138372 -1.000000 +138374 -1.000000 +138380 -1.000000 +138381 -1.000000 +138382 -1.000000 +138383 -1.000000 +138384 -1.000000 +138385 -1.000000 +138386 -1.000000 +138387 -1.000000 +138389 -1.000000 +138390 -1.000000 +138391 -1.000000 +138392 -1.000000 +138394 -1.000000 +138397 -1.000000 +138400 -1.000000 +138402 -1.000000 +138403 -1.000000 +138404 -1.000000 +138405 -1.000000 +138406 -1.000000 +138407 -1.000000 +138408 -1.000000 +138409 -1.000000 +138411 -1.000000 +138429 -1.000000 +138431 -1.000000 +138432 -1.000000 +138434 -1.000000 +138459 -1.000000 +138460 -1.000000 +138464 -1.000000 +138475 -1.000000 +138476 -1.000000 +138477 -1.000000 +138480 -1.000000 +138481 -1.000000 +138482 -1.000000 +138484 -1.000000 +138485 -1.000000 +138487 -1.000000 +138488 -1.000000 +138489 -1.000000 +138490 -1.000000 +138498 -1.000000 +138499 -1.000000 +138500 -1.000000 +138502 -1.000000 +138504 -1.000000 +138507 -1.000000 +138512 -1.000000 +138513 -1.000000 +138515 -1.000000 +138516 -1.000000 +138529 -1.000000 +138531 -1.000000 +138532 -1.000000 +138533 -1.000000 +138535 -1.000000 +138536 -1.000000 +138538 -1.000000 +138539 -1.000000 +138542 -1.000000 +138543 -1.000000 +138548 -1.000000 +138551 -1.000000 +138563 -1.000000 +138565 -1.000000 +138567 -1.000000 +138569 -1.000000 +138570 -1.000000 +138572 -1.000000 +138573 -1.000000 +138575 -1.000000 +138578 -1.000000 +138579 -1.000000 +138580 -1.000000 +138581 -1.000000 +138582 -1.000000 +138583 -1.000000 +138584 -1.000000 +138585 -1.000000 +138587 -1.000000 +138588 -1.000000 +138589 -1.000000 +138590 -1.000000 +138592 -1.000000 +138596 -1.000000 +138601 -1.000000 +138606 -1.000000 +138609 -1.000000 +138611 -1.000000 +138613 -1.000000 +138614 -1.000000 +138615 -1.000000 +138616 -1.000000 +138618 -1.000000 +138620 -1.000000 +138621 -1.000000 +138622 -1.000000 +138623 -1.000000 +138624 -1.000000 +138627 -1.000000 +138628 -1.000000 +138629 -1.000000 +138630 -1.000000 +138631 -1.000000 +138632 -1.000000 +138633 -1.000000 +138634 -1.000000 +138635 -1.000000 +138636 -1.000000 +138637 -1.000000 +138638 -1.000000 +138639 -1.000000 +138641 -1.000000 +138642 -1.000000 +138645 -1.000000 +138648 -1.000000 +138651 -1.000000 +138658 -1.000000 +138661 -1.000000 +138662 -1.000000 +138663 -1.000000 +138664 -1.000000 +138665 -1.000000 +138673 -1.000000 +138675 -1.000000 +138676 -1.000000 +138677 -1.000000 +138678 -1.000000 +138681 -1.000000 +138682 -1.000000 +138688 -1.000000 +138689 -1.000000 +138690 -1.000000 +138693 -1.000000 +138694 -1.000000 +138698 -1.000000 +138699 -1.000000 +138703 -1.000000 +138705 -1.000000 +138706 -1.000000 +138707 -1.000000 +138708 -1.000000 +138709 -1.000000 +138714 -1.000000 +138716 -1.000000 +138717 -1.000000 +138720 -1.000000 +138721 -1.000000 +138725 -1.000000 +138726 -1.000000 +138730 -1.000000 +138732 -1.000000 +138734 -1.000000 +138735 -1.000000 +138736 -1.000000 +138737 -1.000000 +138738 -1.000000 +138739 -1.000000 +138742 -1.000000 +138745 -1.000000 +138746 -1.000000 +138751 -1.000000 +138753 -1.000000 +138754 -1.000000 +138756 -1.000000 +138757 -1.000000 +138758 -1.000000 +138759 -1.000000 +138760 -1.000000 +138761 -1.000000 +138763 -1.000000 +138767 -1.000000 +138768 -1.000000 +138769 -1.000000 +138773 -1.000000 +138774 -1.000000 +138778 -1.000000 +138779 -1.000000 +138780 -1.000000 +138781 -1.000000 +138783 -1.000000 +138784 -1.000000 +138786 -1.000000 +138789 -1.000000 +138792 -1.000000 +138795 -1.000000 +138798 -1.000000 +138799 -1.000000 +138809 -1.000000 +138812 -1.000000 +138813 -1.000000 +138819 -1.000000 +138821 -1.000000 +138823 -1.000000 +138827 -1.000000 +138828 -1.000000 +138832 -1.000000 +138853 -1.000000 +139282 -1.000000 +139283 -1.000000 +139284 -1.000000 +139285 -1.000000 +139286 -1.000000 +139287 -1.000000 +139288 -1.000000 +139294 -1.000000 +139295 -1.000000 +139303 -1.000000 +139316 -1.000000 +139321 -1.000000 +139322 -1.000000 +139323 -1.000000 +139324 -1.000000 +139325 -1.000000 +139326 -1.000000 +139327 -1.000000 +139328 -1.000000 +139329 -1.000000 +139330 -1.000000 +139346 -1.000000 +139347 -1.000000 +139348 -1.000000 +139349 -1.000000 +139350 -1.000000 +139351 -1.000000 +139352 -1.000000 +139356 -1.000000 +139357 -1.000000 +139358 -1.000000 +139362 -1.000000 +139363 -1.000000 +139364 -1.000000 +139365 -1.000000 +139366 -1.000000 +139367 -1.000000 +139368 -1.000000 +139370 -1.000000 +139372 -1.000000 +139373 -1.000000 +139374 -1.000000 +139375 -1.000000 +139376 -1.000000 +139377 -1.000000 +139379 -1.000000 +139380 -1.000000 +139381 -1.000000 +139383 -1.000000 +139384 -1.000000 +139399 -1.000000 +139400 -1.000000 +139404 -1.000000 +139406 -1.000000 +139407 -1.000000 +139409 -1.000000 +139412 -1.000000 +139414 -1.000000 +139415 -1.000000 +139416 -1.000000 +139437 -1.000000 +139446 -1.000000 +139447 -1.000000 +139452 -1.000000 +139454 -1.000000 +139455 -1.000000 +139456 -1.000000 +139457 -1.000000 +139458 -1.000000 +139460 -1.000000 +139461 -1.000000 +139462 -1.000000 +139464 -1.000000 +139465 -1.000000 +139469 -1.000000 +139472 -1.000000 +139473 -1.000000 +139474 -1.000000 +139475 -1.000000 +139476 -1.000000 +139477 -1.000000 +139478 -1.000000 +139479 -1.000000 +139480 -1.000000 +139481 -1.000000 +139482 -1.000000 +139483 -1.000000 +139484 -1.000000 +139485 -1.000000 +139486 -1.000000 +139489 -1.000000 +139491 -1.000000 +139492 -1.000000 +139493 -1.000000 +139494 -1.000000 +139495 -1.000000 +139496 -1.000000 +139498 -1.000000 +139499 -1.000000 +139510 -1.000000 +139529 -1.000000 +139539 -1.000000 +139540 -1.000000 +139544 -1.000000 +139549 -1.000000 +139561 -1.000000 +139562 -1.000000 +139564 -1.000000 +139565 -1.000000 +139569 -1.000000 +139570 -1.000000 +139583 -1.000000 +139589 -1.000000 +139600 -1.000000 +139601 -1.000000 +139602 -1.000000 +139603 -1.000000 +139604 -1.000000 +139605 -1.000000 +139606 -1.000000 +139611 -1.000000 +139615 -1.000000 +139616 -1.000000 +139619 -1.000000 +139620 -1.000000 +139621 -1.000000 +139622 -1.000000 +139625 -1.000000 +139626 -1.000000 +139635 -1.000000 +139636 -1.000000 +139647 -1.000000 +139648 -1.000000 +139649 -1.000000 +139650 -1.000000 +139651 -1.000000 +139652 -1.000000 +139653 -1.000000 +139654 -1.000000 +139655 -1.000000 +139656 -1.000000 +139657 -1.000000 +139658 -1.000000 +139659 -1.000000 +139661 -1.000000 +139662 -1.000000 +139663 -1.000000 +139664 -1.000000 +139665 -1.000000 +139666 -1.000000 +139667 -1.000000 +139668 -1.000000 +139669 -1.000000 +139670 -1.000000 +139671 -1.000000 +139673 -1.000000 +139674 -1.000000 +139675 -1.000000 +139676 -1.000000 +139677 -1.000000 +139678 -1.000000 +139679 -1.000000 +139680 -1.000000 +139682 -1.000000 +139686 -1.000000 +139688 -1.000000 +139689 -1.000000 +139690 -1.000000 +139691 -1.000000 +139692 -1.000000 +139693 -1.000000 +139695 -1.000000 +139702 -1.000000 +139703 -1.000000 +139707 -1.000000 +139708 -1.000000 +139711 -1.000000 +139714 -1.000000 +139715 -1.000000 +139716 -1.000000 +139718 -1.000000 +139719 -1.000000 +139724 -1.000000 +139728 -1.000000 +139735 -1.000000 +139738 -1.000000 +139740 -1.000000 +139744 -1.000000 +139745 -1.000000 +139747 -1.000000 +139748 -1.000000 +139749 -1.000000 +139750 -1.000000 +139751 -1.000000 +139752 -1.000000 +139757 -1.000000 +139758 -1.000000 +139760 -1.000000 +139761 -1.000000 +139764 -1.000000 +139768 -1.000000 +139769 -1.000000 +139772 -1.000000 +139773 -1.000000 +139777 -1.000000 +139783 -1.000000 +139784 -1.000000 +139785 -1.000000 +139788 -1.000000 +139789 -1.000000 +139790 -1.000000 +139791 -1.000000 +139792 -1.000000 +139802 -1.000000 +139816 -1.000000 +139817 -1.000000 +139869 -1.000000 +139872 -1.000000 +139876 -1.000000 +139877 -1.000000 +139878 -1.000000 +139879 -1.000000 +139880 -1.000000 +139881 -1.000000 +139882 -1.000000 +139883 -1.000000 +139884 -1.000000 +139885 -1.000000 +139887 -1.000000 +139890 -1.000000 +139891 -1.000000 +139893 -1.000000 +139894 -1.000000 +139895 -1.000000 +139896 -1.000000 +139900 -1.000000 +139901 -1.000000 +139902 -1.000000 +139904 -1.000000 +139905 -1.000000 +139906 -1.000000 +139907 -1.000000 +139908 -1.000000 +139909 -1.000000 +139910 -1.000000 +139911 -1.000000 +139912 -1.000000 +139915 -1.000000 +139916 -1.000000 +139917 -1.000000 +139918 -1.000000 +139919 -1.000000 +139920 -1.000000 +139921 -1.000000 +139922 -1.000000 +139924 -1.000000 +139925 -1.000000 +139926 -1.000000 +139928 -1.000000 +139929 -1.000000 +139930 -1.000000 +139931 -1.000000 +139938 -1.000000 +139939 -1.000000 +139940 -1.000000 +139943 -1.000000 +139944 -1.000000 +139945 -1.000000 +139950 -1.000000 +139953 -1.000000 +139955 -1.000000 +139957 -1.000000 +139958 -1.000000 +139968 -1.000000 +139971 -1.000000 +139974 -1.000000 +139983 -1.000000 +139984 -1.000000 +139985 -1.000000 +139991 -1.000000 +139995 -1.000000 +139997 -1.000000 +139998 -1.000000 +139999 -1.000000 +140000 -1.000000 +140001 -1.000000 +140002 -1.000000 +140003 -1.000000 +140019 -1.000000 +140020 -1.000000 +140029 -1.000000 +140030 -1.000000 +140031 -1.000000 +140032 -1.000000 +140033 -1.000000 +140034 -1.000000 +140035 -1.000000 +140036 -1.000000 +140037 -1.000000 +140038 -1.000000 +140039 -1.000000 +140040 -1.000000 +140041 -1.000000 +140045 -1.000000 +140048 -1.000000 +140049 -1.000000 +140050 -1.000000 +140052 -1.000000 +140053 -1.000000 +140056 -1.000000 +140059 -1.000000 +140061 -1.000000 +140063 -1.000000 +140064 -1.000000 +140065 -1.000000 +140066 -1.000000 +140067 -1.000000 +140068 -1.000000 +140069 -1.000000 +140070 -1.000000 +140071 -1.000000 +140072 -1.000000 +140073 -1.000000 +140074 -1.000000 +140075 -1.000000 +140076 -1.000000 +140077 -1.000000 +140078 -1.000000 +140082 -1.000000 +140083 -1.000000 +140084 -1.000000 +140086 -1.000000 +140087 -1.000000 +140089 -1.000000 +140090 -1.000000 +140092 -1.000000 +140093 -1.000000 +140094 -1.000000 +140095 -1.000000 +140097 -1.000000 +140099 -1.000000 +140102 -1.000000 +140105 -1.000000 +140111 -1.000000 +140112 -1.000000 +140113 -1.000000 +140114 -1.000000 +140116 -1.000000 +140117 -1.000000 +140120 -1.000000 +140122 -1.000000 +140129 -1.000000 +140134 -1.000000 +140135 -1.000000 +140138 -1.000000 +140141 -1.000000 +140142 -1.000000 +140144 -1.000000 +140145 -1.000000 +140146 -1.000000 +140150 -1.000000 +140151 -1.000000 +140153 -1.000000 +140154 -1.000000 +140156 -1.000000 +140162 -1.000000 +140163 -1.000000 +140165 -1.000000 +140166 -1.000000 +140169 -1.000000 +140170 -1.000000 +140175 -1.000000 +140178 -1.000000 +140179 -1.000000 +140180 -1.000000 +140182 -1.000000 +140183 -1.000000 +140184 -1.000000 +140185 -1.000000 +140187 -1.000000 +140188 -1.000000 +140189 -1.000000 +140191 -1.000000 +140192 -1.000000 +140193 -1.000000 +140195 -1.000000 +140196 -1.000000 +140198 -1.000000 +140199 -1.000000 +140200 -1.000000 +140202 -1.000000 +140203 -1.000000 +140204 -1.000000 +140205 -1.000000 +140209 -1.000000 +140210 -1.000000 +140211 -1.000000 +140214 -1.000000 +140215 -1.000000 +140216 -1.000000 +140219 -1.000000 +140220 -1.000000 +140221 -1.000000 +140222 -1.000000 +140224 -1.000000 +140225 -1.000000 +140226 -1.000000 +140227 -1.000000 +140228 -1.000000 +140229 -1.000000 +140230 -1.000000 +140235 -1.000000 +140236 -1.000000 +140241 -1.000000 +140242 -1.000000 +140265 -1.000000 +140273 -1.000000 +140281 -1.000000 +140300 -1.000000 +140301 -1.000000 +140302 -1.000000 +140303 -1.000000 +140304 -1.000000 +140305 -1.000000 +140306 -1.000000 +140307 -1.000000 +140324 -1.000000 +140325 -1.000000 +140326 -1.000000 +140327 -1.000000 +140328 -1.000000 +140329 -1.000000 +140331 -1.000000 +140337 -1.000000 +140338 -1.000000 +140339 -1.000000 +140340 -1.000000 +140348 -1.000000 +140349 -1.000000 +140350 -1.000000 +140351 -1.000000 +140352 -1.000000 +140353 -1.000000 +140354 -1.000000 +140355 -1.000000 +140356 -1.000000 +140357 -1.000000 +140358 -1.000000 +140359 -1.000000 +140360 -1.000000 +140361 -1.000000 +140362 -1.000000 +140363 -1.000000 +140364 -1.000000 +140365 -1.000000 +140366 -1.000000 +140367 -1.000000 +140368 -1.000000 +140369 -1.000000 +140372 -1.000000 +140374 -1.000000 +140375 -1.000000 +140377 -1.000000 +140378 -1.000000 +140379 -1.000000 +140381 -1.000000 +140383 -1.000000 +140384 -1.000000 +140386 -1.000000 +140388 -1.000000 +140389 -1.000000 +140390 -1.000000 +140391 -1.000000 +140392 -1.000000 +140393 -1.000000 +140394 -1.000000 +140396 -1.000000 +140398 -1.000000 +140400 -1.000000 +140401 -1.000000 +140404 -1.000000 +140405 -1.000000 +140406 -1.000000 +140407 -1.000000 +140408 -1.000000 +140409 -1.000000 +140413 -1.000000 +140414 -1.000000 +140415 -1.000000 +140416 -1.000000 +140417 -1.000000 +140418 -1.000000 +140419 -1.000000 +140420 -1.000000 +140421 -1.000000 +140422 -1.000000 +140423 -1.000000 +140424 -1.000000 +140427 -1.000000 +140428 -1.000000 +140429 -1.000000 +140430 -1.000000 +140431 -1.000000 +140432 -1.000000 +140433 -1.000000 +140434 -1.000000 +140435 -1.000000 +140436 -1.000000 +140437 -1.000000 +140438 -1.000000 +140441 -1.000000 +140445 -1.000000 +140446 -1.000000 +140448 -1.000000 +140450 -1.000000 +140451 -1.000000 +140452 -1.000000 +140453 -1.000000 +140454 -1.000000 +140455 -1.000000 +140456 -1.000000 +140457 -1.000000 +140458 -1.000000 +140465 -1.000000 +140469 -1.000000 +140471 -1.000000 +140475 -1.000000 +140494 -1.000000 +140495 -1.000000 +140496 -1.000000 +140498 -1.000000 +140499 -1.000000 +140500 -1.000000 +140501 -1.000000 +140502 -1.000000 +140503 -1.000000 +140504 -1.000000 +140506 -1.000000 +140507 -1.000000 +140508 -1.000000 +140509 -1.000000 +140510 -1.000000 +140511 -1.000000 +140512 -1.000000 +140513 -1.000000 +140514 -1.000000 +140515 -1.000000 +140518 -1.000000 +140519 -1.000000 +140520 -1.000000 +140521 -1.000000 +140522 -1.000000 +140523 -1.000000 +140524 -1.000000 +140531 -1.000000 +140532 -1.000000 +140534 -1.000000 +140535 -1.000000 +140536 -1.000000 +140537 -1.000000 +140538 -1.000000 +140539 -1.000000 +140540 -1.000000 +140541 -1.000000 +140542 -1.000000 +140543 -1.000000 +140544 -1.000000 +140545 -1.000000 +140560 -1.000000 +140561 -1.000000 +140562 -1.000000 +140563 -1.000000 +140585 -1.000000 +140591 -1.000000 +140592 -1.000000 +140593 -1.000000 +140594 -1.000000 +140596 -1.000000 +140597 -1.000000 +140598 -1.000000 +140599 -1.000000 +140600 -1.000000 +140601 -1.000000 +140602 -1.000000 +140603 -1.000000 +140604 -1.000000 +140605 -1.000000 +140606 -1.000000 +140607 -1.000000 +140608 -1.000000 +140609 -1.000000 +140610 -1.000000 +140611 -1.000000 +140612 -1.000000 +140613 -1.000000 +140614 -1.000000 +140615 -1.000000 +140616 -1.000000 +140617 -1.000000 +140618 -1.000000 +140619 -1.000000 +140628 -1.000000 +140629 -1.000000 +140630 -1.000000 +140631 -1.000000 +140632 -1.000000 +140633 -1.000000 +140634 -1.000000 +140635 -1.000000 +140636 -1.000000 +140637 -1.000000 +140638 -1.000000 +140639 -1.000000 +140641 -1.000000 +140643 -1.000000 +140648 -1.000000 +140651 -1.000000 +140654 -1.000000 +140655 -1.000000 +140656 -1.000000 +140657 -1.000000 +140659 -1.000000 +140661 -1.000000 +140662 -1.000000 +140663 -1.000000 +140665 -1.000000 +140667 -1.000000 +140669 -1.000000 +140673 -1.000000 +140674 -1.000000 +140675 -1.000000 +140676 -1.000000 +140677 -1.000000 +140678 -1.000000 +140679 -1.000000 +140680 -1.000000 +140682 -1.000000 +140683 -1.000000 +140684 -1.000000 +140685 -1.000000 +140686 -1.000000 +140687 -1.000000 +140688 -1.000000 +140689 -1.000000 +140690 -1.000000 +140691 -1.000000 +140692 -1.000000 +140693 -1.000000 +140695 -1.000000 +140696 -1.000000 +140697 -1.000000 +140698 -1.000000 +140699 -1.000000 +140700 -1.000000 +140701 -1.000000 +140702 -1.000000 +140703 -1.000000 +140705 -1.000000 +140707 -1.000000 +140708 -1.000000 +140709 -1.000000 +140710 -1.000000 +140712 -1.000000 +140713 -1.000000 +140714 -1.000000 +140715 -1.000000 +140717 -1.000000 +140718 -1.000000 +140719 -1.000000 +140720 -1.000000 +140721 -1.000000 +140722 -1.000000 +140723 -1.000000 +140724 -1.000000 +140725 -1.000000 +140726 -1.000000 +140727 -1.000000 +140730 -1.000000 +140731 -1.000000 +140736 -1.000000 +140738 -1.000000 +140743 -1.000000 +140744 -1.000000 +140745 -1.000000 +140746 -1.000000 +140747 -1.000000 +140749 -1.000000 +140750 -1.000000 +140751 -1.000000 +140752 -1.000000 +140753 -1.000000 +140754 -1.000000 +140756 -1.000000 +140757 -1.000000 +140758 -1.000000 +140759 -1.000000 +140761 -1.000000 +140838 -1.000000 +140839 -1.000000 +140840 -1.000000 +140841 -1.000000 +140842 -1.000000 +140843 -1.000000 +140844 -1.000000 +140845 -1.000000 +140846 -1.000000 +140847 -1.000000 +140848 -1.000000 +140849 -1.000000 +140850 -1.000000 +140851 -1.000000 +140852 -1.000000 +140853 -1.000000 +140854 -1.000000 +140855 -1.000000 +140856 -1.000000 +140857 -1.000000 +140858 -1.000000 +140859 -1.000000 +140860 -1.000000 +140862 -1.000000 +140864 -1.000000 +140866 -1.000000 +140868 -1.000000 +140869 -1.000000 +140871 -1.000000 +140872 -1.000000 +140873 -1.000000 +140874 -1.000000 +140875 -1.000000 +140876 -1.000000 +140877 -1.000000 +140878 -1.000000 +140879 -1.000000 +140880 -1.000000 +140881 -1.000000 +140882 -1.000000 +140883 -1.000000 +140884 -1.000000 +140885 -1.000000 +140886 -1.000000 +140887 -1.000000 +140888 -1.000000 +140889 -1.000000 +140890 -1.000000 +140891 -1.000000 +140892 -1.000000 +140893 -1.000000 +140894 -1.000000 +140895 -1.000000 +140899 -1.000000 +140900 -1.000000 +140901 -1.000000 +140903 -1.000000 +140904 -1.000000 +140905 -1.000000 +140906 -1.000000 +140907 -1.000000 +140908 -1.000000 +140909 -1.000000 +140912 -1.000000 +140913 -1.000000 +140914 -1.000000 +140915 -1.000000 +140916 -1.000000 +140917 -1.000000 +140918 -1.000000 +140920 -1.000000 +140924 -1.000000 +140927 -1.000000 +140929 -1.000000 +140931 -1.000000 +140933 -1.000000 +140934 -1.000000 +140935 -1.000000 +140936 -1.000000 +140937 -1.000000 +140938 -1.000000 +140940 -1.000000 +140941 -1.000000 +140944 -1.000000 +140946 -1.000000 +140952 -1.000000 +140954 -1.000000 +140974 -1.000000 +140987 -1.000000 +141005 -1.000000 +141007 -1.000000 +141008 -1.000000 +141009 -1.000000 +141011 -1.000000 +141013 -1.000000 +141014 -1.000000 +141015 -1.000000 +141016 -1.000000 +141017 -1.000000 +141018 -1.000000 +141019 -1.000000 +141020 -1.000000 +141021 -1.000000 +141022 -1.000000 +141023 -1.000000 +141024 -1.000000 +141026 -1.000000 +141027 -1.000000 +141029 -1.000000 +141042 -1.000000 +141043 -1.000000 +141045 -1.000000 +141046 -1.000000 +141068 -1.000000 +141069 -1.000000 +141070 -1.000000 +141071 -1.000000 +141072 -1.000000 +141073 -1.000000 +141074 -1.000000 +141075 -1.000000 +141076 -1.000000 +141077 -1.000000 +141080 -1.000000 +141081 -1.000000 +141083 -1.000000 +141084 -1.000000 +141089 -1.000000 +141090 -1.000000 +141091 -1.000000 +141092 -1.000000 +141094 -1.000000 +141095 -1.000000 +141096 -1.000000 +141105 -1.000000 +141106 -1.000000 +141118 -1.000000 +141132 -1.000000 +141135 -1.000000 +141136 -1.000000 +141137 -1.000000 +141138 -1.000000 +141139 -1.000000 +141140 -1.000000 +141141 -1.000000 +141142 -1.000000 +141143 -1.000000 +141144 -1.000000 +141145 -1.000000 +141146 -1.000000 +141147 -1.000000 +141148 -1.000000 +141149 -1.000000 +141150 -1.000000 +141166 -1.000000 +141167 -1.000000 +141169 -1.000000 +141170 -1.000000 +141171 -1.000000 +141179 -1.000000 +141180 -1.000000 +141182 -1.000000 +141183 -1.000000 +141184 -1.000000 +141185 -1.000000 +141187 -1.000000 +141188 -1.000000 +141189 -1.000000 +141190 -1.000000 +141191 -1.000000 +141195 -1.000000 +141196 -1.000000 +141210 -1.000000 +141211 -1.000000 +141212 -1.000000 +141213 -1.000000 +141214 -1.000000 +141215 -1.000000 +141216 -1.000000 +141217 -1.000000 +141218 -1.000000 +141219 -1.000000 +141220 -1.000000 +141221 -1.000000 +141222 -1.000000 +141223 -1.000000 +141224 -1.000000 +141225 -1.000000 +141226 -1.000000 +141227 -1.000000 +141228 -1.000000 +141229 -1.000000 +141230 -1.000000 +141231 -1.000000 +141232 -1.000000 +141233 -1.000000 +141234 -1.000000 +141241 -1.000000 +141263 -1.000000 +141264 -1.000000 +141266 -1.000000 +141267 -1.000000 +141268 -1.000000 +141270 -1.000000 +141271 -1.000000 +141272 -1.000000 +141273 -1.000000 +141274 -1.000000 +141275 -1.000000 +141276 -1.000000 +141277 -1.000000 +141278 -1.000000 +141279 -1.000000 +141284 -1.000000 +141285 -1.000000 +141298 -1.000000 +141313 -1.000000 +141320 -1.000000 +141321 -1.000000 +141323 -1.000000 +141328 -1.000000 +141338 -1.000000 +141339 -1.000000 +141340 -1.000000 +141342 -1.000000 +141344 -1.000000 +141352 -1.000000 +141354 -1.000000 +141357 -1.000000 +141363 -1.000000 +141365 -1.000000 +141366 -1.000000 +141370 -1.000000 +141377 -1.000000 +141378 -1.000000 +141381 -1.000000 +141383 -1.000000 +141384 -1.000000 +141385 -1.000000 +141386 -1.000000 +141387 -1.000000 +141388 -1.000000 +141392 -1.000000 +141395 -1.000000 +141397 -1.000000 +141398 -1.000000 +141399 -1.000000 +141400 -1.000000 +141401 -1.000000 +141402 -1.000000 +141403 -1.000000 +141404 -1.000000 +141405 -1.000000 +141406 -1.000000 +141407 -1.000000 +141408 -1.000000 +141409 -1.000000 +141410 -1.000000 +141412 -1.000000 +141413 -1.000000 +141414 -1.000000 +141415 -1.000000 +141416 -1.000000 +141417 -1.000000 +141418 -1.000000 +141419 -1.000000 +141420 -1.000000 +141422 -1.000000 +141423 -1.000000 +141424 -1.000000 +141425 -1.000000 +141426 -1.000000 +141427 -1.000000 +141428 -1.000000 +141429 -1.000000 +141430 -1.000000 +141431 -1.000000 +141432 -1.000000 +141438 -1.000000 +141440 -1.000000 +141445 -1.000000 +141446 -1.000000 +141449 -1.000000 +141451 -1.000000 +141452 -1.000000 +141453 -1.000000 +141455 -1.000000 +141458 -1.000000 +141460 -1.000000 +141461 -1.000000 +141462 -1.000000 +141464 -1.000000 +141466 -1.000000 +141467 -1.000000 +141468 -1.000000 +141469 -1.000000 +141470 -1.000000 +141471 -1.000000 +141472 -1.000000 +141474 -1.000000 +141489 -1.000000 +141490 -1.000000 +141499 -1.000000 +141501 -1.000000 +141502 -1.000000 +141503 -1.000000 +141504 -1.000000 +141505 -1.000000 +141506 -1.000000 +141507 -1.000000 +141508 -1.000000 +141509 -1.000000 +141510 -1.000000 +141511 -1.000000 +141513 -1.000000 +141514 -1.000000 +141515 -1.000000 +141516 -1.000000 +141517 -1.000000 +141518 -1.000000 +141519 -1.000000 +141520 -1.000000 +141523 -1.000000 +141531 -1.000000 +141532 -1.000000 +141533 -1.000000 +141534 -1.000000 +141535 -1.000000 +141538 -1.000000 +141540 -1.000000 +141542 -1.000000 +141545 -1.000000 +141546 -1.000000 +141547 -1.000000 +141548 -1.000000 +141550 -1.000000 +141552 -1.000000 +141553 -1.000000 +141554 -1.000000 +141555 -1.000000 +141556 -1.000000 +141557 -1.000000 +141558 -1.000000 +141559 -1.000000 +141560 -1.000000 +141561 -1.000000 +141562 -1.000000 +141563 -1.000000 +141564 -1.000000 +141566 -1.000000 +141568 -1.000000 +141569 -1.000000 +141570 -1.000000 +141571 -1.000000 +141572 -1.000000 +141573 -1.000000 +141575 -1.000000 +141576 -1.000000 +141577 -1.000000 +141578 -1.000000 +141580 -1.000000 +141581 -1.000000 +141582 -1.000000 +141583 -1.000000 +141584 -1.000000 +141585 -1.000000 +141586 -1.000000 +141587 -1.000000 +141588 -1.000000 +141589 -1.000000 +141590 -1.000000 +141591 -1.000000 +141593 -1.000000 +141594 -1.000000 +141595 -1.000000 +141596 -1.000000 +141597 -1.000000 +141598 -1.000000 +141599 -1.000000 +141600 -1.000000 +141601 -1.000000 +141602 -1.000000 +141603 -1.000000 +141604 -1.000000 +141608 -1.000000 +141609 -1.000000 +141612 -1.000000 +141614 -1.000000 +141617 -1.000000 +141618 -1.000000 +141620 -1.000000 +141622 -1.000000 +141623 -1.000000 +141624 -1.000000 +141627 -1.000000 +141628 -1.000000 +141629 -1.000000 +141630 -1.000000 +141631 -1.000000 +141634 -1.000000 +141635 -1.000000 +141636 -1.000000 +141638 -1.000000 +141647 -1.000000 +141648 -1.000000 +141649 -1.000000 +141650 -1.000000 +141651 -1.000000 +141652 -1.000000 +141653 -1.000000 +141654 -1.000000 +141655 -1.000000 +141656 -1.000000 +141657 -1.000000 +141658 -1.000000 +141659 -1.000000 +141660 -1.000000 +141661 -1.000000 +141662 -1.000000 +141663 -1.000000 +141664 -1.000000 +141665 -1.000000 +141666 -1.000000 +141667 -1.000000 +141668 -1.000000 +141669 -1.000000 +141670 -1.000000 +141671 -1.000000 +141672 -1.000000 +141673 -1.000000 +141674 -1.000000 +141675 -1.000000 +141676 -1.000000 +141677 -1.000000 +141678 -1.000000 +141679 -1.000000 +141681 -1.000000 +141682 -1.000000 +141683 -1.000000 +141684 -1.000000 +141685 -1.000000 +141686 -1.000000 +141687 -1.000000 +141690 -1.000000 +141691 -1.000000 +141692 -1.000000 +141693 -1.000000 +141694 -1.000000 +141695 -1.000000 +141696 -1.000000 +141697 -1.000000 +141698 -1.000000 +141699 -1.000000 +141700 -1.000000 +141701 -1.000000 +141702 -1.000000 +141703 -1.000000 +141704 -1.000000 +141705 -1.000000 +141706 -1.000000 +141707 -1.000000 +141708 -1.000000 +141709 -1.000000 +141711 -1.000000 +141712 -1.000000 +141714 -1.000000 +141719 -1.000000 +141720 -1.000000 +141721 -1.000000 +141722 -1.000000 +141723 -1.000000 +141724 -1.000000 +141728 -1.000000 +141729 -1.000000 +141750 -1.000000 +141811 -1.000000 +141812 -1.000000 +141813 -1.000000 +141815 -1.000000 +141816 -1.000000 +141817 -1.000000 +141819 -1.000000 +141822 -1.000000 +141823 -1.000000 +141824 -1.000000 +141825 -1.000000 +141826 -1.000000 +141827 -1.000000 +141828 -1.000000 +141829 -1.000000 +141830 -1.000000 +141832 -1.000000 +141835 -1.000000 +141837 -1.000000 +141839 -1.000000 +141840 -1.000000 +141841 -1.000000 +141842 -1.000000 +141844 -1.000000 +141854 -1.000000 +141856 -1.000000 +141858 -1.000000 +141861 -1.000000 +141862 -1.000000 +141863 -1.000000 +141864 -1.000000 +141865 -1.000000 +141866 -1.000000 +141867 -1.000000 +141868 -1.000000 +141869 -1.000000 +141870 -1.000000 +141871 -1.000000 +141872 -1.000000 +141873 -1.000000 +141874 -1.000000 +141875 -1.000000 +141877 -1.000000 +141878 -1.000000 +141879 -1.000000 +141881 -1.000000 +141884 -1.000000 +141886 -1.000000 +141887 -1.000000 +141888 -1.000000 +141889 -1.000000 +141890 -1.000000 +141891 -1.000000 +141892 -1.000000 +141893 -1.000000 +141896 -1.000000 +141897 -1.000000 +141904 -1.000000 +141905 -1.000000 +141906 -1.000000 +141911 -1.000000 +141913 -1.000000 +141919 -1.000000 +141920 -1.000000 +141921 -1.000000 +141922 -1.000000 +141923 -1.000000 +141925 -1.000000 +141927 -1.000000 +141928 -1.000000 +141929 -1.000000 +141930 -1.000000 +141931 -1.000000 +141932 -1.000000 +141933 -1.000000 +141934 -1.000000 +141935 -1.000000 +141936 -1.000000 +141937 -1.000000 +141938 -1.000000 +141939 -1.000000 +141940 -1.000000 +141941 -1.000000 +141942 -1.000000 +141943 -1.000000 +141944 -1.000000 +141945 -1.000000 +141946 -1.000000 +141947 -1.000000 +141948 -1.000000 +141949 -1.000000 +141950 -1.000000 +141951 -1.000000 +141952 -1.000000 +141953 -1.000000 +141954 -1.000000 +141955 -1.000000 +141956 -1.000000 +141958 -1.000000 +141959 -1.000000 +141961 -1.000000 +141962 -1.000000 +141964 -1.000000 +141966 -1.000000 +141967 -1.000000 +141968 -1.000000 +141969 -1.000000 +141972 -1.000000 +141973 -1.000000 +141974 -1.000000 +141975 -1.000000 +141976 -1.000000 +141977 -1.000000 +141978 -1.000000 +141981 -1.000000 +141985 -1.000000 +141986 -1.000000 +141987 -1.000000 +141994 -1.000000 +141997 -1.000000 +141999 -1.000000 +142000 -1.000000 +142002 -1.000000 +142005 -1.000000 +142006 -1.000000 +142007 -1.000000 +142008 -1.000000 +142009 -1.000000 +142010 -1.000000 +142011 -1.000000 +142012 -1.000000 +142013 -1.000000 +142014 -1.000000 +142015 -1.000000 +142016 -1.000000 +142017 -1.000000 +142018 -1.000000 +142019 -1.000000 +142020 -1.000000 +142021 -1.000000 +142022 -1.000000 +142023 -1.000000 +142024 -1.000000 +142025 -1.000000 +142026 -1.000000 +142027 -1.000000 +142028 -1.000000 +142029 -1.000000 +142030 -1.000000 +142031 -1.000000 +142034 -1.000000 +142035 -1.000000 +142038 -1.000000 +142045 -1.000000 +142046 -1.000000 +142047 -1.000000 +142049 -1.000000 +142051 -1.000000 +142052 -1.000000 +142053 -1.000000 +142054 -1.000000 +142055 -1.000000 +142056 -1.000000 +142057 -1.000000 +142062 -1.000000 +142063 -1.000000 +142065 -1.000000 +142066 -1.000000 +142070 -1.000000 +142071 -1.000000 +142073 -1.000000 +142074 -1.000000 +142075 -1.000000 +142077 -1.000000 +142078 -1.000000 +142079 -1.000000 +142080 -1.000000 +142081 -1.000000 +142082 -1.000000 +142083 -1.000000 +142084 -1.000000 +142085 -1.000000 +142087 -1.000000 +142088 -1.000000 +142091 -1.000000 +142092 -1.000000 +142093 -1.000000 +142094 -1.000000 +142095 -1.000000 +142096 -1.000000 +142097 -1.000000 +142098 -1.000000 +142099 -1.000000 +142104 -1.000000 +142105 -1.000000 +142106 -1.000000 +142107 -1.000000 +142108 -1.000000 +142109 -1.000000 +142110 -1.000000 +142111 -1.000000 +142112 -1.000000 +142114 -1.000000 +142115 -1.000000 +142117 -1.000000 +142118 -1.000000 +142119 -1.000000 +142120 -1.000000 +142121 -1.000000 +142122 -1.000000 +142123 -1.000000 +142124 -1.000000 +142125 -1.000000 +142126 -1.000000 +142128 -1.000000 +142129 -1.000000 +142130 -1.000000 +142131 -1.000000 +142132 -1.000000 +142135 -1.000000 +142136 -1.000000 +142137 -1.000000 +142145 -1.000000 +142146 -1.000000 +142148 -1.000000 +142150 -1.000000 +142152 -1.000000 +142154 -1.000000 +142156 -1.000000 +142158 -1.000000 +142160 -1.000000 +142162 -1.000000 +142164 -1.000000 +142168 -1.000000 +142169 -1.000000 +142171 -1.000000 +142172 -1.000000 +142173 -1.000000 +142174 -1.000000 +142175 -1.000000 +142176 -1.000000 +142177 -1.000000 +142178 -1.000000 +142179 -1.000000 +142180 -1.000000 +142181 -1.000000 +142182 -1.000000 +142183 -1.000000 +142184 -1.000000 +142185 -1.000000 +142186 -1.000000 +142187 -1.000000 +142188 -1.000000 +142189 -1.000000 +142190 -1.000000 +142191 -1.000000 +142192 -1.000000 +142193 -1.000000 +142194 -1.000000 +142195 -1.000000 +142196 -1.000000 +142197 -1.000000 +142198 -1.000000 +142203 -1.000000 +142204 -1.000000 +142206 -1.000000 +142207 -1.000000 +142208 -1.000000 +142209 -1.000000 +142211 -1.000000 +142212 -1.000000 +142213 -1.000000 +142214 -1.000000 +142215 -1.000000 +142216 -1.000000 +142217 -1.000000 +142218 -1.000000 +142223 -1.000000 +142224 -1.000000 +142231 -1.000000 +142236 -1.000000 +142240 -1.000000 +142245 -1.000000 +142246 -1.000000 +142247 -1.000000 +142248 -1.000000 +142249 -1.000000 +142254 -1.000000 +142256 -1.000000 +142259 -1.000000 +142261 -1.000000 +142264 -1.000000 +142265 -1.000000 +142266 -1.000000 +142267 -1.000000 +142268 -1.000000 +142269 -1.000000 +142270 -1.000000 +142272 -1.000000 +142273 -1.000000 +142274 -1.000000 +142275 -1.000000 +142276 -1.000000 +142282 -1.000000 +142283 -1.000000 +142284 -1.000000 +142285 -1.000000 +142286 -1.000000 +142287 -1.000000 +142288 -1.000000 +142289 -1.000000 +142290 -1.000000 +142292 -1.000000 +142293 -1.000000 +142294 -1.000000 +142295 -1.000000 +142301 -1.000000 +142302 -1.000000 +142303 -1.000000 +142304 -1.000000 +142305 -1.000000 +142306 -1.000000 +142307 -1.000000 +142308 -1.000000 +142309 -1.000000 +142310 -1.000000 +142311 -1.000000 +142312 -1.000000 +142313 -1.000000 +142314 -1.000000 +142315 -1.000000 +142316 -1.000000 +142317 -1.000000 +142319 -1.000000 +142320 -1.000000 +142321 -1.000000 +142322 -1.000000 +142323 -1.000000 +142324 -1.000000 +142325 -1.000000 +142326 -1.000000 +142327 -1.000000 +142328 -1.000000 +142329 -1.000000 +142330 -1.000000 +142331 -1.000000 +142332 -1.000000 +142333 -1.000000 +142334 -1.000000 +142335 -1.000000 +142336 -1.000000 +142337 -1.000000 +142338 -1.000000 +142339 -1.000000 +142340 -1.000000 +142341 -1.000000 +142342 -1.000000 +142343 -1.000000 +142344 -1.000000 +142345 -1.000000 +142346 -1.000000 +142347 -1.000000 +142348 -1.000000 +142349 -1.000000 +142351 -1.000000 +142355 -1.000000 +142356 -1.000000 +142357 -1.000000 +142358 -1.000000 +142359 -1.000000 +142360 -1.000000 +142361 -1.000000 +142362 -1.000000 +142363 -1.000000 +142364 -1.000000 +142365 -1.000000 +142366 -1.000000 +142367 -1.000000 +142368 -1.000000 +142369 -1.000000 +142370 -1.000000 +142371 -1.000000 +142372 -1.000000 +142373 -1.000000 +142374 -1.000000 +142375 -1.000000 +142376 -1.000000 +142377 -1.000000 +142378 -1.000000 +142379 -1.000000 +142380 -1.000000 +142381 -1.000000 +142382 -1.000000 +142383 -1.000000 +142385 -1.000000 +142386 -1.000000 +142387 -1.000000 +142388 -1.000000 +142389 -1.000000 +142390 -1.000000 +142391 -1.000000 +142392 -1.000000 +142393 -1.000000 +142394 -1.000000 +142395 -1.000000 +142396 -1.000000 +142397 -1.000000 +142398 -1.000000 +142399 -1.000000 +142400 -1.000000 +142401 -1.000000 +142402 -1.000000 +142403 -1.000000 +142404 -1.000000 +142405 -1.000000 +142406 -1.000000 +142409 -1.000000 +142411 -1.000000 +142413 -1.000000 +142414 -1.000000 +142416 -1.000000 +142419 -1.000000 +142421 -1.000000 +142422 -1.000000 +142423 -1.000000 +142425 -1.000000 +142426 -1.000000 +142427 -1.000000 +142428 -1.000000 +142429 -1.000000 +142430 -1.000000 +142431 -1.000000 +142433 -1.000000 +142434 -1.000000 +142435 -1.000000 +142436 -1.000000 +142437 -1.000000 +142438 -1.000000 +142439 -1.000000 +142440 -1.000000 +142441 -1.000000 +142442 -1.000000 +142443 -1.000000 +142444 -1.000000 +142445 -1.000000 +142446 -1.000000 +142447 -1.000000 +142448 -1.000000 +142449 -1.000000 +142450 -1.000000 +142451 -1.000000 +142452 -1.000000 +142453 -1.000000 +142454 -1.000000 +142455 -1.000000 +142456 -1.000000 +142457 -1.000000 +142460 -1.000000 +142462 -1.000000 +142463 -1.000000 +142467 -1.000000 +142473 -1.000000 +142475 -1.000000 +142476 -1.000000 +142477 -1.000000 +142478 -1.000000 +142479 -1.000000 +142480 -1.000000 +142481 -1.000000 +142483 -1.000000 +142484 -1.000000 +142485 -1.000000 +142486 -1.000000 +142487 -1.000000 +142489 -1.000000 +142580 -1.000000 +142581 -1.000000 +142582 -1.000000 +142583 -1.000000 +142584 -1.000000 +142585 -1.000000 +142586 -1.000000 +142590 -1.000000 +142591 -1.000000 +142592 -1.000000 +142593 -1.000000 +142594 -1.000000 +142596 -1.000000 +142598 -1.000000 +142599 -1.000000 +142600 -1.000000 +142601 -1.000000 +142602 -1.000000 +142603 -1.000000 +142604 -1.000000 +142605 -1.000000 +142606 -1.000000 +142615 -1.000000 +142616 -1.000000 +142619 -1.000000 +142625 -1.000000 +142626 -1.000000 +142627 -1.000000 +142628 -1.000000 +142629 -1.000000 +142631 -1.000000 +142632 -1.000000 +142634 -1.000000 +142636 -1.000000 +142637 -1.000000 +142638 -1.000000 +142639 -1.000000 +142640 -1.000000 +142641 -1.000000 +142642 -1.000000 +142643 -1.000000 +142644 -1.000000 +142645 -1.000000 +142650 -1.000000 +142651 -1.000000 +142652 -1.000000 +142654 -1.000000 +142655 -1.000000 +142660 -1.000000 +142663 -1.000000 +142665 -1.000000 +142666 -1.000000 +142668 -1.000000 +142670 -1.000000 +142671 -1.000000 +142672 -1.000000 +142676 -1.000000 +142677 -1.000000 +142679 -1.000000 +142680 -1.000000 +142681 -1.000000 +142682 -1.000000 +142683 -1.000000 +142684 -1.000000 +142685 -1.000000 +142686 -1.000000 +142688 -1.000000 +142697 -1.000000 +142698 -1.000000 +142704 -1.000000 +142705 -1.000000 +142709 -1.000000 +142710 -1.000000 +142712 -1.000000 +142713 -1.000000 +142714 -1.000000 +142715 -1.000000 +142717 -1.000000 +142718 -1.000000 +142720 -1.000000 +142722 -1.000000 +142723 -1.000000 +142724 -1.000000 +142725 -1.000000 +142726 -1.000000 +142728 -1.000000 +142732 -1.000000 +142757 -1.000000 +142761 -1.000000 +142762 -1.000000 +142763 -1.000000 +142766 -1.000000 +142768 -1.000000 +142769 -1.000000 +142773 -1.000000 +142774 -1.000000 +142776 -1.000000 +142777 -1.000000 +142778 -1.000000 +142779 -1.000000 +142782 -1.000000 +142783 -1.000000 +142786 -1.000000 +142787 -1.000000 +142790 -1.000000 +142791 -1.000000 +142792 -1.000000 +142794 -1.000000 +142795 -1.000000 +142796 -1.000000 +142797 -1.000000 +142798 -1.000000 +142799 -1.000000 +142800 -1.000000 +142801 -1.000000 +142802 -1.000000 +142803 -1.000000 +142804 -1.000000 +142806 -1.000000 +142808 -1.000000 +142809 -1.000000 +142810 -1.000000 +142811 -1.000000 +142812 -1.000000 +142813 -1.000000 +142814 -1.000000 +142815 -1.000000 +142816 -1.000000 +142817 -1.000000 +142818 -1.000000 +142819 -1.000000 +142820 -1.000000 +142822 -1.000000 +142823 -1.000000 +142824 -1.000000 +142825 -1.000000 +142826 -1.000000 +142827 -1.000000 +142828 -1.000000 +142829 -1.000000 +142830 -1.000000 +142831 -1.000000 +142832 -1.000000 +142833 -1.000000 +142834 -1.000000 +142835 -1.000000 +142836 -1.000000 +142837 -1.000000 +142838 -1.000000 +142839 -1.000000 +142861 -1.000000 +142862 -1.000000 +142863 -1.000000 +142864 -1.000000 +142865 -1.000000 +142866 -1.000000 +142867 -1.000000 +142868 -1.000000 +142869 -1.000000 +142870 -1.000000 +142871 -1.000000 +142874 -1.000000 +142878 -1.000000 +142880 -1.000000 +142881 -1.000000 +142882 -1.000000 +142891 -1.000000 +142892 -1.000000 +142893 -1.000000 +142894 -1.000000 +142895 -1.000000 +142896 -1.000000 +142897 -1.000000 +142898 -1.000000 +142899 -1.000000 +142900 -1.000000 +142901 -1.000000 +142902 -1.000000 +142903 -1.000000 +142904 -1.000000 +142905 -1.000000 +142906 -1.000000 +142907 -1.000000 +142908 -1.000000 +142909 -1.000000 +142910 -1.000000 +142911 -1.000000 +142912 -1.000000 +142918 -1.000000 +142919 -1.000000 +142920 -1.000000 +142921 -1.000000 +142922 -1.000000 +142923 -1.000000 +142924 -1.000000 +142925 -1.000000 +142926 -1.000000 +142927 -1.000000 +142928 -1.000000 +143703 -1.000000 +143704 -1.000000 +143705 -1.000000 +143708 -1.000000 +143709 -1.000000 +143713 -1.000000 +143714 -1.000000 +143715 -1.000000 +143716 -1.000000 +143717 -1.000000 +143718 -1.000000 +143719 -1.000000 +143720 -1.000000 +143721 -1.000000 +143724 -1.000000 +143725 -1.000000 +143726 -1.000000 +143727 -1.000000 +143728 -1.000000 +143729 -1.000000 +143730 -1.000000 +143731 -1.000000 +143732 -1.000000 +143733 -1.000000 +143736 -1.000000 +143737 -1.000000 +143739 -1.000000 +143741 -1.000000 +143742 -1.000000 +143743 -1.000000 +143745 -1.000000 +143746 -1.000000 +143747 -1.000000 +143748 -1.000000 +143750 -1.000000 +143751 -1.000000 +143752 -1.000000 +143753 -1.000000 +143754 -1.000000 +143755 -1.000000 +143756 -1.000000 +143757 -1.000000 +143758 -1.000000 +143759 -1.000000 +143760 -1.000000 +143761 -1.000000 +143762 -1.000000 +143763 -1.000000 +143764 -1.000000 +143765 -1.000000 +143767 -1.000000 +143768 -1.000000 +143769 -1.000000 +143770 -1.000000 +143771 -1.000000 +143772 -1.000000 +143773 -1.000000 +143774 -1.000000 +143775 -1.000000 +143776 -1.000000 +143777 -1.000000 +143778 -1.000000 +143779 -1.000000 +143780 -1.000000 +143781 -1.000000 +143783 -1.000000 +143784 -1.000000 +143785 -1.000000 +143786 -1.000000 +143787 -1.000000 +143788 -1.000000 +143789 -1.000000 +143790 -1.000000 +143791 -1.000000 +143792 -1.000000 +143793 -1.000000 +143794 -1.000000 +143795 -1.000000 +143796 -1.000000 +143797 -1.000000 +143798 -1.000000 +143799 -1.000000 +143800 -1.000000 +143801 -1.000000 +143802 -1.000000 +143803 -1.000000 +143804 -1.000000 +143805 -1.000000 +143806 -1.000000 +143807 -1.000000 +143808 -1.000000 +143809 -1.000000 +143810 -1.000000 +143811 -1.000000 +143812 -1.000000 +143813 -1.000000 +143814 -1.000000 +143815 -1.000000 +143816 -1.000000 +143817 -1.000000 +143818 -1.000000 +143819 -1.000000 +143820 -1.000000 +143821 -1.000000 +143822 -1.000000 +143823 -1.000000 +143824 -1.000000 +143825 -1.000000 +143826 -1.000000 +143827 -1.000000 +143828 -1.000000 +143829 -1.000000 +143830 -1.000000 +143831 -1.000000 +143832 -1.000000 +143833 -1.000000 +143834 -1.000000 +143837 -1.000000 +143839 -1.000000 +143840 -1.000000 +143841 -1.000000 +143842 -1.000000 +143843 -1.000000 +143845 -1.000000 +143846 -1.000000 +143847 -1.000000 +143848 -1.000000 +143849 -1.000000 +143850 -1.000000 +143851 -1.000000 +143852 -1.000000 +143853 -1.000000 +143854 -1.000000 +143855 -1.000000 +143856 -1.000000 +143857 -1.000000 +143858 -1.000000 +143859 -1.000000 +143860 -1.000000 +143861 -1.000000 +143862 -1.000000 +143863 -1.000000 +143864 -1.000000 +143865 -1.000000 +143866 -1.000000 +143867 -1.000000 +143868 -1.000000 +143869 -1.000000 +143870 -1.000000 +143871 -1.000000 +143872 -1.000000 +143873 -1.000000 +143875 -1.000000 +143876 -1.000000 +143877 -1.000000 +143880 -1.000000 +143881 -1.000000 +143884 -1.000000 +143885 -1.000000 +143887 -1.000000 +143889 -1.000000 +143890 -1.000000 +143891 -1.000000 +143892 -1.000000 +143893 -1.000000 +143894 -1.000000 +143897 -1.000000 +143898 -1.000000 +143899 -1.000000 +143900 -1.000000 +143901 -1.000000 +143902 -1.000000 +143903 -1.000000 +143904 -1.000000 +143905 -1.000000 +143906 -1.000000 +143907 -1.000000 +143908 -1.000000 +143909 -1.000000 +143910 -1.000000 +143911 -1.000000 +143912 -1.000000 +143913 -1.000000 +143914 -1.000000 +143915 -1.000000 +143916 -1.000000 +143917 -1.000000 +143918 -1.000000 +143919 -1.000000 +143920 -1.000000 +143921 -1.000000 +143922 -1.000000 +143923 -1.000000 +143924 -1.000000 +143925 -1.000000 +143926 -1.000000 +143927 -1.000000 +143928 -1.000000 +143929 -1.000000 +143930 -1.000000 +143931 -1.000000 +143932 -1.000000 +143933 -1.000000 +143934 -1.000000 +143935 -1.000000 +143936 -1.000000 +143937 -1.000000 +143938 -1.000000 +143939 -1.000000 +143940 -1.000000 +143941 -1.000000 +143967 -1.000000 +143968 -1.000000 +143972 -1.000000 +143973 -1.000000 +143976 -1.000000 +143977 -1.000000 +143978 -1.000000 +143979 -1.000000 +143980 -1.000000 +143981 -1.000000 +143982 -1.000000 +143983 -1.000000 +143984 -1.000000 +143988 -1.000000 +143998 -1.000000 +144000 -1.000000 +144001 -1.000000 +144004 -1.000000 +144005 -1.000000 +144011 -1.000000 +144012 -1.000000 +144013 -1.000000 +144014 -1.000000 +144015 -1.000000 +144020 -1.000000 +144022 -1.000000 +144026 -1.000000 +144027 -1.000000 +144028 -1.000000 +144029 -1.000000 +144030 -1.000000 +144033 -1.000000 +144034 -1.000000 +144035 -1.000000 +144036 -1.000000 +144037 -1.000000 +144038 -1.000000 +144039 -1.000000 +144040 -1.000000 +144057 -1.000000 +144058 -1.000000 +144059 -1.000000 +144061 -1.000000 +144062 -1.000000 +144065 -1.000000 +144073 -1.000000 +144074 -1.000000 +144075 -1.000000 +144076 -1.000000 +144077 -1.000000 +144078 -1.000000 +144079 -1.000000 +144080 -1.000000 +144083 -1.000000 +144084 -1.000000 +144085 -1.000000 +144086 -1.000000 +144087 -1.000000 +144088 -1.000000 +144093 -1.000000 +144094 -1.000000 +144095 -1.000000 +144097 -1.000000 +144101 -1.000000 +144102 -1.000000 +144104 -1.000000 +144105 -1.000000 +144106 -1.000000 +144107 -1.000000 +144108 -1.000000 +144109 -1.000000 +144110 -1.000000 +144115 -1.000000 +144116 -1.000000 +144117 -1.000000 +144118 -1.000000 +144119 -1.000000 +144120 -1.000000 +144121 -1.000000 +144122 -1.000000 +144123 -1.000000 +144124 -1.000000 +144125 -1.000000 +144126 -1.000000 +144127 -1.000000 +144128 -1.000000 +144129 -1.000000 +144130 -1.000000 +144131 -1.000000 +144132 -1.000000 +144135 -1.000000 +144136 -1.000000 +144137 -1.000000 +144141 -1.000000 +144142 -1.000000 +144143 -1.000000 +144144 -1.000000 +144145 -1.000000 +144146 -1.000000 +144147 -1.000000 +144149 -1.000000 +144150 -1.000000 +144151 -1.000000 +144152 -1.000000 +144153 -1.000000 +144154 -1.000000 +144155 -1.000000 +144156 -1.000000 +144160 -1.000000 +144161 -1.000000 +144162 -1.000000 +144163 -1.000000 +144166 -1.000000 +144167 -1.000000 +144169 -1.000000 +144171 -1.000000 +144174 -1.000000 +144183 -1.000000 +144185 -1.000000 +144186 -1.000000 +144188 -1.000000 +144192 -1.000000 +144197 -1.000000 +144198 -1.000000 +144199 -1.000000 +144201 -1.000000 +144202 -1.000000 +144203 -1.000000 +144205 -1.000000 +144206 -1.000000 +144208 -1.000000 +144211 -1.000000 +144213 -1.000000 +144214 -1.000000 +144216 -1.000000 +144223 -1.000000 +144224 -1.000000 +144225 -1.000000 +144226 -1.000000 +144227 -1.000000 +144228 -1.000000 +144229 -1.000000 +144230 -1.000000 +144231 -1.000000 +144232 -1.000000 +144233 -1.000000 +144234 -1.000000 +144236 -1.000000 +144237 -1.000000 +144238 -1.000000 +144239 -1.000000 +144240 -1.000000 +144241 -1.000000 +144242 -1.000000 +144243 -1.000000 +144244 -1.000000 +144245 -1.000000 +144246 -1.000000 +144247 -1.000000 +144248 -1.000000 +144249 -1.000000 +144250 -1.000000 +144251 -1.000000 +144252 -1.000000 +144253 -1.000000 +144254 -1.000000 +144255 -1.000000 +144256 -1.000000 +144261 -1.000000 +144263 -1.000000 +144264 -1.000000 +144265 -1.000000 +144266 -1.000000 +144267 -1.000000 +144268 -1.000000 +144269 -1.000000 +144270 -1.000000 +144271 -1.000000 +144272 -1.000000 +144273 -1.000000 +144274 -1.000000 +144275 -1.000000 +144278 -1.000000 +144279 -1.000000 +144280 -1.000000 +144281 -1.000000 +144282 -1.000000 +144283 -1.000000 +144284 -1.000000 +144285 -1.000000 +144286 -1.000000 +144287 -1.000000 +144288 -1.000000 +144289 -1.000000 +144290 -1.000000 +144291 -1.000000 +144298 -1.000000 +144299 -1.000000 +144300 -1.000000 +144301 -1.000000 +144302 -1.000000 +144303 -1.000000 +144304 -1.000000 +144305 -1.000000 +144306 -1.000000 +144307 -1.000000 +144308 -1.000000 +144309 -1.000000 +144310 -1.000000 +144311 -1.000000 +144313 -1.000000 +144314 -1.000000 +144315 -1.000000 +144316 -1.000000 +144317 -1.000000 +144318 -1.000000 +144319 -1.000000 +144320 -1.000000 +144321 -1.000000 +144322 -1.000000 +144323 -1.000000 +144331 -1.000000 +144332 -1.000000 +144333 -1.000000 +144334 -1.000000 +144335 -1.000000 +144336 -1.000000 +144337 -1.000000 +144338 -1.000000 +144340 -1.000000 +144341 -1.000000 +144342 -1.000000 +144343 -1.000000 +144344 -1.000000 +144345 -1.000000 +144346 -1.000000 +144347 -1.000000 +144348 -1.000000 +144349 -1.000000 +144350 -1.000000 +144351 -1.000000 +144352 -1.000000 +144353 -1.000000 +144354 -1.000000 +144356 -1.000000 +144357 -1.000000 +144358 -1.000000 +144359 -1.000000 +144360 -1.000000 +144361 -1.000000 +144365 -1.000000 +144366 -1.000000 +144367 -1.000000 +144368 -1.000000 +144372 -1.000000 +144373 -1.000000 +144374 -1.000000 +144376 -1.000000 +144377 -1.000000 +144378 -1.000000 +144380 -1.000000 +144383 -1.000000 +144389 -1.000000 +144392 -1.000000 +144393 -1.000000 +144405 -1.000000 +144406 -1.000000 +144408 -1.000000 +144409 -1.000000 +144410 -1.000000 +144412 -1.000000 +144413 -1.000000 +144414 -1.000000 +144415 -1.000000 +144416 -1.000000 +144417 -1.000000 +144418 -1.000000 +144419 -1.000000 +144420 -1.000000 +144424 -1.000000 +144426 -1.000000 +144431 -1.000000 +144443 -1.000000 +144444 -1.000000 +144445 -1.000000 +144446 -1.000000 +144448 -1.000000 +144449 -1.000000 +144450 -1.000000 +144451 -1.000000 +144452 -1.000000 +144453 -1.000000 +144454 -1.000000 +144455 -1.000000 +144456 -1.000000 +144457 -1.000000 +144461 -1.000000 +144462 -1.000000 +144463 -1.000000 +144464 -1.000000 +144465 -1.000000 +144466 -1.000000 +144467 -1.000000 +144468 -1.000000 +144469 -1.000000 +144470 -1.000000 +144471 -1.000000 +144472 -1.000000 +144473 -1.000000 +144474 -1.000000 +144475 -1.000000 +144476 -1.000000 +144477 -1.000000 +144478 -1.000000 +144479 -1.000000 +144480 -1.000000 +144481 -1.000000 +144482 -1.000000 +144483 -1.000000 +144484 -1.000000 +144485 -1.000000 +144486 -1.000000 +144487 -1.000000 +144488 -1.000000 +144489 -1.000000 +144490 -1.000000 +144491 -1.000000 +144492 -1.000000 +144506 -1.000000 +144507 -1.000000 +144508 -1.000000 +144510 -1.000000 +144511 -1.000000 +144512 -1.000000 +144513 -1.000000 +144514 -1.000000 +144516 -1.000000 +144518 -1.000000 +144519 -1.000000 +144522 -1.000000 +144523 -1.000000 +144528 -1.000000 +144529 -1.000000 +144533 -1.000000 +144536 -1.000000 +144546 -1.000000 +144547 -1.000000 +144549 -1.000000 +144550 -1.000000 +144552 -1.000000 +144554 -1.000000 +144557 -1.000000 +144558 -1.000000 +144565 -1.000000 +144566 -1.000000 +144567 -1.000000 +144568 -1.000000 +144569 -1.000000 +144570 -1.000000 +144571 -1.000000 +144572 -1.000000 +144573 -1.000000 +144574 -1.000000 +144575 -1.000000 +144576 -1.000000 +144577 -1.000000 +144578 -1.000000 +144579 -1.000000 +144673 -1.000000 +144678 -1.000000 +144684 -1.000000 +144688 -1.000000 +144693 -1.000000 +144702 -1.000000 +144703 -1.000000 +144709 -1.000000 +144712 -1.000000 +144714 -1.000000 +144715 -1.000000 +144716 -1.000000 +144717 -1.000000 +144718 -1.000000 +144719 -1.000000 +144720 -1.000000 +144721 -1.000000 +144723 -1.000000 +144724 -1.000000 +144727 -1.000000 +144729 -1.000000 +144730 -1.000000 +144735 -1.000000 +144737 -1.000000 +144739 -1.000000 +144740 -1.000000 +144742 -1.000000 +144743 -1.000000 +144744 -1.000000 +144745 -1.000000 +144746 -1.000000 +144747 -1.000000 +144748 -1.000000 +144749 -1.000000 +144750 -1.000000 +144751 -1.000000 +144752 -1.000000 +144753 -1.000000 +144754 -1.000000 +144757 -1.000000 +144762 -1.000000 +144765 -1.000000 +144768 -1.000000 +144770 -1.000000 +144771 -1.000000 +144773 -1.000000 +144774 -1.000000 +144778 -1.000000 +144781 -1.000000 +144782 -1.000000 +144784 -1.000000 +144786 -1.000000 +144787 -1.000000 +144788 -1.000000 +144789 -1.000000 +144790 -1.000000 +144791 -1.000000 +144800 -1.000000 +144801 -1.000000 +144802 -1.000000 +144804 -1.000000 +144807 -1.000000 +144810 -1.000000 +144816 -1.000000 +144818 -1.000000 +144830 -1.000000 +144853 -1.000000 +144854 -1.000000 +144855 -1.000000 +144856 -1.000000 +144857 -1.000000 +144858 -1.000000 +144859 -1.000000 +144860 -1.000000 +144863 -1.000000 +144864 -1.000000 +144865 -1.000000 +144866 -1.000000 +144867 -1.000000 +144868 -1.000000 +144869 -1.000000 +144870 -1.000000 +144871 -1.000000 +144872 -1.000000 +144873 -1.000000 +144883 -1.000000 +144884 -1.000000 +144885 -1.000000 +144886 -1.000000 +144887 -1.000000 +144888 -1.000000 +144889 -1.000000 +144890 -1.000000 +144891 -1.000000 +144892 -1.000000 +144893 -1.000000 +144895 -1.000000 +144899 -1.000000 +144902 -1.000000 +144903 -1.000000 +144907 -1.000000 +144908 -1.000000 +144912 -1.000000 +144913 -1.000000 +144914 -1.000000 +144915 -1.000000 +144916 -1.000000 +144917 -1.000000 +144918 -1.000000 +144919 -1.000000 +144920 -1.000000 +144921 -1.000000 +144922 -1.000000 +144923 -1.000000 +144925 -1.000000 +144926 -1.000000 +144927 -1.000000 +144928 -1.000000 +144929 -1.000000 +144930 -1.000000 +144933 -1.000000 +144934 -1.000000 +144935 -1.000000 +144936 -1.000000 +144937 -1.000000 +144938 -1.000000 +144939 -1.000000 +144940 -1.000000 +144941 -1.000000 +144942 -1.000000 +144943 -1.000000 +144944 -1.000000 +144945 -1.000000 +144946 -1.000000 +144947 -1.000000 +144948 -1.000000 +144949 -1.000000 +144950 -1.000000 +144951 -1.000000 +144952 -1.000000 +144953 -1.000000 +144954 -1.000000 +144956 -1.000000 +144958 -1.000000 +144959 -1.000000 +144960 -1.000000 +144961 -1.000000 +144963 -1.000000 +144964 -1.000000 +144973 -1.000000 +144974 -1.000000 +144975 -1.000000 +144976 -1.000000 +144977 -1.000000 +144978 -1.000000 +144979 -1.000000 +144980 -1.000000 +144981 -1.000000 +144983 -1.000000 +144984 -1.000000 +144985 -1.000000 +144986 -1.000000 +144987 -1.000000 +144988 -1.000000 +144989 -1.000000 +144990 -1.000000 +144991 -1.000000 +144992 -1.000000 +144993 -1.000000 +145000 -1.000000 +145001 -1.000000 +145002 -1.000000 +145008 -1.000000 +145012 -1.000000 +145024 -1.000000 +145025 -1.000000 +145028 -1.000000 +145030 -1.000000 +145035 -1.000000 +145038 -1.000000 +145039 -1.000000 +145041 -1.000000 +145042 -1.000000 +145043 -1.000000 +145044 -1.000000 +145045 -1.000000 +145046 -1.000000 +145047 -1.000000 +145048 -1.000000 +145049 -1.000000 +145051 -1.000000 +145052 -1.000000 +145053 -1.000000 +145054 -1.000000 +145055 -1.000000 +145056 -1.000000 +145057 -1.000000 +145058 -1.000000 +145059 -1.000000 +145060 -1.000000 +145061 -1.000000 +145063 -1.000000 +145065 -1.000000 +145066 -1.000000 +145067 -1.000000 +145069 -1.000000 +145072 -1.000000 +145073 -1.000000 +145074 -1.000000 +145076 -1.000000 +145077 -1.000000 +145079 -1.000000 +145082 -1.000000 +145083 -1.000000 +145085 -1.000000 +145086 -1.000000 +145088 -1.000000 +145091 -1.000000 +145093 -1.000000 +145094 -1.000000 +145098 -1.000000 +145102 -1.000000 +145103 -1.000000 +145104 -1.000000 +145105 -1.000000 +145106 -1.000000 +145107 -1.000000 +145110 -1.000000 +145111 -1.000000 +145117 -1.000000 +145123 -1.000000 +145125 -1.000000 +145137 -1.000000 +145138 -1.000000 +145140 -1.000000 +145142 -1.000000 +145143 -1.000000 +145145 -1.000000 +145146 -1.000000 +145147 -1.000000 +145148 -1.000000 +145149 -1.000000 +145157 -1.000000 +145161 -1.000000 +145162 -1.000000 +145166 -1.000000 +145167 -1.000000 +145170 -1.000000 +145171 -1.000000 +145172 -1.000000 +145173 -1.000000 +145174 -1.000000 +145175 -1.000000 +145176 -1.000000 +145177 -1.000000 +145178 -1.000000 +145179 -1.000000 +145180 -1.000000 +145181 -1.000000 +145182 -1.000000 +145183 -1.000000 +145184 -1.000000 +145185 -1.000000 +145186 -1.000000 +145187 -1.000000 +145188 -1.000000 +145189 -1.000000 +145190 -1.000000 +145191 -1.000000 +145192 -1.000000 +145193 -1.000000 +145194 -1.000000 +145195 -1.000000 +145196 -1.000000 +145197 -1.000000 +145198 -1.000000 +145199 -1.000000 +145200 -1.000000 +145201 -1.000000 +145202 -1.000000 +145203 -1.000000 +145205 -1.000000 +145206 -1.000000 +145207 -1.000000 +145208 -1.000000 +145209 -1.000000 +145214 -1.000000 +145215 -1.000000 +145216 -1.000000 +145217 -1.000000 +145218 -1.000000 +145219 -1.000000 +145220 -1.000000 +145221 -1.000000 +145222 -1.000000 +145223 -1.000000 +145224 -1.000000 +145225 -1.000000 +145226 -1.000000 +145227 -1.000000 +145228 -1.000000 +145229 -1.000000 +145230 -1.000000 +145231 -1.000000 +145232 -1.000000 +145233 -1.000000 +145234 -1.000000 +145236 -1.000000 +145241 -1.000000 +145242 -1.000000 +145243 -1.000000 +145245 -1.000000 +145296 -1.000000 +145298 -1.000000 +145299 -1.000000 +145300 -1.000000 +145302 -1.000000 +145303 -1.000000 +145305 -1.000000 +145306 -1.000000 +145307 -1.000000 +145308 -1.000000 +145309 -1.000000 +145310 -1.000000 +145311 -1.000000 +145312 -1.000000 +145313 -1.000000 +145314 -1.000000 +145315 -1.000000 +145316 -1.000000 +145317 -1.000000 +145318 -1.000000 +145319 -1.000000 +145322 -1.000000 +145323 -1.000000 +145324 -1.000000 +145329 -1.000000 +145332 -1.000000 +145333 -1.000000 +145334 -1.000000 +145339 -1.000000 +145344 -1.000000 +145346 -1.000000 +145349 -1.000000 +145350 -1.000000 +145352 -1.000000 +145354 -1.000000 +145355 -1.000000 +145356 -1.000000 +145357 -1.000000 +145358 -1.000000 +145359 -1.000000 +145360 -1.000000 +145361 -1.000000 +145362 -1.000000 +145364 -1.000000 +145371 -1.000000 +145389 -1.000000 +145393 -1.000000 +145394 -1.000000 +145395 -1.000000 +145405 -1.000000 +145414 -1.000000 +145418 -1.000000 +145423 -1.000000 +145424 -1.000000 +145433 -1.000000 +145434 -1.000000 +145435 -1.000000 +145436 -1.000000 +145437 -1.000000 +145438 -1.000000 +145439 -1.000000 +145440 -1.000000 +145441 -1.000000 +145442 -1.000000 +145444 -1.000000 +145445 -1.000000 +145446 -1.000000 +145447 -1.000000 +145448 -1.000000 +145449 -1.000000 +145451 -1.000000 +145452 -1.000000 +145453 -1.000000 +145455 -1.000000 +145456 -1.000000 +145457 -1.000000 +145458 -1.000000 +145459 -1.000000 +145460 -1.000000 +145461 -1.000000 +145462 -1.000000 +145463 -1.000000 +145465 -1.000000 +145466 -1.000000 +145468 -1.000000 +145470 -1.000000 +145471 -1.000000 +145472 -1.000000 +145473 -1.000000 +145474 -1.000000 +145477 -1.000000 +145478 -1.000000 +145482 -1.000000 +145485 -1.000000 +145487 -1.000000 +145488 -1.000000 +145489 -1.000000 +145492 -1.000000 +145494 -1.000000 +145499 -1.000000 +145512 -1.000000 +145513 -1.000000 +145520 -1.000000 +145521 -1.000000 +145523 -1.000000 +145524 -1.000000 +145530 -1.000000 +145542 -1.000000 +145545 -1.000000 +145546 -1.000000 +145551 -1.000000 +145552 -1.000000 +145553 -1.000000 +145555 -1.000000 +145556 -1.000000 +145557 -1.000000 +145558 -1.000000 +145560 -1.000000 +145561 -1.000000 +145567 -1.000000 +145568 -1.000000 +145569 -1.000000 +145570 -1.000000 +145575 -1.000000 +145577 -1.000000 +145582 -1.000000 +145583 -1.000000 +145586 -1.000000 +145587 -1.000000 +145598 -1.000000 +145599 -1.000000 +145633 -1.000000 +145635 -1.000000 +145643 -1.000000 +145664 -1.000000 +145667 -1.000000 +145668 -1.000000 +145669 -1.000000 +145670 -1.000000 +145671 -1.000000 +145672 -1.000000 +145673 -1.000000 +145674 -1.000000 +145675 -1.000000 +145676 -1.000000 +145677 -1.000000 +145678 -1.000000 +145679 -1.000000 +145680 -1.000000 +145683 -1.000000 +145684 -1.000000 +145685 -1.000000 +145686 -1.000000 +145687 -1.000000 +145690 -1.000000 +145692 -1.000000 +145698 -1.000000 +145699 -1.000000 +145700 -1.000000 +145701 -1.000000 +145702 -1.000000 +145703 -1.000000 +145705 -1.000000 +145706 -1.000000 +145707 -1.000000 +145708 -1.000000 +145709 -1.000000 +145710 -1.000000 +145711 -1.000000 +145712 -1.000000 +145713 -1.000000 +145714 -1.000000 +145715 -1.000000 +145717 -1.000000 +145718 -1.000000 +145720 -1.000000 +145722 -1.000000 +145723 -1.000000 +145724 -1.000000 +145725 -1.000000 +145726 -1.000000 +145727 -1.000000 +145728 -1.000000 +145729 -1.000000 +145730 -1.000000 +145731 -1.000000 +145732 -1.000000 +145733 -1.000000 +145736 -1.000000 +145737 -1.000000 +145738 -1.000000 +145739 -1.000000 +145740 -1.000000 +145741 -1.000000 +145742 -1.000000 +145743 -1.000000 +145744 -1.000000 +145745 -1.000000 +145746 -1.000000 +145747 -1.000000 +145749 -1.000000 +145750 -1.000000 +145751 -1.000000 +145752 -1.000000 +145753 -1.000000 +145754 -1.000000 +145755 -1.000000 +145756 -1.000000 +145757 -1.000000 +145758 -1.000000 +145759 -1.000000 +145760 -1.000000 +145761 -1.000000 +145762 -1.000000 +145764 -1.000000 +145765 -1.000000 +145776 -1.000000 +145777 -1.000000 +145778 -1.000000 +145779 -1.000000 +145780 -1.000000 +145781 -1.000000 +145782 -1.000000 +145783 -1.000000 +145785 -1.000000 +145786 -1.000000 +145787 -1.000000 +145788 -1.000000 +145789 -1.000000 +145790 -1.000000 +145791 -1.000000 +145793 -1.000000 +145794 -1.000000 +145795 -1.000000 +145796 -1.000000 +145797 -1.000000 +145798 -1.000000 +145799 -1.000000 +145800 -1.000000 +145801 -1.000000 +145802 -1.000000 +145803 -1.000000 +145804 -1.000000 +145805 -1.000000 +145806 -1.000000 +145807 -1.000000 +145808 -1.000000 +145809 -1.000000 +145810 -1.000000 +145815 -1.000000 +145817 -1.000000 +145819 -1.000000 +145820 -1.000000 +145826 -1.000000 +145828 -1.000000 +145830 -1.000000 +145831 -1.000000 +145832 -1.000000 +145835 -1.000000 +145837 -1.000000 +145838 -1.000000 +145839 -1.000000 +145840 -1.000000 +145841 -1.000000 +145842 -1.000000 +145843 -1.000000 +145844 -1.000000 +145846 -1.000000 +145849 -1.000000 +145851 -1.000000 +145852 -1.000000 +145853 -1.000000 +145854 -1.000000 +145855 -1.000000 +145856 -1.000000 +145859 -1.000000 +145861 -1.000000 +145863 -1.000000 +145864 -1.000000 +145865 -1.000000 +145867 -1.000000 +145868 -1.000000 +145869 -1.000000 +145870 -1.000000 +145871 -1.000000 +145872 -1.000000 +145873 -1.000000 +145874 -1.000000 +145875 -1.000000 +145876 -1.000000 +145877 -1.000000 +145878 -1.000000 +145879 -1.000000 +145880 -1.000000 +145882 -1.000000 +145885 -1.000000 +145886 -1.000000 +145888 -1.000000 +145892 -1.000000 +145893 -1.000000 +145894 -1.000000 +145895 -1.000000 +145896 -1.000000 +145897 -1.000000 +145898 -1.000000 +145899 -1.000000 +145900 -1.000000 +145901 -1.000000 +145902 -1.000000 +145903 -1.000000 +145904 -1.000000 +145905 -1.000000 +145907 -1.000000 +145908 -1.000000 +145909 -1.000000 +145910 -1.000000 +145911 -1.000000 +145914 -1.000000 +145915 -1.000000 +145918 -1.000000 +145919 -1.000000 +145923 -1.000000 +145924 -1.000000 +145925 -1.000000 +145927 -1.000000 +145928 -1.000000 +145930 -1.000000 +145932 -1.000000 +145933 -1.000000 +145935 -1.000000 +145936 -1.000000 +145937 -1.000000 +145938 -1.000000 +145939 -1.000000 +145940 -1.000000 +145942 -1.000000 +145943 -1.000000 +145944 -1.000000 +145945 -1.000000 +145946 -1.000000 +145947 -1.000000 +145948 -1.000000 +145949 -1.000000 +145951 -1.000000 +145952 -1.000000 +145953 -1.000000 +145954 -1.000000 +145958 -1.000000 +145959 -1.000000 +145960 -1.000000 +145961 -1.000000 +145962 -1.000000 +145963 -1.000000 +145964 -1.000000 +145965 -1.000000 +145966 -1.000000 +145967 -1.000000 +145968 -1.000000 +145969 -1.000000 +145970 -1.000000 +145971 -1.000000 +145972 -1.000000 +145973 -1.000000 +145974 -1.000000 +145975 -1.000000 +145976 -1.000000 +145977 -1.000000 +145978 -1.000000 +145979 -1.000000 +145980 -1.000000 +145981 -1.000000 +145982 -1.000000 +145983 -1.000000 +145984 -1.000000 +145985 -1.000000 +145986 -1.000000 +145987 -1.000000 +145988 -1.000000 +145989 -1.000000 +145990 -1.000000 +145992 -1.000000 +145993 -1.000000 +145994 -1.000000 +145996 -1.000000 +145997 -1.000000 +145998 -1.000000 +146001 -1.000000 +146002 -1.000000 +146003 -1.000000 +146004 -1.000000 +146005 -1.000000 +146006 -1.000000 +146007 -1.000000 +146008 -1.000000 +146009 -1.000000 +146010 -1.000000 +146011 -1.000000 +146012 -1.000000 +146013 -1.000000 +146016 -1.000000 +146017 -1.000000 +146018 -1.000000 +146019 -1.000000 +146020 -1.000000 +146021 -1.000000 +146022 -1.000000 +146023 -1.000000 +146027 -1.000000 +146028 -1.000000 +146029 -1.000000 +146031 -1.000000 +146032 -1.000000 +146034 -1.000000 +146035 -1.000000 +146037 -1.000000 +146039 -1.000000 +146040 -1.000000 +146041 -1.000000 +146043 -1.000000 +146044 -1.000000 +146045 -1.000000 +146047 -1.000000 +146048 -1.000000 +146050 -1.000000 +146051 -1.000000 +146053 -1.000000 +146054 -1.000000 +146055 -1.000000 +146056 -1.000000 +146057 -1.000000 +146058 -1.000000 +146059 -1.000000 +146060 -1.000000 +146065 -1.000000 +146073 -1.000000 +146074 -1.000000 +146075 -1.000000 +146076 -1.000000 +146077 -1.000000 +146078 -1.000000 +146079 -1.000000 +146080 -1.000000 +146082 -1.000000 +146083 -1.000000 +146084 -1.000000 +146085 -1.000000 +146086 -1.000000 +146088 -1.000000 +146089 -1.000000 +146090 -1.000000 +146091 -1.000000 +146093 -1.000000 +146094 -1.000000 +146095 -1.000000 +146096 -1.000000 +146097 -1.000000 +146098 -1.000000 +146099 -1.000000 +146101 -1.000000 +146102 -1.000000 +146104 -1.000000 +146105 -1.000000 +146106 -1.000000 +146107 -1.000000 +146108 -1.000000 +146113 -1.000000 +146114 -1.000000 +146116 -1.000000 +146117 -1.000000 +146118 -1.000000 +146119 -1.000000 +146120 -1.000000 +146121 -1.000000 +146122 -1.000000 +146123 -1.000000 +146126 -1.000000 +146127 -1.000000 +146128 -1.000000 +146129 -1.000000 +146130 -1.000000 +146133 -1.000000 +146134 -1.000000 +146135 -1.000000 +146138 -1.000000 +146143 -1.000000 +146146 -1.000000 +146149 -1.000000 +146150 -1.000000 +146151 -1.000000 +146152 -1.000000 +146153 -1.000000 +146154 -1.000000 +146158 -1.000000 +146159 -1.000000 +146160 -1.000000 +146161 -1.000000 +146162 -1.000000 +146163 -1.000000 +146164 -1.000000 +146165 -1.000000 +146166 -1.000000 +146167 -1.000000 +146168 -1.000000 +146169 -1.000000 +146170 -1.000000 +146171 -1.000000 +146172 -1.000000 +146173 -1.000000 +146174 -1.000000 +146175 -1.000000 +146176 -1.000000 +146177 -1.000000 +146178 -1.000000 +146180 -1.000000 +146183 -1.000000 +146188 -1.000000 +146189 -1.000000 +146191 -1.000000 +146197 -1.000000 +146198 -1.000000 +146199 -1.000000 +146212 -1.000000 +146213 -1.000000 +146269 -1.000000 +146270 -1.000000 +146272 -1.000000 +146273 -1.000000 +146278 -1.000000 +146279 -1.000000 +146280 -1.000000 +146281 -1.000000 +146284 -1.000000 +146285 -1.000000 +146286 -1.000000 +146290 -1.000000 +146291 -1.000000 +146292 -1.000000 +146294 -1.000000 +146295 -1.000000 +146296 -1.000000 +146297 -1.000000 +146298 -1.000000 +146299 -1.000000 +146300 -1.000000 +146312 -1.000000 +146313 -1.000000 +146315 -1.000000 +146316 -1.000000 +146317 -1.000000 +146318 -1.000000 +146319 -1.000000 +146336 -1.000000 +146338 -1.000000 +146339 -1.000000 +146340 -1.000000 +146341 -1.000000 +146342 -1.000000 +146343 -1.000000 +146344 -1.000000 +146345 -1.000000 +146346 -1.000000 +146347 -1.000000 +146348 -1.000000 +146349 -1.000000 +146350 -1.000000 +146351 -1.000000 +146352 -1.000000 +146353 -1.000000 +146354 -1.000000 +146355 -1.000000 +146356 -1.000000 +146357 -1.000000 +146358 -1.000000 +146359 -1.000000 +146360 -1.000000 +146361 -1.000000 +146362 -1.000000 +146363 -1.000000 +146365 -1.000000 +146366 -1.000000 +146367 -1.000000 +146368 -1.000000 +146369 -1.000000 +146370 -1.000000 +146371 -1.000000 +146372 -1.000000 +146373 -1.000000 +146374 -1.000000 +146375 -1.000000 +146376 -1.000000 +146378 -1.000000 +146379 -1.000000 +146381 -1.000000 +146384 -1.000000 +146385 -1.000000 +146406 -1.000000 +146407 -1.000000 +146408 -1.000000 +146409 -1.000000 +146410 -1.000000 +146411 -1.000000 +146412 -1.000000 +146413 -1.000000 +146415 -1.000000 +146416 -1.000000 +146417 -1.000000 +146418 -1.000000 +146419 -1.000000 +146420 -1.000000 +146422 -1.000000 +146425 -1.000000 +146427 -1.000000 +146428 -1.000000 +146429 -1.000000 +146430 -1.000000 +146436 -1.000000 +146439 -1.000000 +146440 -1.000000 +146441 -1.000000 +146443 -1.000000 +146444 -1.000000 +146446 -1.000000 +146447 -1.000000 +146448 -1.000000 +146449 -1.000000 +146450 -1.000000 +146451 -1.000000 +146452 -1.000000 +146453 -1.000000 +146454 -1.000000 +146455 -1.000000 +146456 -1.000000 +146457 -1.000000 +146458 -1.000000 +146459 -1.000000 +146461 -1.000000 +146462 -1.000000 +146463 -1.000000 +146467 -1.000000 +146469 -1.000000 +146470 -1.000000 +146471 -1.000000 +146472 -1.000000 +146473 -1.000000 +146474 -1.000000 +146476 -1.000000 +146480 -1.000000 +146481 -1.000000 +146483 -1.000000 +146485 -1.000000 +146486 -1.000000 +146488 -1.000000 +146489 -1.000000 +146490 -1.000000 +146491 -1.000000 +146492 -1.000000 +146493 -1.000000 +146501 -1.000000 +146502 -1.000000 +146503 -1.000000 +146504 -1.000000 +146505 -1.000000 +146506 -1.000000 +146507 -1.000000 +146508 -1.000000 +146509 -1.000000 +146510 -1.000000 +146511 -1.000000 +146512 -1.000000 +146513 -1.000000 +146514 -1.000000 +146520 -1.000000 +146521 -1.000000 +146524 -1.000000 +146525 -1.000000 +146526 -1.000000 +146530 -1.000000 +146531 -1.000000 +146534 -1.000000 +146535 -1.000000 +146536 -1.000000 +146537 -1.000000 +146538 -1.000000 +146539 -1.000000 +146540 -1.000000 +146541 -1.000000 +146542 -1.000000 +146544 -1.000000 +146545 -1.000000 +146548 -1.000000 +146549 -1.000000 +146551 -1.000000 +146552 -1.000000 +146553 -1.000000 +146554 -1.000000 +146555 -1.000000 +146556 -1.000000 +146557 -1.000000 +146558 -1.000000 +146559 -1.000000 +146563 -1.000000 +146564 -1.000000 +146565 -1.000000 +146566 -1.000000 +146567 -1.000000 +146568 -1.000000 +146569 -1.000000 +146570 -1.000000 +146571 -1.000000 +146573 -1.000000 +146574 -1.000000 +146575 -1.000000 +146576 -1.000000 +146577 -1.000000 +146578 -1.000000 +146579 -1.000000 +146580 -1.000000 +146581 -1.000000 +146582 -1.000000 +146588 -1.000000 +146589 -1.000000 +146590 -1.000000 +146591 -1.000000 +146592 -1.000000 +146593 -1.000000 +146595 -1.000000 +146596 -1.000000 +146597 -1.000000 +146600 -1.000000 +146601 -1.000000 +146602 -1.000000 +146603 -1.000000 +146604 -1.000000 +146605 -1.000000 +146606 -1.000000 +146607 -1.000000 +146611 -1.000000 +146612 -1.000000 +146613 -1.000000 +146615 -1.000000 +146616 -1.000000 +146617 -1.000000 +146618 -1.000000 +146619 -1.000000 +146622 -1.000000 +146624 -1.000000 +146625 -1.000000 +146629 -1.000000 +146631 -1.000000 +146632 -1.000000 +146636 -1.000000 +146637 -1.000000 +146638 -1.000000 +146639 -1.000000 +146640 -1.000000 +146641 -1.000000 +146643 -1.000000 +146652 -1.000000 +146653 -1.000000 +146656 -1.000000 +146661 -1.000000 +146662 -1.000000 +146664 -1.000000 +146665 -1.000000 +146666 -1.000000 +146671 -1.000000 +146673 -1.000000 +146674 -1.000000 +146675 -1.000000 +146677 -1.000000 +146681 -1.000000 +146682 -1.000000 +146702 -1.000000 +146704 -1.000000 +146710 -1.000000 +146713 -1.000000 +146716 -1.000000 +146717 -1.000000 +146718 -1.000000 +146719 -1.000000 +146720 -1.000000 +146721 -1.000000 +146722 -1.000000 +146723 -1.000000 +146724 -1.000000 +146725 -1.000000 +146726 -1.000000 +146727 -1.000000 +146728 -1.000000 +146729 -1.000000 +146730 -1.000000 +146731 -1.000000 +146732 -1.000000 +146733 -1.000000 +146734 -1.000000 +146735 -1.000000 +146736 -1.000000 +146737 -1.000000 +146738 -1.000000 +146739 -1.000000 +146740 -1.000000 +146741 -1.000000 +146742 -1.000000 +146743 -1.000000 +146744 -1.000000 +146745 -1.000000 +146746 -1.000000 +146747 -1.000000 +146748 -1.000000 +146749 -1.000000 +146750 -1.000000 +146751 -1.000000 +146752 -1.000000 +146753 -1.000000 +146754 -1.000000 +146755 -1.000000 +146756 -1.000000 +146757 -1.000000 +146758 -1.000000 +146759 -1.000000 +146761 -1.000000 +146762 -1.000000 +146763 -1.000000 +146764 -1.000000 +146765 -1.000000 +146766 -1.000000 +146767 -1.000000 +146770 -1.000000 +146772 -1.000000 +146773 -1.000000 +146774 -1.000000 +146775 -1.000000 +146776 -1.000000 +146777 -1.000000 +146778 -1.000000 +146779 -1.000000 +146780 -1.000000 +146781 -1.000000 +146782 -1.000000 +146784 -1.000000 +146785 -1.000000 +146788 -1.000000 +146789 -1.000000 +146803 -1.000000 +146807 -1.000000 +146809 -1.000000 +146812 -1.000000 +146814 -1.000000 +146815 -1.000000 +146818 -1.000000 +146820 -1.000000 +146821 -1.000000 +146822 -1.000000 +146823 -1.000000 +146824 -1.000000 +146825 -1.000000 +146835 -1.000000 +146838 -1.000000 +146839 -1.000000 +146840 -1.000000 +146841 -1.000000 +146842 -1.000000 +146846 -1.000000 +146848 -1.000000 +146850 -1.000000 +146857 -1.000000 +146863 -1.000000 +146864 -1.000000 +146865 -1.000000 +146868 -1.000000 +146869 -1.000000 +146870 -1.000000 +146871 -1.000000 +146875 -1.000000 +146881 -1.000000 +146882 -1.000000 +146883 -1.000000 +146884 -1.000000 +146885 -1.000000 +146886 -1.000000 +146887 -1.000000 +146888 -1.000000 +146889 -1.000000 +146890 -1.000000 +146891 -1.000000 +146892 -1.000000 +146893 -1.000000 +146894 -1.000000 +146895 -1.000000 +146896 -1.000000 +146897 -1.000000 +146898 -1.000000 +146899 -1.000000 +146900 -1.000000 +146907 -1.000000 +146908 -1.000000 +146910 -1.000000 +146915 -1.000000 +146917 -1.000000 +146928 -1.000000 +146936 -1.000000 +146939 -1.000000 +146942 -1.000000 +146944 -1.000000 +146945 -1.000000 +146946 -1.000000 +146948 -1.000000 +146950 -1.000000 +146951 -1.000000 +146952 -1.000000 +146954 -1.000000 +146955 -1.000000 +146956 -1.000000 +146957 -1.000000 +146960 -1.000000 +146963 -1.000000 +146964 -1.000000 +146965 -1.000000 +146967 -1.000000 +146968 -1.000000 +146969 -1.000000 +146970 -1.000000 +146971 -1.000000 +146975 -1.000000 +146977 -1.000000 +146980 -1.000000 +146981 -1.000000 +146982 -1.000000 +146983 -1.000000 +146984 -1.000000 +146990 -1.000000 +146993 -1.000000 +146994 -1.000000 +146997 -1.000000 +146998 -1.000000 +146999 -1.000000 +147000 -1.000000 +147001 -1.000000 +147005 -1.000000 +147007 -1.000000 +147012 -1.000000 +147020 -1.000000 +147021 -1.000000 +147023 -1.000000 +147041 -1.000000 +147042 -1.000000 +147043 -1.000000 +147051 -1.000000 +147054 -1.000000 +147055 -1.000000 +147056 -1.000000 +147057 -1.000000 +147058 -1.000000 +147059 -1.000000 +147061 -1.000000 +147063 -1.000000 +147064 -1.000000 +147065 -1.000000 +147066 -1.000000 +147071 -1.000000 +147073 -1.000000 +147076 -1.000000 +147077 -1.000000 +147078 -1.000000 +147083 -1.000000 +147086 -1.000000 +147087 -1.000000 +147089 -1.000000 +147093 -1.000000 +147094 -1.000000 +147097 -1.000000 +147098 -1.000000 +147106 -1.000000 +147108 -1.000000 +147109 -1.000000 +147113 -1.000000 +147115 -1.000000 +147116 -1.000000 +147119 -1.000000 +147120 -1.000000 +147121 -1.000000 +147122 -1.000000 +147126 -1.000000 +147127 -1.000000 +147128 -1.000000 +147129 -1.000000 +147130 -1.000000 +147131 -1.000000 +147133 -1.000000 +147134 -1.000000 +147135 -1.000000 +147137 -1.000000 +147138 -1.000000 +147139 -1.000000 +147140 -1.000000 +147141 -1.000000 +147144 -1.000000 +147145 -1.000000 +147149 -1.000000 +147150 -1.000000 +147151 -1.000000 +147152 -1.000000 +147153 -1.000000 +147154 -1.000000 +147155 -1.000000 +147156 -1.000000 +147157 -1.000000 +147158 -1.000000 +147159 -1.000000 +147160 -1.000000 +147162 -1.000000 +147163 -1.000000 +147165 -1.000000 +147166 -1.000000 +147177 -1.000000 +147180 -1.000000 +147182 -1.000000 +147186 -1.000000 +147187 -1.000000 +147188 -1.000000 +147193 -1.000000 +147195 -1.000000 +147196 -1.000000 +147197 -1.000000 +147198 -1.000000 +147217 -1.000000 +147218 -1.000000 +147219 -1.000000 +147228 -1.000000 +147229 -1.000000 +147230 -1.000000 +147231 -1.000000 +147232 -1.000000 +147257 -1.000000 +147258 -1.000000 +147259 -1.000000 +147260 -1.000000 +147261 -1.000000 +147262 -1.000000 +147264 -1.000000 +147265 -1.000000 +147267 -1.000000 +147274 -1.000000 +147275 -1.000000 +147276 -1.000000 +147277 -1.000000 +147281 -1.000000 +147282 -1.000000 +147283 -1.000000 +147285 -1.000000 +147288 -1.000000 +147290 -1.000000 +147293 -1.000000 +147327 -1.000000 +147330 -1.000000 +147331 -1.000000 +147332 -1.000000 +147334 -1.000000 +147343 -1.000000 +147346 -1.000000 +147349 -1.000000 +147354 -1.000000 +147367 -1.000000 +147368 -1.000000 +147369 -1.000000 +147370 -1.000000 +147371 -1.000000 +147372 -1.000000 +147373 -1.000000 +147374 -1.000000 +147375 -1.000000 +147376 -1.000000 +147377 -1.000000 +147378 -1.000000 +147379 -1.000000 +147380 -1.000000 +147381 -1.000000 +147382 -1.000000 +147383 -1.000000 +147384 -1.000000 +147385 -1.000000 +147391 -1.000000 +147392 -1.000000 +147394 -1.000000 +147396 -1.000000 +147397 -1.000000 +147398 -1.000000 +147399 -1.000000 +147402 -1.000000 +147404 -1.000000 +147405 -1.000000 +147407 -1.000000 +147408 -1.000000 +147410 -1.000000 +147411 -1.000000 +147412 -1.000000 +147413 -1.000000 +147414 -1.000000 +147415 -1.000000 +147416 -1.000000 +147417 -1.000000 +147418 -1.000000 +147419 -1.000000 +147420 -1.000000 +147421 -1.000000 +147422 -1.000000 +147423 -1.000000 +147424 -1.000000 +147425 -1.000000 +147426 -1.000000 +147428 -1.000000 +147429 -1.000000 +147430 -1.000000 +147432 -1.000000 +147436 -1.000000 +147441 -1.000000 +147455 -1.000000 +147456 -1.000000 +147457 -1.000000 +147459 -1.000000 +147460 -1.000000 +147461 -1.000000 +147462 -1.000000 +147464 -1.000000 +147465 -1.000000 +147466 -1.000000 +147467 -1.000000 +147468 -1.000000 +147469 -1.000000 +147512 -1.000000 +147518 -1.000000 +147519 -1.000000 +147520 -1.000000 +147521 -1.000000 +147522 -1.000000 +147523 -1.000000 +147524 -1.000000 +147525 -1.000000 +147526 -1.000000 +147527 -1.000000 +147529 -1.000000 +147530 -1.000000 +147531 -1.000000 +147532 -1.000000 +147533 -1.000000 +147534 -1.000000 +147535 -1.000000 +147582 -1.000000 +147587 -1.000000 +147588 -1.000000 +147589 -1.000000 +147592 -1.000000 +147594 -1.000000 +147596 -1.000000 +147597 -1.000000 +147598 -1.000000 +147599 -1.000000 +147600 -1.000000 +147603 -1.000000 +147607 -1.000000 +147608 -1.000000 +147609 -1.000000 +147610 -1.000000 +147615 -1.000000 +147616 -1.000000 +147617 -1.000000 +147618 -1.000000 +147619 -1.000000 +147620 -1.000000 +147621 -1.000000 +147622 -1.000000 +147623 -1.000000 +147624 -1.000000 +147625 -1.000000 +147626 -1.000000 +147627 -1.000000 +147628 -1.000000 +147629 -1.000000 +147630 -1.000000 +147631 -1.000000 +147632 -1.000000 +147633 -1.000000 +147634 -1.000000 +147639 -1.000000 +147640 -1.000000 +147642 -1.000000 +147645 -1.000000 +147646 -1.000000 +147647 -1.000000 +147648 -1.000000 +147649 -1.000000 +147650 -1.000000 +147651 -1.000000 +147652 -1.000000 +147653 -1.000000 +147656 -1.000000 +147657 -1.000000 +147658 -1.000000 +147659 -1.000000 +147660 -1.000000 +147661 -1.000000 +147662 -1.000000 +147663 -1.000000 +147664 -1.000000 +147665 -1.000000 +147667 -1.000000 +147670 -1.000000 +147671 -1.000000 +147673 -1.000000 +147675 -1.000000 +147676 -1.000000 +147677 -1.000000 +147678 -1.000000 +147680 -1.000000 +147681 -1.000000 +147682 -1.000000 +147684 -1.000000 +147685 -1.000000 +147686 -1.000000 +147689 -1.000000 +147690 -1.000000 +147691 -1.000000 +147692 -1.000000 +147693 -1.000000 +147694 -1.000000 +147695 -1.000000 +147696 -1.000000 +147697 -1.000000 +147699 -1.000000 +147700 -1.000000 +147701 -1.000000 +147703 -1.000000 +147704 -1.000000 +147705 -1.000000 +147707 -1.000000 +147708 -1.000000 +147709 -1.000000 +147714 -1.000000 +147715 -1.000000 +147717 -1.000000 +147720 -1.000000 +147721 -1.000000 +147722 -1.000000 +147723 -1.000000 +147724 -1.000000 +147725 -1.000000 +147726 -1.000000 +147727 -1.000000 +147728 -1.000000 +147729 -1.000000 +147730 -1.000000 +147731 -1.000000 +147732 -1.000000 +147733 -1.000000 +147734 -1.000000 +147736 -1.000000 +147737 -1.000000 +147739 -1.000000 +147740 -1.000000 +147742 -1.000000 +148158 -1.000000 +148159 -1.000000 +148160 -1.000000 +148161 -1.000000 +148164 -1.000000 +148165 -1.000000 +148166 -1.000000 +148167 -1.000000 +148169 -1.000000 +148170 -1.000000 +148172 -1.000000 +148173 -1.000000 +148174 -1.000000 +148175 -1.000000 +148176 -1.000000 +148177 -1.000000 +148179 -1.000000 +148180 -1.000000 +148208 -1.000000 +148209 -1.000000 +148210 -1.000000 +148211 -1.000000 +148212 -1.000000 +148214 -1.000000 +148215 -1.000000 +148218 -1.000000 +148219 -1.000000 +148220 -1.000000 +148221 -1.000000 +148222 -1.000000 +148223 -1.000000 +148224 -1.000000 +148225 -1.000000 +148226 -1.000000 +148227 -1.000000 +148228 -1.000000 +148229 -1.000000 +148230 -1.000000 +148231 -1.000000 +148232 -1.000000 +148233 -1.000000 +148234 -1.000000 +148235 -1.000000 +148236 -1.000000 +148237 -1.000000 +148238 -1.000000 +148239 -1.000000 +148250 -1.000000 +148255 -1.000000 +148258 -1.000000 +148261 -1.000000 +148262 -1.000000 +148263 -1.000000 +148264 -1.000000 +148265 -1.000000 +148266 -1.000000 +148267 -1.000000 +148268 -1.000000 +148270 -1.000000 +148271 -1.000000 +148272 -1.000000 +148273 -1.000000 +148274 -1.000000 +148275 -1.000000 +148284 -1.000000 +148285 -1.000000 +148288 -1.000000 +148289 -1.000000 +148290 -1.000000 +148291 -1.000000 +148292 -1.000000 +148293 -1.000000 +148294 -1.000000 +148295 -1.000000 +148296 -1.000000 +148297 -1.000000 +148307 -1.000000 +148308 -1.000000 +148309 -1.000000 +148311 -1.000000 +148312 -1.000000 +148313 -1.000000 +148314 -1.000000 +148318 -1.000000 +148319 -1.000000 +148320 -1.000000 +148321 -1.000000 +148323 -1.000000 +148324 -1.000000 +148325 -1.000000 +148327 -1.000000 +148335 -1.000000 +148336 -1.000000 +148337 -1.000000 +148341 -1.000000 +148344 -1.000000 +148346 -1.000000 +148347 -1.000000 +148348 -1.000000 +148349 -1.000000 +148350 -1.000000 +148351 -1.000000 +148352 -1.000000 +148353 -1.000000 +148354 -1.000000 +148355 -1.000000 +148356 -1.000000 +148357 -1.000000 +148359 -1.000000 +148360 -1.000000 +148361 -1.000000 +148362 -1.000000 +148363 -1.000000 +148364 -1.000000 +148365 -1.000000 +148368 -1.000000 +148369 -1.000000 +148370 -1.000000 +148376 -1.000000 +148377 -1.000000 +148378 -1.000000 +148379 -1.000000 +148381 -1.000000 +148382 -1.000000 +148384 -1.000000 +148385 -1.000000 +148386 -1.000000 +148387 -1.000000 +148388 -1.000000 +148450 -1.000000 +148451 -1.000000 +148452 -1.000000 +148453 -1.000000 +148455 -1.000000 +148456 -1.000000 +148457 -1.000000 +148458 -1.000000 +148459 -1.000000 +148460 -1.000000 +148462 -1.000000 +148463 -1.000000 +148464 -1.000000 +148465 -1.000000 +148466 -1.000000 +148467 -1.000000 +148472 -1.000000 +148473 -1.000000 +148474 -1.000000 +148475 -1.000000 +148476 -1.000000 +148477 -1.000000 +148478 -1.000000 +148479 -1.000000 +148490 -1.000000 +148491 -1.000000 +148493 -1.000000 +148495 -1.000000 +148496 -1.000000 +148497 -1.000000 +148500 -1.000000 +148501 -1.000000 +148511 -1.000000 +148512 -1.000000 +148513 -1.000000 +148514 -1.000000 +148515 -1.000000 +148516 -1.000000 +148517 -1.000000 +148527 -1.000000 +148528 -1.000000 +148529 -1.000000 +148530 -1.000000 +148532 -1.000000 +148533 -1.000000 +148534 -1.000000 +148535 -1.000000 +148536 -1.000000 +148537 -1.000000 +148538 -1.000000 +148539 -1.000000 +148540 -1.000000 +148541 -1.000000 +148542 -1.000000 +148546 -1.000000 +148547 -1.000000 +148548 -1.000000 +148549 -1.000000 +148550 -1.000000 +148551 -1.000000 +148552 -1.000000 +148553 -1.000000 +148555 -1.000000 +148557 -1.000000 +148558 -1.000000 +148559 -1.000000 +148560 -1.000000 +148561 -1.000000 +148562 -1.000000 +148563 -1.000000 +148564 -1.000000 +148565 -1.000000 +148566 -1.000000 +148567 -1.000000 +148568 -1.000000 +148569 -1.000000 +148570 -1.000000 +148571 -1.000000 +148572 -1.000000 +148573 -1.000000 +148574 -1.000000 +148575 -1.000000 +148576 -1.000000 +148579 -1.000000 +148583 -1.000000 +148584 -1.000000 +148585 -1.000000 +148586 -1.000000 +148587 -1.000000 +148588 -1.000000 +148589 -1.000000 +148590 -1.000000 +148591 -1.000000 +148592 -1.000000 +148594 -1.000000 +148595 -1.000000 +148596 -1.000000 +148597 -1.000000 +148598 -1.000000 +148599 -1.000000 +148600 -1.000000 +148601 -1.000000 +148602 -1.000000 +148603 -1.000000 +148604 -1.000000 +148605 -1.000000 +148606 -1.000000 +148614 -1.000000 +148615 -1.000000 +148616 -1.000000 +148619 -1.000000 +148622 -1.000000 +148624 -1.000000 +148626 -1.000000 +148627 -1.000000 +148629 -1.000000 +148630 -1.000000 +148631 -1.000000 +148632 -1.000000 +148633 -1.000000 +148634 -1.000000 +148635 -1.000000 +148636 -1.000000 +148637 -1.000000 +148638 -1.000000 +148639 -1.000000 +148640 -1.000000 +148641 -1.000000 +148642 -1.000000 +148653 -1.000000 +148654 -1.000000 +148656 -1.000000 +148658 -1.000000 +148659 -1.000000 +148661 -1.000000 +148662 -1.000000 +148664 -1.000000 +148665 -1.000000 +148671 -1.000000 +148672 -1.000000 +148673 -1.000000 +148674 -1.000000 +148675 -1.000000 +148679 -1.000000 +148680 -1.000000 +148681 -1.000000 +148682 -1.000000 +148683 -1.000000 +148684 -1.000000 +148687 -1.000000 +148688 -1.000000 +148689 -1.000000 +148690 -1.000000 +148691 -1.000000 +148692 -1.000000 +148693 -1.000000 +148694 -1.000000 +148695 -1.000000 +148696 -1.000000 +148697 -1.000000 +148698 -1.000000 +148704 -1.000000 +148705 -1.000000 +148706 -1.000000 +148709 -1.000000 +148712 -1.000000 +148715 -1.000000 +148717 -1.000000 +148718 -1.000000 +148730 -1.000000 +148734 -1.000000 +148738 -1.000000 +148742 -1.000000 +148745 -1.000000 +148746 -1.000000 +148747 -1.000000 +148749 -1.000000 +148750 -1.000000 +148756 -1.000000 +148764 -1.000000 +148766 -1.000000 +148768 -1.000000 +148772 -1.000000 +148773 -1.000000 +148774 -1.000000 +148775 -1.000000 +148776 -1.000000 +148777 -1.000000 +148778 -1.000000 +148779 -1.000000 +148780 -1.000000 +148781 -1.000000 +148783 -1.000000 +148784 -1.000000 +148785 -1.000000 +148786 -1.000000 +148787 -1.000000 +148788 -1.000000 +148790 -1.000000 +148791 -1.000000 +148792 -1.000000 +148793 -1.000000 +148794 -1.000000 +148796 -1.000000 +148797 -1.000000 +148798 -1.000000 +148799 -1.000000 +148800 -1.000000 +148801 -1.000000 +148802 -1.000000 +148803 -1.000000 +148804 -1.000000 +148805 -1.000000 +148806 -1.000000 +148807 -1.000000 +148835 -1.000000 +148840 -1.000000 +148842 -1.000000 +148844 -1.000000 +148846 -1.000000 +148850 -1.000000 +148851 -1.000000 +148852 -1.000000 +148853 -1.000000 +148854 -1.000000 +148855 -1.000000 +148864 -1.000000 +148865 -1.000000 +148866 -1.000000 +148867 -1.000000 +148868 -1.000000 +148869 -1.000000 +148870 -1.000000 +148873 -1.000000 +148874 -1.000000 +148876 -1.000000 +148877 -1.000000 +148878 -1.000000 +148879 -1.000000 +148880 -1.000000 +148882 -1.000000 +148883 -1.000000 +148884 -1.000000 +148885 -1.000000 +148886 -1.000000 +148887 -1.000000 +148888 -1.000000 +148889 -1.000000 +148890 -1.000000 +148891 -1.000000 +148892 -1.000000 +148893 -1.000000 +148894 -1.000000 +148895 -1.000000 +148896 -1.000000 +148897 -1.000000 +148901 -1.000000 +148902 -1.000000 +148903 -1.000000 +148904 -1.000000 +148905 -1.000000 +148906 -1.000000 +148907 -1.000000 +148908 -1.000000 +148909 -1.000000 +148910 -1.000000 +148912 -1.000000 +148913 -1.000000 +148914 -1.000000 +148915 -1.000000 +148916 -1.000000 +148917 -1.000000 +148918 -1.000000 +148919 -1.000000 +148920 -1.000000 +148922 -1.000000 +148923 -1.000000 +148924 -1.000000 +148925 -1.000000 +148926 -1.000000 +148927 -1.000000 +148929 -1.000000 +148930 -1.000000 +148931 -1.000000 +148939 -1.000000 +148940 -1.000000 +148941 -1.000000 +148942 -1.000000 +148943 -1.000000 +148944 -1.000000 +148945 -1.000000 +148946 -1.000000 +148947 -1.000000 +148948 -1.000000 +148949 -1.000000 +148951 -1.000000 +148952 -1.000000 +148953 -1.000000 +148954 -1.000000 +148955 -1.000000 +148956 -1.000000 +148959 -1.000000 +148961 -1.000000 +148966 -1.000000 +148973 -1.000000 +148976 -1.000000 +148977 -1.000000 +148978 -1.000000 +148979 -1.000000 +148980 -1.000000 +148981 -1.000000 +148982 -1.000000 +148983 -1.000000 +148984 -1.000000 +148985 -1.000000 +148986 -1.000000 +148987 -1.000000 +148988 -1.000000 +148989 -1.000000 +148990 -1.000000 +148991 -1.000000 +148994 -1.000000 +148995 -1.000000 +148996 -1.000000 +148997 -1.000000 +148998 -1.000000 +148999 -1.000000 +149000 -1.000000 +149010 -1.000000 +149011 -1.000000 +149015 -1.000000 +149020 -1.000000 +149026 -1.000000 +149027 -1.000000 +149038 -1.000000 +149039 -1.000000 +149040 -1.000000 +149041 -1.000000 +149042 -1.000000 +149043 -1.000000 +149046 -1.000000 +149047 -1.000000 +149048 -1.000000 +149049 -1.000000 +149052 -1.000000 +149054 -1.000000 +149055 -1.000000 +149056 -1.000000 +149057 -1.000000 +149058 -1.000000 +149059 -1.000000 +149060 -1.000000 +149061 -1.000000 +149063 -1.000000 +149064 -1.000000 +149080 -1.000000 +149081 -1.000000 +149082 -1.000000 +149083 -1.000000 +149084 -1.000000 +149085 -1.000000 +149086 -1.000000 +149096 -1.000000 +149101 -1.000000 +149109 -1.000000 +149110 -1.000000 +149111 -1.000000 +149113 -1.000000 +149114 -1.000000 +149115 -1.000000 +149116 -1.000000 +149117 -1.000000 +149120 -1.000000 +149121 -1.000000 +149122 -1.000000 +149123 -1.000000 +149124 -1.000000 +149132 -1.000000 +149133 -1.000000 +149136 -1.000000 +149137 -1.000000 +149138 -1.000000 +149139 -1.000000 +149142 -1.000000 +149144 -1.000000 +149145 -1.000000 +149146 -1.000000 +149147 -1.000000 +149148 -1.000000 +149149 -1.000000 +149150 -1.000000 +149151 -1.000000 +149152 -1.000000 +149154 -1.000000 +149155 -1.000000 +149156 -1.000000 +149157 -1.000000 +149158 -1.000000 +149159 -1.000000 +149164 -1.000000 +149195 -1.000000 +149196 -1.000000 +149197 -1.000000 +149198 -1.000000 +149200 -1.000000 +149201 -1.000000 +149203 -1.000000 +149204 -1.000000 +149209 -1.000000 +149210 -1.000000 +149217 -1.000000 +149218 -1.000000 +149223 -1.000000 +149228 -1.000000 +149229 -1.000000 +149230 -1.000000 +149231 -1.000000 +149242 -1.000000 +149249 -1.000000 +149250 -1.000000 +149252 -1.000000 +149253 -1.000000 +149260 -1.000000 +149261 -1.000000 +149262 -1.000000 +149263 -1.000000 +149265 -1.000000 +149267 -1.000000 +149268 -1.000000 +149284 -1.000000 +149285 -1.000000 +149286 -1.000000 +149287 -1.000000 +149288 -1.000000 +149289 -1.000000 +149290 -1.000000 +149291 -1.000000 +149292 -1.000000 +149293 -1.000000 +149299 -1.000000 +149300 -1.000000 +149301 -1.000000 +149303 -1.000000 +149304 -1.000000 +149308 -1.000000 +149310 -1.000000 +149318 -1.000000 +149322 -1.000000 +149323 -1.000000 +149325 -1.000000 +149328 -1.000000 +149330 -1.000000 +149332 -1.000000 +149333 -1.000000 +149334 -1.000000 +149335 -1.000000 +149336 -1.000000 +149337 -1.000000 +149339 -1.000000 +149344 -1.000000 +149345 -1.000000 +149346 -1.000000 +149347 -1.000000 +149348 -1.000000 +149350 -1.000000 +149357 -1.000000 +149358 -1.000000 +149359 -1.000000 +149360 -1.000000 +149361 -1.000000 +149362 -1.000000 +149364 -1.000000 +149367 -1.000000 +149370 -1.000000 +149371 -1.000000 +149372 -1.000000 +149373 -1.000000 +149375 -1.000000 +149376 -1.000000 +149377 -1.000000 +149378 -1.000000 +149380 -1.000000 +149383 -1.000000 +149384 -1.000000 +149385 -1.000000 +149386 -1.000000 +149387 -1.000000 +149388 -1.000000 +149393 -1.000000 +149394 -1.000000 +149395 -1.000000 +149396 -1.000000 +149397 -1.000000 +149398 -1.000000 +149399 -1.000000 +149400 -1.000000 +149401 -1.000000 +149403 -1.000000 +149404 -1.000000 +149405 -1.000000 +149406 -1.000000 +149407 -1.000000 +149408 -1.000000 +149409 -1.000000 +149410 -1.000000 +149411 -1.000000 +149412 -1.000000 +149413 -1.000000 +149414 -1.000000 +149415 -1.000000 +149416 -1.000000 +149431 -1.000000 +149437 -1.000000 +149460 -1.000000 +149461 -1.000000 +149465 -1.000000 +149466 -1.000000 +149467 -1.000000 +149468 -1.000000 +149469 -1.000000 +149476 -1.000000 +149485 -1.000000 +149487 -1.000000 +149492 -1.000000 +149493 -1.000000 +149494 -1.000000 +149495 -1.000000 +149496 -1.000000 +149497 -1.000000 +149498 -1.000000 +149509 -1.000000 +149510 -1.000000 +149511 -1.000000 +149512 -1.000000 +149513 -1.000000 +149514 -1.000000 +149515 -1.000000 +149516 -1.000000 +149517 -1.000000 +149518 -1.000000 +149519 -1.000000 +149520 -1.000000 +149521 -1.000000 +149522 -1.000000 +149526 -1.000000 +149527 -1.000000 +149528 -1.000000 +149529 -1.000000 +149533 -1.000000 +149534 -1.000000 +149535 -1.000000 +149536 -1.000000 +149537 -1.000000 +149538 -1.000000 +149539 -1.000000 +149541 -1.000000 +149542 -1.000000 +149543 -1.000000 +149581 -1.000000 +149582 -1.000000 +149583 -1.000000 +149584 -1.000000 +149585 -1.000000 +149587 -1.000000 +149588 -1.000000 +149589 -1.000000 +149590 -1.000000 +149595 -1.000000 +149596 -1.000000 +149598 -1.000000 +149599 -1.000000 +149600 -1.000000 +149601 -1.000000 +149604 -1.000000 +149605 -1.000000 +149606 -1.000000 +149607 -1.000000 +149608 -1.000000 +149609 -1.000000 +149610 -1.000000 +149611 -1.000000 +149613 -1.000000 +149614 -1.000000 +149615 -1.000000 +149617 -1.000000 +149618 -1.000000 +149619 -1.000000 +149620 -1.000000 +149621 -1.000000 +149622 -1.000000 +149623 -1.000000 +149624 -1.000000 +149625 -1.000000 +149651 -1.000000 +149652 -1.000000 +149653 -1.000000 +149654 -1.000000 +149655 -1.000000 +149656 -1.000000 +149658 -1.000000 +149661 -1.000000 +149680 -1.000000 +149681 -1.000000 +149682 -1.000000 +149689 -1.000000 +149690 -1.000000 +149691 -1.000000 +149693 -1.000000 +149697 -1.000000 +149699 -1.000000 +149704 -1.000000 +149705 -1.000000 +149706 -1.000000 +149707 -1.000000 +149708 -1.000000 +149709 -1.000000 +149710 -1.000000 +149711 -1.000000 +149712 -1.000000 +149713 -1.000000 +149714 -1.000000 +149715 -1.000000 +149716 -1.000000 +149717 -1.000000 +149718 -1.000000 +149719 -1.000000 +149722 -1.000000 +149727 -1.000000 +149728 -1.000000 +149729 -1.000000 +149730 -1.000000 +149731 -1.000000 +149732 -1.000000 +149733 -1.000000 +149734 -1.000000 +149735 -1.000000 +149736 -1.000000 +149737 -1.000000 +149738 -1.000000 +149739 -1.000000 +149740 -1.000000 +149741 -1.000000 +149743 -1.000000 +149747 -1.000000 +149754 -1.000000 +149755 -1.000000 +149756 -1.000000 +149757 -1.000000 +149758 -1.000000 +149759 -1.000000 +149760 -1.000000 +149765 -1.000000 +149766 -1.000000 +149767 -1.000000 +149770 -1.000000 +149773 -1.000000 +149774 -1.000000 +149776 -1.000000 +149777 -1.000000 +149779 -1.000000 +149780 -1.000000 +149781 -1.000000 +149782 -1.000000 +149783 -1.000000 +149784 -1.000000 +149785 -1.000000 +149786 -1.000000 +149787 -1.000000 +149789 -1.000000 +149790 -1.000000 +149791 -1.000000 +149792 -1.000000 +149793 -1.000000 +149794 -1.000000 +149795 -1.000000 +149796 -1.000000 +149800 -1.000000 +149801 -1.000000 +149803 -1.000000 +149804 -1.000000 +149805 -1.000000 +149806 -1.000000 +149807 -1.000000 +149808 -1.000000 +149810 -1.000000 +149811 -1.000000 +149813 -1.000000 +149815 -1.000000 +149816 -1.000000 +149818 -1.000000 +149820 -1.000000 +149821 -1.000000 +149822 -1.000000 +149824 -1.000000 +149827 -1.000000 +149828 -1.000000 +149829 -1.000000 +149830 -1.000000 +149834 -1.000000 +149835 -1.000000 +149836 -1.000000 +149837 -1.000000 +149838 -1.000000 +149839 -1.000000 +149840 -1.000000 +149842 -1.000000 +149843 -1.000000 +149845 -1.000000 +149847 -1.000000 +149848 -1.000000 +149849 -1.000000 +149850 -1.000000 +149852 -1.000000 +149853 -1.000000 +149854 -1.000000 +149855 -1.000000 +149856 -1.000000 +149857 -1.000000 +149862 -1.000000 +149863 -1.000000 +149864 -1.000000 +149866 -1.000000 +149867 -1.000000 +149868 -1.000000 +149869 -1.000000 +149870 -1.000000 +149871 -1.000000 +149872 -1.000000 +149878 -1.000000 +149896 -1.000000 +149901 -1.000000 +149902 -1.000000 +149903 -1.000000 +149907 -1.000000 +149922 -1.000000 +149923 -1.000000 +149924 -1.000000 +149925 -1.000000 +149926 -1.000000 +149927 -1.000000 +149928 -1.000000 +149929 -1.000000 +149930 -1.000000 +149931 -1.000000 +149932 -1.000000 +149933 -1.000000 +149934 -1.000000 +149935 -1.000000 +149937 -1.000000 +149938 -1.000000 +149940 -1.000000 +149941 -1.000000 +149942 -1.000000 +149943 -1.000000 +149944 -1.000000 +149945 -1.000000 +149946 -1.000000 +149947 -1.000000 +149948 -1.000000 +149949 -1.000000 +149950 -1.000000 +149951 -1.000000 +149952 -1.000000 +149953 -1.000000 +149954 -1.000000 +149955 -1.000000 +149956 -1.000000 +149957 -1.000000 +149961 -1.000000 +149962 -1.000000 +149967 -1.000000 +149970 -1.000000 +149971 -1.000000 +149973 -1.000000 +149976 -1.000000 +149979 -1.000000 +149983 -1.000000 +149984 -1.000000 +149985 -1.000000 +149986 -1.000000 +149987 -1.000000 +149988 -1.000000 +149989 -1.000000 +149990 -1.000000 +150005 -1.000000 +150015 -1.000000 +150017 -1.000000 +150018 -1.000000 +150019 -1.000000 +150020 -1.000000 +150022 -1.000000 +150023 -1.000000 +150024 -1.000000 +150025 -1.000000 +150026 -1.000000 +150027 -1.000000 +150028 -1.000000 +150029 -1.000000 +150030 -1.000000 +150031 -1.000000 +150032 -1.000000 +150034 -1.000000 +150035 -1.000000 +150036 -1.000000 +150037 -1.000000 +150038 -1.000000 +150039 -1.000000 +150040 -1.000000 +150044 -1.000000 +150045 -1.000000 +150046 -1.000000 +150047 -1.000000 +150048 -1.000000 +150049 -1.000000 +150050 -1.000000 +150052 -1.000000 +150053 -1.000000 +150054 -1.000000 +150055 -1.000000 +150056 -1.000000 +150057 -1.000000 +150058 -1.000000 +150059 -1.000000 +150060 -1.000000 +150061 -1.000000 +150062 -1.000000 +150063 -1.000000 +150064 -1.000000 +150065 -1.000000 +150066 -1.000000 +150068 -1.000000 +150069 -1.000000 +150070 -1.000000 +150071 -1.000000 +150072 -1.000000 +150073 -1.000000 +150074 -1.000000 +150075 -1.000000 +150076 -1.000000 +150077 -1.000000 +150078 -1.000000 +150079 -1.000000 +150080 -1.000000 +150083 -1.000000 +150086 -1.000000 +150092 -1.000000 +150093 -1.000000 +150094 -1.000000 +150095 -1.000000 +150096 -1.000000 +150097 -1.000000 +150098 -1.000000 +150099 -1.000000 +150100 -1.000000 +150101 -1.000000 +150102 -1.000000 +150103 -1.000000 +150104 -1.000000 +150105 -1.000000 +150106 -1.000000 +150107 -1.000000 +150108 -1.000000 +150109 -1.000000 +150111 -1.000000 +150113 -1.000000 +150114 -1.000000 +150115 -1.000000 +150116 -1.000000 +150122 -1.000000 +150124 -1.000000 +150125 -1.000000 +150126 -1.000000 +150132 -1.000000 +150133 -1.000000 +150137 -1.000000 +150139 -1.000000 +150140 -1.000000 +150141 -1.000000 +150142 -1.000000 +150143 -1.000000 +150144 -1.000000 +150145 -1.000000 +150147 -1.000000 +150148 -1.000000 +150149 -1.000000 +150150 -1.000000 +150151 -1.000000 +150152 -1.000000 +150153 -1.000000 +150154 -1.000000 +150155 -1.000000 +150156 -1.000000 +150157 -1.000000 +150158 -1.000000 +150159 -1.000000 +150160 -1.000000 +150161 -1.000000 +150162 -1.000000 +150163 -1.000000 +150164 -1.000000 +150168 -1.000000 +150169 -1.000000 +150170 -1.000000 +150174 -1.000000 +150176 -1.000000 +150179 -1.000000 +150181 -1.000000 +150183 -1.000000 +150184 -1.000000 +150186 -1.000000 +150219 -1.000000 +150220 -1.000000 +150222 -1.000000 +150223 -1.000000 +150225 -1.000000 +150226 -1.000000 +150228 -1.000000 +150247 -1.000000 +150264 -1.000000 +150266 -1.000000 +150269 -1.000000 +150270 -1.000000 +150281 -1.000000 +150282 -1.000000 +150284 -1.000000 +150285 -1.000000 +150287 -1.000000 +150294 -1.000000 +150299 -1.000000 +150300 -1.000000 +150301 -1.000000 +150302 -1.000000 +150306 -1.000000 +150307 -1.000000 +150308 -1.000000 +150309 -1.000000 +150310 -1.000000 +150311 -1.000000 +150312 -1.000000 +150313 -1.000000 +150314 -1.000000 +150315 -1.000000 +150316 -1.000000 +150317 -1.000000 +150318 -1.000000 +150319 -1.000000 +150320 -1.000000 +150321 -1.000000 +150326 -1.000000 +150327 -1.000000 +150328 -1.000000 +150329 -1.000000 +150330 -1.000000 +150331 -1.000000 +150332 -1.000000 +150333 -1.000000 +150334 -1.000000 +150335 -1.000000 +150336 -1.000000 +150337 -1.000000 +150363 -1.000000 +150374 -1.000000 +150401 -1.000000 +150406 -1.000000 +150409 -1.000000 +150411 -1.000000 +150412 -1.000000 +150414 -1.000000 +150415 -1.000000 +150416 -1.000000 +150417 -1.000000 +150418 -1.000000 +150419 -1.000000 +150420 -1.000000 +150422 -1.000000 +150423 -1.000000 +150424 -1.000000 +150426 -1.000000 +150427 -1.000000 +150428 -1.000000 +150430 -1.000000 +150431 -1.000000 +150432 -1.000000 +150433 -1.000000 +150434 -1.000000 +150435 -1.000000 +150436 -1.000000 +150441 -1.000000 +150442 -1.000000 +150443 -1.000000 +150444 -1.000000 +150445 -1.000000 +150446 -1.000000 +150454 -1.000000 +150455 -1.000000 +150456 -1.000000 +150457 -1.000000 +150458 -1.000000 +150459 -1.000000 +150460 -1.000000 +150472 -1.000000 +150473 -1.000000 +150512 -1.000000 +150518 -1.000000 +150519 -1.000000 +150520 -1.000000 +150521 -1.000000 +150523 -1.000000 +150526 -1.000000 +150530 -1.000000 +150549 -1.000000 +150550 -1.000000 +150552 -1.000000 +150554 -1.000000 +150559 -1.000000 +150602 -1.000000 +150603 -1.000000 +150604 -1.000000 +150605 -1.000000 +150606 -1.000000 +150607 -1.000000 +150608 -1.000000 +150609 -1.000000 +150610 -1.000000 +150611 -1.000000 +150612 -1.000000 +150614 -1.000000 +150615 -1.000000 +150616 -1.000000 +150618 -1.000000 +150620 -1.000000 +150622 -1.000000 +150623 -1.000000 +150624 -1.000000 +150633 -1.000000 +150637 -1.000000 +150640 -1.000000 +150645 -1.000000 +150652 -1.000000 +150653 -1.000000 +150655 -1.000000 +150657 -1.000000 +150658 -1.000000 +150660 -1.000000 +150662 -1.000000 +150663 -1.000000 +150664 -1.000000 +150665 -1.000000 +150666 -1.000000 +150667 -1.000000 +150672 -1.000000 +150673 -1.000000 +150674 -1.000000 +150675 -1.000000 +150676 -1.000000 +150677 -1.000000 +150678 -1.000000 +150679 -1.000000 +150680 -1.000000 +150681 -1.000000 +150682 -1.000000 +150683 -1.000000 +150684 -1.000000 +150685 -1.000000 +150686 -1.000000 +150687 -1.000000 +150697 -1.000000 +150699 -1.000000 +150700 -1.000000 +150701 -1.000000 +150702 -1.000000 +150703 -1.000000 +150704 -1.000000 +150713 -1.000000 +150717 -1.000000 +150718 -1.000000 +150719 -1.000000 +150720 -1.000000 +150721 -1.000000 +150724 -1.000000 +150726 -1.000000 +150727 -1.000000 +150729 -1.000000 +150731 -1.000000 +150734 -1.000000 +150735 -1.000000 +150739 -1.000000 +150743 -1.000000 +150747 -1.000000 +150748 -1.000000 +150749 -1.000000 +150750 -1.000000 +150751 -1.000000 +150752 -1.000000 +150753 -1.000000 +150754 -1.000000 +150757 -1.000000 +150758 -1.000000 +150759 -1.000000 +150760 -1.000000 +150761 -1.000000 +150762 -1.000000 +150763 -1.000000 +150764 -1.000000 +150765 -1.000000 +150766 -1.000000 +150767 -1.000000 +150768 -1.000000 +150769 -1.000000 +150770 -1.000000 +150771 -1.000000 +150772 -1.000000 +150773 -1.000000 +150774 -1.000000 +150778 -1.000000 +150779 -1.000000 +150780 -1.000000 +150782 -1.000000 +150783 -1.000000 +150785 -1.000000 +150786 -1.000000 +150787 -1.000000 +150789 -1.000000 +150790 -1.000000 +150792 -1.000000 +150795 -1.000000 +150796 -1.000000 +150797 -1.000000 +150798 -1.000000 +150799 -1.000000 +150800 -1.000000 +150801 -1.000000 +150802 -1.000000 +150803 -1.000000 +150804 -1.000000 +150805 -1.000000 +150806 -1.000000 +150807 -1.000000 +150808 -1.000000 +150809 -1.000000 +150810 -1.000000 +150811 -1.000000 +150812 -1.000000 +150814 -1.000000 +150815 -1.000000 +150816 -1.000000 +150817 -1.000000 +150821 -1.000000 +150822 -1.000000 +150823 -1.000000 +150825 -1.000000 +150826 -1.000000 +150828 -1.000000 +150833 -1.000000 +150836 -1.000000 +150837 -1.000000 +150839 -1.000000 +150840 -1.000000 +150842 -1.000000 +150843 -1.000000 +150844 -1.000000 +150846 -1.000000 +150847 -1.000000 +150849 -1.000000 +150862 -1.000000 +150863 -1.000000 +150865 -1.000000 +150867 -1.000000 +150869 -1.000000 +150870 -1.000000 +150872 -1.000000 +150877 -1.000000 +150878 -1.000000 +150879 -1.000000 +150881 -1.000000 +150882 -1.000000 +150883 -1.000000 +150885 -1.000000 +150886 -1.000000 +150887 -1.000000 +150888 -1.000000 +150890 -1.000000 +150891 -1.000000 +150900 -1.000000 +150901 -1.000000 +150902 -1.000000 +150903 -1.000000 +150907 -1.000000 +150908 -1.000000 +150909 -1.000000 +150910 -1.000000 +152129 -1.000000 +152130 -1.000000 +152132 -1.000000 +152133 -1.000000 +152134 -1.000000 +152135 -1.000000 +152137 -1.000000 +152138 -1.000000 +152139 -1.000000 +152140 -1.000000 +152141 -1.000000 +152142 -1.000000 +152143 -1.000000 +152144 -1.000000 +152145 -1.000000 +152146 -1.000000 +152147 -1.000000 +152148 -1.000000 +152149 -1.000000 +152150 -1.000000 +152151 -1.000000 +152152 -1.000000 +152153 -1.000000 +152154 -1.000000 +152165 -1.000000 +152166 -1.000000 +152167 -1.000000 +152168 -1.000000 +152169 -1.000000 +152170 -1.000000 +152171 -1.000000 +152173 -1.000000 +152175 -1.000000 +152177 -1.000000 +152178 -1.000000 +152179 -1.000000 +152180 -1.000000 +152181 -1.000000 +152182 -1.000000 +152183 -1.000000 +152192 -1.000000 +152193 -1.000000 +152194 -1.000000 +152195 -1.000000 +152196 -1.000000 +152197 -1.000000 +152201 -1.000000 +152202 -1.000000 +152203 -1.000000 +152204 -1.000000 +152207 -1.000000 +152208 -1.000000 +152209 -1.000000 +152210 -1.000000 +152211 -1.000000 +152228 -1.000000 +152230 -1.000000 +152232 -1.000000 +152233 -1.000000 +152235 -1.000000 +152236 -1.000000 +152237 -1.000000 +152238 -1.000000 +152239 -1.000000 +152240 -1.000000 +152244 -1.000000 +152245 -1.000000 +152246 -1.000000 +152248 -1.000000 +152249 -1.000000 +152250 -1.000000 +152251 -1.000000 +152252 -1.000000 +152253 -1.000000 +152254 -1.000000 +152255 -1.000000 +152256 -1.000000 +152257 -1.000000 +152269 -1.000000 +152270 -1.000000 +152271 -1.000000 +152272 -1.000000 +152273 -1.000000 +152274 -1.000000 +152275 -1.000000 +152276 -1.000000 +152277 -1.000000 +152278 -1.000000 +152279 -1.000000 +152280 -1.000000 +152281 -1.000000 +152282 -1.000000 +152286 -1.000000 +152287 -1.000000 +152288 -1.000000 +152289 -1.000000 +152290 -1.000000 +152291 -1.000000 +152292 -1.000000 +152293 -1.000000 +152294 -1.000000 +152295 -1.000000 +152296 -1.000000 +152305 -1.000000 +152306 -1.000000 +152314 -1.000000 +152316 -1.000000 +152318 -1.000000 +152319 -1.000000 +152320 -1.000000 +152321 -1.000000 +152322 -1.000000 +152323 -1.000000 +152325 -1.000000 +152326 -1.000000 +152327 -1.000000 +152328 -1.000000 +152329 -1.000000 +152330 -1.000000 +152331 -1.000000 +152332 -1.000000 +152333 -1.000000 +152339 -1.000000 +152340 -1.000000 +152341 -1.000000 +152342 -1.000000 +152343 -1.000000 +152344 -1.000000 +152345 -1.000000 +152346 -1.000000 +152347 -1.000000 +152348 -1.000000 +152349 -1.000000 +152350 -1.000000 +152351 -1.000000 +152352 -1.000000 +152353 -1.000000 +152354 -1.000000 +152355 -1.000000 +152356 -1.000000 +152358 -1.000000 +152359 -1.000000 +152364 -1.000000 +152365 -1.000000 +152366 -1.000000 +152372 -1.000000 +152373 -1.000000 +152374 -1.000000 +152375 -1.000000 +152425 -1.000000 +152426 -1.000000 +152427 -1.000000 +152428 -1.000000 +152429 -1.000000 +152430 -1.000000 +152431 -1.000000 +152432 -1.000000 +152433 -1.000000 +152434 -1.000000 +152435 -1.000000 +152436 -1.000000 +152437 -1.000000 +152438 -1.000000 +152440 -1.000000 +152441 -1.000000 +152442 -1.000000 +152443 -1.000000 +152444 -1.000000 +152445 -1.000000 +152446 -1.000000 +152483 -1.000000 +152484 -1.000000 +152485 -1.000000 +152486 -1.000000 +152487 -1.000000 +152488 -1.000000 +152489 -1.000000 +152490 -1.000000 +152491 -1.000000 +152492 -1.000000 +152493 -1.000000 +152494 -1.000000 +152495 -1.000000 +152496 -1.000000 +152497 -1.000000 +152498 -1.000000 +152504 -1.000000 +152505 -1.000000 +152506 -1.000000 +152507 -1.000000 +152508 -1.000000 +152509 -1.000000 +152510 -1.000000 +152511 -1.000000 +152512 -1.000000 +152513 -1.000000 +152548 -1.000000 +152549 -1.000000 +152550 -1.000000 +152551 -1.000000 +152552 -1.000000 +152554 -1.000000 +152555 -1.000000 +152556 -1.000000 +152557 -1.000000 +152563 -1.000000 +152564 -1.000000 +152565 -1.000000 +152566 -1.000000 +152567 -1.000000 +152568 -1.000000 +152570 -1.000000 +152583 -1.000000 +152584 -1.000000 +152597 -1.000000 +152598 -1.000000 +152599 -1.000000 +152601 -1.000000 +152603 -1.000000 +152604 -1.000000 +152605 -1.000000 +152606 -1.000000 +152616 -1.000000 +152617 -1.000000 +152618 -1.000000 +152619 -1.000000 +152620 -1.000000 +152621 -1.000000 +152622 -1.000000 +152624 -1.000000 +152625 -1.000000 +152630 -1.000000 +152631 -1.000000 +152632 -1.000000 +152633 -1.000000 +152634 -1.000000 +152635 -1.000000 +152636 -1.000000 +152637 -1.000000 +152638 -1.000000 +152639 -1.000000 +152640 -1.000000 +152642 -1.000000 +152643 -1.000000 +152697 -1.000000 +152699 -1.000000 +152700 -1.000000 +152703 -1.000000 +152704 -1.000000 +152705 -1.000000 +152706 -1.000000 +152719 -1.000000 +152720 -1.000000 +152721 -1.000000 +152722 -1.000000 +152723 -1.000000 +152725 -1.000000 +152726 -1.000000 +152727 -1.000000 +152728 -1.000000 +152729 -1.000000 +152730 -1.000000 +152731 -1.000000 +152733 -1.000000 +152734 -1.000000 +152735 -1.000000 +152736 -1.000000 +152737 -1.000000 +152738 -1.000000 +152741 -1.000000 +152742 -1.000000 +152743 -1.000000 +152744 -1.000000 +152745 -1.000000 +152758 -1.000000 +152759 -1.000000 +152760 -1.000000 +152761 -1.000000 +152762 -1.000000 +152763 -1.000000 +152764 -1.000000 +152765 -1.000000 +152766 -1.000000 +152767 -1.000000 +152768 -1.000000 +152769 -1.000000 +152773 -1.000000 +152774 -1.000000 +152775 -1.000000 +152776 -1.000000 +152781 -1.000000 +152789 -1.000000 +152790 -1.000000 +152791 -1.000000 +152796 -1.000000 +152814 -1.000000 +152815 -1.000000 +152816 -1.000000 +152817 -1.000000 +152818 -1.000000 +152821 -1.000000 +152822 -1.000000 +152823 -1.000000 +152824 -1.000000 +152825 -1.000000 +152826 -1.000000 +152827 -1.000000 +152828 -1.000000 +152833 -1.000000 +152834 -1.000000 +152835 -1.000000 +152836 -1.000000 +152837 -1.000000 +152838 -1.000000 +152839 -1.000000 +152840 -1.000000 +152841 -1.000000 +152842 -1.000000 +152843 -1.000000 +152844 -1.000000 +152851 -1.000000 +152855 -1.000000 +152857 -1.000000 +152862 -1.000000 +152863 -1.000000 +152864 -1.000000 +152865 -1.000000 +152866 -1.000000 +152867 -1.000000 +152868 -1.000000 +152869 -1.000000 +152870 -1.000000 +152871 -1.000000 +152872 -1.000000 +152873 -1.000000 +152874 -1.000000 +152875 -1.000000 +152876 -1.000000 +152877 -1.000000 +152878 -1.000000 +152880 -1.000000 +152886 -1.000000 +152891 -1.000000 +152898 -1.000000 +152911 -1.000000 +152912 -1.000000 +152915 -1.000000 +152919 -1.000000 +152921 -1.000000 +152922 -1.000000 +152923 -1.000000 +152924 -1.000000 +152926 -1.000000 +152927 -1.000000 +152928 -1.000000 +152929 -1.000000 +152930 -1.000000 +152932 -1.000000 +152933 -1.000000 +152934 -1.000000 +152935 -1.000000 +152936 -1.000000 +152937 -1.000000 +152965 -1.000000 +152975 -1.000000 +152976 -1.000000 +152977 -1.000000 +152978 -1.000000 +152979 -1.000000 +152982 -1.000000 +152985 -1.000000 +152987 -1.000000 +152988 -1.000000 +152989 -1.000000 +152990 -1.000000 +152991 -1.000000 +152992 -1.000000 +152993 -1.000000 +152994 -1.000000 +152995 -1.000000 +152996 -1.000000 +152997 -1.000000 +152998 -1.000000 +152999 -1.000000 +153000 -1.000000 +153001 -1.000000 +153002 -1.000000 +153003 -1.000000 +153004 -1.000000 +153005 -1.000000 +153006 -1.000000 +153007 -1.000000 +153008 -1.000000 +153009 -1.000000 +153010 -1.000000 +153011 -1.000000 +153012 -1.000000 +153022 -1.000000 +153023 -1.000000 +153024 -1.000000 +153025 -1.000000 +153026 -1.000000 +153027 -1.000000 +153028 -1.000000 +153029 -1.000000 +153030 -1.000000 +153031 -1.000000 +153032 -1.000000 +153033 -1.000000 +153034 -1.000000 +153035 -1.000000 +153036 -1.000000 +153037 -1.000000 +153038 -1.000000 +153039 -1.000000 +153040 -1.000000 +153041 -1.000000 +153042 -1.000000 +153043 -1.000000 +153044 -1.000000 +153045 -1.000000 +153046 -1.000000 +153047 -1.000000 +153048 -1.000000 +153049 -1.000000 +153050 -1.000000 +153054 -1.000000 +153060 -1.000000 +153061 -1.000000 +153062 -1.000000 +153063 -1.000000 +153064 -1.000000 +153065 -1.000000 +153066 -1.000000 +153067 -1.000000 +153068 -1.000000 +153070 -1.000000 +153071 -1.000000 +153072 -1.000000 +153073 -1.000000 +153074 -1.000000 +153075 -1.000000 +153076 -1.000000 +153077 -1.000000 +153078 -1.000000 +153079 -1.000000 +153080 -1.000000 +153081 -1.000000 +153082 -1.000000 +153083 -1.000000 +153084 -1.000000 +153085 -1.000000 +153093 -1.000000 +153094 -1.000000 +153095 -1.000000 +153096 -1.000000 +153098 -1.000000 +153099 -1.000000 +153100 -1.000000 +153101 -1.000000 +153102 -1.000000 +153103 -1.000000 +153104 -1.000000 +153105 -1.000000 +153106 -1.000000 +153108 -1.000000 +153109 -1.000000 +153110 -1.000000 +153111 -1.000000 +153112 -1.000000 +153114 -1.000000 +153115 -1.000000 +153116 -1.000000 +153117 -1.000000 +153118 -1.000000 +153119 -1.000000 +153151 -1.000000 +153152 -1.000000 +153153 -1.000000 +153154 -1.000000 +153156 -1.000000 +153158 -1.000000 +153252 -1.000000 +153253 -1.000000 +153254 -1.000000 +153255 -1.000000 +153256 -1.000000 +153260 -1.000000 +153261 -1.000000 +153269 -1.000000 +153277 -1.000000 +153283 -1.000000 +153284 -1.000000 +153286 -1.000000 +153287 -1.000000 +153289 -1.000000 +153290 -1.000000 +153291 -1.000000 +153292 -1.000000 +153293 -1.000000 +153295 -1.000000 +153296 -1.000000 +153297 -1.000000 +153298 -1.000000 +153299 -1.000000 +153301 -1.000000 +153304 -1.000000 +153306 -1.000000 +153308 -1.000000 +153309 -1.000000 +153314 -1.000000 +153318 -1.000000 +153322 -1.000000 +153326 -1.000000 +153328 -1.000000 +153333 -1.000000 +153341 -1.000000 +153342 -1.000000 +153348 -1.000000 +153349 -1.000000 +153350 -1.000000 +153357 -1.000000 +153359 -1.000000 +153368 -1.000000 +153370 -1.000000 +153375 -1.000000 +153377 -1.000000 +153378 -1.000000 +153382 -1.000000 +153396 -1.000000 +153398 -1.000000 +153399 -1.000000 +153402 -1.000000 +153403 -1.000000 +153404 -1.000000 +153405 -1.000000 +153406 -1.000000 +153407 -1.000000 +153408 -1.000000 +153412 -1.000000 +153418 -1.000000 +153419 -1.000000 +153421 -1.000000 +153422 -1.000000 +153424 -1.000000 +153425 -1.000000 +153427 -1.000000 +153428 -1.000000 +153429 -1.000000 +153430 -1.000000 +153431 -1.000000 +153432 -1.000000 +153433 -1.000000 +153434 -1.000000 +153435 -1.000000 +153436 -1.000000 +153437 -1.000000 +153439 -1.000000 +153441 -1.000000 +153442 -1.000000 +153457 -1.000000 +153458 -1.000000 +153463 -1.000000 +153464 -1.000000 +153465 -1.000000 +153466 -1.000000 +153467 -1.000000 +153470 -1.000000 +153471 -1.000000 +153472 -1.000000 +153473 -1.000000 +153474 -1.000000 +153475 -1.000000 +153476 -1.000000 +153481 -1.000000 +153482 -1.000000 +153485 -1.000000 +153486 -1.000000 +153487 -1.000000 +153488 -1.000000 +153489 -1.000000 +153491 -1.000000 +153492 -1.000000 +153493 -1.000000 +153495 -1.000000 +153496 -1.000000 +153497 -1.000000 +153498 -1.000000 +153499 -1.000000 +153500 -1.000000 +153501 -1.000000 +153502 -1.000000 +153503 -1.000000 +153504 -1.000000 +153505 -1.000000 +153506 -1.000000 +153509 -1.000000 +153510 -1.000000 +153511 -1.000000 +153512 -1.000000 +153513 -1.000000 +153514 -1.000000 +153515 -1.000000 +153516 -1.000000 +153517 -1.000000 +153518 -1.000000 +153519 -1.000000 +153520 -1.000000 +153533 -1.000000 +153537 -1.000000 +153541 -1.000000 +153542 -1.000000 +153543 -1.000000 +153544 -1.000000 +153550 -1.000000 +153551 -1.000000 +153561 -1.000000 +153562 -1.000000 +153564 -1.000000 +153576 -1.000000 +153577 -1.000000 +153578 -1.000000 +153580 -1.000000 +153581 -1.000000 +153582 -1.000000 +153589 -1.000000 +153590 -1.000000 +153591 -1.000000 +153592 -1.000000 +153595 -1.000000 +153596 -1.000000 +153597 -1.000000 +153598 -1.000000 +153599 -1.000000 +153600 -1.000000 +153606 -1.000000 +153609 -1.000000 +153611 -1.000000 +153612 -1.000000 +153614 -1.000000 +153615 -1.000000 +153616 -1.000000 +153617 -1.000000 +153618 -1.000000 +153619 -1.000000 +153620 -1.000000 +153622 -1.000000 +153623 -1.000000 +153624 -1.000000 +153625 -1.000000 +153626 -1.000000 +153627 -1.000000 +153628 -1.000000 +153629 -1.000000 +153630 -1.000000 +153631 -1.000000 +153638 -1.000000 +153639 -1.000000 +153640 -1.000000 +153641 -1.000000 +153642 -1.000000 +153643 -1.000000 +153644 -1.000000 +153645 -1.000000 +153646 -1.000000 +153647 -1.000000 +153648 -1.000000 +153649 -1.000000 +153650 -1.000000 +153651 -1.000000 +153653 -1.000000 +153654 -1.000000 +153655 -1.000000 +153656 -1.000000 +153657 -1.000000 +153658 -1.000000 +153659 -1.000000 +153661 -1.000000 +153662 -1.000000 +153663 -1.000000 +153669 -1.000000 +153670 -1.000000 +153671 -1.000000 +153672 -1.000000 +153673 -1.000000 +153677 -1.000000 +153678 -1.000000 +153679 -1.000000 +153680 -1.000000 +153682 -1.000000 +153683 -1.000000 +153684 -1.000000 +153685 -1.000000 +153686 -1.000000 +153694 -1.000000 +153695 -1.000000 +153696 -1.000000 +153697 -1.000000 +153700 -1.000000 +153701 -1.000000 +153702 -1.000000 +153703 -1.000000 +153704 -1.000000 +153705 -1.000000 +153707 -1.000000 +153708 -1.000000 +153709 -1.000000 +153710 -1.000000 +153711 -1.000000 +153712 -1.000000 +153721 -1.000000 +153722 -1.000000 +153726 -1.000000 +153727 -1.000000 +153734 -1.000000 +153735 -1.000000 +153737 -1.000000 +153740 -1.000000 +153754 -1.000000 +153757 -1.000000 +153759 -1.000000 +153760 -1.000000 +153761 -1.000000 +153762 -1.000000 +153763 -1.000000 +153764 -1.000000 +153765 -1.000000 +153766 -1.000000 +153767 -1.000000 +153768 -1.000000 +153769 -1.000000 +153771 -1.000000 +153774 -1.000000 +153801 -1.000000 +153802 -1.000000 +153803 -1.000000 +153804 -1.000000 +153805 -1.000000 +153806 -1.000000 +153813 -1.000000 +153816 -1.000000 +153818 -1.000000 +153819 -1.000000 +153820 -1.000000 +153821 -1.000000 +153822 -1.000000 +153823 -1.000000 +153824 -1.000000 +153825 -1.000000 +153826 -1.000000 +153827 -1.000000 +153828 -1.000000 +153829 -1.000000 +153830 -1.000000 +153831 -1.000000 +153832 -1.000000 +153833 -1.000000 +153834 -1.000000 +153835 -1.000000 +153836 -1.000000 +153837 -1.000000 +153838 -1.000000 +153839 -1.000000 +153840 -1.000000 +153841 -1.000000 +153852 -1.000000 +153853 -1.000000 +153854 -1.000000 +153855 -1.000000 +153856 -1.000000 +153857 -1.000000 +153858 -1.000000 +153859 -1.000000 +153860 -1.000000 +153861 -1.000000 +153862 -1.000000 +153863 -1.000000 +153864 -1.000000 +153867 -1.000000 +153869 -1.000000 +153871 -1.000000 +153872 -1.000000 +153888 -1.000000 +153891 -1.000000 +153893 -1.000000 +153902 -1.000000 +153903 -1.000000 +153904 -1.000000 +153905 -1.000000 +153906 -1.000000 +153909 -1.000000 +153911 -1.000000 +153919 -1.000000 +153920 -1.000000 +153921 -1.000000 +153922 -1.000000 +153923 -1.000000 +153924 -1.000000 +153925 -1.000000 +153926 -1.000000 +153927 -1.000000 +153928 -1.000000 +153929 -1.000000 +153931 -1.000000 +153932 -1.000000 +153933 -1.000000 +153934 -1.000000 +153935 -1.000000 +153936 -1.000000 +153937 -1.000000 +153938 -1.000000 +153939 -1.000000 +153940 -1.000000 +153941 -1.000000 +153942 -1.000000 +153943 -1.000000 +153944 -1.000000 +153949 -1.000000 +153950 -1.000000 +153951 -1.000000 +153952 -1.000000 +153955 -1.000000 +153957 -1.000000 +153958 -1.000000 +153962 -1.000000 +153963 -1.000000 +153966 -1.000000 +153988 -1.000000 +153989 -1.000000 +153990 -1.000000 +153991 -1.000000 +153992 -1.000000 +153993 -1.000000 +153994 -1.000000 +153995 -1.000000 +153996 -1.000000 +153997 -1.000000 +153998 -1.000000 +153999 -1.000000 +154000 -1.000000 +154003 -1.000000 +154033 -1.000000 +154035 -1.000000 +154037 -1.000000 +154038 -1.000000 +154044 -1.000000 +154045 -1.000000 +154046 -1.000000 +154047 -1.000000 +154048 -1.000000 +154049 -1.000000 +154050 -1.000000 +154051 -1.000000 +154052 -1.000000 +154053 -1.000000 +154054 -1.000000 +154055 -1.000000 +154057 -1.000000 +154058 -1.000000 +154059 -1.000000 +154060 -1.000000 +154061 -1.000000 +154062 -1.000000 +154063 -1.000000 +154064 -1.000000 +154065 -1.000000 +154066 -1.000000 +154067 -1.000000 +154068 -1.000000 +154079 -1.000000 +154081 -1.000000 +154082 -1.000000 +154083 -1.000000 +154092 -1.000000 +154105 -1.000000 +154117 -1.000000 +154118 -1.000000 +154119 -1.000000 +154122 -1.000000 +154123 -1.000000 +154124 -1.000000 +154125 -1.000000 +154126 -1.000000 +154128 -1.000000 +154165 -1.000000 +154247 -1.000000 +154248 -1.000000 +154249 -1.000000 +154250 -1.000000 +154251 -1.000000 +154252 -1.000000 +154253 -1.000000 +154254 -1.000000 +154256 -1.000000 +154257 -1.000000 +154258 -1.000000 +154259 -1.000000 +154260 -1.000000 +154267 -1.000000 +154268 -1.000000 +154284 -1.000000 +154285 -1.000000 +154286 -1.000000 +154287 -1.000000 +154288 -1.000000 +154289 -1.000000 +154290 -1.000000 +154291 -1.000000 +154292 -1.000000 +154293 -1.000000 +154294 -1.000000 +154295 -1.000000 +154296 -1.000000 +154297 -1.000000 +154298 -1.000000 +154310 -1.000000 +154317 -1.000000 +154318 -1.000000 +154319 -1.000000 +154320 -1.000000 +154321 -1.000000 +154322 -1.000000 +154323 -1.000000 +154324 -1.000000 +154325 -1.000000 +154326 -1.000000 +154327 -1.000000 +154328 -1.000000 +154329 -1.000000 +154330 -1.000000 +154331 -1.000000 +154332 -1.000000 +154333 -1.000000 +154334 -1.000000 +154335 -1.000000 +154336 -1.000000 +154337 -1.000000 +154338 -1.000000 +154339 -1.000000 +154340 -1.000000 +154341 -1.000000 +154342 -1.000000 +154343 -1.000000 +154344 -1.000000 +154345 -1.000000 +154346 -1.000000 +154347 -1.000000 +154348 -1.000000 +154349 -1.000000 +154357 -1.000000 +154358 -1.000000 +154359 -1.000000 +154360 -1.000000 +154362 -1.000000 +154363 -1.000000 +154364 -1.000000 +154365 -1.000000 +154366 -1.000000 +154368 -1.000000 +154369 -1.000000 +154370 -1.000000 +154371 -1.000000 +154372 -1.000000 +154373 -1.000000 +154374 -1.000000 +154375 -1.000000 +154376 -1.000000 +154377 -1.000000 +154378 -1.000000 +154380 -1.000000 +154381 -1.000000 +154383 -1.000000 +154384 -1.000000 +154385 -1.000000 +154387 -1.000000 +154388 -1.000000 +154389 -1.000000 +154390 -1.000000 +154391 -1.000000 +154392 -1.000000 +154396 -1.000000 +154397 -1.000000 +154398 -1.000000 +154399 -1.000000 +154400 -1.000000 +154401 -1.000000 +154402 -1.000000 +154403 -1.000000 +154404 -1.000000 +154405 -1.000000 +154406 -1.000000 +154407 -1.000000 +154408 -1.000000 +154410 -1.000000 +154411 -1.000000 +154412 -1.000000 +154414 -1.000000 +154415 -1.000000 +154416 -1.000000 +154417 -1.000000 +154418 -1.000000 +154419 -1.000000 +154421 -1.000000 +154427 -1.000000 +154428 -1.000000 +154429 -1.000000 +154430 -1.000000 +154431 -1.000000 +154432 -1.000000 +154433 -1.000000 +154434 -1.000000 +154435 -1.000000 +154436 -1.000000 +154437 -1.000000 +154438 -1.000000 +154440 -1.000000 +154441 -1.000000 +154442 -1.000000 +154443 -1.000000 +154445 -1.000000 +154446 -1.000000 +154447 -1.000000 +154448 -1.000000 +154449 -1.000000 +154450 -1.000000 +154451 -1.000000 +154464 -1.000000 +154466 -1.000000 +154477 -1.000000 +154481 -1.000000 +154486 -1.000000 +154497 -1.000000 +154503 -1.000000 +154504 -1.000000 +154505 -1.000000 +154506 -1.000000 +154507 -1.000000 +154508 -1.000000 +154509 -1.000000 +154510 -1.000000 +154511 -1.000000 +154516 -1.000000 +154518 -1.000000 +154523 -1.000000 +154525 -1.000000 +154527 -1.000000 +154531 -1.000000 +154532 -1.000000 +154535 -1.000000 +154536 -1.000000 +154537 -1.000000 +154538 -1.000000 +154540 -1.000000 +154541 -1.000000 +154544 -1.000000 +154547 -1.000000 +154548 -1.000000 +154550 -1.000000 +154554 -1.000000 +154556 -1.000000 +154557 -1.000000 +154562 -1.000000 +154564 -1.000000 +154565 -1.000000 +154566 -1.000000 +154567 -1.000000 +154569 -1.000000 +154570 -1.000000 +154572 -1.000000 +154573 -1.000000 +154574 -1.000000 +154578 -1.000000 +154579 -1.000000 +154583 -1.000000 +154584 -1.000000 +154585 -1.000000 +154586 -1.000000 +154587 -1.000000 +154588 -1.000000 +154589 -1.000000 +154591 -1.000000 +154592 -1.000000 +154593 -1.000000 +154595 -1.000000 +154606 -1.000000 +154613 -1.000000 +154647 -1.000000 +154648 -1.000000 +154649 -1.000000 +154650 -1.000000 +154652 -1.000000 +154655 -1.000000 +154656 -1.000000 +154657 -1.000000 +154658 -1.000000 +154659 -1.000000 +154660 -1.000000 +154663 -1.000000 +154665 -1.000000 +154666 -1.000000 +154667 -1.000000 +154668 -1.000000 +154670 -1.000000 +154671 -1.000000 +154672 -1.000000 +154674 -1.000000 +154675 -1.000000 +154677 -1.000000 +154678 -1.000000 +154679 -1.000000 +154680 -1.000000 +154681 -1.000000 +154684 -1.000000 +154685 -1.000000 +154686 -1.000000 +154687 -1.000000 +154688 -1.000000 +154689 -1.000000 +154690 -1.000000 +154691 -1.000000 +154692 -1.000000 +154693 -1.000000 +154694 -1.000000 +154695 -1.000000 +154696 -1.000000 +154723 -1.000000 +154724 -1.000000 +154725 -1.000000 +154726 -1.000000 +154727 -1.000000 +154728 -1.000000 +154729 -1.000000 +154730 -1.000000 +154731 -1.000000 +154732 -1.000000 +154733 -1.000000 +154734 -1.000000 +154735 -1.000000 +154736 -1.000000 +154737 -1.000000 +154738 -1.000000 +154739 -1.000000 +154740 -1.000000 +154741 -1.000000 +154742 -1.000000 +154743 -1.000000 +154744 -1.000000 +154747 -1.000000 +154748 -1.000000 +154749 -1.000000 +154750 -1.000000 +154751 -1.000000 +154752 -1.000000 +154753 -1.000000 +154754 -1.000000 +154755 -1.000000 +154759 -1.000000 +154760 -1.000000 +154761 -1.000000 +154763 -1.000000 +154764 -1.000000 +154765 -1.000000 +154767 -1.000000 +154774 -1.000000 +154776 -1.000000 +154777 -1.000000 +154779 -1.000000 +154780 -1.000000 +154781 -1.000000 +154785 -1.000000 +154786 -1.000000 +154787 -1.000000 +154788 -1.000000 +154789 -1.000000 +154797 -1.000000 +154830 -1.000000 +154831 -1.000000 +154833 -1.000000 +154834 -1.000000 +154835 -1.000000 +154836 -1.000000 +154837 -1.000000 +154842 -1.000000 +154849 -1.000000 +154858 -1.000000 +154859 -1.000000 +154860 -1.000000 +154861 -1.000000 +154862 -1.000000 +154863 -1.000000 +154864 -1.000000 +154865 -1.000000 +154866 -1.000000 +154867 -1.000000 +154868 -1.000000 +154869 -1.000000 +154870 -1.000000 +154871 -1.000000 +154872 -1.000000 +154873 -1.000000 +154879 -1.000000 +154893 -1.000000 +154894 -1.000000 +154919 -1.000000 +154922 -1.000000 +154926 -1.000000 +154927 -1.000000 +154928 -1.000000 +154929 -1.000000 +154930 -1.000000 +154931 -1.000000 +154932 -1.000000 +154933 -1.000000 +154934 -1.000000 +154935 -1.000000 +154937 -1.000000 +154939 -1.000000 +154971 -1.000000 +154976 -1.000000 +154980 -1.000000 +154982 -1.000000 +154984 -1.000000 +154993 -1.000000 +155003 -1.000000 +155004 -1.000000 +155005 -1.000000 +155008 -1.000000 +155011 -1.000000 +155013 -1.000000 +155023 -1.000000 +155024 -1.000000 +155025 -1.000000 +155026 -1.000000 +155027 -1.000000 +155028 -1.000000 +155029 -1.000000 +155030 -1.000000 +155038 -1.000000 +155039 -1.000000 +155068 -1.000000 +155103 -1.000000 +155105 -1.000000 +155106 -1.000000 +155107 -1.000000 +155113 -1.000000 +155114 -1.000000 +155115 -1.000000 +155117 -1.000000 +155118 -1.000000 +155119 -1.000000 +155120 -1.000000 +155121 -1.000000 +155122 -1.000000 +155123 -1.000000 +155125 -1.000000 +155126 -1.000000 +155127 -1.000000 +155128 -1.000000 +155129 -1.000000 +155130 -1.000000 +155131 -1.000000 +155132 -1.000000 +155133 -1.000000 +155134 -1.000000 +155135 -1.000000 +155136 -1.000000 +155137 -1.000000 +155138 -1.000000 +155139 -1.000000 +155140 -1.000000 +155141 -1.000000 +155142 -1.000000 +155143 -1.000000 +155147 -1.000000 +155148 -1.000000 +155149 -1.000000 +155150 -1.000000 +155151 -1.000000 +155152 -1.000000 +155153 -1.000000 +155154 -1.000000 +155156 -1.000000 +155157 -1.000000 +155158 -1.000000 +155159 -1.000000 +155160 -1.000000 +155161 -1.000000 +155162 -1.000000 +155163 -1.000000 +155164 -1.000000 +155165 -1.000000 +155166 -1.000000 +155167 -1.000000 +155168 -1.000000 +155170 -1.000000 +155171 -1.000000 +155172 -1.000000 +155173 -1.000000 +155174 -1.000000 +155175 -1.000000 +155182 -1.000000 +155183 -1.000000 +155194 -1.000000 +155195 -1.000000 +155199 -1.000000 +155209 -1.000000 +155212 -1.000000 +155213 -1.000000 +155225 -1.000000 +155227 -1.000000 +155228 -1.000000 +155229 -1.000000 +155230 -1.000000 +155231 -1.000000 +155232 -1.000000 +155233 -1.000000 +155234 -1.000000 +155235 -1.000000 +155236 -1.000000 +155237 -1.000000 +155238 -1.000000 +155239 -1.000000 +155240 -1.000000 +155241 -1.000000 +155242 -1.000000 +155243 -1.000000 +155244 -1.000000 +155245 -1.000000 +155247 -1.000000 +155248 -1.000000 +155249 -1.000000 +155250 -1.000000 +155251 -1.000000 +155252 -1.000000 +155253 -1.000000 +155254 -1.000000 +155256 -1.000000 +155258 -1.000000 +155259 -1.000000 +155270 -1.000000 +155272 -1.000000 +155273 -1.000000 +155279 -1.000000 +155281 -1.000000 +155282 -1.000000 +155283 -1.000000 +155284 -1.000000 +155285 -1.000000 +155288 -1.000000 +155290 -1.000000 +155291 -1.000000 +155292 -1.000000 +155293 -1.000000 +155295 -1.000000 +155296 -1.000000 +155297 -1.000000 +155298 -1.000000 +155299 -1.000000 +155320 -1.000000 +155321 -1.000000 +155322 -1.000000 +155323 -1.000000 +155324 -1.000000 +155326 -1.000000 +155328 -1.000000 +155330 -1.000000 +155335 -1.000000 +155337 -1.000000 +155342 -1.000000 +155343 -1.000000 +155344 -1.000000 +155345 -1.000000 +155346 -1.000000 +155347 -1.000000 +155348 -1.000000 +155352 -1.000000 +155355 -1.000000 +155365 -1.000000 +155366 -1.000000 +155367 -1.000000 +155368 -1.000000 +155369 -1.000000 +155370 -1.000000 +155371 -1.000000 +155372 -1.000000 +155373 -1.000000 +155374 -1.000000 +155375 -1.000000 +155377 -1.000000 +155378 -1.000000 +155379 -1.000000 +155381 -1.000000 +155382 -1.000000 +155383 -1.000000 +155384 -1.000000 +155385 -1.000000 +155386 -1.000000 +155390 -1.000000 +155391 -1.000000 +155392 -1.000000 +155393 -1.000000 +155394 -1.000000 +155407 -1.000000 +155408 -1.000000 +155409 -1.000000 +155411 -1.000000 +155412 -1.000000 +155413 -1.000000 +155414 -1.000000 +155417 -1.000000 +155418 -1.000000 +155419 -1.000000 +155420 -1.000000 +155421 -1.000000 +155422 -1.000000 +155423 -1.000000 +155425 -1.000000 +155426 -1.000000 +155427 -1.000000 +155428 -1.000000 +155429 -1.000000 +155430 -1.000000 +155431 -1.000000 +155432 -1.000000 +155433 -1.000000 +155434 -1.000000 +155435 -1.000000 +155436 -1.000000 +155437 -1.000000 +155439 -1.000000 +155440 -1.000000 +155442 -1.000000 +155446 -1.000000 +155447 -1.000000 +155448 -1.000000 +155449 -1.000000 +155451 -1.000000 +155463 -1.000000 +155466 -1.000000 +155467 -1.000000 +155474 -1.000000 +155475 -1.000000 +155476 -1.000000 +155477 -1.000000 +155478 -1.000000 +155479 -1.000000 +155480 -1.000000 +155481 -1.000000 +155483 -1.000000 +155484 -1.000000 +155485 -1.000000 +155486 -1.000000 +155487 -1.000000 +155499 -1.000000 +155500 -1.000000 +155501 -1.000000 +155502 -1.000000 +155503 -1.000000 +155504 -1.000000 +155505 -1.000000 +155506 -1.000000 +155507 -1.000000 +155508 -1.000000 +155509 -1.000000 +155510 -1.000000 +155511 -1.000000 +155512 -1.000000 +155513 -1.000000 +155514 -1.000000 +155515 -1.000000 +155516 -1.000000 +155517 -1.000000 +155518 -1.000000 +155519 -1.000000 +155520 -1.000000 +155521 -1.000000 +155522 -1.000000 +155523 -1.000000 +155524 -1.000000 +155526 -1.000000 +155527 -1.000000 +155528 -1.000000 +155529 -1.000000 +155530 -1.000000 +155535 -1.000000 +155536 -1.000000 +155537 -1.000000 +155538 -1.000000 +155539 -1.000000 +155540 -1.000000 +155541 -1.000000 +155542 -1.000000 +155543 -1.000000 +155545 -1.000000 +155546 -1.000000 +155548 -1.000000 +155551 -1.000000 +155552 -1.000000 +155553 -1.000000 +155558 -1.000000 +155559 -1.000000 +155564 -1.000000 +155565 -1.000000 +155566 -1.000000 +155567 -1.000000 +155568 -1.000000 +155569 -1.000000 +155570 -1.000000 +155571 -1.000000 +155572 -1.000000 +155573 -1.000000 +155574 -1.000000 +155575 -1.000000 +155576 -1.000000 +155577 -1.000000 +155578 -1.000000 +155579 -1.000000 +155580 -1.000000 +155581 -1.000000 +155582 -1.000000 +155583 -1.000000 +155584 -1.000000 +155585 -1.000000 +155586 -1.000000 +155589 -1.000000 +155590 -1.000000 +155592 -1.000000 +155593 -1.000000 +155595 -1.000000 +155596 -1.000000 +155599 -1.000000 +155600 -1.000000 +155601 -1.000000 +155602 -1.000000 +155611 -1.000000 +155612 -1.000000 +155613 -1.000000 +155614 -1.000000 +155615 -1.000000 +155616 -1.000000 +155617 -1.000000 +155618 -1.000000 +155619 -1.000000 +155620 -1.000000 +155621 -1.000000 +155622 -1.000000 +155623 -1.000000 +155624 -1.000000 +155625 -1.000000 +155626 -1.000000 +155627 -1.000000 +155628 -1.000000 +155629 -1.000000 +155630 -1.000000 +155631 -1.000000 +155632 -1.000000 +155633 -1.000000 +155641 -1.000000 +155644 -1.000000 +155645 -1.000000 +155646 -1.000000 +155648 -1.000000 +155649 -1.000000 +155650 -1.000000 +155651 -1.000000 +155654 -1.000000 +155655 -1.000000 +155656 -1.000000 +155657 -1.000000 +155658 -1.000000 +155660 -1.000000 +155674 -1.000000 +155681 -1.000000 +156197 -1.000000 +156201 -1.000000 +156202 -1.000000 +156203 -1.000000 +156204 -1.000000 +156206 -1.000000 +156207 -1.000000 +156225 -1.000000 +156226 -1.000000 +156227 -1.000000 +156228 -1.000000 +156229 -1.000000 +156230 -1.000000 +156231 -1.000000 +156232 -1.000000 +156233 -1.000000 +156234 -1.000000 +156235 -1.000000 +156236 -1.000000 +156242 -1.000000 +156243 -1.000000 +156245 -1.000000 +156246 -1.000000 +156247 -1.000000 +156248 -1.000000 +156249 -1.000000 +156250 -1.000000 +156251 -1.000000 +156252 -1.000000 +156253 -1.000000 +156256 -1.000000 +156257 -1.000000 +156258 -1.000000 +156259 -1.000000 +156260 -1.000000 +156261 -1.000000 +156262 -1.000000 +156263 -1.000000 +156264 -1.000000 +156265 -1.000000 +156266 -1.000000 +156274 -1.000000 +156275 -1.000000 +156276 -1.000000 +156277 -1.000000 +156278 -1.000000 +156279 -1.000000 +156280 -1.000000 +156281 -1.000000 +156282 -1.000000 +156283 -1.000000 +156284 -1.000000 +156285 -1.000000 +156286 -1.000000 +156287 -1.000000 +156288 -1.000000 +156292 -1.000000 +156294 -1.000000 +156297 -1.000000 +156298 -1.000000 +156299 -1.000000 +156300 -1.000000 +156301 -1.000000 +156302 -1.000000 +156307 -1.000000 +156308 -1.000000 +156309 -1.000000 +156310 -1.000000 +156311 -1.000000 +156312 -1.000000 +156313 -1.000000 +156314 -1.000000 +156315 -1.000000 +156317 -1.000000 +156318 -1.000000 +156320 -1.000000 +156327 -1.000000 +156332 -1.000000 +156337 -1.000000 +156339 -1.000000 +156340 -1.000000 +156341 -1.000000 +156342 -1.000000 +156349 -1.000000 +156351 -1.000000 +156352 -1.000000 +156353 -1.000000 +156354 -1.000000 +156355 -1.000000 +156356 -1.000000 +156357 -1.000000 +156358 -1.000000 +156359 -1.000000 +156360 -1.000000 +156361 -1.000000 +156362 -1.000000 +156363 -1.000000 +156364 -1.000000 +156365 -1.000000 +156366 -1.000000 +156367 -1.000000 +156368 -1.000000 +156369 -1.000000 +156370 -1.000000 +156371 -1.000000 +156372 -1.000000 +156373 -1.000000 +156374 -1.000000 +156375 -1.000000 +156376 -1.000000 +156384 -1.000000 +156386 -1.000000 +156387 -1.000000 +156388 -1.000000 +156389 -1.000000 +156393 -1.000000 +156394 -1.000000 +156395 -1.000000 +156396 -1.000000 +156397 -1.000000 +156398 -1.000000 +156400 -1.000000 +156401 -1.000000 +156402 -1.000000 +156403 -1.000000 +156413 -1.000000 +156414 -1.000000 +156415 -1.000000 +156416 -1.000000 +156417 -1.000000 +156418 -1.000000 +156419 -1.000000 +156420 -1.000000 +156421 -1.000000 +156422 -1.000000 +156423 -1.000000 +156425 -1.000000 +156426 -1.000000 +156429 -1.000000 +156464 -1.000000 +156465 -1.000000 +156466 -1.000000 +156467 -1.000000 +156468 -1.000000 +156473 -1.000000 +156478 -1.000000 +156481 -1.000000 +156484 -1.000000 +156485 -1.000000 +156502 -1.000000 +156503 -1.000000 +156504 -1.000000 +156505 -1.000000 +156507 -1.000000 +156508 -1.000000 +156509 -1.000000 +156510 -1.000000 +156513 -1.000000 +156516 -1.000000 +156530 -1.000000 +156531 -1.000000 +156532 -1.000000 +156544 -1.000000 +156547 -1.000000 +156548 -1.000000 +156549 -1.000000 +156550 -1.000000 +156554 -1.000000 +156555 -1.000000 +156556 -1.000000 +156557 -1.000000 +156558 -1.000000 +156559 -1.000000 +156562 -1.000000 +156564 -1.000000 +156606 -1.000000 +156607 -1.000000 +156608 -1.000000 +156609 -1.000000 +156610 -1.000000 +156611 -1.000000 +156612 -1.000000 +156613 -1.000000 +156614 -1.000000 +156615 -1.000000 +156616 -1.000000 +156617 -1.000000 +156619 -1.000000 +156620 -1.000000 +156621 -1.000000 +156625 -1.000000 +156636 -1.000000 +156638 -1.000000 +156640 -1.000000 +156642 -1.000000 +156643 -1.000000 +156644 -1.000000 +156645 -1.000000 +156646 -1.000000 +156647 -1.000000 +156648 -1.000000 +156649 -1.000000 +156650 -1.000000 +156651 -1.000000 +156653 -1.000000 +156654 -1.000000 +156655 -1.000000 +156656 -1.000000 +156657 -1.000000 +156659 -1.000000 +156660 -1.000000 +156661 -1.000000 +156662 -1.000000 +156663 -1.000000 +156666 -1.000000 +156668 -1.000000 +156669 -1.000000 +156678 -1.000000 +156679 -1.000000 +156680 -1.000000 +156687 -1.000000 +156692 -1.000000 +156697 -1.000000 +156699 -1.000000 +156700 -1.000000 +156701 -1.000000 +156702 -1.000000 +156703 -1.000000 +156704 -1.000000 +156705 -1.000000 +156706 -1.000000 +156707 -1.000000 +156708 -1.000000 +156709 -1.000000 +156710 -1.000000 +156712 -1.000000 +156713 -1.000000 +156714 -1.000000 +156716 -1.000000 +156722 -1.000000 +156725 -1.000000 +156730 -1.000000 +156731 -1.000000 +156732 -1.000000 +156735 -1.000000 +156737 -1.000000 +156740 -1.000000 +156743 -1.000000 +156744 -1.000000 +156753 -1.000000 +156762 -1.000000 +156763 -1.000000 +156771 -1.000000 +156772 -1.000000 +156773 -1.000000 +156774 -1.000000 +156775 -1.000000 +156776 -1.000000 +156777 -1.000000 +156779 -1.000000 +156780 -1.000000 +156781 -1.000000 +156785 -1.000000 +156786 -1.000000 +156789 -1.000000 +156793 -1.000000 +156797 -1.000000 +156799 -1.000000 +156800 -1.000000 +156801 -1.000000 +156802 -1.000000 +156803 -1.000000 +156805 -1.000000 +156807 -1.000000 +156808 -1.000000 +156809 -1.000000 +156810 -1.000000 +156811 -1.000000 +156814 -1.000000 +156815 -1.000000 +156817 -1.000000 +156820 -1.000000 +156822 -1.000000 +156831 -1.000000 +156832 -1.000000 +156833 -1.000000 +156834 -1.000000 +156835 -1.000000 +156836 -1.000000 +156837 -1.000000 +156838 -1.000000 +156842 -1.000000 +156843 -1.000000 +156844 -1.000000 +156845 -1.000000 +156846 -1.000000 +156847 -1.000000 +156848 -1.000000 +156849 -1.000000 +156850 -1.000000 +156851 -1.000000 +156852 -1.000000 +156853 -1.000000 +156854 -1.000000 +156855 -1.000000 +156856 -1.000000 +156857 -1.000000 +156858 -1.000000 +156859 -1.000000 +156860 -1.000000 +156861 -1.000000 +156862 -1.000000 +156863 -1.000000 +156864 -1.000000 +156865 -1.000000 +156866 -1.000000 +156867 -1.000000 +156868 -1.000000 +156869 -1.000000 +156870 -1.000000 +156871 -1.000000 +156872 -1.000000 +156873 -1.000000 +156874 -1.000000 +156875 -1.000000 +156879 -1.000000 +156882 -1.000000 +156883 -1.000000 +156884 -1.000000 +156885 -1.000000 +156886 -1.000000 +156888 -1.000000 +156889 -1.000000 +156891 -1.000000 +156892 -1.000000 +156893 -1.000000 +156894 -1.000000 +156896 -1.000000 +156897 -1.000000 +156898 -1.000000 +156911 -1.000000 +156912 -1.000000 +156913 -1.000000 +156914 -1.000000 +156915 -1.000000 +156916 -1.000000 +156917 -1.000000 +156921 -1.000000 +156925 -1.000000 +157037 -1.000000 +157038 -1.000000 +157039 -1.000000 +157041 -1.000000 +157042 -1.000000 +157043 -1.000000 +157044 -1.000000 +157046 -1.000000 +157047 -1.000000 +157048 -1.000000 +157049 -1.000000 +157050 -1.000000 +157051 -1.000000 +157052 -1.000000 +157053 -1.000000 +157058 -1.000000 +157059 -1.000000 +157060 -1.000000 +157061 -1.000000 +157062 -1.000000 +157063 -1.000000 +157064 -1.000000 +157065 -1.000000 +157066 -1.000000 +157067 -1.000000 +157068 -1.000000 +157069 -1.000000 +157070 -1.000000 +157071 -1.000000 +157072 -1.000000 +157073 -1.000000 +157074 -1.000000 +157075 -1.000000 +157081 -1.000000 +157082 -1.000000 +157083 -1.000000 +157084 -1.000000 +157087 -1.000000 +157088 -1.000000 +157089 -1.000000 +157090 -1.000000 +157091 -1.000000 +157096 -1.000000 +157097 -1.000000 +157098 -1.000000 +157099 -1.000000 +157100 -1.000000 +157101 -1.000000 +157102 -1.000000 +157103 -1.000000 +157104 -1.000000 +157105 -1.000000 +157106 -1.000000 +157108 -1.000000 +157109 -1.000000 +157116 -1.000000 +157117 -1.000000 +157118 -1.000000 +157119 -1.000000 +157120 -1.000000 +157121 -1.000000 +157122 -1.000000 +157123 -1.000000 +157124 -1.000000 +157125 -1.000000 +157126 -1.000000 +157127 -1.000000 +157128 -1.000000 +157129 -1.000000 +157130 -1.000000 +157131 -1.000000 +157132 -1.000000 +157133 -1.000000 +157134 -1.000000 +157135 -1.000000 +157136 -1.000000 +157137 -1.000000 +157138 -1.000000 +157140 -1.000000 +157143 -1.000000 +157150 -1.000000 +157151 -1.000000 +157152 -1.000000 +157153 -1.000000 +157154 -1.000000 +157155 -1.000000 +157156 -1.000000 +157157 -1.000000 +157158 -1.000000 +157169 -1.000000 +157186 -1.000000 +157188 -1.000000 +157189 -1.000000 +157192 -1.000000 +157193 -1.000000 +157194 -1.000000 +157195 -1.000000 +157196 -1.000000 +157197 -1.000000 +157198 -1.000000 +157202 -1.000000 +157203 -1.000000 +157216 -1.000000 +157218 -1.000000 +157230 -1.000000 +157231 -1.000000 +157232 -1.000000 +157233 -1.000000 +157234 -1.000000 +157235 -1.000000 +157236 -1.000000 +157237 -1.000000 +157238 -1.000000 +157239 -1.000000 +157241 -1.000000 +157243 -1.000000 +157248 -1.000000 +157250 -1.000000 +157255 -1.000000 +157256 -1.000000 +157258 -1.000000 +157259 -1.000000 +157260 -1.000000 +157261 -1.000000 +157262 -1.000000 +157263 -1.000000 +157264 -1.000000 +157265 -1.000000 +157266 -1.000000 +157267 -1.000000 +157268 -1.000000 +157269 -1.000000 +157270 -1.000000 +157271 -1.000000 +157272 -1.000000 +157273 -1.000000 +157274 -1.000000 +157275 -1.000000 +157276 -1.000000 +157277 -1.000000 +157278 -1.000000 +157279 -1.000000 +157281 -1.000000 +157284 -1.000000 +157295 -1.000000 +157296 -1.000000 +157298 -1.000000 +157303 -1.000000 +157304 -1.000000 +157308 -1.000000 +157313 -1.000000 +157318 -1.000000 +157321 -1.000000 +157323 -1.000000 +157369 -1.000000 +157370 -1.000000 +157372 -1.000000 +157373 -1.000000 +157374 -1.000000 +157376 -1.000000 +157377 -1.000000 +157378 -1.000000 +157379 -1.000000 +157381 -1.000000 +157387 -1.000000 +157391 -1.000000 +157399 -1.000000 +157400 -1.000000 +157401 -1.000000 +157402 -1.000000 +157404 -1.000000 +157407 -1.000000 +157408 -1.000000 +157409 -1.000000 +157410 -1.000000 +157411 -1.000000 +157412 -1.000000 +157413 -1.000000 +157414 -1.000000 +157415 -1.000000 +157416 -1.000000 +157417 -1.000000 +157418 -1.000000 +157420 -1.000000 +157424 -1.000000 +157428 -1.000000 +157431 -1.000000 +157432 -1.000000 +157433 -1.000000 +157435 -1.000000 +157458 -1.000000 +157464 -1.000000 +157471 -1.000000 +157482 -1.000000 +157483 -1.000000 +157484 -1.000000 +157485 -1.000000 +157486 -1.000000 +157487 -1.000000 +157488 -1.000000 +157489 -1.000000 +157494 -1.000000 +157495 -1.000000 +157496 -1.000000 +157498 -1.000000 +157499 -1.000000 +157500 -1.000000 +157501 -1.000000 +157502 -1.000000 +157503 -1.000000 +157504 -1.000000 +157505 -1.000000 +157506 -1.000000 +157507 -1.000000 +157508 -1.000000 +157509 -1.000000 +157518 -1.000000 +157519 -1.000000 +157520 -1.000000 +157521 -1.000000 +157523 -1.000000 +157524 -1.000000 +157525 -1.000000 +157527 -1.000000 +157528 -1.000000 +157529 -1.000000 +157530 -1.000000 +157534 -1.000000 +157535 -1.000000 +157536 -1.000000 +157537 -1.000000 +157542 -1.000000 +157545 -1.000000 +157551 -1.000000 +157552 -1.000000 +157553 -1.000000 +157554 -1.000000 +157555 -1.000000 +157556 -1.000000 +157557 -1.000000 +157558 -1.000000 +157559 -1.000000 +157560 -1.000000 +157562 -1.000000 +157564 -1.000000 +157565 -1.000000 +157566 -1.000000 +157567 -1.000000 +157571 -1.000000 +157572 -1.000000 +157573 -1.000000 +157574 -1.000000 +157575 -1.000000 +157576 -1.000000 +157577 -1.000000 +157578 -1.000000 +157579 -1.000000 +157580 -1.000000 +157654 -1.000000 +157655 -1.000000 +157656 -1.000000 +157657 -1.000000 +157658 -1.000000 +157661 -1.000000 +157664 -1.000000 +157665 -1.000000 +157666 -1.000000 +157667 -1.000000 +157668 -1.000000 +157669 -1.000000 +157671 -1.000000 +157672 -1.000000 +157673 -1.000000 +157674 -1.000000 +157675 -1.000000 +157676 -1.000000 +157677 -1.000000 +157678 -1.000000 +157679 -1.000000 +157685 -1.000000 +157686 -1.000000 +157687 -1.000000 +157694 -1.000000 +157699 -1.000000 +157700 -1.000000 +157704 -1.000000 +157705 -1.000000 +157706 -1.000000 +157707 -1.000000 +157708 -1.000000 +157709 -1.000000 +157710 -1.000000 +157713 -1.000000 +157714 -1.000000 +157715 -1.000000 +157723 -1.000000 +157724 -1.000000 +157725 -1.000000 +157726 -1.000000 +157727 -1.000000 +157728 -1.000000 +157729 -1.000000 +157730 -1.000000 +157731 -1.000000 +157732 -1.000000 +157733 -1.000000 +157734 -1.000000 +157735 -1.000000 +157736 -1.000000 +157737 -1.000000 +157738 -1.000000 +157739 -1.000000 +157740 -1.000000 +157741 -1.000000 +157742 -1.000000 +157743 -1.000000 +157744 -1.000000 +157745 -1.000000 +157746 -1.000000 +157747 -1.000000 +157748 -1.000000 +157749 -1.000000 +157750 -1.000000 +157751 -1.000000 +157752 -1.000000 +157753 -1.000000 +157754 -1.000000 +157755 -1.000000 +157756 -1.000000 +157757 -1.000000 +157758 -1.000000 +157759 -1.000000 +157777 -1.000000 +157782 -1.000000 +157783 -1.000000 +157784 -1.000000 +157787 -1.000000 +157793 -1.000000 +157804 -1.000000 +157805 -1.000000 +157806 -1.000000 +157814 -1.000000 +157817 -1.000000 +157819 -1.000000 +157850 -1.000000 +157851 -1.000000 +157858 -1.000000 +157864 -1.000000 +157868 -1.000000 +157880 -1.000000 +157896 -1.000000 +157898 -1.000000 +157899 -1.000000 +157900 -1.000000 +157901 -1.000000 +157902 -1.000000 +157903 -1.000000 +157904 -1.000000 +157905 -1.000000 +157906 -1.000000 +157907 -1.000000 +157908 -1.000000 +157910 -1.000000 +157911 -1.000000 +157912 -1.000000 +157913 -1.000000 +157914 -1.000000 +157915 -1.000000 +157916 -1.000000 +157917 -1.000000 +157918 -1.000000 +157919 -1.000000 +157920 -1.000000 +157930 -1.000000 +157931 -1.000000 +157932 -1.000000 +157933 -1.000000 +157934 -1.000000 +157935 -1.000000 +157947 -1.000000 +157948 -1.000000 +157949 -1.000000 +157950 -1.000000 +157951 -1.000000 +157952 -1.000000 +157953 -1.000000 +157954 -1.000000 +157955 -1.000000 +157956 -1.000000 +157957 -1.000000 +157958 -1.000000 +157959 -1.000000 +157960 -1.000000 +157961 -1.000000 +157962 -1.000000 +157963 -1.000000 +157964 -1.000000 +157965 -1.000000 +157966 -1.000000 +157967 -1.000000 +157968 -1.000000 +157970 -1.000000 +157971 -1.000000 +157972 -1.000000 +157974 -1.000000 +157975 -1.000000 +157976 -1.000000 +157978 -1.000000 +157983 -1.000000 +157985 -1.000000 +157987 -1.000000 +157988 -1.000000 +157989 -1.000000 +157993 -1.000000 +157994 -1.000000 +157996 -1.000000 +157997 -1.000000 +158002 -1.000000 +158006 -1.000000 +158008 -1.000000 +158011 -1.000000 +158012 -1.000000 +158013 -1.000000 +158016 -1.000000 +158017 -1.000000 +158019 -1.000000 +158021 -1.000000 +158030 -1.000000 +158031 -1.000000 +158032 -1.000000 +158033 -1.000000 +158035 -1.000000 +158036 -1.000000 +158037 -1.000000 +158038 -1.000000 +158039 -1.000000 +158040 -1.000000 +158041 -1.000000 +158042 -1.000000 +158043 -1.000000 +158051 -1.000000 +158052 -1.000000 +158053 -1.000000 +158054 -1.000000 +158055 -1.000000 +158056 -1.000000 +158057 -1.000000 +158058 -1.000000 +158072 -1.000000 +158076 -1.000000 +158087 -1.000000 +158088 -1.000000 +158104 -1.000000 +158106 -1.000000 +158108 -1.000000 +158109 -1.000000 +158110 -1.000000 +158111 -1.000000 +158115 -1.000000 +158121 -1.000000 +158126 -1.000000 +158131 -1.000000 +158132 -1.000000 +158133 -1.000000 +158134 -1.000000 +158135 -1.000000 +158138 -1.000000 +158140 -1.000000 +158141 -1.000000 +158142 -1.000000 +158143 -1.000000 +158144 -1.000000 +158145 -1.000000 +158146 -1.000000 +158147 -1.000000 +158148 -1.000000 +158149 -1.000000 +158150 -1.000000 +158151 -1.000000 +158152 -1.000000 +158153 -1.000000 +158154 -1.000000 +158155 -1.000000 +158156 -1.000000 +158157 -1.000000 +158158 -1.000000 +158160 -1.000000 +158161 -1.000000 +158163 -1.000000 +158164 -1.000000 +158165 -1.000000 +158166 -1.000000 +158167 -1.000000 +158168 -1.000000 +158169 -1.000000 +158289 -1.000000 +158290 -1.000000 +158293 -1.000000 +158294 -1.000000 +158295 -1.000000 +158298 -1.000000 +158304 -1.000000 +158305 -1.000000 +158306 -1.000000 +158307 -1.000000 +158308 -1.000000 +158309 -1.000000 +158310 -1.000000 +158311 -1.000000 +158312 -1.000000 +158313 -1.000000 +158314 -1.000000 +158315 -1.000000 +158316 -1.000000 +158317 -1.000000 +158318 -1.000000 +158319 -1.000000 +158327 -1.000000 +158329 -1.000000 +158330 -1.000000 +158331 -1.000000 +158332 -1.000000 +158333 -1.000000 +158337 -1.000000 +158345 -1.000000 +158346 -1.000000 +158347 -1.000000 +158349 -1.000000 +158355 -1.000000 +158356 -1.000000 +158364 -1.000000 +158370 -1.000000 +158371 -1.000000 +158372 -1.000000 +158374 -1.000000 +158375 -1.000000 +158376 -1.000000 +158380 -1.000000 +158381 -1.000000 +158385 -1.000000 +158386 -1.000000 +158388 -1.000000 +158391 -1.000000 +158392 -1.000000 +158393 -1.000000 +158400 -1.000000 +158403 -1.000000 +158404 -1.000000 +158405 -1.000000 +158406 -1.000000 +158411 -1.000000 +158412 -1.000000 +158413 -1.000000 +158414 -1.000000 +158415 -1.000000 +158416 -1.000000 +158417 -1.000000 +158421 -1.000000 +158423 -1.000000 +158426 -1.000000 +158428 -1.000000 +158438 -1.000000 +158444 -1.000000 +158445 -1.000000 +158446 -1.000000 +158449 -1.000000 +158450 -1.000000 +158454 -1.000000 +158455 -1.000000 +158457 -1.000000 +158458 -1.000000 +158459 -1.000000 +158499 -1.000000 +158500 -1.000000 +158501 -1.000000 +158502 -1.000000 +158512 -1.000000 +158513 -1.000000 +158514 -1.000000 +158515 -1.000000 +158517 -1.000000 +158518 -1.000000 +158519 -1.000000 +158520 -1.000000 +158521 -1.000000 +158522 -1.000000 +158525 -1.000000 +158526 -1.000000 +158527 -1.000000 +158529 -1.000000 +158530 -1.000000 +158531 -1.000000 +158532 -1.000000 +158533 -1.000000 +158534 -1.000000 +158535 -1.000000 +158537 -1.000000 +158538 -1.000000 +158539 -1.000000 +158540 -1.000000 +158541 -1.000000 +158542 -1.000000 +158543 -1.000000 +158544 -1.000000 +158545 -1.000000 +158546 -1.000000 +158553 -1.000000 +158554 -1.000000 +158555 -1.000000 +158556 -1.000000 +158557 -1.000000 +158558 -1.000000 +158559 -1.000000 +158560 -1.000000 +158561 -1.000000 +158562 -1.000000 +158563 -1.000000 +158564 -1.000000 +158565 -1.000000 +158566 -1.000000 +158567 -1.000000 +158568 -1.000000 +158569 -1.000000 +158570 -1.000000 +158571 -1.000000 +158572 -1.000000 +158573 -1.000000 +158574 -1.000000 +158576 -1.000000 +158577 -1.000000 +158578 -1.000000 +158579 -1.000000 +158580 -1.000000 +158582 -1.000000 +158589 -1.000000 +158590 -1.000000 +158591 -1.000000 +158592 -1.000000 +158593 -1.000000 +158594 -1.000000 +158595 -1.000000 +158596 -1.000000 +158597 -1.000000 +158598 -1.000000 +158599 -1.000000 +158600 -1.000000 +158601 -1.000000 +158602 -1.000000 +158603 -1.000000 +158604 -1.000000 +158605 -1.000000 +158606 -1.000000 +158607 -1.000000 +158608 -1.000000 +158609 -1.000000 +158610 -1.000000 +158611 -1.000000 +158612 -1.000000 +158613 -1.000000 +158615 -1.000000 +158616 -1.000000 +158617 -1.000000 +158619 -1.000000 +158620 -1.000000 +158621 -1.000000 +158624 -1.000000 +158629 -1.000000 +158631 -1.000000 +158633 -1.000000 +158634 -1.000000 +158635 -1.000000 +158636 -1.000000 +158637 -1.000000 +158638 -1.000000 +158640 -1.000000 +158641 -1.000000 +158642 -1.000000 +158643 -1.000000 +158644 -1.000000 +158645 -1.000000 +158646 -1.000000 +158647 -1.000000 +158648 -1.000000 +158649 -1.000000 +158651 -1.000000 +158654 -1.000000 +158655 -1.000000 +158656 -1.000000 +158657 -1.000000 +158658 -1.000000 +158659 -1.000000 +158660 -1.000000 +158661 -1.000000 +158662 -1.000000 +158663 -1.000000 +158664 -1.000000 +158672 -1.000000 +158673 -1.000000 +158674 -1.000000 +158675 -1.000000 +158676 -1.000000 +158677 -1.000000 +158678 -1.000000 +158679 -1.000000 +158680 -1.000000 +158681 -1.000000 +158682 -1.000000 +158683 -1.000000 +158684 -1.000000 +158685 -1.000000 +158686 -1.000000 +158687 -1.000000 +158688 -1.000000 +158689 -1.000000 +158690 -1.000000 +158691 -1.000000 +158692 -1.000000 +158693 -1.000000 +158694 -1.000000 +158695 -1.000000 +158696 -1.000000 +158697 -1.000000 +158698 -1.000000 +158699 -1.000000 +158700 -1.000000 +158701 -1.000000 +158702 -1.000000 +158703 -1.000000 +158704 -1.000000 +158705 -1.000000 +158706 -1.000000 +158739 -1.000000 +158741 -1.000000 +158742 -1.000000 +158743 -1.000000 +158744 -1.000000 +158745 -1.000000 +158746 -1.000000 +158747 -1.000000 +158748 -1.000000 +158749 -1.000000 +158750 -1.000000 +158751 -1.000000 +158752 -1.000000 +158754 -1.000000 +158755 -1.000000 +158756 -1.000000 +158760 -1.000000 +158761 -1.000000 +158762 -1.000000 +158763 -1.000000 +158764 -1.000000 +158766 -1.000000 +158767 -1.000000 +158768 -1.000000 +158769 -1.000000 +158770 -1.000000 +158771 -1.000000 +158772 -1.000000 +158774 -1.000000 +158775 -1.000000 +158776 -1.000000 +158777 -1.000000 +158778 -1.000000 +158779 -1.000000 +158780 -1.000000 +158781 -1.000000 +158782 -1.000000 +158783 -1.000000 +158784 -1.000000 +158787 -1.000000 +158789 -1.000000 +158790 -1.000000 +158791 -1.000000 +158792 -1.000000 +158793 -1.000000 +158800 -1.000000 +158803 -1.000000 +158804 -1.000000 +158805 -1.000000 +158806 -1.000000 +158811 -1.000000 +158816 -1.000000 +158817 -1.000000 +158818 -1.000000 +158819 -1.000000 +158821 -1.000000 +158822 -1.000000 +158823 -1.000000 +158824 -1.000000 +158825 -1.000000 +158827 -1.000000 +158828 -1.000000 +158829 -1.000000 +158830 -1.000000 +158831 -1.000000 +158832 -1.000000 +158833 -1.000000 +158834 -1.000000 +158835 -1.000000 +158852 -1.000000 +158854 -1.000000 +158855 -1.000000 +158856 -1.000000 +158858 -1.000000 +158859 -1.000000 +158860 -1.000000 +158861 -1.000000 +158862 -1.000000 +158864 -1.000000 +158865 -1.000000 +158866 -1.000000 +158867 -1.000000 +158868 -1.000000 +158869 -1.000000 +158871 -1.000000 +158872 -1.000000 +158873 -1.000000 +158874 -1.000000 +158875 -1.000000 +158876 -1.000000 +158877 -1.000000 +158878 -1.000000 +158883 -1.000000 +158885 -1.000000 +158886 -1.000000 +158888 -1.000000 +158895 -1.000000 +158896 -1.000000 +158897 -1.000000 +158898 -1.000000 +158899 -1.000000 +158900 -1.000000 +158901 -1.000000 +158902 -1.000000 +158903 -1.000000 +158904 -1.000000 +158905 -1.000000 +158906 -1.000000 +158911 -1.000000 +158912 -1.000000 +158913 -1.000000 +158914 -1.000000 +158915 -1.000000 +158916 -1.000000 +158917 -1.000000 +158918 -1.000000 +158919 -1.000000 +158920 -1.000000 +158921 -1.000000 +158922 -1.000000 +158923 -1.000000 +158924 -1.000000 +158925 -1.000000 +158926 -1.000000 +158929 -1.000000 +158933 -1.000000 +158934 -1.000000 +158936 -1.000000 +158939 -1.000000 +158940 -1.000000 +158942 -1.000000 +158949 -1.000000 +158950 -1.000000 +158951 -1.000000 +158952 -1.000000 +158953 -1.000000 +158954 -1.000000 +158955 -1.000000 +158956 -1.000000 +158957 -1.000000 +158958 -1.000000 +158959 -1.000000 +158960 -1.000000 +158961 -1.000000 +158962 -1.000000 +158963 -1.000000 +158964 -1.000000 +158965 -1.000000 +158967 -1.000000 +158968 -1.000000 +158969 -1.000000 +158970 -1.000000 +158971 -1.000000 +158972 -1.000000 +158973 -1.000000 +158974 -1.000000 +158975 -1.000000 +158976 -1.000000 +158977 -1.000000 +158978 -1.000000 +158979 -1.000000 +158980 -1.000000 +158981 -1.000000 +158986 -1.000000 +158987 -1.000000 +158988 -1.000000 +158989 -1.000000 +158991 -1.000000 +158992 -1.000000 +158993 -1.000000 +158994 -1.000000 +158995 -1.000000 +158996 -1.000000 +158997 -1.000000 +159001 -1.000000 +159002 -1.000000 +159003 -1.000000 +159004 -1.000000 +159006 -1.000000 +159007 -1.000000 +159008 -1.000000 +159009 -1.000000 +159010 -1.000000 +159011 -1.000000 +159012 -1.000000 +159013 -1.000000 +159014 -1.000000 +159015 -1.000000 +159016 -1.000000 +159017 -1.000000 +159018 -1.000000 +159019 -1.000000 +159020 -1.000000 +159021 -1.000000 +159024 -1.000000 +159033 -1.000000 +159034 -1.000000 +159111 -1.000000 +159113 -1.000000 +159114 -1.000000 +159115 -1.000000 +159116 -1.000000 +159117 -1.000000 +159118 -1.000000 +159119 -1.000000 +159120 -1.000000 +159121 -1.000000 +159122 -1.000000 +159123 -1.000000 +159124 -1.000000 +159125 -1.000000 +159126 -1.000000 +159127 -1.000000 +159128 -1.000000 +159129 -1.000000 +159130 -1.000000 +159131 -1.000000 +159132 -1.000000 +159133 -1.000000 +159141 -1.000000 +159147 -1.000000 +159149 -1.000000 +159150 -1.000000 +159161 -1.000000 +159168 -1.000000 +159170 -1.000000 +159172 -1.000000 +159173 -1.000000 +159174 -1.000000 +159175 -1.000000 +159176 -1.000000 +159177 -1.000000 +159178 -1.000000 +159179 -1.000000 +159180 -1.000000 +159181 -1.000000 +159182 -1.000000 +159183 -1.000000 +159184 -1.000000 +159189 -1.000000 +159190 -1.000000 +159191 -1.000000 +159192 -1.000000 +159193 -1.000000 +159194 -1.000000 +159201 -1.000000 +159202 -1.000000 +159207 -1.000000 +159210 -1.000000 +159211 -1.000000 +159219 -1.000000 +159222 -1.000000 +159229 -1.000000 +159231 -1.000000 +159242 -1.000000 +159243 -1.000000 +159244 -1.000000 +159245 -1.000000 +159248 -1.000000 +159249 -1.000000 +159250 -1.000000 +159251 -1.000000 +159253 -1.000000 +159254 -1.000000 +159255 -1.000000 +159256 -1.000000 +159257 -1.000000 +159258 -1.000000 +159262 -1.000000 +159263 -1.000000 +159264 -1.000000 +159265 -1.000000 +159267 -1.000000 +159268 -1.000000 +159269 -1.000000 +159270 -1.000000 +159271 -1.000000 +159272 -1.000000 +159273 -1.000000 +159274 -1.000000 +159275 -1.000000 +159276 -1.000000 +159277 -1.000000 +159282 -1.000000 +159283 -1.000000 +159284 -1.000000 +159286 -1.000000 +159287 -1.000000 +159288 -1.000000 +159289 -1.000000 +159290 -1.000000 +159291 -1.000000 +159292 -1.000000 +159293 -1.000000 +159294 -1.000000 +159295 -1.000000 +159296 -1.000000 +159297 -1.000000 +159298 -1.000000 +159299 -1.000000 +159300 -1.000000 +159301 -1.000000 +159302 -1.000000 +159303 -1.000000 +159304 -1.000000 +159305 -1.000000 +159306 -1.000000 +159307 -1.000000 +159308 -1.000000 +159309 -1.000000 +159310 -1.000000 +159311 -1.000000 +159312 -1.000000 +159313 -1.000000 +159314 -1.000000 +159315 -1.000000 +159316 -1.000000 +159318 -1.000000 +159319 -1.000000 +159320 -1.000000 +159321 -1.000000 +159339 -1.000000 +159351 -1.000000 +159352 -1.000000 +159353 -1.000000 +159354 -1.000000 +159355 -1.000000 +159357 -1.000000 +159358 -1.000000 +159359 -1.000000 +159365 -1.000000 +159366 -1.000000 +159367 -1.000000 +159371 -1.000000 +159375 -1.000000 +159376 -1.000000 +159377 -1.000000 +159379 -1.000000 +159386 -1.000000 +159387 -1.000000 +159388 -1.000000 +159389 -1.000000 +159390 -1.000000 +159391 -1.000000 +159392 -1.000000 +159393 -1.000000 +159394 -1.000000 +159395 -1.000000 +159398 -1.000000 +159416 -1.000000 +159423 -1.000000 +159432 -1.000000 +159438 -1.000000 +159442 -1.000000 +159443 -1.000000 +159448 -1.000000 +159449 -1.000000 +159450 -1.000000 +159451 -1.000000 +159452 -1.000000 +159453 -1.000000 +159454 -1.000000 +159455 -1.000000 +159456 -1.000000 +159457 -1.000000 +159458 -1.000000 +159460 -1.000000 +159461 -1.000000 +159462 -1.000000 +159463 -1.000000 +159464 -1.000000 +159465 -1.000000 +159467 -1.000000 +159468 -1.000000 +159469 -1.000000 +159470 -1.000000 +159471 -1.000000 +159472 -1.000000 +159473 -1.000000 +159474 -1.000000 +159475 -1.000000 +159476 -1.000000 +159482 -1.000000 +159530 -1.000000 +159531 -1.000000 +159532 -1.000000 +159533 -1.000000 +159534 -1.000000 +159535 -1.000000 +159536 -1.000000 +159537 -1.000000 +159539 -1.000000 +159540 -1.000000 +159541 -1.000000 +159543 -1.000000 +159552 -1.000000 +159554 -1.000000 +159555 -1.000000 +159556 -1.000000 +159557 -1.000000 +159558 -1.000000 +159559 -1.000000 +159560 -1.000000 +159561 -1.000000 +159563 -1.000000 +159564 -1.000000 +159565 -1.000000 +159566 -1.000000 +159569 -1.000000 +159580 -1.000000 +159581 -1.000000 +159582 -1.000000 +159583 -1.000000 +159584 -1.000000 +159585 -1.000000 +159588 -1.000000 +159589 -1.000000 +159591 -1.000000 +159592 -1.000000 +159596 -1.000000 +159597 -1.000000 +159598 -1.000000 +159599 -1.000000 +159600 -1.000000 +159601 -1.000000 +159602 -1.000000 +159603 -1.000000 +159605 -1.000000 +159607 -1.000000 +159608 -1.000000 +159609 -1.000000 +159611 -1.000000 +159613 -1.000000 +159614 -1.000000 +159621 -1.000000 +159631 -1.000000 +159632 -1.000000 +159634 -1.000000 +159636 -1.000000 +159637 -1.000000 +159638 -1.000000 +159639 -1.000000 +159640 -1.000000 +159641 -1.000000 +159642 -1.000000 +159643 -1.000000 +159644 -1.000000 +159645 -1.000000 +159646 -1.000000 +159647 -1.000000 +159648 -1.000000 +159649 -1.000000 +159650 -1.000000 +159651 -1.000000 +159652 -1.000000 +159653 -1.000000 +159654 -1.000000 +159655 -1.000000 +159656 -1.000000 +159657 -1.000000 +159658 -1.000000 +159659 -1.000000 +159661 -1.000000 +159662 -1.000000 +159663 -1.000000 +159664 -1.000000 +159665 -1.000000 +159666 -1.000000 +159667 -1.000000 +159680 -1.000000 +159682 -1.000000 +159684 -1.000000 +159685 -1.000000 +159686 -1.000000 +159688 -1.000000 +159690 -1.000000 +159691 -1.000000 +159694 -1.000000 +159700 -1.000000 +159701 -1.000000 +159703 -1.000000 +159704 -1.000000 +159710 -1.000000 +159711 -1.000000 +159712 -1.000000 +159713 -1.000000 +159714 -1.000000 +159715 -1.000000 +159716 -1.000000 +159717 -1.000000 +159718 -1.000000 +159719 -1.000000 +159720 -1.000000 +159721 -1.000000 +159722 -1.000000 +159723 -1.000000 +159724 -1.000000 +159725 -1.000000 +159726 -1.000000 +159727 -1.000000 +159728 -1.000000 +159729 -1.000000 +159730 -1.000000 +159731 -1.000000 +159732 -1.000000 +159733 -1.000000 +159735 -1.000000 +159736 -1.000000 +159737 -1.000000 +159740 -1.000000 +159741 -1.000000 +159742 -1.000000 +159754 -1.000000 +159760 -1.000000 +159807 -1.000000 +159808 -1.000000 +159810 -1.000000 +159811 -1.000000 +159823 -1.000000 +159824 -1.000000 +159827 -1.000000 +159828 -1.000000 +159829 -1.000000 +159831 -1.000000 +159832 -1.000000 +159983 -1.000000 +159984 -1.000000 +159986 -1.000000 +159987 -1.000000 +159989 -1.000000 +159990 -1.000000 +159991 -1.000000 +159992 -1.000000 +159993 -1.000000 +159994 -1.000000 +159995 -1.000000 +159997 -1.000000 +159998 -1.000000 +159999 -1.000000 +160000 -1.000000 +160001 -1.000000 +160002 -1.000000 +160005 -1.000000 +160006 -1.000000 +160007 -1.000000 +160008 -1.000000 +160013 -1.000000 +160014 -1.000000 +160015 -1.000000 +160016 -1.000000 +160017 -1.000000 +160019 -1.000000 +160020 -1.000000 +160021 -1.000000 +160022 -1.000000 +160023 -1.000000 +160027 -1.000000 +160028 -1.000000 +160029 -1.000000 +160030 -1.000000 +160031 -1.000000 +160032 -1.000000 +160033 -1.000000 +160034 -1.000000 +160035 -1.000000 +160037 -1.000000 +160038 -1.000000 +160040 -1.000000 +160042 -1.000000 +160043 -1.000000 +160047 -1.000000 +160054 -1.000000 +160055 -1.000000 +160058 -1.000000 +160059 -1.000000 +160060 -1.000000 +160061 -1.000000 +160062 -1.000000 +160063 -1.000000 +160064 -1.000000 +160065 -1.000000 +160066 -1.000000 +160067 -1.000000 +160068 -1.000000 +160069 -1.000000 +160070 -1.000000 +160072 -1.000000 +160073 -1.000000 +160074 -1.000000 +160075 -1.000000 +160077 -1.000000 +160078 -1.000000 +160079 -1.000000 +160080 -1.000000 +160081 -1.000000 +160082 -1.000000 +160083 -1.000000 +160084 -1.000000 +160086 -1.000000 +160087 -1.000000 +160092 -1.000000 +160097 -1.000000 +160099 -1.000000 +160102 -1.000000 +160103 -1.000000 +160104 -1.000000 +160109 -1.000000 +160110 -1.000000 +160111 -1.000000 +160112 -1.000000 +160113 -1.000000 +160114 -1.000000 +160115 -1.000000 +160116 -1.000000 +160118 -1.000000 +160119 -1.000000 +160120 -1.000000 +160122 -1.000000 +160123 -1.000000 +160124 -1.000000 +160125 -1.000000 +160126 -1.000000 +160127 -1.000000 +160136 -1.000000 +160138 -1.000000 +160139 -1.000000 +160141 -1.000000 +160145 -1.000000 +160147 -1.000000 +160150 -1.000000 +160154 -1.000000 +160155 -1.000000 +160156 -1.000000 +160157 -1.000000 +160159 -1.000000 +160161 -1.000000 +160162 -1.000000 +160163 -1.000000 +160169 -1.000000 +160171 -1.000000 +160173 -1.000000 +160177 -1.000000 +160178 -1.000000 +160179 -1.000000 +160180 -1.000000 +160225 -1.000000 +160238 -1.000000 +160239 -1.000000 +160240 -1.000000 +160241 -1.000000 +160242 -1.000000 +160243 -1.000000 +160244 -1.000000 +160245 -1.000000 +160246 -1.000000 +160247 -1.000000 +160248 -1.000000 +160249 -1.000000 +160250 -1.000000 +160251 -1.000000 +160252 -1.000000 +160253 -1.000000 +160254 -1.000000 +160255 -1.000000 +160256 -1.000000 +160257 -1.000000 +160258 -1.000000 +160259 -1.000000 +160260 -1.000000 +160262 -1.000000 +160268 -1.000000 +160269 -1.000000 +160270 -1.000000 +160271 -1.000000 +160282 -1.000000 +160283 -1.000000 +160285 -1.000000 +160286 -1.000000 +160287 -1.000000 +160288 -1.000000 +160290 -1.000000 +160291 -1.000000 +160294 -1.000000 +160295 -1.000000 +160296 -1.000000 +160297 -1.000000 +160298 -1.000000 +160301 -1.000000 +160303 -1.000000 +160304 -1.000000 +160306 -1.000000 +160308 -1.000000 +160309 -1.000000 +160311 -1.000000 +160312 -1.000000 +160313 -1.000000 +160314 -1.000000 +160323 -1.000000 +160324 -1.000000 +160326 -1.000000 +160327 -1.000000 +160329 -1.000000 +160330 -1.000000 +160331 -1.000000 +160332 -1.000000 +160333 -1.000000 +160334 -1.000000 +160335 -1.000000 +160336 -1.000000 +160339 -1.000000 +160340 -1.000000 +160341 -1.000000 +160354 -1.000000 +160355 -1.000000 +160356 -1.000000 +160357 -1.000000 +160358 -1.000000 +160362 -1.000000 +160365 -1.000000 +160367 -1.000000 +160369 -1.000000 +160371 -1.000000 +160372 -1.000000 +160374 -1.000000 +160395 -1.000000 +160396 -1.000000 +160397 -1.000000 +160398 -1.000000 +160399 -1.000000 +160400 -1.000000 +160401 -1.000000 +160404 -1.000000 +160405 -1.000000 +160406 -1.000000 +160407 -1.000000 +160408 -1.000000 +160409 -1.000000 +160410 -1.000000 +160411 -1.000000 +160412 -1.000000 +160413 -1.000000 +160414 -1.000000 +160415 -1.000000 +160416 -1.000000 +160417 -1.000000 +160418 -1.000000 +160419 -1.000000 +160420 -1.000000 +160421 -1.000000 +160422 -1.000000 +160423 -1.000000 +160441 -1.000000 +160442 -1.000000 +160443 -1.000000 +160444 -1.000000 +160445 -1.000000 +160446 -1.000000 +160447 -1.000000 +160449 -1.000000 +160450 -1.000000 +160451 -1.000000 +160452 -1.000000 +160453 -1.000000 +160454 -1.000000 +160455 -1.000000 +160456 -1.000000 +160457 -1.000000 +160458 -1.000000 +160459 -1.000000 +160460 -1.000000 +160461 -1.000000 +160463 -1.000000 +160464 -1.000000 +160466 -1.000000 +160467 -1.000000 +160468 -1.000000 +160469 -1.000000 +160470 -1.000000 +160471 -1.000000 +160472 -1.000000 +160473 -1.000000 +160474 -1.000000 +160475 -1.000000 +160476 -1.000000 +160477 -1.000000 +160478 -1.000000 +160484 -1.000000 +160485 -1.000000 +160486 -1.000000 +160487 -1.000000 +160488 -1.000000 +160489 -1.000000 +160490 -1.000000 +160491 -1.000000 +160492 -1.000000 +160493 -1.000000 +160494 -1.000000 +160497 -1.000000 +160498 -1.000000 +160499 -1.000000 +160500 -1.000000 +160502 -1.000000 +160503 -1.000000 +160504 -1.000000 +160505 -1.000000 +160508 -1.000000 +160509 -1.000000 +160510 -1.000000 +160511 -1.000000 +160518 -1.000000 +160520 -1.000000 +160521 -1.000000 +160522 -1.000000 +160523 -1.000000 +160524 -1.000000 +160525 -1.000000 +160526 -1.000000 +160527 -1.000000 +160528 -1.000000 +160529 -1.000000 +160534 -1.000000 +160538 -1.000000 +160542 -1.000000 +160544 -1.000000 +160545 -1.000000 +160546 -1.000000 +160552 -1.000000 +160553 -1.000000 +160554 -1.000000 +160555 -1.000000 +160556 -1.000000 +160557 -1.000000 +160558 -1.000000 +160562 -1.000000 +160563 -1.000000 +160564 -1.000000 +160565 -1.000000 +160566 -1.000000 +160567 -1.000000 +160568 -1.000000 +160569 -1.000000 +160570 -1.000000 +160571 -1.000000 +160572 -1.000000 +160573 -1.000000 +160574 -1.000000 +160575 -1.000000 +160576 -1.000000 +160578 -1.000000 +160579 -1.000000 +160580 -1.000000 +160581 -1.000000 +160583 -1.000000 +160584 -1.000000 +160585 -1.000000 +160586 -1.000000 +160590 -1.000000 +160593 -1.000000 +160602 -1.000000 +160612 -1.000000 +160632 -1.000000 +160633 -1.000000 +160635 -1.000000 +160638 -1.000000 +160640 -1.000000 +160645 -1.000000 +160646 -1.000000 +160647 -1.000000 +160652 -1.000000 +160657 -1.000000 +160660 -1.000000 +160665 -1.000000 +160666 -1.000000 +160667 -1.000000 +160669 -1.000000 +160670 -1.000000 +160672 -1.000000 +160673 -1.000000 +160674 -1.000000 +160675 -1.000000 +160677 -1.000000 +160680 -1.000000 +160681 -1.000000 +160682 -1.000000 +160683 -1.000000 +160684 -1.000000 +160685 -1.000000 +160686 -1.000000 +160687 -1.000000 +160688 -1.000000 +160689 -1.000000 +160690 -1.000000 +160691 -1.000000 +160692 -1.000000 +160693 -1.000000 +160694 -1.000000 +160695 -1.000000 +160700 -1.000000 +160702 -1.000000 +160703 -1.000000 +160704 -1.000000 +160705 -1.000000 +160706 -1.000000 +160707 -1.000000 +160708 -1.000000 +160710 -1.000000 +160711 -1.000000 +160712 -1.000000 +160713 -1.000000 +160714 -1.000000 +160715 -1.000000 +160716 -1.000000 +160717 -1.000000 +160718 -1.000000 +160719 -1.000000 +160720 -1.000000 +160721 -1.000000 +160774 -1.000000 +160776 -1.000000 +160777 -1.000000 +160784 -1.000000 +160785 -1.000000 +160786 -1.000000 +160787 -1.000000 +160788 -1.000000 +160789 -1.000000 +160790 -1.000000 +160791 -1.000000 +160792 -1.000000 +160793 -1.000000 +160794 -1.000000 +160795 -1.000000 +160796 -1.000000 +160797 -1.000000 +160798 -1.000000 +160799 -1.000000 +160800 -1.000000 +160801 -1.000000 +160802 -1.000000 +160810 -1.000000 +160811 -1.000000 +160812 -1.000000 +160813 -1.000000 +160814 -1.000000 +160815 -1.000000 +160817 -1.000000 +160819 -1.000000 +160829 -1.000000 +160836 -1.000000 +160837 -1.000000 +160840 -1.000000 +160841 -1.000000 +160842 -1.000000 +160843 -1.000000 +160844 -1.000000 +160845 -1.000000 +160850 -1.000000 +160852 -1.000000 +160854 -1.000000 +160862 -1.000000 +160863 -1.000000 +160867 -1.000000 +160869 -1.000000 +160872 -1.000000 +160876 -1.000000 +160881 -1.000000 +160884 -1.000000 +160889 -1.000000 +160894 -1.000000 +160895 -1.000000 +160899 -1.000000 +160900 -1.000000 +160901 -1.000000 +160902 -1.000000 +160903 -1.000000 +160904 -1.000000 +160905 -1.000000 +160906 -1.000000 +160907 -1.000000 +160908 -1.000000 +160910 -1.000000 +160911 -1.000000 +160912 -1.000000 +160913 -1.000000 +160914 -1.000000 +160915 -1.000000 +160917 -1.000000 +160918 -1.000000 +160919 -1.000000 +160920 -1.000000 +160921 -1.000000 +160938 -1.000000 +160939 -1.000000 +160940 -1.000000 +160942 -1.000000 +160943 -1.000000 +160944 -1.000000 +160945 -1.000000 +160947 -1.000000 +160948 -1.000000 +160949 -1.000000 +160950 -1.000000 +160951 -1.000000 +160964 -1.000000 +160965 -1.000000 +160966 -1.000000 +160968 -1.000000 +160969 -1.000000 +160970 -1.000000 +160971 -1.000000 +160972 -1.000000 +160973 -1.000000 +160974 -1.000000 +160975 -1.000000 +160980 -1.000000 +160981 -1.000000 +160982 -1.000000 +160984 -1.000000 +160985 -1.000000 +160986 -1.000000 +160987 -1.000000 +160988 -1.000000 +160994 -1.000000 +160995 -1.000000 +160996 -1.000000 +160997 -1.000000 +160999 -1.000000 +161002 -1.000000 +161003 -1.000000 +161004 -1.000000 +161005 -1.000000 +161006 -1.000000 +161007 -1.000000 +161008 -1.000000 +161009 -1.000000 +161011 -1.000000 +161012 -1.000000 +161013 -1.000000 +161015 -1.000000 +161016 -1.000000 +161017 -1.000000 +161018 -1.000000 +161019 -1.000000 +161027 -1.000000 +161028 -1.000000 +161030 -1.000000 +161032 -1.000000 +161033 -1.000000 +161034 -1.000000 +161035 -1.000000 +161036 -1.000000 +161037 -1.000000 +161038 -1.000000 +161039 -1.000000 +161040 -1.000000 +161041 -1.000000 +161042 -1.000000 +161043 -1.000000 +161044 -1.000000 +161049 -1.000000 +161050 -1.000000 +161051 -1.000000 +161052 -1.000000 +161053 -1.000000 +161054 -1.000000 +161055 -1.000000 +161056 -1.000000 +161057 -1.000000 +161058 -1.000000 +161064 -1.000000 +161065 -1.000000 +161066 -1.000000 +161067 -1.000000 +161078 -1.000000 +161080 -1.000000 +161081 -1.000000 +161083 -1.000000 +161084 -1.000000 +161085 -1.000000 +161086 -1.000000 +161087 -1.000000 +161088 -1.000000 +161089 -1.000000 +161090 -1.000000 +161091 -1.000000 +161092 -1.000000 +161093 -1.000000 +161094 -1.000000 +161095 -1.000000 +161096 -1.000000 +161102 -1.000000 +161103 -1.000000 +161104 -1.000000 +161105 -1.000000 +161106 -1.000000 +161107 -1.000000 +161108 -1.000000 +161109 -1.000000 +161110 -1.000000 +161111 -1.000000 +161115 -1.000000 +161116 -1.000000 +161117 -1.000000 +161118 -1.000000 +161119 -1.000000 +161121 -1.000000 +161122 -1.000000 +161123 -1.000000 +161124 -1.000000 +161125 -1.000000 +161127 -1.000000 +161129 -1.000000 +161136 -1.000000 +161137 -1.000000 +161138 -1.000000 +161139 -1.000000 +161140 -1.000000 +161141 -1.000000 +161142 -1.000000 +161143 -1.000000 +161144 -1.000000 +161145 -1.000000 +161146 -1.000000 +161147 -1.000000 +161148 -1.000000 +161149 -1.000000 +161150 -1.000000 +161151 -1.000000 +161152 -1.000000 +161153 -1.000000 +161154 -1.000000 +161155 -1.000000 +161156 -1.000000 +161157 -1.000000 +161158 -1.000000 +161159 -1.000000 +161160 -1.000000 +161162 -1.000000 +161163 -1.000000 +161164 -1.000000 +161165 -1.000000 +161166 -1.000000 +161167 -1.000000 +161168 -1.000000 +161169 -1.000000 +161170 -1.000000 +161171 -1.000000 +161172 -1.000000 +161173 -1.000000 +161174 -1.000000 +161179 -1.000000 +161188 -1.000000 +161196 -1.000000 +161197 -1.000000 +161198 -1.000000 +161199 -1.000000 +161202 -1.000000 +161203 -1.000000 +161212 -1.000000 +161215 -1.000000 +161216 -1.000000 +161218 -1.000000 +161219 -1.000000 +161220 -1.000000 +161221 -1.000000 +161222 -1.000000 +161223 -1.000000 +161233 -1.000000 +161252 -1.000000 +161253 -1.000000 +161254 -1.000000 +161255 -1.000000 +161256 -1.000000 +161257 -1.000000 +161258 -1.000000 +161259 -1.000000 +161260 -1.000000 +161261 -1.000000 +161262 -1.000000 +161263 -1.000000 +161264 -1.000000 +161265 -1.000000 +161266 -1.000000 +161272 -1.000000 +161273 -1.000000 +161274 -1.000000 +161275 -1.000000 +161276 -1.000000 +161277 -1.000000 +161280 -1.000000 +161283 -1.000000 +161284 -1.000000 +161285 -1.000000 +161286 -1.000000 +161287 -1.000000 +161291 -1.000000 +161292 -1.000000 +161294 -1.000000 +161295 -1.000000 +161300 -1.000000 +161304 -1.000000 +161306 -1.000000 +161307 -1.000000 +161308 -1.000000 +161309 -1.000000 +161310 -1.000000 +161314 -1.000000 +161317 -1.000000 +161319 -1.000000 +161320 -1.000000 +161321 -1.000000 +161322 -1.000000 +161329 -1.000000 +161331 -1.000000 +161333 -1.000000 +161335 -1.000000 +161336 -1.000000 +161345 -1.000000 +161346 -1.000000 +161347 -1.000000 +161348 -1.000000 +161349 -1.000000 +161350 -1.000000 +161351 -1.000000 +161352 -1.000000 +161353 -1.000000 +161354 -1.000000 +161356 -1.000000 +161357 -1.000000 +161358 -1.000000 +161359 -1.000000 +161361 -1.000000 +161364 -1.000000 +161367 -1.000000 +161370 -1.000000 +161371 -1.000000 +161372 -1.000000 +161373 -1.000000 +161374 -1.000000 +161376 -1.000000 +161381 -1.000000 +161382 -1.000000 +161383 -1.000000 +161384 -1.000000 +161385 -1.000000 +161386 -1.000000 +161388 -1.000000 +161389 -1.000000 +161390 -1.000000 +161391 -1.000000 +161392 -1.000000 +161393 -1.000000 +161394 -1.000000 +161395 -1.000000 +161397 -1.000000 +161398 -1.000000 +161399 -1.000000 +161400 -1.000000 +161401 -1.000000 +161402 -1.000000 +161403 -1.000000 +161404 -1.000000 +161405 -1.000000 +161406 -1.000000 +161407 -1.000000 +161408 -1.000000 +161409 -1.000000 +161410 -1.000000 +161411 -1.000000 +161412 -1.000000 +161413 -1.000000 +161414 -1.000000 +161415 -1.000000 +161416 -1.000000 +161417 -1.000000 +161418 -1.000000 +161420 -1.000000 +161424 -1.000000 +161425 -1.000000 +161426 -1.000000 +161437 -1.000000 +161438 -1.000000 +161444 -1.000000 +161446 -1.000000 +161447 -1.000000 +161448 -1.000000 +161449 -1.000000 +161450 -1.000000 +161452 -1.000000 +161453 -1.000000 +161454 -1.000000 +161455 -1.000000 +161456 -1.000000 +161458 -1.000000 +161459 -1.000000 +161460 -1.000000 +161461 -1.000000 +161465 -1.000000 +161466 -1.000000 +161467 -1.000000 +161468 -1.000000 +161469 -1.000000 +161470 -1.000000 +161471 -1.000000 +161472 -1.000000 +161473 -1.000000 +161474 -1.000000 +161475 -1.000000 +161476 -1.000000 +161477 -1.000000 +161478 -1.000000 +161479 -1.000000 +161480 -1.000000 +161481 -1.000000 +161482 -1.000000 +161483 -1.000000 +161484 -1.000000 +161485 -1.000000 +161491 -1.000000 +161492 -1.000000 +161493 -1.000000 +161494 -1.000000 +161495 -1.000000 +161496 -1.000000 +161497 -1.000000 +161498 -1.000000 +161499 -1.000000 +161500 -1.000000 +161501 -1.000000 +161502 -1.000000 +161503 -1.000000 +161505 -1.000000 +161506 -1.000000 +161507 -1.000000 +161508 -1.000000 +161509 -1.000000 +161510 -1.000000 +161511 -1.000000 +161512 -1.000000 +161513 -1.000000 +161514 -1.000000 +161515 -1.000000 +161516 -1.000000 +161517 -1.000000 +161518 -1.000000 +161519 -1.000000 +161520 -1.000000 +161521 -1.000000 +161522 -1.000000 +161524 -1.000000 +161525 -1.000000 +161526 -1.000000 +161527 -1.000000 +161528 -1.000000 +161529 -1.000000 +161530 -1.000000 +161535 -1.000000 +161536 -1.000000 +161537 -1.000000 +161538 -1.000000 +161539 -1.000000 +161540 -1.000000 +161541 -1.000000 +161545 -1.000000 +161546 -1.000000 +161548 -1.000000 +161549 -1.000000 +161550 -1.000000 +161552 -1.000000 +161553 -1.000000 +161554 -1.000000 +161555 -1.000000 +161556 -1.000000 +161557 -1.000000 +161558 -1.000000 +161559 -1.000000 +161560 -1.000000 +161561 -1.000000 +161562 -1.000000 +161564 -1.000000 +161565 -1.000000 +161566 -1.000000 +161567 -1.000000 +161582 -1.000000 +161583 -1.000000 +161584 -1.000000 +161586 -1.000000 +161587 -1.000000 +161588 -1.000000 +161590 -1.000000 +161591 -1.000000 +161592 -1.000000 +161593 -1.000000 +161595 -1.000000 +161596 -1.000000 +161597 -1.000000 +161598 -1.000000 +161599 -1.000000 +161600 -1.000000 +161601 -1.000000 +161602 -1.000000 +161603 -1.000000 +161604 -1.000000 +161605 -1.000000 +161607 -1.000000 +161608 -1.000000 +161609 -1.000000 +161610 -1.000000 +161611 -1.000000 +161612 -1.000000 +161613 -1.000000 +161614 -1.000000 +161615 -1.000000 +161623 -1.000000 +161624 -1.000000 +161625 -1.000000 +161626 -1.000000 +161627 -1.000000 +161628 -1.000000 +161629 -1.000000 +161630 -1.000000 +161631 -1.000000 +161633 -1.000000 +161635 -1.000000 +161636 -1.000000 +161637 -1.000000 +161638 -1.000000 +161639 -1.000000 +161640 -1.000000 +161641 -1.000000 +161642 -1.000000 +161643 -1.000000 +161644 -1.000000 +161645 -1.000000 +161646 -1.000000 +161647 -1.000000 +161648 -1.000000 +161649 -1.000000 +161650 -1.000000 +162164 -1.000000 +162165 -1.000000 +162166 -1.000000 +162167 -1.000000 +162168 -1.000000 +162169 -1.000000 +162170 -1.000000 +162171 -1.000000 +162172 -1.000000 +162173 -1.000000 +162174 -1.000000 +162175 -1.000000 +162176 -1.000000 +162177 -1.000000 +162178 -1.000000 +162179 -1.000000 +162180 -1.000000 +162181 -1.000000 +162182 -1.000000 +162208 -1.000000 +162209 -1.000000 +162212 -1.000000 +162213 -1.000000 +162214 -1.000000 +162215 -1.000000 +162216 -1.000000 +162217 -1.000000 +162219 -1.000000 +162220 -1.000000 +162237 -1.000000 +162238 -1.000000 +162240 -1.000000 +162241 -1.000000 +162242 -1.000000 +162243 -1.000000 +162244 -1.000000 +162245 -1.000000 +162246 -1.000000 +162247 -1.000000 +162248 -1.000000 +162249 -1.000000 +162250 -1.000000 +162251 -1.000000 +162252 -1.000000 +162253 -1.000000 +162254 -1.000000 +162255 -1.000000 +162256 -1.000000 +162257 -1.000000 +162258 -1.000000 +162260 -1.000000 +162261 -1.000000 +162262 -1.000000 +162263 -1.000000 +162264 -1.000000 +162276 -1.000000 +162278 -1.000000 +162279 -1.000000 +162280 -1.000000 +162281 -1.000000 +162282 -1.000000 +162283 -1.000000 +162284 -1.000000 +162285 -1.000000 +162287 -1.000000 +162298 -1.000000 +162299 -1.000000 +162300 -1.000000 +162301 -1.000000 +162302 -1.000000 +162303 -1.000000 +162304 -1.000000 +162305 -1.000000 +162306 -1.000000 +162307 -1.000000 +162309 -1.000000 +162312 -1.000000 +162313 -1.000000 +162314 -1.000000 +162316 -1.000000 +162317 -1.000000 +162318 -1.000000 +162319 -1.000000 +162320 -1.000000 +162333 -1.000000 +162335 -1.000000 +162336 -1.000000 +162337 -1.000000 +162343 -1.000000 +162344 -1.000000 +162346 -1.000000 +162347 -1.000000 +162348 -1.000000 +162349 -1.000000 +162350 -1.000000 +162352 -1.000000 +162399 -1.000000 +162400 -1.000000 +162402 -1.000000 +162403 -1.000000 +162404 -1.000000 +162405 -1.000000 +162406 -1.000000 +162407 -1.000000 +162408 -1.000000 +162409 -1.000000 +162410 -1.000000 +162411 -1.000000 +162412 -1.000000 +162413 -1.000000 +162414 -1.000000 +162415 -1.000000 +162416 -1.000000 +162419 -1.000000 +162422 -1.000000 +162431 -1.000000 +162439 -1.000000 +162441 -1.000000 +162442 -1.000000 +162443 -1.000000 +162444 -1.000000 +162445 -1.000000 +162446 -1.000000 +162447 -1.000000 +162448 -1.000000 +162449 -1.000000 +162450 -1.000000 +162451 -1.000000 +162452 -1.000000 +162453 -1.000000 +162454 -1.000000 +162489 -1.000000 +162494 -1.000000 +162495 -1.000000 +162499 -1.000000 +162500 -1.000000 +162501 -1.000000 +162502 -1.000000 +162503 -1.000000 +162504 -1.000000 +162505 -1.000000 +162506 -1.000000 +162507 -1.000000 +162508 -1.000000 +162509 -1.000000 +162510 -1.000000 +162511 -1.000000 +162512 -1.000000 +162520 -1.000000 +162521 -1.000000 +162522 -1.000000 +162523 -1.000000 +162524 -1.000000 +162525 -1.000000 +162526 -1.000000 +162527 -1.000000 +162528 -1.000000 +162529 -1.000000 +162530 -1.000000 +162531 -1.000000 +162532 -1.000000 +162533 -1.000000 +162534 -1.000000 +162535 -1.000000 +162536 -1.000000 +162537 -1.000000 +162540 -1.000000 +162543 -1.000000 +162556 -1.000000 +162557 -1.000000 +162558 -1.000000 +162559 -1.000000 +162691 -1.000000 +162693 -1.000000 +162695 -1.000000 +162696 -1.000000 +162697 -1.000000 +162706 -1.000000 +162707 -1.000000 +162708 -1.000000 +162709 -1.000000 +162710 -1.000000 +162711 -1.000000 +162712 -1.000000 +162713 -1.000000 +162715 -1.000000 +162716 -1.000000 +162717 -1.000000 +162718 -1.000000 +162719 -1.000000 +162722 -1.000000 +162723 -1.000000 +162724 -1.000000 +162725 -1.000000 +162727 -1.000000 +162728 -1.000000 +162729 -1.000000 +162730 -1.000000 +162731 -1.000000 +162732 -1.000000 +162733 -1.000000 +162734 -1.000000 +162742 -1.000000 +162743 -1.000000 +162744 -1.000000 +162745 -1.000000 +162746 -1.000000 +162747 -1.000000 +162748 -1.000000 +162749 -1.000000 +162750 -1.000000 +162751 -1.000000 +162752 -1.000000 +162753 -1.000000 +162754 -1.000000 +162760 -1.000000 +162761 -1.000000 +162762 -1.000000 +162763 -1.000000 +162764 -1.000000 +162765 -1.000000 +162766 -1.000000 +162767 -1.000000 +162768 -1.000000 +162769 -1.000000 +162770 -1.000000 +162771 -1.000000 +162777 -1.000000 +162778 -1.000000 +162779 -1.000000 +162780 -1.000000 +162781 -1.000000 +162782 -1.000000 +162783 -1.000000 +162784 -1.000000 +162785 -1.000000 +162786 -1.000000 +162787 -1.000000 +162788 -1.000000 +162789 -1.000000 +162790 -1.000000 +162793 -1.000000 +162795 -1.000000 +162796 -1.000000 +162797 -1.000000 +162798 -1.000000 +162799 -1.000000 +162800 -1.000000 +162801 -1.000000 +162802 -1.000000 +162803 -1.000000 +162804 -1.000000 +162807 -1.000000 +162815 -1.000000 +162865 -1.000000 +162866 -1.000000 +162867 -1.000000 +162868 -1.000000 +162869 -1.000000 +162870 -1.000000 +162871 -1.000000 +162872 -1.000000 +162873 -1.000000 +162874 -1.000000 +162875 -1.000000 +162876 -1.000000 +162877 -1.000000 +162887 -1.000000 +162888 -1.000000 +162889 -1.000000 +162890 -1.000000 +162891 -1.000000 +162892 -1.000000 +162893 -1.000000 +162894 -1.000000 +162895 -1.000000 +162896 -1.000000 +162897 -1.000000 +162898 -1.000000 +162899 -1.000000 +162900 -1.000000 +162905 -1.000000 +162906 -1.000000 +162907 -1.000000 +162908 -1.000000 +162910 -1.000000 +162911 -1.000000 +162912 -1.000000 +162913 -1.000000 +162914 -1.000000 +162915 -1.000000 +162916 -1.000000 +162917 -1.000000 +162918 -1.000000 +162919 -1.000000 +162920 -1.000000 +162921 -1.000000 +162922 -1.000000 +162926 -1.000000 +162927 -1.000000 +162928 -1.000000 +162929 -1.000000 +162930 -1.000000 +162931 -1.000000 +162932 -1.000000 +162933 -1.000000 +162934 -1.000000 +162938 -1.000000 +162939 -1.000000 +162940 -1.000000 +162941 -1.000000 +162942 -1.000000 +162943 -1.000000 +162944 -1.000000 +162946 -1.000000 +162947 -1.000000 +162948 -1.000000 +162949 -1.000000 +162950 -1.000000 +162953 -1.000000 +162954 -1.000000 +162955 -1.000000 +162959 -1.000000 +162960 -1.000000 +162963 -1.000000 +162964 -1.000000 +162965 -1.000000 +162966 -1.000000 +162967 -1.000000 +162968 -1.000000 +162973 -1.000000 +162977 -1.000000 +162989 -1.000000 +162996 -1.000000 +162997 -1.000000 +163000 -1.000000 +163001 -1.000000 +163002 -1.000000 +163003 -1.000000 +163004 -1.000000 +163005 -1.000000 +163019 -1.000000 +163021 -1.000000 +163032 -1.000000 +163067 -1.000000 +163068 -1.000000 +163069 -1.000000 +163070 -1.000000 +163071 -1.000000 +163072 -1.000000 +163073 -1.000000 +163074 -1.000000 +163077 -1.000000 +163078 -1.000000 +163079 -1.000000 +163080 -1.000000 +163081 -1.000000 +163082 -1.000000 +163083 -1.000000 +163084 -1.000000 +163085 -1.000000 +163086 -1.000000 +163087 -1.000000 +163088 -1.000000 +163089 -1.000000 +163090 -1.000000 +163091 -1.000000 +163092 -1.000000 +163093 -1.000000 +163094 -1.000000 +163095 -1.000000 +163100 -1.000000 +163101 -1.000000 +163102 -1.000000 +163103 -1.000000 +163104 -1.000000 +163105 -1.000000 +163106 -1.000000 +163107 -1.000000 +163108 -1.000000 +163109 -1.000000 +163110 -1.000000 +163111 -1.000000 +163112 -1.000000 +163113 -1.000000 +163114 -1.000000 +163115 -1.000000 +163116 -1.000000 +163117 -1.000000 +163118 -1.000000 +163119 -1.000000 +163120 -1.000000 +163121 -1.000000 +163122 -1.000000 +163123 -1.000000 +163124 -1.000000 +163125 -1.000000 +163126 -1.000000 +163127 -1.000000 +163128 -1.000000 +163129 -1.000000 +163130 -1.000000 +163136 -1.000000 +163144 -1.000000 +163145 -1.000000 +163146 -1.000000 +163147 -1.000000 +163148 -1.000000 +163149 -1.000000 +163150 -1.000000 +163151 -1.000000 +163152 -1.000000 +163153 -1.000000 +163155 -1.000000 +163156 -1.000000 +163157 -1.000000 +163158 -1.000000 +163160 -1.000000 +163161 -1.000000 +163162 -1.000000 +163163 -1.000000 +163164 -1.000000 +163165 -1.000000 +163166 -1.000000 +163167 -1.000000 +163168 -1.000000 +163169 -1.000000 +163170 -1.000000 +163171 -1.000000 +163172 -1.000000 +163173 -1.000000 +163174 -1.000000 +163175 -1.000000 +163176 -1.000000 +163177 -1.000000 +163178 -1.000000 +163179 -1.000000 +163180 -1.000000 +163181 -1.000000 +163182 -1.000000 +163183 -1.000000 +163184 -1.000000 +163201 -1.000000 +163202 -1.000000 +163204 -1.000000 +163205 -1.000000 +163206 -1.000000 +163208 -1.000000 +163214 -1.000000 +163215 -1.000000 +163216 -1.000000 +163217 -1.000000 +163218 -1.000000 +163219 -1.000000 +163220 -1.000000 +163222 -1.000000 +163223 -1.000000 +163225 -1.000000 +163228 -1.000000 +163229 -1.000000 +163230 -1.000000 +163236 -1.000000 +163237 -1.000000 +163238 -1.000000 +163240 -1.000000 +163244 -1.000000 +163249 -1.000000 +163250 -1.000000 +163251 -1.000000 +163252 -1.000000 +163253 -1.000000 +163256 -1.000000 +163260 -1.000000 +163261 -1.000000 +163262 -1.000000 +163263 -1.000000 +163264 -1.000000 +163265 -1.000000 +163273 -1.000000 +163274 -1.000000 +163285 -1.000000 +163288 -1.000000 +163290 -1.000000 +163291 -1.000000 +163292 -1.000000 +163293 -1.000000 +163294 -1.000000 +163295 -1.000000 +163296 -1.000000 +163297 -1.000000 +163304 -1.000000 +163305 -1.000000 +163310 -1.000000 +163313 -1.000000 +163315 -1.000000 +163316 -1.000000 +163317 -1.000000 +163318 -1.000000 +163328 -1.000000 +163330 -1.000000 +163331 -1.000000 +163332 -1.000000 +163333 -1.000000 +163334 -1.000000 +163335 -1.000000 +163336 -1.000000 +163427 -1.000000 +163428 -1.000000 +163429 -1.000000 +163430 -1.000000 +163431 -1.000000 +163432 -1.000000 +163435 -1.000000 +163436 -1.000000 +163437 -1.000000 +163438 -1.000000 +163439 -1.000000 +163440 -1.000000 +163441 -1.000000 +163442 -1.000000 +163443 -1.000000 +163444 -1.000000 +163445 -1.000000 +163446 -1.000000 +163447 -1.000000 +163448 -1.000000 +163449 -1.000000 +163450 -1.000000 +163451 -1.000000 +163455 -1.000000 +163456 -1.000000 +163457 -1.000000 +163458 -1.000000 +163459 -1.000000 +163463 -1.000000 +163464 -1.000000 +163465 -1.000000 +163466 -1.000000 +163467 -1.000000 +163468 -1.000000 +163469 -1.000000 +163470 -1.000000 +163471 -1.000000 +163472 -1.000000 +163473 -1.000000 +163475 -1.000000 +163476 -1.000000 +163477 -1.000000 +163478 -1.000000 +163479 -1.000000 +163480 -1.000000 +163481 -1.000000 +163482 -1.000000 +163483 -1.000000 +163484 -1.000000 +163485 -1.000000 +163486 -1.000000 +163487 -1.000000 +163488 -1.000000 +163489 -1.000000 +163490 -1.000000 +163491 -1.000000 +163492 -1.000000 +163497 -1.000000 +163498 -1.000000 +163499 -1.000000 +163500 -1.000000 +163501 -1.000000 +163502 -1.000000 +163503 -1.000000 +163504 -1.000000 +163505 -1.000000 +163506 -1.000000 +163507 -1.000000 +163508 -1.000000 +163509 -1.000000 +163510 -1.000000 +163511 -1.000000 +163512 -1.000000 +163513 -1.000000 +163514 -1.000000 +163515 -1.000000 +163517 -1.000000 +163518 -1.000000 +163519 -1.000000 +163520 -1.000000 +163521 -1.000000 +163524 -1.000000 +163525 -1.000000 +163526 -1.000000 +163531 -1.000000 +163532 -1.000000 +163533 -1.000000 +163534 -1.000000 +163535 -1.000000 +163536 -1.000000 +163537 -1.000000 +163538 -1.000000 +163539 -1.000000 +163540 -1.000000 +163541 -1.000000 +163542 -1.000000 +163543 -1.000000 +163544 -1.000000 +163545 -1.000000 +163546 -1.000000 +163547 -1.000000 +163548 -1.000000 +163549 -1.000000 +163550 -1.000000 +163551 -1.000000 +163552 -1.000000 +163553 -1.000000 +163590 -1.000000 +163591 -1.000000 +163600 -1.000000 +163606 -1.000000 +163607 -1.000000 +163608 -1.000000 +163609 -1.000000 +163610 -1.000000 +163650 -1.000000 +163651 -1.000000 +163652 -1.000000 +163653 -1.000000 +163655 -1.000000 +163656 -1.000000 +163657 -1.000000 +163658 -1.000000 +163659 -1.000000 +163660 -1.000000 +163661 -1.000000 +163662 -1.000000 +163663 -1.000000 +163664 -1.000000 +163665 -1.000000 +163666 -1.000000 +163698 -1.000000 +163703 -1.000000 +163706 -1.000000 +163707 -1.000000 +163708 -1.000000 +163710 -1.000000 +163711 -1.000000 +163712 -1.000000 +163713 -1.000000 +163715 -1.000000 +163716 -1.000000 +163717 -1.000000 +163718 -1.000000 +163719 -1.000000 +163721 -1.000000 +163722 -1.000000 +163723 -1.000000 +163724 -1.000000 +163725 -1.000000 +163726 -1.000000 +163727 -1.000000 +163734 -1.000000 +163736 -1.000000 +163737 -1.000000 +163738 -1.000000 +163739 -1.000000 +163740 -1.000000 +163742 -1.000000 +163750 -1.000000 +163752 -1.000000 +163753 -1.000000 +163754 -1.000000 +163755 -1.000000 +163756 -1.000000 +163757 -1.000000 +163758 -1.000000 +163759 -1.000000 +163782 -1.000000 +163786 -1.000000 +163787 -1.000000 +163788 -1.000000 +163789 -1.000000 +163790 -1.000000 +163791 -1.000000 +163792 -1.000000 +163793 -1.000000 +163794 -1.000000 +163795 -1.000000 +163796 -1.000000 +163797 -1.000000 +163799 -1.000000 +163800 -1.000000 +163802 -1.000000 +163804 -1.000000 +163808 -1.000000 +163811 -1.000000 +163818 -1.000000 +163819 -1.000000 +163821 -1.000000 +163823 -1.000000 +163825 -1.000000 +163826 -1.000000 +163828 -1.000000 +163829 -1.000000 +163830 -1.000000 +163831 -1.000000 +163832 -1.000000 +163833 -1.000000 +163834 -1.000000 +163835 -1.000000 +164030 -1.000000 +164031 -1.000000 +164032 -1.000000 +164033 -1.000000 +164034 -1.000000 +164035 -1.000000 +164036 -1.000000 +164038 -1.000000 +164039 -1.000000 +164040 -1.000000 +164041 -1.000000 +164042 -1.000000 +164043 -1.000000 +164044 -1.000000 +164045 -1.000000 +164046 -1.000000 +164047 -1.000000 +164048 -1.000000 +164049 -1.000000 +164050 -1.000000 +164062 -1.000000 +164063 -1.000000 +164064 -1.000000 +164065 -1.000000 +164066 -1.000000 +164067 -1.000000 +164068 -1.000000 +164069 -1.000000 +164070 -1.000000 +164071 -1.000000 +164073 -1.000000 +164075 -1.000000 +164076 -1.000000 +164077 -1.000000 +164078 -1.000000 +164079 -1.000000 +164084 -1.000000 +164085 -1.000000 +164086 -1.000000 +164087 -1.000000 +164088 -1.000000 +164089 -1.000000 +164090 -1.000000 +164091 -1.000000 +164092 -1.000000 +164093 -1.000000 +164094 -1.000000 +164095 -1.000000 +164096 -1.000000 +164097 -1.000000 +164098 -1.000000 +164099 -1.000000 +164100 -1.000000 +164101 -1.000000 +164102 -1.000000 +164103 -1.000000 +164104 -1.000000 +164105 -1.000000 +164106 -1.000000 +164107 -1.000000 +164108 -1.000000 +164109 -1.000000 +164110 -1.000000 +164111 -1.000000 +164112 -1.000000 +164113 -1.000000 +164114 -1.000000 +164123 -1.000000 +164124 -1.000000 +164125 -1.000000 +164127 -1.000000 +164134 -1.000000 +164135 -1.000000 +164136 -1.000000 +164137 -1.000000 +164138 -1.000000 +164139 -1.000000 +164140 -1.000000 +164141 -1.000000 +164142 -1.000000 +164143 -1.000000 +164144 -1.000000 +164145 -1.000000 +164146 -1.000000 +164169 -1.000000 +164170 -1.000000 +164171 -1.000000 +164172 -1.000000 +164173 -1.000000 +164174 -1.000000 +164176 -1.000000 +164178 -1.000000 +164179 -1.000000 +164186 -1.000000 +164187 -1.000000 +164188 -1.000000 +164189 -1.000000 +164190 -1.000000 +164191 -1.000000 +164192 -1.000000 +164193 -1.000000 +164194 -1.000000 +164195 -1.000000 +164205 -1.000000 +164206 -1.000000 +164207 -1.000000 +164208 -1.000000 +164209 -1.000000 +164210 -1.000000 +164211 -1.000000 +164212 -1.000000 +164213 -1.000000 +164214 -1.000000 +164215 -1.000000 +164216 -1.000000 +164218 -1.000000 +164220 -1.000000 +164221 -1.000000 +164222 -1.000000 +164228 -1.000000 +164229 -1.000000 +164237 -1.000000 +164239 -1.000000 +164240 -1.000000 +164241 -1.000000 +164242 -1.000000 +164244 -1.000000 +164245 -1.000000 +164246 -1.000000 +164248 -1.000000 +164249 -1.000000 +164250 -1.000000 +164251 -1.000000 +164252 -1.000000 +164253 -1.000000 +164254 -1.000000 +164260 -1.000000 +164261 -1.000000 +164262 -1.000000 +164263 -1.000000 +164264 -1.000000 +164265 -1.000000 +164266 -1.000000 +164267 -1.000000 +164268 -1.000000 +164269 -1.000000 +164270 -1.000000 +164271 -1.000000 +164275 -1.000000 +164282 -1.000000 +164283 -1.000000 +164284 -1.000000 +164285 -1.000000 +164287 -1.000000 +164288 -1.000000 +164289 -1.000000 +164298 -1.000000 +164304 -1.000000 +164309 -1.000000 +164310 -1.000000 +164311 -1.000000 +164312 -1.000000 +164315 -1.000000 +164316 -1.000000 +164318 -1.000000 +164320 -1.000000 +164322 -1.000000 +164325 -1.000000 +164326 -1.000000 +164327 -1.000000 +164328 -1.000000 +164329 -1.000000 +164336 -1.000000 +164337 -1.000000 +164345 -1.000000 +164346 -1.000000 +164348 -1.000000 +164349 -1.000000 +164353 -1.000000 +164354 -1.000000 +164356 -1.000000 +164357 -1.000000 +164358 -1.000000 +164359 -1.000000 +164362 -1.000000 +164371 -1.000000 +164374 -1.000000 +164376 -1.000000 +164377 -1.000000 +164385 -1.000000 +164386 -1.000000 +164387 -1.000000 +164388 -1.000000 +164389 -1.000000 +164390 -1.000000 +164392 -1.000000 +164393 -1.000000 +164394 -1.000000 +164395 -1.000000 +164396 -1.000000 +164397 -1.000000 +164399 -1.000000 +164402 -1.000000 +164404 -1.000000 +164405 -1.000000 +164406 -1.000000 +164407 -1.000000 +164408 -1.000000 +164409 -1.000000 +164410 -1.000000 +164411 -1.000000 +164412 -1.000000 +164413 -1.000000 +164426 -1.000000 +164427 -1.000000 +164428 -1.000000 +164429 -1.000000 +164430 -1.000000 +164431 -1.000000 +164432 -1.000000 +164433 -1.000000 +164434 -1.000000 +164435 -1.000000 +164436 -1.000000 +164440 -1.000000 +164441 -1.000000 +164442 -1.000000 +164443 -1.000000 +164447 -1.000000 +164449 -1.000000 +164452 -1.000000 +164454 -1.000000 +164455 -1.000000 +164456 -1.000000 +164463 -1.000000 +164464 -1.000000 +164465 -1.000000 +164466 -1.000000 +164467 -1.000000 +164468 -1.000000 +164470 -1.000000 +164473 -1.000000 +164476 -1.000000 +164477 -1.000000 +164478 -1.000000 +164479 -1.000000 +164480 -1.000000 +164481 -1.000000 +164482 -1.000000 +164483 -1.000000 +164484 -1.000000 +164485 -1.000000 +164486 -1.000000 +164492 -1.000000 +164493 -1.000000 +164494 -1.000000 +164495 -1.000000 +164496 -1.000000 +164497 -1.000000 +164498 -1.000000 +164499 -1.000000 +164500 -1.000000 +164501 -1.000000 +164502 -1.000000 +164503 -1.000000 +164504 -1.000000 +164505 -1.000000 +164506 -1.000000 +164507 -1.000000 +164508 -1.000000 +164509 -1.000000 +164510 -1.000000 +164511 -1.000000 +164512 -1.000000 +164513 -1.000000 +164515 -1.000000 +164517 -1.000000 +164518 -1.000000 +164519 -1.000000 +164520 -1.000000 +164521 -1.000000 +164522 -1.000000 +164523 -1.000000 +164527 -1.000000 +164529 -1.000000 +164530 -1.000000 +164531 -1.000000 +164532 -1.000000 +164533 -1.000000 +164534 -1.000000 +164535 -1.000000 +164536 -1.000000 +164537 -1.000000 +164539 -1.000000 +164540 -1.000000 +164541 -1.000000 +164542 -1.000000 +164549 -1.000000 +164552 -1.000000 +164556 -1.000000 +164559 -1.000000 +164565 -1.000000 +164567 -1.000000 +164568 -1.000000 +164569 -1.000000 +164570 -1.000000 +164572 -1.000000 +164573 -1.000000 +164575 -1.000000 +164576 -1.000000 +164577 -1.000000 +164578 -1.000000 +164585 -1.000000 +164593 -1.000000 +164594 -1.000000 +164595 -1.000000 +164596 -1.000000 +164597 -1.000000 +164598 -1.000000 +164599 -1.000000 +164600 -1.000000 +164601 -1.000000 +164602 -1.000000 +164603 -1.000000 +164604 -1.000000 +164605 -1.000000 +164606 -1.000000 +164607 -1.000000 +164608 -1.000000 +164609 -1.000000 +164610 -1.000000 +164611 -1.000000 +164612 -1.000000 +164613 -1.000000 +164614 -1.000000 +164618 -1.000000 +164619 -1.000000 +164620 -1.000000 +164621 -1.000000 +164622 -1.000000 +164623 -1.000000 +164624 -1.000000 +164625 -1.000000 +164626 -1.000000 +164627 -1.000000 +164628 -1.000000 +164629 -1.000000 +164642 -1.000000 +164647 -1.000000 +164648 -1.000000 +164649 -1.000000 +164650 -1.000000 +164651 -1.000000 +164652 -1.000000 +164653 -1.000000 +164654 -1.000000 +164655 -1.000000 +164656 -1.000000 +164657 -1.000000 +164658 -1.000000 +164659 -1.000000 +164660 -1.000000 +164661 -1.000000 +164662 -1.000000 +164663 -1.000000 +164664 -1.000000 +164666 -1.000000 +164675 -1.000000 +164681 -1.000000 +164684 -1.000000 +164685 -1.000000 +164687 -1.000000 +164688 -1.000000 +164689 -1.000000 +164693 -1.000000 +164704 -1.000000 +164705 -1.000000 +164706 -1.000000 +164714 -1.000000 +164715 -1.000000 +164718 -1.000000 +164719 -1.000000 +164720 -1.000000 +164721 -1.000000 +164722 -1.000000 +164724 -1.000000 +164725 -1.000000 +164775 -1.000000 +164776 -1.000000 +164778 -1.000000 +164780 -1.000000 +164787 -1.000000 +164788 -1.000000 +164789 -1.000000 +164790 -1.000000 +164791 -1.000000 +164792 -1.000000 +164793 -1.000000 +164795 -1.000000 +164797 -1.000000 +164798 -1.000000 +164799 -1.000000 +164800 -1.000000 +164801 -1.000000 +164806 -1.000000 +164814 -1.000000 +164817 -1.000000 +164818 -1.000000 +164819 -1.000000 +164820 -1.000000 +164824 -1.000000 +164825 -1.000000 +164826 -1.000000 +164827 -1.000000 +164828 -1.000000 +164829 -1.000000 +164830 -1.000000 +164831 -1.000000 +164832 -1.000000 +164834 -1.000000 +164835 -1.000000 +164836 -1.000000 +164837 -1.000000 +164839 -1.000000 +164840 -1.000000 +164841 -1.000000 +164843 -1.000000 +164844 -1.000000 +164845 -1.000000 +164846 -1.000000 +164847 -1.000000 +164848 -1.000000 +164851 -1.000000 +164852 -1.000000 +164853 -1.000000 +164854 -1.000000 +164866 -1.000000 +164870 -1.000000 +164873 -1.000000 +164874 -1.000000 +164875 -1.000000 +164877 -1.000000 +164878 -1.000000 +164879 -1.000000 +164880 -1.000000 +164883 -1.000000 +164884 -1.000000 +164886 -1.000000 +164892 -1.000000 +164893 -1.000000 +164895 -1.000000 +164896 -1.000000 +164897 -1.000000 +164898 -1.000000 +164899 -1.000000 +164900 -1.000000 +164901 -1.000000 +164902 -1.000000 +164903 -1.000000 +164907 -1.000000 +164910 -1.000000 +164911 -1.000000 +164912 -1.000000 +164913 -1.000000 +164931 -1.000000 +164936 -1.000000 +164940 -1.000000 +164941 -1.000000 +164954 -1.000000 +164955 -1.000000 +164956 -1.000000 +164957 -1.000000 +164958 -1.000000 +164960 -1.000000 +164965 -1.000000 +164966 -1.000000 +164967 -1.000000 +164973 -1.000000 +164974 -1.000000 +164975 -1.000000 +164977 -1.000000 +164978 -1.000000 +164979 -1.000000 +164980 -1.000000 +164981 -1.000000 +164982 -1.000000 +164985 -1.000000 +164986 -1.000000 +164987 -1.000000 +164988 -1.000000 +164991 -1.000000 +164993 -1.000000 +164998 -1.000000 +164999 -1.000000 +165010 -1.000000 +165012 -1.000000 +165013 -1.000000 +165014 -1.000000 +165015 -1.000000 +165016 -1.000000 +165017 -1.000000 +165018 -1.000000 +165019 -1.000000 +165020 -1.000000 +165021 -1.000000 +165022 -1.000000 +165023 -1.000000 +165024 -1.000000 +165025 -1.000000 +165026 -1.000000 +165027 -1.000000 +165028 -1.000000 +165029 -1.000000 +165030 -1.000000 +165031 -1.000000 +165032 -1.000000 +165033 -1.000000 +165034 -1.000000 +165035 -1.000000 +165036 -1.000000 +165037 -1.000000 +165038 -1.000000 +165039 -1.000000 +165040 -1.000000 +165041 -1.000000 +165042 -1.000000 +165043 -1.000000 +165044 -1.000000 +165051 -1.000000 +165052 -1.000000 +165053 -1.000000 +165054 -1.000000 +165055 -1.000000 +165056 -1.000000 +165057 -1.000000 +165058 -1.000000 +165059 -1.000000 +165060 -1.000000 +165061 -1.000000 +165062 -1.000000 +165063 -1.000000 +165064 -1.000000 +165065 -1.000000 +165066 -1.000000 +165067 -1.000000 +165068 -1.000000 +165069 -1.000000 +165070 -1.000000 +165071 -1.000000 +165072 -1.000000 +165073 -1.000000 +165074 -1.000000 +165075 -1.000000 +165076 -1.000000 +165077 -1.000000 +165078 -1.000000 +165079 -1.000000 +165080 -1.000000 +165086 -1.000000 +165087 -1.000000 +165088 -1.000000 +165089 -1.000000 +165090 -1.000000 +165091 -1.000000 +165094 -1.000000 +165095 -1.000000 +165096 -1.000000 +165097 -1.000000 +165098 -1.000000 +165099 -1.000000 +165100 -1.000000 +165102 -1.000000 +165113 -1.000000 +165114 -1.000000 +165115 -1.000000 +165116 -1.000000 +165120 -1.000000 +165122 -1.000000 +165124 -1.000000 +165125 -1.000000 +165129 -1.000000 +165130 -1.000000 +165131 -1.000000 +165134 -1.000000 +165135 -1.000000 +165137 -1.000000 +165138 -1.000000 +165141 -1.000000 +165142 -1.000000 +165143 -1.000000 +165145 -1.000000 +165146 -1.000000 +165147 -1.000000 +165148 -1.000000 +165149 -1.000000 +165151 -1.000000 +165153 -1.000000 +165156 -1.000000 +165157 -1.000000 +165158 -1.000000 +165159 -1.000000 +165160 -1.000000 +165167 -1.000000 +165168 -1.000000 +165169 -1.000000 +165170 -1.000000 +165171 -1.000000 +165172 -1.000000 +165173 -1.000000 +165175 -1.000000 +165176 -1.000000 +165177 -1.000000 +165178 -1.000000 +165179 -1.000000 +165180 -1.000000 +165181 -1.000000 +165182 -1.000000 +165183 -1.000000 +165184 -1.000000 +165185 -1.000000 +165186 -1.000000 +165188 -1.000000 +165190 -1.000000 +165195 -1.000000 +165196 -1.000000 +165202 -1.000000 +165203 -1.000000 +165204 -1.000000 +165205 -1.000000 +165209 -1.000000 +165210 -1.000000 +165211 -1.000000 +165212 -1.000000 +165213 -1.000000 +165214 -1.000000 +165215 -1.000000 +165216 -1.000000 +165217 -1.000000 +165218 -1.000000 +165219 -1.000000 +165220 -1.000000 +165221 -1.000000 +165222 -1.000000 +165223 -1.000000 +165225 -1.000000 +165240 -1.000000 +165241 -1.000000 +165252 -1.000000 +165260 -1.000000 +165262 -1.000000 +165264 -1.000000 +165266 -1.000000 +165267 -1.000000 +165268 -1.000000 +165269 -1.000000 +165270 -1.000000 +165275 -1.000000 +165276 -1.000000 +165277 -1.000000 +165278 -1.000000 +165280 -1.000000 +165281 -1.000000 +165284 -1.000000 +165285 -1.000000 +165286 -1.000000 +165287 -1.000000 +165288 -1.000000 +165289 -1.000000 +165295 -1.000000 +165296 -1.000000 +165297 -1.000000 +165298 -1.000000 +165299 -1.000000 +165300 -1.000000 +165301 -1.000000 +165302 -1.000000 +165303 -1.000000 +165304 -1.000000 +165305 -1.000000 +165306 -1.000000 +165307 -1.000000 +165308 -1.000000 +165309 -1.000000 +165310 -1.000000 +165311 -1.000000 +165312 -1.000000 +165313 -1.000000 +165314 -1.000000 +165315 -1.000000 +165316 -1.000000 +165317 -1.000000 +165318 -1.000000 +165319 -1.000000 +165320 -1.000000 +165321 -1.000000 +165322 -1.000000 +165323 -1.000000 +165324 -1.000000 +165325 -1.000000 +165334 -1.000000 +165335 -1.000000 +165338 -1.000000 +165339 -1.000000 +165340 -1.000000 +165341 -1.000000 +165342 -1.000000 +165343 -1.000000 +165345 -1.000000 +165346 -1.000000 +165349 -1.000000 +165350 -1.000000 +165351 -1.000000 +165352 -1.000000 +165353 -1.000000 +165354 -1.000000 +165365 -1.000000 +165366 -1.000000 +165367 -1.000000 +165368 -1.000000 +165369 -1.000000 +165370 -1.000000 +165372 -1.000000 +165373 -1.000000 +165375 -1.000000 +165376 -1.000000 +165377 -1.000000 +165378 -1.000000 +165379 -1.000000 +165380 -1.000000 +165381 -1.000000 +165382 -1.000000 +165383 -1.000000 +165386 -1.000000 +165387 -1.000000 +165388 -1.000000 +165389 -1.000000 +165396 -1.000000 +165397 -1.000000 +165398 -1.000000 +165400 -1.000000 +165402 -1.000000 +165403 -1.000000 +165405 -1.000000 +165406 -1.000000 +165407 -1.000000 +165408 -1.000000 +165410 -1.000000 +165413 -1.000000 +165415 -1.000000 +165419 -1.000000 +165420 -1.000000 +165427 -1.000000 +165428 -1.000000 +165429 -1.000000 +165430 -1.000000 +165431 -1.000000 +165432 -1.000000 +165433 -1.000000 +165434 -1.000000 +165435 -1.000000 +165436 -1.000000 +165437 -1.000000 +165438 -1.000000 +165439 -1.000000 +165440 -1.000000 +165441 -1.000000 +165442 -1.000000 +165443 -1.000000 +165444 -1.000000 +165445 -1.000000 +165446 -1.000000 +165447 -1.000000 +165448 -1.000000 +165449 -1.000000 +165450 -1.000000 +165451 -1.000000 +165452 -1.000000 +165454 -1.000000 +165455 -1.000000 +165460 -1.000000 +165461 -1.000000 +165462 -1.000000 +165463 -1.000000 +165464 -1.000000 +165465 -1.000000 +165466 -1.000000 +165467 -1.000000 +165468 -1.000000 +165469 -1.000000 +165470 -1.000000 +165472 -1.000000 +165473 -1.000000 +165474 -1.000000 +165475 -1.000000 +165476 -1.000000 +165477 -1.000000 +165478 -1.000000 +165479 -1.000000 +165480 -1.000000 +165481 -1.000000 +165482 -1.000000 +165483 -1.000000 +165484 -1.000000 +165488 -1.000000 +165489 -1.000000 +165491 -1.000000 +165492 -1.000000 +165494 -1.000000 +165495 -1.000000 +165497 -1.000000 +165498 -1.000000 +165499 -1.000000 +165500 -1.000000 +165501 -1.000000 +165502 -1.000000 +165504 -1.000000 +165505 -1.000000 +165506 -1.000000 +165507 -1.000000 +165508 -1.000000 +165509 -1.000000 +165510 -1.000000 +165512 -1.000000 +165513 -1.000000 +165514 -1.000000 +165515 -1.000000 +165516 -1.000000 +165518 -1.000000 +165520 -1.000000 +165530 -1.000000 +165537 -1.000000 +165538 -1.000000 +165541 -1.000000 +165545 -1.000000 +165546 -1.000000 +165547 -1.000000 +165548 -1.000000 +165549 -1.000000 +165550 -1.000000 +165551 -1.000000 +165552 -1.000000 +165554 -1.000000 +165555 -1.000000 +165556 -1.000000 +165557 -1.000000 +165558 -1.000000 +165559 -1.000000 +165674 -1.000000 +165675 -1.000000 +165679 -1.000000 +165683 -1.000000 +165684 -1.000000 +165685 -1.000000 +165687 -1.000000 +165689 -1.000000 +165690 -1.000000 +165692 -1.000000 +165707 -1.000000 +165708 -1.000000 +165710 -1.000000 +165713 -1.000000 +165714 -1.000000 +165719 -1.000000 +165720 -1.000000 +165721 -1.000000 +165723 -1.000000 +165725 -1.000000 +165730 -1.000000 +165732 -1.000000 +165733 -1.000000 +165742 -1.000000 +165743 -1.000000 +165744 -1.000000 +165745 -1.000000 +165746 -1.000000 +165747 -1.000000 +165748 -1.000000 +165749 -1.000000 +165750 -1.000000 +165751 -1.000000 +165752 -1.000000 +165753 -1.000000 +165754 -1.000000 +165756 -1.000000 +165757 -1.000000 +165758 -1.000000 +165759 -1.000000 +165760 -1.000000 +165761 -1.000000 +165762 -1.000000 +165763 -1.000000 +165764 -1.000000 +165765 -1.000000 +165766 -1.000000 +165767 -1.000000 +165768 -1.000000 +165769 -1.000000 +165770 -1.000000 +165771 -1.000000 +165772 -1.000000 +165773 -1.000000 +165774 -1.000000 +165776 -1.000000 +165777 -1.000000 +165778 -1.000000 +165779 -1.000000 +165810 -1.000000 +165813 -1.000000 +165818 -1.000000 +165820 -1.000000 +165829 -1.000000 +165842 -1.000000 +165843 -1.000000 +165844 -1.000000 +165846 -1.000000 +165847 -1.000000 +165849 -1.000000 +165852 -1.000000 +165853 -1.000000 +165854 -1.000000 +165857 -1.000000 +165859 -1.000000 +165860 -1.000000 +165861 -1.000000 +165862 -1.000000 +165863 -1.000000 +165864 -1.000000 +165865 -1.000000 +165866 -1.000000 +165867 -1.000000 +165868 -1.000000 +165869 -1.000000 +165870 -1.000000 +165871 -1.000000 +165872 -1.000000 +165873 -1.000000 +165874 -1.000000 +165875 -1.000000 +165876 -1.000000 +165877 -1.000000 +165878 -1.000000 +165885 -1.000000 +165887 -1.000000 +165888 -1.000000 +165889 -1.000000 +165890 -1.000000 +165891 -1.000000 +165892 -1.000000 +165893 -1.000000 +165894 -1.000000 +165895 -1.000000 +165896 -1.000000 +165897 -1.000000 +165898 -1.000000 +165904 -1.000000 +165905 -1.000000 +165906 -1.000000 +165910 -1.000000 +165917 -1.000000 +165918 -1.000000 +165919 -1.000000 +165920 -1.000000 +165921 -1.000000 +165922 -1.000000 +165923 -1.000000 +165924 -1.000000 +165925 -1.000000 +165926 -1.000000 +165927 -1.000000 +165928 -1.000000 +165929 -1.000000 +165930 -1.000000 +165931 -1.000000 +165932 -1.000000 +165933 -1.000000 +165934 -1.000000 +165935 -1.000000 +165936 -1.000000 +165937 -1.000000 +165938 -1.000000 +165939 -1.000000 +165940 -1.000000 +165941 -1.000000 +165942 -1.000000 +165943 -1.000000 +165944 -1.000000 +165948 -1.000000 +165949 -1.000000 +165950 -1.000000 +165951 -1.000000 +165952 -1.000000 +165953 -1.000000 +165954 -1.000000 +165955 -1.000000 +165956 -1.000000 +165957 -1.000000 +165958 -1.000000 +165959 -1.000000 +165960 -1.000000 +165961 -1.000000 +165962 -1.000000 +165963 -1.000000 +165964 -1.000000 +165965 -1.000000 +165971 -1.000000 +165972 -1.000000 +165973 -1.000000 +165974 -1.000000 +165975 -1.000000 +165976 -1.000000 +165977 -1.000000 +165980 -1.000000 +166009 -1.000000 +166010 -1.000000 +166013 -1.000000 +166021 -1.000000 +166023 -1.000000 +166025 -1.000000 +166026 -1.000000 +166027 -1.000000 +166029 -1.000000 +166030 -1.000000 +166031 -1.000000 +166032 -1.000000 +166033 -1.000000 +166034 -1.000000 +166035 -1.000000 +166036 -1.000000 +166037 -1.000000 +166040 -1.000000 +166041 -1.000000 +166042 -1.000000 +166043 -1.000000 +166044 -1.000000 +166045 -1.000000 +166046 -1.000000 +166048 -1.000000 +166050 -1.000000 +166051 -1.000000 +166052 -1.000000 +166054 -1.000000 +166055 -1.000000 +166060 -1.000000 +166061 -1.000000 +166062 -1.000000 +166063 -1.000000 +166064 -1.000000 +166065 -1.000000 +166066 -1.000000 +166067 -1.000000 +166068 -1.000000 +166069 -1.000000 +166070 -1.000000 +166071 -1.000000 +166073 -1.000000 +166074 -1.000000 +166075 -1.000000 +166077 -1.000000 +166078 -1.000000 +166080 -1.000000 +166081 -1.000000 +166083 -1.000000 +166084 -1.000000 +166085 -1.000000 +166086 -1.000000 +166087 -1.000000 +166089 -1.000000 +166091 -1.000000 +166092 -1.000000 +166093 -1.000000 +166094 -1.000000 +166102 -1.000000 +166103 -1.000000 +166104 -1.000000 +166105 -1.000000 +166106 -1.000000 +166107 -1.000000 +166108 -1.000000 +166109 -1.000000 +166110 -1.000000 +166111 -1.000000 +166112 -1.000000 +166113 -1.000000 +166114 -1.000000 +166115 -1.000000 +166117 -1.000000 +166120 -1.000000 +166122 -1.000000 +166123 -1.000000 +166124 -1.000000 +166126 -1.000000 +166127 -1.000000 +166129 -1.000000 +166130 -1.000000 +166131 -1.000000 +166135 -1.000000 +166136 -1.000000 +166137 -1.000000 +166138 -1.000000 +166140 -1.000000 +166141 -1.000000 +166142 -1.000000 +166143 -1.000000 +166144 -1.000000 +166145 -1.000000 +166146 -1.000000 +166147 -1.000000 +166149 -1.000000 +166150 -1.000000 +166151 -1.000000 +166156 -1.000000 +166158 -1.000000 +166162 -1.000000 +166163 -1.000000 +166168 -1.000000 +166169 -1.000000 +166171 -1.000000 +166172 -1.000000 +166173 -1.000000 +166174 -1.000000 +166175 -1.000000 +166176 -1.000000 +166177 -1.000000 +166181 -1.000000 +166182 -1.000000 +166183 -1.000000 +166189 -1.000000 +166253 -1.000000 +166256 -1.000000 +166259 -1.000000 +166263 -1.000000 +166264 -1.000000 +166265 -1.000000 +166266 -1.000000 +166267 -1.000000 +166283 -1.000000 +166286 -1.000000 +166303 -1.000000 +166308 -1.000000 +166309 -1.000000 +166310 -1.000000 +166313 -1.000000 +166316 -1.000000 +166317 -1.000000 +166326 -1.000000 +166327 -1.000000 +166335 -1.000000 +166336 -1.000000 +166337 -1.000000 +166338 -1.000000 +166339 -1.000000 +166340 -1.000000 +166343 -1.000000 +166345 -1.000000 +166346 -1.000000 +166347 -1.000000 +166348 -1.000000 +166349 -1.000000 +166350 -1.000000 +166351 -1.000000 +166352 -1.000000 +166353 -1.000000 +166354 -1.000000 +166355 -1.000000 +166356 -1.000000 +166357 -1.000000 +166358 -1.000000 +166359 -1.000000 +166360 -1.000000 +166361 -1.000000 +166362 -1.000000 +166386 -1.000000 +166387 -1.000000 +166388 -1.000000 +166389 -1.000000 +166390 -1.000000 +166391 -1.000000 +166392 -1.000000 +166393 -1.000000 +166394 -1.000000 +166396 -1.000000 +166397 -1.000000 +166398 -1.000000 +166399 -1.000000 +166400 -1.000000 +166401 -1.000000 +166402 -1.000000 +166403 -1.000000 +166407 -1.000000 +166408 -1.000000 +166409 -1.000000 +166410 -1.000000 +166411 -1.000000 +166412 -1.000000 +166415 -1.000000 +166416 -1.000000 +166417 -1.000000 +166419 -1.000000 +166420 -1.000000 +166421 -1.000000 +166428 -1.000000 +166429 -1.000000 +166430 -1.000000 +166431 -1.000000 +166432 -1.000000 +166433 -1.000000 +166434 -1.000000 +166442 -1.000000 +166444 -1.000000 +166455 -1.000000 +166480 -1.000000 +166481 -1.000000 +166482 -1.000000 +166483 -1.000000 +166484 -1.000000 +166485 -1.000000 +166486 -1.000000 +166487 -1.000000 +166488 -1.000000 +166489 -1.000000 +166490 -1.000000 +166491 -1.000000 +166492 -1.000000 +166494 -1.000000 +166495 -1.000000 +166496 -1.000000 +166497 -1.000000 +166498 -1.000000 +166499 -1.000000 +166501 -1.000000 +166504 -1.000000 +166505 -1.000000 +166506 -1.000000 +166507 -1.000000 +166508 -1.000000 +166509 -1.000000 +166515 -1.000000 +166516 -1.000000 +166517 -1.000000 +166518 -1.000000 +166519 -1.000000 +166520 -1.000000 +166521 -1.000000 +166522 -1.000000 +166523 -1.000000 +166524 -1.000000 +166525 -1.000000 +166526 -1.000000 +166528 -1.000000 +166529 -1.000000 +166530 -1.000000 +166531 -1.000000 +166532 -1.000000 +166533 -1.000000 +166534 -1.000000 +166535 -1.000000 +166536 -1.000000 +166537 -1.000000 +166538 -1.000000 +166539 -1.000000 +166540 -1.000000 +166541 -1.000000 +166542 -1.000000 +166543 -1.000000 +166548 -1.000000 +166549 -1.000000 +166556 -1.000000 +166557 -1.000000 +166558 -1.000000 +166561 -1.000000 +166566 -1.000000 +166567 -1.000000 +166568 -1.000000 +166569 -1.000000 +166572 -1.000000 +166573 -1.000000 +166574 -1.000000 +166577 -1.000000 +166578 -1.000000 +166579 -1.000000 +166580 -1.000000 +166581 -1.000000 +166582 -1.000000 +166583 -1.000000 +166584 -1.000000 +166585 -1.000000 +166593 -1.000000 +166595 -1.000000 +166596 -1.000000 +166597 -1.000000 +166598 -1.000000 +166600 -1.000000 +166602 -1.000000 +166603 -1.000000 +166604 -1.000000 +166606 -1.000000 +166608 -1.000000 +166609 -1.000000 +166612 -1.000000 +166613 -1.000000 +166614 -1.000000 +166615 -1.000000 +166617 -1.000000 +166618 -1.000000 +166619 -1.000000 +166620 -1.000000 +166621 -1.000000 +166626 -1.000000 +166628 -1.000000 +166634 -1.000000 +166647 -1.000000 +166661 -1.000000 +166662 -1.000000 +166668 -1.000000 +166669 -1.000000 +166670 -1.000000 +166676 -1.000000 +166678 -1.000000 +166679 -1.000000 +166680 -1.000000 +166683 -1.000000 +166685 -1.000000 +166690 -1.000000 +166695 -1.000000 +166696 -1.000000 +166697 -1.000000 +166698 -1.000000 +166699 -1.000000 +166700 -1.000000 +166701 -1.000000 +166702 -1.000000 +166703 -1.000000 +166704 -1.000000 +166705 -1.000000 +166710 -1.000000 +166711 -1.000000 +166717 -1.000000 +166718 -1.000000 +166720 -1.000000 +166721 -1.000000 +166722 -1.000000 +166723 -1.000000 +166724 -1.000000 +166725 -1.000000 +166726 -1.000000 +166727 -1.000000 +166728 -1.000000 +166730 -1.000000 +166731 -1.000000 +166732 -1.000000 +166733 -1.000000 +166734 -1.000000 +166736 -1.000000 +166737 -1.000000 +166739 -1.000000 +166740 -1.000000 +166777 -1.000000 +166782 -1.000000 +166785 -1.000000 +166786 -1.000000 +166787 -1.000000 +166788 -1.000000 +166789 -1.000000 +166790 -1.000000 +166791 -1.000000 +166793 -1.000000 +166794 -1.000000 +166795 -1.000000 +166797 -1.000000 +166798 -1.000000 +166812 -1.000000 +166813 -1.000000 +166814 -1.000000 +166833 -1.000000 +166838 -1.000000 +166839 -1.000000 +166841 -1.000000 +166842 -1.000000 +166843 -1.000000 +166844 -1.000000 +166845 -1.000000 +166846 -1.000000 +166847 -1.000000 +166848 -1.000000 +166849 -1.000000 +166850 -1.000000 +166851 -1.000000 +166852 -1.000000 +166853 -1.000000 +166854 -1.000000 +166857 -1.000000 +166858 -1.000000 +166868 -1.000000 +166883 -1.000000 +166889 -1.000000 +166899 -1.000000 +166900 -1.000000 +166901 -1.000000 +166902 -1.000000 +166903 -1.000000 +166904 -1.000000 +166905 -1.000000 +166906 -1.000000 +166907 -1.000000 +166908 -1.000000 +166909 -1.000000 +166911 -1.000000 +166912 -1.000000 +166916 -1.000000 +166917 -1.000000 +166920 -1.000000 +166921 -1.000000 +166922 -1.000000 +166923 -1.000000 +166946 -1.000000 +166947 -1.000000 +166948 -1.000000 +166949 -1.000000 +166951 -1.000000 +167060 -1.000000 +167061 -1.000000 +167062 -1.000000 +167064 -1.000000 +167069 -1.000000 +167070 -1.000000 +167071 -1.000000 +167072 -1.000000 +167073 -1.000000 +167074 -1.000000 +167075 -1.000000 +167076 -1.000000 +167077 -1.000000 +167078 -1.000000 +167079 -1.000000 +167080 -1.000000 +167081 -1.000000 +167082 -1.000000 +167083 -1.000000 +167084 -1.000000 +167087 -1.000000 +167088 -1.000000 +167089 -1.000000 +167090 -1.000000 +167091 -1.000000 +167092 -1.000000 +167093 -1.000000 +167095 -1.000000 +167097 -1.000000 +167104 -1.000000 +167109 -1.000000 +167110 -1.000000 +167111 -1.000000 +167112 -1.000000 +167113 -1.000000 +167114 -1.000000 +167115 -1.000000 +167116 -1.000000 +167117 -1.000000 +167119 -1.000000 +167120 -1.000000 +167129 -1.000000 +167130 -1.000000 +167131 -1.000000 +167132 -1.000000 +167134 -1.000000 +167135 -1.000000 +167136 -1.000000 +167138 -1.000000 +167139 -1.000000 +167140 -1.000000 +167141 -1.000000 +167142 -1.000000 +167143 -1.000000 +167144 -1.000000 +167145 -1.000000 +167147 -1.000000 +167148 -1.000000 +167149 -1.000000 +167151 -1.000000 +167152 -1.000000 +167153 -1.000000 +167160 -1.000000 +167161 -1.000000 +167162 -1.000000 +167164 -1.000000 +167165 -1.000000 +167166 -1.000000 +167167 -1.000000 +167168 -1.000000 +167169 -1.000000 +167170 -1.000000 +167171 -1.000000 +167172 -1.000000 +167173 -1.000000 +167174 -1.000000 +167175 -1.000000 +167176 -1.000000 +167177 -1.000000 +167179 -1.000000 +167180 -1.000000 +167181 -1.000000 +167182 -1.000000 +167183 -1.000000 +167184 -1.000000 +167185 -1.000000 +167190 -1.000000 +167191 -1.000000 +167192 -1.000000 +167193 -1.000000 +167194 -1.000000 +167195 -1.000000 +167196 -1.000000 +167197 -1.000000 +167198 -1.000000 +167199 -1.000000 +167200 -1.000000 +167201 -1.000000 +167202 -1.000000 +167203 -1.000000 +167204 -1.000000 +167205 -1.000000 +167206 -1.000000 +167207 -1.000000 +167208 -1.000000 +167209 -1.000000 +167210 -1.000000 +167211 -1.000000 +167212 -1.000000 +167213 -1.000000 +167214 -1.000000 +167215 -1.000000 +167216 -1.000000 +167217 -1.000000 +167218 -1.000000 +167219 -1.000000 +167220 -1.000000 +167223 -1.000000 +167225 -1.000000 +167226 -1.000000 +167227 -1.000000 +167228 -1.000000 +167229 -1.000000 +167230 -1.000000 +167231 -1.000000 +167232 -1.000000 +167233 -1.000000 +167234 -1.000000 +167235 -1.000000 +167236 -1.000000 +167237 -1.000000 +167238 -1.000000 +167239 -1.000000 +167240 -1.000000 +167241 -1.000000 +167242 -1.000000 +167243 -1.000000 +167244 -1.000000 +167246 -1.000000 +167247 -1.000000 +167251 -1.000000 +167252 -1.000000 +167253 -1.000000 +167254 -1.000000 +167255 -1.000000 +167256 -1.000000 +167257 -1.000000 +167258 -1.000000 +167259 -1.000000 +167260 -1.000000 +167261 -1.000000 +167262 -1.000000 +167263 -1.000000 +167264 -1.000000 +167265 -1.000000 +167266 -1.000000 +167267 -1.000000 +167268 -1.000000 +167270 -1.000000 +167271 -1.000000 +167272 -1.000000 +167273 -1.000000 +167274 -1.000000 +167275 -1.000000 +167276 -1.000000 +167277 -1.000000 +167279 -1.000000 +167280 -1.000000 +167281 -1.000000 +167284 -1.000000 +167285 -1.000000 +167286 -1.000000 +167287 -1.000000 +167291 -1.000000 +167292 -1.000000 +167293 -1.000000 +167294 -1.000000 +167295 -1.000000 +167296 -1.000000 +167297 -1.000000 +167298 -1.000000 +167299 -1.000000 +167300 -1.000000 +167301 -1.000000 +167302 -1.000000 +167303 -1.000000 +167305 -1.000000 +167306 -1.000000 +167307 -1.000000 +167308 -1.000000 +167309 -1.000000 +167310 -1.000000 +167311 -1.000000 +167313 -1.000000 +167314 -1.000000 +167315 -1.000000 +167317 -1.000000 +167318 -1.000000 +167319 -1.000000 +167320 -1.000000 +167321 -1.000000 +167322 -1.000000 +167328 -1.000000 +167329 -1.000000 +167330 -1.000000 +167331 -1.000000 +167332 -1.000000 +167348 -1.000000 +167349 -1.000000 +167350 -1.000000 +167351 -1.000000 +167353 -1.000000 +167354 -1.000000 +167355 -1.000000 +167356 -1.000000 +167357 -1.000000 +167358 -1.000000 +167364 -1.000000 +167365 -1.000000 +167366 -1.000000 +167367 -1.000000 +167368 -1.000000 +167369 -1.000000 +167370 -1.000000 +167371 -1.000000 +167372 -1.000000 +167373 -1.000000 +167374 -1.000000 +167375 -1.000000 +167376 -1.000000 +167377 -1.000000 +167378 -1.000000 +167379 -1.000000 +167380 -1.000000 +167381 -1.000000 +167382 -1.000000 +167383 -1.000000 +167384 -1.000000 +167385 -1.000000 +167386 -1.000000 +167387 -1.000000 +167388 -1.000000 +167389 -1.000000 +167390 -1.000000 +167391 -1.000000 +167392 -1.000000 +167393 -1.000000 +167399 -1.000000 +167400 -1.000000 +167401 -1.000000 +167402 -1.000000 +167403 -1.000000 +167404 -1.000000 +167405 -1.000000 +167406 -1.000000 +167408 -1.000000 +167409 -1.000000 +167410 -1.000000 +167411 -1.000000 +167412 -1.000000 +167413 -1.000000 +167414 -1.000000 +167416 -1.000000 +167417 -1.000000 +167418 -1.000000 +167419 -1.000000 +167420 -1.000000 +167421 -1.000000 +167422 -1.000000 +167423 -1.000000 +167424 -1.000000 +167425 -1.000000 +167430 -1.000000 +167431 -1.000000 +167432 -1.000000 +167433 -1.000000 +167434 -1.000000 +167435 -1.000000 +167437 -1.000000 +167439 -1.000000 +167440 -1.000000 +167441 -1.000000 +167443 -1.000000 +167444 -1.000000 +167449 -1.000000 +167451 -1.000000 +167453 -1.000000 +167455 -1.000000 +167457 -1.000000 +167460 -1.000000 +167463 -1.000000 +167473 -1.000000 +167474 -1.000000 +167475 -1.000000 +167481 -1.000000 +167482 -1.000000 +167483 -1.000000 +167484 -1.000000 +167485 -1.000000 +167486 -1.000000 +167489 -1.000000 +167490 -1.000000 +167491 -1.000000 +167493 -1.000000 +167495 -1.000000 +167499 -1.000000 +167502 -1.000000 +167504 -1.000000 +167506 -1.000000 +167515 -1.000000 +167516 -1.000000 +167517 -1.000000 +167518 -1.000000 +167519 -1.000000 +167520 -1.000000 +167521 -1.000000 +167522 -1.000000 +167523 -1.000000 +167524 -1.000000 +167525 -1.000000 +167526 -1.000000 +167527 -1.000000 +167528 -1.000000 +167529 -1.000000 +167530 -1.000000 +167531 -1.000000 +167532 -1.000000 +167533 -1.000000 +167534 -1.000000 +167535 -1.000000 +167536 -1.000000 +167537 -1.000000 +167538 -1.000000 +167539 -1.000000 +167540 -1.000000 +167541 -1.000000 +167542 -1.000000 +167547 -1.000000 +167548 -1.000000 +167549 -1.000000 +167551 -1.000000 +167552 -1.000000 +167553 -1.000000 +167554 -1.000000 +167555 -1.000000 +167563 -1.000000 +167567 -1.000000 +167568 -1.000000 +167569 -1.000000 +167570 -1.000000 +167571 -1.000000 +167572 -1.000000 +167574 -1.000000 +167575 -1.000000 +167576 -1.000000 +167577 -1.000000 +167578 -1.000000 +167579 -1.000000 +167580 -1.000000 +167589 -1.000000 +167600 -1.000000 +167601 -1.000000 +167602 -1.000000 +167603 -1.000000 +167605 -1.000000 +167606 -1.000000 +167607 -1.000000 +167608 -1.000000 +167618 -1.000000 +168439 -1.000000 +168440 -1.000000 +168441 -1.000000 +168444 -1.000000 +168450 -1.000000 +168451 -1.000000 +168484 -1.000000 +168487 -1.000000 +168488 -1.000000 +168490 -1.000000 +168491 -1.000000 +168500 -1.000000 +168504 -1.000000 +168516 -1.000000 +168519 -1.000000 +168529 -1.000000 +168530 -1.000000 +168534 -1.000000 +168536 -1.000000 +168537 -1.000000 +168544 -1.000000 +168548 -1.000000 +168551 -1.000000 +168554 -1.000000 diff --git a/data/shot_lists/d3d/d3d_disrupt.txt b/data/shot_lists/d3d/d3d_disrupt.txt new file mode 100755 index 00000000..fcd2ad26 --- /dev/null +++ b/data/shot_lists/d3d/d3d_disrupt.txt @@ -0,0 +1,17295 @@ +100000 4.624000 +100001 5.520000 +100016 5.548500 +100017 5.580500 +100018 5.506500 +100019 5.538500 +100020 4.882500 +100021 5.687500 +100022 5.662500 +100025 5.712500 +100026 5.727500 +100030 5.747500 +100037 2.476500 +100038 5.592500 +100040 1.668500 +100041 5.612500 +100045 5.922500 +100046 5.892500 +100047 2.164500 +100048 4.988500 +100049 4.990500 +100050 2.136500 +100051 1.968500 +100053 5.158500 +100054 2.154500 +100055 0.913500 +100057 5.302500 +100067 2.420500 +100068 2.758500 +100069 2.936500 +100071 2.796500 +100073 0.512500 +100074 5.982500 +100075 4.854500 +100077 6.017500 +100078 6.007500 +100079 5.982500 +100082 6.027500 +100083 6.022500 +100085 5.987500 +100087 5.987500 +100094 4.282500 +100096 1.172500 +100097 4.272500 +100098 4.270500 +100099 4.550500 +100100 4.216500 +100107 4.476500 +100112 4.158500 +100113 4.140500 +100114 4.158500 +100115 4.286500 +100120 4.060500 +100153 3.436500 +100154 3.892500 +100176 0.604500 +100177 0.737500 +100178 2.199500 +100179 0.724500 +100184 3.544500 +100188 2.254500 +100191 2.169500 +100192 5.117500 +100205 5.580000 +100206 5.545000 +100207 5.540000 +100208 4.936000 +100210 5.560000 +100211 5.560000 +100212 5.545000 +100213 5.590000 +100214 5.605000 +100216 5.610000 +100217 5.565000 +100218 5.565000 +100219 5.660000 +100221 5.560000 +100222 4.806000 +100223 5.570000 +100224 5.565000 +100228 5.555000 +100230 5.675000 +100231 5.595000 +100232 5.680000 +100233 5.630000 +100234 5.655000 +100235 5.655000 +100236 5.635000 +100237 5.630000 +100238 5.545000 +100239 5.650000 +100240 5.600000 +100241 5.570000 +100242 5.620000 +100243 5.540000 +100244 5.655000 +100245 5.655000 +100246 4.566000 +100247 4.286000 +100248 4.214000 +100249 4.234000 +100250 4.228000 +100251 4.254000 +100252 4.246000 +100254 5.600000 +100255 5.545000 +100256 3.548000 +100257 0.570000 +100258 0.862000 +100259 0.948000 +100274 5.177800 +100275 5.023600 +100276 5.032200 +100277 5.041800 +100279 2.454000 +100280 2.548000 +100281 2.398000 +100282 2.588000 +100283 2.520000 +100284 4.975000 +100285 1.666000 +100286 2.606500 +100287 4.980000 +100288 2.319000 +100294 5.345000 +100296 4.750000 +100297 4.765000 +100298 2.948000 +100299 4.657500 +100302 2.263500 +100303 5.612500 +100304 5.602500 +100305 5.587500 +100306 5.647500 +100307 5.582500 +100308 5.222500 +100309 5.567500 +100310 5.537500 +100311 5.612500 +100312 5.572500 +100313 5.147500 +100314 5.197500 +100315 2.467500 +100316 1.996500 +100317 1.670500 +100318 1.994500 +100319 1.714500 +100324 5.642500 +100325 4.267500 +100326 5.617500 +100327 1.050500 +100332 1.308500 +100334 1.950500 +100348 1.914500 +100349 1.030500 +100350 1.428500 +100351 2.158500 +100352 4.011900 +100353 5.643500 +100354 5.558500 +100355 3.828500 +100356 1.616500 +100357 2.592500 +100358 1.328500 +100359 4.226500 +100360 4.222500 +100361 4.029500 +100362 2.688500 +100363 4.027900 +100364 2.632500 +100365 4.028900 +100366 1.640500 +100367 2.878500 +100368 4.470500 +100369 4.442500 +100370 5.508500 +100371 4.071300 +100372 4.042900 +100373 2.996500 +100374 1.536500 +100385 1.108500 +100386 4.252500 +100389 4.856500 +100390 5.454500 +100391 5.578500 +100392 4.338500 +100393 6.017500 +100394 4.510500 +100395 4.478500 +100396 5.456500 +100397 4.408500 +100398 5.448500 +100400 5.632500 +100401 5.637500 +100402 5.907500 +100403 4.386500 +100406 6.167500 +100407 5.817500 +100408 6.217500 +100780 0.754500 +100781 0.966500 +100782 0.983500 +100783 0.955500 +100785 0.932500 +100787 0.673500 +100792 0.632500 +100795 4.598500 +100796 0.731500 +100799 1.239500 +100802 4.672000 +100808 5.565000 +100809 5.580000 +100810 3.700000 +100811 5.605000 +100812 4.659600 +100813 4.728400 +100814 5.610000 +100815 4.557400 +100816 4.559400 +100819 4.614600 +100820 4.563000 +100830 0.939500 +100831 1.242500 +100845 1.725500 +100860 2.802500 +100870 3.536500 +100876 3.430500 +100878 2.292500 +100879 1.333500 +100967 1.849500 +100968 5.462500 +101053 2.262500 +101054 5.407500 +101056 2.608500 +101062 1.740500 +101063 4.177500 +101064 4.132500 +101065 0.922500 +101066 0.792500 +101067 0.891500 +101088 1.129500 +101093 2.167500 +101096 4.172500 +101099 3.758500 +101100 3.740500 +101120 2.083500 +101122 2.580500 +101125 4.777500 +101130 1.968500 +101132 2.121500 +101133 4.702500 +101136 2.467500 +101137 3.176500 +101138 2.992500 +101147 5.232500 +101149 4.932500 +101150 5.608500 +101153 4.694500 +101154 5.626500 +101155 4.780500 +101156 5.658500 +101157 5.724500 +101158 5.716500 +101160 5.612500 +101163 5.628500 +101164 3.934500 +101170 3.356500 +101171 4.006500 +101176 1.514500 +101180 4.066500 +101181 5.074500 +101183 1.711500 +101184 4.428500 +101185 2.594500 +101188 5.638500 +101190 0.912500 +101191 1.055500 +101193 3.682500 +101195 0.816500 +101202 0.954500 +101203 0.782500 +101216 0.840500 +101224 4.607500 +101226 2.339500 +101227 4.536500 +101230 4.218500 +101233 5.404500 +101235 5.464500 +101236 4.830500 +101237 5.414500 +101238 2.048500 +101239 4.826500 +101240 5.290500 +101241 5.476500 +101242 5.480500 +101243 5.440500 +101244 5.430500 +101245 4.810500 +101246 4.722500 +101247 5.240500 +101253 3.030500 +101255 4.382500 +101257 5.434500 +101259 4.170500 +101266 2.784500 +101268 5.456500 +101273 5.440500 +101274 5.484500 +101277 5.438500 +101290 4.872500 +101292 5.504500 +101293 1.044500 +101295 1.707500 +101299 5.408500 +101321 5.308500 +101346 5.422500 +101348 4.382500 +101349 4.257500 +101351 4.972500 +101353 3.882500 +101355 4.037500 +101356 5.437500 +101363 4.057500 +101371 4.762500 +101372 5.157500 +101375 5.067500 +101378 5.367500 +101379 5.392500 +101381 5.372500 +101384 5.397500 +101409 2.337500 +101417 3.777500 +101418 2.142500 +101427 5.057500 +101428 5.062500 +101429 4.967500 +101444 0.780500 +101445 0.504500 +101450 5.427500 +101453 5.482500 +101454 5.417500 +101455 5.447500 +101459 5.437500 +101460 5.387500 +101461 5.387500 +101462 5.452500 +101463 5.452500 +101470 4.687500 +101473 3.682500 +101524 2.272500 +101525 1.240500 +101526 3.737500 +101527 3.497500 +101530 3.562500 +101547 0.536500 +101548 4.177500 +101553 1.348500 +101555 5.427500 +101556 5.472500 +101557 5.387500 +101558 5.362500 +101559 5.452500 +101560 5.427500 +101561 5.447500 +101562 4.697500 +101563 4.217500 +101564 5.327500 +101565 5.457500 +101566 5.607500 +101567 5.607500 +101568 5.647500 +101569 5.657500 +101570 5.422500 +101571 5.262500 +101572 5.262500 +101576 1.592500 +101605 5.227500 +101611 5.477500 +101612 5.347500 +101613 5.467500 +101614 5.392500 +101615 5.092500 +101617 2.262500 +101619 2.932500 +101620 5.292500 +101621 5.182500 +101623 5.217500 +101624 5.197500 +101625 5.207500 +101626 5.282500 +101627 5.292500 +101635 5.302500 +101636 0.550500 +101637 0.788500 +101638 2.467500 +101639 0.560500 +101641 5.357500 +101643 5.302500 +101644 0.506500 +101649 5.322500 +101650 5.252500 +101651 0.518500 +101652 5.322500 +101653 5.312500 +101658 5.322500 +101659 5.242500 +101661 5.322500 +101662 5.317500 +101663 5.317500 +101664 5.287500 +101666 5.307500 +101845 5.205000 +101851 3.770000 +101857 0.709500 +101859 1.856500 +101860 1.247500 +101861 1.958500 +101862 1.939500 +101865 1.776500 +101866 1.595500 +101867 2.164500 +101868 4.487500 +101869 3.682500 +101870 1.273000 +101871 1.273500 +101872 3.434500 +101873 1.276500 +101874 1.305000 +101875 3.707500 +101876 2.512500 +101877 1.632500 +101878 3.792500 +101879 1.404500 +101880 4.587500 +101881 3.752500 +101882 2.350500 +101883 2.130500 +101887 1.844500 +101888 1.374500 +101889 1.343500 +101890 1.422500 +101891 5.272500 +101892 4.117500 +101894 5.287500 +101895 5.197500 +101896 5.382500 +101897 5.212500 +101899 5.427500 +101900 5.382500 +101901 5.397500 +101903 5.412500 +101909 5.432500 +101911 5.362500 +101915 5.372500 +101935 3.182000 +101936 1.212000 +101937 1.250000 +101938 1.229000 +101939 3.316000 +101966 5.340000 +101967 5.360000 +101968 5.360000 +101971 5.435000 +101974 5.330000 +101976 5.385000 +101977 5.370000 +101981 5.315000 +101983 5.320000 +101984 5.390000 +101987 5.365000 +101988 5.410000 +101990 4.554000 +101991 4.478000 +101992 1.386000 +101993 1.518000 +101994 1.251000 +101995 1.319000 +101996 2.325000 +101997 1.288000 +102001 4.140000 +102002 3.578000 +102003 3.576000 +102004 5.375000 +102005 4.318000 +102006 5.395000 +102007 5.205000 +102008 5.360000 +102009 5.190000 +102010 5.325000 +102011 5.330000 +102013 5.170000 +102014 5.210000 +102015 5.295000 +102016 5.150000 +102017 5.370000 +102018 5.155000 +102019 5.325000 +102020 5.355000 +102021 5.190000 +102022 5.190000 +102024 5.200000 +102025 5.195000 +102026 5.220000 +102027 5.195000 +102028 5.345000 +102029 5.170000 +102033 4.084000 +102034 5.250000 +102035 4.566000 +102036 4.386000 +102037 5.303000 +102038 5.297000 +102039 5.277000 +102047 5.982000 +102048 5.918000 +102049 5.924000 +102050 6.118000 +102051 4.116000 +102052 5.980000 +102053 5.842000 +102054 6.096000 +102055 6.126000 +102056 6.126000 +102057 6.156000 +102058 6.272000 +102063 1.018000 +102064 1.232000 +102065 5.340000 +102067 6.344000 +102068 6.346000 +102069 5.982000 +102070 1.090000 +102071 1.126000 +102074 5.476000 +102077 1.166000 +102079 1.152000 +102081 4.984000 +102083 4.990000 +102084 4.910000 +102085 4.934000 +102086 4.974000 +102088 5.128000 +102090 1.072000 +102091 1.480000 +102093 2.154000 +102095 6.262000 +102107 5.216500 +102110 5.544500 +102111 2.118500 +102113 1.361500 +102114 5.018500 +102115 4.922500 +102116 1.680500 +102117 1.650500 +102118 5.026500 +102122 2.014500 +102248 5.298500 +102268 3.002500 +102270 3.154500 +102285 5.332500 +102286 5.312500 +102287 5.400500 +102288 5.290500 +102289 5.322500 +102290 1.469500 +102291 1.454500 +102292 2.932500 +102293 5.324500 +102295 1.400500 +102296 5.328500 +102297 5.330500 +102298 5.288500 +102299 5.140500 +102300 4.922500 +102301 5.090500 +102302 5.162500 +102303 5.310500 +102304 4.770500 +102305 5.146500 +102306 5.118500 +102307 5.212500 +102308 2.030500 +102309 1.871500 +102310 1.754500 +102311 2.918500 +102313 1.319500 +102316 1.366500 +102317 1.487500 +102321 5.228500 +102322 5.390500 +102324 3.646500 +102325 3.174500 +102328 2.092500 +102331 3.544500 +102348 2.610500 +102349 3.614500 +102351 3.798500 +102366 2.642500 +102368 4.810500 +102369 5.336500 +102371 5.328500 +102392 2.818500 +102393 3.762500 +102394 5.290500 +102395 5.288500 +102396 4.644500 +102397 5.400500 +102398 5.274500 +102400 5.380500 +102401 4.252500 +102403 0.538500 +102405 5.292500 +102407 6.034500 +102408 5.828500 +102409 6.048500 +102410 5.920500 +102411 6.170500 +102412 6.200500 +102413 6.278500 +102414 6.238500 +102415 6.202500 +102416 6.248500 +102417 6.210500 +102418 4.774500 +102419 6.260500 +102426 5.286500 +102430 4.822500 +102432 4.102500 +102442 4.210500 +102447 5.348500 +102448 4.810500 +102449 5.724500 +102450 4.434500 +102453 5.514500 +102454 5.354500 +102455 5.530500 +102456 5.282500 +102457 5.310500 +102458 4.502500 +102459 4.904500 +102460 5.260500 +102461 5.084500 +102462 5.508500 +102464 5.356500 +102465 5.310500 +102466 5.374500 +102585 0.630500 +102586 0.744500 +102587 0.736500 +102588 0.742500 +102591 0.694500 +102592 0.730500 +102612 3.396500 +102613 2.222500 +102614 2.318500 +102615 3.972500 +102616 5.304500 +102623 5.364500 +102626 4.772500 +102628 5.344500 +102629 5.326500 +102635 2.041500 +102643 1.490500 +102656 3.608500 +102664 5.308500 +102665 5.108500 +102666 5.136500 +102668 5.090500 +102670 5.306500 +102671 5.318500 +102672 4.586500 +102673 5.358500 +102685 5.394500 +102687 5.316500 +102688 5.314500 +102719 5.388500 +102720 5.352500 +102736 4.266500 +102737 4.166500 +102738 3.906500 +102739 1.339500 +102740 4.674500 +102741 3.898500 +102742 4.660500 +102743 4.626500 +102744 5.234500 +102745 3.950500 +102746 4.912500 +102747 4.934500 +102748 4.986500 +102750 1.239500 +102751 1.263500 +102752 5.000500 +102753 4.826500 +102754 4.972500 +102755 4.918500 +102756 4.848500 +102757 4.914500 +102758 5.352500 +102762 5.320500 +102763 4.256500 +102764 3.964500 +102816 5.322500 +102817 5.346500 +102824 5.364500 +102825 5.384500 +102826 5.338500 +102828 5.336500 +102829 0.912500 +102830 5.314500 +102831 5.370500 +102832 1.010500 +102833 5.418500 +102834 0.918500 +102835 5.374500 +102842 5.354500 +102843 5.402500 +102844 5.410500 +102845 5.282500 +102846 5.490500 +102847 5.438500 +102848 5.514500 +102856 5.534500 +102857 4.126500 +102858 5.676500 +102859 5.574500 +102863 4.378500 +102865 2.680500 +102866 0.564500 +102867 3.768500 +102868 3.032500 +102869 2.556500 +102870 4.242500 +102871 2.620500 +102872 0.612500 +102873 3.554500 +102874 3.260500 +102875 1.014500 +102876 3.662500 +102877 3.350500 +102881 0.954500 +102882 4.810500 +102883 4.208500 +102884 4.198500 +102885 4.180500 +102886 4.166500 +102887 4.062500 +102888 4.042500 +102889 4.074500 +102890 4.044500 +102892 4.926500 +102895 1.984500 +102899 2.198500 +102901 5.526500 +102903 1.510500 +102906 2.706500 +102907 4.360500 +102908 1.664500 +102909 1.352500 +102910 2.396500 +102916 3.916500 +102917 5.310500 +102919 5.310500 +102920 5.400500 +102922 5.394500 +102923 5.412500 +102924 4.432500 +102925 5.394500 +102926 5.404500 +102927 5.372500 +102929 3.016500 +102930 5.390500 +102931 3.222500 +102932 2.942500 +102933 2.404500 +102935 5.310500 +102936 5.416500 +102937 4.008500 +102938 3.444500 +102940 1.486500 +102941 1.461500 +102942 1.849500 +102943 5.320500 +102944 2.026500 +102945 5.234500 +102946 5.332500 +102950 5.328500 +102951 4.572500 +102952 4.140500 +102955 1.641500 +102956 2.204000 +102957 2.369000 +102958 4.049000 +102961 3.246500 +102962 3.096500 +102963 2.002500 +102964 3.400500 +102966 2.408500 +102967 2.950500 +102973 3.570500 +102974 3.936500 +102977 1.096500 +102981 2.540500 +102986 5.368500 +102988 5.344500 +102992 5.344500 +102994 5.380500 +102995 5.422500 +102997 5.356500 +102998 5.350500 +103001 5.342500 +103006 5.356500 +103007 5.328500 +103010 3.080500 +103011 3.106500 +103028 5.318500 +103029 5.372500 +103030 5.360500 +103031 2.386500 +103033 3.712500 +103034 2.830500 +103035 2.916500 +103036 5.262500 +103037 5.306500 +103096 4.967500 +103102 5.376500 +103106 4.142500 +103112 2.203500 +103114 2.174500 +103121 1.814500 +103123 4.470500 +103126 2.059500 +103128 2.066500 +103129 4.198500 +103130 4.258500 +103131 1.984500 +103132 1.733500 +103151 2.206500 +103152 4.184500 +103153 0.650500 +103154 4.170500 +103155 4.170500 +103156 4.250500 +103157 4.212500 +103158 1.920500 +103159 2.142500 +103160 1.697500 +103161 1.608500 +103162 2.042500 +103163 1.970500 +103164 4.194500 +103165 2.053500 +103166 2.072500 +103167 1.990500 +103168 2.054500 +103169 2.211500 +103170 4.156500 +103171 4.170500 +103172 2.156500 +103174 4.150500 +103175 4.192500 +103176 2.314500 +103177 4.160500 +103178 4.274500 +103179 4.220500 +103180 1.042500 +103186 4.104500 +103188 1.537500 +103189 1.558500 +103190 1.537500 +103192 3.214500 +103199 3.140500 +103204 2.316500 +103206 3.500500 +103207 2.752500 +103208 2.954500 +103209 2.226500 +103213 4.220500 +103215 4.486500 +103217 4.278500 +103218 3.348500 +103219 3.496500 +103222 3.502500 +103223 4.286500 +103224 1.365500 +103225 1.434500 +103226 2.624500 +103227 1.446500 +103229 1.487500 +103230 4.116500 +103231 2.092500 +103232 1.088500 +103233 4.264500 +103235 4.228500 +103237 2.139500 +103238 1.112500 +103240 1.520500 +103241 3.146500 +103242 3.212500 +103244 3.154500 +103246 4.544500 +103247 1.493500 +103248 4.296500 +103249 4.266500 +103250 1.262500 +103258 1.499500 +103259 2.718500 +103260 2.870500 +103263 4.742500 +103264 4.914500 +103265 5.336500 +103266 5.422500 +103267 5.342500 +103269 1.981500 +103270 4.254500 +103271 4.340500 +103275 4.312500 +103276 2.139500 +103277 0.686500 +103278 4.202500 +103279 2.278500 +103280 4.362500 +103281 4.152500 +103297 3.618500 +103298 4.154500 +103299 4.172500 +103300 2.960500 +103302 2.704500 +103303 2.944500 +103304 1.835500 +103305 1.505500 +103306 2.704500 +103307 1.333500 +103308 1.588500 +103311 1.400500 +103312 1.955500 +103313 4.066500 +103314 1.197500 +103315 4.050500 +103317 1.200500 +103318 2.806500 +103319 4.642500 +103320 1.819500 +103321 2.864500 +103322 2.407500 +103327 1.416500 +103328 2.349500 +103329 2.209500 +103330 2.227500 +103333 4.006500 +103339 1.862000 +103344 4.724000 +103345 4.454000 +103347 4.494000 +103357 1.387000 +103358 1.312000 +103359 1.377000 +103360 4.068000 +103361 1.322000 +103363 3.958000 +103364 3.922000 +103369 2.109000 +103370 5.285000 +103371 5.400000 +103372 5.385000 +103373 5.315000 +103374 1.006000 +103375 5.375000 +103376 5.370000 +103377 5.335000 +103378 5.370000 +103379 5.385000 +103383 5.340000 +103384 5.395000 +103385 5.320000 +103386 5.315000 +103387 5.340000 +103388 5.320000 +103389 5.355000 +103390 5.350000 +103400 0.506000 +103401 5.370000 +103403 5.385000 +103404 5.310000 +103405 5.340000 +103406 5.375000 +103407 5.340000 +103408 1.934000 +103409 1.962000 +103410 5.345000 +103411 5.310000 +103412 5.400000 +103413 5.350000 +103414 5.335000 +103416 5.310000 +103417 5.355000 +103418 5.345000 +103419 5.395000 +103420 5.380000 +103421 5.335000 +103422 5.350000 +103423 5.370000 +103424 5.405000 +103425 5.350000 +103426 5.410000 +103429 5.330000 +103430 5.295000 +103431 5.350000 +103432 5.305000 +103433 5.370000 +103434 5.350000 +103436 5.270000 +103437 5.310000 +103438 5.160000 +103439 5.330000 +103441 5.170000 +103442 5.275000 +103443 5.270000 +103444 5.260000 +103445 5.185000 +103446 1.747000 +103448 2.484000 +103449 5.160000 +103450 3.986000 +103451 5.155000 +103452 5.165000 +103453 5.180000 +103454 5.145000 +103455 1.564000 +103456 3.062000 +103457 5.140000 +103463 1.996000 +103464 5.205000 +103465 5.150000 +103466 5.145000 +103467 5.160000 +103468 5.175000 +103469 5.145000 +103471 5.105000 +103472 3.844000 +103473 5.175000 +103474 5.220000 +103475 5.175000 +103476 5.215000 +103477 5.200000 +103478 5.180000 +103480 5.170000 +103481 5.200000 +103482 3.680000 +103483 5.095000 +103484 1.848000 +103485 5.220000 +103486 5.195000 +103487 5.265000 +103488 5.130000 +103489 5.205000 +103490 5.175000 +103491 5.145000 +103492 1.463000 +103493 5.225000 +103498 5.355000 +103499 5.325000 +103500 5.355000 +103501 5.355000 +103502 5.320000 +103503 5.325000 +103504 5.340000 +103505 5.300000 +103506 5.375000 +103507 5.365000 +103508 5.370000 +103509 5.370000 +103510 5.290000 +103511 5.285000 +103512 5.295000 +103513 5.315000 +103515 5.280000 +103516 5.310000 +103517 5.365000 +103518 5.340000 +103519 5.355000 +103520 5.305000 +103524 3.094000 +103525 3.398000 +103526 3.442000 +103527 5.295000 +103528 5.250000 +103529 5.040000 +103530 5.265000 +103531 5.245000 +103532 5.250000 +103533 5.260000 +103535 4.000000 +103638 2.632000 +103645 5.325000 +103646 5.355000 +103651 4.754000 +103655 5.355000 +103656 5.335000 +103657 3.182000 +103658 3.712000 +103659 3.642000 +103660 3.810000 +103662 3.784000 +103663 3.854000 +103664 4.116000 +103668 0.814000 +103675 0.678000 +103676 4.086000 +103679 4.074000 +103684 4.170000 +103685 1.752000 +103686 3.226000 +103687 4.230000 +103688 4.122000 +103691 4.402000 +103694 1.485000 +103695 2.982000 +103696 3.474000 +103699 1.070000 +103703 3.434000 +103704 3.062000 +103705 1.360000 +103706 5.135000 +103715 1.158000 +103718 5.375000 +103719 5.375000 +103720 5.340000 +103721 5.110000 +103724 5.185000 +103725 5.365000 +103726 1.675000 +103727 1.624000 +103728 1.698000 +103729 0.894000 +103730 4.192000 +103734 4.740000 +103735 4.618000 +103736 4.956000 +103741 2.324000 +103742 3.556000 +103743 5.400000 +103744 3.386000 +103745 3.222000 +103746 4.850000 +103747 3.036000 +103748 4.658000 +103749 3.922000 +103750 3.824000 +103751 5.055000 +103752 2.591000 +103753 5.110000 +103754 5.345000 +103755 3.312000 +103756 5.335000 +103757 4.506000 +103762 5.350000 +103763 5.225000 +103764 5.335000 +103766 2.389000 +103772 5.385000 +103774 5.370000 +103781 5.275000 +103782 5.290000 +103784 5.260000 +103789 1.559000 +103790 1.633000 +103792 1.603000 +103794 5.280000 +103795 1.353000 +103799 4.932000 +103812 2.244000 +103815 4.582000 +103817 4.054000 +103821 5.895000 +103823 1.154000 +103827 0.696000 +103828 5.945000 +103843 4.914000 +103847 2.890000 +103850 3.596000 +103852 5.090000 +103854 5.240000 +103856 4.224000 +103857 4.736000 +103858 4.846000 +103859 4.554000 +103860 1.999000 +103861 4.648000 +103864 1.679000 +103865 5.180000 +103869 5.245000 +103870 5.290000 +103871 5.155000 +103872 5.240000 +103873 2.188000 +103874 4.962000 +103878 6.185000 +103881 5.832000 +103882 1.018000 +103883 1.904000 +103884 3.562000 +103885 6.566000 +103886 1.366000 +103887 6.552000 +103888 5.144000 +103895 3.214000 +103896 4.362000 +103897 1.713000 +103899 5.115000 +103900 4.298000 +103902 2.857000 +103903 4.570000 +103904 3.098000 +103905 2.356000 +103907 2.420000 +103908 4.562000 +103909 1.443000 +103910 2.865000 +103911 4.572000 +103912 4.294000 +103913 3.572000 +103914 1.556000 +103915 2.785000 +103916 1.554000 +103917 2.369000 +103918 2.491000 +103919 2.298000 +103920 1.433000 +103921 2.023000 +103922 4.806000 +103923 4.190000 +103924 5.020000 +103926 2.419000 +103927 3.184000 +103928 2.838000 +103930 4.626000 +103933 4.758000 +103935 4.956000 +103984 4.726000 +103990 2.459000 +103993 5.020000 +103995 4.918000 +104026 0.688000 +104027 0.892000 +104028 1.723800 +104029 1.745400 +104030 1.707400 +104031 1.713800 +104032 1.711800 +104064 2.454500 +104068 5.556500 +104075 2.060500 +104077 4.820500 +104078 4.660500 +104079 4.454500 +104080 2.152500 +104081 4.596500 +104084 5.008500 +104089 2.894500 +104099 2.014000 +104101 2.033000 +104115 4.258000 +104123 4.452000 +104127 5.325000 +104131 4.734000 +104135 4.770000 +104146 4.868000 +104148 4.694000 +104149 4.798000 +104150 4.778000 +104151 4.744000 +104152 4.758000 +104153 4.756000 +104154 4.734000 +104155 4.710000 +104156 4.784000 +104157 4.754000 +104160 4.670000 +104161 4.704000 +104162 4.736000 +104167 4.776000 +104169 3.476000 +104172 2.645000 +104175 3.122000 +104178 2.526000 +104179 4.406000 +104180 4.800000 +104182 3.624000 +104184 5.705000 +104192 5.805000 +104198 6.360000 +104202 6.764000 +104204 6.700000 +104206 4.866000 +104210 5.287500 +104213 4.410500 +104214 4.986500 +104215 3.428500 +104217 3.150500 +104227 5.302500 +104228 0.924500 +104234 5.274500 +104239 5.472500 +104240 5.310500 +104252 1.714000 +104253 1.152000 +104255 1.542000 +104257 6.550000 +104258 6.558000 +104259 6.552000 +104261 7.815000 +104262 7.875000 +104263 7.925000 +104264 7.875000 +104265 7.955000 +104266 7.960000 +104268 3.806000 +104269 7.920000 +104270 7.890000 +104271 7.880000 +104272 2.240000 +104273 7.880000 +104274 7.915000 +104276 8.020000 +104289 3.532000 +104290 4.836000 +104307 5.265000 +104308 5.340000 +104309 5.320000 +104311 5.280000 +104312 5.355000 +104313 0.918000 +104315 5.315000 +104316 0.946000 +104317 5.285000 +104318 5.305000 +104319 5.315000 +104321 2.876000 +104322 2.984000 +104323 5.285000 +104324 5.280000 +104325 5.305000 +104327 5.010000 +104328 5.335000 +104329 5.285000 +104330 3.024000 +104331 3.060000 +104332 5.305000 +104333 5.280000 +104334 5.285000 +104335 5.285000 +104336 5.275000 +104337 4.340000 +104338 3.140000 +104340 4.496000 +104763 0.628000 +104765 0.726000 +104767 5.195000 +104768 4.022000 +104774 5.380000 +104775 5.355000 +104776 5.335000 +104777 4.586000 +104779 5.320000 +104780 5.375000 +104781 5.370000 +104782 5.330000 +104783 5.370000 +104784 5.360000 +104785 5.345000 +104786 5.375000 +104787 5.335000 +104788 5.350000 +104789 5.380000 +104790 5.320000 +104818 1.075000 +104820 3.192000 +104821 3.522000 +104822 5.385000 +104823 4.162000 +104824 4.412000 +104825 4.306000 +104826 4.322000 +104827 5.280000 +104828 1.817000 +104829 5.280000 +104830 5.170000 +104831 5.315000 +104833 4.464000 +104834 5.350000 +104842 5.305000 +104843 5.340000 +104845 5.095000 +104846 3.008000 +104847 5.365000 +104857 5.340000 +104858 6.050000 +104859 1.112000 +104860 1.455000 +104867 1.456000 +104869 5.410000 +104870 5.405000 +104871 5.385000 +104872 5.455000 +104873 5.340000 +104874 5.405000 +104875 5.370000 +104885 4.266000 +104886 5.265000 +104892 5.245000 +104893 5.280000 +104895 5.265000 +104896 5.250000 +104897 5.260000 +104968 4.188000 +104970 3.896000 +104971 3.838000 +104972 3.850000 +104973 3.796000 +104974 3.914000 +104975 3.706000 +104976 3.680000 +105008 3.260000 +105009 3.280000 +105017 1.637000 +105018 4.442000 +105019 4.462000 +105020 4.430000 +105021 1.029000 +105022 0.989000 +105023 3.936000 +105024 4.132000 +105027 4.100000 +105029 0.900000 +105030 1.180000 +105031 4.174000 +105068 1.264000 +105072 5.324000 +105073 5.230000 +105074 4.168000 +105075 3.402000 +105076 3.306000 +105077 4.368000 +105078 3.432000 +105079 5.366000 +105083 4.240000 +105119 5.010000 +105120 4.806000 +105121 4.622000 +105122 4.920000 +105123 4.638000 +105124 1.597000 +105126 2.160000 +105127 2.033000 +105128 4.798000 +105129 5.030000 +105137 5.380000 +105138 5.360000 +105139 5.340000 +105140 5.345000 +105141 5.360000 +105142 5.330000 +105143 5.325000 +105144 5.405000 +105145 5.350000 +105146 5.355000 +105147 5.295000 +105148 5.325000 +105149 5.385000 +105150 5.330000 +105151 5.310000 +105152 5.390000 +105153 5.405000 +105154 5.295000 +105155 5.330000 +105156 5.395000 +105157 5.325000 +105158 5.325000 +105159 5.360000 +105186 4.132000 +105187 5.405000 +105188 5.415000 +105189 5.410000 +105190 5.315000 +105191 5.435000 +105192 5.365000 +105193 5.410000 +105194 5.420000 +105195 5.435000 +105196 5.430000 +105197 0.980000 +105198 3.924000 +105199 4.390000 +105200 4.384000 +105202 5.350000 +105203 5.180000 +105204 5.325000 +105205 5.340000 +105206 3.610000 +105207 3.492000 +105208 5.370000 +105209 5.330000 +105210 5.370000 +105211 5.320000 +105212 5.315000 +105213 5.330000 +105214 4.965000 +105218 5.180000 +105219 4.796000 +105222 2.060000 +105223 2.908000 +105224 3.048000 +105225 0.560000 +105226 1.729000 +105231 1.636000 +105232 1.660000 +105233 1.233000 +105234 1.170000 +105235 1.508000 +105236 1.509000 +105237 1.518000 +105238 1.572000 +105239 1.749000 +105240 1.555000 +105241 1.160000 +105242 1.818000 +105243 1.841000 +105244 1.180000 +105245 2.041000 +105247 5.380000 +105248 5.360000 +105249 5.350000 +105250 5.365000 +105251 5.305000 +105252 5.335000 +105253 5.370000 +105256 5.365000 +105257 5.325000 +105258 5.375000 +105259 5.355000 +105260 5.335000 +105261 5.300000 +105262 3.222000 +105263 5.375000 +105264 5.315000 +105268 4.348000 +105269 4.174000 +105270 1.193000 +105271 4.130000 +105273 4.082000 +105274 1.427000 +105276 4.232000 +105277 4.170000 +105278 4.434000 +105279 4.364000 +105280 1.176000 +105281 1.221000 +105282 4.376000 +105283 1.423000 +105284 1.073000 +105285 4.142000 +105286 4.398000 +105287 1.407000 +105288 1.216000 +105289 4.430000 +105290 4.462000 +105291 1.066000 +105292 1.161000 +105294 2.763000 +105295 5.210000 +105296 4.288000 +105297 5.340000 +105298 2.306000 +105299 1.654000 +105300 4.118000 +105301 5.425000 +105302 5.345000 +105303 5.390000 +105305 5.340000 +105306 2.693000 +105307 0.698000 +105308 5.330000 +105309 0.708000 +105310 1.081000 +105311 5.390000 +105312 3.536000 +105313 0.944000 +105314 1.041000 +105315 3.530000 +105316 2.577000 +105317 5.360000 +105318 4.286000 +105322 5.375000 +105325 3.542000 +105326 3.974000 +105337 5.915000 +105338 5.935000 +105339 6.315000 +105341 5.390000 +105361 5.035000 +105362 5.100000 +105363 5.100000 +105365 2.789000 +105366 5.055000 +105367 5.065000 +105368 4.995000 +105369 5.675000 +105372 4.414000 +105374 2.571000 +105375 5.230000 +105376 1.444000 +105377 4.292000 +105378 4.820000 +105379 5.045000 +105380 1.628000 +105381 1.650000 +105382 1.683000 +105383 1.447000 +105384 5.050000 +105385 5.070000 +105386 1.430000 +105387 1.433000 +105388 5.060000 +105389 2.062000 +105390 5.130000 +105391 5.050000 +105392 4.842000 +105393 5.050000 +105394 5.040000 +105395 4.935000 +105396 5.360000 +105397 5.335000 +105398 1.360000 +105419 5.045000 +105424 2.665000 +105425 2.656000 +105426 2.663000 +105429 5.400000 +105432 5.400000 +105434 5.340000 +105435 5.370000 +105436 5.350000 +105448 0.920000 +105450 0.822000 +105452 4.818000 +105454 4.772000 +105456 4.556000 +105457 4.568000 +105458 4.812000 +105460 4.852000 +105461 4.606000 +105462 4.950000 +105476 2.073000 +105477 1.980000 +105478 1.830000 +105479 1.951000 +105480 2.017000 +105482 2.021000 +105485 1.842000 +105486 1.878000 +105489 1.600000 +105490 2.029000 +105491 1.733000 +105493 1.961000 +105494 2.002000 +105497 5.325000 +105498 5.345000 +105499 5.845000 +105500 5.855000 +105502 5.805000 +105503 5.855000 +105504 5.835000 +105505 5.810000 +105506 5.815000 +105507 5.840000 +105508 5.875000 +105509 5.815000 +105510 5.855000 +105511 3.484000 +105512 5.845000 +105513 5.870000 +105514 5.820000 +105515 5.820000 +105520 5.300000 +105521 3.304000 +105522 3.670000 +105523 3.150000 +105524 5.240000 +105527 3.216000 +105528 3.442000 +105529 3.502000 +105530 3.436000 +105531 3.402000 +105532 3.376000 +105533 5.275000 +105534 5.300000 +105535 5.310000 +105536 5.340000 +105537 5.095000 +105538 5.095000 +105539 5.350000 +105540 5.095000 +105541 5.295000 +105542 5.095000 +105543 5.105000 +105544 5.100000 +105545 5.100000 +105546 5.280000 +105547 5.325000 +105548 5.110000 +105549 5.110000 +105550 4.716000 +105551 5.320000 +105552 5.115000 +105553 5.335000 +105554 4.628000 +105555 3.426000 +105556 3.654000 +105560 3.294000 +105563 3.130000 +105568 3.314000 +105575 1.578000 +105580 1.996000 +105583 1.795000 +105587 1.894000 +105589 1.518000 +105590 1.440000 +105592 2.017000 +105593 1.452000 +105596 1.937000 +105608 4.394000 +105614 5.370000 +105615 5.315000 +105616 3.028000 +105617 3.168000 +105618 5.365000 +105619 3.948000 +105621 3.712000 +105625 5.440000 +105626 4.500000 +105627 4.548000 +105629 4.008000 +105630 3.882000 +105634 2.857000 +105636 6.085000 +105637 6.520000 +105638 3.048000 +105639 6.530000 +105640 1.017000 +105641 1.620000 +105642 6.530000 +105643 6.530000 +105644 6.525000 +105645 6.530000 +105646 6.525000 +105647 6.530000 +105648 6.525000 +105649 6.525000 +105650 6.525000 +105651 6.505000 +105652 6.530000 +105653 6.525000 +105654 6.525000 +105658 6.520000 +105667 5.410000 +105749 1.561000 +105750 3.568000 +105753 0.874000 +105754 4.092000 +105770 5.050000 +105773 5.360000 +105774 5.345000 +105775 5.320000 +105776 5.375000 +105777 5.340000 +105778 3.948000 +105779 3.952000 +105780 4.026000 +105781 3.912000 +105782 3.746000 +105783 3.246000 +105784 5.150000 +105785 5.270000 +105786 2.400000 +105787 4.002000 +105788 5.320000 +105789 4.728000 +105790 4.990000 +105791 5.055000 +105792 4.868000 +105793 5.175000 +105795 5.180000 +105796 5.015000 +105797 5.020000 +105798 5.045000 +105799 5.025000 +105800 5.025000 +105801 5.050000 +105802 4.822000 +105803 5.130000 +105804 4.688000 +105821 4.945000 +105829 5.035000 +105830 3.542000 +105836 5.400000 +105837 5.030000 +105840 4.905000 +105841 4.608000 +105842 0.966000 +105843 0.958000 +105844 4.592000 +105847 4.975000 +105848 4.058000 +105849 4.930000 +105850 1.831000 +105851 4.905000 +105852 4.955000 +105853 4.950000 +105854 5.000000 +105855 4.062000 +105856 4.980000 +105857 5.000000 +105858 4.955000 +105859 4.624000 +105860 4.945000 +105861 4.945000 +105864 2.398000 +105866 2.162000 +105867 2.155000 +105870 1.905000 +105871 2.311000 +105875 2.350000 +105876 2.366000 +105877 5.125000 +105885 2.805000 +105892 4.710000 +105896 4.590000 +105897 1.966000 +105899 5.290000 +105900 4.990000 +105901 4.955000 +105902 2.095000 +105903 5.275000 +105904 4.995000 +105905 3.442000 +105906 5.045000 +105910 2.445000 +105911 4.784000 +105915 1.725000 +105917 2.057000 +105920 1.518000 +105921 4.780000 +105922 2.161000 +105924 1.517000 +105925 1.851000 +105926 3.726000 +105927 2.001000 +105928 1.957000 +105929 4.310000 +105930 4.156000 +105931 5.240000 +105932 1.867000 +105937 2.371000 +105939 2.398000 +105940 2.247000 +105941 3.796000 +105943 4.340000 +105945 2.351000 +105946 3.748000 +105948 2.057000 +105949 2.116000 +105950 2.266000 +105951 1.969000 +105952 2.171000 +105953 2.169000 +105954 2.868000 +105955 0.778000 +105961 1.635000 +105962 0.660000 +105963 4.508000 +105967 1.643000 +105968 1.105000 +105970 1.354000 +105972 3.978000 +105973 3.132000 +105977 2.787000 +105978 2.579000 +105980 2.507000 +105989 3.912000 +105990 1.377000 +105991 1.538000 +105993 5.325000 +105994 5.405000 +105995 2.050000 +105996 1.775000 +105997 4.516000 +105999 5.345000 +106000 5.425000 +106002 5.380000 +106003 5.395000 +106004 5.365000 +106005 4.430000 +106006 5.335000 +106007 5.330000 +106008 5.425000 +106009 5.400000 +106010 5.320000 +106011 5.390000 +106012 5.350000 +106013 5.370000 +106014 5.395000 +106015 5.365000 +106018 5.350000 +106019 4.920000 +106020 4.866000 +106021 4.824000 +106022 5.345000 +106024 3.820000 +106025 3.800000 +106026 5.350000 +106028 4.838000 +106029 4.680000 +106030 3.506000 +106031 4.780000 +106032 4.162000 +106033 3.772000 +106034 4.738000 +106035 4.750000 +106036 3.156000 +106037 4.774000 +106038 4.812000 +106039 4.672000 +106040 1.500000 +106041 4.724000 +106047 4.848000 +106050 4.884000 +106051 1.298000 +106052 4.612000 +106053 4.646000 +106055 4.824000 +106056 4.748000 +106057 5.055000 +106058 4.990000 +106059 5.260000 +106060 5.230000 +106062 5.010000 +106064 5.010000 +106066 5.020000 +106069 5.335000 +106070 2.352000 +106072 2.201000 +106075 1.353000 +106081 1.705000 +106087 5.490000 +106088 5.515000 +106089 1.156000 +106090 5.010000 +106100 3.784000 +106120 3.774000 +106125 3.930000 +106137 3.430000 +106141 3.414000 +106148 2.688000 +106151 2.269000 +106176 1.883000 +106178 1.716000 +106179 2.033000 +106180 4.248000 +106181 4.214000 +106182 1.856000 +106183 4.142000 +106184 1.719000 +106185 4.180000 +106189 1.748000 +106193 1.960000 +106198 0.534000 +106199 0.950000 +106200 4.885000 +106201 4.580000 +106205 1.176000 +106209 5.130000 +106210 5.095000 +106211 5.135000 +106212 5.135000 +106213 5.135000 +106214 5.085000 +106215 5.130000 +106217 5.160000 +106226 3.100000 +106227 3.228000 +106228 2.888000 +106229 6.175000 +106230 4.745000 +106231 4.438000 +106232 4.332000 +106233 2.922000 +106234 2.508000 +106236 3.777000 +106237 2.248000 +106238 5.700000 +106239 4.486000 +106241 6.145000 +106242 3.195000 +106243 6.120000 +106244 6.095000 +106245 4.224000 +106246 4.216000 +106247 6.120000 +106248 4.336000 +106250 0.984000 +106280 5.320000 +106281 3.804000 +106282 3.275000 +106283 4.250000 +106284 4.925000 +106290 5.380000 +106298 5.355000 +106305 4.408000 +106317 3.588000 +106319 3.624000 +106320 4.119000 +106324 3.892000 +106325 4.086000 +106326 4.057000 +106327 4.073000 +106328 4.045000 +106329 4.075000 +106330 4.068000 +106333 5.350000 +106334 5.290000 +106335 6.300000 +106336 6.245000 +106337 6.255000 +106338 1.062000 +106339 6.190000 +106340 3.719000 +106341 4.306000 +106373 1.743200 +106374 1.708200 +106375 1.708200 +106376 1.710600 +106378 1.714200 +106379 1.707600 +106445 5.010000 +106446 4.915000 +106449 3.256000 +106451 5.305000 +106452 5.295000 +106453 4.646000 +106454 5.095000 +106455 5.355000 +106456 5.370000 +106460 5.325000 +106463 5.340000 +106464 4.524000 +106466 5.330000 +106467 5.360000 +106468 5.370000 +106497 4.458000 +106500 5.365000 +106501 5.385000 +106507 5.325000 +106508 5.330000 +106519 4.444000 +106524 2.166000 +106525 1.384000 +106526 1.264000 +106528 2.607000 +106532 4.340000 +106535 2.114000 +106536 2.362000 +106538 2.506000 +106540 2.610000 +106541 1.332000 +106542 1.310000 +106543 1.328000 +106544 2.534000 +106545 2.234000 +106553 1.382000 +106566 4.001000 +106576 0.818000 +106579 1.646000 +106580 4.118000 +106581 4.600000 +106587 4.735000 +106590 0.992000 +106594 2.835000 +106600 1.302000 +106601 1.916000 +106603 1.284000 +106606 1.670000 +106607 3.959000 +106611 3.979000 +106613 2.743000 +106615 2.370000 +106616 2.986000 +106618 2.947000 +106619 4.151000 +106622 2.985000 +106623 3.207000 +106624 3.123000 +106625 3.199000 +106626 2.773000 +106627 3.144000 +106628 2.775000 +106629 3.215000 +106630 3.352000 +106631 2.768000 +106632 2.663000 +106633 2.883000 +106634 3.267000 +106635 2.548000 +106636 4.050000 +106637 4.894000 +106639 3.336000 +106640 4.932000 +106641 3.474000 +106642 5.290000 +106643 5.310000 +106644 5.254000 +106645 5.295000 +106646 5.310000 +106647 4.064000 +106648 2.553000 +106650 3.694000 +106651 3.281000 +106653 3.603000 +106655 2.898000 +106656 3.990000 +106657 3.751000 +106658 3.497000 +106659 5.315000 +106660 5.310000 +106661 5.262000 +106663 5.320000 +106666 1.126000 +106667 1.176000 +106668 1.448000 +106669 1.446000 +106670 1.514000 +106671 4.382000 +106672 1.352000 +106673 1.518000 +106674 3.966000 +106675 2.012000 +106677 4.616000 +106678 4.244000 +106679 4.210000 +106682 2.582000 +106688 3.113000 +106689 3.056000 +106690 1.216000 +106699 3.944000 +106702 1.648000 +106716 3.580000 +106717 1.170000 +106721 1.552000 +106722 4.828000 +106723 1.940000 +106727 1.980000 +106729 1.594000 +106730 1.678000 +106731 4.882000 +106734 1.642000 +106738 2.865000 +106741 4.251000 +106760 2.110000 +106761 5.100000 +106768 5.202000 +106777 0.708000 +106778 5.200000 +106779 5.300000 +106784 5.282000 +106785 2.486000 +106821 4.718000 +106822 4.970000 +106823 4.898000 +106824 4.788000 +106825 4.976000 +106826 4.844000 +106827 4.936000 +106828 4.898000 +106829 4.834000 +106830 4.846000 +106831 4.842000 +106832 4.828000 +106833 4.782000 +106834 4.788000 +106835 4.788000 +106836 4.770000 +106837 4.796000 +106838 4.706000 +106839 4.800000 +106840 4.812000 +106842 1.494000 +106843 1.408000 +106844 4.816000 +106851 2.347000 +106853 2.158000 +106855 4.254000 +106859 3.484000 +106861 3.564000 +106862 2.939000 +106863 5.160000 +106864 3.011000 +106865 3.812000 +106866 2.592000 +106867 4.006000 +106868 2.542000 +106869 2.328000 +106870 2.062000 +106871 0.594000 +106872 5.110000 +106881 1.197000 +106883 1.241000 +106886 5.330000 +106887 5.310000 +106892 5.020000 +106895 5.300000 +106898 5.278000 +106899 5.375000 +106901 4.592000 +106902 4.580000 +106904 4.660000 +106905 4.646000 +106906 1.530000 +106907 1.785000 +106908 4.708000 +106911 1.734000 +106914 4.344000 +106917 4.866000 +106920 1.853000 +106922 2.012000 +106923 5.420000 +106924 1.964000 +106925 4.724000 +106926 4.356000 +106928 1.817000 +106937 5.180000 +106943 1.671000 +106944 4.350000 +106945 2.269000 +106948 1.762000 +106952 2.488000 +106953 1.746000 +106954 1.660000 +106956 4.414000 +106957 2.883000 +106961 5.236000 +106966 1.875000 +106978 5.325000 +106980 5.350000 +106981 5.305000 +106984 1.749000 +106985 1.924000 +106987 2.412000 +106990 5.360000 +106991 3.146000 +106994 1.863000 +106995 5.375000 +106996 5.365000 +106998 5.370000 +107000 5.355000 +107002 2.972000 +107091 0.986000 +107092 0.984000 +107106 1.287000 +107107 5.020000 +107111 5.300000 +107115 5.350000 +107125 4.920000 +107126 5.330000 +107130 1.105000 +107131 1.630000 +107142 3.354000 +107150 0.610000 +107151 0.780000 +107152 0.502000 +107153 0.804000 +107174 1.628000 +107178 1.522000 +107179 3.848000 +107181 3.862000 +107184 0.608000 +107185 0.592000 +107186 0.626000 +107189 0.774000 +107190 0.738000 +107192 2.181000 +107193 5.100000 +107194 3.188000 +107196 2.796000 +107198 1.460000 +107202 0.584000 +107203 5.050000 +107204 5.285000 +107206 2.135000 +107207 5.310000 +107209 2.747000 +107219 1.283000 +107227 1.634000 +107233 5.260000 +107234 3.345000 +107241 1.404000 +107246 1.391500 +107247 1.354500 +107250 1.323500 +107251 1.489500 +107257 1.778000 +107258 1.566000 +107259 1.545000 +107260 1.576000 +107263 2.136000 +107288 1.049000 +107289 5.190000 +107290 5.190000 +107292 4.646000 +107293 4.142000 +107294 4.040000 +107295 4.955000 +107298 5.195000 +107299 5.180000 +107300 3.226000 +107302 3.810000 +107303 5.100000 +107304 1.782000 +107305 5.165000 +107306 5.090000 +107313 5.010000 +107326 5.330000 +107329 5.310000 +107335 0.866000 +107338 1.220000 +107339 2.606000 +107340 4.330000 +107341 5.255000 +107342 3.900000 +107343 5.275000 +107344 5.235000 +107345 5.260000 +107346 1.011000 +107348 5.540000 +107349 5.540000 +107350 5.715000 +107351 5.530000 +107352 1.127000 +107353 5.620000 +107354 5.595000 +107355 1.726000 +107356 5.550000 +107357 5.600000 +107363 2.829000 +107365 3.870000 +107366 3.810000 +107367 5.325000 +107368 3.514000 +107369 5.270000 +107370 5.275000 +107371 4.882000 +107372 3.248000 +107373 3.766000 +107374 5.390000 +107375 5.980000 +107378 4.230000 +107381 4.364000 +107391 6.045000 +107394 5.870000 +107395 5.955000 +107396 6.040000 +107397 4.758000 +107398 3.102000 +107401 5.345000 +107402 5.315000 +107403 5.305000 +107404 5.295000 +107405 5.375000 +107407 4.220000 +107408 4.268000 +107409 4.216000 +107410 3.000000 +107411 4.820000 +107415 5.180000 +107417 5.150000 +107418 4.696000 +107419 4.905000 +107421 4.560000 +107422 3.912000 +107424 4.888000 +107425 4.716000 +107426 3.886000 +107427 4.150000 +107428 4.474000 +107430 1.726000 +107431 1.725000 +107435 3.604000 +107445 3.682000 +107448 3.658000 +107457 3.364000 +107460 3.440000 +107461 2.092000 +107462 2.606000 +107463 3.098000 +107464 4.072000 +107468 5.265000 +107472 3.792000 +107479 1.314000 +107481 7.115000 +107486 4.580000 +107498 3.448000 +107499 3.944000 +107500 3.888000 +107509 3.938000 +107513 0.688000 +107515 1.661000 +107516 4.150000 +107518 5.475000 +107520 5.490000 +107523 5.635000 +107526 5.410000 +107527 5.250000 +107528 5.300000 +107536 1.108000 +107543 3.914000 +107545 4.508000 +107558 5.315000 +107559 5.325000 +107561 5.325000 +107562 5.315000 +107564 5.435000 +107565 5.405000 +107566 5.455000 +107567 5.415000 +107578 5.395000 +107579 5.400000 +107580 5.390000 +107581 5.335000 +107582 5.375000 +107585 5.415000 +107587 5.425000 +107588 5.385000 +107589 5.385000 +107595 3.684000 +107596 2.379000 +107597 2.938000 +107598 5.320000 +107600 5.325000 +107604 0.950000 +107608 1.272000 +107611 2.900000 +107612 2.795000 +107613 1.217000 +107614 1.268000 +107615 1.304000 +107616 1.288000 +107617 1.328000 +107618 4.030000 +107619 2.803000 +107620 1.193000 +107621 1.460000 +107622 1.362000 +107623 1.725000 +107624 1.207000 +107625 2.242000 +107626 2.478000 +107627 2.217000 +107628 2.445000 +107631 0.780000 +107632 2.028000 +107633 4.064000 +107634 3.140000 +107635 3.054000 +107636 4.848000 +107637 4.054000 +107638 4.600000 +107639 4.804000 +107640 4.518000 +107641 3.554000 +107642 4.534000 +107643 4.594000 +107644 4.880000 +107645 3.696000 +107648 1.468000 +107649 4.384000 +107657 3.612000 +107658 2.818000 +107659 3.800000 +107660 3.650000 +107661 3.810000 +107662 2.884000 +107663 3.288000 +107664 1.104000 +107667 2.434000 +107668 2.541000 +107669 2.237000 +107670 2.819000 +107671 4.410000 +107672 3.410000 +107709 2.409000 +107710 1.237000 +107724 4.702000 +107728 4.674000 +107729 4.740000 +107730 4.756000 +107732 4.620000 +107733 4.668000 +107736 4.654000 +107751 0.876000 +107752 4.588000 +107753 2.360000 +107758 5.255000 +107760 5.165000 +107762 2.607000 +107765 3.035000 +107766 2.728000 +107779 0.918000 +107780 3.070000 +107781 5.305000 +107782 1.289000 +107784 4.836000 +107785 5.400000 +107787 5.330000 +107788 5.320000 +107789 5.525000 +107790 3.464000 +107791 2.414000 +107792 3.706000 +107793 3.832000 +107799 5.400000 +107800 5.390000 +107801 5.300000 +107802 5.365000 +107803 5.295000 +107804 5.365000 +107805 5.340000 +107806 4.290000 +107817 5.330000 +107818 5.375000 +107819 5.385000 +107820 5.345000 +107821 5.375000 +107822 5.355000 +107823 5.365000 +107824 5.325000 +107825 5.320000 +107826 5.280000 +107827 5.305000 +107828 5.285000 +107829 5.280000 +107830 5.300000 +107831 5.315000 +107832 5.315000 +107833 5.355000 +107834 5.310000 +107835 5.355000 +107836 5.330000 +107838 5.362000 +107840 4.105800 +107841 1.705800 +107843 5.402000 +107844 3.908600 +107845 5.342000 +107846 3.907800 +107847 3.906200 +107848 2.300000 +107850 2.156800 +107851 2.004600 +108695 0.880000 +108696 0.980000 +108698 0.624000 +108703 1.990000 +108721 2.354000 +108723 1.165000 +108724 1.415000 +108726 4.680000 +108732 3.222000 +108734 5.290000 +108735 5.345000 +108736 5.325000 +108748 5.365000 +108749 0.962000 +108751 4.086000 +108752 4.724000 +108755 5.295000 +108758 5.380000 +108760 5.375000 +108761 5.335000 +108762 5.300000 +108764 5.225000 +108766 4.864000 +108770 2.602000 +108771 5.295000 +108772 5.205000 +108773 2.062000 +108774 2.551000 +108776 5.355000 +108778 5.395000 +108784 0.582000 +108787 5.250000 +108788 5.165000 +108789 1.423000 +108790 1.480000 +108791 2.212000 +108792 2.109000 +108793 2.832000 +108794 2.813000 +108795 3.630000 +108796 3.658000 +108797 1.496000 +108798 1.561000 +108799 2.422000 +108800 2.613000 +108801 2.031000 +108802 4.158000 +108803 3.882000 +108804 3.598000 +108805 1.074000 +108811 4.684000 +108812 4.830000 +108813 4.920000 +108814 5.285000 +108815 5.310000 +108816 2.348000 +108818 5.390000 +108819 5.350000 +108820 5.370000 +108872 5.295000 +108874 5.185000 +108877 5.110000 +108880 5.420000 +108904 0.514000 +108907 4.202000 +108909 1.114000 +108911 4.562000 +108914 5.375000 +108948 0.932000 +108949 0.938000 +108950 0.686000 +108951 0.952000 +108952 3.694000 +108953 4.146000 +108954 5.345000 +108955 5.385000 +108956 5.370000 +108959 5.320000 +108960 5.380000 +108961 5.380000 +108962 5.385000 +108963 5.350000 +108964 5.415000 +108965 5.345000 +108966 5.345000 +108967 5.420000 +108968 5.365000 +108970 5.330000 +108971 5.350000 +108972 5.395000 +109014 3.600000 +109024 5.775000 +109025 5.790000 +109027 5.725000 +109032 3.462000 +109033 3.556000 +109034 3.484000 +109035 3.854000 +109036 3.908000 +109037 3.960000 +109038 3.938000 +109039 0.972000 +109040 1.331000 +109041 3.948000 +109042 3.916000 +109043 3.886000 +109045 3.790000 +109049 1.541000 +109051 3.794000 +109052 3.714000 +109053 3.664000 +109055 3.678000 +109057 3.178000 +109059 2.946000 +109061 1.254000 +109063 5.455000 +109064 4.626000 +109065 3.088000 +109066 2.088000 +109067 2.498000 +109068 4.202000 +109069 4.492000 +109070 5.325000 +109071 4.995000 +109072 5.445000 +109073 5.320000 +109074 5.430000 +109075 5.400000 +109087 0.890000 +109088 0.804000 +109090 5.365000 +109091 5.355000 +109093 5.395000 +109095 5.415000 +109096 5.385000 +109097 5.350000 +109098 4.874000 +109102 1.739000 +109105 0.896000 +109106 2.367000 +109118 0.950000 +109120 0.838000 +109129 1.474000 +109131 5.350000 +109140 2.639000 +109160 5.960000 +109165 1.788000 +109166 1.943000 +109167 1.604000 +109168 2.180000 +109169 1.521000 +109170 1.864000 +109171 1.667000 +109173 2.291000 +109174 1.644000 +109175 1.977000 +109176 1.953000 +109177 1.528000 +109179 3.350000 +109180 2.005000 +109181 3.020000 +109182 4.126000 +109184 2.135000 +109185 0.996000 +109186 0.978000 +109187 0.978000 +109188 1.052000 +109189 1.042000 +109193 1.740000 +109214 0.542000 +109215 5.360000 +109216 5.420000 +109218 6.050000 +109227 5.645000 +109239 3.570000 +109240 3.420000 +109243 2.767000 +109248 3.470000 +109249 1.906000 +109250 2.372000 +109251 1.700000 +109252 3.090000 +109253 2.339000 +109254 2.882000 +109255 3.170000 +109259 2.940000 +109260 2.437000 +109261 2.925000 +109263 2.747000 +109265 3.045000 +109266 2.799000 +109267 3.255000 +109268 3.250000 +109286 5.335000 +109288 5.355000 +109289 5.435000 +109310 5.080000 +109311 5.300000 +109312 2.842000 +109313 5.260000 +109481 0.720000 +109482 1.172000 +109483 0.804000 +109485 1.968000 +109487 5.256000 +109488 2.902000 +109489 5.328000 +109492 5.366000 +109493 5.386000 +109494 5.390000 +109500 4.968000 +109501 5.318000 +109502 3.744000 +109503 5.382000 +109504 5.340000 +109505 5.360000 +109506 4.298000 +109507 5.356000 +109508 5.334000 +109509 5.334000 +109510 5.322000 +109511 5.344000 +109512 0.688000 +109513 5.372000 +109514 5.378000 +109515 5.352000 +109516 5.376000 +109517 5.318000 +109518 5.372000 +109519 5.384000 +109520 5.374000 +109521 5.342000 +109524 5.368000 +109525 5.348000 +109530 4.734000 +109531 4.798000 +109532 4.736000 +109534 4.576000 +109535 3.676000 +109536 4.820000 +109537 4.734000 +109538 4.194000 +109539 4.026000 +109540 4.612000 +109541 3.940000 +109542 0.934000 +109543 1.024000 +109544 1.011000 +109545 2.001000 +109546 1.420000 +109548 1.478000 +109549 1.316000 +109550 2.051000 +109553 2.544000 +109556 2.560000 +109558 2.151000 +109559 2.700000 +109562 5.310000 +109563 5.390000 +109564 0.578000 +109572 4.930000 +109576 3.444000 +109584 3.272000 +109601 2.840000 +109607 3.322000 +109610 3.078000 +109612 3.656000 +109617 3.466000 +109626 2.688000 +109627 1.738000 +109671 4.920000 +109674 4.470000 +109675 1.694000 +109676 1.778000 +109677 5.065000 +109678 5.270000 +109679 5.450000 +109680 5.375000 +109681 5.405000 +109682 5.400000 +109683 2.334000 +109686 5.125000 +109687 5.085000 +109688 5.385000 +109689 5.430000 +109690 5.415000 +109691 5.385000 +109692 5.330000 +109693 5.365000 +109703 1.679000 +109704 5.300000 +109705 3.404000 +109706 1.261000 +109707 1.605000 +109708 2.040000 +109709 2.021000 +109710 3.172000 +109711 1.358000 +109712 5.275000 +109713 5.195000 +109715 3.564000 +109716 3.056000 +109717 3.108000 +109718 3.028000 +109719 2.994000 +109720 1.282000 +109722 3.356000 +109723 4.400000 +109724 2.168000 +109725 1.611000 +109726 3.652000 +109727 5.325000 +109728 3.146000 +109729 3.198000 +109731 3.212000 +109732 2.591000 +109733 3.096000 +109737 0.752000 +109740 2.507000 +109747 4.356000 +109748 3.756000 +109749 3.608000 +109775 1.583000 +109780 5.300000 +109781 5.345000 +109786 5.335000 +109787 5.320000 +109788 5.355000 +109791 5.315000 +109793 5.310000 +109795 5.270000 +109796 5.340000 +109797 5.220000 +109798 5.330000 +109799 5.295000 +109800 5.310000 +109801 1.051000 +109802 0.880000 +109803 0.566000 +109804 0.578000 +109806 2.080000 +109807 4.220000 +109831 0.686000 +109832 1.152000 +109833 1.162000 +109836 0.914000 +109837 5.325000 +109838 1.963000 +109839 5.330000 +109840 5.330000 +109841 5.285000 +109842 3.104000 +109843 0.942000 +109844 0.792000 +109845 0.686000 +109846 0.723000 +109847 0.931000 +109848 0.958000 +109849 0.681000 +109850 0.935000 +109851 0.836000 +109852 1.267000 +109853 1.100000 +109854 1.472000 +109855 1.299000 +109856 2.196000 +109857 0.870000 +109858 0.865000 +109859 0.862000 +109860 0.921000 +109861 1.258000 +109865 2.880000 +109873 2.374000 +109876 3.588000 +109879 3.080000 +109880 3.500000 +109882 3.528000 +109883 2.501000 +109886 2.348000 +109887 2.327000 +109888 2.280000 +109889 2.458000 +109893 1.838000 +109903 2.673000 +109910 2.872000 +109911 2.648000 +109914 2.932000 +109915 2.584000 +109916 2.162000 +109917 2.242000 +109918 3.184000 +109921 2.996000 +109924 2.788000 +109925 2.062000 +109926 1.970000 +109928 2.475000 +109936 3.554000 +109938 2.276000 +109940 2.908000 +109941 2.396000 +109943 2.922000 +109944 1.743000 +109968 2.450000 +109969 2.635000 +109970 1.661000 +109971 2.266000 +109973 1.648000 +109974 2.649000 +109975 2.616000 +109976 3.042000 +109977 1.220000 +109978 1.726000 +109979 4.472000 +109980 4.646000 +109985 2.068000 +109998 1.868000 +109999 1.620000 +110007 6.250000 +110014 0.698000 +110016 3.514000 +110028 0.942000 +110029 1.144000 +110031 1.015000 +110032 1.212000 +110033 0.847000 +110034 4.148000 +110036 2.630000 +110039 1.017000 +110041 5.770000 +110044 1.027000 +110045 1.056000 +110046 0.888000 +110047 1.060000 +110049 1.074000 +110050 1.000000 +110053 0.991000 +110054 1.073000 +110055 0.989000 +110060 3.404000 +110061 3.146000 +110065 3.894000 +110066 3.888000 +110067 1.668000 +110073 3.920000 +110078 2.869000 +110079 2.932000 +110083 2.862000 +110084 3.388000 +110085 1.291000 +110086 3.064000 +110087 2.851000 +110088 2.835000 +110089 1.440000 +110090 2.930000 +110091 2.873000 +110095 2.735000 +110096 3.238000 +110097 3.624000 +110098 4.458000 +110100 2.691000 +110101 2.695000 +110105 2.118000 +110106 2.630000 +110107 2.759000 +110108 2.867000 +110109 2.791000 +110111 2.559000 +110112 2.788000 +110113 2.614000 +110114 2.992000 +110115 3.178000 +110116 3.294000 +110117 3.128000 +110118 3.000000 +110119 2.753000 +110120 3.140000 +110121 2.902000 +110122 3.072000 +110123 2.964000 +110127 3.392000 +110128 3.120000 +110129 3.382000 +110130 2.381000 +110131 2.313000 +110134 2.691000 +110135 3.252000 +110136 3.906000 +110137 3.112000 +110138 3.834000 +110139 3.886000 +110140 1.377000 +110141 3.362000 +110142 3.306000 +110146 6.090000 +110147 5.845000 +110148 5.990000 +110149 6.035000 +110150 5.995000 +110151 3.446000 +110152 5.960000 +110153 5.900000 +110154 4.284000 +110156 5.520000 +110164 2.774000 +110165 5.350000 +110166 5.335000 +110167 5.320000 +110168 5.375000 +110169 5.360000 +110173 3.650000 +110174 4.692000 +110175 4.860000 +110179 5.775000 +110180 5.810000 +110181 5.785000 +110182 5.720000 +110189 5.840000 +110190 5.810000 +110191 5.745000 +110192 5.765000 +110193 5.720000 +110194 5.815000 +110195 5.820000 +110206 3.962000 +110208 1.773400 +110209 1.756800 +110210 1.716200 +110211 1.767000 +110212 3.860000 +110213 1.746000 +110214 1.745600 +110215 1.721600 +110216 1.739800 +110217 1.749600 +110218 2.160000 +110219 2.130000 +110221 2.130000 +110222 1.915000 +110225 2.520000 +110295 1.174000 +110296 5.375000 +110301 0.844000 +110303 0.872000 +110304 0.870000 +110373 3.684000 +110377 2.546000 +110384 6.295000 +110392 6.305000 +110393 2.510000 +110395 6.295000 +110396 6.320000 +110398 6.305000 +110405 6.310000 +110407 6.315000 +110413 1.744000 +110415 1.560000 +110417 1.964000 +110418 1.240000 +110420 1.206000 +110421 1.782000 +110422 2.584000 +110423 1.538000 +110424 1.465000 +110425 2.554000 +110426 2.792000 +110427 2.648000 +110429 2.582000 +110436 2.522000 +110438 2.606000 +110439 2.544000 +110440 2.568000 +110441 2.536000 +110459 5.370000 +110460 5.370000 +110461 5.360000 +110462 5.330000 +110463 0.777000 +110464 5.350000 +110465 5.330000 +110466 5.360000 +110467 5.310000 +110474 2.456000 +110475 2.802000 +110476 2.111000 +110477 2.790000 +110478 2.942000 +110479 2.054000 +110480 2.815000 +110481 3.398000 +110482 3.252000 +110483 3.242000 +110484 3.086000 +110485 2.869000 +110486 3.064000 +110487 2.168000 +110488 2.614000 +110490 0.766000 +110491 4.434000 +110492 5.475000 +110493 5.450000 +110494 5.440000 +110495 5.405000 +110496 5.440000 +110497 5.380000 +110498 5.410000 +110499 5.450000 +110500 5.370000 +110501 5.455000 +110502 5.395000 +110529 3.580000 +110530 3.504000 +110531 3.512000 +110532 3.478000 +110533 3.400000 +110534 3.298000 +110535 3.298000 +110536 2.813000 +110537 2.804000 +110538 4.945000 +110540 3.410000 +110541 2.068000 +110542 3.444000 +110543 3.446000 +110544 3.430000 +110546 3.302000 +110547 3.408000 +110548 3.304000 +110559 3.602000 +110561 2.510000 +110564 2.758000 +110571 2.755000 +110574 3.302000 +110575 3.280000 +110579 1.416000 +110585 3.204000 +110587 1.090000 +110604 3.460000 +110615 3.474000 +110623 1.663000 +110624 2.831000 +110625 2.535000 +110626 2.640000 +110627 2.785000 +110628 2.701000 +110629 2.687000 +110630 2.529000 +110631 2.731000 +110632 2.451000 +110633 2.495000 +110634 2.190000 +110635 2.309000 +110636 2.363000 +110637 2.009000 +110638 2.380000 +110639 2.954000 +110640 2.190000 +110641 2.719000 +110643 2.679000 +110644 2.598000 +110645 2.652000 +110648 2.481000 +110649 2.421000 +110650 2.529000 +110652 2.598000 +110654 1.989000 +110660 4.562000 +110661 5.360000 +110664 5.945000 +110669 8.030000 +110670 8.165000 +110671 8.160000 +110673 8.155000 +110675 4.540000 +110676 8.120000 +110682 1.920000 +110686 5.950000 +110687 5.915000 +110690 1.612000 +110691 8.045000 +110699 5.800000 +110700 5.115000 +110701 5.800000 +110702 5.785000 +110703 5.100000 +110704 5.285000 +110706 6.040000 +110707 6.010000 +110709 6.005000 +110710 4.290000 +110712 5.270000 +110715 2.750000 +110716 2.744000 +110717 5.395000 +110718 5.335000 +110719 5.315000 +110720 5.325000 +110723 5.365000 +110724 5.395000 +110725 5.385000 +110726 5.345000 +110727 5.395000 +110728 5.390000 +110729 5.355000 +110730 5.355000 +110731 5.330000 +110732 5.335000 +110733 5.360000 +110735 5.430000 +110736 5.430000 +110737 5.395000 +110738 1.085000 +110739 5.515000 +110740 5.510000 +110741 5.480000 +110744 5.365000 +110749 6.065000 +110752 5.960000 +110757 0.568000 +110764 6.245000 +110766 5.390000 +110767 5.380000 +110768 5.350000 +110772 4.604000 +110781 3.492000 +110782 3.498000 +110783 3.490000 +110784 3.434000 +110786 2.932000 +110788 1.142000 +110791 3.782000 +110793 1.742000 +110795 1.331000 +110796 1.345000 +110797 1.332000 +110798 3.524000 +110799 3.390000 +110800 3.428000 +110802 3.300000 +110803 2.389000 +110804 2.783000 +110805 2.761000 +110806 1.417000 +110807 2.321000 +110813 1.576000 +110814 2.702000 +110815 1.921000 +110816 4.204000 +110817 5.350000 +110819 5.320000 +110820 3.086000 +110823 5.380000 +110826 3.900000 +110827 3.828000 +110828 3.304000 +110829 4.404000 +110830 3.796000 +110831 2.625000 +110836 1.869000 +110839 5.310000 +110843 5.330000 +110869 1.757000 +110871 5.275000 +110877 4.340000 +110879 4.304000 +110884 6.025000 +110886 6.005000 +110893 1.728000 +110894 4.072000 +110895 5.955000 +110897 6.020000 +110898 5.975000 +110899 6.010000 +110901 5.610000 +110903 5.965000 +110904 5.955000 +110905 5.960000 +110908 1.208000 +110909 5.970000 +110910 4.102000 +110911 3.590000 +110912 5.985000 +110913 5.955000 +110914 6.005000 +110915 3.474000 +110916 4.632000 +111054 5.300000 +111055 5.355000 +111056 1.057000 +111057 0.680000 +111063 5.370000 +111064 5.380000 +111065 5.390000 +111066 5.400000 +111067 4.348000 +111070 5.340000 +111071 1.920000 +111073 5.350000 +111093 2.428000 +111094 2.308000 +111095 4.726000 +111096 4.824000 +111097 4.882000 +111098 4.915000 +111099 4.850000 +111100 4.920000 +111101 4.915000 +111102 4.800000 +111103 4.688000 +111104 4.730000 +111105 3.906000 +111106 4.792000 +111107 1.048000 +111108 2.504000 +111109 2.018000 +111110 2.537000 +111111 2.881000 +111112 3.012000 +111114 2.531000 +111115 2.579000 +111116 2.505000 +111117 2.421000 +111119 2.568000 +111120 3.372000 +111121 2.889000 +111122 2.811000 +111126 5.260000 +111127 5.330000 +111128 5.370000 +111129 5.345000 +111130 5.345000 +111131 4.895000 +111132 3.482000 +111133 3.742000 +111134 5.340000 +111135 3.282000 +111136 5.355000 +111137 5.106000 +111138 5.335000 +111140 5.345000 +111141 5.340000 +111142 5.350000 +111143 5.320000 +111144 3.386000 +111145 4.598000 +111148 3.482000 +111149 5.220000 +111150 0.878000 +111151 5.252000 +111152 5.202000 +111153 5.278000 +111154 4.934000 +111155 3.420000 +111156 5.252000 +111157 5.208000 +111189 3.278000 +111190 2.134000 +111192 2.451000 +111194 5.220000 +111204 5.108000 +111211 2.990000 +111213 2.463000 +111220 2.950000 +111225 5.070000 +111227 5.310000 +111230 5.485000 +111232 4.188000 +111233 5.030000 +111237 3.288000 +111239 4.198000 +111240 4.772000 +111241 5.262000 +111242 5.250000 +111243 5.335000 +111244 5.345000 +111245 5.375000 +111246 5.310000 +111247 5.315000 +111253 4.378000 +111254 4.508000 +111264 1.353000 +111265 0.888000 +111266 5.340000 +111267 5.380000 +111268 5.315000 +111269 5.360000 +111270 5.360000 +111272 5.430000 +111274 5.410000 +111275 5.350000 +111276 5.380000 +111277 5.400000 +111278 5.430000 +111279 5.395000 +111280 5.405000 +111281 5.360000 +111282 5.420000 +111288 5.330000 +111289 5.320000 +111290 5.370000 +111291 5.395000 +111293 5.425000 +111294 5.395000 +111321 5.242000 +111331 2.488000 +111336 6.190000 +111337 5.250000 +111338 6.985000 +111342 3.094000 +111343 3.560000 +111344 3.118000 +111345 3.506000 +111346 4.694000 +111348 6.200000 +111350 6.510000 +111351 4.512000 +111352 6.530000 +111353 4.740000 +111354 5.070000 +111355 2.042000 +111356 6.160000 +111358 6.585000 +111359 5.775000 +111360 7.030000 +111361 6.800000 +111363 3.862000 +111364 6.170000 +111366 7.035000 +111368 4.788000 +111369 4.790000 +111370 4.865000 +111376 2.370000 +111377 2.406000 +111380 2.264000 +111381 2.232000 +111382 2.030000 +111383 2.530000 +111384 2.762000 +111385 2.302000 +111386 2.184000 +111387 2.306000 +111388 2.350000 +111389 2.256000 +111390 2.346000 +111391 2.306000 +111392 2.300000 +112447 2.264000 +112449 3.656000 +112451 4.905000 +112464 1.375000 +112483 2.724000 +112484 1.111000 +112492 2.029000 +112493 1.041000 +112501 5.165000 +112521 1.195000 +112522 1.207000 +112523 1.104000 +112524 2.326000 +112525 1.286000 +112526 2.944000 +112527 2.876000 +112528 3.728000 +112529 4.138000 +112531 4.810000 +112533 4.570000 +112534 5.555000 +112535 5.565000 +112538 5.550000 +112539 0.632000 +112540 4.656000 +112541 4.672000 +112542 4.666000 +112543 1.222000 +112544 1.439000 +112545 1.397000 +112546 5.525000 +112547 4.416000 +112567 1.440000 +112568 0.998000 +112569 3.258000 +112570 3.630000 +112571 3.638000 +112572 4.754000 +112585 4.300000 +112586 3.742000 +112672 1.159000 +112673 3.322000 +112674 5.185000 +112675 0.760000 +112678 5.235000 +112679 0.770000 +112682 0.864000 +112683 3.438000 +112684 3.565000 +112686 5.160000 +112687 0.908000 +112688 0.560000 +112689 3.955000 +112690 3.905000 +112691 3.980000 +112692 4.980000 +112693 4.975000 +112759 3.880000 +112766 2.244000 +112767 2.996000 +112768 2.879000 +112769 3.182000 +112770 5.330000 +112771 4.905000 +112773 4.560000 +112774 4.690000 +112794 5.100000 +112795 4.260000 +112796 1.544000 +112798 5.390000 +112799 5.280000 +112800 5.375000 +112801 5.350000 +112802 3.386000 +112803 3.418000 +112804 3.230000 +112805 3.190000 +112806 3.210000 +112807 2.158000 +112808 5.360000 +112809 5.290000 +112811 5.320000 +112813 5.375000 +112816 2.798000 +112817 5.335000 +112819 5.385000 +112820 5.315000 +112821 5.325000 +112822 5.365000 +112823 5.305000 +112824 5.400000 +112825 1.092000 +112826 5.365000 +112870 1.278000 +112872 1.852000 +112883 2.956000 +112884 3.228000 +112885 2.496000 +112886 5.385000 +112887 5.280000 +112888 5.365000 +112889 5.295000 +112891 5.370000 +112892 5.370000 +112893 5.295000 +112980 1.084000 +112981 3.700000 +112982 5.285000 +112983 5.245000 +112984 5.230000 +112985 5.215000 +112986 5.395000 +112987 5.330000 +112988 5.335000 +112999 5.205000 +113002 5.295000 +113008 2.299000 +113009 1.223000 +113036 1.859000 +113047 5.265000 +113048 5.275000 +113057 4.084000 +113061 2.329000 +113062 3.226000 +113063 3.184000 +113079 1.057000 +113080 3.900000 +113081 5.330000 +113082 5.250000 +113083 2.724000 +113084 5.340000 +113085 5.345000 +113086 5.380000 +113087 0.798000 +113089 5.340000 +113090 5.365000 +113091 5.380000 +113094 1.530000 +113096 3.506000 +113097 3.998000 +113098 4.100000 +113099 4.162000 +113100 4.340000 +113101 4.316000 +113102 4.512000 +113103 4.554000 +113104 4.960000 +113105 2.006000 +113106 3.232000 +113128 2.665000 +113134 4.502000 +113135 3.820000 +113136 1.503000 +113137 1.293000 +113145 0.782000 +113149 4.158000 +113156 2.851000 +113159 4.720000 +113162 3.338000 +113171 1.409000 +113173 5.300000 +113176 5.405000 +113201 3.028000 +113202 5.145000 +113203 5.315000 +113204 5.280000 +113205 5.340000 +113206 5.330000 +113207 5.300000 +113208 5.360000 +113215 5.150000 +113216 5.195000 +113218 1.282000 +113219 0.958000 +113220 4.738000 +113221 4.702000 +113223 4.702000 +113226 4.680000 +113228 4.925000 +113230 4.652000 +113231 4.758000 +113232 0.834000 +113233 4.592000 +113234 4.598000 +113235 4.646000 +113236 4.248000 +113237 4.066000 +113238 4.540000 +113239 4.090000 +113240 3.928000 +113241 4.126000 +113242 4.066000 +113243 4.384000 +113246 1.232000 +113248 0.560000 +113253 0.772000 +113255 4.452000 +113257 0.568000 +113258 0.546000 +113260 3.102000 +113261 2.239000 +113262 2.406000 +113263 1.767000 +113264 1.739000 +113265 1.400000 +113266 1.981000 +113267 1.567000 +113268 2.104000 +113269 3.134000 +113270 1.870000 +113271 1.761000 +113272 1.391000 +113273 1.366000 +113274 1.774000 +113275 1.115000 +113276 1.663000 +113305 0.862000 +113306 5.365000 +113307 5.390000 +113312 2.235000 +113313 2.904000 +113314 1.620000 +113315 1.850000 +113316 5.220000 +113317 4.342000 +113318 5.695000 +113319 4.346000 +113320 5.140000 +113322 2.278000 +113323 3.260000 +113325 5.285000 +113326 4.468000 +113327 4.444000 +113328 4.536000 +113329 4.586000 +113330 4.596000 +113331 4.580000 +113336 3.000000 +113337 2.023000 +113338 2.209000 +113339 1.434000 +113340 1.592000 +113341 1.624000 +113342 1.284000 +113343 2.062000 +113344 1.978000 +113345 2.055000 +113346 0.504000 +113347 0.704000 +113348 2.263000 +113349 1.908000 +113350 0.606000 +113351 1.573000 +113352 2.088000 +113353 0.606000 +113356 3.456000 +113360 4.504000 +113364 1.837000 +113461 5.305000 +113463 5.325000 +113465 5.320000 +113466 4.678000 +113467 0.792000 +113473 1.456000 +113474 2.498000 +113475 5.060000 +113476 4.940000 +113498 1.009000 +113503 1.481000 +113511 0.674000 +113521 1.352000 +113522 2.269000 +113523 4.764000 +113528 1.801000 +113529 4.468000 +113530 4.440000 +113531 1.635000 +113532 4.504000 +113533 4.518000 +113534 4.692000 +113535 4.620000 +113536 4.512000 +113537 4.538000 +113538 4.594000 +113539 4.558000 +113540 4.660000 +113545 3.685000 +113546 2.780000 +113547 3.370000 +113548 2.529500 +113549 3.085000 +113550 1.906000 +113551 2.780000 +113552 2.583500 +113553 2.599500 +113560 1.993000 +113570 1.251000 +113571 5.030000 +113629 4.874000 +113630 5.435000 +113631 5.410000 +113636 5.305000 +113637 5.395000 +113638 5.400000 +113640 5.415000 +113641 2.701000 +113642 5.395000 +113643 5.395000 +113644 5.455000 +113645 5.470000 +113646 5.375000 +113647 5.410000 +113648 5.425000 +113649 2.013000 +113651 5.405000 +113655 4.878000 +113661 4.012000 +113665 5.770000 +113666 5.910000 +113671 5.485000 +113673 5.400000 +113674 5.410000 +113675 5.485000 +113676 5.475000 +113678 5.490000 +113679 5.480000 +113684 3.612000 +113691 3.474000 +113695 2.621000 +113696 2.685000 +113699 1.879000 +113700 3.558000 +113701 3.492000 +113703 3.462000 +113704 3.384000 +113705 3.452000 +113812 2.243000 +113813 5.390000 +113816 5.780000 +113818 5.115000 +113833 5.330000 +113837 5.320000 +113856 2.879000 +113858 5.405000 +113872 2.632000 +113873 4.076000 +113879 5.300000 +113880 5.295000 +113883 3.282000 +113884 5.360000 +113885 2.624000 +113891 1.479000 +113894 5.015000 +113896 5.235000 +113897 5.170000 +113900 1.548000 +113904 5.350000 +113906 5.640000 +113907 3.006000 +113908 5.905000 +113909 6.025000 +113913 6.230000 +113918 4.884000 +113920 5.325000 +113925 6.520000 +113926 6.525000 +113927 6.530000 +113929 4.915000 +113935 2.218000 +113936 2.123000 +113937 4.002000 +113938 3.954000 +113939 4.086000 +113940 4.014000 +113941 3.016000 +113943 4.795000 +113944 4.710000 +113945 3.600000 +113946 4.164000 +113947 4.260000 +113948 4.302000 +113949 4.332000 +113968 0.864000 +113969 1.589000 +113970 6.615000 +113971 3.430000 +113973 1.594000 +113980 6.595000 +113981 1.352000 +113984 2.980000 +113985 1.664000 +113986 1.495000 +113990 3.822000 +114003 4.298000 +114004 2.767000 +114005 4.905000 +114006 3.342000 +114007 2.867000 +114008 3.030000 +114009 3.698000 +114010 2.594000 +114011 2.834000 +114012 1.781000 +114013 2.536000 +114014 2.673000 +114015 3.138000 +114016 2.912000 +114017 4.410000 +114018 3.310000 +114023 4.685000 +114024 2.994000 +114027 1.720000 +114028 3.200000 +114039 5.300000 +114048 5.295000 +114052 2.833000 +114065 5.305000 +114079 4.545000 +114080 4.550000 +114086 2.340000 +114088 4.374000 +114089 2.559000 +114090 4.530000 +114092 4.770000 +114093 4.445000 +114094 4.840000 +114095 4.388000 +114167 1.218000 +114169 1.274000 +114174 5.340000 +114182 1.395000 +114187 0.876000 +114188 0.662000 +114189 0.892000 +114190 0.902000 +114191 5.295000 +114192 0.508000 +114193 5.345000 +114198 2.104000 +114204 4.426000 +114207 5.360000 +114225 0.714000 +114227 5.310000 +114233 5.700000 +114234 5.620000 +114236 0.828000 +114239 5.480000 +114242 1.909000 +114243 1.872000 +114244 1.705000 +114245 1.461000 +114246 2.048000 +114247 2.073000 +114248 5.565000 +114250 3.212000 +114251 3.262000 +114252 3.364000 +114256 1.121000 +114257 5.080000 +114258 5.080000 +114259 5.380000 +114263 5.040000 +114306 1.062000 +114313 0.872000 +114314 1.147000 +114315 3.420000 +114319 1.994000 +114320 1.719000 +114321 2.172000 +114322 1.521000 +114324 1.585000 +114326 1.888000 +114327 1.908000 +114329 1.736000 +114330 1.971000 +114355 0.732000 +114357 0.948000 +114360 1.303000 +114361 2.694000 +114363 1.272000 +114364 2.765000 +114365 1.310000 +114366 3.540000 +114367 2.790000 +114368 2.752000 +114369 4.110000 +114370 0.624000 +114371 3.052000 +114394 4.284000 +114408 2.534000 +114417 4.206000 +114418 5.960000 +114419 1.844000 +114420 2.744000 +114421 0.768000 +114422 1.122000 +114429 2.058000 +114432 4.886000 +114434 4.454000 +114435 4.382000 +114438 2.142000 +114440 4.240000 +114445 4.134000 +114461 4.374000 +114462 4.710000 +114463 3.330000 +114464 4.502000 +114465 1.420000 +114466 2.559000 +114467 4.336000 +114468 4.366000 +114473 4.910000 +114474 4.838000 +114475 4.724000 +114476 4.744000 +114477 4.820000 +114478 4.812000 +114479 4.812000 +114480 4.748000 +114481 4.814000 +114482 5.215000 +114483 5.745000 +114484 4.774000 +114485 4.824000 +114486 4.610000 +114487 4.762000 +114488 4.786000 +114489 4.684000 +114490 4.772000 +114491 4.676000 +114494 5.770000 +114495 4.980000 +114510 4.320000 +114511 4.586000 +114513 4.500000 +114525 3.624000 +114526 3.720000 +114527 4.404000 +114528 4.270000 +114530 4.474000 +114536 2.295000 +114537 2.565000 +114538 1.844000 +114539 2.245000 +114540 3.620000 +114541 3.672000 +114548 0.874000 +114549 5.290000 +114550 5.305000 +114552 5.315000 +114553 5.355000 +114554 5.300000 +114555 5.330000 +114556 2.664000 +114557 5.180000 +114561 5.180000 +114562 3.592000 +114563 3.162000 +114564 3.252000 +114566 5.295000 +114567 5.290000 +114569 5.270000 +114570 5.285000 +114571 5.275000 +114572 5.345000 +114581 1.871000 +114582 2.258000 +114583 5.310000 +114584 2.517000 +114585 0.668000 +114599 2.550000 +114605 4.634000 +114606 5.055000 +114607 3.800000 +114608 5.055000 +114609 5.670000 +114610 5.590000 +114617 2.046000 +114618 1.952000 +114619 1.965000 +114621 1.969000 +114622 1.995000 +114623 2.115000 +114624 2.114000 +114626 5.885000 +114627 5.895000 +114628 1.985000 +114629 0.872000 +114630 2.264000 +114631 3.646000 +114632 2.596000 +114633 2.179000 +114634 3.976000 +114635 3.784000 +114636 5.910000 +114637 5.830000 +114638 3.624000 +114639 5.885000 +114640 4.006000 +114641 5.795000 +114642 5.965000 +114644 5.975000 +114645 5.875000 +114649 5.520000 +114650 6.045000 +114651 3.790000 +114652 4.472000 +114653 3.774000 +114654 4.398000 +114655 6.015000 +114656 4.985000 +114657 6.095000 +114658 3.786000 +114659 6.075000 +114660 6.030000 +114661 3.838000 +114662 5.465000 +114663 4.164000 +114664 3.734000 +114665 4.144000 +114666 1.429000 +114667 1.741000 +114669 5.370000 +114670 5.335000 +114671 5.335000 +114672 5.370000 +114673 5.395000 +114677 5.390000 +114682 5.550000 +114691 3.544000 +114695 4.688000 +114696 5.920000 +114697 5.850000 +114698 4.732000 +114702 3.522000 +114703 5.770000 +114704 4.274000 +114705 4.905000 +114707 5.095000 +114708 3.360000 +114712 4.174000 +114716 4.412000 +114717 3.812000 +114718 5.305000 +114719 1.722000 +114721 3.958000 +114723 3.858000 +114724 2.673000 +114725 2.743000 +114726 1.869000 +114727 1.794000 +114728 2.677000 +114729 5.415000 +114730 3.490000 +114731 1.785000 +114732 3.830000 +114735 3.096000 +114740 2.908000 +114741 4.276000 +114744 6.185000 +114746 6.190000 +114748 4.694000 +114770 1.314000 +114771 1.004000 +114772 0.772000 +114773 1.086000 +114774 5.290000 +114775 5.375000 +114776 0.700000 +114777 4.476000 +114778 0.526000 +114779 4.840000 +114782 4.975000 +114784 5.665000 +114785 5.035000 +114786 2.092000 +114787 2.243000 +114788 1.973000 +114789 4.300000 +114790 2.057000 +114791 4.895000 +114792 3.804000 +114793 4.392000 +114794 2.683000 +114795 4.754000 +114796 4.354000 +114797 5.850000 +114801 1.047000 +114803 4.164000 +114806 4.208000 +114813 4.262000 +114814 1.785000 +114815 1.850000 +114816 1.331000 +114819 1.584000 +114823 2.287000 +114825 1.790000 +114827 1.760000 +114828 2.030000 +114832 5.040000 +114833 5.290000 +114834 5.275000 +114835 5.270000 +114836 5.310000 +114837 5.265000 +114838 5.325000 +114839 5.310000 +114840 5.390000 +114843 5.325000 +114844 3.960000 +114846 5.275000 +114847 5.275000 +114849 5.245000 +114850 5.290000 +114851 5.385000 +114852 5.295000 +114853 5.290000 +114854 5.285000 +114855 5.280000 +114856 5.315000 +114857 5.345000 +114858 5.255000 +114859 5.380000 +114860 5.330000 +114862 5.390000 +114863 5.400000 +114864 5.390000 +114873 1.123000 +114874 3.092000 +114878 5.215000 +114879 5.225000 +114881 5.135000 +114882 5.320000 +114883 0.684000 +114885 0.542000 +114889 3.638000 +114890 3.666000 +114891 3.042000 +114892 5.210000 +114893 1.219000 +114895 1.108000 +114896 5.535000 +114897 4.418000 +114902 3.616000 +114912 4.382000 +114919 1.395000 +114920 5.045000 +114921 3.554000 +114928 1.781000 +114934 5.335000 +114936 4.270000 +114942 4.304000 +114944 3.934000 +114958 1.089000 +114959 1.444000 +114960 3.376000 +114961 0.668000 +114962 4.726000 +114963 4.440000 +114964 4.426000 +114965 4.386000 +114967 4.332000 +114970 1.791000 +114971 4.528000 +114973 3.112000 +114975 2.757000 +114976 3.120000 +114982 1.578000 +114983 5.815000 +114988 1.140000 +114991 3.626000 +114992 5.810000 +114994 1.065000 +114995 3.990000 +114997 5.910000 +114998 6.000000 +114999 5.515000 +115040 4.306000 +115041 4.548000 +115042 4.866000 +115043 5.510000 +115047 1.886000 +115050 5.020000 +115061 2.354000 +115069 4.100000 +115082 4.206000 +115084 3.384000 +115087 1.227000 +115089 3.904000 +115092 5.960000 +115093 5.525000 +115101 4.130000 +115109 0.746000 +115112 4.344000 +115113 6.005000 +115114 5.995000 +115122 5.300000 +115125 1.107000 +115126 5.350000 +115127 5.245000 +115128 5.245000 +115130 5.350000 +115131 5.450000 +115138 4.150000 +115154 3.176000 +115182 1.581000 +115183 2.799000 +115184 1.525000 +115185 2.725000 +115186 3.374000 +115187 3.518000 +115188 3.482000 +115189 1.336000 +115190 1.409000 +115196 3.492000 +115198 2.755000 +115201 3.494000 +115202 3.494000 +115228 5.025000 +115230 5.490000 +115231 5.200000 +115232 5.505000 +115233 5.450000 +115234 5.545000 +115235 5.550000 +115236 5.070000 +115237 5.500000 +115242 3.412000 +115243 2.898000 +115244 4.290000 +115245 2.958000 +115251 5.530000 +115252 1.192000 +115257 5.680000 +115260 4.634000 +115267 5.945000 +115268 5.130000 +115269 5.955000 +115270 4.486000 +115272 5.275000 +115276 5.355000 +115288 5.335000 +115289 5.300000 +115290 5.330000 +115291 5.330000 +115292 5.365000 +115294 5.360000 +115295 5.345000 +115297 5.360000 +115299 5.360000 +115313 2.392000 +115315 2.466000 +115323 2.156000 +115325 1.298000 +115331 3.526000 +115332 2.513000 +115333 1.530000 +115334 1.446000 +115339 1.015000 +115341 4.856000 +115344 5.005000 +115348 4.732000 +115350 4.710000 +115351 4.860000 +115352 5.550000 +115353 5.000000 +115373 1.135000 +115374 1.510000 +115377 1.521000 +115378 1.633000 +115379 2.066000 +115380 1.902000 +115381 1.557000 +115382 1.622000 +115383 1.474000 +115384 2.086000 +115385 1.427000 +115386 2.622000 +115387 1.937000 +115388 2.443000 +115389 2.225000 +115390 2.626000 +115391 2.586000 +115392 2.140000 +115393 2.009000 +115394 2.055000 +115395 1.999000 +115396 1.773000 +115398 1.721000 +115400 2.582000 +115401 2.711000 +115402 1.279000 +115405 4.108000 +115406 1.811000 +115408 2.683000 +115409 1.262000 +115413 5.280000 +115415 4.768000 +115416 4.572000 +115418 4.812000 +115419 4.794000 +115421 4.945000 +115422 4.302000 +115423 4.208000 +115426 4.874000 +115428 4.784000 +115429 4.768000 +115430 4.320000 +115431 5.235000 +115432 4.868000 +115433 1.295000 +115434 1.369000 +115435 1.081000 +115436 1.055000 +115437 1.000000 +115439 0.666000 +115440 2.835000 +115444 1.209000 +115452 5.865000 +115454 5.065000 +115456 5.340000 +115459 5.735000 +115462 5.695000 +115463 5.710000 +115466 6.050000 +115467 6.015000 +115470 5.725000 +115472 5.200000 +115476 4.980000 +115480 5.290000 +115484 5.270000 +115492 5.830000 +115493 5.840000 +115495 5.785000 +115498 4.130000 +115502 1.155000 +115503 2.130000 +115504 5.035000 +115505 4.790000 +115506 1.320000 +115507 4.600000 +115508 3.007600 +115509 3.011800 +115510 3.007800 +115512 3.007000 +115513 3.007600 +115514 3.008800 +115515 3.010200 +115516 3.009200 +115517 3.011400 +115518 3.011800 +115519 3.014200 +115520 3.008800 +115522 3.012400 +115523 3.007600 +115524 3.007400 +115525 3.015800 +115526 3.008600 +115527 3.007200 +115532 4.634000 +115533 4.690000 +115534 4.294000 +115535 5.775000 +115536 2.996000 +115537 5.790000 +115538 3.564000 +115539 4.560000 +115540 5.785000 +115542 5.760000 +115543 5.730000 +115544 3.274000 +115545 3.178000 +115546 5.705000 +115547 5.740000 +115548 5.750000 +115549 5.845000 +115550 1.891000 +115551 2.912000 +115553 5.710000 +115555 5.705000 +115556 5.695000 +115557 2.492000 +115558 4.945000 +115559 4.714000 +115561 4.520000 +115564 4.985000 +115565 4.910000 +115566 4.935000 +115581 4.524000 +115596 2.988000 +115604 2.155000 +115612 0.590000 +115613 2.056000 +115614 0.958000 +115615 0.995000 +115619 0.620000 +115622 0.704000 +115623 1.173000 +115624 1.160000 +115625 4.380000 +115626 1.427000 +115627 1.244000 +115628 4.138000 +115641 6.545000 +115642 6.545000 +115651 6.535000 +115656 6.525000 +115657 3.548000 +115659 6.535000 +115660 6.540000 +115665 4.422000 +115670 3.610000 +115673 3.754000 +115685 4.930000 +115686 3.026000 +115694 5.140000 +115695 3.734000 +115697 4.560000 +115784 0.528000 +115788 0.944000 +115790 0.924000 +115792 5.165000 +115795 0.886000 +115807 4.518000 +115813 0.572000 +115814 1.735000 +115821 5.085000 +115823 4.506000 +115828 4.520000 +115830 4.485000 +115831 5.165000 +115834 4.435000 +115838 1.504000 +115839 1.383000 +115840 4.858000 +115841 2.698000 +115842 2.943000 +115843 2.704000 +115844 2.992000 +115851 5.120000 +115852 5.235000 +115855 2.774000 +115856 3.310000 +115857 3.476000 +115858 1.619000 +115860 3.566000 +115862 5.275000 +115864 5.265000 +115865 4.635000 +115868 7.215000 +115869 1.409000 +115870 5.745000 +115871 4.180000 +115872 3.800000 +115873 2.638000 +115876 2.498000 +115877 3.210000 +115898 5.130000 +115899 6.395000 +115901 6.455000 +115902 6.080000 +115903 7.520000 +115904 7.520000 +115905 4.340000 +115906 4.152000 +115907 7.530000 +115911 5.125000 +115912 0.956000 +115916 1.000000 +115917 6.490000 +115918 6.120000 +115920 7.520000 +115922 7.525000 +115923 6.725000 +115924 7.570000 +115925 6.350000 +115926 7.580000 +115927 6.570000 +115928 5.590000 +115929 6.465000 +115930 5.545000 +115931 6.315000 +115932 7.600000 +115941 3.832000 +115943 5.270000 +115944 5.300000 +115945 5.120000 +115946 5.185000 +115950 5.280000 +115951 5.560000 +115958 5.420000 +115959 5.185000 +115965 0.804000 +115972 2.396000 +115973 4.492000 +115975 3.290000 +115976 4.950000 +115977 3.634000 +115980 6.650000 +115981 3.606000 +115983 6.565000 +115987 6.575000 +115988 4.198000 +115989 3.140000 +116005 1.792000 +116006 6.610000 +116007 6.525000 +116009 7.635000 +116010 7.595000 +116011 4.460000 +116012 7.635000 +116013 7.600000 +116014 7.545000 +116015 7.640000 +116016 7.610000 +116017 7.620000 +116018 7.665000 +116019 7.605000 +116020 7.615000 +116021 7.610000 +116022 7.640000 +116023 7.635000 +116024 4.895000 +116025 7.690000 +116026 1.070000 +116027 4.480000 +116028 7.635000 +116029 7.545000 +116030 7.195000 +116031 7.550000 +116032 7.540000 +116033 7.545000 +116034 4.686000 +116035 7.535000 +116036 4.452000 +116037 5.835000 +116043 2.058000 +116044 1.590000 +116045 2.556000 +116046 2.548000 +116047 1.576000 +116048 5.290000 +116049 4.586000 +116050 5.345000 +116051 5.365000 +116052 5.310000 +116053 5.265000 +116054 5.300000 +116063 1.142000 +116064 7.625000 +116065 7.595000 +116066 7.595000 +116067 7.595000 +116068 7.590000 +116069 7.595000 +116073 0.722000 +116074 1.610000 +116075 5.330000 +116076 5.300000 +116077 1.762000 +116078 5.370000 +116079 5.415000 +116088 2.054000 +116100 4.792000 +116114 0.670000 +116115 1.290000 +116116 0.664000 +116119 0.984000 +116122 1.457000 +116131 3.378000 +116133 2.489000 +117035 4.210000 +117041 5.370000 +117064 0.498000 +117065 4.626000 +117084 1.364000 +117095 4.148000 +117097 2.107000 +117101 4.250000 +117107 5.015000 +117109 5.035000 +117110 2.874000 +117111 0.856000 +117112 5.040000 +117113 2.855000 +117114 2.980000 +117115 2.490000 +117116 4.182000 +117121 0.692000 +117124 4.612000 +117125 4.478000 +117126 4.388000 +117127 4.596000 +117128 4.466000 +117130 4.696000 +117131 4.214000 +117134 4.606000 +117135 4.712000 +117136 4.162000 +117137 4.164000 +117138 3.650000 +117145 4.414000 +117146 4.770000 +117147 5.040000 +117148 5.090000 +117149 4.770000 +117152 4.720000 +117153 3.936000 +117156 1.041000 +117157 4.758000 +117158 4.738000 +117159 4.788000 +117160 4.816000 +117164 5.285000 +117167 5.425000 +117168 5.375000 +117170 5.355000 +117171 2.665000 +117175 2.663000 +117189 5.365000 +117216 3.206000 +117217 3.218000 +117218 3.134000 +117221 2.005000 +117241 5.340000 +117242 5.345000 +117256 5.300000 +117267 0.606000 +117269 1.809000 +117270 3.726000 +117275 3.816000 +117287 3.386000 +117288 5.375000 +117289 5.605000 +117290 5.615000 +117291 5.655000 +117292 5.710000 +117293 5.755000 +117294 5.355000 +117295 5.365000 +117298 5.390000 +117299 5.340000 +117303 5.410000 +117304 5.415000 +117313 5.185000 +117322 3.848000 +117324 3.366000 +117325 2.002000 +117326 1.850000 +117327 5.078000 +117329 3.300000 +117331 1.536000 +117332 4.610000 +117333 5.302000 +117334 5.398000 +117337 1.324000 +117338 1.244000 +117339 4.292000 +117340 5.026000 +117341 5.310000 +117342 4.568000 +117343 5.396000 +117348 2.530000 +117351 2.316000 +117352 5.455000 +117353 3.138000 +117354 2.229000 +117356 2.043000 +117357 3.188000 +117358 4.614000 +117359 4.606000 +117360 3.804000 +117361 2.561000 +117362 1.513000 +117363 1.372000 +117364 2.368000 +117365 1.558000 +117366 1.871000 +117367 2.603000 +117368 3.546000 +117369 2.671000 +117370 3.308000 +117371 4.646000 +117372 4.572000 +117373 3.036000 +117374 4.088000 +117375 2.392000 +117376 2.996000 +117377 2.040000 +117378 2.452000 +117379 3.430000 +117380 5.250000 +117381 2.108000 +117382 3.816000 +117397 0.902000 +117398 1.099000 +117399 2.031000 +117402 2.060000 +117403 4.985000 +117404 5.230000 +117405 5.280000 +117406 5.240000 +117407 5.370000 +117408 5.440000 +117409 4.418000 +117414 5.155000 +117415 4.782000 +117417 5.240000 +117428 3.015400 +117429 3.015200 +117430 2.115000 +117434 0.675000 +117435 1.540000 +117436 5.415000 +117437 3.011200 +117438 1.280000 +117439 3.012600 +117440 3.012000 +117441 3.012600 +117442 3.012000 +117443 3.011600 +117444 3.013600 +117464 3.550000 +117465 3.014400 +117467 3.016800 +117468 0.655000 +117469 3.019400 +117470 3.016200 +117471 3.017800 +117472 3.023400 +117473 3.020800 +117474 3.023400 +117475 3.021000 +117476 3.019000 +117477 3.021200 +117478 3.023800 +117526 4.606000 +117528 5.445000 +117529 5.385000 +117531 5.175000 +117532 5.425000 +117533 5.395000 +117534 3.284000 +117536 5.055000 +117542 3.796000 +117543 3.094000 +117546 3.038000 +117547 2.490000 +117548 4.860000 +117549 4.830000 +117550 4.784000 +117551 4.810000 +117553 2.536000 +117554 2.457000 +117560 2.519000 +117571 6.130000 +117573 6.265000 +117574 1.837000 +117581 4.036000 +117586 5.865000 +117614 1.425000 +117615 5.225000 +117619 5.370000 +117623 5.080000 +117646 5.315000 +117648 5.380000 +117649 5.365000 +117650 5.365000 +117651 5.340000 +117652 5.330000 +117653 1.893000 +117654 5.290000 +117655 5.330000 +117656 5.380000 +117657 5.290000 +117658 5.365000 +117659 5.380000 +117661 3.200000 +117662 3.346000 +117663 3.000000 +117664 5.375000 +117665 5.240000 +117666 5.375000 +117667 5.345000 +117668 5.330000 +117669 5.345000 +117670 5.355000 +117671 5.355000 +117679 0.860000 +117680 0.932000 +117682 1.163000 +117683 1.186000 +117687 5.660000 +117689 5.725000 +117708 6.320000 +117711 6.320000 +117713 4.948000 +117716 6.325000 +117717 6.365000 +117718 6.335000 +117719 6.305000 +117720 6.340000 +117721 6.330000 +117722 6.310000 +117723 5.030000 +117724 6.315000 +117725 3.284000 +117727 6.305000 +117728 6.300000 +117729 6.345000 +117730 6.335000 +117731 1.843000 +117732 4.180000 +117736 4.010000 +117737 1.264000 +117750 1.196000 +117775 5.195000 +117789 6.000000 +117791 0.514000 +117792 6.020000 +117793 6.025000 +117795 4.274000 +117800 5.570000 +117801 6.270000 +117803 5.760000 +117814 1.699000 +117815 1.225000 +117816 2.053000 +117817 1.534000 +117818 2.055000 +117826 1.047000 +117827 1.344000 +117828 1.365000 +117829 2.258000 +117832 1.269000 +117834 1.387000 +117838 0.676000 +117844 4.794000 +117845 0.664000 +117846 4.930000 +117863 5.735000 +117864 5.840000 +117865 5.360000 +117866 3.832000 +117867 4.232000 +117871 4.378000 +117874 4.466000 +117875 4.494000 +117879 4.114000 +117880 1.062000 +117881 2.350000 +117885 4.494000 +117886 1.658000 +117887 2.408000 +117891 2.600000 +117893 3.044000 +117899 0.878000 +117902 0.834000 +117903 1.525000 +117904 1.300000 +117906 1.295000 +117907 1.607000 +117908 1.702000 +117909 1.156000 +117910 1.221000 +117911 1.943000 +117912 1.813000 +117913 2.062000 +117915 1.796000 +117916 1.333000 +117918 1.629000 +117919 1.226000 +117920 1.318000 +117955 2.928000 +117957 2.043000 +117958 2.180000 +117960 3.270000 +117961 2.851000 +117969 3.014000 +117972 1.570000 +117974 2.180000 +117976 2.177000 +117977 2.164000 +117979 1.898000 +117985 1.624000 +117991 1.950000 +117997 1.796000 +118017 5.005000 +118114 2.134000 +118115 5.380000 +118116 4.594000 +118117 4.164000 +118118 3.544000 +118119 4.396000 +118120 2.599000 +118121 2.668000 +118122 0.502000 +118123 3.604000 +118124 4.018000 +118125 3.524000 +118126 2.123000 +118127 2.036000 +118128 3.472000 +118129 4.220000 +118130 0.564000 +118131 1.069000 +118132 1.821000 +118133 1.944000 +118138 2.922000 +118139 2.940000 +118153 6.015000 +118154 3.512000 +118155 5.080000 +118156 5.355000 +118157 5.420000 +118158 3.022000 +118160 5.445000 +118161 6.155000 +118163 5.405000 +118169 4.398000 +118172 4.462000 +118176 4.500000 +118177 3.402000 +118179 4.466000 +118182 3.266000 +118183 5.295000 +118185 5.280000 +118186 5.290000 +118187 5.330000 +118188 5.280000 +118189 5.330000 +118190 5.275000 +118191 5.345000 +118192 4.848000 +118193 4.728000 +118194 4.915000 +118195 4.828000 +118196 5.250000 +118202 2.287000 +118204 0.828000 +118208 4.418000 +118210 6.000000 +118211 6.025000 +118212 6.015000 +118213 6.010000 +118216 6.005000 +118217 6.015000 +118218 6.010000 +118236 0.558000 +118237 5.845000 +118238 5.820000 +118242 5.715000 +118244 1.739000 +118246 5.880000 +118249 6.005000 +118250 5.910000 +118251 5.965000 +118252 5.920000 +118254 5.930000 +118255 5.845000 +118256 2.926000 +118257 1.024000 +118258 2.670000 +118259 2.854000 +118262 1.850000 +118265 2.679000 +118266 5.405000 +118267 5.480000 +118277 5.420000 +118282 5.475000 +118301 0.512000 +118302 0.504000 +118303 0.700000 +118304 0.546000 +118305 3.878000 +118306 1.516000 +118307 1.538000 +118308 1.381000 +118309 1.446000 +118310 1.525000 +118311 1.412000 +118312 3.742000 +118313 3.980000 +118314 1.527000 +118315 1.440000 +118316 4.662000 +118322 2.692000 +118324 1.244000 +118325 1.230000 +118326 6.320000 +118331 4.940000 +118345 6.750000 +118348 6.815000 +118350 4.750000 +118353 6.830000 +118354 2.714000 +118355 5.090000 +118362 4.792000 +118363 3.520000 +118367 3.404000 +118379 3.596000 +118382 4.460000 +118383 3.238000 +118388 3.142000 +118389 3.806000 +118390 3.198000 +118402 4.700000 +118405 4.838000 +118410 7.040000 +118411 3.810000 +118416 3.192000 +118421 3.886000 +118424 7.020000 +118427 3.288000 +118428 4.855000 +118429 3.620000 +118430 7.030000 +118437 6.180000 +118439 3.682000 +118444 7.445000 +118447 4.390000 +118448 2.954000 +118449 1.874000 +118450 2.668000 +118451 3.618000 +118452 2.652000 +118453 3.098000 +118454 7.635000 +118455 6.970000 +118456 1.654000 +118457 5.885000 +118458 1.734000 +118466 3.306000 +118467 5.355000 +118468 5.310000 +118469 5.325000 +118471 5.360000 +118472 5.315000 +118480 3.320000 +118496 2.531000 +118500 5.285000 +118501 2.744000 +118502 2.271000 +118505 1.723000 +118506 1.629000 +118524 0.836000 +118534 0.976000 +118537 5.385000 +118538 5.335000 +118539 5.400000 +118540 5.395000 +118541 5.380000 +118544 5.345000 +118545 5.375000 +118546 5.410000 +118548 5.315000 +118549 1.495000 +118564 4.316000 +118566 3.900000 +118567 3.836000 +118571 3.668000 +118573 3.800000 +118574 3.352000 +118575 4.552000 +118577 2.838000 +118579 3.326000 +118580 3.384000 +118583 3.548000 +118584 2.824000 +118585 3.668000 +118586 3.378000 +118587 3.304000 +118588 3.182000 +118589 3.580000 +118593 0.906000 +118594 4.870000 +118595 4.774000 +118596 3.834000 +118597 5.180000 +118598 3.514000 +118599 4.240000 +118600 4.864000 +118601 2.521000 +118602 2.799000 +118603 2.424000 +118604 2.335000 +118605 2.236000 +118606 2.383000 +118607 1.395000 +118608 2.077000 +118611 2.578000 +118612 2.629000 +118613 1.052000 +118614 2.228000 +118615 2.084000 +118616 2.171000 +118617 1.835000 +118618 1.284000 +118619 1.464000 +118620 2.236000 +118621 1.626000 +118656 1.585000 +118658 4.038000 +118665 4.726000 +118666 4.648000 +118667 2.968000 +118668 4.638000 +118669 4.576000 +118672 1.994000 +118673 1.322000 +118689 4.254000 +118691 5.440000 +118696 5.030000 +118697 3.032000 +118698 5.305000 +118699 5.320000 +118701 4.196000 +118703 1.204000 +118704 4.722000 +118709 4.672000 +118710 4.510000 +118712 4.535000 +118714 4.500000 +118715 2.123000 +118716 2.497000 +118720 4.845000 +118733 5.015000 +118752 2.042000 +118757 5.505000 +118762 1.997000 +118763 5.470000 +118764 5.260000 +118765 5.320000 +118766 5.350000 +118767 5.485000 +118768 5.475000 +118769 5.360000 +118770 5.305000 +118771 5.330000 +118772 5.345000 +118773 5.325000 +118774 5.315000 +118775 5.330000 +118776 5.315000 +118777 5.445000 +118778 5.495000 +118779 5.370000 +118780 5.480000 +118781 5.460000 +118782 5.275000 +118783 5.245000 +118784 5.345000 +118785 5.105000 +118786 5.130000 +118787 5.070000 +118788 5.095000 +118792 2.526000 +118793 5.280000 +118794 5.165000 +118795 5.260000 +118796 5.125000 +118797 5.180000 +118798 5.100000 +118799 5.100000 +118800 5.195000 +118801 5.300000 +118804 5.215000 +118805 5.235000 +118806 5.345000 +118807 5.315000 +118808 5.250000 +118810 5.000000 +118811 5.120000 +118814 3.036000 +118815 5.340000 +118816 5.355000 +118817 5.485000 +118818 5.360000 +118819 5.480000 +118820 5.440000 +118821 5.440000 +118822 5.455000 +118823 5.500000 +118826 5.385000 +118827 4.176000 +118828 5.460000 +118829 5.245000 +118830 5.410000 +118831 5.475000 +118832 2.783000 +118833 4.060000 +118834 2.661000 +118835 5.500000 +118836 3.062000 +118837 4.094000 +118838 5.510000 +118839 1.833000 +118840 2.636000 +118878 3.288000 +118879 5.335000 +118880 5.390000 +118886 5.250000 +118887 5.415000 +118888 5.355000 +118889 5.290000 +118890 5.400000 +118891 5.445000 +118892 5.420000 +118893 5.430000 +118894 5.335000 +118895 4.630000 +118896 5.440000 +118897 5.340000 +118898 5.410000 +118899 5.415000 +118900 5.800000 +118901 5.810000 +118908 4.915000 +118916 4.804000 +118917 3.202000 +118928 3.120000 +118931 2.755000 +118933 2.680000 +118936 4.636000 +118939 4.296000 +118941 2.310000 +118943 3.264000 +118944 2.148000 +118945 2.628000 +118946 2.678000 +118947 2.315000 +118948 2.668000 +118949 3.408000 +118950 1.577000 +118951 2.634000 +118953 4.482000 +118955 3.138000 +118956 3.234000 +118957 4.178000 +118958 3.616000 +118959 4.472000 +118960 2.874000 +118961 3.522000 +118966 5.115000 +118967 4.920000 +118968 4.520000 +118969 4.428000 +118971 4.494000 +118972 4.512000 +118973 4.416000 +118975 4.366000 +118977 4.292000 +118999 5.285000 +119008 0.786000 +119020 5.135000 +119043 3.894000 +119046 3.434000 +119047 3.808000 +119050 3.834000 +119051 3.754000 +119053 3.430000 +119057 3.986000 +119058 3.696000 +119060 4.250000 +119061 3.018000 +119063 1.321000 +119064 2.846000 +119065 4.148000 +119067 4.040000 +119073 5.335000 +119074 5.325000 +119075 5.380000 +119079 2.889000 +119087 5.430000 +119088 5.435000 +119089 5.430000 +119092 4.656000 +119094 5.285000 +119095 5.020000 +119096 5.345000 +119124 3.220000 +119127 2.263000 +119137 1.322000 +119138 4.726000 +119139 1.270000 +119141 3.054000 +119154 1.782000 +119157 1.468000 +119158 1.022000 +119160 2.807000 +119169 2.470000 +119186 1.917000 +119187 2.121000 +119188 3.644000 +119189 3.636000 +119190 3.652000 +119198 4.234000 +119202 2.550000 +119203 2.024000 +119204 1.372000 +119205 3.486000 +119206 3.178000 +119207 2.863000 +119208 1.384000 +119209 1.461000 +119211 1.361000 +119212 3.324000 +119213 3.472000 +119216 3.714000 +119217 4.186000 +119218 4.166000 +119219 4.496000 +119222 5.055000 +119223 5.420000 +119224 5.720000 +119225 1.864000 +119226 5.430000 +119227 2.552000 +119228 3.044000 +119229 3.054000 +119236 3.642000 +119274 3.162000 +119275 5.405000 +119276 5.385000 +119280 5.455000 +119281 5.445000 +119283 5.475000 +119284 5.515000 +119285 5.495000 +119286 3.580000 +119287 4.895000 +119288 5.190000 +119289 1.453000 +119290 2.634000 +119291 5.320000 +119292 4.122000 +119293 4.306000 +119294 5.340000 +119295 5.340000 +119296 5.330000 +119299 3.166000 +119300 5.340000 +119301 5.335000 +119302 3.172000 +119304 5.295000 +119306 3.652000 +119307 4.920000 +119308 5.265000 +119309 5.230000 +119310 5.285000 +119311 5.290000 +119312 5.310000 +119313 5.315000 +119314 5.335000 +119315 5.335000 +119316 5.375000 +119317 5.360000 +119318 5.340000 +119319 5.345000 +119320 5.350000 +119322 5.350000 +119323 5.345000 +119324 5.510000 +119329 2.952000 +119330 5.335000 +119332 5.340000 +119334 5.205000 +119335 5.250000 +119336 5.230000 +119339 4.538000 +119341 5.260000 +119342 4.960000 +119343 5.375000 +119346 5.525000 +119347 4.114000 +119348 3.166000 +119355 3.168000 +119364 4.768000 +119365 5.310000 +119366 5.345000 +119368 4.632000 +119369 4.985000 +119370 5.395000 +119371 5.355000 +119372 5.295000 +119374 3.858000 +119375 4.066000 +119376 5.350000 +119377 3.246000 +119378 3.236000 +119379 5.300000 +119381 0.860000 +119396 4.454000 +119398 3.894000 +119399 3.684000 +119405 4.448000 +119406 4.492000 +119408 4.476000 +119412 4.402000 +119413 4.198000 +119414 4.066000 +119415 4.432000 +119416 3.722000 +119417 4.430000 +119418 4.420000 +119419 4.490000 +119421 4.438000 +119425 0.664000 +119427 5.710000 +119436 5.690000 +119438 5.695000 +119439 5.725000 +119440 5.570000 +119441 5.710000 +119442 5.710000 +119443 5.705000 +119444 5.425000 +119445 4.740000 +119447 5.640000 +119449 5.665000 +119451 5.455000 +119452 5.485000 +119453 5.440000 +119454 5.495000 +119455 5.440000 +119456 5.485000 +119465 4.880000 +119476 3.276000 +119477 4.748000 +119490 5.605000 +119491 4.160000 +119492 6.230000 +119502 5.020000 +119537 4.288000 +119543 0.914000 +119556 3.576000 +119562 3.682000 +119564 3.940000 +119568 5.475000 +119569 5.425000 +119570 5.535000 +119589 1.045000 +119592 4.162000 +119593 5.695000 +119600 4.182000 +119626 2.042000 +119628 1.602000 +119629 1.456000 +119631 1.517000 +119632 1.474000 +119633 1.573000 +119635 1.955000 +119636 1.476000 +119638 1.940000 +119639 1.766000 +119640 2.039000 +119641 1.641000 +119642 1.698000 +119643 1.409000 +119644 1.738000 +119645 1.701000 +119650 1.626000 +119653 1.852000 +119654 1.663000 +119655 4.562000 +119656 2.844000 +119658 2.330000 +119659 2.774000 +119660 1.964000 +119661 1.933000 +119662 4.422000 +119663 1.580000 +119664 1.759000 +119666 2.918000 +119667 2.704000 +119669 1.873000 +119670 3.086000 +119671 2.669000 +119672 2.843000 +119673 1.363000 +119674 2.081000 +119675 2.530000 +119676 3.762000 +119677 2.652000 +119683 1.562000 +119684 3.890000 +119685 0.612000 +119694 1.493000 +119695 3.670000 +119709 4.730000 +119710 4.862000 +119712 1.761000 +119713 5.220000 +119714 4.284000 +119728 6.100000 +119734 7.715000 +119736 7.660000 +119739 3.860000 +119740 2.492000 +119741 2.776000 +119742 1.878000 +119743 1.238000 +119745 1.300000 +119746 2.960000 +119747 2.974000 +119749 2.030000 +119752 7.460000 +119753 7.710000 +119756 7.720000 +119758 3.040000 +119789 5.890000 +119796 1.800000 +119799 1.659000 +119800 3.364000 +119802 1.497000 +119803 1.389000 +119804 1.862000 +119805 1.522000 +119807 2.136000 +119808 1.543000 +119809 3.136000 +119810 2.071000 +119811 1.783000 +119812 1.686000 +119813 3.168000 +119814 1.758000 +119815 3.112000 +119816 1.774000 +119817 1.972000 +119848 3.026000 +119854 4.116000 +119855 3.090000 +119858 4.308000 +119859 3.420000 +119860 3.438000 +119862 2.768000 +119863 4.528000 +119864 5.380000 +119865 4.955000 +119866 5.170000 +119867 5.370000 +119869 5.160000 +119870 5.745000 +119871 3.228000 +119873 5.450000 +119880 5.330000 +119881 2.788000 +119882 3.086000 +119883 2.071000 +119884 5.085000 +119885 4.680000 +119886 4.920000 +119888 5.420000 +119906 1.913000 +119910 5.800000 +119912 6.000000 +119915 5.275000 +119931 6.035000 +119944 1.028000 +119945 0.800000 +119947 4.840000 +119948 4.878000 +119949 5.280000 +119950 5.085000 +119951 5.085000 +119952 4.734000 +119953 4.568000 +119956 5.160000 +119963 5.140000 +120020 2.072000 +120022 1.209000 +120024 1.070000 +120025 1.118000 +120026 1.075000 +120027 0.706000 +120028 0.778000 +120029 0.852000 +120031 0.762000 +120032 2.293000 +120040 1.248000 +120041 0.688000 +120045 1.237000 +120046 4.366000 +120057 3.352000 +120058 2.717000 +120061 2.742000 +120064 4.246000 +120068 3.662000 +120094 4.550000 +120131 0.772000 +120141 3.348000 +120146 4.492000 +120148 1.087000 +120151 1.271000 +120152 0.966000 +120169 5.595000 +120180 2.149000 +120184 0.554000 +120186 1.667000 +120187 1.532000 +120188 1.740000 +120189 1.799000 +120190 1.483000 +120191 5.165000 +120192 1.449000 +120193 1.248000 +120194 0.946000 +120196 0.966000 +120197 0.974000 +120198 0.944000 +120199 1.433000 +120200 1.083000 +120201 1.184000 +120202 1.008000 +120209 5.335000 +120210 5.360000 +120213 5.315000 +120216 5.400000 +120217 5.370000 +120218 5.380000 +120219 5.315000 +120220 4.522000 +120221 5.290000 +120222 5.305000 +120223 5.275000 +120224 5.335000 +120225 5.390000 +120226 5.365000 +120227 5.360000 +120228 5.310000 +120229 5.335000 +120230 5.320000 +120231 5.375000 +120232 4.566000 +120233 5.370000 +120234 5.320000 +120235 5.320000 +120236 4.240000 +120238 3.188000 +120239 3.606000 +120240 3.640000 +120241 3.678000 +120242 3.520000 +120243 3.492000 +120246 2.416000 +120248 3.556000 +120250 5.310000 +120251 5.240000 +120252 5.355000 +120253 4.108000 +120255 4.778000 +120257 5.275000 +120258 5.315000 +120259 3.912000 +120260 5.305000 +120261 4.542000 +120262 5.320000 +120263 3.518000 +120265 4.002000 +120266 3.662000 +120267 5.315000 +120268 5.335000 +120269 3.132000 +120270 5.270000 +120272 5.330000 +120278 1.576000 +120279 1.455000 +120280 1.493000 +120282 1.609000 +120283 1.494000 +120285 1.636000 +120288 1.802000 +120294 1.499000 +120295 1.675000 +120302 0.924000 +120303 1.101000 +120304 1.182000 +120306 5.340000 +120307 5.380000 +120308 5.355000 +120309 2.270000 +120310 5.360000 +120311 5.330000 +120312 5.390000 +120321 4.356000 +120323 3.186000 +120324 3.204000 +120338 1.016000 +120345 5.350000 +120346 5.340000 +120353 5.310000 +120354 5.250000 +120355 5.265000 +120357 5.240000 +120358 4.980000 +120359 1.153000 +120360 1.147000 +120367 1.527000 +120371 7.665000 +120377 7.630000 +120378 7.630000 +120379 6.745000 +120382 7.405000 +120383 7.585000 +120384 7.530000 +120390 1.890000 +120391 2.950000 +120392 2.615000 +120393 3.238000 +120394 2.288000 +120395 2.242000 +120396 2.475000 +120397 3.422000 +120398 3.020000 +120399 2.704000 +120400 3.220000 +120401 3.618000 +120402 4.028000 +120403 2.900000 +120404 3.724000 +120405 1.997000 +120406 3.398000 +120407 2.041000 +120408 1.395000 +120409 2.103000 +120410 3.064000 +120411 1.611000 +120412 3.682000 +120417 0.528000 +120418 1.055000 +120420 3.480000 +120421 0.698000 +120422 3.926000 +120423 3.496000 +120424 4.362000 +120425 3.304000 +120426 3.328000 +120428 1.399000 +120429 2.530000 +120430 2.978000 +120431 5.225000 +120432 3.018000 +120434 3.116000 +120437 3.008000 +120439 3.224000 +120441 5.010000 +120442 4.434000 +120443 2.673000 +120446 1.554000 +120460 4.300000 +120462 7.015000 +120463 1.964000 +120468 7.200000 +120469 2.860000 +120471 2.602000 +120472 2.706000 +120474 6.990000 +120477 5.495000 +120478 5.510000 +120487 2.637000 +120488 2.810000 +120489 2.439000 +120508 1.407000 +120519 1.677000 +120520 1.657000 +120521 3.044000 +120522 2.579000 +120523 2.180000 +120524 3.086000 +120525 3.204000 +120526 2.442000 +120609 0.522000 +120612 3.706000 +120613 3.004000 +120614 0.920000 +120634 0.638000 +120640 4.895000 +120652 2.564000 +120653 7.050000 +120660 4.640000 +120662 9.675000 +120666 10.440000 +120668 10.460000 +120669 11.925000 +120671 10.945000 +120675 11.865000 +120676 12.025000 +120680 2.826000 +120681 3.228000 +120682 3.046000 +120683 1.550000 +120684 1.268000 +120685 1.327000 +120686 1.272000 +120688 3.070000 +120689 3.448000 +120690 3.864000 +120691 3.010000 +120692 1.299000 +120693 1.272000 +120694 3.012000 +120695 2.974000 +120700 5.100000 +120701 5.095000 +120702 4.636000 +120703 4.950000 +120712 1.691000 +120722 1.603000 +120730 0.795000 +120731 0.955000 +120732 0.595000 +120735 0.565000 +120737 4.875000 +120738 3.007200 +120739 3.007800 +120740 2.500000 +120741 2.500000 +120742 2.500000 +120743 2.505200 +120744 1.335000 +120745 2.507200 +120746 2.508200 +120747 2.508800 +120748 2.505400 +120749 2.505600 +120750 2.507000 +120751 2.509800 +120752 2.507800 +120753 2.506800 +120770 1.677000 +120783 5.350000 +120784 5.415000 +120785 5.380000 +120786 5.390000 +120788 5.330000 +120790 5.415000 +120800 1.802000 +120806 2.940000 +120809 7.350000 +120810 7.455000 +120811 7.640000 +120812 2.106000 +120815 4.286000 +120817 3.690000 +120818 4.042000 +120821 5.392000 +120826 5.100000 +120837 6.020000 +120843 1.793000 +120844 3.742000 +120845 4.728000 +120846 5.450000 +120848 4.172000 +120849 4.072000 +120850 3.770000 +120852 2.878000 +120853 4.358000 +120855 4.340000 +120857 3.120000 +120859 3.202000 +120860 3.278000 +120861 4.772000 +120863 3.866000 +120864 2.940000 +120865 4.258000 +120867 4.142000 +120870 5.360000 +120927 1.159000 +120928 5.255000 +120929 6.020000 +120930 5.885000 +120935 5.845000 +120938 5.860000 +120939 5.855000 +120941 3.672000 +120943 5.840000 +120944 5.855000 +120946 5.280000 +120947 5.380000 +120948 0.714000 +120949 5.240000 +120951 5.510000 +120952 5.400000 +120957 5.105000 +120958 5.150000 +120962 6.095000 +120963 4.945000 +120964 4.955000 +120965 4.878000 +120966 4.804000 +120967 5.040000 +120979 4.580000 +120981 3.462000 +120982 1.621000 +120984 4.648000 +120985 1.640000 +120986 4.590000 +120987 4.574000 +121076 5.260000 +121117 0.618000 +121128 5.260000 +121130 5.095000 +121131 5.100000 +121132 0.660000 +121133 2.450000 +121140 5.355000 +121147 5.060000 +121149 2.638000 +121150 5.420000 +121318 1.505000 +121328 4.734000 +121329 4.730000 +121331 5.485000 +121332 1.922000 +121333 1.712000 +121334 4.710000 +121379 1.159000 +121388 3.660000 +121389 4.860000 +121390 4.834000 +121391 5.020000 +121393 5.300000 +121394 5.310000 +121395 5.010000 +121396 4.905000 +121397 4.878000 +121398 5.125000 +121399 1.086000 +121400 5.210000 +121401 5.235000 +121402 5.065000 +121403 3.354000 +121409 1.175000 +121410 4.925000 +121411 4.925000 +121414 4.874000 +121415 4.874000 +121416 3.880000 +121417 4.868000 +121418 4.632000 +121421 1.114000 +121422 1.165000 +121423 5.305000 +121427 2.776000 +121448 1.150000 +121449 3.898000 +121450 1.145000 +121456 1.120000 +121457 4.836000 +121458 4.796000 +121459 4.910000 +121460 5.005000 +121461 4.915000 +121463 3.248000 +121464 1.986000 +121465 5.085000 +121466 4.432000 +121468 4.796000 +121469 4.780000 +121470 5.095000 +121471 4.945000 +121472 4.786000 +121474 5.150000 +121483 1.198000 +121484 4.332000 +121487 1.113000 +121488 1.639000 +121489 1.149000 +121491 1.263000 +121492 2.159000 +121493 2.946000 +121494 2.725000 +121496 2.940000 +121497 3.590000 +121498 2.067000 +121501 2.595000 +121502 1.447000 +121503 1.544000 +121504 1.396000 +121505 1.258000 +121506 1.259000 +121507 1.535000 +121508 0.868000 +121509 1.184000 +121510 1.222000 +121511 1.208000 +121513 1.220000 +121514 0.858000 +121515 1.535000 +121516 1.244000 +121521 2.723000 +121522 0.542000 +121533 5.690000 +121534 4.814000 +121535 4.096000 +121536 3.666000 +121537 1.812000 +121538 2.840000 +121539 3.858000 +121540 3.756000 +121542 4.102000 +121543 4.474000 +121544 3.894000 +121545 3.804000 +121549 1.320000 +121557 5.740000 +121558 1.974000 +121563 1.468000 +121564 5.355000 +121570 3.122000 +121572 3.186000 +121574 5.490000 +121575 5.445000 +121579 1.850000 +121582 1.793000 +121583 1.661000 +121586 1.862000 +121587 1.652000 +121588 1.611000 +121592 1.892000 +121593 2.397000 +121594 1.113000 +121595 1.320000 +121596 2.092000 +121597 2.884000 +121598 1.475000 +121599 1.841000 +121600 1.858000 +121601 1.342000 +121602 1.565000 +121603 2.639000 +121604 1.320000 +121605 1.289000 +121606 1.272000 +121607 1.238000 +121608 1.256000 +121609 1.339000 +121610 1.439000 +121611 2.649000 +121614 1.361000 +121615 1.659000 +121617 1.375000 +121618 1.306000 +121620 1.357000 +121628 4.322000 +121698 0.962000 +121700 0.970000 +121702 5.360000 +121703 5.365000 +121704 5.350000 +121707 4.910000 +121710 3.036000 +121718 5.455000 +121719 5.470000 +121720 5.510000 +121722 5.460000 +121724 5.485000 +121725 5.455000 +121726 5.505000 +121727 5.445000 +121728 5.480000 +121731 5.490000 +121732 2.149000 +121734 4.494000 +121735 3.544000 +121737 1.678000 +121738 5.460000 +121743 5.180000 +121746 3.056000 +121750 2.824000 +121755 3.974000 +121767 7.415000 +121773 7.425000 +121781 4.978000 +121790 4.368000 +121791 4.990000 +121792 4.030000 +121793 3.692000 +121794 3.242000 +121796 3.804000 +121798 3.544000 +121800 1.874000 +121802 4.118000 +121806 2.769000 +121807 2.537000 +121809 2.667000 +121810 2.284000 +121811 4.204000 +121813 1.916000 +121814 1.981000 +121815 2.299000 +121824 5.305000 +121825 5.355000 +121826 2.936000 +121827 5.330000 +121828 5.315000 +121829 5.390000 +121830 5.325000 +121831 5.330000 +121832 5.325000 +121833 1.610000 +121834 5.360000 +121835 2.988000 +121836 5.400000 +121837 5.415000 +121838 5.415000 +121839 5.430000 +121841 5.340000 +121842 5.355000 +121847 5.395000 +121848 5.335000 +121849 5.390000 +121850 5.380000 +121851 5.340000 +121852 5.355000 +121853 5.335000 +121854 5.390000 +121862 5.290000 +121863 5.335000 +121864 5.685000 +121869 2.792000 +121870 3.204000 +121871 2.587000 +121872 2.672000 +121874 5.205000 +121879 2.637000 +121883 2.383000 +121884 3.452000 +121925 5.380000 +121926 5.370000 +121928 3.336000 +121932 4.810000 +121945 5.170000 +121946 5.125000 +121949 0.876000 +121953 5.240000 +121962 6.360000 +121963 6.080000 +121968 3.126000 +121970 2.816000 +121971 2.163000 +121972 4.420000 +121973 3.152000 +121974 2.942000 +121975 6.065000 +121976 3.996000 +121978 0.826000 +121980 3.832000 +121982 6.425000 +121989 4.472000 +121991 3.712000 +121997 2.348000 +122003 2.838000 +122009 2.998000 +122012 2.802000 +122022 2.808000 +122025 2.189000 +122027 3.642000 +122034 1.024000 +122035 1.145000 +122036 1.281000 +122037 1.084000 +122038 1.318000 +122039 0.556000 +122040 0.568000 +122043 2.772000 +122044 2.495000 +122045 2.632000 +122046 1.878000 +122047 1.727000 +122051 1.012000 +122055 5.295000 +122057 5.210000 +122058 5.065000 +122070 5.180000 +122072 4.975000 +122073 5.010000 +122087 5.065000 +122101 1.018000 +122102 4.078000 +122104 3.136000 +122105 3.676000 +122106 3.374000 +122113 4.590000 +122114 2.708000 +122119 2.667000 +122138 5.325000 +122139 5.425000 +122143 5.625000 +122146 4.020000 +122148 2.613000 +122149 2.194000 +122155 2.573000 +122160 2.228000 +122165 2.244000 +122167 2.093000 +122172 5.140000 +122214 1.396000 +122225 1.539000 +122227 2.193000 +122228 2.892000 +122229 2.730000 +122230 3.170000 +122231 2.475000 +122234 3.680000 +122236 4.940000 +122238 1.360000 +122242 0.692000 +122246 5.335000 +122250 1.698000 +122251 5.380000 +122252 5.385000 +122253 5.370000 +122254 5.335000 +122255 5.315000 +122256 5.310000 +122257 5.380000 +122258 5.330000 +122259 5.305000 +122260 5.340000 +122277 0.516000 +122278 3.964000 +122279 1.146000 +122280 1.103000 +122281 0.890000 +122282 5.090000 +122283 1.969000 +122285 0.678000 +122287 4.278000 +122288 0.784000 +122289 1.743000 +122291 0.882000 +122295 0.586000 +122296 0.636000 +122297 0.598000 +122298 0.995000 +122300 1.588000 +122301 1.771000 +122302 5.520000 +122304 1.700000 +122308 2.093000 +122310 0.708000 +122317 4.086000 +122318 4.080000 +122320 4.516000 +122325 3.134000 +122326 2.346000 +122327 3.136000 +122328 3.200000 +122329 1.115000 +122330 1.064000 +122331 3.026000 +122332 3.430000 +122333 3.648000 +122334 4.540000 +122335 2.922000 +122340 1.230000 +122345 3.552000 +122346 4.308000 +122347 1.692000 +122348 4.574000 +122431 4.935600 +122432 4.912000 +122433 4.911600 +122440 1.469000 +122441 4.686000 +122442 4.750000 +122446 1.112000 +122448 3.960000 +122449 4.562000 +122453 3.484000 +122454 4.170000 +122456 3.412000 +122459 4.816000 +122460 5.495000 +122461 4.162000 +122463 4.162000 +122466 5.075000 +122468 3.540000 +122469 3.744000 +122476 3.138000 +122477 2.296000 +122478 4.294000 +122479 3.836000 +122484 4.905000 +122485 3.106000 +122488 5.635000 +122493 4.580000 +122496 6.010000 +122499 3.608000 +122500 3.562000 +122503 6.340000 +122505 5.450000 +122506 7.020000 +122507 7.020000 +122508 7.020000 +122509 7.010000 +122510 7.020000 +122515 3.012800 +122516 3.009400 +122517 3.011600 +122518 3.008600 +122520 4.035000 +122521 3.011400 +122522 3.011400 +122532 3.660000 +122540 4.078000 +122542 5.035000 +122543 5.590000 +122555 2.615000 +122559 2.607000 +122562 3.066000 +122565 3.016000 +122567 2.958000 +122588 2.873000 +122589 4.708000 +122592 5.025000 +122594 5.065000 +122596 5.000000 +122609 1.794000 +122610 1.765000 +122611 1.472000 +122612 1.460000 +122613 2.263000 +122614 2.019000 +122621 1.693000 +122622 1.875000 +122623 3.112000 +122624 1.715000 +122625 6.188000 +122626 1.855000 +122628 3.366000 +122629 7.560000 +122631 2.490000 +122636 7.660000 +122640 2.982000 +122641 4.742000 +122643 7.515000 +122644 7.535000 +122646 6.500000 +122647 5.712000 +122648 6.118000 +122650 3.922000 +122657 3.400000 +122658 3.394000 +122667 4.378000 +122674 6.045000 +122694 5.035000 +122698 3.818000 +122709 3.196000 +122710 5.855000 +122712 5.135000 +122720 3.514000 +122724 3.180000 +122729 4.796000 +122742 0.742000 +122743 0.694000 +122747 5.410000 +122776 5.105000 +122777 5.205000 +122778 2.030000 +122779 4.436000 +122785 3.282000 +122786 1.640000 +122787 7.710000 +122791 4.298000 +122793 3.722000 +122795 4.250000 +122796 5.200000 +122797 5.290000 +122803 1.271000 +122804 1.486000 +122805 1.387000 +122806 1.296000 +122807 4.560000 +122809 3.636000 +122810 1.225000 +122811 3.100000 +122812 3.974000 +122813 2.590000 +122814 2.224000 +122815 2.081000 +122818 0.654000 +122819 0.868000 +122821 0.590000 +122822 0.534000 +122824 3.540000 +122825 3.465000 +122826 1.508400 +122827 3.008400 +122828 2.259600 +122829 1.884800 +122830 2.625000 +122831 3.258200 +122832 3.258400 +122836 1.715000 +122837 1.420000 +122842 1.502000 +122843 3.168000 +122867 5.510000 +122870 0.604000 +122876 5.528000 +122877 7.055000 +122878 7.065000 +122883 7.090000 +122900 5.028000 +122901 5.024000 +122902 5.460000 +122913 4.158000 +122915 3.100000 +122917 3.724000 +122920 5.095000 +122926 3.592000 +122927 2.440000 +122929 4.796000 +122930 4.630000 +122932 3.462000 +122933 4.548000 +122938 2.960000 +122939 2.381000 +122940 2.144000 +122941 4.526000 +122956 4.268000 +122957 4.682000 +122959 4.420000 +122962 4.114000 +122963 3.660000 +122964 2.972000 +122971 4.622000 +122972 5.055000 +122976 3.852000 +122979 4.728000 +122980 4.256000 +122988 5.190000 +122991 5.170000 +122993 5.160000 +122996 4.925000 +122999 0.504000 +123000 3.255000 +123001 1.928000 +123002 1.613000 +123004 3.770000 +123005 3.765000 +123007 3.003200 +123008 3.006600 +123009 3.005800 +123010 3.005200 +123011 4.035000 +123013 2.004600 +123014 2.005200 +123015 2.005200 +123016 2.004800 +123040 3.634000 +123065 4.848000 +123071 6.355000 +123104 4.822000 +123105 4.424000 +123107 4.452000 +123154 6.150000 +123156 6.165000 +123168 5.610000 +123178 4.718000 +123185 1.295000 +123186 2.672000 +123187 2.962000 +123191 4.458000 +123193 2.964000 +123194 3.376000 +123195 3.146000 +123196 2.790000 +123198 3.016000 +123200 2.803000 +123201 2.837000 +123210 2.830000 +123211 2.883000 +123215 3.318000 +123216 4.484000 +123217 2.570000 +123218 2.595000 +123219 2.569000 +123237 5.916000 +123238 7.050000 +123241 7.135000 +123245 6.150000 +123247 6.780000 +123276 3.848000 +123278 4.754000 +123283 1.871000 +123284 1.876000 +123285 2.553000 +123289 3.388000 +123290 3.138000 +123291 5.595000 +123293 5.675000 +123294 3.018000 +123295 5.535000 +123296 5.090000 +123297 5.255000 +123311 5.305000 +123312 5.290000 +123319 5.725000 +123320 1.014000 +123321 0.694000 +123328 5.595000 +123330 5.300000 +123332 5.665000 +123343 2.481000 +123360 1.153000 +123361 0.676000 +123362 0.742000 +123363 1.448000 +123364 5.515000 +123365 5.510000 +123366 5.425000 +123367 5.325000 +123368 4.194000 +123369 5.255000 +123370 5.325000 +123373 5.165000 +123375 5.140000 +123376 5.130000 +123377 5.115000 +123378 5.120000 +123379 5.115000 +123380 5.115000 +123381 5.485000 +123386 1.153000 +123390 5.135000 +123391 5.110000 +123403 5.435000 +123404 1.682000 +123406 5.440000 +123407 5.380000 +123408 5.470000 +123409 5.480000 +123411 5.470000 +123412 5.140000 +123415 5.165000 +123418 5.480000 +124426 0.656000 +124428 0.638000 +124439 0.674000 +124440 1.844000 +124441 0.692000 +124442 1.432000 +124443 1.198000 +124444 1.017000 +124448 3.980000 +124449 1.027000 +124450 1.108000 +124451 1.029000 +124452 1.578000 +124453 4.270000 +124454 4.440000 +124458 4.138000 +124459 4.182000 +124460 1.402000 +124463 5.665000 +124464 5.710000 +124502 4.540000 +124504 5.600000 +124507 5.455000 +124508 4.544000 +124510 2.916000 +124532 1.738000 +124562 4.392000 +124687 5.365000 +124688 5.585000 +124701 2.486000 +124707 3.502000 +124709 5.025000 +124710 4.736000 +124711 2.110000 +124712 4.542000 +124713 3.722000 +124714 4.274000 +124715 4.134000 +124719 2.035000 +124810 5.215000 +124811 3.662000 +124814 1.777000 +124815 1.107000 +124816 5.500000 +124819 5.475000 +124820 2.400000 +124822 1.416000 +124829 5.070000 +124850 1.640000 +124851 2.293000 +124852 2.105000 +124853 3.250000 +124854 1.471000 +124855 2.271000 +124860 7.085000 +124861 1.944000 +124862 2.436000 +124863 2.100000 +124865 4.718000 +124870 4.368000 +124894 5.635000 +124899 3.022000 +124901 3.044000 +124902 3.106000 +124905 1.984000 +124906 2.143000 +124956 4.140000 +124957 6.030000 +124958 1.828000 +124959 0.616000 +124960 1.485000 +124961 0.558000 +124962 0.908000 +124963 1.438000 +124964 2.190000 +124965 4.158000 +124969 4.710000 +124970 1.036000 +124971 4.638000 +124988 3.112000 +124989 4.568000 +124990 0.940000 +124991 4.062000 +124992 3.940000 +124993 2.754000 +124994 2.121000 +124995 5.215000 +124996 1.526000 +124997 2.928000 +124998 6.235000 +124999 5.635000 +125002 2.453000 +125005 5.915000 +125007 5.820000 +125008 5.880000 +125011 5.150000 +125012 5.365000 +125013 5.790000 +125014 3.752000 +125015 3.228000 +125016 3.752000 +125017 3.770000 +125018 3.846000 +125019 4.052000 +125032 5.765000 +125044 4.030000 +125055 2.784000 +125064 3.720000 +125065 6.570000 +125068 5.220000 +125069 2.886000 +125080 3.524000 +125083 2.723000 +125084 5.285000 +125085 3.254000 +125087 3.626000 +125091 3.138000 +125093 3.244000 +125094 2.948000 +125103 1.454000 +125105 4.332000 +125106 4.056000 +125107 4.138000 +125108 0.914000 +125109 3.826000 +125110 3.992000 +125111 4.114000 +125112 3.982000 +125113 4.056000 +125114 4.602000 +125115 1.573000 +125117 1.199000 +125119 1.258000 +125121 1.367000 +125122 2.785000 +125123 2.822000 +125124 1.638000 +125131 5.395000 +125132 3.560000 +125136 0.564000 +125137 0.650000 +125138 0.674000 +125142 4.472000 +125143 4.440000 +125158 4.276000 +125177 5.830000 +125179 1.986000 +125184 1.057000 +125187 4.718000 +125216 5.660000 +125247 5.825000 +125250 2.397000 +125251 4.940000 +125252 3.998000 +125253 4.322000 +125254 3.668000 +125256 2.446000 +125257 4.396000 +125258 4.164000 +125259 3.274000 +125260 2.970000 +125261 6.135000 +125265 0.562000 +125270 5.580000 +125271 5.585000 +125272 5.575000 +125275 5.580000 +125276 5.385000 +125284 1.232000 +125288 2.916000 +125289 0.678000 +125290 0.534000 +125292 2.524000 +125293 1.200000 +125295 1.992000 +125296 2.576000 +125306 4.488000 +125308 4.502000 +125316 4.496000 +125317 4.500000 +125318 4.460000 +125319 4.488000 +125323 4.496000 +125328 2.980000 +125329 3.928000 +125330 3.912000 +125331 3.672000 +125332 3.680000 +125333 3.214000 +125334 6.215000 +125335 4.980000 +125337 5.910000 +125339 5.330000 +125408 0.556000 +125409 4.482000 +125411 0.968000 +125412 4.466000 +125414 4.510000 +125415 3.984000 +125416 4.520000 +125417 4.478000 +125429 2.303000 +125431 3.932000 +125434 2.898000 +125435 1.665000 +125436 3.846000 +125437 3.752000 +125438 3.474000 +125439 3.194000 +125440 3.398000 +125441 2.443000 +125443 3.678000 +125444 3.340000 +125445 3.346000 +125446 3.230000 +125449 2.889000 +125465 6.075000 +125467 1.476000 +125470 3.592000 +125473 5.245000 +125476 4.905000 +125492 5.470000 +125500 5.290000 +125501 6.300000 +125508 0.672000 +125520 0.744000 +125521 0.748000 +125522 1.183000 +125553 2.431000 +125554 5.230000 +125555 4.476000 +125557 2.404000 +125558 1.342000 +125559 2.084000 +125560 1.370000 +125561 3.840000 +125562 0.986000 +125563 2.457000 +125564 1.518000 +125565 2.099000 +125588 0.640000 +125590 4.030000 +125592 2.898000 +125593 2.482000 +125594 5.410000 +125595 5.485000 +125596 4.766000 +125597 5.145000 +125598 4.402000 +125600 6.050000 +125601 2.010000 +125602 4.130000 +125603 6.140000 +125605 5.490000 +125608 3.778000 +125609 3.864000 +125610 4.770000 +125611 3.770000 +125612 5.310000 +125613 3.032000 +125619 0.824000 +125626 4.490000 +125628 4.496000 +125631 4.424000 +125632 4.520000 +125634 4.476000 +125636 2.523000 +125637 3.308000 +125640 4.442000 +125641 4.482000 +125642 4.458000 +125659 2.464000 +125660 4.098000 +125661 4.124000 +125662 3.074000 +125666 5.915000 +125671 7.710000 +125673 3.754000 +125674 5.360000 +125676 6.100000 +125677 7.530000 +125683 4.436000 +125685 4.484000 +125686 4.532000 +125687 4.464000 +125688 4.418000 +125689 4.416000 +125691 4.442000 +125692 4.452000 +125693 4.438000 +125694 4.444000 +125697 4.468000 +125699 4.450000 +125702 4.464000 +125703 4.438000 +125704 4.516000 +125706 4.428000 +125707 4.512000 +125708 4.442000 +125709 4.470000 +125715 1.060000 +125717 4.294000 +125722 3.692000 +125723 3.904000 +125726 1.559000 +125728 1.591000 +125730 4.788000 +125731 4.955000 +125732 5.290000 +125735 5.280000 +125739 4.660000 +125740 5.040000 +125750 1.185000 +125751 0.520000 +125752 1.881000 +125753 5.110000 +125754 5.095000 +125756 5.110000 +125757 5.390000 +125758 5.230000 +125760 0.584000 +125762 5.515000 +125765 3.118000 +125766 5.115000 +125768 3.418000 +125769 3.388000 +125777 1.986000 +125779 4.332000 +125780 4.398000 +125781 4.296000 +125784 3.372000 +125785 1.634000 +125786 4.436000 +125787 5.285000 +125788 3.096000 +125789 4.456000 +125791 1.634000 +125793 5.005000 +125794 2.159000 +125795 3.646000 +125796 2.515000 +125805 2.602000 +125809 3.808000 +125810 2.196000 +125811 5.010000 +125814 4.238000 +125817 5.370000 +125819 3.322000 +125821 2.764000 +125822 5.585000 +125823 1.684000 +125825 3.284000 +125826 3.878000 +125827 3.094000 +125830 5.690000 +125831 5.960000 +125832 2.714000 +125833 5.095000 +125834 4.362000 +125835 3.564000 +125836 4.500000 +125846 6.605000 +125848 6.185000 +125853 6.270000 +125859 7.000000 +125886 1.743000 +125893 4.638000 +125897 5.085000 +125898 3.358000 +125900 5.935000 +125901 5.220000 +125902 5.640000 +125906 1.939000 +125907 6.020000 +125908 3.434000 +125909 5.245000 +125910 3.996000 +125911 5.070000 +125912 4.590000 +125913 4.716000 +125914 3.608000 +125916 5.600000 +125917 2.599000 +125919 2.912000 +125923 2.221000 +125925 6.140000 +125926 5.070000 +125927 2.827000 +125928 3.578000 +125929 5.210000 +125930 5.155000 +125931 5.105000 +125932 3.142000 +125933 4.758000 +125934 3.730000 +125935 3.110000 +125936 3.060000 +125937 3.026000 +125938 3.304000 +125939 4.995000 +125940 3.040000 +125941 2.910000 +125942 3.518000 +125943 3.320000 +125944 3.602000 +125945 5.015000 +125946 4.164000 +125947 2.237000 +125948 1.670000 +125949 0.770000 +125950 1.937000 +125968 3.758000 +125969 4.672000 +125974 2.944000 +125986 3.588000 +125987 3.210000 +125988 3.120000 +125989 3.446000 +125990 3.128000 +125992 2.894000 +125993 2.506000 +125996 2.794000 +125997 3.156000 +125998 4.370000 +126001 2.865000 +126002 4.728000 +126003 5.370000 +126004 4.594000 +126005 3.898000 +126006 4.882000 +126007 3.412000 +126008 5.345000 +126009 3.028000 +126010 2.058000 +126011 2.047000 +126012 2.568000 +126018 4.454000 +126019 4.456000 +126022 4.458000 +126025 4.400000 +126026 4.468000 +126027 4.518000 +126028 4.456000 +126029 4.450000 +126030 4.386000 +126031 3.062000 +126032 4.476000 +126033 4.474000 +126034 4.444000 +126035 4.444000 +126037 4.488000 +126040 4.556000 +126045 1.327000 +126046 3.180000 +126057 3.786000 +126111 0.500000 +126114 4.226000 +126121 3.718000 +126130 2.732000 +126139 5.860000 +126147 3.754000 +126148 5.665000 +126149 4.174000 +126150 4.578000 +126152 3.636000 +126153 0.712000 +126154 4.468000 +126156 4.566000 +126159 4.778000 +126169 3.504000 +126175 1.963000 +126191 4.376000 +126193 3.576000 +126199 3.712000 +126208 4.610000 +126209 4.464000 +126211 4.544000 +126217 4.540000 +126221 4.578000 +126227 0.666000 +126231 3.712000 +126281 4.114000 +126290 3.970000 +126305 0.498000 +126311 3.604000 +126333 6.170000 +126334 6.190000 +126335 5.965000 +126350 4.438000 +126363 4.724000 +126372 1.021000 +126373 0.936000 +126396 3.448000 +126398 4.048000 +126409 5.475000 +126410 2.399000 +126414 4.444000 +126415 1.171000 +126416 4.644000 +126417 4.488000 +126420 5.065000 +126421 5.245000 +126422 5.540000 +126424 4.935000 +126425 5.605000 +126430 2.240000 +126432 2.554000 +126433 6.005000 +126436 1.732000 +126438 3.560000 +126440 5.875000 +126442 5.670000 +126443 5.050000 +126444 3.490000 +126445 4.520000 +126446 4.242000 +126447 4.398000 +126450 5.525000 +126451 5.405000 +126463 4.888000 +126491 4.742000 +126492 4.670000 +126506 4.048000 +126508 3.804000 +126529 5.400000 +126530 5.405000 +126535 5.400000 +126537 5.340000 +126538 5.330000 +126539 5.370000 +126540 5.350000 +126542 5.400000 +126543 5.370000 +126544 4.092000 +126546 5.040000 +126547 4.915000 +126548 4.925000 +126549 4.828000 +126550 4.338000 +126551 0.993000 +126557 3.422000 +126559 3.182000 +126561 3.236000 +126571 4.222000 +126572 4.390000 +126578 3.662000 +126580 2.916000 +126581 4.935000 +126582 4.778000 +126584 4.995000 +126585 4.935000 +126586 4.940000 +126591 4.602000 +126594 4.570000 +126608 4.290000 +126609 4.368000 +126610 4.484000 +126611 4.975000 +126612 5.965000 +126613 3.580000 +126614 3.700000 +126615 3.426000 +126616 2.787000 +126617 2.924000 +126618 2.934000 +126619 2.487000 +126620 3.388000 +126621 3.728000 +126622 4.955000 +126623 6.240000 +126624 5.190000 +126625 6.275000 +126628 3.802000 +126630 5.360000 +126631 3.968000 +126632 3.712000 +126633 5.205000 +126636 5.675000 +126637 3.592000 +126638 4.870000 +126639 2.708000 +126640 5.275000 +126646 3.340000 +126647 4.798000 +126648 4.778000 +126649 4.812000 +126650 4.744000 +126651 2.779000 +126652 4.150000 +126653 5.400000 +126654 5.495000 +126655 5.425000 +126656 5.465000 +126658 5.455000 +126659 5.475000 +126662 5.445000 +126663 5.460000 +126665 1.467000 +126666 5.475000 +126667 5.460000 +126669 5.430000 +126671 4.286000 +126672 5.110000 +126673 3.962000 +126674 3.096000 +126682 5.230000 +126684 2.794000 +126686 5.095000 +126687 5.080000 +126688 4.526000 +126689 3.672000 +126691 3.864000 +126693 2.964000 +126694 2.892000 +126695 3.010000 +126696 5.180000 +126697 3.210000 +126698 4.100000 +126699 4.372000 +126709 5.785000 +126710 6.010000 +126732 5.480000 +126736 4.860000 +126739 6.270000 +126741 3.118000 +126759 0.916000 +126807 5.405000 +126808 5.385000 +126809 5.380000 +126810 4.608000 +126821 6.235000 +126823 6.300000 +126841 5.680000 +126844 5.725000 +126852 5.525000 +126853 5.425000 +126854 5.300000 +126855 5.465000 +126856 5.465000 +126857 5.470000 +126858 5.455000 +126859 5.450000 +126876 4.760000 +126877 3.790000 +126886 6.090000 +126887 3.956000 +126888 6.095000 +126892 6.285000 +126893 6.350000 +126895 6.345000 +126900 3.908000 +126901 4.104000 +126902 4.620000 +126903 4.526000 +126904 3.886000 +126909 4.678000 +126910 4.714000 +126911 4.702000 +126913 4.614000 +126926 4.500000 +126928 3.303000 +126931 4.738000 +126932 3.001800 +126933 3.000600 +126934 2.001000 +126935 2.000400 +126936 1.680000 +127330 2.771000 +127331 3.120000 +127332 3.440000 +127342 4.866000 +127350 0.652000 +127351 0.616000 +127352 0.662000 +127362 0.568000 +127366 0.666000 +127367 0.522000 +127372 4.356000 +127375 1.431000 +127376 5.075000 +127377 1.196000 +127384 1.693000 +127387 3.604000 +127388 3.656000 +127396 2.574000 +127400 4.320000 +127444 6.415000 +127450 4.124000 +127456 5.465000 +127458 5.560000 +127538 5.770000 +127539 4.292000 +127540 6.105000 +127543 5.565000 +127545 1.826000 +127546 1.648000 +127547 2.348000 +127548 3.442000 +127549 3.444000 +127550 3.674000 +127551 1.053000 +127552 3.820000 +127553 3.824000 +127554 4.112000 +127555 3.352000 +127556 3.284000 +127580 3.604000 +127581 4.460000 +127582 3.940000 +127583 3.980000 +127584 3.926000 +127585 2.784000 +127586 2.196000 +127588 4.870000 +127589 4.116000 +127590 4.024000 +127591 4.458000 +127592 2.198000 +127593 4.438000 +127594 4.310000 +127611 2.691000 +127613 3.532000 +127634 4.462000 +127635 4.900000 +127652 5.710000 +127653 6.280000 +127666 5.690000 +127668 2.928000 +127676 1.437000 +127677 3.412000 +127678 3.508000 +127679 3.272000 +127680 3.410000 +127681 4.210000 +127682 4.166000 +127683 3.960000 +127684 3.798000 +127685 3.620000 +127686 4.346000 +127687 4.920000 +127688 5.040000 +127689 4.846000 +127690 4.510000 +127691 4.612000 +127692 2.860000 +127694 3.334000 +127703 4.354000 +127704 4.628000 +127705 4.488000 +127706 4.286000 +127707 4.498000 +127708 5.750000 +127709 5.745000 +127710 5.195000 +127711 6.265000 +127712 6.255000 +127713 5.780000 +127714 6.335000 +127715 5.705000 +127716 6.290000 +127725 3.194000 +127726 3.488000 +127727 3.538000 +127729 4.756000 +127738 2.932000 +127750 1.185000 +127754 3.216000 +127755 4.416000 +127756 3.380000 +127757 3.252000 +127762 3.924000 +127764 4.326000 +127766 3.660000 +127767 5.365000 +127768 3.490000 +127770 3.680000 +127771 3.956000 +127772 6.085000 +127773 4.604000 +127774 4.354000 +127776 6.170000 +127777 4.050000 +127778 3.886000 +127780 4.356000 +127785 5.025000 +127786 5.500000 +127787 5.790000 +127788 5.405000 +127789 2.546000 +127790 4.572000 +127791 5.215000 +127792 4.720000 +127793 3.282000 +127794 3.770000 +127795 5.395000 +127797 5.545000 +127799 3.438000 +127800 4.980000 +127801 3.040000 +127803 2.972000 +127804 3.340000 +127809 4.846000 +127810 4.810000 +127819 2.996000 +127820 3.484000 +127821 2.992000 +127822 3.464000 +127823 3.442000 +127824 3.490000 +127825 3.440000 +127826 3.380000 +127827 3.486000 +127828 3.498000 +127830 3.152000 +127831 4.096000 +127833 4.216000 +127834 0.938000 +127836 4.484000 +127837 4.242000 +127838 4.170000 +127853 3.758000 +127855 4.310000 +127858 4.336000 +127860 4.530000 +127861 4.260000 +127862 4.410000 +127863 4.408000 +127864 4.338000 +127866 4.262000 +127867 3.376000 +127868 3.710000 +127870 3.798000 +127871 0.700000 +127872 3.754000 +127875 3.786000 +127876 4.102000 +127892 5.195000 +127913 0.660000 +127921 5.085000 +127924 4.782000 +127939 4.768000 +127941 3.766000 +127947 5.325000 +127948 2.644000 +127950 5.350000 +127977 1.220000 +127978 0.730000 +127979 0.672000 +127980 0.660000 +127981 1.156000 +127982 0.994000 +127983 0.994000 +127984 0.950000 +127985 1.010000 +127986 1.022000 +127999 6.760000 +128001 7.070000 +128002 7.370000 +128006 3.472000 +128009 4.134000 +128012 3.054000 +128013 4.970000 +128014 3.020000 +128015 3.132000 +128016 5.295000 +128017 3.304000 +128160 2.132000 +128161 1.753000 +128162 2.326000 +128163 5.710000 +128164 5.480000 +128165 5.470000 +128166 5.475000 +128167 5.525000 +128168 1.127000 +128169 5.505000 +128170 5.500000 +128171 5.965000 +128172 5.860000 +128180 0.676000 +128185 0.670000 +128187 5.510000 +128188 5.505000 +128189 5.530000 +128190 5.535000 +128191 5.485000 +128192 5.510000 +128193 5.510000 +128195 5.575000 +128196 5.590000 +128197 5.710000 +128203 5.540000 +128206 5.700000 +128207 5.710000 +128212 5.615000 +128213 5.560000 +128218 1.742000 +128219 3.235000 +128222 3.510000 +128223 4.580000 +128224 3.024000 +128225 0.818000 +128226 3.003400 +128227 3.013000 +128229 3.006600 +128230 3.004400 +128231 3.008400 +128232 3.004600 +128233 0.828000 +128247 4.732000 +128256 5.005000 +128257 4.882000 +128258 1.810000 +128261 4.106000 +128267 4.398000 +128274 1.610000 +128275 1.624000 +128277 3.378000 +128281 3.472000 +128282 3.718000 +128284 3.602000 +128287 2.881000 +128288 4.690000 +128289 3.248000 +128290 2.847000 +128293 4.566000 +128295 3.132000 +128296 3.024000 +128297 4.634000 +128298 4.538000 +128299 4.754000 +128300 4.756000 +128301 4.694000 +128308 3.578000 +128309 4.576000 +128310 4.506000 +128311 3.324000 +128317 1.055000 +128318 0.708000 +128319 1.101000 +128320 1.050000 +128321 1.034000 +128322 1.032000 +128323 1.013000 +128324 1.019000 +128327 1.050000 +128328 1.039000 +128329 0.570000 +128340 3.194000 +128341 3.466000 +128357 3.316000 +128358 2.745000 +128360 4.348000 +128361 4.324000 +128362 3.966000 +128364 4.684000 +128365 3.578000 +128367 5.065000 +128368 2.520000 +128369 3.670000 +128374 4.854000 +128378 4.672000 +128398 5.972000 +128400 6.280000 +128402 6.248000 +128404 5.578000 +128406 6.830000 +128409 5.846000 +128410 6.995000 +128413 7.205000 +128414 7.130000 +128415 7.140000 +128416 7.200000 +128422 3.260000 +128423 3.370000 +128424 3.424000 +128425 3.218000 +128426 4.034000 +128427 3.288000 +128429 3.966000 +128431 2.992000 +128433 2.958000 +128437 2.950000 +128438 3.572000 +128440 4.414000 +128441 2.988000 +128443 3.860000 +128449 0.544000 +128450 5.000000 +128451 3.618000 +128452 2.970000 +128453 2.944000 +128454 2.788000 +128467 5.845000 +128468 5.875000 +128471 5.870000 +128472 5.935000 +128473 5.645000 +128474 4.868000 +128475 5.420000 +128476 4.532000 +128477 4.950000 +128478 4.520000 +128479 4.678000 +128482 4.975000 +128483 5.340000 +128488 2.010000 +128496 5.515000 +128499 5.325000 +128500 5.520000 +128502 5.330000 +128503 5.490000 +128504 3.632000 +128505 5.510000 +128506 4.318000 +128507 5.085000 +128510 5.215000 +128511 3.592000 +128512 5.375000 +128519 4.084000 +128520 5.165000 +128521 3.140000 +128527 5.160000 +128528 3.248000 +128529 1.015000 +128530 5.155000 +128531 1.222000 +128533 4.042000 +128534 5.125000 +128537 5.295000 +128538 5.210000 +128541 5.165000 +128542 5.155000 +128543 3.048000 +128544 5.310000 +128545 3.604000 +128547 3.762000 +128548 3.418000 +128549 5.415000 +128568 5.405000 +128575 6.095000 +128576 6.355000 +128577 6.335000 +128588 4.955000 +128596 4.736000 +128611 2.855000 +128616 2.066500 +128618 2.093500 +128628 1.602000 +128637 4.368000 +128638 4.480000 +128639 4.640000 +128640 3.027000 +128641 3.004200 +128642 3.006200 +128643 3.006400 +128644 3.009400 +128645 1.922000 +128646 3.002600 +128855 2.673000 +128857 2.593000 +128860 1.777000 +128861 2.670000 +128862 2.660000 +128865 4.514000 +128866 4.548000 +128867 3.236000 +128879 0.550000 +128881 0.568000 +128882 0.576000 +128886 0.512000 +128889 0.506000 +128890 2.470000 +128891 3.154000 +128892 2.439000 +128893 2.633000 +128894 2.798000 +128895 4.915000 +128896 4.935000 +128897 6.225000 +128898 5.095000 +128899 5.970000 +128900 2.880000 +128901 6.220000 +128902 2.607000 +128903 5.390000 +128909 3.712000 +128920 0.968000 +128937 4.346000 +128938 4.308000 +128939 4.130000 +128940 3.606000 +128941 3.174000 +128942 6.030000 +128943 6.145000 +128946 4.888000 +128947 3.374000 +128948 3.360000 +128949 3.438000 +128950 3.092000 +128951 6.035000 +128952 2.715000 +128954 6.180000 +128961 6.175000 +128963 6.265000 +128966 4.292000 +128967 3.408000 +128968 4.566000 +128969 5.935000 +128970 5.870000 +128971 4.458000 +128972 4.550000 +128975 1.824000 +128976 3.598000 +128977 5.520000 +128979 3.104000 +128986 4.640000 +128988 5.435000 +128989 5.460000 +128990 5.455000 +128991 5.475000 +128992 5.420000 +128993 5.430000 +128995 5.045000 +128996 5.425000 +128997 5.420000 +128998 5.420000 +128999 5.435000 +129041 5.540000 +129045 5.550000 +129053 1.807000 +129055 5.155000 +129056 2.447000 +129057 5.295000 +129063 4.955000 +129064 4.930000 +129092 0.500000 +129093 0.502000 +129096 2.960000 +129097 6.640000 +129104 3.322000 +129121 0.718000 +129123 5.140000 +129138 5.670000 +129149 4.816000 +129154 3.431000 +129158 0.850000 +129159 0.635000 +129162 4.268000 +129163 5.965000 +129164 3.834000 +129165 4.142000 +129166 3.762000 +129171 5.145000 +129172 5.075000 +129173 5.190000 +129174 0.522000 +129175 5.280000 +129177 5.400000 +129179 5.170000 +129181 5.300000 +129182 6.325000 +129187 2.444000 +129188 2.416000 +129189 5.970000 +129190 5.765000 +129191 4.414000 +129192 4.576000 +129193 5.215000 +129196 5.620000 +129197 3.906000 +129198 5.500000 +129200 5.810000 +129201 5.940000 +129203 4.048000 +129204 5.485000 +129205 4.014000 +129206 5.605000 +129207 2.936000 +129208 3.674000 +129218 5.245000 +129219 0.630000 +129222 0.910000 +129227 3.062000 +129231 3.976000 +129243 3.060000 +129259 2.882000 +129270 2.635000 +129271 6.405000 +129280 3.606000 +129281 2.592000 +129288 4.436000 +129289 3.416000 +129290 4.662000 +129291 3.512000 +129295 1.848000 +129297 4.686000 +129298 1.738000 +129301 1.719000 +129305 2.992000 +129306 1.835000 +129308 3.120000 +129309 2.723000 +129312 2.738000 +129322 5.645000 +129323 5.800000 +129326 5.880000 +129327 5.605000 +129328 5.550000 +129329 5.645000 +129330 5.780000 +129331 5.775000 +129395 5.915000 +129397 5.620000 +129407 5.970000 +129408 6.300000 +129415 4.408000 +129416 4.554000 +129417 3.652000 +129424 3.580000 +129428 2.845000 +129429 6.390000 +129433 2.889000 +129439 3.606000 +129443 0.640000 +129446 4.554000 +129447 5.415000 +129452 2.539000 +129467 0.936000 +129471 0.674000 +129472 0.642000 +129484 2.605000 +129485 2.542000 +129486 2.643000 +129489 3.336000 +129490 3.220000 +129491 3.448000 +129492 5.170000 +129493 5.660000 +129494 4.985000 +129495 4.590000 +129496 5.535000 +129501 2.663000 +129502 6.030000 +129516 6.260000 +129517 5.990000 +129518 5.885000 +129526 6.245000 +129539 3.496000 +129540 4.070000 +129551 2.239500 +129552 2.241500 +129553 2.264500 +129554 2.187000 +129559 5.305000 +129561 5.785000 +129562 4.250000 +129563 5.090000 +129564 3.558000 +129566 2.850000 +129567 4.164000 +129568 4.580000 +129569 5.330000 +129570 5.510000 +129582 4.782000 +129584 5.080000 +129595 0.568000 +129598 0.554000 +129600 0.552000 +129602 2.889000 +129603 2.298000 +129605 1.615000 +129612 2.119000 +129614 1.898000 +129618 2.200000 +129619 2.012000 +129620 2.016000 +129637 6.355000 +129643 5.185000 +129647 5.615000 +129662 3.844000 +129663 3.948000 +129664 3.628000 +129683 3.648000 +129694 4.775000 +129696 3.180000 +129697 3.535000 +129698 3.755000 +129699 3.725000 +129700 2.009000 +129701 2.005000 +129702 2.003800 +129703 2.004800 +129704 2.008400 +129705 2.003800 +129706 2.004800 +129707 2.005800 +129708 3.725000 +129709 2.006200 +129723 3.060000 +129724 4.796000 +129727 5.545000 +129731 5.535000 +129732 5.525000 +129737 0.864000 +129739 3.186000 +129740 5.185000 +129741 4.814000 +129742 4.654000 +129743 2.507000 +129744 3.336000 +129745 5.765000 +129746 2.837000 +129747 3.628000 +129748 3.794000 +129749 3.880000 +129750 4.808000 +129751 1.535000 +129752 5.120000 +129753 1.917000 +129754 4.854000 +129755 3.266000 +129756 1.679000 +129757 2.645000 +129758 2.942000 +129759 1.853000 +129760 5.350000 +129761 5.890000 +129762 2.395000 +129763 2.277000 +129764 4.854000 +129765 5.625000 +129766 5.395000 +129767 4.426000 +129768 2.864000 +129775 0.506000 +129776 0.754000 +129777 3.608000 +129779 1.037000 +129780 2.623000 +129781 2.303000 +129782 3.434000 +129783 2.599000 +129784 3.214000 +129787 3.654000 +129789 3.718000 +129790 1.979000 +129792 1.881000 +129794 1.061000 +129795 1.068000 +129797 3.634000 +129798 3.740000 +129799 1.916000 +129804 5.360000 +129821 3.378000 +129848 1.032000 +129853 0.916000 +129854 0.980000 +129855 0.653000 +129856 0.892000 +129857 0.637000 +129858 0.646000 +129859 0.645000 +129860 1.015000 +129861 0.689000 +129862 1.017000 +129863 0.949000 +129867 2.686000 +129868 2.261000 +129869 3.004500 +129870 2.823500 +129871 3.151000 +129888 3.110000 +129889 3.996000 +129890 4.488000 +129891 5.050000 +129893 5.015000 +129894 5.500000 +129895 5.475000 +129900 4.124000 +129922 4.206000 +129923 4.170000 +129925 1.530000 +129939 3.952000 +129940 4.762000 +129944 4.510000 +129946 1.967000 +129947 3.968000 +129948 3.220000 +129949 3.988000 +129950 3.270000 +129951 3.346000 +129952 3.452000 +129953 2.823000 +129955 3.510000 +129956 3.438000 +129957 3.136000 +129959 3.632000 +129960 2.319000 +129961 2.674000 +129962 2.645000 +129963 4.336000 +129964 1.685000 +129965 2.388000 +129966 3.166000 +129967 2.701000 +129968 2.719000 +129969 3.118000 +129970 4.784000 +129971 3.356000 +129973 3.302000 +129974 3.258000 +129979 2.938000 +129980 2.289000 +129989 5.025000 +129990 5.915000 +129996 3.540000 +129998 4.694000 +129999 3.678000 +130000 5.810000 +130001 5.565000 +130002 5.815000 +130004 5.600000 +130005 5.820000 +130007 5.845000 +130011 4.826000 +130053 2.848000 +130054 3.552000 +130055 3.420000 +130056 3.194000 +130058 2.892000 +130059 2.934000 +130060 2.994000 +130061 4.314000 +130062 4.294000 +130092 5.070000 +130095 4.940000 +130096 2.850000 +130097 4.716000 +130098 4.510000 +130099 4.510000 +130100 4.979000 +130101 4.937000 +130102 4.556000 +130103 4.852000 +130104 4.876000 +130105 4.962000 +130106 4.939000 +130107 4.944500 +130112 4.424000 +130113 4.146000 +130114 4.194000 +130115 4.694000 +130116 4.668000 +130117 4.164000 +130118 4.122000 +130119 4.088000 +130120 4.096000 +130121 4.136000 +130122 4.124000 +130123 4.112000 +130124 4.088000 +130125 4.314000 +130126 4.290000 +130127 4.284000 +130128 4.296000 +130129 4.226000 +130130 4.268000 +130131 4.096000 +130132 4.094000 +130133 4.528000 +130134 4.872000 +130135 4.208000 +130138 6.265000 +130139 3.224000 +130140 3.596000 +130144 5.705000 +130145 5.700000 +130146 3.742000 +130147 5.495000 +130148 5.490000 +130149 4.696000 +130152 5.450000 +130153 5.345000 +130154 5.935000 +130157 3.008800 +130158 2.162000 +130160 1.506200 +130161 1.505200 +130163 1.504000 +130164 1.503400 +130165 1.504800 +130169 1.724000 +130172 2.962000 +130173 2.816000 +130174 3.040000 +130175 2.966000 +130177 4.796000 +130178 4.602000 +130179 4.925000 +130180 4.905000 +130181 4.884000 +130182 4.756000 +130239 0.948000 +130240 0.948000 +130241 0.948000 +130242 0.948000 +130243 0.948000 +130244 0.948000 +130245 0.948000 +130246 0.948000 +130247 0.948000 +130248 0.948000 +130249 0.948000 +130250 0.948000 +130251 0.948000 +130253 0.948000 +130254 0.948000 +130255 0.948000 +130256 0.948000 +130257 0.948000 +130258 0.948000 +130259 0.948000 +130260 0.948000 +130261 0.948000 +130262 0.948000 +130263 0.948000 +130264 0.948000 +130265 0.948000 +130266 0.948000 +130267 0.948000 +130268 0.946000 +130269 0.948000 +130270 0.948000 +130271 0.948000 +130272 0.948000 +130274 0.948000 +130275 0.948000 +130276 0.948000 +130278 0.948000 +130279 0.948000 +130280 0.948000 +130281 0.948000 +130282 0.946000 +130283 0.948000 +130639 0.528000 +130640 0.532000 +130662 2.638000 +130663 3.432000 +130664 3.416000 +130665 3.152000 +130666 0.900000 +130667 1.873000 +130668 1.696000 +130669 2.399000 +130672 2.509000 +130673 4.222000 +130675 4.364000 +130679 5.120000 +130685 3.294000 +130698 4.256000 +130699 3.578000 +130704 5.510000 +130705 0.684000 +130706 5.545000 +130707 5.380000 +130708 5.315000 +130709 5.360000 +130710 5.335000 +130711 4.520000 +130712 5.410000 +130713 5.400000 +130714 5.445000 +130715 5.250000 +130716 3.504000 +130717 3.150000 +130732 0.596000 +130738 3.928000 +130739 2.123000 +130744 5.015000 +130760 1.724000 +130761 6.025000 +130763 5.110000 +130862 0.514000 +130863 0.548000 +130864 1.791000 +130865 4.576000 +130866 5.255000 +130867 1.246000 +130883 1.836000 +130889 4.840000 +130892 5.105000 +130893 5.095000 +130894 5.070000 +130896 5.110000 +130897 5.115000 +130898 2.906000 +130899 3.414000 +130900 3.738000 +130901 3.758000 +130902 3.780000 +130903 0.918000 +130904 1.405000 +130905 3.708000 +130906 3.456000 +130920 2.896000 +130930 3.240000 +130933 3.430000 +130935 4.104000 +131001 4.046000 +131005 3.826000 +131006 3.598000 +131010 0.876000 +131058 5.095000 +131059 5.105000 +131071 4.768000 +131073 4.268000 +131074 0.892000 +131075 0.614000 +131076 0.860000 +131077 4.646000 +131078 4.124000 +131088 4.138000 +131089 4.084000 +131092 4.300000 +131093 4.228000 +131094 3.368000 +131095 0.734000 +131096 3.062000 +131097 3.028000 +131098 3.034000 +131099 5.085000 +131100 3.662000 +131101 1.500000 +131102 4.106000 +131103 4.646000 +131104 3.204000 +131105 3.234000 +131108 1.817000 +131109 3.396000 +131110 1.737000 +131111 1.148000 +131112 5.825000 +131113 3.702000 +131134 4.644000 +131143 4.072000 +131144 4.322000 +131145 2.529000 +131146 2.604000 +131147 2.535000 +131148 5.595000 +131149 6.020000 +131153 3.374000 +131154 1.938000 +131156 1.756000 +131164 2.591000 +131165 0.568000 +131166 0.622000 +131172 4.360000 +131173 4.316000 +131174 4.326000 +131175 4.400000 +131176 4.326000 +131177 4.334000 +131188 2.051000 +131191 4.012000 +131193 3.618000 +131195 2.875000 +131197 3.424000 +131200 2.689000 +131202 3.354000 +131207 4.242000 +131210 3.556000 +131213 5.565000 +131214 4.410000 +131216 4.604000 +131217 4.546000 +131218 4.442000 +131219 0.986000 +131220 4.438000 +131221 4.104000 +131222 4.058000 +131223 4.502000 +131224 3.814000 +131225 3.826000 +131226 3.742000 +131227 5.660000 +131228 3.764000 +131229 5.475000 +131230 5.800000 +131231 5.775000 +131248 1.211000 +131249 1.170000 +131250 2.075000 +131251 3.180000 +131252 3.514000 +131253 3.454000 +131254 3.515000 +131255 3.526500 +131256 3.388000 +131257 2.802500 +131258 2.920500 +131259 2.826000 +131260 2.924000 +131263 4.188000 +131264 4.222000 +131269 3.844000 +131270 3.200000 +131311 3.272000 +131340 4.494000 +131342 2.520000 +131343 2.025000 +131344 4.420000 +131348 4.260000 +131349 3.980000 +131350 4.266000 +131352 4.748000 +131354 4.965000 +131355 1.424000 +131356 3.116000 +131357 2.750000 +131358 2.754000 +131359 3.334000 +131360 4.214000 +131361 4.424000 +131364 5.035000 +131366 3.224000 +131367 5.155000 +131370 3.186000 +131371 5.175000 +131372 5.020000 +131375 1.137000 +131376 5.085000 +131381 5.475000 +131382 5.390000 +131387 5.215000 +131388 5.135000 +131390 5.195000 +131391 5.230000 +131393 5.525000 +131413 5.675000 +131414 4.648000 +131421 5.070000 +131433 4.408000 +131434 1.625000 +131435 4.985000 +131443 2.045000 +131449 5.570000 +131450 5.570000 +131464 2.287000 +131465 3.726000 +131469 1.647000 +131470 5.500000 +131471 3.444000 +131474 2.142000 +131476 5.545000 +131478 3.554000 +131479 3.128000 +131480 3.730000 +131481 5.720000 +131483 1.550000 +131484 5.590000 +131494 4.888000 +131495 2.998000 +131496 4.288000 +131498 5.015000 +131501 5.370000 +131502 4.632000 +131503 4.930000 +131504 5.150000 +131505 3.188000 +131506 2.757000 +131507 4.642000 +131508 5.085000 +131509 4.244000 +131510 4.925000 +131511 3.168000 +131512 4.066000 +131513 4.686000 +131514 5.015000 +131515 4.284000 +131516 4.104000 +131517 4.146000 +131518 4.306000 +131519 5.650000 +131522 5.525000 +131523 3.924000 +131524 3.604000 +131525 4.630000 +131527 3.004000 +131528 4.234000 +131529 2.768000 +131530 3.082000 +131531 4.070000 +131533 1.033000 +131534 1.608000 +131535 3.026400 +131536 3.015000 +131537 3.008000 +131538 3.006200 +131539 3.002800 +131540 3.002400 +131541 3.005200 +131542 1.140000 +131543 3.002400 +131544 3.004200 +131546 3.010600 +131547 0.510000 +131548 0.594000 +131549 3.960000 +131675 0.824000 +131680 0.726000 +131684 0.752000 +131685 0.728000 +131686 0.828000 +131687 0.784000 +131688 0.824000 +131700 1.178000 +131705 2.838000 +131720 2.956000 +131730 4.296000 +131743 3.224000 +131744 3.176000 +131772 5.135000 +131786 2.906000 +131787 2.468000 +131788 4.492000 +131789 1.840000 +131790 2.336000 +131791 2.278000 +131792 2.094000 +131793 2.182000 +131794 1.166000 +131795 1.964000 +131796 2.182000 +131797 2.434000 +131798 2.164000 +131799 2.864000 +131808 0.564000 +131809 3.734000 +131810 5.145000 +131811 3.596000 +131812 3.430000 +131813 2.047000 +131814 2.188000 +131823 5.085000 +131844 6.290000 +131847 5.095000 +131870 4.396000 +131871 3.966000 +131872 4.652000 +131873 4.852000 +131903 1.123000 +131904 5.410000 +131905 5.360000 +131908 5.255000 +131909 5.265000 +131911 5.340000 +131912 4.608000 +131914 4.718000 +131916 4.518000 +131936 4.214000 +131937 3.332000 +131941 3.494000 +131943 4.216000 +131944 5.520000 +131956 3.056000 +131970 4.874000 +131972 4.864000 +131973 4.858000 +131974 4.890000 +131995 5.690000 +131997 4.844000 +131998 0.980000 +131999 5.640000 +132001 5.715000 +132002 5.720000 +132004 4.846000 +132005 5.400000 +132007 2.443000 +132008 3.544000 +132009 5.735000 +132020 3.322000 +132021 3.084000 +132048 4.598000 +132049 6.090000 +132050 6.160000 +132054 5.220000 +132080 2.976000 +132086 2.170000 +132088 2.852000 +132089 3.711000 +132090 2.802000 +132091 2.599000 +132092 2.420000 +132100 5.405000 +132101 5.090000 +132102 4.418000 +132103 5.580000 +132104 4.536000 +132105 3.740000 +132106 3.420000 +132107 3.578000 +132109 3.692000 +132110 3.862000 +132111 3.562000 +132112 5.590000 +132113 3.942000 +132114 3.394000 +132115 4.058000 +132116 4.316000 +132117 4.082000 +132118 4.406000 +132119 3.822000 +132120 3.612000 +132121 3.888000 +132208 5.760000 +132209 6.275000 +132230 3.272000 +132231 3.148000 +132232 3.944000 +132233 6.050000 +132234 5.650000 +132235 5.750000 +132254 4.386000 +132277 2.777000 +132278 4.688000 +132283 1.888000 +132289 2.029000 +132291 1.917000 +132298 4.880000 +132314 5.325000 +132316 3.742000 +132322 1.244000 +132323 1.211000 +132324 0.844000 +132325 4.754000 +132326 1.487000 +132327 5.595000 +132328 5.570000 +132329 4.746000 +132330 3.746000 +132331 3.548000 +132332 3.752000 +132333 3.698000 +132337 4.504000 +132339 0.552000 +132342 0.548000 +132347 1.056000 +132351 5.675000 +132353 0.512000 +132365 1.881000 +132366 2.310000 +132369 2.660000 +132372 5.260000 +132375 4.955000 +132376 1.170000 +132378 1.076000 +132379 3.342000 +132383 3.012000 +132385 5.565000 +132386 1.130000 +132387 1.700000 +132393 2.161000 +132395 4.076000 +132396 4.024000 +132397 4.004000 +132404 1.932000 +132405 4.404000 +132408 2.671000 +132409 2.496000 +132410 4.430000 +132412 0.918000 +132413 0.914000 +132434 5.115000 +132437 6.265000 +132442 0.536000 +132458 2.744000 +132460 2.980000 +132462 5.655000 +132463 5.525000 +132464 5.495000 +132466 3.628000 +132469 5.025000 +132470 4.686000 +132472 3.278000 +132473 4.178000 +132474 4.424000 +132475 3.816000 +132476 4.930000 +132477 2.560000 +132479 3.648000 +132480 3.184000 +132488 3.995000 +132490 1.960000 +132495 1.899000 +132496 2.267000 +132497 2.814000 +132498 3.820000 +132499 3.796000 +132500 4.008000 +132501 1.695000 +132502 1.768000 +132510 5.700000 +132515 5.280000 +132529 0.508000 +132531 0.502000 +132541 4.330000 +132559 5.845000 +132560 5.965000 +132561 4.416000 +132562 5.855000 +132563 5.855000 +132564 5.870000 +132565 3.100000 +132566 5.815000 +132567 5.895000 +132568 5.830000 +132569 5.860000 +132570 5.840000 +132571 5.840000 +132572 5.925000 +132573 5.920000 +132574 5.840000 +132576 5.760000 +132577 5.860000 +132578 5.920000 +132579 5.860000 +132581 3.688000 +132582 5.885000 +132583 5.825000 +132584 5.860000 +132585 5.845000 +132586 2.386000 +132587 2.251000 +132591 5.670000 +132608 3.276000 +132616 5.325000 +132635 1.510000 +132636 1.191000 +132637 1.297000 +132638 1.183000 +132639 1.928000 +132640 3.548000 +132641 1.994000 +132642 2.165000 +132643 0.904000 +132644 1.129000 +132648 4.920000 +132649 2.884000 +132656 1.096000 +132657 2.443000 +132660 4.400000 +132661 4.394000 +132662 4.112000 +132663 4.052000 +132664 4.072000 +132665 4.040000 +132670 2.597000 +132671 2.425000 +132675 1.653000 +132677 4.332000 +132680 4.338000 +132682 3.048000 +132698 4.650000 +132706 1.690000 +132723 5.460000 +132724 3.594000 +132725 5.435000 +132726 5.190000 +132727 3.358000 +132728 5.915000 +132729 5.615000 +132730 5.790000 +132731 5.300000 +132732 5.320000 +132733 5.095000 +132734 5.200000 +132735 2.889000 +132736 1.914000 +132739 5.935000 +132741 5.950000 +132742 5.975000 +132743 6.015000 +132744 3.138000 +132745 3.688000 +132749 5.235000 +132750 3.552000 +132755 6.075000 +132757 6.110000 +132759 6.075000 +132762 6.105000 +132767 5.400000 +132768 5.265000 +132769 5.090000 +132770 5.135000 +132771 5.020000 +132772 5.010000 +132773 5.110000 +132774 5.125000 +132775 5.090000 +132776 4.930000 +132777 5.055000 +132778 4.935000 +132787 4.586000 +132788 5.745000 +132790 5.855000 +132795 2.219000 +132806 2.416000 +132807 3.188000 +132808 3.378000 +132809 2.445000 +132810 2.035000 +132811 3.577000 +132812 2.542000 +132817 2.340000 +132818 2.249800 +132819 2.009000 +132820 2.007000 +132821 1.018000 +132822 1.060000 +132823 2.007400 +132824 2.004800 +132825 2.004800 +132826 2.005600 +132827 2.005400 +132828 2.005200 +132829 2.009400 +132830 2.006400 +132831 2.008000 +132832 2.004400 +132833 1.006000 +132834 2.005200 +132835 2.005800 +132836 2.009600 +132837 2.004800 +132838 2.005600 +132839 1.046000 +132840 2.005600 +132841 2.005400 +132842 2.008800 +132909 5.920000 +132911 2.756000 +132912 4.965000 +132913 1.908000 +132914 3.874000 +132915 4.950000 +132916 4.598000 +132918 4.868000 +132924 3.220000 +132925 4.864000 +132928 4.970000 +132959 6.215000 +132975 3.914000 +132999 5.760000 +133000 0.816000 +133001 0.778000 +133002 0.800000 +133003 0.629500 +133004 0.606500 +133005 0.583500 +133006 0.828500 +133007 0.825500 +133008 0.585000 +133009 0.842500 +133010 0.824000 +133011 0.833500 +133012 0.836000 +133013 0.838000 +133014 0.795500 +133015 0.855500 +133017 0.774500 +133018 1.091000 +133019 1.078000 +133020 0.656000 +133021 0.992500 +133022 1.080000 +133023 1.087000 +133024 1.098000 +133025 0.686000 +133026 1.110000 +133027 0.635500 +133028 0.962500 +133035 6.210000 +133036 6.210000 +133037 6.260000 +133038 5.565000 +133040 6.120000 +133041 6.295000 +133042 3.254000 +133043 6.240000 +133044 6.295000 +133045 6.270000 +133046 6.220000 +133048 6.230000 +133049 6.230000 +133050 3.114000 +133053 6.180000 +133054 6.310000 +133056 6.335000 +133057 6.245000 +133058 5.780000 +133059 3.710000 +133060 5.360000 +133061 6.235000 +133062 6.215000 +133064 5.715000 +133065 5.625000 +133066 5.465000 +133067 5.605000 +133068 5.430000 +133077 5.660000 +133084 1.981000 +133085 1.836000 +133087 6.140000 +133099 0.596000 +133111 6.275000 +133112 1.334000 +133113 2.122000 +133114 1.797000 +133115 2.521000 +133116 2.732000 +133117 2.942000 +133122 2.368000 +133123 2.532000 +133124 2.862000 +133128 2.312000 +133129 2.268000 +133130 3.028000 +133131 1.908000 +133132 2.378000 +133133 2.603000 +133134 2.420000 +133137 5.680000 +133138 4.524000 +133139 2.853000 +133140 2.954000 +133141 2.286000 +133147 2.026000 +133148 2.632000 +133150 2.426000 +133151 2.467500 +133152 2.455000 +133153 2.225500 +133154 2.448000 +133155 2.350500 +133156 2.446000 +133157 2.061500 +133158 2.229000 +133159 2.859000 +133160 2.672000 +133161 3.335000 +133163 4.510000 +133164 4.036000 +133166 4.026000 +133195 4.888000 +133196 3.064000 +133205 5.505000 +133209 6.015000 +133224 1.358000 +133228 3.079000 +133231 3.146000 +133232 5.338000 +133233 4.009000 +133274 2.126000 +133275 2.280000 +133276 3.616000 +133308 3.150000 +133309 3.032000 +133313 3.052000 +133322 2.130000 +133323 2.606000 +133324 3.400000 +133325 2.982000 +133330 2.994000 +133337 5.065000 +133346 1.561000 +133347 1.420000 +133348 1.692000 +133349 1.747000 +133350 1.910000 +133356 5.120000 +133364 5.380000 +133370 2.980000 +133371 1.852000 +133372 1.905000 +133373 1.986000 +133375 4.965000 +133428 3.498000 +133431 0.502000 +133432 3.500000 +133433 4.076000 +133434 4.472000 +133435 4.786000 +133436 4.114000 +133437 4.872000 +133438 5.710000 +133444 1.799000 +133445 4.042000 +133446 5.465000 +133447 5.230000 +133448 5.840000 +133449 3.820000 +133450 4.072000 +133451 4.568000 +133453 4.454000 +133455 4.714000 +133456 4.248000 +133457 3.412000 +133458 2.382000 +133459 3.272000 +133460 3.400000 +133461 4.280000 +133462 6.065000 +133463 2.732000 +133464 3.536000 +133465 3.200000 +133467 4.370000 +133468 3.846000 +133469 3.928000 +133471 4.072000 +133472 3.858000 +133473 3.730000 +133477 4.530000 +133478 4.188000 +133479 3.814000 +133500 4.144000 +133509 4.364000 +133510 4.250000 +133511 2.745000 +133512 6.295000 +133513 3.866000 +133514 6.415000 +133515 3.776000 +133516 3.284000 +133517 3.670000 +133518 2.685000 +133519 3.068000 +133521 3.622000 +133522 3.158000 +133523 3.608000 +133524 4.546000 +133539 4.870000 +133540 4.788000 +133546 5.215000 +133551 5.120000 +133553 3.544000 +133555 2.986000 +133557 5.030000 +133559 2.498000 +133560 2.822000 +133562 4.925000 +133573 5.235000 +133574 4.985000 +133575 4.560000 +133576 4.624000 +133577 4.500000 +133578 4.392000 +133579 4.686000 +133580 4.754000 +133581 5.245000 +133582 4.852000 +133583 3.728000 +133584 5.105000 +133586 1.218000 +133587 5.465000 +133589 5.470000 +133593 5.450000 +133605 5.500000 +133611 5.495000 +133616 5.500000 +133641 5.170000 +133642 3.094000 +133644 3.774000 +133645 3.636000 +133647 6.070000 +133648 2.618000 +133649 2.738000 +133650 6.005000 +133651 2.116000 +133652 6.140000 +133653 4.915000 +133654 6.375000 +133655 6.065000 +133657 6.175000 +133658 4.602000 +133659 5.475000 +133661 2.141000 +133698 2.050000 +133703 2.103000 +133708 3.964000 +133709 3.136000 +133711 5.050000 +133712 5.125000 +133713 5.470000 +133715 5.490000 +133716 5.485000 +133717 5.480000 +133718 5.495000 +133719 5.495000 +133720 5.535000 +133743 3.902000 +133744 4.128000 +133745 4.578000 +133746 4.748000 +133758 1.179000 +133759 4.012000 +133760 5.140000 +133761 5.395000 +133762 5.345000 +133763 5.340000 +133768 4.166000 +133777 4.548000 +133780 5.035000 +133782 3.308000 +133783 3.314000 +133784 4.935000 +133787 5.085000 +133792 3.974000 +133794 1.165000 +133795 3.336000 +133812 3.862000 +133817 4.410000 +133818 4.044000 +133819 4.730000 +133820 3.624000 +133823 3.576000 +133824 4.380000 +133825 4.404000 +133826 4.840000 +133827 3.244000 +133828 5.180000 +133831 5.030000 +133835 4.790000 +133837 2.673000 +133842 5.580000 +133855 5.715000 +133856 5.700000 +133857 5.780000 +133859 5.290000 +133860 5.220000 +133864 5.280000 +133865 3.566000 +133867 5.755000 +133869 2.287000 +133876 5.695000 +133878 4.108000 +133885 4.418000 +133886 4.038000 +133890 0.518000 +133893 4.140000 +133899 5.740000 +133902 2.566000 +133906 4.360000 +133909 7.165000 +133911 3.756000 +133912 4.416000 +133913 2.620000 +133914 4.370000 +133915 5.108000 +133916 5.260000 +133917 4.334000 +133918 4.482000 +133925 4.694000 +133927 5.360000 +133928 5.360000 +133929 5.395000 +133930 5.395000 +133938 5.395000 +133941 5.340000 +133945 5.320000 +133946 5.395000 +133947 5.385000 +133951 4.905000 +133952 5.400000 +133959 3.292000 +133974 0.894000 +133975 0.606000 +133976 0.622000 +133977 0.624000 +133978 1.134000 +133979 1.550000 +133983 5.335000 +133984 2.695000 +133997 1.792000 +133998 2.069000 +133999 2.543000 +134001 5.845000 +134006 2.986000 +134010 6.315000 +134014 5.845000 +134017 6.255000 +134022 1.071000 +134023 6.135000 +134044 0.586000 +134056 4.764000 +134061 4.940000 +134065 5.385000 +134067 5.390000 +134068 5.390000 +134084 5.855000 +134086 4.580000 +134088 5.470000 +134089 3.804000 +134092 3.658000 +134093 5.870000 +134096 5.175000 +134103 5.500000 +134120 4.128000 +134121 3.598000 +134125 2.675000 +134126 4.738000 +134127 4.382000 +134128 4.168000 +134130 4.544000 +134136 3.060000 +134154 5.605000 +134158 2.625000 +134159 6.215000 +134160 6.190000 +134161 1.151000 +134162 5.540000 +134163 1.419000 +134164 6.240000 +134165 6.210000 +134166 6.220000 +134167 6.220000 +134177 4.198000 +134184 1.561000 +134187 2.109000 +134190 4.470000 +134191 4.696000 +134192 4.438000 +134193 4.328000 +134194 4.196000 +134195 4.080000 +134214 6.005000 +134282 2.007400 +134283 2.008400 +134285 2.025600 +134286 2.007400 +134288 2.039400 +134290 2.024600 +134291 2.022000 +134292 2.019400 +134293 2.018600 +134294 2.019600 +134295 2.019400 +134296 2.019000 +134297 2.021000 +134298 2.022800 +134299 2.019000 +134300 2.021000 +134301 2.020200 +134302 2.019000 +134303 2.018600 +134304 2.021200 +134305 4.250000 +134306 5.645000 +134307 5.670000 +134308 5.710000 +134309 5.625000 +134320 3.008000 +134321 3.008400 +134322 3.506000 +134323 3.504000 +134324 3.230000 +134325 3.507400 +134326 2.004600 +134327 2.005200 +134328 0.502000 +134329 2.005400 +134330 2.006400 +134331 0.702000 +134332 1.504000 +134333 1.507200 +134334 1.504800 +134335 1.504800 +134336 1.505200 +134337 2.004000 +134338 1.916600 +134339 2.005200 +134340 2.005200 +134341 2.006200 +134342 1.995800 +134346 6.300000 +134370 3.546000 +134374 3.610000 +134383 1.627000 +134384 4.452000 +134392 0.804000 +134419 5.320000 +134420 5.315000 +134421 5.315000 +134422 5.320000 +134423 5.355000 +134424 5.380000 +134425 5.335000 +134426 5.530000 +134427 5.345000 +134429 5.305000 +134430 5.355000 +134431 5.395000 +134435 1.059000 +134449 4.094000 +134450 2.573000 +134451 5.765000 +134458 3.086000 +134459 5.000000 +134460 5.030000 +134461 3.652000 +134464 5.495000 +134465 5.500000 +134466 5.445000 +134467 5.430000 +134493 4.176000 +134494 4.708000 +134496 5.595000 +134499 4.454000 +134504 3.438000 +134525 0.522000 +134529 0.895000 +134532 4.626000 +134544 5.495000 +134547 4.616000 +134548 4.856000 +134549 5.480000 +134550 5.850000 +134553 5.560000 +134554 6.040000 +134555 5.055000 +134556 4.910000 +134558 4.856000 +134559 2.338000 +135121 2.654000 +135172 5.535000 +135185 1.133000 +135192 3.432000 +135193 3.094000 +135200 0.650000 +135201 0.616000 +135202 0.516000 +135217 5.200000 +135218 3.772000 +135219 0.644000 +135221 3.900000 +135223 4.754000 +135224 5.250000 +135231 1.774000 +135238 2.094000 +135239 3.314000 +135254 3.320000 +135255 1.314000 +135256 1.071000 +135257 0.872000 +135262 1.146000 +135265 1.151000 +135414 4.212000 +135415 5.265000 +135428 5.070000 +135430 4.935000 +135431 4.878000 +135432 4.895000 +135433 4.822000 +135436 1.539000 +135438 3.002000 +135439 2.671000 +135440 4.226000 +135451 5.185000 +135452 3.016000 +135453 3.552000 +135454 4.146000 +135455 5.105000 +135456 5.095000 +135457 5.170000 +135458 5.150000 +135460 1.253000 +135461 1.969000 +135462 1.662000 +135463 2.417000 +135464 3.030000 +135465 2.034000 +135466 4.082000 +135468 5.085000 +135469 3.258000 +135488 5.410000 +135496 3.876000 +135497 3.068000 +135498 5.105000 +135499 4.356000 +135500 4.354000 +135501 1.075000 +135502 0.592000 +135503 0.854000 +135504 0.596000 +135505 0.510000 +135506 0.616000 +135507 0.884000 +135508 3.894000 +135509 3.146000 +135520 4.330000 +135523 4.002000 +135527 3.590000 +135528 3.546000 +135530 4.082000 +135533 3.464000 +135535 3.292000 +135536 3.342000 +135537 3.068000 +135538 3.014000 +135541 5.950000 +135542 0.606000 +135544 5.015000 +135545 0.808000 +135546 4.788000 +135547 1.735000 +135548 1.715000 +135549 1.666000 +135550 1.637000 +135551 3.022000 +135552 3.428000 +135555 2.252000 +135559 5.275000 +135565 4.324000 +135579 2.173000 +135580 3.810000 +135581 2.646000 +135582 3.912000 +135583 4.078000 +135584 4.162000 +135585 3.652000 +135586 0.670000 +135587 0.796000 +135588 0.636000 +135589 2.154000 +135590 0.850000 +135591 1.796000 +135599 4.058000 +135600 4.536000 +135602 4.430000 +135651 0.690000 +135655 0.710000 +135656 0.720000 +135657 0.662000 +135659 0.548000 +135660 0.602000 +135661 1.067000 +135662 1.084000 +135663 1.171000 +135664 3.848000 +135665 0.582000 +135690 1.243000 +135707 4.806000 +135708 4.676000 +135709 4.404000 +135710 4.210000 +135721 5.100000 +135723 4.250000 +135724 5.220000 +135732 5.475000 +135734 3.024000 +135735 2.125000 +135736 1.908000 +135738 2.833000 +135742 5.450000 +135748 4.844000 +135749 4.496000 +135750 2.798000 +135754 2.719000 +135755 2.507000 +135757 2.495000 +135766 4.490000 +135772 2.712000 +135773 3.230000 +135775 2.487000 +135781 3.011600 +135783 2.606000 +135784 3.007000 +135785 2.467000 +135787 3.009600 +135788 2.134000 +135789 1.909000 +135790 3.007200 +135791 3.006800 +135792 3.006000 +135793 3.006000 +135794 2.008200 +135795 3.006600 +135796 3.007600 +135801 3.008000 +135814 4.945000 +135815 4.332000 +135819 1.106000 +135820 0.894500 +135821 0.503000 +135824 0.698000 +135825 0.692500 +135826 0.966500 +135843 3.769000 +135844 2.620000 +135845 2.571000 +135846 2.588000 +135847 2.946000 +135848 2.814000 +135849 3.117000 +135850 3.151000 +135851 4.277000 +135852 5.058000 +135856 0.524000 +135857 0.670000 +135861 5.005000 +135866 4.558000 +135868 3.684000 +135869 4.638000 +135871 1.038000 +135872 0.667500 +135873 0.681000 +135877 0.688500 +135878 0.702000 +135880 0.568000 +135881 0.541000 +135886 3.306000 +135887 3.506000 +135888 3.956000 +135889 3.632000 +135890 3.506000 +135894 1.910000 +135895 4.428000 +135899 3.798000 +135903 4.108000 +135906 5.284000 +135913 5.360000 +135914 4.612000 +135916 4.136000 +135917 5.580000 +135918 3.456000 +135919 4.276000 +135920 3.546000 +135922 4.012000 +135923 3.390000 +135924 4.332000 +135926 4.768000 +135927 2.414000 +135928 4.548000 +135929 5.120000 +135995 3.064000 +135996 3.460000 +135997 3.386000 +135999 3.296000 +136001 5.795000 +136009 5.045000 +136012 4.180000 +136014 3.626000 +136015 3.094000 +136019 5.290000 +136023 2.964000 +136024 1.218000 +136025 1.182000 +136026 2.639000 +136027 2.512000 +136028 2.234000 +136029 2.411000 +136030 1.384000 +136031 2.158000 +136032 1.170000 +136033 1.170000 +136036 2.514000 +136037 5.790000 +136038 3.602000 +136039 3.090000 +136040 2.625000 +136041 2.668000 +136042 2.442000 +136043 2.460000 +136047 5.775000 +136055 5.770000 +136058 1.443000 +136060 5.795000 +136063 1.437000 +136064 1.135000 +136065 1.081000 +136066 1.000000 +136067 5.830000 +136083 0.760000 +136086 5.305000 +136090 1.984000 +136094 4.384000 +136095 0.796000 +136096 2.821000 +136097 5.440000 +136109 0.689500 +136110 0.794000 +136111 0.702000 +136112 0.623000 +136113 0.569000 +136114 0.632000 +136115 1.220000 +136116 0.666500 +136117 0.669500 +136118 0.614000 +136120 0.917500 +136121 0.511000 +136123 0.687000 +136124 0.521000 +136125 0.601500 +136127 0.497500 +136129 0.507000 +136130 0.619000 +136131 0.554000 +136132 0.590000 +136133 0.638000 +136157 3.199800 +136158 4.368000 +136159 3.700000 +136160 3.748000 +136162 3.014800 +136163 3.015400 +136164 3.014600 +136165 3.010400 +136166 0.534000 +136167 0.592000 +136168 0.732000 +136169 2.104000 +136170 3.009800 +136172 1.620000 +136173 3.009600 +136174 3.010600 +136180 3.010000 +136181 3.015200 +136185 6.285000 +136191 3.390000 +136217 4.878000 +136218 5.565000 +136219 5.600000 +136220 5.375000 +136221 5.385000 +136223 5.280000 +136225 5.295000 +136226 4.250000 +136227 3.658000 +136228 4.098000 +136229 3.970000 +136230 4.004000 +136231 3.344000 +136232 2.681000 +136233 5.350000 +136234 5.555000 +136235 3.756000 +136236 3.728000 +136237 3.954000 +136238 3.540000 +136239 4.764000 +136240 3.524000 +136241 2.704000 +136242 2.859000 +136243 3.320000 +136244 3.576000 +136245 5.115000 +136251 2.275000 +136252 3.412000 +136253 3.896000 +136254 4.240000 +136255 4.440000 +136256 4.274000 +136257 4.202000 +136258 4.252000 +136259 4.400000 +136260 4.664000 +136261 4.682000 +136262 4.618000 +136263 4.864000 +136264 4.356000 +136265 4.614000 +136266 4.636000 +136267 4.584000 +136268 4.866000 +136269 4.880000 +136270 4.960000 +136271 4.866000 +136272 4.390000 +136273 4.740000 +136274 3.602000 +136275 3.530000 +136276 3.648000 +136277 4.474000 +136278 5.480000 +136281 1.451000 +136282 1.700000 +136283 5.206000 +136284 5.394000 +136285 5.206000 +136286 5.292000 +136287 4.802000 +136289 3.108000 +136290 2.185000 +136291 3.990000 +136292 3.158000 +136293 2.932000 +136294 3.144000 +136295 2.255000 +136296 4.372000 +136297 3.500000 +136304 6.170000 +136308 4.048000 +136309 4.352000 +136319 1.878000 +136324 3.966000 +136325 4.214000 +136328 1.720000 +136329 5.216000 +136330 0.604000 +136331 5.040000 +136335 6.100000 +136336 5.905000 +136337 6.110000 +136339 2.742000 +136340 3.068000 +136341 2.219000 +136342 2.665000 +136344 4.598000 +136346 2.508000 +136347 6.120000 +136348 6.055000 +136451 4.328000 +136453 2.277000 +136454 1.314000 +136457 2.517000 +136458 3.360000 +136460 4.048000 +136462 1.775000 +136463 3.134000 +136477 3.288000 +136478 3.060000 +136481 5.240000 +136482 3.300000 +136483 5.265000 +136484 5.265000 +136485 5.285000 +136486 1.570000 +136487 4.832000 +136488 5.320000 +136489 5.335000 +136492 5.430000 +136493 5.115000 +136494 5.425000 +136495 5.430000 +136496 5.115000 +136497 3.062000 +136498 5.160000 +136499 3.154000 +136500 3.154000 +136502 3.118000 +136509 5.010000 +136527 5.220000 +136529 5.435000 +136542 5.415000 +136543 1.246000 +136545 1.634000 +136547 1.493000 +136548 4.310000 +136549 5.135000 +136552 3.900000 +136554 3.566000 +136559 4.674000 +136560 4.134000 +136561 5.420000 +136562 4.446000 +136564 4.985000 +136579 5.090000 +136582 5.290000 +136583 5.230000 +136584 5.005000 +136585 5.335000 +136586 5.310000 +136588 5.270000 +136589 5.320000 +136590 2.863000 +136591 5.120000 +136592 1.766000 +136596 1.101000 +136598 2.482000 +136599 2.948000 +136613 1.719800 +136614 1.750000 +136615 1.759400 +136616 1.744400 +136617 1.761800 +136618 0.819000 +136619 1.380000 +136620 1.759200 +136621 0.963000 +136622 1.749000 +136623 1.765200 +136624 1.728600 +136625 1.760400 +136626 1.761000 +136627 1.757600 +136628 1.755600 +136629 1.731200 +136630 1.727600 +136631 1.778000 +136632 1.733200 +136633 1.731200 +136634 1.735400 +136635 1.733400 +136636 1.730800 +136637 1.725000 +136638 1.724800 +136639 1.724400 +136640 1.729600 +136641 1.719400 +136642 1.731000 +136643 1.732600 +136644 1.726200 +136645 1.719000 +136646 1.717600 +136647 1.717200 +136666 5.455000 +136667 5.505000 +136668 5.485000 +136674 5.535000 +136681 5.535000 +136682 5.540000 +136684 5.535000 +136685 5.480000 +136687 3.674000 +136695 4.888000 +136696 4.980000 +136699 0.750000 +136712 0.546000 +136716 4.390000 +136718 3.904000 +136719 4.722000 +136720 4.664000 +136721 4.658000 +136725 5.345000 +136727 5.365000 +136734 3.722000 +136737 1.504000 +136738 3.880000 +136747 2.940000 +136748 4.988000 +136750 2.462000 +136751 4.350000 +136752 4.332000 +136753 4.338000 +136754 4.642000 +136756 4.118000 +136760 4.456000 +136763 4.108000 +136765 4.436000 +136767 4.244000 +136772 4.014000 +136773 4.462000 +136776 4.624000 +136777 4.622000 +136778 5.780000 +136779 4.570000 +136780 3.536000 +136814 4.876000 +136816 5.945000 +136817 6.055000 +136819 5.940000 +136820 5.865000 +136821 4.628000 +136822 4.718000 +136828 5.360000 +136837 3.408000 +136841 4.320000 +136863 0.924000 +136864 1.003000 +136865 1.123000 +136866 1.400000 +136867 1.413000 +136868 1.415000 +136873 4.744000 +136876 3.250000 +136878 5.400000 +136880 5.410000 +136881 5.785000 +136882 1.511000 +136883 1.421000 +136884 2.200000 +136885 4.704000 +136886 5.400000 +136897 4.842000 +136906 5.305000 +136911 5.930000 +136912 6.000000 +136913 5.900000 +136914 5.905000 +136915 6.025000 +136916 5.885000 +136917 5.875000 +136918 5.880000 +136919 5.360000 +136920 5.950000 +136922 4.394000 +136945 5.235000 +136946 5.255000 +136947 5.255000 +136950 5.295000 +136951 5.295000 +136952 5.300000 +136953 5.305000 +136954 5.300000 +136955 5.285000 +136956 5.310000 +136957 5.300000 +136998 5.045000 +136999 5.005000 +137111 5.460000 +137113 2.910000 +137114 2.976000 +137115 3.370000 +137116 3.602000 +137120 3.608000 +137121 3.734000 +137123 3.224000 +137124 3.464000 +137125 0.844000 +137127 5.470000 +137128 0.852000 +137129 4.018000 +137132 1.074000 +137173 2.928000 +137175 5.455000 +137178 5.120000 +137182 4.062000 +137183 5.125000 +137184 4.724000 +137186 2.436000 +137187 5.105000 +137188 5.115000 +137195 1.965000 +137196 5.425000 +137198 5.100000 +137203 3.354000 +137204 4.554000 +137205 4.044000 +137206 4.800000 +137208 3.112000 +137209 3.444000 +137210 4.568000 +137211 4.398000 +137212 3.276000 +137213 3.372000 +137214 2.874000 +137215 4.618000 +137216 4.554000 +137217 2.876000 +137218 3.658000 +137219 3.626000 +137220 4.458000 +137222 4.030000 +137223 2.604000 +137230 4.336000 +137232 4.274000 +137233 4.636000 +137234 4.244000 +137257 5.245000 +137258 3.942000 +137259 2.607000 +137260 4.965000 +137263 4.106000 +137264 3.526000 +137265 5.145000 +137267 5.115000 +137282 5.400000 +137284 3.646000 +137287 5.400000 +137297 3.928000 +137298 4.038000 +137305 4.688000 +137363 4.334000 +137367 3.908000 +137368 2.072000 +137379 4.428000 +137399 4.552000 +137438 3.884000 +137448 0.599800 +137449 0.982000 +137479 6.060000 +137507 4.822000 +137508 4.822000 +137517 1.665000 +137523 1.165000 +137525 1.414000 +137526 1.460000 +137527 1.171000 +137528 1.121000 +137540 5.315000 +137569 3.222000 +137580 2.607000 +137582 0.636000 +137584 0.934000 +137585 3.308000 +137586 2.037000 +137600 2.003000 +137601 2.002800 +137602 2.004200 +137603 2.003000 +137604 2.004600 +137605 2.004000 +137606 2.002800 +137607 2.003600 +137608 2.004200 +137609 2.003200 +137610 2.004000 +137611 2.003000 +137612 2.004200 +137613 2.004200 +137614 2.004000 +137615 2.004200 +137616 2.004200 +137617 2.004600 +137618 2.003000 +137619 2.004200 +137620 2.003800 +137621 2.003800 +137622 0.649000 +137623 2.004000 +137624 2.003600 +137625 2.004200 +137865 4.890000 +137866 5.115000 +137869 4.888000 +137870 4.832000 +137871 4.844000 +137872 4.910000 +137873 4.930000 +137874 4.910000 +137875 4.945000 +137876 4.930000 +137877 4.945000 +137879 6.020000 +137882 5.205000 +137883 0.996000 +137884 4.774000 +137885 4.792000 +137886 4.174000 +137887 5.010000 +137888 4.985000 +137898 5.210000 +137900 5.390000 +137901 5.360000 +137912 5.310000 +137919 5.390000 +137920 5.315000 +137921 5.375000 +137922 5.370000 +137923 5.355000 +137924 5.360000 +137944 3.758000 +137946 3.902000 +137947 5.395000 +137948 5.385000 +137949 5.395000 +137952 5.290000 +137958 0.528000 +137960 4.820000 +137964 0.910000 +137966 2.026000 +137967 2.002000 +137968 2.002000 +137969 2.004000 +137970 2.001000 +137974 3.242000 +137975 2.984000 +137977 2.612000 +137978 2.908000 +137979 4.174000 +137980 5.840000 +137981 3.902000 +137982 2.998000 +137983 5.505000 +137984 3.304000 +137985 3.162000 +137986 5.360000 +137987 2.159000 +137988 2.924000 +137989 2.865000 +137990 1.800000 +137991 2.393000 +137992 1.798000 +137993 2.896000 +138000 5.995000 +138001 3.280000 +138002 6.195000 +138003 6.240000 +138004 5.375000 +138005 1.966000 +138006 4.950000 +138007 4.380000 +138008 6.200000 +138009 1.759000 +138010 5.660000 +138012 2.046000 +138013 2.946000 +138017 2.663000 +138019 2.589000 +138024 4.935000 +138027 4.812000 +138028 5.140000 +138029 5.015000 +138032 4.864000 +138033 4.736000 +138048 5.140000 +138106 4.418000 +138107 4.486000 +138108 4.086000 +138109 4.112000 +138110 5.065000 +138111 1.006000 +138112 4.220000 +138113 1.684000 +138114 5.020000 +138115 2.178000 +138116 2.778000 +138117 3.780000 +138118 3.506000 +138119 2.786000 +138120 5.180000 +138121 2.714000 +138122 2.581000 +138123 3.350000 +138124 4.570000 +138125 1.945000 +138126 2.061000 +138134 5.156000 +138139 4.280000 +138145 1.944000 +138148 5.074000 +138149 2.468000 +138150 2.060000 +138155 1.706000 +138156 0.622000 +138157 1.872000 +138158 0.696000 +138163 0.622000 +138164 2.003000 +138165 2.002600 +138166 2.004200 +138167 0.772000 +138168 0.744000 +138169 2.004200 +138170 2.003800 +138171 2.003800 +138172 2.004000 +138173 0.744000 +138174 2.002800 +138175 2.004000 +138176 2.002800 +138177 2.003400 +138178 2.004000 +138179 2.002800 +138180 2.003200 +138181 2.003000 +138182 2.003200 +138183 2.003200 +138195 3.014800 +138196 3.031600 +138197 3.006600 +138198 0.760000 +138202 0.764000 +138204 3.004200 +138205 3.220000 +138206 3.009800 +138207 3.003200 +138208 3.003800 +138209 3.189800 +138210 3.036600 +138212 2.998600 +138213 3.000200 +138217 4.360000 +138218 3.196000 +138224 3.832000 +138231 4.742000 +138232 4.562000 +138233 4.534000 +138238 4.010000 +138248 0.958000 +138249 3.400000 +138250 1.907000 +138251 1.824000 +138252 1.745000 +138253 1.579000 +138254 2.684000 +138255 1.969000 +138256 4.636000 +138259 4.326000 +138260 3.586000 +138261 2.928000 +138262 3.074000 +138263 3.114000 +138264 3.472000 +138265 2.922000 +138266 4.086000 +138267 4.420000 +138268 3.222000 +138269 2.567000 +138304 0.572000 +138306 3.746000 +138316 3.242000 +138331 4.000000 +138339 5.485000 +138346 4.486000 +138347 5.215000 +138348 3.706000 +138349 5.215000 +138350 4.634000 +138351 5.205000 +138352 5.970000 +138353 3.814000 +138354 4.690000 +138355 2.731000 +138356 4.486000 +138357 4.622000 +138361 4.200000 +138365 4.352000 +138373 2.696000 +138375 2.335000 +138376 2.116000 +138377 3.554000 +138378 5.090000 +138379 1.882000 +138388 3.820000 +138393 1.394000 +138398 3.742000 +138399 3.728000 +138401 4.772000 +138410 2.826000 +138412 0.534000 +138413 0.624000 +138414 0.626000 +138415 0.514000 +138416 0.508000 +138417 0.546000 +138418 0.556000 +138420 0.560000 +138421 0.528000 +138422 0.520000 +138423 0.594000 +138424 0.594000 +138425 0.534000 +138430 5.265000 +138433 5.790000 +138435 5.565000 +138436 2.787000 +138437 5.585000 +138438 1.188000 +138439 5.510000 +138440 2.970000 +138441 5.515000 +138442 3.186000 +138443 5.495000 +138444 2.061000 +138445 3.410000 +138446 5.655000 +138447 4.332000 +138448 5.685000 +138449 5.655000 +138450 5.695000 +138451 4.810000 +138452 2.801000 +138453 5.575000 +138465 5.785000 +138466 5.225000 +138467 5.525000 +138468 5.165000 +138469 5.165000 +138470 4.734000 +138471 5.425000 +138472 5.805000 +138473 5.820000 +138474 5.875000 +138478 5.840000 +138479 5.845000 +138483 1.916000 +138486 1.642000 +138501 3.021800 +138505 3.025000 +138506 1.092000 +138508 1.801000 +138509 3.215000 +138510 0.600000 +138511 0.714000 +138514 1.115000 +138517 2.002000 +138518 2.004000 +138519 2.004600 +138520 2.580000 +138521 2.004000 +138522 2.003000 +138523 1.503800 +138524 1.503600 +138525 1.503000 +138530 4.810000 +138534 2.361000 +138537 5.380000 +138540 6.255000 +138541 6.045000 +138544 6.300000 +138545 5.915000 +138546 6.320000 +138547 2.301000 +138549 1.350000 +138550 2.450000 +138552 3.966000 +138553 4.610000 +138554 5.405000 +138555 2.509000 +138556 4.146000 +138557 6.275000 +138558 4.456000 +138559 3.100000 +138560 5.405000 +138564 3.244000 +138566 5.370000 +138568 5.370000 +138571 5.400000 +138574 5.395000 +138576 5.390000 +138577 5.380000 +138586 4.462000 +138591 5.040000 +138593 4.516000 +138597 0.798000 +138598 4.538000 +138599 3.896000 +138600 3.468000 +138602 3.576000 +138603 3.924000 +138604 4.802000 +138605 3.674000 +138607 4.048000 +138608 3.540000 +138610 3.442000 +138612 4.038000 +138617 4.286000 +138619 5.325000 +138640 1.192000 +138643 3.030000 +138644 2.037000 +138646 2.025600 +138647 2.747000 +138649 2.014600 +138650 4.312000 +138652 3.350000 +138653 3.128000 +138654 3.798000 +138655 3.854000 +138659 4.562000 +138660 1.128000 +138666 1.683000 +138667 1.816000 +138668 2.864000 +138669 2.259000 +138670 1.796000 +138671 4.614000 +138672 4.522000 +138674 4.542000 +138679 4.810000 +138680 4.816000 +138683 4.704000 +138684 4.838000 +138685 5.218000 +138686 4.816000 +138687 4.930000 +138695 3.982000 +138696 0.554000 +138697 5.635000 +138700 1.597000 +138701 1.856000 +138702 4.935000 +138704 5.475000 +138710 4.094000 +138711 2.040000 +138715 4.222000 +138722 4.200000 +138723 4.114000 +138724 4.895000 +138727 1.578000 +138728 1.173000 +138729 1.190000 +138731 1.407000 +138733 0.598000 +138743 0.648000 +138744 0.960000 +138747 2.889000 +138748 2.555000 +138749 3.248000 +138750 3.090000 +138752 4.204000 +138755 5.085000 +138762 5.360000 +138764 3.702000 +138765 2.970000 +138766 2.922000 +138770 5.570000 +138775 3.558000 +138776 3.150000 +138777 2.840000 +138782 5.485000 +138785 1.689000 +138787 5.580000 +138788 5.090000 +138790 4.504000 +138791 3.104000 +138793 1.934000 +138794 1.854000 +138800 4.224000 +138801 4.712000 +138802 4.740000 +138803 4.672000 +138804 2.033000 +138805 2.118000 +138806 2.756000 +138807 2.377000 +138808 2.704000 +138810 2.978000 +138811 5.142000 +138814 1.140000 +138815 5.774000 +138816 2.812000 +138817 2.256000 +138818 2.022000 +138822 4.728000 +138824 2.474000 +138825 5.266000 +138826 2.360000 +139296 4.804000 +139297 4.106000 +139298 4.524000 +139299 5.690000 +139300 5.455000 +139302 5.485000 +139307 5.465000 +139308 0.510000 +139309 5.565000 +139310 5.555000 +139311 5.530000 +139317 3.918000 +139318 3.684000 +139319 2.234000 +139320 5.695000 +139353 5.035000 +139354 5.005000 +139355 5.065000 +139378 5.215000 +139382 1.991000 +139385 4.188000 +139386 5.275000 +139388 5.295000 +139389 2.223000 +139401 5.160000 +139402 4.434000 +139405 5.300000 +139408 2.604000 +139410 5.285000 +139411 5.285000 +139413 2.274000 +139436 1.939000 +139438 5.145000 +139439 4.544000 +139442 3.230000 +139443 4.392000 +139444 3.480000 +139445 3.968000 +139448 5.140000 +139449 3.676000 +139450 5.095000 +139451 5.175000 +139453 4.995000 +139459 4.622000 +139463 1.983000 +139470 0.544000 +139471 4.786000 +139497 5.540000 +139512 1.979000 +139513 3.308000 +139514 3.688000 +139515 5.035000 +139516 3.940000 +139517 3.342000 +139518 3.556000 +139519 4.542000 +139520 3.612000 +139521 2.638000 +139522 4.840000 +139523 3.582000 +139524 2.626000 +139525 3.500000 +139526 2.253000 +139527 2.055000 +139528 2.231000 +139530 3.990000 +139531 4.124000 +139532 4.658000 +139533 2.819000 +139534 4.106000 +139535 5.030000 +139536 4.670000 +139537 5.240000 +139538 5.005000 +139545 3.908000 +139546 4.356000 +139547 4.046000 +139548 3.548000 +139550 0.916000 +139551 4.234000 +139552 1.891000 +139553 3.332000 +139554 3.808000 +139555 2.904000 +139556 1.927000 +139557 3.710000 +139558 3.570000 +139559 3.594000 +139560 5.205000 +139563 3.690000 +139566 1.907000 +139567 1.660000 +139568 3.746000 +139571 3.500000 +139572 3.114000 +139573 2.789000 +139584 4.930000 +139585 5.130000 +139586 5.320000 +139587 4.006000 +139590 6.170000 +139591 5.205000 +139592 3.968000 +139593 6.405000 +139594 5.750000 +139595 5.975000 +139596 5.505000 +139597 5.945000 +139598 4.068000 +139599 4.566000 +139608 5.130000 +139610 2.559000 +139612 0.908000 +139613 2.371000 +139623 3.730000 +139624 2.017600 +139627 3.464000 +139628 3.370000 +139629 2.005400 +139630 3.476000 +139631 2.011200 +139632 3.944000 +139633 1.812000 +139634 3.944000 +139637 4.020000 +139638 2.008000 +139639 2.010400 +139660 5.460000 +139672 2.823000 +139681 5.580000 +139687 0.912000 +139694 2.541000 +139696 5.975000 +139697 5.840000 +139698 5.855000 +139699 5.840000 +139700 5.850000 +139701 5.850000 +139704 1.897000 +139705 2.116000 +139706 5.945000 +139709 5.810000 +139710 6.195000 +139712 5.940000 +139713 5.945000 +139717 6.195000 +139726 2.556000 +139727 2.570000 +139729 1.768000 +139730 5.310000 +139731 5.580000 +139732 5.585000 +139733 2.151000 +139734 5.640000 +139736 5.825000 +139737 5.885000 +139739 5.810000 +139741 5.735000 +139742 5.695000 +139743 4.026000 +139746 5.580000 +139759 3.112000 +139762 5.915000 +139763 1.643000 +139765 2.636000 +139766 3.600000 +139767 3.316000 +139770 5.655000 +139771 3.878000 +139774 4.756000 +139775 5.825000 +139776 4.980000 +139778 5.825000 +139779 3.966000 +139780 5.870000 +139781 5.580000 +139782 2.488000 +139786 5.835000 +139787 5.525000 +139803 1.537000 +139805 3.070000 +139806 5.100000 +139807 1.515000 +139808 1.898000 +139809 1.580000 +139810 1.896000 +139811 3.914000 +139812 3.008000 +139813 1.795000 +139814 1.699000 +139815 1.684000 +139818 4.652000 +139819 2.077000 +139820 5.105000 +139821 5.505000 +139822 6.110000 +139823 4.524000 +139824 2.410000 +139825 1.426000 +139826 1.576000 +139827 3.268000 +139828 2.730000 +139829 2.289000 +139830 2.603000 +139831 2.324000 +139832 1.024000 +139870 0.524000 +139871 5.180000 +139873 4.390000 +139874 3.988000 +139875 2.450000 +139886 5.200000 +139888 3.816000 +139889 3.764000 +139892 1.723000 +139903 0.666000 +139913 5.425000 +139914 4.666000 +139927 5.650000 +139932 5.455000 +139933 5.490000 +139934 5.540000 +139935 5.590000 +139936 5.495000 +139937 5.585000 +139941 5.525000 +139942 5.565000 +139946 5.475000 +139947 5.375000 +139948 5.510000 +139949 5.470000 +139951 2.407000 +139952 1.568000 +139954 5.125000 +139956 5.465000 +139959 5.620000 +139960 5.470000 +139961 6.090000 +139962 6.060000 +139963 5.630000 +139964 6.035000 +139965 5.540000 +139966 5.145000 +139967 5.415000 +139969 6.045000 +139975 1.834000 +139976 3.500000 +139977 4.930000 +139978 5.155000 +139979 4.880000 +139980 5.155000 +139981 4.882000 +139982 5.265000 +139986 4.706000 +139987 4.860000 +139988 4.935000 +139989 4.985000 +139990 4.562000 +139992 4.995000 +139993 3.308000 +139994 4.520000 +139996 2.459000 +140004 4.442000 +140005 4.810000 +140006 4.560000 +140007 4.476000 +140008 4.030000 +140009 5.230000 +140010 3.480000 +140011 2.779000 +140021 2.972000 +140022 3.872000 +140023 5.025000 +140024 3.918000 +140025 3.578000 +140026 3.012000 +140027 2.875000 +140028 3.998000 +140042 4.818000 +140043 3.822000 +140044 4.682000 +140046 4.410000 +140047 4.874000 +140051 5.750000 +140054 1.048000 +140055 5.655000 +140057 5.420000 +140058 3.590000 +140062 2.426000 +140079 4.074000 +140080 0.924000 +140081 0.966000 +140085 8.050000 +140088 8.045000 +140091 8.030000 +140098 3.862000 +140100 4.100000 +140101 4.014000 +140103 5.290000 +140104 5.070000 +140106 7.045000 +140107 7.050000 +140108 7.045000 +140109 7.090000 +140110 7.060000 +140115 7.035000 +140118 3.558000 +140119 3.892000 +140121 3.474000 +140123 1.476000 +140124 5.665000 +140125 1.446000 +140126 2.871000 +140127 2.926000 +140128 5.685000 +140130 5.765000 +140131 5.715000 +140132 4.228000 +140133 5.550000 +140139 4.402000 +140140 3.376000 +140143 4.660000 +140147 6.130000 +140148 6.170000 +140149 5.390000 +140152 5.205000 +140155 6.220000 +140157 6.170000 +140158 5.390000 +140159 3.910000 +140160 0.956000 +140161 5.695000 +140164 1.355000 +140167 4.874000 +140168 3.740000 +140171 5.185000 +140172 5.195000 +140173 5.695000 +140174 5.515000 +140176 5.535000 +140177 3.298000 +140186 4.368000 +140190 6.070000 +140194 4.300000 +140197 6.020000 +140201 5.375000 +140206 4.388000 +140207 4.540000 +140208 4.458000 +140212 5.365000 +140213 5.400000 +140217 4.114000 +140218 3.102000 +140231 5.550000 +140232 4.148000 +140233 2.303000 +140234 2.353000 +140237 3.970000 +140238 3.384000 +140239 3.068000 +140240 6.330000 +140243 3.910000 +140244 4.292000 +140245 2.841000 +140246 2.095000 +140247 1.660000 +140248 1.548000 +140249 1.227000 +140250 1.697000 +140251 4.698000 +140252 4.496000 +140253 2.968000 +140254 3.098000 +140255 2.436000 +140256 2.024000 +140257 1.815000 +140258 2.348000 +140259 3.060000 +140260 3.132000 +140261 3.424000 +140262 4.300000 +140263 4.326000 +140266 4.740000 +140267 4.002000 +140268 3.916000 +140269 4.614000 +140270 4.530000 +140271 3.868000 +140272 4.784000 +140275 2.405000 +140276 4.276000 +140277 3.548000 +140278 3.414000 +140279 3.762000 +140280 3.496000 +140282 2.581000 +140283 3.658000 +140284 4.472000 +140285 2.821000 +140286 2.572000 +140287 2.583000 +140288 2.972000 +140289 2.622000 +140290 1.678000 +140291 2.019000 +140292 2.575000 +140293 2.333000 +140294 4.792000 +140295 5.515000 +140296 5.360000 +140297 5.440000 +140298 5.400000 +140299 5.260000 +140330 2.990000 +140332 3.794000 +140333 5.456000 +140334 1.712000 +140335 1.700000 +140336 1.690000 +140341 2.768000 +140370 6.490000 +140371 6.484000 +140373 6.244000 +140380 1.088000 +140382 2.376000 +140385 3.138000 +140387 4.540000 +140395 4.230000 +140397 5.176000 +140399 5.210000 +140402 5.062000 +140403 4.478000 +140410 3.504000 +140425 6.055000 +140426 5.385000 +140439 5.990000 +140440 4.392000 +140444 5.955000 +140447 5.395000 +140459 5.295000 +140460 2.821000 +140461 1.469000 +140462 2.773000 +140463 1.507000 +140464 0.964000 +140466 3.256000 +140467 3.446000 +140468 3.672000 +140470 6.265000 +140472 6.390000 +140473 0.734000 +140474 0.924000 +140476 3.864000 +140505 5.755000 +140516 5.265000 +140517 5.255000 +140533 5.155000 +140546 0.589500 +140547 0.780500 +140548 0.777000 +140549 0.576000 +140550 0.587500 +140551 0.690500 +140552 0.785500 +140553 0.755000 +140554 0.785000 +140555 0.586000 +140556 0.628500 +140557 0.790500 +140558 0.849000 +140564 2.006600 +140565 2.006200 +140566 2.006600 +140567 2.005400 +140568 2.006200 +140569 1.726000 +140570 1.662000 +140571 2.004400 +140572 2.060200 +140573 2.004800 +140574 2.004800 +140575 2.004200 +140576 2.004600 +140577 2.065600 +140578 2.003600 +140579 2.004800 +140580 2.005200 +140581 2.005000 +140582 2.004400 +140583 2.004600 +140584 2.004800 +140586 2.005600 +140587 2.004600 +140588 2.004600 +140589 2.004800 +140595 4.836000 +140620 5.405000 +140621 5.405000 +140622 5.410000 +140623 5.405000 +140624 5.405000 +140625 5.410000 +140626 5.405000 +140640 4.744000 +140642 3.414000 +140644 4.214000 +140645 3.554000 +140646 3.760000 +140647 1.380000 +140649 4.812000 +140650 1.388000 +140652 4.000000 +140653 1.909000 +140658 5.220000 +140660 4.844000 +140664 5.640000 +140666 1.910000 +140670 5.385000 +140671 5.385000 +140672 5.385000 +140681 3.406000 +140694 3.416000 +140706 1.599000 +140711 3.032000 +140716 3.428000 +140728 0.696000 +140732 4.384000 +140733 3.458000 +140734 6.435000 +140735 3.200000 +140737 3.464000 +140739 6.325000 +140740 5.250000 +140741 5.105000 +140742 0.662000 +140748 6.065000 +140755 6.055000 +140762 4.022000 +140763 6.195000 +140764 2.543000 +140765 1.427000 +140766 3.190000 +140767 4.814000 +140768 4.802000 +140769 3.670000 +140770 2.459000 +140771 3.286000 +140772 4.434000 +140773 6.170000 +140774 4.604000 +140775 4.112000 +140776 2.644000 +140777 5.435000 +140778 2.790000 +140779 4.354000 +140780 4.362000 +140781 4.478000 +140782 2.389000 +140783 2.608000 +140784 2.958000 +140785 3.472000 +140786 3.768000 +140787 3.436000 +140788 3.922000 +140789 2.222000 +140790 4.340000 +140791 1.334000 +140792 4.860000 +140793 2.702000 +140794 5.310000 +140795 3.302000 +140796 2.752000 +140797 2.804000 +140798 3.084000 +140799 2.898000 +140800 2.040000 +140861 5.454000 +140863 5.170000 +140865 5.484000 +140867 5.296000 +140896 4.700000 +140898 4.152000 +140919 5.945000 +140921 5.085000 +140922 4.360000 +140923 4.438000 +140925 3.952000 +140926 6.390000 +140928 5.740000 +140930 5.295000 +140942 3.790000 +140943 3.250000 +140945 4.076000 +140947 4.146000 +140948 4.624000 +140949 3.040000 +140950 3.770000 +140951 2.306000 +140953 5.315000 +140955 4.314000 +140956 3.916000 +140957 3.082000 +140958 3.868000 +140959 4.482000 +140960 4.028000 +140961 3.572000 +140962 4.042000 +140963 2.074000 +140964 3.404000 +140965 3.524000 +140966 4.975000 +140967 3.394000 +140968 4.414000 +140969 3.332000 +140975 0.846000 +140976 1.172000 +140977 1.419000 +140978 2.906000 +140979 3.944000 +140980 4.428000 +140981 0.802000 +140982 2.605000 +140983 2.550000 +140984 1.946000 +140985 2.958000 +140986 2.012000 +140988 2.883000 +140989 3.940000 +140990 0.526000 +140991 0.588000 +140992 0.692000 +140993 0.760000 +140994 4.448000 +140995 3.144000 +140996 4.496000 +140997 3.300000 +140998 3.372000 +140999 2.026000 +141000 3.460000 +141001 2.630000 +141002 3.000000 +141003 2.342000 +141006 0.568000 +141010 3.714000 +141012 4.734000 +141025 4.192000 +141028 4.794000 +141030 4.134000 +141031 2.118000 +141032 2.354000 +141033 3.050000 +141034 2.988000 +141035 3.312000 +141036 2.942000 +141037 2.252000 +141038 2.460000 +141039 2.976000 +141040 2.902000 +141044 2.686000 +141047 3.256000 +141048 4.634000 +141049 3.432000 +141050 4.980000 +141051 5.020000 +141052 4.112000 +141053 4.732000 +141054 4.662000 +141055 5.135000 +141056 4.930000 +141057 2.513000 +141058 4.790000 +141059 4.965000 +141060 6.340000 +141061 5.280000 +141062 5.080000 +141063 5.120000 +141064 4.530000 +141065 5.440000 +141066 4.700000 +141078 4.890000 +141079 2.324000 +141082 4.004000 +141085 4.460000 +141086 4.956000 +141087 4.916000 +141088 4.932000 +141093 4.256000 +141097 1.862000 +141098 1.566000 +141099 1.606000 +141100 1.582000 +141101 1.918000 +141102 3.840000 +141103 3.146000 +141107 4.310000 +141108 4.750000 +141109 4.754000 +141110 4.486000 +141111 4.524000 +141112 4.376000 +141113 4.428000 +141114 4.282000 +141115 3.756000 +141116 3.868000 +141117 3.900000 +141119 4.480000 +141120 4.524000 +141121 4.296000 +141122 1.983000 +141123 4.870000 +141124 4.800000 +141125 4.224000 +141126 4.930000 +141127 5.540000 +141128 4.138000 +141129 5.815000 +141130 3.642000 +141131 3.146000 +141133 5.785000 +141151 4.012000 +141168 2.689000 +141172 4.492000 +141173 4.098000 +141174 3.902000 +141175 3.896000 +141176 4.048000 +141177 1.536000 +141178 1.650000 +141181 5.795000 +141186 6.120000 +141192 5.725000 +141193 6.130000 +141194 6.130000 +141235 0.679500 +141236 0.657500 +141237 0.651000 +141238 0.623000 +141239 0.648500 +141240 0.653500 +141242 0.644500 +141243 0.622000 +141265 4.645000 +141269 0.736500 +141299 2.063000 +141300 2.407000 +141301 2.094000 +141302 2.136000 +141303 2.127000 +141304 1.733000 +141305 1.757000 +141306 1.375000 +141307 1.690000 +141308 2.439000 +141309 1.732000 +141310 1.827000 +141311 1.691000 +141312 2.525000 +141314 2.582000 +141315 2.938000 +141316 1.935000 +141317 1.656000 +141318 1.716000 +141319 1.656000 +141324 4.636000 +141325 3.460000 +141326 4.042000 +141327 3.558000 +141329 4.344000 +141330 3.764000 +141331 3.468000 +141332 3.482000 +141333 3.350000 +141334 3.454000 +141335 4.332000 +141336 4.030000 +141337 3.402000 +141341 5.290000 +141343 5.275000 +141345 3.128000 +141346 3.150000 +141347 3.212000 +141348 2.781000 +141349 3.918000 +141350 3.336000 +141353 4.268000 +141355 5.270000 +141356 5.385000 +141358 4.494000 +141359 3.912000 +141360 3.676000 +141361 3.668000 +141362 4.590000 +141364 4.470000 +141367 4.414000 +141368 2.615000 +141369 4.314000 +141371 4.096000 +141372 4.818000 +141373 3.418000 +141374 3.806000 +141375 3.922000 +141376 2.750000 +141379 2.865000 +141382 0.524000 +141389 4.716000 +141390 5.120000 +141391 5.135000 +141393 1.289000 +141394 5.150000 +141396 2.492000 +141421 4.860000 +141434 4.940000 +141435 4.586000 +141436 4.306000 +141437 5.030000 +141439 4.850000 +141441 3.670000 +141442 4.070000 +141443 3.272000 +141447 4.710000 +141448 4.320000 +141450 4.858000 +141454 5.185000 +141456 4.796000 +141457 4.262000 +141459 5.680000 +141463 5.740000 +141465 4.102000 +141473 0.626000 +141491 5.575000 +141492 5.430000 +141493 2.452000 +141494 4.580000 +141495 3.804000 +141496 2.460000 +141497 2.397000 +141498 2.896000 +141500 2.340000 +141512 6.090000 +141521 1.527000 +141522 5.780000 +141524 6.400000 +141525 6.375000 +141526 6.420000 +141527 6.355000 +141536 5.575000 +141537 1.300000 +141539 1.298000 +141541 0.956000 +141543 0.948000 +141544 2.060000 +141549 4.995000 +141551 4.014000 +141567 4.614000 +141574 4.995000 +141579 1.848000 +141592 3.600000 +141610 1.008000 +141611 4.178000 +141613 5.380000 +141615 4.198000 +141616 4.940000 +141619 3.390000 +141621 4.558000 +141625 5.265000 +141626 5.025000 +141632 4.640000 +141633 4.598000 +141637 2.401000 +141639 4.556000 +141680 2.009000 +141710 3.444000 +141713 4.500000 +141715 5.195000 +141716 5.135000 +141717 5.370000 +141718 3.658000 +141732 2.984000 +141733 2.004000 +141734 2.004000 +141735 2.004200 +141736 2.004000 +141737 2.003800 +141738 2.004200 +141739 2.003600 +141740 2.004200 +141741 2.003600 +141742 2.003800 +141743 2.003400 +141744 2.003800 +141745 2.004000 +141746 2.004000 +141747 2.003800 +141748 2.003800 +141749 2.003800 +141751 2.003000 +141752 2.002800 +141753 2.003800 +141754 2.003200 +141755 2.003600 +141756 2.003600 +141757 2.003400 +141758 2.003600 +141759 2.004000 +141760 2.004000 +141821 4.380000 +141831 4.520000 +141836 3.172000 +141838 3.862000 +141843 5.720000 +141845 2.482000 +141846 3.062000 +141847 4.542000 +141848 3.858000 +141849 1.867000 +141850 3.810000 +141851 3.848000 +141852 5.100000 +141853 4.410000 +141855 4.404000 +141857 4.436000 +141876 6.060000 +141880 5.578000 +141882 5.712000 +141883 4.552000 +141885 5.428000 +141898 5.210000 +141899 5.270000 +141900 1.280000 +141901 1.069000 +141902 0.950000 +141903 0.644000 +141907 4.658000 +141908 4.560000 +141909 4.674000 +141910 4.672000 +141912 3.910000 +141914 3.848000 +141915 3.794000 +141916 4.074000 +141917 4.154000 +141918 4.196000 +141924 4.274000 +141957 2.008000 +141960 2.009000 +141963 2.011000 +141970 5.365000 +141971 5.445000 +141979 5.595000 +141980 5.310000 +141982 5.255000 +141983 5.360000 +141984 5.395000 +141988 5.900000 +141989 5.095000 +141990 5.115000 +141991 5.120000 +141992 5.355000 +141993 5.115000 +141995 5.160000 +141996 5.525000 +142001 2.343000 +142003 5.460000 +142004 5.680000 +142036 4.846000 +142037 4.610000 +142039 6.525000 +142040 6.045000 +142041 4.052000 +142042 4.356000 +142043 4.798000 +142044 3.786000 +142048 2.902000 +142050 3.452000 +142058 5.900000 +142059 5.980000 +142060 5.920000 +142061 5.910000 +142067 5.550000 +142068 4.864000 +142069 3.392000 +142072 3.378000 +142076 5.255000 +142086 3.554000 +142089 3.424000 +142090 3.592000 +142100 5.228000 +142101 5.254000 +142102 5.520000 +142113 2.634000 +142116 3.108000 +142138 2.006000 +142139 2.535000 +142140 2.005600 +142141 2.920000 +142142 2.005600 +142143 4.315000 +142144 2.007200 +142147 2.005400 +142149 2.006200 +142151 2.007000 +142153 2.015600 +142155 2.014200 +142157 2.008400 +142159 2.010400 +142161 2.010200 +142163 2.011600 +142165 2.009600 +142170 5.110000 +142205 1.725000 +142210 5.405000 +142219 4.468000 +142220 5.350000 +142221 4.925000 +142222 4.060000 +142225 3.828000 +142226 4.016000 +142227 3.274000 +142228 1.096000 +142229 1.027000 +142232 2.683000 +142233 4.248000 +142234 4.024000 +142235 4.372000 +142237 4.098000 +142238 6.010000 +142239 2.546000 +142241 5.345000 +142242 5.685000 +142243 5.250000 +142244 5.730000 +142250 5.270000 +142251 5.125000 +142252 4.668000 +142253 2.279000 +142255 2.735000 +142257 5.355000 +142271 0.746000 +142277 2.478000 +142278 2.763000 +142279 4.374000 +142280 1.289000 +142291 1.396000 +142296 5.695000 +142297 5.870000 +142298 5.875000 +142299 5.605000 +142300 5.610000 +142352 0.800000 +142353 0.780000 +142354 0.740000 +142407 5.215000 +142408 5.900000 +142410 4.418000 +142412 3.904000 +142415 4.132000 +142417 2.211000 +142420 3.936000 +142424 5.210000 +142458 7.805000 +142459 4.812000 +142461 5.002000 +142465 1.302000 +142466 1.298000 +142468 4.842000 +142469 4.876000 +142470 4.936000 +142471 4.934000 +142474 6.255000 +142482 1.315000 +142488 5.510000 +142490 5.680000 +142491 5.455000 +142587 5.685000 +142588 4.200000 +142589 4.856000 +142595 4.646000 +142597 3.044000 +142607 3.964000 +142609 5.190000 +142610 4.638000 +142611 4.126000 +142612 4.750000 +142613 5.485000 +142614 5.235000 +142617 5.520000 +142618 5.510000 +142620 5.235000 +142630 4.318000 +142633 3.682000 +142635 4.578000 +142646 3.598000 +142647 3.594000 +142648 5.250000 +142649 5.875000 +142653 3.968000 +142656 4.550000 +142657 5.280000 +142661 2.004000 +142662 2.005200 +142664 2.003400 +142667 2.003800 +142669 2.004200 +142673 2.059600 +142674 2.004000 +142675 2.003200 +142678 2.003200 +142687 2.003600 +142689 2.004000 +142690 2.003800 +142691 2.003400 +142692 2.004000 +142694 4.662000 +142695 3.994000 +142696 4.406000 +142699 5.155000 +142700 5.190000 +142701 5.260000 +142706 3.120000 +142707 2.003800 +142708 2.003600 +142711 2.003400 +142716 2.056200 +142719 2.157200 +142721 2.253400 +142727 2.004000 +142729 2.003400 +142730 2.003800 +142731 2.005800 +142733 2.003800 +142758 4.320000 +142760 5.550000 +142764 1.229000 +142765 1.274000 +142770 5.610000 +142771 5.350000 +142772 1.493000 +142775 6.310000 +142780 2.188000 +142781 2.394000 +142784 1.434000 +142785 5.915000 +142793 5.595000 +142877 4.738000 +143706 0.606000 +143707 1.506000 +143710 0.708000 +143711 1.032000 +143712 2.324000 +143722 3.156000 +143723 2.154000 +143734 5.056000 +143735 1.590000 +143738 5.472000 +143740 2.722000 +143744 5.488000 +143749 2.200000 +143766 1.649000 +143782 1.782000 +143835 5.015000 +143836 0.842000 +143838 0.918000 +143874 1.831000 +143878 1.371000 +143879 1.878000 +143882 1.767000 +143883 1.791000 +143886 1.820000 +143888 4.336000 +143895 0.542000 +143896 5.545000 +143969 4.700000 +143970 4.866000 +143971 4.676000 +143974 4.888000 +143975 4.810000 +143999 3.500000 +144002 3.420000 +144003 4.392000 +144023 5.610000 +144024 4.228000 +144025 3.200000 +144032 5.925000 +144060 2.492000 +144063 4.930000 +144064 4.402000 +144066 4.614000 +144067 4.666000 +144068 4.482000 +144069 4.656000 +144070 4.488000 +144089 4.718000 +144090 4.618000 +144091 5.305000 +144092 5.695000 +144096 2.656000 +144103 5.360000 +144138 3.060000 +144139 1.899000 +144140 2.780000 +144148 5.140000 +144164 3.336000 +144165 3.666000 +144168 2.299000 +144170 4.294000 +144172 2.495000 +144173 2.842000 +144175 3.326000 +144176 2.958000 +144177 1.904000 +144178 2.255000 +144179 2.824000 +144180 2.348000 +144181 1.980000 +144182 3.878000 +144187 0.778000 +144189 3.816000 +144190 1.589000 +144191 1.646000 +144193 1.649000 +144200 4.338000 +144204 4.198000 +144207 4.292000 +144209 4.596000 +144210 4.198000 +144212 1.570000 +144215 2.830000 +144217 3.486000 +144218 2.261000 +144219 4.242000 +144220 3.892000 +144235 3.836000 +144257 5.795000 +144262 5.130000 +144292 5.090000 +144293 5.065000 +144294 5.040000 +144312 0.764000 +144339 1.135000 +144369 0.604000 +144370 0.616000 +144371 0.656000 +144375 1.732000 +144379 1.449000 +144381 5.415000 +144382 5.545000 +144384 5.670000 +144385 5.710000 +144386 5.585000 +144387 5.655000 +144388 5.095000 +144390 5.365000 +144391 4.068000 +144394 4.812000 +144395 4.410000 +144396 5.470000 +144397 5.665000 +144407 4.780000 +144411 5.355000 +144425 2.922000 +144427 1.452000 +144428 2.812000 +144429 4.332000 +144430 3.240000 +144432 4.076000 +144433 1.340000 +144434 1.505000 +144435 3.070000 +144436 3.340000 +144437 3.560000 +144438 3.874000 +144439 2.988000 +144440 4.456000 +144441 3.518000 +144442 2.720000 +144447 1.158000 +144509 4.874000 +144515 5.660000 +144517 0.524000 +144520 1.307000 +144521 1.039000 +144524 5.475000 +144525 5.390000 +144526 5.365000 +144527 0.936000 +144530 1.399000 +144531 4.768000 +144532 1.347000 +144534 0.746000 +144535 0.712000 +144539 2.238000 +144540 2.241000 +144541 0.544000 +144542 0.638000 +144543 2.238000 +144548 5.805000 +144551 1.400000 +144553 5.325000 +144555 1.228000 +144559 1.635000 +144560 3.442000 +144561 1.857000 +144562 2.662000 +144563 2.962000 +144564 3.220000 +144685 0.620000 +144686 0.618000 +144687 2.130000 +144689 0.526000 +144690 1.914000 +144691 2.090000 +144692 5.908000 +144694 4.508000 +144695 1.212000 +144696 1.040000 +144697 1.158000 +144698 1.208000 +144699 6.030000 +144700 5.592000 +144701 6.200000 +144710 4.512000 +144711 5.470000 +144713 5.520000 +144722 5.490000 +144725 5.420000 +144726 5.500000 +144728 5.450000 +144731 5.495000 +144732 0.810000 +144733 5.500000 +144734 5.510000 +144736 5.030000 +144741 3.996000 +144755 4.594000 +144756 5.070000 +144758 1.603000 +144759 5.525000 +144760 2.778000 +144761 5.085000 +144763 2.970000 +144764 4.066000 +144766 4.202000 +144767 2.722000 +144769 1.453000 +144772 5.300000 +144775 5.390000 +144783 1.589000 +144785 1.653000 +144792 5.205000 +144793 3.430000 +144794 3.738000 +144795 3.432000 +144796 5.095000 +144797 3.830000 +144798 3.434000 +144799 4.496000 +144803 3.432000 +144805 2.641000 +144806 3.006000 +144808 2.599000 +144809 2.488000 +144811 4.132000 +144812 5.070000 +144813 4.696000 +144814 3.918000 +144817 6.160000 +144819 3.016000 +144820 3.018000 +144821 2.697000 +144822 2.559000 +144823 2.365000 +144824 2.525000 +144825 2.263000 +144826 2.167000 +144827 2.123000 +144828 2.127000 +144829 2.566000 +144831 2.314000 +144832 2.110000 +144833 2.170000 +144834 2.168000 +144835 2.659000 +144836 3.024000 +144837 3.024000 +144838 3.020000 +144839 1.847000 +144840 3.022000 +144841 3.018000 +144842 3.038000 +144843 3.028000 +144844 4.580000 +144845 3.630000 +144846 3.286000 +144847 4.354000 +144848 3.996000 +144849 2.884000 +144850 3.686000 +144851 1.660000 +144852 2.116000 +144874 5.525000 +144875 5.470000 +144876 5.500000 +144877 5.495000 +144878 5.525000 +144879 5.475000 +144880 5.495000 +144881 5.450000 +144882 5.530000 +144894 5.970000 +144896 5.065000 +144897 1.415000 +144898 5.800000 +144900 4.658000 +144901 5.100000 +144909 2.944000 +144910 3.234000 +144911 3.484000 +144924 3.284000 +144955 1.926000 +144957 1.122000 +144962 1.797000 +144982 4.910000 +144994 3.842000 +144995 4.480000 +144996 3.952000 +144997 6.205000 +144998 6.190000 +144999 6.235000 +145003 1.455000 +145009 5.160000 +145010 3.982000 +145011 3.278000 +145013 4.324000 +145014 3.814000 +145015 3.998000 +145016 5.150000 +145017 3.552000 +145018 3.480000 +145019 4.344000 +145020 5.060000 +145021 3.754000 +145022 3.172000 +145023 3.838000 +145026 5.875000 +145027 5.530000 +145029 4.448000 +145031 3.958000 +145032 2.034000 +145033 4.382000 +145034 4.172000 +145037 0.776000 +145050 1.701000 +145062 4.840000 +145064 3.782000 +145068 4.965000 +145070 4.888000 +145075 3.830000 +145078 5.395000 +145080 3.694000 +145081 5.305000 +145084 4.208000 +145087 3.568000 +145089 3.598000 +145090 2.926000 +145092 4.320000 +145095 5.305000 +145096 1.811000 +145097 3.750000 +145108 3.872000 +145109 5.395000 +145112 4.622000 +145113 5.365000 +145114 4.032000 +145115 4.975000 +145116 5.015000 +145118 2.740000 +145119 2.120000 +145120 5.275000 +145121 4.380000 +145122 1.730000 +145124 2.376000 +145126 2.238000 +145127 2.958000 +145128 3.436000 +145129 2.721000 +145130 2.652000 +145131 3.408000 +145139 4.258000 +145141 4.360000 +145144 3.692000 +145150 2.078000 +145163 6.025000 +145164 0.588000 +145165 0.592000 +145210 6.025000 +145211 6.015000 +145235 4.466000 +145237 4.816000 +145238 4.636000 +145239 4.528000 +145240 4.264000 +145244 0.776000 +145301 5.055000 +145304 4.352000 +145321 3.068000 +145325 1.148000 +145326 0.536000 +145335 0.516000 +145336 0.570000 +145337 1.369000 +145338 5.125000 +145340 1.229000 +145341 1.237000 +145342 3.414000 +145343 5.135000 +145345 2.433000 +145347 3.206000 +145348 5.420000 +145351 5.150000 +145353 1.728000 +145363 2.934000 +145365 2.594000 +145366 2.274000 +145367 2.669000 +145373 3.434000 +145374 2.294000 +145375 2.262000 +145378 5.310000 +145379 4.512000 +145380 4.598000 +145381 5.975000 +145382 5.740000 +145383 5.845000 +145384 5.310000 +145385 4.558000 +145386 2.590000 +145387 5.880000 +145388 5.975000 +145390 3.514000 +145391 4.758000 +145392 4.402000 +145407 6.020000 +145408 4.690000 +145409 4.890000 +145410 3.734000 +145411 4.236000 +145412 6.150000 +145413 6.100000 +145415 6.060000 +145416 6.045000 +145417 4.140000 +145419 6.045000 +145420 4.895000 +145421 5.185000 +145422 6.060000 +145425 5.985000 +145426 5.070000 +145427 5.645000 +145443 2.034000 +145450 5.440000 +145454 0.518000 +145464 5.715000 +145467 5.485000 +145469 5.385000 +145476 1.198000 +145479 4.344000 +145483 2.004000 +145484 2.006000 +145486 2.003000 +145490 2.003800 +145491 2.004800 +145493 2.003800 +145495 2.004000 +145496 2.003800 +145497 2.003800 +145498 2.004800 +145500 2.003800 +145501 2.007000 +145502 2.004000 +145503 2.003600 +145504 2.006000 +145505 2.003800 +145506 2.003800 +145507 2.004000 +145508 2.003600 +145509 2.003600 +145510 2.003800 +145511 2.003800 +145514 2.004000 +145515 2.004000 +145516 2.004600 +145517 2.004200 +145518 2.003600 +145519 2.004000 +145522 2.004200 +145525 2.003000 +145526 2.003800 +145527 2.003800 +145544 1.430000 +145547 4.008000 +145548 3.918000 +145549 4.038000 +145550 4.528000 +145554 1.822000 +145559 1.867000 +145576 4.784000 +145578 4.458000 +145581 2.073000 +145584 5.100000 +145585 4.895000 +145588 4.696000 +145589 2.849000 +145590 4.780000 +145591 3.992000 +145592 4.758000 +145593 2.869000 +145594 3.826000 +145595 2.760000 +145596 5.155000 +145597 3.420000 +145634 2.256000 +145638 2.321000 +145639 2.434000 +145640 2.109000 +145641 2.300000 +145642 2.671000 +145644 3.266000 +145645 2.452000 +145646 2.577000 +145647 2.212000 +145648 4.616000 +145649 3.510000 +145650 3.234000 +145651 5.630000 +145652 3.780000 +145653 3.858000 +145654 3.788000 +145655 3.068000 +145656 2.330000 +145657 3.992000 +145658 3.126000 +145659 5.135000 +145660 3.794000 +145661 3.140000 +145665 1.372000 +145666 1.989000 +145681 4.995000 +145682 3.818000 +145688 5.435000 +145689 4.174000 +145691 4.636000 +145704 6.095000 +145716 2.740000 +145721 6.040000 +145748 1.368000 +145763 1.526000 +145766 1.706000 +145816 2.004600 +145818 2.004000 +145821 2.003600 +145822 2.004400 +145823 2.003800 +145824 2.003600 +145825 2.003600 +145827 2.003600 +145829 2.003600 +145833 2.003600 +145834 2.003600 +145836 2.003600 +145845 2.003200 +145847 2.008400 +145848 2.003600 +145857 4.945000 +145858 4.500000 +145860 3.530000 +145862 3.824000 +145866 3.840000 +145881 4.830000 +145887 5.000000 +145889 1.866000 +145890 4.250000 +145891 5.160000 +145906 3.452000 +145912 4.432000 +145913 3.840000 +145916 3.360000 +145917 3.998000 +145926 5.725000 +145929 5.730000 +145934 5.735000 +145941 5.375000 +145950 5.495000 +145995 5.155000 +146014 1.282000 +146015 5.645000 +146024 2.003600 +146025 2.003600 +146026 2.003200 +146030 2.006200 +146033 2.049800 +146036 1.973600 +146042 2.251000 +146046 3.522000 +146049 3.520000 +146052 2.444000 +146061 1.622000 +146062 2.331000 +146063 2.308000 +146064 3.092000 +146066 1.629000 +146067 2.553000 +146068 1.653000 +146069 1.660000 +146070 3.008000 +146071 3.118000 +146081 4.286000 +146087 4.408000 +146092 2.190000 +146100 1.888000 +146103 1.387000 +146124 1.052000 +146125 1.432000 +146131 2.004200 +146132 2.004400 +146136 2.003600 +146137 0.804000 +146139 1.654000 +146140 2.005400 +146141 2.215000 +146142 2.007000 +146144 2.003600 +146145 2.003800 +146147 1.294000 +146190 4.534000 +146192 1.143000 +146193 1.161000 +146194 4.650000 +146195 2.894000 +146196 4.172000 +146200 4.340000 +146201 1.821000 +146202 4.352000 +146203 4.310000 +146204 2.746000 +146205 4.122000 +146206 4.478000 +146207 4.750000 +146208 3.398000 +146209 2.886000 +146210 2.889000 +146211 1.665000 +146271 2.845000 +146282 3.176000 +146283 2.581000 +146293 3.570000 +146314 5.610000 +146337 4.868000 +146380 3.226000 +146382 5.825000 +146383 0.702000 +146386 4.960000 +146387 3.678000 +146388 5.138000 +146389 3.410000 +146390 1.912000 +146391 3.406000 +146392 4.754000 +146393 5.695000 +146394 6.055000 +146395 4.104000 +146396 4.344000 +146397 4.788000 +146398 4.376000 +146399 4.444000 +146400 4.280000 +146401 4.018000 +146402 3.608000 +146403 3.121000 +146404 0.880000 +146405 5.146000 +146414 5.445000 +146421 5.090000 +146426 0.602000 +146431 5.515000 +146432 1.726000 +146433 5.550000 +146434 6.540000 +146435 1.355000 +146437 6.545000 +146438 6.575000 +146442 2.742000 +146445 5.625000 +146460 6.110000 +146464 2.358000 +146468 4.618000 +146475 5.260000 +146477 5.395000 +146478 5.400000 +146479 4.834000 +146482 4.980000 +146484 5.350000 +146487 5.335000 +146494 5.035000 +146495 4.258000 +146496 3.560000 +146497 3.278000 +146498 4.320000 +146499 2.525000 +146516 0.574000 +146517 5.955000 +146518 5.660000 +146519 5.850000 +146532 4.990000 +146543 4.635000 +146546 4.940000 +146547 4.955000 +146550 2.020000 +146572 5.445000 +146583 5.205000 +146584 5.155000 +146585 5.115000 +146586 3.950000 +146587 5.465000 +146594 4.712000 +146598 5.675000 +146599 5.605000 +146614 3.908000 +146620 6.200000 +146621 6.170000 +146623 6.045000 +146626 4.776000 +146627 4.500000 +146628 5.815000 +146630 4.002000 +146633 2.535000 +146634 3.576000 +146635 3.758000 +146642 6.035000 +146644 3.848000 +146645 2.858000 +146646 3.910000 +146647 6.010000 +146648 5.618000 +146649 4.948000 +146650 5.174000 +146651 5.574000 +146654 6.145000 +146655 6.205000 +146657 6.695000 +146663 4.708000 +146667 3.808000 +146668 3.002000 +146669 3.442000 +146670 3.236000 +146672 3.160000 +146676 3.402000 +146683 1.466000 +146684 3.402000 +146685 3.032000 +146686 3.031800 +146687 3.031800 +146688 3.032000 +146689 3.025000 +146690 3.032400 +146691 3.027800 +146692 3.033600 +146693 3.034600 +146694 3.030000 +146695 3.034600 +146696 3.013200 +146697 3.020800 +146698 3.026400 +146699 3.008000 +146700 3.008600 +146701 3.009000 +146703 2.048000 +146705 2.005400 +146706 2.004800 +146707 2.005600 +146708 2.004400 +146709 2.003800 +146714 0.602000 +146715 4.196000 +146760 1.161000 +146771 1.479000 +146783 3.228000 +146786 6.155000 +146787 5.440000 +146790 6.145000 +146791 6.115000 +146792 1.724000 +146793 2.708000 +146794 3.351000 +146795 6.070000 +146796 6.045000 +146797 4.910000 +146798 4.712000 +146799 5.278000 +146800 3.990000 +146801 3.446000 +146802 4.788000 +146804 4.116000 +146805 4.078000 +146806 4.472000 +146808 3.212000 +146810 2.921000 +146811 5.560000 +146813 6.125000 +146819 5.580000 +146837 1.795000 +146843 5.675000 +146844 5.475000 +146845 5.340000 +146847 4.606000 +146849 4.674000 +146851 4.742000 +146852 4.676000 +146853 5.420000 +146854 4.788000 +146855 5.530000 +146856 5.335000 +146866 5.310000 +146867 5.250000 +146872 5.205000 +146873 4.176000 +146874 4.320000 +146909 0.674000 +146911 1.450000 +146912 1.705000 +146913 3.570000 +146914 3.012000 +146916 6.365000 +146918 9.315000 +146919 1.810000 +146920 2.285000 +146921 3.504000 +146922 3.572000 +146923 3.956000 +146924 2.612000 +146925 2.325000 +146926 2.000000 +146927 2.250000 +146929 7.555000 +146930 7.625000 +146931 0.540000 +146932 8.710000 +146933 6.420000 +146937 4.730000 +146938 8.520000 +146940 9.325000 +146941 7.050000 +146943 9.315000 +146947 9.355000 +146949 9.750000 +146953 5.264000 +146958 5.614000 +146959 5.668000 +146961 5.206000 +146962 6.735000 +146966 5.846000 +146976 4.290000 +146978 1.833000 +146979 6.245000 +146985 5.305000 +146986 5.600000 +146987 4.564000 +146988 4.530000 +146989 3.452000 +146991 4.030000 +146992 3.882000 +146995 5.785000 +146996 5.735000 +147002 3.192000 +147006 0.654000 +147008 4.258000 +147009 2.782000 +147010 3.634000 +147011 7.070000 +147013 3.244000 +147014 2.962000 +147015 7.760000 +147016 8.300000 +147017 4.048000 +147018 5.796000 +147019 4.406000 +147022 4.684000 +147024 6.650000 +147025 8.210000 +147026 8.420000 +147027 8.700000 +147028 3.496000 +147029 2.840000 +147030 3.178000 +147031 2.410000 +147032 3.264000 +147033 5.702000 +147034 9.085000 +147035 8.715000 +147036 3.722000 +147037 2.270000 +147044 8.490000 +147045 4.122000 +147046 3.714000 +147047 3.612000 +147048 2.594000 +147049 9.155000 +147050 9.050000 +147052 5.140000 +147053 9.785000 +147060 9.695000 +147062 9.710000 +147067 9.840000 +147068 3.306000 +147069 3.360000 +147070 9.880000 +147072 9.110000 +147079 3.176000 +147080 3.078000 +147081 4.280000 +147082 3.046000 +147084 9.660000 +147085 7.915000 +147088 1.035000 +147090 5.760000 +147091 10.640000 +147092 7.845000 +147095 3.506000 +147096 3.646000 +147099 5.985000 +147100 6.425000 +147101 7.675000 +147102 7.420000 +147103 5.795000 +147104 8.200000 +147105 7.770000 +147107 5.225000 +147114 2.656000 +147117 5.805000 +147118 5.780000 +147123 5.775000 +147124 5.760000 +147125 4.336000 +147132 5.820000 +147136 5.785000 +147142 5.830000 +147143 5.685000 +147161 3.898000 +147164 5.805000 +147167 6.240000 +147168 6.245000 +147169 4.766000 +147170 5.085000 +147171 4.608000 +147172 3.844000 +147173 4.034000 +147174 3.730000 +147175 5.995000 +147176 5.950000 +147178 5.955000 +147179 4.905000 +147189 2.567000 +147190 2.614000 +147191 3.702000 +147192 1.736000 +147194 5.175000 +147199 4.130000 +147200 2.642000 +147201 4.040000 +147202 4.856000 +147203 4.262000 +147204 1.404000 +147205 2.063000 +147206 2.044000 +147207 4.450000 +147208 3.714000 +147209 3.284000 +147210 3.144000 +147211 3.520000 +147212 3.702000 +147213 4.472000 +147263 2.429000 +147266 1.546000 +147268 5.180000 +147278 5.170000 +147279 5.185000 +147280 5.170000 +147284 4.090000 +147286 3.118000 +147287 3.358000 +147289 1.812000 +147291 4.364000 +147292 1.942000 +147328 1.795000 +147329 3.684000 +147333 1.560000 +147335 1.701000 +147336 3.172000 +147337 2.651000 +147338 1.277000 +147339 2.740000 +147340 1.234000 +147341 1.409000 +147342 1.841000 +147344 2.888000 +147345 2.059000 +147347 3.438000 +147348 2.256000 +147350 3.456000 +147351 3.946000 +147352 3.484000 +147353 1.615000 +147355 1.602000 +147356 1.732000 +147357 3.330000 +147358 1.628000 +147359 2.474000 +147360 2.838000 +147361 1.601000 +147362 2.240000 +147363 3.472000 +147386 4.354000 +147387 3.606000 +147388 3.998000 +147389 4.980000 +147390 4.338000 +147393 4.608000 +147395 4.022000 +147403 2.630000 +147406 5.130000 +147409 5.075000 +147427 1.188000 +147431 1.945000 +147433 1.630000 +147434 1.657000 +147435 2.806000 +147437 2.520000 +147442 1.910000 +147445 2.009400 +147447 2.019200 +147448 2.034000 +147449 2.026600 +147450 2.010000 +147451 2.008800 +147452 2.021800 +147453 2.483000 +147458 3.918000 +147463 4.878000 +147513 5.060000 +147514 5.310000 +147515 4.132000 +147516 4.062000 +147517 4.330000 +147590 5.605000 +147591 5.925000 +147593 5.470000 +147595 3.716000 +147602 5.670000 +147611 5.805000 +147612 4.532000 +147613 4.406000 +147614 4.308000 +147641 0.614000 +147643 4.888000 +147644 3.884000 +147654 5.205000 +147655 5.185000 +147666 4.720000 +147672 5.095000 +147674 4.080000 +147679 3.928000 +147683 3.944000 +147687 3.804000 +147688 3.714000 +147698 5.235000 +147702 4.194000 +147706 2.936000 +147710 2.024000 +147716 0.764000 +147738 0.542000 +147741 1.655000 +147743 7.760000 +148162 5.115000 +148163 5.530000 +148168 5.385000 +148171 1.051000 +148178 1.111000 +148207 5.305000 +148213 0.874000 +148248 4.096000 +148249 3.398000 +148251 5.290000 +148252 5.275000 +148253 5.570000 +148254 3.812000 +148256 5.575000 +148257 5.580000 +148259 4.888000 +148260 3.682000 +148283 5.645000 +148286 5.230000 +148287 5.340000 +148304 4.340000 +148305 5.105000 +148306 4.550000 +148310 4.812000 +148315 2.603000 +148316 2.799000 +148317 4.234000 +148322 4.965000 +148326 4.544000 +148328 5.130000 +148329 4.550000 +148330 4.554000 +148331 4.548000 +148332 4.558000 +148333 4.534000 +148334 5.350000 +148342 2.591000 +148343 4.146000 +148345 4.166000 +148358 0.984000 +148371 4.334000 +148372 4.128000 +148373 3.142000 +148374 3.950000 +148375 3.654000 +148380 3.672000 +148383 5.555000 +148389 0.574000 +148390 0.530000 +148391 4.316000 +148392 4.010000 +148454 5.325000 +148461 5.215000 +148468 3.736000 +148469 1.603000 +148470 2.341000 +148471 5.455000 +148480 4.774000 +148481 5.005000 +148484 2.119000 +148488 3.946000 +148489 4.052000 +148492 1.026000 +148494 4.486000 +148498 0.860000 +148505 6.050000 +148506 5.865000 +148507 5.800000 +148508 4.624000 +148509 5.820000 +148510 5.880000 +148531 0.526000 +148556 1.670000 +148582 4.002000 +148593 5.290000 +148611 4.106000 +148612 5.225000 +148613 5.345000 +148617 2.741000 +148618 3.028000 +148620 4.198000 +148621 3.154000 +148623 3.600000 +148625 5.430000 +148628 5.620000 +148650 4.516000 +148651 3.548000 +148652 4.526000 +148655 5.615000 +148657 4.530000 +148660 4.544000 +148663 6.065000 +148670 2.313000 +148676 0.706000 +148677 5.325000 +148678 1.821000 +148685 6.185000 +148686 6.175000 +148707 6.085000 +148708 3.828000 +148710 1.180000 +148711 1.690000 +148713 3.974000 +148714 2.089000 +148716 4.878000 +148719 4.732000 +148720 4.905000 +148721 5.005000 +148722 5.300000 +148723 5.205000 +148724 6.285000 +148725 6.065000 +148726 6.305000 +148727 6.035000 +148728 4.144000 +148729 3.936000 +148731 6.240000 +148732 4.660000 +148733 3.378000 +148737 5.905000 +148739 4.082000 +148740 6.150000 +148741 5.670000 +148743 3.898000 +148744 5.370000 +148748 3.102000 +148751 4.950000 +148752 5.340000 +148753 4.352000 +148754 3.042000 +148755 2.859000 +148757 2.109000 +148758 4.532000 +148759 4.380000 +148760 4.588000 +148761 6.175000 +148762 5.315000 +148763 5.110000 +148765 5.955000 +148767 4.184000 +148771 5.520000 +148782 4.940000 +148789 5.360000 +148795 1.514000 +148836 0.520000 +148837 0.962000 +148838 3.888000 +148839 2.324000 +148841 5.515000 +148843 5.385000 +148845 5.190000 +148847 5.270000 +148848 5.265000 +148849 5.445000 +148856 5.295000 +148871 5.195000 +148872 1.379000 +148875 3.894000 +148900 0.550000 +148921 1.486000 +148928 1.768000 +148960 4.925000 +148962 3.636000 +148963 3.958000 +148964 4.940000 +148965 5.785000 +148967 4.314000 +148968 2.529000 +148969 2.485000 +148970 2.964000 +148971 3.862000 +148972 5.765000 +148974 3.350000 +149001 1.733000 +149002 1.744000 +149003 2.373000 +149004 1.804000 +149005 1.854000 +149006 3.388000 +149007 1.716000 +149008 2.278000 +149009 2.996000 +149012 4.846000 +149013 1.586000 +149014 3.370000 +149016 3.552000 +149017 3.924000 +149018 1.798000 +149019 4.206000 +149021 3.288000 +149024 4.212000 +149025 1.310000 +149028 4.272000 +149029 4.186000 +149030 2.325000 +149031 1.624000 +149032 1.811000 +149033 2.005000 +149034 1.864000 +149035 2.226000 +149036 1.970000 +149037 2.461000 +149044 1.455000 +149045 3.984000 +149053 1.349000 +149062 1.307000 +149065 3.522000 +149066 3.380000 +149067 3.418000 +149068 4.850000 +149069 1.145000 +149070 0.980000 +149071 1.986000 +149072 0.874000 +149073 1.820000 +149074 3.434000 +149075 1.066000 +149076 3.538000 +149077 2.784000 +149078 3.170000 +149079 2.670000 +149090 1.114000 +149091 5.985000 +149092 5.255000 +149093 1.132000 +149094 4.510000 +149095 5.570000 +149097 1.365000 +149098 6.100000 +149099 3.468000 +149100 4.476000 +149102 1.112000 +149103 6.120000 +149104 6.130000 +149105 3.660000 +149106 6.090000 +149107 5.400000 +149108 5.530000 +149112 1.215000 +149118 6.120000 +149119 2.709000 +149125 1.635000 +149131 4.576000 +149134 1.101000 +149135 5.520000 +149140 4.492000 +149141 4.965000 +149143 4.542000 +149153 4.686000 +149163 2.336000 +149165 3.438000 +149166 3.716000 +149167 4.604000 +149168 4.608000 +149169 4.532000 +149170 2.452000 +149171 4.562000 +149172 4.422000 +149173 4.860000 +149174 4.940000 +149175 2.413000 +149176 4.474000 +149177 4.674000 +149178 2.769000 +149179 4.558000 +149180 3.896000 +149181 3.528000 +149182 4.030000 +149183 3.442000 +149184 2.593000 +149185 1.935000 +149186 4.696000 +149187 3.530000 +149188 3.930000 +149189 4.462000 +149190 3.518000 +149191 3.660000 +149199 5.020000 +149202 5.410000 +149205 5.360000 +149206 5.400000 +149207 2.389000 +149208 4.396000 +149211 5.400000 +149212 2.524000 +149213 4.126000 +149214 3.724000 +149215 3.630000 +149216 4.736000 +149219 4.406000 +149220 5.390000 +149221 4.364000 +149222 5.370000 +149224 5.405000 +149225 5.400000 +149226 5.360000 +149227 4.662000 +149243 3.968000 +149244 6.205000 +149248 6.215000 +149251 4.140000 +149254 5.860000 +149255 5.865000 +149256 5.860000 +149257 4.410000 +149258 5.855000 +149259 5.870000 +149264 5.865000 +149266 6.200000 +149294 2.263000 +149295 2.278000 +149296 1.058000 +149297 2.936000 +149298 3.238000 +149302 5.230000 +149306 1.251000 +149307 6.120000 +149309 4.704000 +149311 5.470000 +149312 4.232000 +149313 4.080000 +149314 3.678000 +149315 4.915000 +149320 5.875000 +149321 5.880000 +149324 3.384000 +149326 5.880000 +149327 5.885000 +149329 5.885000 +149331 5.850000 +149338 4.148000 +149340 5.880000 +149341 5.910000 +149342 4.402000 +149343 5.265000 +149349 6.425000 +149355 5.360000 +149356 5.370000 +149363 6.210000 +149365 4.876000 +149366 2.194000 +149368 2.430000 +149369 5.230000 +149374 3.180000 +149379 5.720000 +149381 5.805000 +149382 4.250000 +149392 2.517000 +149402 3.946000 +149432 3.436000 +149433 1.664000 +149434 2.300000 +149435 2.422000 +149436 1.377000 +149438 2.466000 +149439 1.558000 +149440 1.911000 +149441 1.949000 +149442 1.998000 +149443 2.032000 +149444 2.139000 +149446 1.969000 +149447 3.398000 +149448 6.045000 +149449 6.015000 +149450 5.570000 +149451 5.750000 +149452 3.856000 +149453 5.530000 +149454 5.170000 +149455 6.125000 +149456 5.755000 +149457 6.040000 +149458 6.095000 +149459 5.070000 +149462 5.575000 +149470 1.771000 +149471 1.427000 +149472 2.015000 +149473 3.014000 +149474 3.866000 +149475 2.706000 +149477 1.594000 +149478 3.448000 +149479 3.788000 +149480 2.328000 +149481 2.347000 +149482 2.515000 +149483 3.324000 +149484 1.945000 +149486 1.845000 +149488 5.435000 +149489 1.045000 +149490 1.106000 +149491 4.670000 +149499 2.226000 +149500 1.493000 +149501 2.998000 +149502 2.416000 +149503 1.720000 +149504 1.931000 +149505 1.744000 +149508 0.552000 +149530 6.070000 +149531 5.355000 +149532 5.820000 +149540 3.508000 +149544 4.798000 +149586 3.906000 +149597 0.564000 +149602 3.518000 +149603 5.705000 +149612 5.725000 +149626 6.350000 +149632 0.528000 +149633 5.680000 +149634 5.690000 +149635 5.690000 +149636 5.685000 +149637 5.695000 +149638 5.690000 +149639 5.095000 +149640 5.595000 +149641 5.595000 +149642 5.590000 +149643 5.595000 +149644 4.274000 +149645 3.758000 +149646 3.610000 +149647 3.458000 +149648 3.314000 +149649 3.782000 +149657 1.685000 +149659 1.913000 +149660 4.548000 +149662 2.914000 +149683 2.889000 +149684 2.287000 +149685 3.594000 +149686 5.915000 +149687 3.158000 +149688 2.616000 +149692 3.750000 +149694 3.962000 +149695 3.136000 +149696 3.266000 +149698 3.118000 +149720 2.029000 +149721 2.012000 +149723 2.010000 +149742 5.325000 +149745 5.575000 +149746 4.850000 +149748 5.400000 +149749 1.884000 +149750 3.472000 +149751 4.398000 +149752 1.730000 +149753 3.310000 +149771 4.730000 +149772 4.842000 +149775 2.166000 +149778 3.966000 +149802 3.826000 +149809 4.422000 +149812 4.820000 +149814 3.066000 +149817 4.334000 +149819 3.486000 +149823 5.795000 +149825 5.795000 +149826 5.970000 +149841 5.280000 +149844 4.314000 +149846 4.100000 +149851 4.606000 +149858 4.318000 +149859 4.616000 +149865 1.963000 +149873 5.340000 +149875 5.295000 +149876 1.301000 +149877 6.035000 +149879 6.045000 +149880 6.045000 +149881 6.030000 +149882 6.025000 +149883 6.020000 +149884 6.020000 +149885 6.020000 +149886 6.015000 +149887 6.010000 +149888 6.025000 +149889 6.015000 +149890 6.020000 +149891 6.010000 +149892 6.015000 +149893 6.035000 +149897 4.334000 +149898 5.415000 +149899 3.478000 +149900 5.375000 +149904 0.694000 +149905 3.162000 +149908 5.920000 +149909 5.915000 +149910 5.910000 +149911 5.920000 +149912 5.920000 +149913 5.915000 +149914 5.915000 +149915 5.915000 +149916 5.920000 +149917 5.920000 +149936 5.770000 +149939 3.220000 +149963 1.996000 +149964 6.045000 +149965 3.918000 +149966 2.078000 +149968 4.202000 +149969 2.549000 +149972 3.098000 +149974 5.620000 +149975 4.190000 +149977 4.230000 +149978 4.985000 +149980 2.057000 +149981 2.188000 +149992 5.605000 +149993 5.595000 +149994 5.585000 +149995 5.585000 +149996 5.595000 +149997 5.585000 +149998 5.590000 +149999 5.640000 +150000 5.640000 +150006 5.115000 +150007 5.125000 +150008 5.190000 +150009 5.195000 +150010 5.065000 +150011 5.060000 +150012 5.190000 +150013 0.698000 +150014 5.190000 +150016 3.192000 +150021 1.143000 +150033 4.670000 +150043 5.830000 +150051 4.248000 +150067 2.665000 +150082 5.065000 +150084 3.526000 +150085 5.695000 +150087 3.218000 +150110 5.270000 +150112 5.945000 +150117 3.018000 +150118 3.022000 +150119 3.052000 +150120 1.695000 +150121 3.444000 +150123 6.190000 +150130 5.395000 +150131 5.380000 +150134 5.120000 +150135 5.425000 +150136 5.335000 +150138 5.490000 +150146 5.270000 +150171 2.008000 +150172 3.160000 +150173 2.019000 +150175 2.013600 +150177 2.009000 +150178 2.005600 +150180 1.175000 +150182 2.007000 +150185 2.005000 +150187 2.008000 +150218 4.148000 +150221 5.240000 +150224 3.372000 +150227 0.878000 +150229 1.771000 +150230 0.612000 +150231 4.905000 +150238 3.158000 +150239 3.092600 +150240 3.029400 +150241 3.032400 +150242 3.032600 +150243 3.034000 +150244 3.343500 +150245 3.032000 +150246 3.033800 +150248 2.237000 +150249 2.238600 +150250 2.239600 +150265 3.090000 +150267 2.064200 +150271 3.149800 +150272 3.516000 +150273 3.024000 +150274 3.017400 +150275 2.233800 +150276 2.234000 +150277 2.235000 +150278 2.234400 +150279 2.237800 +150283 2.024000 +150286 2.020400 +150295 5.750000 +150298 5.735000 +150303 3.554000 +150304 3.340000 +150305 3.276000 +150322 6.205000 +150361 5.610000 +150362 5.525000 +150364 5.545000 +150365 5.420000 +150366 5.330000 +150367 5.090000 +150368 5.300000 +150369 5.230000 +150370 5.310000 +150371 5.300000 +150372 3.952000 +150373 5.060000 +150375 5.280000 +150402 5.240000 +150403 6.110000 +150404 4.166000 +150405 5.330000 +150407 4.925000 +150408 5.130000 +150410 4.142000 +150413 5.705000 +150421 4.708000 +150425 2.454000 +150429 2.611000 +150437 6.200000 +150438 6.235000 +150439 4.466000 +150440 6.215000 +150447 5.630000 +150461 1.214000 +150462 1.218000 +150463 1.078000 +150464 1.072000 +150465 1.215500 +150466 1.219000 +150467 1.209600 +150468 1.274200 +150469 1.210000 +150470 1.210400 +150471 1.210000 +150501 4.660000 +150502 2.793000 +150503 2.121000 +150504 2.378000 +150505 2.427000 +150506 2.528000 +150507 2.480000 +150508 2.514000 +150509 3.040000 +150510 1.769000 +150511 2.736000 +150513 2.370000 +150514 2.487000 +150515 2.448000 +150522 0.938000 +150524 3.568000 +150525 3.306000 +150527 2.871000 +150528 3.770000 +150529 3.180000 +150531 3.398000 +150532 2.850000 +150533 4.762000 +150534 2.459000 +150535 2.934000 +150536 3.588000 +150537 4.094000 +150555 1.164000 +150556 1.128000 +150557 3.740000 +150558 1.201000 +150578 5.415000 +150579 3.586000 +150580 3.108000 +150581 2.982000 +150582 2.649000 +150583 2.731000 +150584 5.555000 +150585 2.621000 +150586 2.660000 +150587 2.660000 +150588 2.648000 +150589 2.201000 +150590 2.772000 +150591 2.787000 +150592 2.521000 +150593 2.980000 +150594 2.906000 +150595 2.886000 +150596 2.898000 +150597 2.898000 +150598 2.936000 +150599 2.325000 +150601 5.020000 +150613 4.850000 +150617 3.206000 +150619 2.610000 +150621 4.438000 +150634 4.274000 +150635 3.930000 +150636 5.865000 +150638 5.870000 +150639 3.620000 +150641 4.078000 +150642 5.135000 +150643 4.666000 +150644 4.030000 +150646 3.638000 +150647 4.888000 +150648 3.842000 +150649 3.512000 +150650 5.870000 +150651 3.290000 +150654 5.540000 +150656 5.225000 +150659 6.200000 +150661 5.525000 +150689 1.212200 +150690 1.213000 +150691 1.213000 +150692 1.213200 +150693 1.215400 +150694 1.215000 +150695 1.209400 +150696 1.215800 +150698 1.216200 +150714 5.970000 +150715 2.553000 +150716 5.290000 +150722 3.220000 +150723 3.220000 +150725 4.432000 +150728 5.050000 +150730 4.320000 +150732 4.028000 +150733 3.926000 +150736 5.150000 +150737 4.118000 +150738 5.225000 +150740 2.058000 +150741 3.652000 +150742 4.046000 +150744 2.745000 +150745 3.170000 +150746 3.044000 +150776 3.158000 +150777 4.614000 +150781 3.120000 +150784 3.948000 +150788 6.230000 +150791 5.275000 +150818 5.010000 +150819 5.855000 +150820 5.875000 +150824 5.885000 +150827 5.890000 +150829 5.090000 +150830 5.550000 +150834 5.520000 +150835 4.568000 +150838 3.518000 +150841 3.550000 +150845 3.094000 +150848 3.194000 +150860 6.000000 +150861 5.965000 +150868 4.186000 +150871 4.342000 +150873 6.366000 +150874 4.368000 +150875 4.480000 +150880 2.006000 +150884 2.005000 +150889 2.003400 +150892 2.008000 +152131 1.550500 +152136 1.486500 +152172 4.754500 +152174 4.982500 +152199 1.405000 +152200 5.539500 +152205 5.469000 +152206 5.350000 +152213 0.782500 +152214 1.347500 +152215 1.318500 +152216 1.346000 +152217 2.935000 +152227 3.824000 +152231 6.578500 +152247 0.805500 +152267 7.119000 +152268 7.092500 +152283 5.060500 +152304 2.990000 +152313 3.803500 +152317 4.493500 +152324 2.704500 +152338 6.245500 +152357 3.694500 +152360 4.607000 +152361 4.770500 +152362 2.695500 +152363 4.550500 +152367 6.600500 +152368 7.166500 +152369 6.620000 +152370 6.644000 +152371 6.314500 +152439 5.498000 +152481 7.089000 +152482 7.082000 +152514 3.046500 +152515 6.257000 +152546 5.179500 +152547 6.606000 +152553 0.864000 +152558 0.886500 +152559 2.041000 +152560 2.042000 +152561 5.571500 +152562 5.725000 +152571 6.327500 +152572 5.118000 +152573 4.942500 +152574 6.380000 +152575 6.358000 +152576 6.376000 +152579 7.069500 +152580 7.086000 +152581 7.077000 +152582 7.515000 +152585 7.423000 +152586 7.426500 +152587 7.423500 +152588 7.418000 +152589 7.421000 +152590 7.447500 +152591 7.418500 +152593 2.544500 +152594 6.563500 +152595 6.608500 +152596 1.946500 +152600 5.926500 +152602 5.166500 +152614 7.398000 +152615 3.556500 +152623 1.652000 +152626 4.392500 +152627 4.111000 +152628 4.131500 +152629 4.090500 +152641 5.210500 +152701 0.716500 +152702 4.264500 +152717 6.390500 +152724 5.609000 +152732 4.510500 +152739 5.897500 +152740 6.024000 +152777 5.902000 +152778 5.806500 +152779 6.472000 +152780 6.449500 +152782 6.471500 +152783 6.579000 +152784 7.162500 +152785 6.621500 +152786 7.109500 +152787 7.094500 +152788 5.350500 +152792 6.944500 +152793 7.095500 +152794 7.094500 +152795 5.864000 +152797 5.206000 +152798 6.374500 +152799 5.362000 +152800 4.403500 +152801 3.377500 +152802 3.909000 +152803 5.728000 +152804 5.418000 +152805 5.408500 +152806 3.486500 +152807 3.712000 +152808 4.140000 +152812 5.658500 +152813 7.369500 +152819 4.514500 +152820 5.044500 +152829 3.464500 +152831 4.974500 +152832 5.384000 +152845 4.594000 +152846 4.138000 +152850 7.354000 +152852 3.500500 +152853 4.947000 +152854 4.582000 +152856 6.404500 +152858 6.663000 +152859 5.697500 +152860 2.590000 +152861 4.265000 +152881 4.801500 +152882 0.883000 +152883 4.428000 +152884 4.141000 +152885 4.241500 +152892 7.545500 +152893 7.544500 +152894 7.546000 +152895 7.217500 +152896 7.112500 +152897 7.542500 +152899 7.753000 +152900 5.540000 +152908 2.007500 +152909 2.017500 +152910 2.014500 +152913 1.210500 +152914 1.209500 +152925 7.040000 +152931 2.233000 +152938 7.035500 +152959 5.845000 +152960 5.816500 +152961 5.859500 +152962 5.849500 +152963 5.842000 +152964 5.840500 +152966 5.858500 +152967 5.842000 +152968 5.847000 +152969 2.185500 +152970 5.843500 +152971 5.848000 +152972 5.867500 +152973 5.867000 +152980 3.111500 +152981 3.788500 +152986 6.569000 +153016 6.535000 +153017 5.812000 +153018 5.851000 +153019 5.849500 +153020 5.841500 +153021 5.839000 +153052 5.424000 +153053 6.605500 +153069 3.834000 +153090 0.518500 +153091 5.540000 +153092 5.536000 +153097 5.867500 +153107 4.620500 +153113 5.672500 +153122 2.301500 +153123 2.169500 +153124 2.180500 +153125 2.323500 +153126 2.535000 +153127 3.412000 +153128 2.862500 +153129 1.595000 +153130 2.537000 +153131 1.692500 +153132 4.913500 +153133 4.499500 +153134 2.577500 +153135 3.953000 +153136 2.753500 +153137 3.151000 +153138 2.219500 +153139 3.687000 +153140 6.416000 +153141 5.427000 +153142 4.392000 +153143 5.944500 +153144 2.828500 +153145 3.674000 +153146 3.896500 +153147 7.037000 +153148 1.793500 +153149 7.042000 +153150 7.039000 +153155 5.221500 +153157 1.495000 +153262 5.297500 +153263 3.981000 +153264 4.095500 +153265 3.705500 +153266 4.736000 +153267 5.278500 +153268 3.500500 +153270 3.559500 +153271 3.277500 +153272 3.365000 +153273 3.397000 +153274 3.439000 +153275 3.313000 +153276 3.525500 +153278 5.309000 +153279 3.612000 +153282 3.384500 +153285 5.389500 +153288 1.558500 +153294 3.232000 +153300 3.949000 +153302 5.495500 +153303 5.498500 +153305 5.339500 +153307 5.070000 +153313 2.350000 +153315 2.201000 +153316 2.390500 +153317 4.721000 +153319 2.387000 +153320 5.032500 +153321 4.632000 +153323 4.657000 +153324 5.038500 +153325 4.333000 +153327 2.929000 +153329 5.060000 +153330 5.015000 +153331 1.646000 +153332 3.189000 +153334 4.445500 +153335 2.342500 +153336 2.337000 +153337 2.750500 +153338 4.319000 +153339 1.473500 +153340 4.801000 +153343 3.820000 +153344 5.098500 +153345 4.095500 +153351 5.076500 +153352 3.238500 +153353 3.689000 +153354 4.457500 +153355 4.581000 +153356 4.221000 +153358 5.520000 +153360 1.233000 +153361 1.074000 +153362 4.440500 +153363 3.539000 +153364 3.362000 +153365 4.361500 +153366 4.579000 +153367 4.516000 +153369 2.711500 +153371 5.086500 +153372 4.678000 +153373 4.542000 +153374 5.069500 +153376 3.193000 +153381 5.355500 +153383 3.763500 +153384 3.740000 +153385 3.583500 +153386 3.140500 +153387 3.634500 +153388 3.115000 +153389 3.055500 +153390 3.287000 +153391 3.524000 +153392 1.679000 +153393 3.416000 +153394 4.077500 +153395 2.879500 +153397 4.111500 +153400 4.204500 +153401 3.808500 +153413 5.045000 +153414 1.442500 +153415 1.562000 +153416 1.733500 +153417 1.479000 +153420 1.636500 +153423 1.633500 +153438 5.302500 +153440 4.958500 +153449 5.731500 +153450 1.180500 +153451 0.859500 +153452 1.973500 +153453 2.387500 +153454 3.333000 +153455 2.372000 +153456 3.762000 +153459 2.986500 +153460 2.897000 +153461 2.891500 +153468 4.148000 +153469 4.040500 +153479 5.822500 +153480 7.121000 +153483 4.968500 +153484 6.673500 +153490 5.345500 +153522 3.715500 +153523 4.636000 +153524 3.448500 +153525 3.482500 +153526 2.286000 +153527 2.534500 +153528 2.484000 +153529 1.720000 +153530 1.585000 +153531 3.280500 +153532 2.386000 +153536 2.968500 +153538 6.558000 +153539 7.002000 +153540 7.868500 +153545 7.100000 +153546 5.190500 +153548 1.352000 +153549 1.200000 +153552 0.804000 +153554 4.999500 +153556 1.201000 +153557 1.203000 +153558 1.202500 +153559 1.200500 +153560 1.200500 +153563 1.201500 +153575 6.013000 +153583 4.354500 +153584 6.985000 +153585 6.598000 +153586 6.291000 +153587 3.777500 +153593 2.911000 +153594 2.911000 +153602 6.096000 +153603 2.839000 +153604 3.024500 +153605 3.545500 +153610 5.667000 +153613 0.819500 +153621 5.812000 +153632 2.849000 +153633 5.629500 +153634 4.373500 +153637 5.937500 +153652 7.046500 +153660 3.459500 +153674 5.726500 +153675 5.425500 +153676 6.071500 +153687 6.823500 +153688 6.480500 +153689 6.429000 +153690 4.582500 +153693 5.866500 +153698 3.973000 +153699 4.131500 +153713 7.028000 +153714 7.062000 +153715 4.628500 +153723 4.107500 +153724 2.486000 +153725 3.173000 +153728 4.669000 +153729 5.070500 +153730 3.264000 +153731 5.122000 +153732 3.722500 +153733 2.205500 +153736 2.922500 +153738 5.268500 +153739 5.504000 +153741 5.134000 +153742 2.705000 +153743 5.491500 +153744 3.058000 +153753 4.827000 +153755 4.008000 +153756 4.207500 +153770 5.552000 +153775 0.592000 +153776 0.653500 +153777 2.353500 +153778 3.514500 +153779 2.830000 +153780 3.489500 +153781 1.742000 +153782 2.129500 +153783 4.668500 +153784 3.437000 +153785 3.161500 +153786 2.407000 +153787 3.789000 +153788 2.146500 +153789 2.554000 +153790 2.213500 +153792 2.109500 +153793 3.975000 +153794 3.069000 +153795 1.222500 +153796 2.431500 +153797 2.456500 +153798 2.112000 +153799 3.424000 +153814 4.768500 +153815 4.753000 +153817 4.747000 +153868 3.060000 +153870 3.665500 +153873 3.641500 +153874 3.876500 +153875 4.938000 +153876 3.079500 +153877 4.729000 +153878 5.497000 +153889 1.579500 +153890 2.948500 +153892 5.739000 +153894 2.895000 +153895 3.340500 +153896 3.362500 +153897 4.146500 +153898 4.314500 +153899 5.870500 +153907 4.053000 +153908 4.342500 +153910 4.287000 +153912 4.288500 +153913 4.366500 +153914 4.021000 +153930 7.057000 +153953 4.305500 +153954 3.823500 +153956 4.116500 +153959 5.059000 +153960 5.052000 +153961 4.056500 +153967 3.872000 +153968 2.716500 +153969 2.819000 +153970 2.575000 +153971 3.787000 +153972 2.916000 +153973 5.461500 +153974 3.499500 +153975 3.275500 +153976 2.151000 +153983 1.320000 +153984 1.200000 +153985 1.199500 +153986 1.202500 +153987 1.200000 +154001 1.203500 +154002 1.203500 +154004 1.208000 +154005 1.203000 +154006 1.209500 +154007 1.284000 +154010 0.507000 +154011 5.968000 +154012 3.893500 +154013 2.012000 +154014 2.012000 +154015 2.011500 +154016 2.012500 +154017 2.012000 +154018 2.010000 +154019 2.011000 +154020 2.013500 +154021 2.013000 +154022 2.012000 +154023 2.012500 +154024 2.013000 +154025 2.012000 +154026 2.013000 +154027 2.012500 +154028 2.012000 +154029 2.012500 +154030 2.013000 +154031 2.012500 +154036 7.794000 +154043 6.090500 +154056 4.185500 +154071 5.904500 +154072 2.967000 +154073 2.567000 +154074 2.759500 +154075 5.845000 +154076 5.359500 +154077 2.688500 +154078 2.344000 +154080 4.784000 +154084 2.861500 +154085 2.781500 +154086 2.089000 +154087 2.077000 +154088 2.486000 +154089 2.147500 +154090 2.417500 +154091 2.260500 +154093 2.181000 +154094 2.752000 +154095 2.574500 +154096 3.965500 +154097 2.529500 +154098 2.519000 +154106 2.844000 +154107 2.850500 +154108 2.432000 +154109 2.446500 +154110 4.653000 +154111 3.567500 +154112 6.247500 +154113 3.360000 +154114 2.241500 +154115 2.108000 +154120 5.083000 +154121 5.091500 +154129 2.647000 +154130 2.769500 +154134 6.101500 +154135 3.074500 +154136 3.058000 +154137 3.056500 +154138 2.097000 +154139 1.820000 +154140 1.796000 +154141 1.808500 +154142 3.022000 +154143 2.033500 +154144 2.035000 +154145 2.030500 +154146 2.032500 +154147 2.029000 +154148 2.026000 +154149 2.019500 +154150 2.032500 +154151 2.028000 +154152 2.023000 +154153 2.018000 +154154 2.017000 +154155 2.031000 +154156 2.028500 +154157 2.028000 +154158 2.021500 +154159 2.026500 +154160 2.018000 +154164 5.616000 +154166 2.011000 +154167 2.012000 +154168 2.009000 +154169 2.008500 +154170 2.007000 +154171 2.009500 +154172 2.009000 +154173 2.007500 +154174 2.008000 +154175 2.007500 +154176 2.008000 +154177 2.008500 +154178 2.010000 +154179 2.009000 +154180 2.009000 +154181 2.007500 +154182 2.008500 +154183 2.006500 +154184 2.008500 +154185 2.007500 +154186 2.007500 +154187 2.007000 +154188 2.007000 +154189 2.007000 +154190 2.011500 +154191 2.011500 +154192 2.010000 +154246 5.211500 +154255 5.179000 +154261 5.985500 +154262 5.045500 +154263 5.119000 +154264 5.761000 +154265 5.804500 +154266 1.226500 +154281 1.110000 +154282 6.361500 +154283 6.153000 +154299 5.183500 +154300 4.107500 +154301 4.827000 +154302 4.912000 +154303 4.781500 +154304 2.056500 +154305 2.920500 +154306 5.648500 +154307 5.353500 +154308 4.864000 +154309 4.926000 +154311 1.072500 +154312 4.999000 +154313 4.966500 +154316 1.912500 +154361 7.343500 +154367 5.759000 +154379 5.564000 +154382 6.039000 +154386 7.059000 +154395 7.142000 +154409 6.964000 +154413 5.091000 +154420 4.861000 +154426 7.317500 +154444 6.615500 +154454 1.319500 +154455 6.898500 +154456 6.636000 +154457 6.615000 +154458 6.880500 +154459 6.325000 +154462 6.847500 +154463 1.651500 +154465 2.842500 +154467 3.017000 +154468 1.686000 +154469 1.906000 +154470 1.792000 +154471 2.011500 +154472 1.736000 +154473 1.939500 +154474 1.916500 +154475 1.935000 +154476 1.930000 +154478 2.537000 +154479 1.467500 +154480 1.984500 +154482 2.989500 +154483 1.231000 +154484 1.474000 +154485 2.821000 +154487 1.929500 +154488 1.350500 +154489 1.621000 +154490 1.909000 +154491 1.587000 +154492 1.920000 +154493 1.274000 +154494 1.766000 +154495 1.663000 +154496 1.898500 +154498 2.850500 +154499 1.268000 +154502 7.317000 +154512 6.459500 +154513 6.180500 +154514 6.192000 +154515 6.440500 +154517 1.790000 +154519 4.440500 +154520 6.219500 +154521 6.513500 +154522 6.236500 +154524 6.116000 +154526 5.888000 +154528 5.605500 +154529 2.325000 +154530 3.455000 +154534 3.136500 +154539 0.754000 +154545 7.312000 +154546 3.365000 +154549 5.373000 +154551 4.133000 +154552 5.328000 +154553 0.909000 +154555 5.364500 +154558 5.026000 +154559 4.013000 +154560 2.261500 +154561 4.238000 +154563 5.358000 +154571 5.386000 +154575 3.447000 +154576 3.327500 +154577 2.139000 +154580 5.036500 +154590 4.493500 +154594 0.861500 +154605 2.003000 +154607 2.002000 +154608 2.003000 +154609 2.005500 +154610 2.005000 +154611 2.005000 +154612 2.006000 +154614 2.006000 +154615 1.996500 +154616 2.012500 +154617 2.008000 +154618 2.012500 +154619 2.009000 +154620 2.012500 +154621 2.011500 +154622 2.014000 +154623 2.008500 +154624 2.007500 +154625 2.008000 +154651 7.037500 +154653 7.044500 +154654 5.107000 +154664 7.043000 +154669 7.047500 +154673 7.037500 +154676 7.040000 +154716 4.736000 +154717 7.095000 +154718 7.055500 +154719 7.045500 +154720 7.055000 +154721 7.073500 +154722 7.046000 +154756 5.862000 +154757 5.833500 +154758 5.844500 +154762 4.209500 +154766 5.861500 +154768 5.803500 +154769 5.780500 +154770 5.834500 +154771 5.721000 +154772 5.723000 +154773 5.856000 +154775 0.617000 +154778 5.517000 +154783 5.698000 +154784 4.684500 +154792 4.376500 +154793 3.827000 +154794 3.335500 +154795 3.238500 +154796 5.575500 +154798 4.404500 +154799 3.756000 +154800 5.138500 +154801 4.755500 +154802 2.698000 +154803 2.735500 +154804 2.889000 +154805 2.449500 +154806 2.320000 +154807 1.967000 +154808 3.404000 +154809 3.835000 +154810 4.565000 +154811 3.997000 +154812 3.835500 +154813 3.696500 +154814 4.206000 +154815 4.190000 +154816 4.197500 +154817 4.053000 +154818 4.171500 +154819 4.306500 +154820 3.674000 +154821 4.178000 +154822 3.891000 +154823 4.243000 +154824 3.656000 +154825 2.781000 +154826 4.331000 +154832 6.200000 +154838 4.940000 +154839 5.995000 +154840 5.328000 +154841 3.745000 +154843 4.365000 +154844 4.599000 +154845 5.955500 +154846 5.811000 +154847 4.446500 +154848 3.868500 +154850 5.556000 +154851 2.854500 +154852 4.636000 +154853 4.755000 +154854 4.303500 +154855 3.194000 +154856 4.750000 +154857 5.696000 +154876 3.032500 +154877 2.579500 +154878 2.793500 +154880 3.206000 +154881 2.707000 +154882 3.037000 +154883 3.303500 +154884 4.239500 +154885 3.177500 +154886 3.195000 +154887 3.259500 +154888 2.994000 +154889 3.315500 +154890 0.579000 +154891 3.528000 +154892 3.375000 +154895 3.213000 +154896 4.334000 +154897 3.703500 +154898 3.397500 +154899 5.721500 +154900 5.632000 +154901 4.636000 +154902 5.737000 +154903 4.051000 +154904 3.860000 +154905 2.623500 +154906 3.381000 +154907 2.760000 +154908 3.284000 +154909 4.961500 +154910 4.048000 +154911 4.151000 +154912 4.184000 +154913 4.173000 +154914 3.575500 +154920 6.456000 +154921 5.884000 +154923 3.139500 +154924 2.524000 +154925 2.963500 +154936 5.846500 +154938 6.073500 +154941 2.729000 +154942 2.484000 +154943 3.467000 +154944 2.496500 +154945 2.404500 +154946 2.470000 +154947 3.770500 +154948 3.058000 +154949 3.560500 +154950 3.641000 +154951 3.840500 +154952 3.176000 +154953 2.856000 +154954 3.089500 +154955 2.923500 +154956 2.959500 +154957 4.781000 +154958 2.797000 +154959 3.113500 +154962 7.351000 +154963 2.850000 +154964 4.459500 +154965 4.286000 +154966 5.558000 +154967 4.748500 +154968 3.996500 +154969 1.445000 +154970 1.678000 +154972 3.166000 +154973 2.845500 +154974 1.782000 +154975 3.200500 +154977 3.140000 +154978 2.763000 +154979 5.781000 +154981 5.678000 +154983 4.538000 +154985 5.362500 +154986 4.441000 +154987 4.374000 +154988 5.230500 +154989 6.008000 +154990 4.089500 +154991 6.075000 +154992 6.074500 +154994 6.086000 +154995 6.084500 +154996 3.726500 +154997 4.225500 +155001 2.161000 +155002 7.052000 +155006 4.304000 +155007 2.529000 +155010 1.408000 +155012 4.077500 +155014 2.992500 +155015 2.821500 +155016 4.284500 +155017 4.194500 +155018 4.254500 +155019 4.440500 +155020 4.210000 +155021 3.768500 +155036 1.201000 +155037 1.201500 +155040 1.296000 +155041 1.222500 +155042 1.198500 +155043 1.230000 +155044 1.211000 +155045 1.212500 +155046 1.168500 +155047 1.206000 +155048 1.211500 +155104 1.168500 +155111 4.819500 +155112 6.531500 +155124 5.205000 +155146 5.814500 +155155 5.665000 +155169 1.969500 +155181 7.321000 +155184 3.112500 +155185 2.612500 +155186 2.904000 +155187 2.747500 +155188 2.712000 +155189 3.400000 +155190 3.498500 +155191 2.920000 +155192 2.717000 +155193 4.136500 +155196 4.334500 +155197 3.776000 +155198 3.920500 +155200 5.317000 +155201 5.305000 +155202 3.392000 +155203 3.433000 +155204 4.421000 +155205 3.413500 +155206 5.590000 +155207 4.811000 +155208 5.376000 +155210 5.668500 +155211 5.559000 +155214 5.684000 +155215 5.099500 +155216 5.689500 +155224 6.879000 +155226 4.133000 +155246 6.701500 +155255 6.731500 +155257 6.750000 +155265 5.084000 +155266 5.063000 +155267 3.419500 +155268 4.065000 +155269 5.445500 +155271 6.259000 +155274 5.122500 +155275 5.329000 +155276 4.002000 +155277 4.005500 +155278 4.160000 +155280 5.996500 +155286 5.631500 +155287 3.378000 +155289 5.513500 +155294 5.374000 +155300 4.939000 +155301 5.413000 +155302 5.269500 +155325 5.581000 +155327 6.652500 +155329 6.718000 +155331 6.558500 +155332 6.647500 +155333 6.608500 +155334 6.539500 +155336 6.740000 +155338 6.354500 +155339 6.458500 +155340 6.165000 +155341 6.277500 +155349 6.470500 +155350 6.595000 +155351 6.616500 +155353 6.565500 +155354 6.632500 +155364 3.388500 +155376 6.499500 +155380 5.735000 +155387 5.703500 +155388 5.678000 +155389 6.472500 +155410 6.129000 +155415 6.228000 +155416 6.231000 +155424 4.278500 +155438 1.770000 +155441 3.326500 +155450 3.260000 +155454 4.183000 +155455 4.173000 +155456 4.155000 +155457 4.131000 +155458 4.132000 +155459 4.137500 +155460 4.143500 +155461 5.130500 +155462 5.086500 +155464 5.144500 +155465 5.136500 +155468 5.725500 +155469 5.708000 +155470 4.766500 +155471 5.684500 +155472 5.597500 +155482 5.427000 +155498 7.344500 +155525 6.394500 +155533 7.346000 +155544 4.527500 +155547 4.669000 +155549 5.245000 +155550 4.789000 +155554 3.884000 +155555 3.691500 +155556 4.292000 +155557 5.467500 +155563 7.352000 +155587 4.125500 +155588 5.538500 +155591 5.834500 +155594 5.571500 +155598 7.150000 +155603 4.197000 +155604 7.631500 +155610 7.347500 +155634 4.780000 +155635 5.379500 +155636 4.621000 +155637 4.618500 +155638 5.031500 +155639 4.759000 +155640 5.021500 +155642 5.089500 +155643 4.320500 +155647 4.378500 +155659 2.008500 +155661 2.010000 +155662 2.010500 +155663 2.010500 +155664 2.008000 +155665 2.011000 +155666 2.011000 +155667 2.011000 +155668 2.011000 +155669 2.009500 +155670 2.011500 +155671 2.009500 +155672 2.010000 +155673 2.008500 +155675 2.009500 +155676 2.010500 +155677 2.009000 +155678 2.010000 +155679 2.009000 +155680 2.010500 +155682 2.008500 +155683 2.009000 +155684 2.007500 +155685 2.008500 +155686 2.010500 +155687 2.009500 +155688 2.007500 +155689 2.007500 +155690 2.009000 +155691 2.010500 +155692 2.008000 +155693 2.008500 +155694 2.009000 +155695 2.010000 +155696 2.010500 +156199 4.208000 +156200 4.741500 +156205 3.996500 +156244 6.603000 +156255 1.517000 +156272 1.428000 +156273 1.487000 +156291 3.088000 +156293 3.979000 +156295 5.679500 +156296 6.285500 +156305 7.340500 +156306 1.148500 +156316 4.374000 +156336 4.435500 +156338 4.236500 +156350 7.347000 +156381 7.349000 +156382 7.343000 +156383 7.346000 +156385 7.314000 +156390 5.345000 +156391 3.460500 +156392 3.004500 +156404 2.538000 +156405 4.400500 +156406 4.426000 +156411 7.346000 +156412 7.347000 +156424 5.073500 +156427 4.549500 +156428 4.111000 +156430 4.539500 +156431 4.520500 +156432 4.557500 +156433 4.544500 +156461 2.433000 +156462 7.337500 +156463 3.335500 +156474 1.389000 +156475 3.912000 +156476 3.051000 +156477 6.522500 +156479 3.284000 +156480 3.376500 +156482 3.602500 +156483 6.864000 +156486 6.751000 +156487 6.751500 +156488 6.741000 +156489 6.384000 +156490 6.736000 +156491 4.511000 +156492 5.137500 +156493 6.535000 +156494 6.873500 +156495 6.867500 +156501 7.347500 +156506 4.384500 +156511 3.298000 +156512 3.033500 +156514 5.458000 +156515 5.087500 +156517 5.170500 +156518 5.173500 +156519 2.081500 +156520 3.849500 +156521 5.058000 +156522 4.150500 +156523 5.507500 +156524 6.578000 +156525 6.570500 +156526 6.556000 +156527 5.199500 +156528 2.429000 +156529 3.396000 +156533 5.177500 +156541 7.355000 +156542 4.840500 +156543 4.909500 +156545 3.360000 +156546 4.062500 +156552 0.661500 +156553 0.841000 +156560 2.045500 +156563 6.421500 +156565 6.440000 +156566 6.430500 +156567 6.441500 +156605 7.354500 +156618 2.686000 +156623 2.466500 +156624 1.656500 +156633 1.514000 +156634 5.345000 +156635 1.053500 +156637 5.329000 +156639 1.045000 +156641 5.404500 +156652 5.082000 +156658 2.896000 +156667 4.055500 +156670 3.082500 +156671 4.330500 +156672 5.225500 +156673 1.799000 +156674 2.103000 +156675 3.347500 +156676 4.865000 +156677 4.897500 +156681 2.993000 +156682 3.382000 +156683 3.389500 +156684 3.619500 +156685 1.695500 +156686 4.207000 +156688 4.502500 +156693 5.421000 +156694 5.208500 +156695 6.197000 +156696 4.718000 +156698 5.595000 +156715 6.769500 +156721 7.319000 +156723 8.074500 +156724 8.064000 +156726 8.066000 +156727 8.173000 +156728 7.480500 +156729 8.050500 +156733 7.575000 +156734 5.822000 +156736 7.598500 +156738 6.861500 +156739 5.673000 +156741 3.378000 +156742 7.611000 +156745 6.623500 +156746 7.102500 +156747 5.351000 +156748 6.988000 +156752 4.246000 +156754 5.514000 +156755 5.499500 +156756 6.375000 +156757 6.503500 +156758 6.585500 +156759 6.419000 +156760 6.742500 +156761 6.453000 +156764 6.585000 +156765 6.651000 +156766 7.248000 +156767 0.922000 +156768 7.239000 +156769 7.135000 +156770 7.072500 +156778 7.283500 +156784 4.625500 +156787 1.648000 +156788 1.924500 +156790 5.034500 +156791 3.793000 +156792 3.253500 +156794 3.954500 +156795 4.693000 +156796 3.383000 +156798 5.177000 +156804 2.535500 +156806 2.951000 +156816 3.562000 +156818 2.984500 +156819 6.266000 +156821 2.533500 +156823 6.265000 +156824 2.280000 +156825 3.262500 +156826 6.090500 +156827 5.070000 +156828 2.932000 +156829 3.272500 +156880 7.341000 +156881 7.060000 +156887 6.843000 +156890 6.400000 +156895 3.336000 +156899 6.789500 +156900 3.718500 +156901 6.034000 +156902 3.267000 +156903 5.378500 +156904 4.111000 +156905 7.402000 +156906 6.309000 +156907 7.489000 +156908 7.317500 +156909 7.024500 +156910 5.676500 +156922 2.023600 +156923 2.018600 +156924 2.222200 +156926 3.496800 +156927 2.788000 +156928 2.768600 +156929 2.772600 +156930 2.756000 +156931 2.768200 +156932 2.748600 +156933 2.756800 +156934 2.840600 +156935 3.055600 +156936 2.676800 +156937 2.935000 +156938 2.958200 +156939 3.140400 +156940 2.688400 +156941 2.951200 +156942 2.882600 +156943 3.899400 +156944 2.369400 +156945 2.369600 +156946 2.396200 +156947 2.399000 +156948 2.481600 +156949 2.374200 +156950 2.423400 +156951 2.466800 +157031 1.042500 +157032 1.001000 +157033 0.998500 +157034 0.989000 +157035 0.981500 +157036 0.753000 +157040 4.848000 +157045 4.618500 +157085 5.211500 +157086 5.138500 +157092 5.211500 +157107 4.508000 +157139 3.391000 +157141 5.218000 +157142 5.516000 +157165 1.566500 +157166 1.583500 +157167 1.612500 +157168 5.740500 +157170 3.230000 +157171 3.042500 +157172 1.125000 +157173 1.129500 +157174 2.615500 +157175 3.633500 +157176 2.849000 +157177 3.062500 +157178 3.214500 +157179 2.680500 +157180 3.317000 +157187 2.136500 +157190 4.720500 +157191 4.451500 +157200 8.159000 +157201 8.730500 +157204 7.727500 +157205 6.960000 +157206 9.015500 +157207 7.867000 +157208 8.078000 +157209 7.899500 +157210 7.966500 +157211 7.733000 +157212 7.536500 +157213 7.648500 +157214 8.038000 +157215 9.007500 +157217 6.639000 +157228 7.310000 +157240 4.316500 +157242 5.478000 +157244 3.942500 +157245 1.795500 +157246 5.003500 +157247 3.730500 +157249 3.455500 +157257 7.341000 +157282 7.324500 +157283 0.687000 +157297 5.938000 +157299 4.719500 +157300 4.273500 +157301 4.510500 +157302 4.458500 +157305 5.375000 +157306 6.379000 +157307 6.012500 +157309 4.045000 +157310 5.583000 +157311 5.440500 +157312 5.735500 +157315 5.536500 +157316 6.004000 +157317 5.817000 +157319 6.669000 +157320 6.357500 +157322 5.617500 +157368 5.070000 +157371 6.053500 +157375 6.016000 +157380 3.132000 +157383 2.710000 +157384 3.183500 +157385 3.136500 +157386 3.334500 +157388 1.781500 +157389 3.170000 +157390 2.355000 +157392 2.832500 +157393 2.924000 +157394 2.205000 +157395 3.473000 +157398 5.826500 +157403 5.330000 +157405 4.617500 +157406 1.704500 +157419 5.875500 +157421 5.679500 +157422 5.419000 +157423 6.044000 +157425 4.726500 +157426 4.925500 +157427 4.937000 +157430 5.324500 +157434 6.543500 +157441 0.503500 +157442 0.628500 +157443 0.624000 +157444 3.600000 +157445 3.064500 +157446 3.010000 +157447 2.817000 +157448 4.095000 +157449 3.906000 +157450 2.480000 +157451 2.944000 +157452 2.374000 +157453 3.098000 +157454 3.264500 +157455 3.256000 +157456 2.901000 +157457 3.646000 +157459 3.071000 +157460 3.836500 +157461 7.057500 +157462 4.664500 +157463 2.606500 +157465 2.590500 +157466 2.499000 +157467 2.776500 +157468 2.772500 +157469 2.487000 +157470 3.137500 +157472 2.692500 +157473 4.051500 +157480 7.318000 +157481 3.867500 +157491 3.426500 +157492 5.290500 +157493 4.373000 +157497 5.499000 +157517 7.311500 +157522 5.470500 +157526 2.063500 +157531 2.526500 +157532 5.508000 +157533 5.845500 +157538 6.062500 +157539 5.426000 +157540 6.329000 +157541 5.742500 +157543 5.704500 +157544 2.627000 +157546 5.319000 +157561 4.913500 +157563 1.078500 +157569 1.200000 +157570 1.202500 +157581 0.740500 +157582 0.699500 +157583 1.282000 +157653 5.113000 +157659 5.161000 +157660 7.350000 +157662 4.769500 +157663 7.184500 +157670 4.656000 +157688 2.962000 +157689 4.342500 +157690 2.899500 +157691 2.963000 +157692 4.576500 +157693 3.481500 +157695 3.390500 +157696 4.721500 +157697 4.718500 +157698 4.700000 +157701 2.168000 +157702 4.474000 +157703 3.043500 +157711 4.551500 +157712 4.583500 +157721 7.311500 +157722 0.779500 +157775 7.341500 +157776 1.672500 +157778 1.342500 +157779 1.931000 +157780 6.586500 +157781 6.578000 +157786 3.900000 +157788 6.030000 +157789 6.746500 +157790 4.587500 +157791 6.685500 +157792 6.760500 +157794 7.085500 +157795 6.763500 +157796 6.782000 +157797 7.102500 +157798 7.104500 +157799 5.941000 +157800 7.079000 +157803 5.314000 +157810 6.036500 +157812 1.303000 +157813 7.056500 +157815 3.662000 +157816 4.782500 +157818 6.613500 +157820 4.703000 +157821 5.028000 +157822 2.807000 +157823 5.836500 +157824 4.367500 +157825 3.807000 +157826 2.365000 +157827 7.048000 +157828 3.314500 +157829 2.987000 +157830 3.083000 +157831 2.591500 +157832 2.874000 +157833 2.376000 +157834 2.919500 +157835 5.736000 +157836 7.062500 +157837 4.708000 +157838 5.490500 +157839 5.575500 +157840 3.800000 +157841 7.054500 +157842 4.218000 +157843 2.770000 +157844 3.123500 +157845 2.730500 +157846 0.616500 +157847 0.585000 +157848 0.587000 +157849 0.592000 +157852 0.583000 +157856 7.369000 +157857 5.106000 +157859 6.054000 +157860 5.508000 +157861 3.534500 +157862 7.053000 +157863 4.131500 +157865 4.343000 +157866 2.636500 +157867 4.471000 +157869 5.535000 +157870 3.546500 +157871 3.840500 +157873 3.640500 +157874 3.587500 +157875 6.759500 +157876 6.834500 +157877 6.761500 +157878 5.906500 +157879 7.094000 +157881 6.331500 +157882 5.390000 +157883 5.499500 +157884 5.411000 +157885 6.749500 +157886 5.234000 +157887 7.183500 +157888 6.537000 +157889 6.763000 +157890 7.338500 +157897 6.128500 +157929 0.729000 +157946 5.387500 +157969 7.025500 +157973 7.031500 +157977 7.033000 +157979 7.034500 +157980 7.032500 +157981 7.034000 +157982 7.032500 +157984 7.028500 +157986 7.027500 +157995 7.054000 +157998 7.056500 +157999 7.053000 +158000 7.070000 +158001 7.073500 +158003 7.054000 +158004 7.067000 +158005 5.513500 +158007 4.085000 +158009 5.813500 +158010 5.879000 +158014 3.506500 +158015 4.184000 +158018 5.646500 +158020 5.574000 +158022 3.909000 +158023 5.187500 +158029 6.959500 +158034 4.369500 +158071 6.670500 +158073 6.496500 +158074 6.633000 +158075 6.621500 +158077 6.574000 +158078 4.977500 +158079 5.678000 +158080 6.597000 +158081 6.374000 +158082 6.580500 +158083 6.571000 +158084 6.364000 +158089 6.266500 +158090 6.297500 +158091 6.271000 +158096 6.567500 +158097 5.571000 +158098 5.802000 +158099 6.439000 +158100 6.488000 +158101 6.252500 +158102 5.633500 +158103 6.309500 +158105 6.546000 +158107 6.331500 +158112 6.442000 +158113 5.380500 +158114 6.457500 +158116 6.464000 +158117 4.959000 +158118 4.965500 +158119 4.283000 +158120 6.429000 +158122 6.644000 +158123 6.403500 +158124 5.760500 +158125 6.452500 +158130 7.302000 +158136 4.644000 +158137 4.954000 +158139 4.513500 +158159 4.891000 +158174 7.335000 +158175 2.018500 +158176 2.030500 +158177 2.032000 +158178 2.024500 +158179 2.030500 +158180 2.032000 +158181 2.027500 +158182 2.027500 +158183 2.032000 +158184 2.029000 +158185 2.022000 +158186 2.025500 +158187 2.028500 +158188 2.030000 +158189 2.030500 +158190 2.033000 +158191 2.034000 +158192 2.035500 +158193 2.028000 +158194 2.029500 +158195 2.028000 +158196 2.029000 +158197 2.031500 +158198 2.021000 +158199 2.031500 +158200 2.032000 +158201 2.032000 +158202 2.021000 +158203 2.028000 +158204 2.030000 +158205 2.030500 +158206 2.031000 +158207 2.026500 +158208 2.027000 +158291 6.024000 +158292 2.035500 +158296 4.296000 +158297 5.667000 +158299 3.444000 +158300 3.134500 +158301 3.664500 +158302 4.536500 +158303 5.910000 +158328 5.703000 +158334 5.895000 +158335 6.656500 +158336 6.663500 +158338 0.998500 +158339 0.993000 +158340 0.998000 +158341 0.982000 +158342 1.014500 +158344 4.259500 +158348 6.355500 +158350 6.071000 +158351 6.355500 +158352 6.650500 +158353 6.638500 +158354 6.646500 +158357 6.655000 +158358 6.670500 +158365 4.258000 +158367 4.464500 +158368 3.262500 +158369 4.375500 +158373 3.021000 +158378 2.444500 +158379 5.014000 +158382 2.997000 +158383 4.141500 +158384 2.793500 +158387 2.686500 +158389 4.410000 +158390 4.658500 +158398 5.186000 +158399 5.187000 +158401 4.093500 +158402 1.840500 +158407 5.224000 +158408 5.229000 +158409 5.281000 +158410 1.883000 +158418 5.189500 +158419 4.901500 +158420 5.273500 +158422 3.366000 +158424 2.804000 +158425 1.519500 +158427 4.349500 +158429 5.349000 +158430 4.992500 +158431 3.175000 +158432 4.161500 +158433 4.979000 +158434 5.015500 +158439 4.757000 +158443 5.546000 +158447 5.002500 +158448 4.999000 +158451 4.936000 +158452 4.937500 +158453 4.937000 +158456 5.162000 +158460 5.101500 +158461 5.064500 +158462 5.098500 +158463 5.093000 +158464 1.881500 +158465 4.510000 +158466 4.247000 +158472 5.016500 +158473 4.406000 +158474 4.951500 +158475 5.009000 +158476 5.002500 +158477 5.006000 +158478 4.981500 +158479 4.998500 +158480 5.020500 +158481 5.016500 +158482 5.019000 +158483 5.014000 +158484 4.995500 +158485 4.985500 +158486 5.009000 +158487 5.036500 +158488 5.002000 +158489 5.039500 +158490 4.988500 +158491 5.026500 +158492 4.960000 +158493 5.034000 +158494 4.968500 +158495 5.031000 +158497 4.420500 +158498 4.463000 +158503 3.610500 +158510 5.885500 +158511 5.997500 +158516 1.084000 +158523 7.025000 +158524 7.020500 +158528 7.021500 +158536 7.026500 +158552 6.929000 +158575 7.795500 +158581 5.896500 +158588 7.339500 +158614 5.489500 +158622 5.262500 +158623 5.252500 +158625 5.264000 +158630 7.343500 +158632 4.658500 +158639 3.825000 +158650 2.793500 +158652 6.941000 +158653 7.347500 +158671 7.310500 +158740 0.861000 +158753 5.127500 +158759 7.343000 +158765 1.092000 +158773 0.905500 +158785 5.459000 +158786 5.454000 +158788 5.843500 +158798 7.347000 +158799 5.428500 +158801 6.248000 +158802 6.358000 +158807 6.197500 +158808 6.299000 +158809 6.355000 +158810 6.269500 +158812 5.337500 +158813 6.125000 +158814 6.137000 +158815 5.501000 +158820 3.327500 +158826 3.473000 +158840 0.909500 +158841 1.484000 +158842 3.819500 +158843 2.011500 +158844 2.010000 +158853 1.204000 +158857 1.201000 +158863 1.201500 +158870 1.208500 +158884 1.860000 +158887 1.335000 +158889 0.752500 +158890 1.316500 +158891 1.218000 +158892 2.228500 +158893 1.870500 +158910 7.350500 +158928 3.785000 +158930 4.145500 +158931 4.026000 +158932 4.575000 +158935 4.366000 +158937 4.131000 +158938 4.614500 +158941 4.033500 +158990 5.259500 +158998 5.286500 +158999 4.403500 +159000 5.284500 +159022 7.013500 +159023 7.015500 +159025 6.021500 +159029 3.414500 +159030 3.512000 +159031 4.094000 +159032 3.785000 +159035 2.350000 +159036 2.212500 +159037 2.730000 +159038 2.864500 +159039 2.007500 +159040 2.007500 +159041 2.008500 +159042 2.006500 +159043 2.007500 +159044 2.008500 +159045 2.008500 +159046 2.008000 +159047 2.006500 +159048 2.008000 +159049 2.007000 +159050 2.008000 +159051 2.006500 +159052 2.006500 +159053 2.006000 +159054 2.006500 +159055 2.007500 +159056 2.006000 +159057 2.006000 +159058 2.008500 +159059 2.007000 +159060 2.006000 +159061 2.007000 +159112 4.897000 +159143 1.686000 +159144 4.027000 +159145 2.551500 +159146 2.677000 +159148 4.599500 +159151 5.619500 +159152 3.019500 +159153 3.181000 +159154 1.620000 +159155 3.289500 +159156 3.643500 +159157 3.112000 +159158 4.457500 +159159 4.368500 +159160 1.454000 +159162 1.350500 +159169 1.741000 +159171 3.269500 +159185 5.455000 +159186 3.887000 +159195 5.880500 +159196 6.048500 +159203 5.935500 +159204 6.658500 +159205 5.978000 +159206 4.884000 +159208 6.659000 +159209 5.712500 +159212 5.776500 +159213 5.088500 +159214 7.037500 +159215 4.572500 +159216 5.414500 +159217 5.733000 +159218 5.766500 +159220 5.682000 +159221 5.684500 +159223 5.736500 +159224 5.750000 +159225 5.790000 +159226 5.736500 +159227 5.956000 +159228 7.042000 +159230 7.036000 +159241 7.347500 +159246 4.377500 +159247 4.356000 +159252 4.364500 +159259 4.385000 +159260 4.379500 +159266 6.477000 +159285 5.616000 +159317 1.474500 +159326 6.488000 +159327 6.428000 +159328 6.442000 +159329 6.201000 +159330 4.125500 +159331 4.798000 +159332 6.414500 +159333 5.344500 +159334 4.402500 +159335 4.214500 +159336 2.464500 +159337 6.671000 +159338 6.567500 +159340 0.806500 +159341 1.242000 +159342 0.878000 +159343 6.346500 +159344 5.046500 +159345 6.542000 +159346 6.525000 +159347 6.534500 +159348 6.518000 +159350 5.350000 +159356 4.326500 +159364 4.018500 +159368 5.794500 +159369 1.625500 +159370 5.708500 +159372 5.959500 +159373 3.833000 +159374 1.137000 +159378 3.876500 +159380 3.755000 +159381 4.294000 +159382 3.983000 +159383 3.869500 +159384 3.498500 +159396 5.545000 +159397 5.534500 +159399 3.225500 +159403 4.577000 +159404 7.368000 +159405 3.649500 +159406 7.248500 +159407 7.267500 +159408 7.238500 +159409 3.139500 +159410 3.123500 +159411 2.723000 +159412 2.581500 +159413 7.253500 +159414 7.107000 +159415 7.058000 +159417 7.123000 +159418 6.107500 +159419 6.289500 +159420 2.808000 +159421 7.075000 +159422 7.276000 +159424 5.254500 +159425 2.692000 +159426 6.070500 +159427 2.553000 +159428 2.402500 +159429 6.540000 +159430 2.645500 +159431 2.638500 +159433 2.711500 +159434 6.005000 +159435 6.495000 +159436 6.559500 +159439 6.002500 +159440 5.063000 +159441 6.157500 +159459 3.958000 +159466 4.555000 +159481 2.624000 +159483 2.010500 +159484 2.011000 +159485 2.007500 +159486 2.007500 +159487 2.009500 +159488 2.008000 +159489 2.009000 +159490 2.010000 +159491 2.010000 +159492 2.007500 +159493 2.010000 +159494 2.010500 +159495 2.010000 +159496 2.558000 +159497 2.011500 +159498 2.011500 +159499 2.009500 +159500 2.009500 +159501 2.010500 +159502 2.010500 +159503 2.011000 +159504 2.008000 +159505 1.507500 +159506 1.507500 +159507 1.509000 +159508 1.507500 +159509 1.511500 +159510 1.507500 +159511 1.510500 +159512 1.508000 +159513 1.506500 +159514 1.508500 +159515 1.508000 +159516 1.511500 +159517 1.509000 +159518 1.511000 +159519 1.508500 +159520 1.508000 +159521 1.509000 +159522 1.507500 +159523 1.508000 +159524 1.507500 +159538 5.562500 +159542 5.418500 +159544 5.454000 +159545 5.283000 +159546 5.087000 +159550 2.722000 +159551 5.410000 +159553 4.960000 +159562 5.394500 +159567 1.530500 +159568 2.449000 +159570 1.458500 +159579 2.232500 +159586 4.318500 +159587 3.809500 +159590 5.473000 +159593 4.268000 +159595 4.970000 +159604 5.095000 +159606 5.075500 +159610 2.734500 +159612 3.495500 +159615 2.796000 +159616 3.312500 +159617 3.409000 +159618 3.439500 +159619 3.000000 +159620 1.789500 +159622 3.011500 +159633 6.333500 +159635 6.232000 +159677 1.206000 +159678 1.250500 +159679 1.196000 +159681 1.197000 +159683 1.199000 +159687 1.200000 +159689 1.198000 +159692 1.197000 +159693 1.198000 +159695 1.198500 +159696 1.197500 +159697 1.197500 +159698 1.198000 +159699 1.198000 +159702 1.199500 +159705 1.197500 +159709 7.341000 +159734 6.576000 +159739 5.597500 +159743 6.064500 +159744 6.535000 +159745 1.688500 +159746 1.088500 +159747 2.654000 +159755 5.345000 +159756 2.509000 +159757 3.778500 +159758 6.158000 +159759 5.078000 +159761 4.380000 +159762 7.051000 +159763 3.548500 +159764 3.712000 +159765 4.078500 +159766 5.226000 +159767 4.567000 +159768 3.859500 +159769 5.622000 +159778 7.328000 +159779 4.374500 +159780 3.329500 +159781 3.315500 +159782 3.539000 +159783 1.978000 +159784 7.051000 +159785 4.409500 +159786 2.515000 +159787 2.308000 +159788 2.433000 +159789 5.509500 +159797 5.049000 +159798 2.599000 +159799 5.630000 +159800 5.838500 +159801 4.436500 +159802 4.630000 +159803 4.506500 +159804 2.254000 +159805 7.043500 +159806 7.043000 +159809 7.048500 +159812 4.179500 +159818 7.314000 +159819 5.454000 +159820 5.259000 +159821 4.170000 +159822 5.086500 +159825 3.901500 +159826 7.071500 +159830 5.966500 +159833 4.393000 +159834 5.175500 +159982 4.927500 +159985 6.492500 +159988 5.088000 +159996 5.149500 +160003 2.408000 +160004 3.594500 +160012 5.972500 +160018 3.802000 +160024 3.962000 +160025 3.298500 +160026 3.739500 +160036 5.383000 +160039 2.215000 +160041 3.450500 +160044 1.968500 +160045 4.365500 +160046 1.604500 +160056 2.846500 +160057 4.165500 +160071 1.154500 +160076 3.961000 +160085 1.717500 +160093 7.050000 +160094 3.656000 +160095 4.062500 +160096 7.049500 +160098 4.478000 +160100 5.432000 +160101 3.526500 +160105 5.141500 +160106 2.738500 +160107 5.586500 +160108 2.803500 +160117 6.246500 +160121 3.163000 +160128 5.496000 +160129 2.394000 +160130 6.142000 +160137 6.193500 +160140 2.972500 +160142 2.087500 +160143 2.504500 +160144 2.062000 +160146 2.994500 +160148 4.706500 +160149 5.124000 +160151 7.059000 +160152 6.527000 +160153 5.030000 +160158 4.466000 +160160 3.735500 +160164 3.739000 +160165 3.186000 +160166 4.486000 +160167 3.877500 +160168 6.107500 +160170 4.810000 +160172 3.705500 +160175 0.674000 +160176 0.609500 +160181 4.127500 +160185 7.356000 +160186 4.110500 +160187 4.590500 +160189 4.811500 +160190 4.341500 +160191 4.273500 +160192 4.439500 +160193 4.063000 +160194 3.305000 +160195 2.857500 +160196 3.362000 +160197 4.238000 +160198 4.539500 +160199 4.072000 +160200 3.974500 +160201 3.918000 +160202 3.649500 +160203 3.864000 +160204 4.122500 +160205 3.820500 +160206 4.084000 +160207 3.491000 +160208 4.191000 +160209 4.222000 +160210 3.908000 +160211 3.011000 +160212 3.011000 +160213 3.012000 +160214 3.707000 +160215 3.539500 +160216 3.806500 +160217 3.877000 +160218 4.222000 +160219 3.774500 +160220 4.428500 +160221 3.363500 +160222 4.049000 +160223 4.099000 +160224 2.511000 +160226 3.742000 +160237 7.312500 +160261 1.568000 +160263 1.838000 +160264 1.772000 +160265 1.764500 +160281 7.309000 +160284 5.418000 +160289 4.879500 +160293 2.130000 +160299 5.250000 +160300 5.404500 +160302 4.197000 +160305 4.424500 +160307 5.033500 +160320 3.862500 +160321 4.611500 +160322 5.229000 +160325 4.444000 +160337 3.958500 +160338 2.825500 +160352 3.644000 +160353 5.527500 +160359 6.040500 +160360 5.989000 +160361 3.112000 +160363 5.889000 +160364 3.120000 +160366 3.139500 +160368 6.037000 +160373 5.630500 +160375 5.106000 +160376 4.613000 +160377 4.609000 +160378 0.821000 +160379 4.630500 +160380 4.604000 +160381 4.618000 +160382 4.600000 +160402 6.625500 +160403 6.412500 +160440 5.251000 +160448 4.923000 +160462 5.571000 +160483 7.352500 +160495 5.933500 +160496 5.851000 +160501 3.254000 +160506 5.983000 +160507 5.839000 +160512 6.052000 +160517 7.343000 +160519 5.094000 +160530 5.737500 +160531 5.865500 +160532 5.520000 +160535 1.321000 +160536 5.320500 +160537 5.381500 +160539 2.923000 +160540 5.319500 +160541 5.353500 +160543 5.453500 +160559 5.488500 +160560 5.330000 +160561 5.143000 +160587 6.266000 +160588 6.346000 +160589 6.964500 +160591 6.890000 +160592 6.532000 +160594 6.078500 +160599 7.353500 +160600 5.578500 +160601 4.099500 +160603 3.016500 +160604 3.022000 +160605 3.193500 +160606 3.011000 +160607 3.010000 +160608 3.007500 +160609 3.006000 +160610 3.018500 +160613 3.006500 +160614 3.005000 +160615 3.007000 +160616 3.006000 +160617 0.522000 +160618 3.007000 +160619 3.006500 +160620 3.007000 +160621 3.012500 +160622 3.014000 +160623 0.536500 +160624 3.009000 +160625 3.009000 +160626 3.007000 +160627 3.009000 +160631 7.347000 +160634 7.011000 +160636 5.856000 +160637 5.836500 +160639 5.841000 +160641 5.872500 +160642 5.884000 +160643 5.876500 +160644 5.842500 +160648 5.815000 +160649 5.822500 +160650 5.836000 +160651 5.788500 +160653 5.867000 +160654 6.095000 +160655 6.080000 +160656 5.947000 +160658 6.053000 +160659 6.095500 +160664 6.862000 +160668 7.028000 +160671 7.027000 +160676 4.834000 +160678 7.028500 +160679 7.028000 +160699 5.103500 +160701 5.903000 +160709 5.184000 +160722 5.731000 +160775 6.080000 +160778 5.494500 +160779 5.501500 +160780 5.485500 +160781 5.478000 +160782 5.508000 +160783 5.513000 +160816 3.418000 +160818 2.882500 +160820 5.337500 +160821 4.846000 +160822 5.771000 +160824 5.571500 +160825 5.577500 +160826 5.774500 +160827 3.767500 +160828 0.704000 +160830 4.287000 +160831 4.559500 +160832 5.920000 +160833 3.085000 +160834 5.772000 +160835 5.959500 +160838 4.363500 +160839 3.828500 +160849 7.322000 +160851 6.285000 +160853 5.825500 +160855 4.298500 +160857 2.026000 +160858 4.824000 +160859 2.014000 +160860 6.174500 +160861 6.254500 +160864 6.228000 +160865 6.396500 +160866 6.114000 +160868 6.074000 +160870 6.188500 +160871 6.093500 +160873 6.066500 +160874 6.014500 +160875 6.253500 +160877 6.111000 +160878 4.564500 +160879 5.881000 +160880 6.136000 +160882 4.169000 +160883 4.144000 +160885 4.515000 +160890 6.730500 +160891 5.187500 +160892 4.303000 +160893 6.149500 +160896 6.173500 +160898 3.414500 +160909 3.592000 +160916 5.431500 +160922 1.860000 +160946 6.456500 +160960 7.314500 +160978 1.412500 +160979 4.810000 +160993 7.345000 +160998 5.053000 +161000 5.519500 +161001 4.880500 +161010 5.089500 +161014 4.759000 +161025 7.346000 +161026 4.231500 +161029 2.746500 +161031 2.597500 +161045 0.947000 +161046 0.664000 +161047 1.945000 +161048 1.459000 +161063 7.347000 +161068 7.556500 +161069 7.558000 +161070 7.551000 +161071 7.535000 +161072 7.550000 +161073 7.549500 +161074 7.549000 +161075 7.546500 +161076 7.550000 +161077 7.552000 +161082 4.514500 +161101 7.364000 +161112 7.425500 +161113 7.425000 +161120 0.615500 +161126 1.693500 +161128 2.307500 +161130 1.079500 +161131 0.846500 +161135 7.346000 +161180 1.015000 +161181 1.049000 +161182 1.000500 +161183 0.933500 +161184 0.941500 +161185 0.956000 +161186 0.962000 +161187 0.980500 +161189 0.924500 +161190 1.089000 +161191 1.134500 +161192 0.705000 +161193 0.666500 +161194 0.880500 +161195 0.915500 +161200 6.159000 +161201 6.208000 +161204 5.519000 +161205 5.523500 +161206 5.516500 +161207 6.404500 +161213 6.877000 +161214 6.873500 +161217 6.948000 +161224 6.426000 +161225 6.154500 +161226 4.424000 +161227 4.093000 +161228 5.093500 +161229 6.576000 +161230 6.581000 +161231 6.369500 +161232 6.347500 +161234 5.824000 +161235 6.752500 +161236 6.759500 +161237 4.150000 +161238 5.120500 +161239 6.739500 +161240 2.416000 +161241 3.320500 +161242 2.480500 +161243 3.922500 +161244 3.432000 +161245 2.801500 +161246 3.659000 +161247 2.230000 +161278 1.612500 +161279 2.095000 +161281 1.867000 +161282 1.812500 +161288 3.351500 +161289 3.703000 +161290 2.996000 +161293 3.793500 +161296 3.673500 +161297 4.343500 +161298 4.947000 +161299 4.783000 +161301 3.238000 +161302 3.318500 +161303 0.742000 +161315 3.925000 +161316 1.724500 +161318 2.189500 +161323 3.730000 +161324 5.036000 +161325 4.676500 +161326 4.466000 +161327 1.402000 +161328 3.183500 +161330 2.550000 +161332 2.558500 +161334 1.440000 +161337 3.329500 +161338 3.007500 +161339 1.661500 +161340 1.699000 +161341 2.141000 +161355 5.066000 +161362 2.476000 +161363 0.995000 +161365 1.991500 +161366 1.458500 +161368 2.189000 +161369 1.511000 +161375 2.591500 +161396 4.154000 +161419 2.649000 +161427 4.784500 +161428 3.578500 +161429 3.703000 +161430 3.599000 +161431 3.822500 +161432 3.137500 +161433 4.113500 +161434 4.133000 +161435 3.824000 +161436 5.145000 +161439 4.232500 +161440 5.085000 +161441 4.385500 +161442 3.885500 +161443 3.646500 +161445 4.224000 +161451 3.729500 +161457 3.587000 +161490 7.335500 +161534 7.337500 +161542 6.190000 +161543 6.191000 +161544 6.670500 +161547 6.690000 +161563 4.329000 +161569 3.466500 +161570 3.384000 +161571 2.606000 +161572 2.358500 +161573 2.753500 +161574 2.377000 +161575 3.294000 +161585 5.259000 +161589 4.469500 +161594 3.126000 +161606 3.428000 +161616 5.235000 +161617 4.955000 +161632 0.544000 +161634 3.065000 +161715 5.089500 +162163 3.803500 +162207 6.852500 +162210 6.454500 +162211 1.811000 +162218 6.847000 +162223 4.340500 +162239 5.985000 +162259 5.907000 +162270 7.032500 +162271 3.704500 +162272 5.885500 +162273 4.920500 +162274 2.494500 +162275 3.556500 +162277 2.724000 +162286 5.509000 +162288 5.658000 +162289 0.500000 +162290 4.042500 +162295 6.190500 +162310 2.130000 +162311 4.893000 +162315 3.630000 +162332 7.079500 +162334 6.824000 +162338 0.639500 +162339 0.598500 +162340 4.311000 +162341 7.221500 +162342 4.369500 +162345 5.817500 +162353 0.580500 +162354 4.899000 +162398 6.832000 +162401 2.818500 +162417 3.907000 +162418 1.654000 +162420 5.535000 +162421 4.187000 +162423 2.235500 +162427 4.824000 +162428 3.952500 +162429 4.004500 +162430 4.028000 +162432 4.229000 +162433 4.088000 +162438 7.077500 +162440 7.060500 +162456 4.227500 +162457 0.944500 +162458 4.905500 +162459 5.249500 +162460 4.875500 +162461 3.842500 +162462 1.456000 +162463 4.722000 +162465 5.057000 +162466 5.172500 +162467 5.353000 +162468 5.305500 +162469 5.184000 +162470 5.251500 +162482 7.098500 +162483 3.872500 +162484 4.057000 +162485 4.227500 +162486 3.942500 +162487 4.224500 +162488 4.115500 +162490 4.353000 +162491 4.046000 +162492 7.045500 +162493 7.702500 +162496 7.036500 +162497 8.017000 +162498 7.488000 +162519 7.136000 +162538 4.283500 +162539 4.516500 +162541 4.184500 +162542 4.789500 +162544 4.868500 +162545 5.614500 +162547 3.295000 +162553 6.429500 +162554 6.459000 +162555 6.443500 +162692 3.395000 +162694 3.518500 +162705 6.948500 +162714 1.483000 +162720 6.087000 +162721 6.161000 +162726 5.552000 +162741 6.961500 +162776 7.079000 +162791 4.969000 +162792 4.509000 +162794 4.138500 +162806 2.216500 +162808 2.995000 +162809 1.811500 +162810 5.950000 +162816 4.587500 +162817 4.062500 +162818 4.742000 +162819 2.504500 +162820 4.420000 +162821 5.628500 +162822 3.282500 +162823 4.473500 +162824 2.506500 +162825 4.911000 +162826 5.418500 +162827 3.974500 +162828 5.847500 +162829 3.968000 +162830 5.418500 +162831 4.335000 +162832 4.499000 +162833 1.481000 +162834 4.371500 +162835 4.704500 +162836 4.371500 +162837 4.997000 +162838 3.747000 +162839 5.981500 +162840 3.006000 +162841 3.006500 +162842 3.007500 +162843 4.414500 +162844 3.005000 +162845 3.007500 +162901 7.105000 +162902 7.093500 +162903 7.077500 +162909 1.194500 +162935 4.299500 +162936 3.121500 +162937 1.503000 +162945 5.776500 +162951 5.635000 +162952 5.232500 +162956 5.158000 +162957 5.413000 +162958 5.504000 +162961 5.444500 +162974 2.651000 +162975 2.148500 +162976 3.473500 +162978 3.404000 +162979 4.324000 +162980 3.277500 +162981 3.821000 +162982 2.557000 +162983 3.307000 +162984 3.102000 +162985 3.208000 +162986 3.078000 +162987 3.242500 +162988 2.530500 +162990 4.987500 +162991 3.614000 +162992 3.717000 +162993 3.593500 +162994 3.497000 +162995 4.440500 +162998 5.423500 +162999 7.052000 +163006 2.630500 +163020 3.576500 +163022 3.630000 +163023 4.083500 +163024 3.434500 +163025 4.670000 +163026 4.136500 +163027 3.861500 +163028 5.264000 +163029 4.081000 +163030 3.987500 +163031 3.238000 +163033 4.076000 +163034 3.251000 +163035 4.413000 +163036 5.108000 +163037 6.149500 +163038 4.063500 +163039 4.816000 +163040 4.884000 +163041 5.094500 +163042 4.593000 +163043 4.724500 +163044 4.558500 +163045 5.070500 +163046 6.004500 +163047 4.823500 +163048 6.235500 +163049 6.048000 +163050 6.372500 +163051 6.276500 +163052 3.168000 +163053 2.436000 +163054 4.591000 +163055 5.146500 +163056 2.929500 +163057 3.003000 +163058 5.014500 +163059 4.276000 +163060 3.051500 +163061 5.011000 +163062 5.219000 +163075 2.888500 +163076 3.210500 +163099 7.375500 +163132 5.142500 +163133 4.976000 +163134 5.204500 +163135 5.208500 +163137 2.694500 +163143 7.371500 +163154 4.339000 +163159 0.695500 +163199 1.905500 +163200 5.804500 +163203 5.783000 +163207 5.723500 +163209 5.676500 +163210 5.453500 +163211 2.899000 +163212 5.638500 +163224 7.724500 +163226 7.723500 +163227 7.723500 +163235 7.366500 +163239 5.099500 +163241 5.081500 +163242 5.160500 +163243 5.156500 +163245 5.165500 +163246 5.183000 +163247 5.150000 +163248 5.163500 +163254 5.131000 +163255 5.525500 +163257 5.337000 +163258 5.379000 +163259 5.387500 +163275 6.209500 +163276 5.613000 +163277 2.571500 +163278 2.578000 +163279 2.506500 +163280 2.550000 +163281 2.490000 +163282 2.507000 +163283 2.506500 +163284 7.049500 +163286 7.052000 +163287 4.836000 +163303 7.370000 +163306 5.439000 +163307 2.322500 +163308 2.311500 +163309 4.628500 +163311 3.011500 +163312 3.649000 +163314 4.675500 +163319 2.566500 +163320 2.955000 +163321 2.988500 +163322 3.898500 +163323 2.626000 +163324 2.804500 +163325 3.322500 +163326 3.090000 +163327 4.209500 +163433 5.495000 +163434 5.477000 +163460 5.146500 +163461 5.100000 +163462 0.899500 +163474 5.405500 +163516 5.468000 +163522 3.972000 +163523 5.182000 +163530 4.519000 +163595 1.164500 +163601 6.631000 +163602 6.513000 +163603 6.519000 +163604 6.544500 +163605 1.665000 +163611 6.108000 +163648 4.259000 +163649 4.174000 +163654 5.901500 +163699 5.333000 +163700 6.054000 +163701 6.060500 +163702 1.857000 +163704 5.971500 +163705 0.992000 +163709 0.952000 +163714 7.040500 +163720 5.167000 +163735 6.103500 +163741 5.547000 +163743 7.020000 +163749 6.878000 +163751 5.739500 +163760 5.521500 +163761 5.499000 +163762 5.462000 +163773 5.476000 +163781 5.151500 +163783 4.856000 +163784 2.335000 +163785 1.764500 +163801 5.670500 +163803 5.655500 +163805 5.647000 +163806 5.777000 +163807 5.645500 +163809 5.652500 +163810 5.649500 +163812 5.242500 +163817 6.897500 +163820 5.961500 +163822 7.022500 +163824 7.022000 +163827 5.946500 +163836 7.020000 +164029 0.705000 +164037 4.956000 +164074 6.820500 +164083 7.133000 +164115 5.265000 +164126 7.089500 +164128 5.904500 +164129 6.013500 +164130 6.033500 +164131 6.042000 +164132 0.935000 +164133 5.414500 +164150 7.094500 +164168 5.355000 +164175 6.126500 +164185 7.135000 +164204 7.068500 +164219 5.969500 +164223 7.237500 +164224 4.082500 +164225 0.507000 +164226 4.827000 +164227 6.800000 +164238 4.235500 +164243 5.399000 +164247 5.004500 +164273 1.866500 +164274 5.456000 +164276 5.701500 +164277 5.030000 +164278 5.160500 +164279 6.109000 +164280 4.175500 +164281 5.646000 +164286 2.441000 +164290 6.393000 +164291 3.336000 +164292 5.688000 +164293 6.082500 +164294 5.329000 +164299 7.119500 +164300 4.873000 +164301 4.157000 +164302 6.034000 +164303 2.234500 +164305 3.460500 +164306 2.650500 +164307 3.972500 +164308 2.425000 +164313 2.428500 +164314 2.940500 +164317 2.989500 +164319 7.091000 +164321 5.542500 +164323 1.835500 +164324 2.415000 +164330 6.149500 +164331 4.768500 +164332 6.197000 +164333 4.571000 +164334 6.206000 +164335 6.229500 +164338 4.828000 +164347 1.199500 +164350 0.891000 +164351 3.069500 +164352 4.792000 +164355 3.292500 +164360 5.414500 +164361 4.194000 +164363 2.162500 +164364 1.865500 +164365 3.876500 +164367 2.340500 +164368 2.996500 +164369 3.570500 +164370 2.696000 +164372 5.018000 +164373 4.814000 +164375 3.798500 +164384 1.284500 +164391 1.309000 +164398 1.198000 +164400 1.197500 +164401 1.315500 +164403 1.198000 +164424 7.365000 +164438 5.362000 +164439 3.107000 +164444 2.427500 +164445 2.428000 +164446 4.209000 +164448 4.228000 +164450 3.401000 +164451 4.642500 +164453 4.479500 +164462 6.944500 +164469 3.866000 +164471 3.865500 +164472 3.315000 +164474 3.217500 +164491 4.812000 +164514 4.133000 +164516 4.199000 +164528 3.989500 +164538 4.035500 +164546 7.374500 +164547 6.380500 +164548 2.308500 +164550 5.724000 +164551 3.615000 +164553 3.807000 +164554 2.161000 +164555 3.660500 +164557 3.769500 +164558 3.870000 +164560 4.546000 +164561 5.051000 +164562 3.644500 +164563 3.725000 +164564 4.484500 +164566 5.585500 +164571 5.018500 +164574 4.823000 +164579 4.579500 +164580 3.763500 +164581 4.939500 +164582 4.342500 +164583 4.304500 +164584 4.860000 +164630 6.561500 +164631 6.566500 +164632 6.564500 +164633 6.563000 +164634 6.563500 +164635 6.553500 +164636 6.549000 +164637 6.565000 +164638 6.560500 +164639 6.562500 +164640 6.566000 +164641 6.561500 +164643 6.563500 +164646 4.531500 +164667 2.741000 +164668 4.419000 +164669 3.984000 +164670 3.567000 +164671 3.528000 +164672 3.584000 +164673 3.180000 +164674 4.377000 +164676 3.690000 +164677 4.875500 +164678 3.868500 +164679 3.655500 +164680 4.567500 +164682 4.668000 +164686 1.676500 +164694 6.557500 +164695 6.562000 +164696 6.561500 +164697 6.565500 +164698 6.535000 +164699 6.552500 +164700 6.540000 +164701 6.541500 +164702 6.551500 +164703 6.552000 +164707 6.551500 +164708 6.548500 +164709 6.552000 +164710 6.550000 +164711 6.544000 +164713 1.557000 +164716 2.470500 +164717 3.601000 +164723 6.406000 +164773 7.375500 +164777 7.379000 +164786 6.873500 +164794 6.724000 +164796 6.831500 +164802 6.358000 +164803 5.856000 +164804 6.286500 +164805 6.139000 +164807 6.498500 +164808 6.876000 +164809 6.871500 +164810 6.869500 +164811 4.803500 +164812 4.064000 +164815 7.040500 +164816 7.052000 +164833 7.036500 +164838 7.037000 +164842 7.039000 +164849 4.576000 +164850 7.032500 +164863 2.160500 +164869 5.294000 +164871 4.356000 +164872 4.624000 +164876 5.534500 +164881 5.271000 +164882 5.209500 +164885 0.655500 +164894 5.211500 +164904 5.062000 +164905 5.311500 +164906 5.156000 +164914 7.035500 +164915 7.035500 +164916 7.033000 +164917 7.032500 +164918 7.032500 +164919 7.030500 +164920 7.036000 +164921 7.036000 +164922 7.037500 +164923 7.039500 +164924 7.039000 +164925 7.034000 +164932 5.853500 +164933 3.359000 +164934 3.189500 +164935 5.359000 +164937 5.831500 +164938 5.376500 +164939 5.706500 +164942 3.588500 +164943 3.093000 +164944 2.283500 +164945 2.168000 +164946 2.140000 +164947 4.128500 +164948 4.135000 +164949 4.306500 +164950 5.551500 +164959 3.721500 +164961 3.172000 +164962 2.961500 +164963 3.134000 +164964 2.931000 +164971 7.354500 +164972 3.860000 +164976 3.424000 +164983 2.791000 +164984 3.487000 +164989 3.408000 +164990 3.747500 +164992 3.107500 +164994 1.744000 +164995 1.725500 +165000 2.307500 +165001 2.701500 +165002 2.949000 +165003 2.043500 +165004 4.216500 +165011 6.454500 +165050 6.391000 +165092 4.538500 +165093 4.920500 +165103 6.180000 +165104 6.378000 +165105 6.207000 +165106 6.872500 +165107 6.875500 +165108 5.901500 +165109 3.856500 +165110 4.365000 +165111 3.900500 +165112 1.231000 +165121 1.053500 +165123 7.040000 +165126 8.916000 +165127 8.972000 +165128 8.984000 +165132 8.950000 +165133 8.396000 +165136 8.339000 +165139 7.276500 +165140 6.272500 +165144 4.433000 +165150 5.239000 +165152 4.884500 +165154 4.885000 +165174 5.856500 +165187 3.380500 +165189 2.951000 +165191 4.084000 +165197 5.426500 +165198 3.287500 +165199 3.300500 +165200 3.792500 +165201 3.688500 +165206 6.123000 +165207 5.733500 +165208 5.257000 +165224 2.531500 +165226 6.163500 +165227 6.786000 +165233 7.371000 +165235 2.986500 +165236 4.640000 +165237 3.310000 +165238 2.744000 +165239 2.481000 +165242 2.804000 +165243 2.974000 +165244 2.743000 +165246 5.050500 +165247 3.581500 +165248 4.692000 +165249 3.925000 +165250 2.879000 +165251 6.871500 +165253 3.742500 +165257 5.182500 +165259 4.922000 +165261 4.965000 +165263 4.330000 +165265 5.007000 +165271 5.787000 +165272 5.678000 +165273 5.653500 +165274 5.649500 +165279 6.363000 +165282 6.835500 +165294 5.336500 +165348 4.656000 +165355 4.547000 +165363 1.081000 +165364 1.197500 +165371 1.198000 +165374 1.200000 +165384 1.199500 +165385 1.198000 +165399 3.424000 +165401 5.448000 +165404 5.337500 +165409 3.687500 +165411 5.443000 +165412 5.618500 +165414 5.594000 +165416 5.617500 +165417 5.523000 +165418 4.084000 +165421 3.356500 +165453 1.280500 +165459 7.364000 +165490 4.580000 +165493 3.722000 +165496 3.489000 +165503 5.512500 +165511 3.082500 +165524 7.367000 +165525 0.944000 +165526 2.261000 +165527 2.494000 +165528 2.425000 +165529 2.392500 +165531 2.319000 +165532 2.696000 +165533 2.266500 +165534 3.569000 +165535 1.770000 +165536 1.952500 +165539 2.699000 +165540 4.215000 +165542 3.246000 +165543 2.529500 +165544 2.959000 +165669 5.548500 +165670 6.205000 +165671 4.875000 +165672 4.755000 +165673 5.222000 +165676 4.819000 +165677 7.097500 +165678 7.077500 +165680 3.824500 +165682 3.008000 +165686 5.157500 +165688 6.094000 +165691 0.557500 +165693 1.280000 +165694 1.305000 +165703 0.749000 +165709 1.670000 +165711 2.224000 +165712 1.755000 +165715 4.545500 +165716 2.814000 +165717 1.084000 +165718 1.398000 +165722 2.276000 +165724 3.409500 +165726 5.542500 +165727 2.317000 +165728 3.328000 +165729 1.471500 +165731 2.415500 +165811 0.701500 +165812 0.709000 +165814 8.524500 +165815 8.773500 +165816 8.364000 +165817 3.328000 +165819 8.182500 +165821 6.182000 +165822 8.939000 +165823 3.673500 +165824 8.283500 +165825 8.637000 +165826 8.103500 +165827 7.650000 +165828 0.850500 +165830 0.728500 +165831 1.035000 +165832 1.229500 +165833 8.264000 +165834 5.796500 +165835 6.416000 +165836 5.846000 +165837 5.023000 +165838 8.247500 +165845 0.824000 +165848 0.794500 +165850 0.804000 +165851 5.665000 +165855 7.023000 +165856 7.021000 +165858 7.061500 +165883 1.541000 +165884 3.719500 +165886 1.993500 +165899 3.652500 +165900 1.141500 +165901 3.660500 +165902 0.577000 +165903 1.003000 +165907 3.622000 +165908 3.657000 +165909 4.088500 +165968 6.133500 +165969 5.141500 +165970 6.136500 +165978 3.706500 +165979 4.392000 +165981 6.874500 +165985 7.376000 +165986 6.873500 +165987 4.666000 +165988 6.130000 +165989 5.341500 +165990 4.721000 +165991 6.128500 +165992 4.528500 +165993 4.597000 +165994 4.504000 +165995 4.066000 +165996 4.524000 +165997 5.130000 +165998 3.553500 +165999 5.178000 +166000 6.137000 +166001 6.136000 +166002 3.245000 +166003 3.091500 +166004 6.140500 +166005 6.594000 +166006 3.079500 +166007 6.813000 +166011 1.464500 +166012 3.739500 +166017 7.375500 +166018 3.170500 +166019 3.104000 +166020 3.202000 +166022 5.481500 +166024 5.252000 +166028 4.048500 +166038 5.532000 +166039 5.195000 +166047 3.737500 +166053 5.434000 +166072 5.713000 +166076 1.704000 +166079 5.437500 +166082 5.560000 +166088 5.480500 +166095 3.881000 +166096 5.476500 +166097 5.689000 +166098 5.769000 +166116 6.058000 +166119 5.500000 +166121 5.339000 +166125 5.386500 +166128 3.336500 +166139 7.070000 +166152 5.840000 +166153 7.009000 +166154 7.013500 +166155 7.009500 +166157 7.010000 +166159 5.882000 +166160 5.853000 +166161 5.843000 +166164 5.887000 +166170 4.815500 +166178 3.918500 +166179 5.433500 +166184 3.407000 +166185 5.114500 +166186 5.107000 +166187 2.835500 +166188 5.043500 +166190 5.060000 +166191 5.076000 +166192 5.114000 +166254 5.385000 +166255 5.945500 +166257 2.609500 +166258 2.743500 +166260 3.786500 +166261 6.075000 +166262 4.591500 +166281 0.872000 +166282 1.856000 +166284 1.852500 +166287 1.040500 +166288 1.258500 +166289 1.092000 +166290 1.300500 +166291 0.908000 +166292 1.206000 +166293 1.034500 +166294 0.791000 +166295 1.102500 +166299 1.181500 +166300 5.736000 +166301 2.237000 +166302 2.138500 +166304 2.433500 +166305 5.557000 +166306 2.899000 +166307 5.523000 +166311 1.607000 +166312 1.560500 +166314 2.694500 +166315 1.480500 +166318 0.977500 +166319 1.014000 +166320 1.962000 +166321 2.454000 +166322 1.771000 +166323 2.741500 +166324 2.657000 +166325 1.983500 +166328 4.104500 +166329 1.742500 +166330 1.990000 +166334 6.963500 +166342 5.222000 +166344 4.802500 +166363 4.637000 +166364 3.482000 +166365 5.297500 +166395 1.394500 +166413 4.430000 +166414 4.922500 +166418 4.658000 +166422 2.659500 +166435 5.569500 +166436 5.445000 +166437 2.427500 +166438 5.051500 +166439 4.867500 +166440 5.329000 +166441 3.928000 +166443 4.451000 +166445 3.787000 +166446 4.699000 +166447 4.701000 +166448 5.217000 +166449 4.478000 +166450 4.461000 +166451 2.443500 +166452 4.280000 +166453 2.278500 +166454 4.837500 +166456 4.992500 +166457 4.171000 +166458 5.322500 +166459 5.606500 +166460 4.747500 +166461 5.549000 +166462 3.526000 +166463 3.614000 +166464 3.506500 +166465 3.790000 +166466 3.688500 +166467 4.269500 +166468 3.757000 +166469 3.656000 +166470 3.508500 +166493 4.079000 +166500 4.080500 +166502 4.956000 +166503 4.033000 +166527 2.580500 +166550 5.122000 +166551 4.000500 +166552 3.457500 +166553 4.474000 +166554 3.895000 +166555 5.035500 +166559 3.257000 +166560 3.396500 +166562 4.293000 +166563 4.003000 +166564 5.055500 +166565 4.187500 +166571 3.029000 +166575 5.315500 +166576 6.179000 +166594 0.553000 +166599 5.618500 +166601 2.505000 +166605 5.589500 +166607 5.651500 +166610 5.418000 +166611 5.363500 +166616 5.621000 +166622 5.638500 +166627 4.192500 +166629 2.826500 +166630 4.170000 +166631 4.205500 +166632 4.198000 +166633 4.170000 +166635 4.146000 +166636 4.151000 +166637 4.147500 +166638 4.153500 +166639 4.152000 +166640 4.159000 +166641 3.278500 +166642 4.150500 +166643 4.151500 +166644 5.156500 +166645 2.218500 +166646 5.202000 +166648 5.156500 +166649 5.168500 +166650 5.163000 +166651 5.172500 +166652 5.170000 +166653 5.174000 +166654 5.160500 +166655 5.161000 +166656 5.165500 +166657 5.162500 +166658 5.166500 +166659 5.166000 +166660 5.174000 +166671 1.659500 +166672 1.727500 +166673 1.632500 +166674 1.788000 +166675 1.692000 +166677 1.915000 +166681 4.836500 +166682 4.692000 +166684 5.514000 +166686 3.270500 +166687 4.721000 +166688 5.213000 +166689 5.935500 +166691 4.508000 +166692 5.251000 +166712 1.034000 +166713 1.150000 +166714 1.040000 +166715 5.345000 +166719 1.923500 +166729 5.508500 +166738 3.744000 +166741 1.511500 +166742 3.308000 +166776 1.074000 +166778 1.088500 +166779 0.894500 +166780 0.912500 +166781 0.966500 +166783 1.571500 +166784 2.023500 +166792 3.830500 +166796 1.505500 +166799 1.393000 +166800 2.193000 +166801 3.007500 +166802 3.758000 +166811 5.160000 +166815 5.113500 +166816 4.729000 +166817 2.436500 +166818 3.124000 +166819 4.611000 +166820 4.022000 +166821 4.340500 +166822 4.279500 +166823 4.161500 +166824 4.267000 +166825 4.304000 +166826 4.482500 +166827 2.559500 +166828 4.965000 +166829 3.224000 +166830 4.550500 +166831 4.716500 +166832 5.033000 +166840 4.949000 +166855 4.367000 +166856 5.820500 +166859 5.542500 +166860 5.404500 +166861 4.097500 +166862 4.806500 +166863 4.617000 +166867 3.153000 +166869 4.392000 +166870 4.478500 +166871 1.504500 +166872 4.060000 +166873 5.047000 +166874 4.759000 +166875 4.478000 +166876 5.145500 +166877 2.637000 +166878 4.153000 +166879 3.578000 +166880 5.237000 +166881 5.431500 +166882 4.975000 +166884 5.129500 +166885 5.227000 +166886 5.299000 +166887 5.671500 +166888 5.345500 +166890 6.104500 +166891 5.377500 +166892 4.732500 +166913 5.838500 +166914 4.631500 +166915 5.392000 +166918 5.389500 +166919 5.366500 +166927 1.065500 +166928 1.742500 +166929 4.976000 +166930 5.046000 +166931 4.051500 +166932 4.228500 +166933 4.225500 +166934 4.400500 +166935 4.478000 +166936 4.230500 +166937 4.190500 +166938 3.778000 +166939 4.098500 +166942 2.899000 +166943 4.016000 +166944 5.286500 +166945 5.955000 +166950 6.116500 +166952 5.292500 +166953 5.259000 +167063 0.673000 +167085 2.085500 +167086 5.535500 +167094 0.660000 +167096 0.741500 +167103 0.736500 +167105 0.789500 +167106 0.783500 +167107 0.787500 +167108 0.723000 +167118 2.798000 +167133 1.693000 +167146 4.320500 +167150 5.478500 +167163 4.934000 +167189 2.112500 +167224 0.789500 +167245 5.410000 +167269 2.186000 +167278 5.405000 +167282 5.119000 +167283 5.136500 +167304 5.651000 +167312 5.370500 +167316 5.685000 +167323 2.984500 +167333 3.190000 +167334 1.819500 +167335 2.169500 +167336 1.749000 +167337 5.923500 +167338 6.031500 +167339 2.289000 +167340 3.335500 +167341 3.055500 +167342 5.238500 +167343 2.486000 +167344 2.552500 +167345 1.991500 +167346 2.029500 +167347 5.761500 +167352 5.717500 +167359 5.725000 +167363 1.167000 +167407 5.777500 +167415 4.738000 +167429 4.494000 +167436 0.886500 +167438 3.657500 +167442 0.734500 +167445 4.861000 +167446 0.689500 +167447 1.046000 +167448 1.219000 +167450 4.776000 +167452 5.180500 +167454 0.991500 +167456 1.013000 +167458 3.967500 +167459 1.044500 +167461 1.095500 +167462 1.143500 +167464 4.364000 +167465 4.265000 +167469 2.654500 +167470 1.177000 +167471 1.076500 +167472 4.538500 +167476 4.870000 +167477 1.109000 +167478 1.092000 +167479 1.026500 +167480 5.073500 +167487 2.159000 +167488 5.269000 +167492 7.088000 +167494 3.478500 +167496 6.479500 +167497 6.663000 +167498 6.497500 +167500 5.281500 +167501 6.870000 +167503 4.615500 +167505 5.835500 +167550 2.418500 +167556 5.325500 +167557 5.263000 +167558 5.222000 +167559 4.382500 +167560 0.883000 +167561 3.428500 +167562 3.831500 +167564 2.640000 +167565 2.804500 +167566 2.733000 +167586 2.967000 +167587 5.072500 +167588 5.124500 +167590 5.076000 +167591 5.206000 +167592 1.541500 +167593 5.521000 +167594 1.891000 +167595 3.250500 +167596 2.214000 +167597 2.118000 +167598 1.967500 +167599 2.018000 +167610 1.717000 +167611 2.536500 +167612 4.774500 +167613 0.619500 +167614 4.767000 +167615 4.079500 +167616 1.237000 +167617 4.100000 +167619 4.916000 +167621 4.590000 +167622 2.778000 +168442 0.847500 +168443 0.626500 +168445 2.576500 +168446 1.405500 +168447 1.776500 +168448 2.082500 +168449 1.831000 +168483 0.672000 +168485 0.662500 +168486 0.820500 +168489 0.714500 +168492 2.338000 +168493 2.316000 +168494 2.341000 +168495 4.422000 +168501 4.676500 +168502 6.203500 +168503 5.755500 +168505 4.525000 +168506 5.711000 +168507 6.390500 +168508 6.281000 +168509 6.097000 +168510 3.070000 +168511 6.675500 +168512 2.955000 +168513 6.267000 +168514 0.940500 +168515 7.020000 +168517 2.807000 +168518 7.039500 +168520 6.258000 +168521 6.160500 +168522 6.134000 +168527 7.124000 +168528 6.484500 +168531 6.278000 +168532 6.127500 +168533 7.128000 +168538 6.271000 +168539 7.039000 +168540 6.139500 +168541 6.132000 +168542 6.280500 +168543 7.031000 +168545 6.141500 +168546 6.151500 +168547 6.142000 +168549 7.032000 +168550 6.307500 +168552 7.019500 +168553 6.141500 +168555 6.704000 From 830d7f51cdb0d22716da1fc1efa7670a255dfa87 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 2 May 2017 21:59:05 -0400 Subject: [PATCH 003/744] added jet q95 --- data/signals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index ec74400f..8a09dc5b 100644 --- a/data/signals.py +++ b/data/signals.py @@ -186,14 +186,14 @@ def fetch_nstx_data(signal_path,shot_num,c): etemp_profile = Signal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10]) edens_profile = Signal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10]) -q95 = Signal("q95 safety factor",["EFIT01/RESULTS.AEQDSK.Q95"],[d3d],causal_shifts=[10]) +q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10]) li = Signal("locked mode amplitude",["jpf/gs/bl-li Date: Tue, 2 May 2017 22:00:32 -0400 Subject: [PATCH 004/744] added jet signals --- data/signals.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/data/signals.py b/data/signals.py index ec74400f..23b74579 100644 --- a/data/signals.py +++ b/data/signals.py @@ -41,9 +41,10 @@ def get_idx(self,machine): class Machine: - def __init__(self,name,server,fetch_data_fn): + def __init__(self,name,server,fetch_data_fn,max_cores = 8): self.name = name self.server = server + self.max_cores = max_cores self.fetch_data_fn = fetch_data_fn def get_connection(self): @@ -176,9 +177,9 @@ def fetch_nstx_data(signal_path,shot_num,c): found = True return time,data,None,found -d3d = Machine("d3d","atlas.gat.com",fetch_d3d_data) -jet = Machine("jet","mdsplus.jet.efda.org",fetch_jet_data) -nstk = Machine("nstx","skylark.pppl.gov:8501::",fetch_nstx_data) +d3d = Machine("d3d","atlas.gat.com",fetch_d3d_data,max_cores=32) +jet = Machine("jet","mdsplus.jet.efda.org",fetch_jet_data,max_cores=8) +nstx = Machine("nstx","skylark.pppl.gov:8501::",fetch_nstx_data,max_cores=8) all_machines = [d3d,jet] @@ -217,6 +218,7 @@ def fetch_nstx_data(signal_path,shot_num,c): fully_defined_signals = [sig for sig in all_signals if sig.is_defined_on_machines(all_machines)] d3d_signals = [sig for sig in all_signals if sig.is_defined_on_machine(d3d)] +jet_signals = [sig for sig in all_signals if sig.is_defined_on_machine(jet)] From 73dd594e7ab4b2b8bc31ba0d119487cb28bcfcdd Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 2 May 2017 22:20:28 -0400 Subject: [PATCH 005/744] added maxcores to machine object --- data/get_mdsplus_data.py | 26 ++++++++++++++------------ data/signals.py | 21 ++++++++++++++++----- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 94777ae8..fab0e4c8 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -100,7 +100,8 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): return -def download_shot_numbers(shot_numbers,save_prepath,machine,max_cores = 2): +def download_shot_numbers(shot_numbers,save_prepath,machine): + max_cores = machine.max_cores sentinel = -1 fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) num_cores = min(mp.cpu_count(),max_cores) #can only handle 8 connections at once :( @@ -123,14 +124,14 @@ def download_shot_numbers(shot_numbers,save_prepath,machine,max_cores = 2): p.join() -def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine,max_cores): +def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine): max_len = 30000 save_prepath = prepath+save_path + '/' + machine.name + '/' shot_numbers,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files) shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 start_time = time.time() for shot_numbers_chunk in shot_numbers_chunks: - download_shot_numbers(shot_numbers_chunk,save_prepath,machine,max_cores) + download_shot_numbers(shot_numbers_chunk,save_prepath,machine) print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) @@ -139,25 +140,26 @@ def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_f -prepath = '/cscratch/share/frnn/' +prepath = '/p/datad2/' shot_numbers_path = 'shot_lists/' -save_path = 'signal_data/' -machine = d3d -signals = d3d_signals +save_path = 'signal_data2/' +machine = jet#d3d +signals = jet_signals#d3d_signals +print('using signals: ') +print(jet_signals) #nstx # shot_numbers_files = ['disrupt_nstx.txt'] #nstx #d3d -shot_numbers_files = ['shotlist_JaysonBarr_clear.txt'] -shot_numbers_files += ['shotlist_JaysonBarr_disrupt.txt'] +#shot_numbers_files = ['shotlist_JaysonBarr_clear.txt'] +#shot_numbers_files += ['shotlist_JaysonBarr_disrupt.txt'] # #shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] #jet -# shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt']#jet +shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt']#jet -max_cores = 32 -download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine,max_cores) +download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine) #complete_shot_numbers = [] diff --git a/data/signals.py b/data/signals.py index de77058c..cc3d538f 100644 --- a/data/signals.py +++ b/data/signals.py @@ -39,6 +39,12 @@ def get_idx(self,machine): idx = self.machines.index(machine) return idx + def __str__(self): + return self.description + + def __repr__(self): + return self.description + class Machine: def __init__(self,name,server,fetch_data_fn,max_cores = 8): @@ -72,6 +78,9 @@ def __ne__(self,other): def __hash__(self,other): return self.name.__hash__() + + def __str__(self): + return self.name.__str__() def create_missing_value_filler(): @@ -189,19 +198,21 @@ def fetch_nstx_data(signal_path,shot_num,c): q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10]) -li = Signal("locked mode amplitude",["jpf/gs/bl-liout'],[jet]) pradcore = Signal("Radiated Power Core",['d3d/'+r'\bol_l15_p'],[d3d]) pradedge = Signal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) -pradtot = Signal("Radiated Power",['jpf/db/b5r-ptot>out'],[jet]) -pin = Signal("Input Power (beam for d3d)",['jpf/gs/bl-ptot Date: Tue, 2 May 2017 20:58:37 -0700 Subject: [PATCH 006/744] added saving pattern for 2d signals with mapping --- data/get_mdsplus_data.py | 23 +++++++++++++++-------- data/signals.py | 5 ++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index fab0e4c8..35f5461b 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -58,6 +58,7 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): signal_path = signal.get_path(machine) save_path_full = format_save_path(save_prepath,signal_path,shot_num) success = False + mapping = None if os.path.isfile(save_path_full): print('-',end='') success = True @@ -69,8 +70,13 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): #missing_values += 1 print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) time,data = create_missing_value_filler() + mapping = None + data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() + if mapping is not None: + mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) + data_two_column = np.vstack((mapping_two_column,data_two_column)) try: #can lead to race condition mkdirdepth(save_path_full) except OSError, e: @@ -108,7 +114,7 @@ def download_shot_numbers(shot_numbers,save_prepath,machine): queue = mp.Queue() #complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() - assert(len(shot_numbers) < 30000) # mp.queue can't handle larger queues yet! + assert(len(shot_numbers) < 32000) # mp.queue can't handle larger queues yet! for shot_num in shot_numbers: queue.put(shot_num) for i in range(num_cores): @@ -140,13 +146,13 @@ def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_f -prepath = '/p/datad2/' +prepath = '/cscratch/share/frnn/'#'/p/datad2/' shot_numbers_path = 'shot_lists/' -save_path = 'signal_data2/' -machine = jet#d3d -signals = jet_signals#d3d_signals +save_path = 'signal_data/' +machine = d3d#jet#d3d +signals = d3d_signals#jet_signals#d3d_signals print('using signals: ') -print(jet_signals) +print(signals) #nstx # shot_numbers_files = ['disrupt_nstx.txt'] #nstx @@ -155,9 +161,10 @@ def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_f #shot_numbers_files = ['shotlist_JaysonBarr_clear.txt'] #shot_numbers_files += ['shotlist_JaysonBarr_disrupt.txt'] # #shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] - +#shot_numbers_files = ['d3d_clear.txt', 'd3d_disrupt.txt']#['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] #data only available after shot 125500 +shot_numbers_files = ['d3d_clear_data_avail.txt', 'd3d_disrupt_data_avail.txt'] #jet -shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt']#jet +#shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt']#jet download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine) diff --git a/data/signals.py b/data/signals.py index cc3d538f..a7ccfdda 100644 --- a/data/signals.py +++ b/data/signals.py @@ -199,7 +199,7 @@ def fetch_nstx_data(signal_path,shot_num,c): q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10]) ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipsip"],[jet,d3d]) -li = Signal("locked mode amplitude",["jpf/gs/bl-li Date: Wed, 3 May 2017 19:46:54 -0400 Subject: [PATCH 007/744] restructuring downloading and processing code to work for various machines and signals flexibly --- data/__init__.py | 0 data/get_mdsplus_data.py | 231 +----------------------------------- data/signals.py | 103 +++------------- examples/conf.yaml | 3 + plasma/conf.py | 7 ++ plasma/models/data.py | 136 +++++++++++++++++++++ plasma/primitives/shots.py | 40 ++++--- plasma/utils/downloading.py | 143 ++++++++++++++++++++++ 8 files changed, 332 insertions(+), 331 deletions(-) create mode 100644 data/__init__.py create mode 100644 plasma/models/data.py create mode 100644 plasma/utils/downloading.py diff --git a/data/__init__.py b/data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 35f5461b..7f162c85 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -1,149 +1,5 @@ -from __future__ import print_function -''' -http://www.mdsplus.org/index.php?title=Documentation:Tutorial:RemoteAccess&open=76203664636339686324830207&page=Documentation%2FThe+MDSplus+tutorial%2FRemote+data+access+in+MDSplus -http://piscope.psfc.mit.edu/index.php/MDSplus_%26_python#Simple_example_of_reading_MDSplus_data -http://www.mdsplus.org/documentation/beginners/expressions.shtml -http://www.mdsplus.org/index.php?title=Documentation:Tutorial:MdsObjects&open=76203664636339686324830207&page=Documentation%2FThe+MDSplus+tutorial%2FThe+Object+Oriented+interface+of+MDSPlus -''' - -'''TODO -- mapping to flux surfaces: its not always [0,1]! -- handling of 1D signals during preprocessing & normalization -- handling of 1D signals for feeding into RNN (convolutional layers) -- handling of missing data in shots? -- TEST -''' -from MDSplus import * -#from pylab import * -import numpy as np -import sys -import multiprocessing as mp -from functools import partial -import Queue -import os -import errno - -# import gadata - -from plasma.primitives.shots import ShotList - -from signals import * - -#print("Importing numpy version"+np.__version__) - -def create_missing_value_filler(): - time = np.linspace(0,100,100) - vals = np.zeros_like(time) - return time,vals - -def mkdirdepth(filename): - folder=os.path.dirname(filename) - if not os.path.exists(folder): - os.makedirs(folder) - -def format_save_path(prepath,signal_path,shot_num): - return prepath + signal_path + '/{}.txt'.format(shot_num) - - -def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): - missing_values = 0 - # if machine == 'd3d': - # reload(gadata) #reloads Gadata object with connection - while True: - shot_num = shot_num_queue.get() - if shot_num == sentinel: - break - shot_complete = True - for signal in signals: - signal_path = signal.get_path(machine) - save_path_full = format_save_path(save_prepath,signal_path,shot_num) - success = False - mapping = None - if os.path.isfile(save_path_full): - print('-',end='') - success = True - else: - try: - try: - time,data,mapping,success = machine.fetch_data(signal,shot_num,c) - except: - #missing_values += 1 - print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) - time,data = create_missing_value_filler() - mapping = None - - - data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() - if mapping is not None: - mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) - data_two_column = np.vstack((mapping_two_column,data_two_column)) - try: #can lead to race condition - mkdirdepth(save_path_full) - except OSError, e: - if e.errno == errno.EEXIST: - # File exists, and it's a directory, another process beat us to creating this dir, that's OK. - pass - else: - # Our target dir exists as a file, or different error, reraise the error! - raise - np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') - print('.',end='') - except: - print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) - print('Warning: Incomplete!!!') - raise - sys.stdout.flush() - if not success: - missing_values += 1 - shot_complete = False - #only add shot to list if it was complete - if shot_complete: - print('saved shot {}'.format(shot_num)) - #complete_queue.put(shot_num) - else: - print('shot {} not complete. removing from list.'.format(shot_num)) - print('Finished with {} missing values total'.format(missing_values)) - return - - -def download_shot_numbers(shot_numbers,save_prepath,machine): - max_cores = machine.max_cores - sentinel = -1 - fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) - num_cores = min(mp.cpu_count(),max_cores) #can only handle 8 connections at once :( - queue = mp.Queue() - #complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() - - assert(len(shot_numbers) < 32000) # mp.queue can't handle larger queues yet! - for shot_num in shot_numbers: - queue.put(shot_num) - for i in range(num_cores): - queue.put(sentinel) - connections = [Connection(machine.server) for _ in range(num_cores)] - processes = [mp.Process(target=fn,args=(queue,connections[i])) for i in range(num_cores)] - - print('running in parallel on {} processes'.format(num_cores)) - - for p in processes: - p.start() - for p in processes: - p.join() - - -def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine): - max_len = 30000 - save_prepath = prepath+save_path + '/' + machine.name + '/' - shot_numbers,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files) - shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 - start_time = time.time() - for shot_numbers_chunk in shot_numbers_chunks: - download_shot_numbers(shot_numbers_chunk,save_prepath,machine) - - print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) - - - - +from plasma.utils.downloading import download_all_shot_numbers +from data.signals import * prepath = '/cscratch/share/frnn/'#'/p/datad2/' @@ -168,86 +24,3 @@ def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_f download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine) - -#complete_shot_numbers = [] -#print(complete_queue) -#print(complete_queue.qsize()) -#for i in range(len(complete_shots)): -# if complete_shots[i]: -# complete_shot_numbers.append(shot_numbers[i]) -#while not complete_queue.empty(): -# complete_shot_numbers.append(complete_queue.get(False)) - - - -# if machine == 'nstx': -# shot_numbers_files = ['disrupt_nstx.txt'] -# server_path = "skylark.pppl.gov:8501::" -# signal_paths = ['engineering/ip1/', -# 'operations/rwmef_plas_n1_amp_br/', -# 'efit02/li/', -# 'activespec/ts_ld/', -# 'passivespec/bolom_totpwr/', -# 'nbi/nb_p_inj/', -# 'efit02/wpdot/'] - -# elif machine == 'd3d': -# shot_numbers_files = ['shotlist_JaysonBarr_clear.txt'] -# shot_numbers_files += ['shotlist_JaysonBarr_disrupt.txt'] -# #shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] -# server_path = 'atlas.gat.com' -# from d3d_signals import signal_paths -# import itertools -# signal_paths = list(itertools.chain.from_iterable(signal_paths)) -# # signal_paths = ['PINJ','IP','Q95','DENSITY','WMHD'] #,'PRAD'] #PRAD returns a 2D xdata -# # Recommended signals from DIII-D -# # signal_paths = ['efsli','ipsip','efsbetan','efswmhd','nssampn1l','nssfrqn1l', -# # 'nssampn2l','nssfrqn2l', -# # 'dusbradial','dssdenest',r'\bol_l15_p',r'\bol_l03_p','bmspinj','bmstinj','pcechpwrf'] -# # signal_paths = ['d3d/' + path for path in signal_paths] - - - -# elif machine == 'jet': -# shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt'] -# server_path = 'mdsplus.jet.efda.org' - -# #plasma current, locked mode, output power -# signal_paths = ['jpf/da/c2-ipla', -# 'jpf/da/c2-loca', -# 'jpf/db/b5r-ptot>out'] - - - -# #internal inductance, time derivative of stored energy, input power, total diamagnetic energy -# signal_paths += ['jpf/gs/bl-liout'],[jet]) pradcore = Signal("Radiated Power Core",['d3d/'+r'\bol_l15_p'],[d3d]) pradedge = Signal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) -pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) +# pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) +pechin = Signal("ECH input power, not always on",['d3d/echpwrc'],[d3d]) betan = Signal("Normalized Beta",['d3d/efsbetan'],[d3d]) energydt = Signal("stored energy time derivative",['jpf/gs/bl-fdwdt= shot.machine.current_threshold) + t = t[region] + sig = sig[region,:] + + #make sure shot is not garbage data + if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1: + return None,None,False + + return t,sig,True + + def is_defined_on_machine(self,machine): + return machine in self.machines + + def is_defined_on_machines(self,machines): + return all([m in self.machines for m in machines]) + + def get_path(self,machine): + idx = self.get_idx(machine) + return self.paths[idx] + + def get_causal_shift(self,machine): + idx = self.get_idx(machine) + return self.causal_shifts[idx] + + def get_idx(self,machine): + assert(machine in self.machines) + idx = self.machines.index(machine) + return idx + + def __eq__(self,other): + return self.description.__eq__(other.description) + + + def __ne__(self,other): + return self.description.__ne__(other.description) + + def __hash__(self,other): + return self.description.__hash__() + + def __str__(self): + return self.description + + def __repr__(self): + return self.description + + +class Machine: + def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): + self.name = name + self.server = server + self.max_cores = max_cores + self.fetch_data_fn = fetch_data_fn + self.current_threshold = current_threshold + + def get_connection(self): + return Connection(server) + + def fetch_data(self,signal,shot_num,c): + path = signal.get_path(self) + success = False + mapping = None + try: + time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) + except Exception,e: + time,data = create_missing_value_filler() + print(e) + sys.stdout.flush() + time = np.array(time) + signal.get_causal_shift(self) + return time,np.array(data),mapping,success + + def __eq__(self,other): + return self.name.__eq__(other.name) + + + def __ne__(self,other): + return self.name.__ne__(other.name) + + def __hash__(self,other): + return self.name.__hash__() + + def __str__(self): + return self.name.__str__() + + +def create_missing_value_filler(): + time = np.linspace(0,100,100) + vals = np.zeros_like(time) + return time,vals diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 58549216..65a6a52a 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -35,31 +35,34 @@ def __init__(self,shots=None): assert(all([isinstance(shot,Shot) for shot in shots])) self.shots = [shot for shot in shots] - def load_from_files(self,shot_list_dir,shot_files): - shot_numbers,disruption_times = ShotList.get_multiple_shots_and_disruption_times(shot_list_dir,shot_files) - for number,t in list(zip(shot_numbers,disruption_times)): - self.append(Shot(number=number,t_disrupt=t)) + def load_from_files(self,shot_list_dir,shot_files,machines): + shot_numbers,disruption_times,machines = ShotList.get_multiple_shots_and_disruption_times(shot_list_dir,shot_files) + for number,t,m in list(zip(shot_numbers,disruption_times,machines)): + self.append(Shot(number=number,t_disrupt=t,machine=m)) ######Generic Methods#### @staticmethod - def get_shots_and_disruption_times(shots_and_disruption_times_path): + def get_shots_and_disruption_times(shots_and_disruption_times_path,machine): data = np.loadtxt(shots_and_disruption_times_path,ndmin=1,dtype={'names':('num','disrupt_times'), 'formats':('i4','f4')}) shots = np.array(list(zip(*data))[0]) disrupt_times = np.array(list(zip(*data))[1]) - return shots, disrupt_times + machines = np.array([machine]*len(shots)) + return shots, disrupt_times, machines @staticmethod - def get_multiple_shots_and_disruption_times(base_path,endings): + def get_multiple_shots_and_disruption_times(base_path,endings,machines): all_shots = [] all_disruption_times = [] - for ending in endings: + all_machines_arr = [] + for (ending,machine) in zip(endings,machines): path = base_path + ending - shots,disruption_times = ShotList.get_shots_and_disruption_times(path) + shots,disruption_times,machines_arr = ShotList.get_shots_and_disruption_times(path,machine) all_shots.append(shots) all_disruption_times.append(disruption_times) - return np.concatenate(all_shots),np.concatenate(all_disruption_times) + all_machines_arr.append(machines_arr) + return np.concatenate(all_shots),np.concatenate(all_disruption_times),np.concatenate(all_machines_arr) def split_train_test(self,conf): @@ -171,7 +174,7 @@ class Shot(object): For 0D data, each shot is modeled as a 2D Numpy array - time vs a plasma property. ''' - def __init__(self,number=None,signals=None,ttd=None,valid=None,is_disruptive=None,t_disrupt=None): + def __init__(self,number=None,machine=None,signals=None,data=None,ttd=None,valid=None,is_disruptive=None,t_disrupt=None): ''' Shot objects contain following attributes: @@ -182,7 +185,9 @@ def __init__(self,number=None,signals=None,ttd=None,valid=None,is_disruptive=Non - is_disruptive: boolean flag indicating whether a shot is disruptive ''' self.number = number #Shot number + self.machine = machine #machine on which it is defined self.signals = signals + self.data = data self.ttd = ttd self.valid =valid self.is_disruptive = is_disruptive @@ -192,7 +197,9 @@ def __init__(self,number=None,signals=None,ttd=None,valid=None,is_disruptive=Non def __str__(self): string = 'number: {}\n'.format(self.number) + string = 'machine: {}\n'.format(self.machine) string += 'signals: {}\n'.format(self.signals ) + string += 'data: {}\n'.format(self.data ) string += 'ttd: {}\n'.format(self.ttd ) string += 'valid: {}\n'.format(self.valid ) string += 'is_disruptive: {}\n'.format(self.is_disruptive) @@ -216,8 +223,8 @@ def save(self,prepath): if not os.path.exists(prepath): os.makedirs(prepath) save_path = self.get_save_path(prepath) - np.savez(save_path,number=self.number,valid=self.valid,is_disruptive=self.is_disruptive, - signals=self.signals,ttd=self.ttd) + np.savez(save_path,valid=self.valid,is_disruptive=self.is_disruptive, + signals=self.data,ttd=self.ttd) print('...saved shot {}'.format(self.number)) def get_save_path(self,prepath): @@ -228,15 +235,14 @@ def restore(self,prepath,light=False): save_path = self.get_save_path(prepath) dat = np.load(save_path) - self.number = dat['number'][()] self.valid = dat['valid'][()] self.is_disruptive = dat['is_disruptive'][()] if light: - self.signals = None + self.data = None self.ttd = None else: - self.signals = dat['signals'] + self.data = dat['data'] self.ttd = dat['ttd'] def previously_saved(self,prepath): @@ -244,7 +250,7 @@ def previously_saved(self,prepath): return os.path.isfile(save_path) def make_light(self): - self.signals = None + self.data = None self.ttd = None @staticmethod diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py new file mode 100644 index 00000000..7dcca362 --- /dev/null +++ b/plasma/utils/downloading.py @@ -0,0 +1,143 @@ +from __future__ import print_function +''' +http://www.mdsplus.org/index.php?title=Documentation:Tutorial:RemoteAccess&open=76203664636339686324830207&page=Documentation%2FThe+MDSplus+tutorial%2FRemote+data+access+in+MDSplus +http://piscope.psfc.mit.edu/index.php/MDSplus_%26_python#Simple_example_of_reading_MDSplus_data +http://www.mdsplus.org/documentation/beginners/expressions.shtml +http://www.mdsplus.org/index.php?title=Documentation:Tutorial:MdsObjects&open=76203664636339686324830207&page=Documentation%2FThe+MDSplus+tutorial%2FThe+Object+Oriented+interface+of+MDSPlus +''' + +'''TODO +- mapping to flux surfaces: its not always [0,1]! +- handling of 1D signals during preprocessing & normalization +- handling of 1D signals for feeding into RNN (convolutional layers) +- handling of missing data in shots? +- TEST +''' +from MDSplus import * +#from pylab import * +import numpy as np +import sys +import multiprocessing as mp +from functools import partial +import Queue +import os +import errno + +# import gadata + +from plasma.primitives.shots import ShotList + +#from signals import * + +#print("Importing numpy version"+np.__version__) + +def create_missing_value_filler(): + time = np.linspace(0,100,100) + vals = np.zeros_like(time) + return time,vals + +def mkdirdepth(filename): + folder=os.path.dirname(filename) + if not os.path.exists(folder): + os.makedirs(folder) + +def format_save_path(prepath,signal_path,shot_num): + return prepath + signal_path + '/{}.txt'.format(shot_num) + + +def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): + missing_values = 0 + # if machine == 'd3d': + # reload(gadata) #reloads Gadata object with connection + while True: + shot_num = shot_num_queue.get() + if shot_num == sentinel: + break + shot_complete = True + for signal in signals: + signal_path = signal.get_path(machine) + save_path_full = format_save_path(save_prepath,signal_path,shot_num) + success = False + mapping = None + if os.path.isfile(save_path_full): + print('-',end='') + success = True + else: + try: + try: + time,data,mapping,success = machine.fetch_data(signal,shot_num,c) + except: + #missing_values += 1 + print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) + time,data = create_missing_value_filler() + mapping = None + + + data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() + if mapping is not None: + mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) + data_two_column = np.vstack((mapping_two_column,data_two_column)) + try: #can lead to race condition + mkdirdepth(save_path_full) + except OSError, e: + if e.errno == errno.EEXIST: + # File exists, and it's a directory, another process beat us to creating this dir, that's OK. + pass + else: + # Our target dir exists as a file, or different error, reraise the error! + raise + np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') + print('.',end='') + except: + print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) + print('Warning: Incomplete!!!') + raise + sys.stdout.flush() + if not success: + missing_values += 1 + shot_complete = False + #only add shot to list if it was complete + if shot_complete: + print('saved shot {}'.format(shot_num)) + #complete_queue.put(shot_num) + else: + print('shot {} not complete. removing from list.'.format(shot_num)) + print('Finished with {} missing values total'.format(missing_values)) + return + + +def download_shot_numbers(shot_numbers,save_prepath,machine): + max_cores = machine.max_cores + sentinel = -1 + fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) + num_cores = min(mp.cpu_count(),max_cores) #can only handle 8 connections at once :( + queue = mp.Queue() + #complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() + + assert(len(shot_numbers) < 32000) # mp.queue can't handle larger queues yet! + for shot_num in shot_numbers: + queue.put(shot_num) + for i in range(num_cores): + queue.put(sentinel) + connections = [Connection(machine.server) for _ in range(num_cores)] + processes = [mp.Process(target=fn,args=(queue,connections[i])) for i in range(num_cores)] + + print('running in parallel on {} processes'.format(num_cores)) + + for p in processes: + p.start() + for p in processes: + p.join() + + +def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine): + max_len = 30000 + save_prepath = prepath+save_path + '/' + machine.name + '/' + shot_numbers,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files) + shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 + start_time = time.time() + for shot_numbers_chunk in shot_numbers_chunks: + download_shot_numbers(shot_numbers_chunk,save_prepath,machine) + + print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) + From 4bbc03e1e94e96ac80329e54dd2cc177448b29e5 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 3 May 2017 19:50:37 -0400 Subject: [PATCH 008/744] restructuring downloading and processing code to work for various machines and signals flexibly --- plasma/models/data.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/plasma/models/data.py b/plasma/models/data.py index 6a6c42a5..15bc1c27 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -36,25 +36,25 @@ def is_saved(self,prepath,shot): file_path = self.get_file_path(prepath,shot) return os.path.isfile(file_path) - def load_data(self,prepath,shot): - if not self.is_saved(prepath,shot): - return None,None,False + def load_data(self,prepath,shot): + if not self.is_saved(prepath,shot): + return None,None,False file_path = self.get_file_path(prepath,shot) data = np.loadtxt(file_path) t = data[:,0] - sig = data[:,1:] + sig = data[:,1:] - if self.is_ip: #restrict shot to current threshold - region = np.where(np.abs(sig) >= shot.machine.current_threshold) - t = t[region] - sig = sig[region,:] + if self.is_ip: #restrict shot to current threshold + region = np.where(np.abs(sig) >= shot.machine.current_threshold) + t = t[region] + sig = sig[region,:] - #make sure shot is not garbage data - if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1: - return None,None,False + #make sure shot is not garbage data + if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1: + return None,None,False - return t,sig,True + return t,sig,True def is_defined_on_machine(self,machine): return machine in self.machines From 26398247203d49b4c75eaa08ee495b45d15024f4 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 3 May 2017 19:55:04 -0400 Subject: [PATCH 009/744] restructuring downloading and processing code to work for various machines and signals flexibly --- plasma/utils/downloading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 7dcca362..ab0a58d5 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -133,7 +133,7 @@ def download_shot_numbers(shot_numbers,save_prepath,machine): def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine): max_len = 30000 save_prepath = prepath+save_path + '/' + machine.name + '/' - shot_numbers,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files) + shot_numbers,_,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files,[machine]*len(shot_numbers_files)) shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 start_time = time.time() for shot_numbers_chunk in shot_numbers_chunks: From 5dc68e1d4d426739b60e9e7aac2538b947447a6f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 3 May 2017 19:57:39 -0400 Subject: [PATCH 010/744] restructuring downloading and processing code to work for various machines and signals flexibly --- data/get_mdsplus_data.py | 2 +- plasma/utils/downloading.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 7f162c85..83497d3b 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -22,5 +22,5 @@ #jet #shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt']#jet -download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine) +download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine,signals) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index ab0a58d5..83bed538 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -106,7 +106,7 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): return -def download_shot_numbers(shot_numbers,save_prepath,machine): +def download_shot_numbers(shot_numbers,save_prepath,machine,signals): max_cores = machine.max_cores sentinel = -1 fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) @@ -130,14 +130,14 @@ def download_shot_numbers(shot_numbers,save_prepath,machine): p.join() -def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine): +def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine,signals): max_len = 30000 save_prepath = prepath+save_path + '/' + machine.name + '/' shot_numbers,_,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files,[machine]*len(shot_numbers_files)) shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 start_time = time.time() for shot_numbers_chunk in shot_numbers_chunks: - download_shot_numbers(shot_numbers_chunk,save_prepath,machine) + download_shot_numbers(shot_numbers_chunk,save_prepath,machine,signals) print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) From ce942fd59b9a35a89bd7f6fa94693f39d85ba68e Mon Sep 17 00:00:00 2001 From: +Julian Kates-Harbeck Date: Wed, 3 May 2017 17:33:03 -0700 Subject: [PATCH 011/744] added shortened shotlists --- data/shot_lists/d3d/d3d_clear_data_avail.txt | 18122 ++++++++++++++++ .../shot_lists/d3d/d3d_disrupt_data_avail.txt | 10422 +++++++++ 2 files changed, 28544 insertions(+) create mode 100644 data/shot_lists/d3d/d3d_clear_data_avail.txt create mode 100644 data/shot_lists/d3d/d3d_disrupt_data_avail.txt diff --git a/data/shot_lists/d3d/d3d_clear_data_avail.txt b/data/shot_lists/d3d/d3d_clear_data_avail.txt new file mode 100644 index 00000000..00d92115 --- /dev/null +++ b/data/shot_lists/d3d/d3d_clear_data_avail.txt @@ -0,0 +1,18122 @@ +125502 -1.000000 +125503 -1.000000 +125504 -1.000000 +125505 -1.000000 +125506 -1.000000 +125507 -1.000000 +125509 -1.000000 +125510 -1.000000 +125511 -1.000000 +125512 -1.000000 +125513 -1.000000 +125514 -1.000000 +125515 -1.000000 +125516 -1.000000 +125519 -1.000000 +125523 -1.000000 +125524 -1.000000 +125525 -1.000000 +125526 -1.000000 +125527 -1.000000 +125528 -1.000000 +125529 -1.000000 +125530 -1.000000 +125531 -1.000000 +125532 -1.000000 +125533 -1.000000 +125534 -1.000000 +125535 -1.000000 +125536 -1.000000 +125537 -1.000000 +125538 -1.000000 +125539 -1.000000 +125540 -1.000000 +125541 -1.000000 +125542 -1.000000 +125543 -1.000000 +125544 -1.000000 +125545 -1.000000 +125546 -1.000000 +125552 -1.000000 +125566 -1.000000 +125567 -1.000000 +125568 -1.000000 +125569 -1.000000 +125570 -1.000000 +125571 -1.000000 +125572 -1.000000 +125573 -1.000000 +125574 -1.000000 +125575 -1.000000 +125576 -1.000000 +125577 -1.000000 +125578 -1.000000 +125579 -1.000000 +125580 -1.000000 +125581 -1.000000 +125582 -1.000000 +125583 -1.000000 +125584 -1.000000 +125587 -1.000000 +125589 -1.000000 +125591 -1.000000 +125599 -1.000000 +125604 -1.000000 +125606 -1.000000 +125607 -1.000000 +125618 -1.000000 +125620 -1.000000 +125621 -1.000000 +125622 -1.000000 +125623 -1.000000 +125624 -1.000000 +125625 -1.000000 +125627 -1.000000 +125629 -1.000000 +125630 -1.000000 +125633 -1.000000 +125635 -1.000000 +125638 -1.000000 +125639 -1.000000 +125650 -1.000000 +125653 -1.000000 +125654 -1.000000 +125655 -1.000000 +125656 -1.000000 +125657 -1.000000 +125658 -1.000000 +125663 -1.000000 +125665 -1.000000 +125667 -1.000000 +125668 -1.000000 +125669 -1.000000 +125670 -1.000000 +125672 -1.000000 +125675 -1.000000 +125678 -1.000000 +125679 -1.000000 +125682 -1.000000 +125684 -1.000000 +125690 -1.000000 +125695 -1.000000 +125696 -1.000000 +125698 -1.000000 +125700 -1.000000 +125701 -1.000000 +125705 -1.000000 +125714 -1.000000 +125716 -1.000000 +125718 -1.000000 +125719 -1.000000 +125720 -1.000000 +125721 -1.000000 +125724 -1.000000 +125725 -1.000000 +125727 -1.000000 +125729 -1.000000 +125733 -1.000000 +125734 -1.000000 +125736 -1.000000 +125737 -1.000000 +125738 -1.000000 +125741 -1.000000 +125742 -1.000000 +125748 -1.000000 +125749 -1.000000 +125755 -1.000000 +125759 -1.000000 +125761 -1.000000 +125763 -1.000000 +125764 -1.000000 +125767 -1.000000 +125770 -1.000000 +125773 -1.000000 +125774 -1.000000 +125775 -1.000000 +125776 -1.000000 +125778 -1.000000 +125790 -1.000000 +125792 -1.000000 +125797 -1.000000 +125798 -1.000000 +125799 -1.000000 +125801 -1.000000 +125803 -1.000000 +125804 -1.000000 +125806 -1.000000 +125807 -1.000000 +125808 -1.000000 +125812 -1.000000 +125813 -1.000000 +125815 -1.000000 +125816 -1.000000 +125818 -1.000000 +125820 -1.000000 +125824 -1.000000 +125829 -1.000000 +125839 -1.000000 +125840 -1.000000 +125841 -1.000000 +125842 -1.000000 +125843 -1.000000 +125844 -1.000000 +125845 -1.000000 +125847 -1.000000 +125849 -1.000000 +125850 -1.000000 +125851 -1.000000 +125852 -1.000000 +125856 -1.000000 +125857 -1.000000 +125858 -1.000000 +125861 -1.000000 +125862 -1.000000 +125863 -1.000000 +125864 -1.000000 +125865 -1.000000 +125866 -1.000000 +125867 -1.000000 +125868 -1.000000 +125869 -1.000000 +125870 -1.000000 +125871 -1.000000 +125874 -1.000000 +125875 -1.000000 +125877 -1.000000 +125878 -1.000000 +125879 -1.000000 +125880 -1.000000 +125881 -1.000000 +125882 -1.000000 +125883 -1.000000 +125884 -1.000000 +125885 -1.000000 +125887 -1.000000 +125888 -1.000000 +125889 -1.000000 +125892 -1.000000 +125894 -1.000000 +125895 -1.000000 +125896 -1.000000 +125899 -1.000000 +125903 -1.000000 +125905 -1.000000 +125915 -1.000000 +125918 -1.000000 +125920 -1.000000 +125922 -1.000000 +125924 -1.000000 +125953 -1.000000 +125954 -1.000000 +125955 -1.000000 +125956 -1.000000 +125957 -1.000000 +125958 -1.000000 +125959 -1.000000 +125960 -1.000000 +125961 -1.000000 +125962 -1.000000 +125963 -1.000000 +125964 -1.000000 +125965 -1.000000 +125966 -1.000000 +125967 -1.000000 +125970 -1.000000 +125971 -1.000000 +125972 -1.000000 +125973 -1.000000 +125975 -1.000000 +125976 -1.000000 +125977 -1.000000 +125978 -1.000000 +125979 -1.000000 +125980 -1.000000 +125981 -1.000000 +125982 -1.000000 +125985 -1.000000 +125991 -1.000000 +125994 -1.000000 +125995 -1.000000 +125999 -1.000000 +126000 -1.000000 +126015 -1.000000 +126016 -1.000000 +126017 -1.000000 +126020 -1.000000 +126021 -1.000000 +126023 -1.000000 +126024 -1.000000 +126036 -1.000000 +126038 -1.000000 +126039 -1.000000 +126044 -1.000000 +126047 -1.000000 +126048 -1.000000 +126049 -1.000000 +126050 -1.000000 +126051 -1.000000 +126052 -1.000000 +126053 -1.000000 +126054 -1.000000 +126056 -1.000000 +126058 -1.000000 +126059 -1.000000 +126060 -1.000000 +126061 -1.000000 +126062 -1.000000 +126063 -1.000000 +126064 -1.000000 +126065 -1.000000 +126066 -1.000000 +126067 -1.000000 +126068 -1.000000 +126070 -1.000000 +126071 -1.000000 +126072 -1.000000 +126073 -1.000000 +126074 -1.000000 +126079 -1.000000 +126082 -1.000000 +126083 -1.000000 +126084 -1.000000 +126093 -1.000000 +126109 -1.000000 +126110 -1.000000 +126112 -1.000000 +126113 -1.000000 +126115 -1.000000 +126116 -1.000000 +126120 -1.000000 +126122 -1.000000 +126123 -1.000000 +126124 -1.000000 +126125 -1.000000 +126129 -1.000000 +126131 -1.000000 +126132 -1.000000 +126133 -1.000000 +126134 -1.000000 +126135 -1.000000 +126136 -1.000000 +126137 -1.000000 +126138 -1.000000 +126140 -1.000000 +126141 -1.000000 +126142 -1.000000 +126143 -1.000000 +126146 -1.000000 +126151 -1.000000 +126155 -1.000000 +126157 -1.000000 +126158 -1.000000 +126160 -1.000000 +126165 -1.000000 +126166 -1.000000 +126167 -1.000000 +126168 -1.000000 +126170 -1.000000 +126171 -1.000000 +126172 -1.000000 +126173 -1.000000 +126174 -1.000000 +126176 -1.000000 +126177 -1.000000 +126178 -1.000000 +126179 -1.000000 +126180 -1.000000 +126181 -1.000000 +126182 -1.000000 +126183 -1.000000 +126184 -1.000000 +126185 -1.000000 +126186 -1.000000 +126187 -1.000000 +126188 -1.000000 +126189 -1.000000 +126190 -1.000000 +126192 -1.000000 +126194 -1.000000 +126198 -1.000000 +126200 -1.000000 +126201 -1.000000 +126202 -1.000000 +126203 -1.000000 +126204 -1.000000 +126205 -1.000000 +126206 -1.000000 +126207 -1.000000 +126210 -1.000000 +126212 -1.000000 +126213 -1.000000 +126214 -1.000000 +126215 -1.000000 +126216 -1.000000 +126218 -1.000000 +126219 -1.000000 +126220 -1.000000 +126222 -1.000000 +126223 -1.000000 +126224 -1.000000 +126225 -1.000000 +126226 -1.000000 +126230 -1.000000 +126232 -1.000000 +126233 -1.000000 +126234 -1.000000 +126235 -1.000000 +126236 -1.000000 +126237 -1.000000 +126238 -1.000000 +126239 -1.000000 +126240 -1.000000 +126241 -1.000000 +126242 -1.000000 +126243 -1.000000 +126244 -1.000000 +126245 -1.000000 +126246 -1.000000 +126247 -1.000000 +126248 -1.000000 +126249 -1.000000 +126250 -1.000000 +126251 -1.000000 +126252 -1.000000 +126253 -1.000000 +126254 -1.000000 +126255 -1.000000 +126256 -1.000000 +126257 -1.000000 +126258 -1.000000 +126259 -1.000000 +126260 -1.000000 +126261 -1.000000 +126262 -1.000000 +126263 -1.000000 +126264 -1.000000 +126276 -1.000000 +126277 -1.000000 +126278 -1.000000 +126279 -1.000000 +126280 -1.000000 +126282 -1.000000 +126283 -1.000000 +126284 -1.000000 +126285 -1.000000 +126286 -1.000000 +126287 -1.000000 +126288 -1.000000 +126289 -1.000000 +126291 -1.000000 +126292 -1.000000 +126293 -1.000000 +126294 -1.000000 +126295 -1.000000 +126296 -1.000000 +126297 -1.000000 +126298 -1.000000 +126299 -1.000000 +126300 -1.000000 +126301 -1.000000 +126302 -1.000000 +126303 -1.000000 +126304 -1.000000 +126306 -1.000000 +126310 -1.000000 +126312 -1.000000 +126313 -1.000000 +126314 -1.000000 +126315 -1.000000 +126316 -1.000000 +126317 -1.000000 +126318 -1.000000 +126319 -1.000000 +126320 -1.000000 +126321 -1.000000 +126322 -1.000000 +126323 -1.000000 +126324 -1.000000 +126325 -1.000000 +126326 -1.000000 +126327 -1.000000 +126328 -1.000000 +126329 -1.000000 +126330 -1.000000 +126331 -1.000000 +126332 -1.000000 +126336 -1.000000 +126337 -1.000000 +126338 -1.000000 +126339 -1.000000 +126340 -1.000000 +126341 -1.000000 +126342 -1.000000 +126345 -1.000000 +126346 -1.000000 +126347 -1.000000 +126348 -1.000000 +126349 -1.000000 +126351 -1.000000 +126352 -1.000000 +126353 -1.000000 +126354 -1.000000 +126355 -1.000000 +126356 -1.000000 +126357 -1.000000 +126358 -1.000000 +126359 -1.000000 +126360 -1.000000 +126361 -1.000000 +126362 -1.000000 +126364 -1.000000 +126365 -1.000000 +126366 -1.000000 +126367 -1.000000 +126368 -1.000000 +126369 -1.000000 +126370 -1.000000 +126371 -1.000000 +126374 -1.000000 +126375 -1.000000 +126377 -1.000000 +126378 -1.000000 +126379 -1.000000 +126381 -1.000000 +126389 -1.000000 +126390 -1.000000 +126391 -1.000000 +126392 -1.000000 +126393 -1.000000 +126394 -1.000000 +126395 -1.000000 +126397 -1.000000 +126399 -1.000000 +126400 -1.000000 +126401 -1.000000 +126402 -1.000000 +126403 -1.000000 +126404 -1.000000 +126405 -1.000000 +126408 -1.000000 +126411 -1.000000 +126412 -1.000000 +126413 -1.000000 +126423 -1.000000 +126427 -1.000000 +126428 -1.000000 +126429 -1.000000 +126431 -1.000000 +126434 -1.000000 +126435 -1.000000 +126437 -1.000000 +126439 -1.000000 +126441 -1.000000 +126448 -1.000000 +126449 -1.000000 +126452 -1.000000 +126454 -1.000000 +126455 -1.000000 +126456 -1.000000 +126457 -1.000000 +126458 -1.000000 +126459 -1.000000 +126460 -1.000000 +126461 -1.000000 +126462 -1.000000 +126464 -1.000000 +126465 -1.000000 +126466 -1.000000 +126467 -1.000000 +126468 -1.000000 +126469 -1.000000 +126470 -1.000000 +126471 -1.000000 +126472 -1.000000 +126473 -1.000000 +126474 -1.000000 +126475 -1.000000 +126476 -1.000000 +126477 -1.000000 +126478 -1.000000 +126479 -1.000000 +126480 -1.000000 +126481 -1.000000 +126482 -1.000000 +126483 -1.000000 +126484 -1.000000 +126485 -1.000000 +126486 -1.000000 +126489 -1.000000 +126490 -1.000000 +126493 -1.000000 +126494 -1.000000 +126495 -1.000000 +126496 -1.000000 +126497 -1.000000 +126498 -1.000000 +126499 -1.000000 +126500 -1.000000 +126501 -1.000000 +126502 -1.000000 +126503 -1.000000 +126504 -1.000000 +126505 -1.000000 +126507 -1.000000 +126509 -1.000000 +126510 -1.000000 +126511 -1.000000 +126512 -1.000000 +126513 -1.000000 +126514 -1.000000 +126515 -1.000000 +126516 -1.000000 +126517 -1.000000 +126518 -1.000000 +126519 -1.000000 +126520 -1.000000 +126521 -1.000000 +126523 -1.000000 +126524 -1.000000 +126525 -1.000000 +126526 -1.000000 +126527 -1.000000 +126528 -1.000000 +126531 -1.000000 +126532 -1.000000 +126533 -1.000000 +126534 -1.000000 +126536 -1.000000 +126541 -1.000000 +126545 -1.000000 +126553 -1.000000 +126554 -1.000000 +126555 -1.000000 +126556 -1.000000 +126558 -1.000000 +126562 -1.000000 +126563 -1.000000 +126564 -1.000000 +126565 -1.000000 +126566 -1.000000 +126567 -1.000000 +126568 -1.000000 +126569 -1.000000 +126570 -1.000000 +126573 -1.000000 +126576 -1.000000 +126577 -1.000000 +126579 -1.000000 +126583 -1.000000 +126587 -1.000000 +126588 -1.000000 +126589 -1.000000 +126590 -1.000000 +126592 -1.000000 +126593 -1.000000 +126595 -1.000000 +126596 -1.000000 +126597 -1.000000 +126598 -1.000000 +126599 -1.000000 +126600 -1.000000 +126601 -1.000000 +126602 -1.000000 +126603 -1.000000 +126604 -1.000000 +126606 -1.000000 +126607 -1.000000 +126626 -1.000000 +126627 -1.000000 +126629 -1.000000 +126634 -1.000000 +126635 -1.000000 +126642 -1.000000 +126643 -1.000000 +126644 -1.000000 +126645 -1.000000 +126657 -1.000000 +126660 -1.000000 +126661 -1.000000 +126664 -1.000000 +126668 -1.000000 +126670 -1.000000 +126675 -1.000000 +126678 -1.000000 +126679 -1.000000 +126680 -1.000000 +126681 -1.000000 +126683 -1.000000 +126685 -1.000000 +126690 -1.000000 +126692 -1.000000 +126700 -1.000000 +126705 -1.000000 +126706 -1.000000 +126707 -1.000000 +126708 -1.000000 +126711 -1.000000 +126712 -1.000000 +126713 -1.000000 +126714 -1.000000 +126715 -1.000000 +126716 -1.000000 +126717 -1.000000 +126718 -1.000000 +126719 -1.000000 +126720 -1.000000 +126721 -1.000000 +126722 -1.000000 +126723 -1.000000 +126724 -1.000000 +126725 -1.000000 +126726 -1.000000 +126727 -1.000000 +126728 -1.000000 +126729 -1.000000 +126730 -1.000000 +126731 -1.000000 +126734 -1.000000 +126735 -1.000000 +126737 -1.000000 +126738 -1.000000 +126740 -1.000000 +126742 -1.000000 +126743 -1.000000 +126744 -1.000000 +126745 -1.000000 +126746 -1.000000 +126747 -1.000000 +126748 -1.000000 +126749 -1.000000 +126750 -1.000000 +126751 -1.000000 +126752 -1.000000 +126753 -1.000000 +126754 -1.000000 +126755 -1.000000 +126756 -1.000000 +126757 -1.000000 +126758 -1.000000 +126760 -1.000000 +126761 -1.000000 +126762 -1.000000 +126763 -1.000000 +126764 -1.000000 +126765 -1.000000 +126766 -1.000000 +126768 -1.000000 +126770 -1.000000 +126771 -1.000000 +126772 -1.000000 +126773 -1.000000 +126774 -1.000000 +126775 -1.000000 +126776 -1.000000 +126777 -1.000000 +126778 -1.000000 +126779 -1.000000 +126780 -1.000000 +126781 -1.000000 +126782 -1.000000 +126783 -1.000000 +126784 -1.000000 +126785 -1.000000 +126786 -1.000000 +126787 -1.000000 +126788 -1.000000 +126789 -1.000000 +126790 -1.000000 +126791 -1.000000 +126792 -1.000000 +126793 -1.000000 +126794 -1.000000 +126795 -1.000000 +126796 -1.000000 +126798 -1.000000 +126799 -1.000000 +126800 -1.000000 +126801 -1.000000 +126802 -1.000000 +126803 -1.000000 +126804 -1.000000 +126805 -1.000000 +126806 -1.000000 +126811 -1.000000 +126812 -1.000000 +126813 -1.000000 +126814 -1.000000 +126815 -1.000000 +126816 -1.000000 +126817 -1.000000 +126818 -1.000000 +126819 -1.000000 +126820 -1.000000 +126822 -1.000000 +126824 -1.000000 +126825 -1.000000 +126826 -1.000000 +126827 -1.000000 +126828 -1.000000 +126829 -1.000000 +126830 -1.000000 +126831 -1.000000 +126833 -1.000000 +126834 -1.000000 +126835 -1.000000 +126836 -1.000000 +126839 -1.000000 +126840 -1.000000 +126842 -1.000000 +126843 -1.000000 +126845 -1.000000 +126846 -1.000000 +126847 -1.000000 +126848 -1.000000 +126849 -1.000000 +126850 -1.000000 +126851 -1.000000 +126860 -1.000000 +126861 -1.000000 +126862 -1.000000 +126863 -1.000000 +126864 -1.000000 +126865 -1.000000 +126866 -1.000000 +126867 -1.000000 +126868 -1.000000 +126869 -1.000000 +126875 -1.000000 +126878 -1.000000 +126879 -1.000000 +126880 -1.000000 +126881 -1.000000 +126882 -1.000000 +126883 -1.000000 +126884 -1.000000 +126885 -1.000000 +126889 -1.000000 +126890 -1.000000 +126891 -1.000000 +126894 -1.000000 +126897 -1.000000 +126898 -1.000000 +126899 -1.000000 +126907 -1.000000 +126908 -1.000000 +126912 -1.000000 +126914 -1.000000 +126915 -1.000000 +126916 -1.000000 +126917 -1.000000 +126918 -1.000000 +126919 -1.000000 +126920 -1.000000 +126921 -1.000000 +126922 -1.000000 +126923 -1.000000 +126924 -1.000000 +126925 -1.000000 +126927 -1.000000 +126929 -1.000000 +126930 -1.000000 +126937 -1.000000 +126938 -1.000000 +126940 -1.000000 +126941 -1.000000 +126943 -1.000000 +126944 -1.000000 +126947 -1.000000 +126948 -1.000000 +126950 -1.000000 +126951 -1.000000 +126952 -1.000000 +126953 -1.000000 +126955 -1.000000 +126956 -1.000000 +126958 -1.000000 +126959 -1.000000 +126960 -1.000000 +126961 -1.000000 +126962 -1.000000 +126963 -1.000000 +126973 -1.000000 +126997 -1.000000 +126998 -1.000000 +126999 -1.000000 +127002 -1.000000 +127003 -1.000000 +127004 -1.000000 +127065 -1.000000 +127066 -1.000000 +127067 -1.000000 +127069 -1.000000 +127070 -1.000000 +127071 -1.000000 +127073 -1.000000 +127076 -1.000000 +127077 -1.000000 +127078 -1.000000 +127081 -1.000000 +127082 -1.000000 +127083 -1.000000 +127084 -1.000000 +127085 -1.000000 +127086 -1.000000 +127088 -1.000000 +127090 -1.000000 +127091 -1.000000 +127092 -1.000000 +127093 -1.000000 +127094 -1.000000 +127096 -1.000000 +127097 -1.000000 +127329 -1.000000 +127333 -1.000000 +127334 -1.000000 +127335 -1.000000 +127336 -1.000000 +127337 -1.000000 +127338 -1.000000 +127339 -1.000000 +127340 -1.000000 +127341 -1.000000 +127343 -1.000000 +127344 -1.000000 +127345 -1.000000 +127346 -1.000000 +127347 -1.000000 +127349 -1.000000 +127353 -1.000000 +127354 -1.000000 +127355 -1.000000 +127356 -1.000000 +127357 -1.000000 +127358 -1.000000 +127359 -1.000000 +127361 -1.000000 +127363 -1.000000 +127364 -1.000000 +127365 -1.000000 +127373 -1.000000 +127374 -1.000000 +127378 -1.000000 +127379 -1.000000 +127380 -1.000000 +127381 -1.000000 +127382 -1.000000 +127383 -1.000000 +127386 -1.000000 +127389 -1.000000 +127394 -1.000000 +127395 -1.000000 +127397 -1.000000 +127398 -1.000000 +127399 -1.000000 +127401 -1.000000 +127402 -1.000000 +127403 -1.000000 +127404 -1.000000 +127405 -1.000000 +127406 -1.000000 +127407 -1.000000 +127408 -1.000000 +127409 -1.000000 +127410 -1.000000 +127411 -1.000000 +127412 -1.000000 +127414 -1.000000 +127416 -1.000000 +127417 -1.000000 +127418 -1.000000 +127419 -1.000000 +127420 -1.000000 +127421 -1.000000 +127422 -1.000000 +127423 -1.000000 +127424 -1.000000 +127425 -1.000000 +127426 -1.000000 +127427 -1.000000 +127428 -1.000000 +127429 -1.000000 +127430 -1.000000 +127431 -1.000000 +127432 -1.000000 +127433 -1.000000 +127434 -1.000000 +127435 -1.000000 +127436 -1.000000 +127437 -1.000000 +127438 -1.000000 +127439 -1.000000 +127440 -1.000000 +127441 -1.000000 +127442 -1.000000 +127443 -1.000000 +127445 -1.000000 +127446 -1.000000 +127448 -1.000000 +127449 -1.000000 +127451 -1.000000 +127452 -1.000000 +127453 -1.000000 +127454 -1.000000 +127455 -1.000000 +127457 -1.000000 +127459 -1.000000 +127460 -1.000000 +127461 -1.000000 +127462 -1.000000 +127535 -1.000000 +127536 -1.000000 +127537 -1.000000 +127541 -1.000000 +127544 -1.000000 +127557 -1.000000 +127558 -1.000000 +127559 -1.000000 +127560 -1.000000 +127561 -1.000000 +127562 -1.000000 +127579 -1.000000 +127587 -1.000000 +127602 -1.000000 +127603 -1.000000 +127614 -1.000000 +127615 -1.000000 +127616 -1.000000 +127617 -1.000000 +127618 -1.000000 +127619 -1.000000 +127620 -1.000000 +127622 -1.000000 +127623 -1.000000 +127624 -1.000000 +127625 -1.000000 +127626 -1.000000 +127629 -1.000000 +127630 -1.000000 +127631 -1.000000 +127632 -1.000000 +127633 -1.000000 +127636 -1.000000 +127637 -1.000000 +127638 -1.000000 +127639 -1.000000 +127640 -1.000000 +127641 -1.000000 +127642 -1.000000 +127643 -1.000000 +127644 -1.000000 +127645 -1.000000 +127646 -1.000000 +127647 -1.000000 +127648 -1.000000 +127649 -1.000000 +127650 -1.000000 +127651 -1.000000 +127654 -1.000000 +127655 -1.000000 +127656 -1.000000 +127657 -1.000000 +127665 -1.000000 +127667 -1.000000 +127669 -1.000000 +127670 -1.000000 +127671 -1.000000 +127672 -1.000000 +127673 -1.000000 +127674 -1.000000 +127693 -1.000000 +127699 -1.000000 +127717 -1.000000 +127718 -1.000000 +127723 -1.000000 +127724 -1.000000 +127728 -1.000000 +127730 -1.000000 +127731 -1.000000 +127732 -1.000000 +127733 -1.000000 +127734 -1.000000 +127735 -1.000000 +127736 -1.000000 +127737 -1.000000 +127739 -1.000000 +127740 -1.000000 +127741 -1.000000 +127742 -1.000000 +127743 -1.000000 +127744 -1.000000 +127747 -1.000000 +127748 -1.000000 +127749 -1.000000 +127751 -1.000000 +127752 -1.000000 +127753 -1.000000 +127758 -1.000000 +127759 -1.000000 +127760 -1.000000 +127761 -1.000000 +127763 -1.000000 +127765 -1.000000 +127769 -1.000000 +127775 -1.000000 +127779 -1.000000 +127782 -1.000000 +127783 -1.000000 +127784 -1.000000 +127796 -1.000000 +127798 -1.000000 +127802 -1.000000 +127805 -1.000000 +127806 -1.000000 +127807 -1.000000 +127808 -1.000000 +127817 -1.000000 +127818 -1.000000 +127829 -1.000000 +127832 -1.000000 +127835 -1.000000 +127839 -1.000000 +127840 -1.000000 +127841 -1.000000 +127842 -1.000000 +127843 -1.000000 +127844 -1.000000 +127845 -1.000000 +127846 -1.000000 +127847 -1.000000 +127851 -1.000000 +127852 -1.000000 +127854 -1.000000 +127856 -1.000000 +127857 -1.000000 +127859 -1.000000 +127865 -1.000000 +127869 -1.000000 +127873 -1.000000 +127874 -1.000000 +127877 -1.000000 +127891 -1.000000 +127893 -1.000000 +127894 -1.000000 +127895 -1.000000 +127896 -1.000000 +127897 -1.000000 +127898 -1.000000 +127899 -1.000000 +127900 -1.000000 +127901 -1.000000 +127902 -1.000000 +127903 -1.000000 +127904 -1.000000 +127905 -1.000000 +127906 -1.000000 +127907 -1.000000 +127908 -1.000000 +127909 -1.000000 +127910 -1.000000 +127911 -1.000000 +127914 -1.000000 +127915 -1.000000 +127916 -1.000000 +127917 -1.000000 +127920 -1.000000 +127922 -1.000000 +127923 -1.000000 +127925 -1.000000 +127926 -1.000000 +127927 -1.000000 +127928 -1.000000 +127929 -1.000000 +127930 -1.000000 +127931 -1.000000 +127932 -1.000000 +127933 -1.000000 +127934 -1.000000 +127935 -1.000000 +127936 -1.000000 +127937 -1.000000 +127940 -1.000000 +127942 -1.000000 +127943 -1.000000 +127944 -1.000000 +127945 -1.000000 +127946 -1.000000 +127949 -1.000000 +127951 -1.000000 +127967 -1.000000 +127968 -1.000000 +127969 -1.000000 +127970 -1.000000 +127971 -1.000000 +127972 -1.000000 +127973 -1.000000 +127974 -1.000000 +127975 -1.000000 +127976 -1.000000 +127987 -1.000000 +127988 -1.000000 +127989 -1.000000 +127990 -1.000000 +127991 -1.000000 +127992 -1.000000 +127993 -1.000000 +127994 -1.000000 +127996 -1.000000 +127997 -1.000000 +127998 -1.000000 +128000 -1.000000 +128003 -1.000000 +128004 -1.000000 +128005 -1.000000 +128007 -1.000000 +128008 -1.000000 +128010 -1.000000 +128011 -1.000000 +128018 -1.000000 +128148 -1.000000 +128151 -1.000000 +128158 -1.000000 +128159 -1.000000 +128173 -1.000000 +128174 -1.000000 +128175 -1.000000 +128176 -1.000000 +128177 -1.000000 +128178 -1.000000 +128179 -1.000000 +128181 -1.000000 +128182 -1.000000 +128184 -1.000000 +128186 -1.000000 +128194 -1.000000 +128198 -1.000000 +128199 -1.000000 +128200 -1.000000 +128201 -1.000000 +128202 -1.000000 +128204 -1.000000 +128205 -1.000000 +128208 -1.000000 +128209 -1.000000 +128210 -1.000000 +128211 -1.000000 +128215 -1.000000 +128217 -1.000000 +128220 -1.000000 +128221 -1.000000 +128228 -1.000000 +128237 -1.000000 +128238 -1.000000 +128239 -1.000000 +128240 -1.000000 +128241 -1.000000 +128242 -1.000000 +128243 -1.000000 +128244 -1.000000 +128245 -1.000000 +128246 -1.000000 +128248 -1.000000 +128249 -1.000000 +128250 -1.000000 +128251 -1.000000 +128252 -1.000000 +128253 -1.000000 +128254 -1.000000 +128255 -1.000000 +128259 -1.000000 +128260 -1.000000 +128262 -1.000000 +128263 -1.000000 +128264 -1.000000 +128265 -1.000000 +128266 -1.000000 +128271 -1.000000 +128272 -1.000000 +128273 -1.000000 +128276 -1.000000 +128278 -1.000000 +128279 -1.000000 +128283 -1.000000 +128285 -1.000000 +128286 -1.000000 +128291 -1.000000 +128292 -1.000000 +128294 -1.000000 +128303 -1.000000 +128304 -1.000000 +128305 -1.000000 +128306 -1.000000 +128307 -1.000000 +128312 -1.000000 +128313 -1.000000 +128314 -1.000000 +128315 -1.000000 +128316 -1.000000 +128325 -1.000000 +128326 -1.000000 +128334 -1.000000 +128335 -1.000000 +128336 -1.000000 +128338 -1.000000 +128339 -1.000000 +128344 -1.000000 +128346 -1.000000 +128347 -1.000000 +128348 -1.000000 +128353 -1.000000 +128354 -1.000000 +128355 -1.000000 +128356 -1.000000 +128359 -1.000000 +128363 -1.000000 +128366 -1.000000 +128370 -1.000000 +128371 -1.000000 +128372 -1.000000 +128373 -1.000000 +128375 -1.000000 +128376 -1.000000 +128377 -1.000000 +128379 -1.000000 +128380 -1.000000 +128382 -1.000000 +128383 -1.000000 +128384 -1.000000 +128385 -1.000000 +128386 -1.000000 +128387 -1.000000 +128388 -1.000000 +128389 -1.000000 +128390 -1.000000 +128391 -1.000000 +128392 -1.000000 +128393 -1.000000 +128394 -1.000000 +128395 -1.000000 +128396 -1.000000 +128397 -1.000000 +128399 -1.000000 +128401 -1.000000 +128403 -1.000000 +128405 -1.000000 +128407 -1.000000 +128408 -1.000000 +128411 -1.000000 +128412 -1.000000 +128417 -1.000000 +128420 -1.000000 +128421 -1.000000 +128428 -1.000000 +128430 -1.000000 +128432 -1.000000 +128434 -1.000000 +128435 -1.000000 +128436 -1.000000 +128439 -1.000000 +128442 -1.000000 +128444 -1.000000 +128445 -1.000000 +128446 -1.000000 +128447 -1.000000 +128448 -1.000000 +128457 -1.000000 +128458 -1.000000 +128459 -1.000000 +128460 -1.000000 +128461 -1.000000 +128462 -1.000000 +128463 -1.000000 +128464 -1.000000 +128465 -1.000000 +128466 -1.000000 +128469 -1.000000 +128470 -1.000000 +128480 -1.000000 +128481 -1.000000 +128484 -1.000000 +128486 -1.000000 +128487 -1.000000 +128489 -1.000000 +128490 -1.000000 +128491 -1.000000 +128492 -1.000000 +128493 -1.000000 +128494 -1.000000 +128495 -1.000000 +128497 -1.000000 +128498 -1.000000 +128501 -1.000000 +128508 -1.000000 +128509 -1.000000 +128513 -1.000000 +128514 -1.000000 +128515 -1.000000 +128517 -1.000000 +128518 -1.000000 +128522 -1.000000 +128523 -1.000000 +128524 -1.000000 +128525 -1.000000 +128526 -1.000000 +128532 -1.000000 +128535 -1.000000 +128536 -1.000000 +128539 -1.000000 +128540 -1.000000 +128546 -1.000000 +128553 -1.000000 +128554 -1.000000 +128555 -1.000000 +128556 -1.000000 +128557 -1.000000 +128558 -1.000000 +128559 -1.000000 +128560 -1.000000 +128561 -1.000000 +128562 -1.000000 +128563 -1.000000 +128564 -1.000000 +128565 -1.000000 +128566 -1.000000 +128567 -1.000000 +128569 -1.000000 +128570 -1.000000 +128571 -1.000000 +128572 -1.000000 +128573 -1.000000 +128574 -1.000000 +128578 -1.000000 +128579 -1.000000 +128580 -1.000000 +128586 -1.000000 +128587 -1.000000 +128589 -1.000000 +128590 -1.000000 +128591 -1.000000 +128592 -1.000000 +128593 -1.000000 +128594 -1.000000 +128595 -1.000000 +128597 -1.000000 +128598 -1.000000 +128599 -1.000000 +128600 -1.000000 +128601 -1.000000 +128602 -1.000000 +128603 -1.000000 +128604 -1.000000 +128605 -1.000000 +128606 -1.000000 +128607 -1.000000 +128608 -1.000000 +128609 -1.000000 +128610 -1.000000 +128612 -1.000000 +128613 -1.000000 +128614 -1.000000 +128615 -1.000000 +128617 -1.000000 +128619 -1.000000 +128621 -1.000000 +128622 -1.000000 +128623 -1.000000 +128624 -1.000000 +128625 -1.000000 +128626 -1.000000 +128627 -1.000000 +128629 -1.000000 +128630 -1.000000 +128631 -1.000000 +128632 -1.000000 +128633 -1.000000 +128634 -1.000000 +128635 -1.000000 +128636 -1.000000 +128647 -1.000000 +128663 -1.000000 +128664 -1.000000 +128665 -1.000000 +128666 -1.000000 +128667 -1.000000 +128668 -1.000000 +128669 -1.000000 +128670 -1.000000 +128672 -1.000000 +128673 -1.000000 +128675 -1.000000 +128676 -1.000000 +128754 -1.000000 +128755 -1.000000 +128760 -1.000000 +128763 -1.000000 +128764 -1.000000 +128767 -1.000000 +128768 -1.000000 +128772 -1.000000 +128773 -1.000000 +128774 -1.000000 +128775 -1.000000 +128776 -1.000000 +128779 -1.000000 +128780 -1.000000 +128784 -1.000000 +128786 -1.000000 +128788 -1.000000 +128789 -1.000000 +128790 -1.000000 +128791 -1.000000 +128792 -1.000000 +128793 -1.000000 +128795 -1.000000 +128807 -1.000000 +128808 -1.000000 +128809 -1.000000 +128810 -1.000000 +128811 -1.000000 +128813 -1.000000 +128819 -1.000000 +128821 -1.000000 +128822 -1.000000 +128823 -1.000000 +128825 -1.000000 +128827 -1.000000 +128828 -1.000000 +128829 -1.000000 +128830 -1.000000 +128835 -1.000000 +128836 -1.000000 +128837 -1.000000 +128849 -1.000000 +128853 -1.000000 +128856 -1.000000 +128858 -1.000000 +128859 -1.000000 +128863 -1.000000 +128864 -1.000000 +128868 -1.000000 +128869 -1.000000 +128870 -1.000000 +128871 -1.000000 +128873 -1.000000 +128875 -1.000000 +128877 -1.000000 +128878 -1.000000 +128880 -1.000000 +128883 -1.000000 +128884 -1.000000 +128885 -1.000000 +128887 -1.000000 +128888 -1.000000 +128908 -1.000000 +128910 -1.000000 +128911 -1.000000 +128912 -1.000000 +128913 -1.000000 +128914 -1.000000 +128915 -1.000000 +128916 -1.000000 +128917 -1.000000 +128918 -1.000000 +128919 -1.000000 +128921 -1.000000 +128922 -1.000000 +128923 -1.000000 +128924 -1.000000 +128925 -1.000000 +128926 -1.000000 +128927 -1.000000 +128928 -1.000000 +128929 -1.000000 +128930 -1.000000 +128931 -1.000000 +128932 -1.000000 +128933 -1.000000 +128935 -1.000000 +128936 -1.000000 +128944 -1.000000 +128945 -1.000000 +128953 -1.000000 +128956 -1.000000 +128957 -1.000000 +128959 -1.000000 +128960 -1.000000 +128962 -1.000000 +128964 -1.000000 +128965 -1.000000 +128973 -1.000000 +128974 -1.000000 +128978 -1.000000 +128980 -1.000000 +128981 -1.000000 +128983 -1.000000 +128984 -1.000000 +128985 -1.000000 +128987 -1.000000 +128994 -1.000000 +129000 -1.000000 +129001 -1.000000 +129002 -1.000000 +129003 -1.000000 +129004 -1.000000 +129007 -1.000000 +129012 -1.000000 +129027 -1.000000 +129028 -1.000000 +129029 -1.000000 +129034 -1.000000 +129035 -1.000000 +129037 -1.000000 +129038 -1.000000 +129039 -1.000000 +129040 -1.000000 +129042 -1.000000 +129043 -1.000000 +129044 -1.000000 +129046 -1.000000 +129048 -1.000000 +129049 -1.000000 +129050 -1.000000 +129051 -1.000000 +129052 -1.000000 +129054 -1.000000 +129058 -1.000000 +129059 -1.000000 +129060 -1.000000 +129061 -1.000000 +129062 -1.000000 +129065 -1.000000 +129067 -1.000000 +129068 -1.000000 +129070 -1.000000 +129072 -1.000000 +129073 -1.000000 +129074 -1.000000 +129075 -1.000000 +129078 -1.000000 +129079 -1.000000 +129085 -1.000000 +129086 -1.000000 +129087 -1.000000 +129088 -1.000000 +129089 -1.000000 +129091 -1.000000 +129095 -1.000000 +129098 -1.000000 +129099 -1.000000 +129100 -1.000000 +129101 -1.000000 +129102 -1.000000 +129103 -1.000000 +129105 -1.000000 +129106 -1.000000 +129107 -1.000000 +129108 -1.000000 +129109 -1.000000 +129110 -1.000000 +129111 -1.000000 +129112 -1.000000 +129113 -1.000000 +129114 -1.000000 +129115 -1.000000 +129116 -1.000000 +129117 -1.000000 +129120 -1.000000 +129122 -1.000000 +129124 -1.000000 +129125 -1.000000 +129126 -1.000000 +129127 -1.000000 +129128 -1.000000 +129129 -1.000000 +129130 -1.000000 +129131 -1.000000 +129132 -1.000000 +129133 -1.000000 +129134 -1.000000 +129135 -1.000000 +129136 -1.000000 +129137 -1.000000 +129139 -1.000000 +129140 -1.000000 +129141 -1.000000 +129142 -1.000000 +129143 -1.000000 +129144 -1.000000 +129145 -1.000000 +129146 -1.000000 +129147 -1.000000 +129148 -1.000000 +129151 -1.000000 +129152 -1.000000 +129153 -1.000000 +129155 -1.000000 +129157 -1.000000 +129160 -1.000000 +129161 -1.000000 +129167 -1.000000 +129168 -1.000000 +129169 -1.000000 +129170 -1.000000 +129176 -1.000000 +129178 -1.000000 +129180 -1.000000 +129185 -1.000000 +129186 -1.000000 +129194 -1.000000 +129195 -1.000000 +129199 -1.000000 +129202 -1.000000 +129217 -1.000000 +129220 -1.000000 +129221 -1.000000 +129223 -1.000000 +129224 -1.000000 +129225 -1.000000 +129226 -1.000000 +129228 -1.000000 +129229 -1.000000 +129230 -1.000000 +129232 -1.000000 +129233 -1.000000 +129234 -1.000000 +129235 -1.000000 +129236 -1.000000 +129237 -1.000000 +129238 -1.000000 +129239 -1.000000 +129240 -1.000000 +129241 -1.000000 +129242 -1.000000 +129244 -1.000000 +129245 -1.000000 +129246 -1.000000 +129247 -1.000000 +129248 -1.000000 +129252 -1.000000 +129253 -1.000000 +129254 -1.000000 +129255 -1.000000 +129256 -1.000000 +129257 -1.000000 +129258 -1.000000 +129260 -1.000000 +129261 -1.000000 +129262 -1.000000 +129263 -1.000000 +129264 -1.000000 +129265 -1.000000 +129266 -1.000000 +129267 -1.000000 +129268 -1.000000 +129269 -1.000000 +129272 -1.000000 +129273 -1.000000 +129274 -1.000000 +129275 -1.000000 +129276 -1.000000 +129277 -1.000000 +129278 -1.000000 +129279 -1.000000 +129282 -1.000000 +129283 -1.000000 +129284 -1.000000 +129285 -1.000000 +129287 -1.000000 +129292 -1.000000 +129293 -1.000000 +129294 -1.000000 +129296 -1.000000 +129299 -1.000000 +129300 -1.000000 +129302 -1.000000 +129303 -1.000000 +129304 -1.000000 +129307 -1.000000 +129310 -1.000000 +129311 -1.000000 +129313 -1.000000 +129316 -1.000000 +129317 -1.000000 +129318 -1.000000 +129319 -1.000000 +129320 -1.000000 +129321 -1.000000 +129324 -1.000000 +129325 -1.000000 +129332 -1.000000 +129333 -1.000000 +129334 -1.000000 +129335 -1.000000 +129336 -1.000000 +129337 -1.000000 +129338 -1.000000 +129339 -1.000000 +129340 -1.000000 +129341 -1.000000 +129342 -1.000000 +129343 -1.000000 +129344 -1.000000 +129345 -1.000000 +129347 -1.000000 +129348 -1.000000 +129349 -1.000000 +129350 -1.000000 +129351 -1.000000 +129353 -1.000000 +129354 -1.000000 +129355 -1.000000 +129358 -1.000000 +129359 -1.000000 +129361 -1.000000 +129362 -1.000000 +129363 -1.000000 +129364 -1.000000 +129365 -1.000000 +129366 -1.000000 +129367 -1.000000 +129368 -1.000000 +129369 -1.000000 +129370 -1.000000 +129371 -1.000000 +129372 -1.000000 +129373 -1.000000 +129374 -1.000000 +129376 -1.000000 +129392 -1.000000 +129393 -1.000000 +129394 -1.000000 +129396 -1.000000 +129399 -1.000000 +129400 -1.000000 +129401 -1.000000 +129402 -1.000000 +129403 -1.000000 +129404 -1.000000 +129405 -1.000000 +129406 -1.000000 +129409 -1.000000 +129410 -1.000000 +129411 -1.000000 +129412 -1.000000 +129413 -1.000000 +129414 -1.000000 +129418 -1.000000 +129419 -1.000000 +129421 -1.000000 +129422 -1.000000 +129423 -1.000000 +129425 -1.000000 +129426 -1.000000 +129427 -1.000000 +129430 -1.000000 +129431 -1.000000 +129432 -1.000000 +129434 -1.000000 +129435 -1.000000 +129436 -1.000000 +129437 -1.000000 +129438 -1.000000 +129440 -1.000000 +129441 -1.000000 +129442 -1.000000 +129444 -1.000000 +129445 -1.000000 +129449 -1.000000 +129453 -1.000000 +129454 -1.000000 +129455 -1.000000 +129456 -1.000000 +129457 -1.000000 +129458 -1.000000 +129459 -1.000000 +129460 -1.000000 +129461 -1.000000 +129462 -1.000000 +129463 -1.000000 +129464 -1.000000 +129465 -1.000000 +129466 -1.000000 +129468 -1.000000 +129469 -1.000000 +129470 -1.000000 +129473 -1.000000 +129474 -1.000000 +129475 -1.000000 +129476 -1.000000 +129477 -1.000000 +129478 -1.000000 +129479 -1.000000 +129480 -1.000000 +129482 -1.000000 +129483 -1.000000 +129487 -1.000000 +129488 -1.000000 +129497 -1.000000 +129498 -1.000000 +129499 -1.000000 +129500 -1.000000 +129503 -1.000000 +129504 -1.000000 +129505 -1.000000 +129506 -1.000000 +129507 -1.000000 +129508 -1.000000 +129509 -1.000000 +129510 -1.000000 +129511 -1.000000 +129512 -1.000000 +129513 -1.000000 +129514 -1.000000 +129515 -1.000000 +129522 -1.000000 +129523 -1.000000 +129524 -1.000000 +129525 -1.000000 +129527 -1.000000 +129528 -1.000000 +129529 -1.000000 +129530 -1.000000 +129531 -1.000000 +129532 -1.000000 +129533 -1.000000 +129534 -1.000000 +129535 -1.000000 +129536 -1.000000 +129537 -1.000000 +129538 -1.000000 +129541 -1.000000 +129542 -1.000000 +129543 -1.000000 +129544 -1.000000 +129545 -1.000000 +129546 -1.000000 +129547 -1.000000 +129548 -1.000000 +129549 -1.000000 +129550 -1.000000 +129556 -1.000000 +129557 -1.000000 +129558 -1.000000 +129560 -1.000000 +129565 -1.000000 +129571 -1.000000 +129572 -1.000000 +129573 -1.000000 +129574 -1.000000 +129575 -1.000000 +129576 -1.000000 +129577 -1.000000 +129578 -1.000000 +129579 -1.000000 +129580 -1.000000 +129581 -1.000000 +129583 -1.000000 +129585 -1.000000 +129586 -1.000000 +129587 -1.000000 +129588 -1.000000 +129590 -1.000000 +129592 -1.000000 +129594 -1.000000 +129596 -1.000000 +129597 -1.000000 +129599 -1.000000 +129601 -1.000000 +129604 -1.000000 +129606 -1.000000 +129607 -1.000000 +129608 -1.000000 +129609 -1.000000 +129610 -1.000000 +129611 -1.000000 +129613 -1.000000 +129615 -1.000000 +129616 -1.000000 +129617 -1.000000 +129621 -1.000000 +129622 -1.000000 +129623 -1.000000 +129624 -1.000000 +129625 -1.000000 +129626 -1.000000 +129629 -1.000000 +129630 -1.000000 +129631 -1.000000 +129632 -1.000000 +129633 -1.000000 +129634 -1.000000 +129635 -1.000000 +129636 -1.000000 +129638 -1.000000 +129639 -1.000000 +129640 -1.000000 +129641 -1.000000 +129642 -1.000000 +129644 -1.000000 +129646 -1.000000 +129648 -1.000000 +129649 -1.000000 +129650 -1.000000 +129651 -1.000000 +129652 -1.000000 +129653 -1.000000 +129654 -1.000000 +129655 -1.000000 +129656 -1.000000 +129657 -1.000000 +129658 -1.000000 +129659 -1.000000 +129660 -1.000000 +129661 -1.000000 +129665 -1.000000 +129666 -1.000000 +129667 -1.000000 +129668 -1.000000 +129669 -1.000000 +129670 -1.000000 +129671 -1.000000 +129672 -1.000000 +129673 -1.000000 +129674 -1.000000 +129675 -1.000000 +129676 -1.000000 +129677 -1.000000 +129680 -1.000000 +129681 -1.000000 +129682 -1.000000 +129684 -1.000000 +129685 -1.000000 +129686 -1.000000 +129687 -1.000000 +129688 -1.000000 +129689 -1.000000 +129690 -1.000000 +129691 -1.000000 +129692 -1.000000 +129693 -1.000000 +129695 -1.000000 +129710 -1.000000 +129711 -1.000000 +129712 -1.000000 +129713 -1.000000 +129714 -1.000000 +129716 -1.000000 +129717 -1.000000 +129718 -1.000000 +129719 -1.000000 +129722 -1.000000 +129725 -1.000000 +129726 -1.000000 +129728 -1.000000 +129729 -1.000000 +129730 -1.000000 +129733 -1.000000 +129734 -1.000000 +129736 -1.000000 +129738 -1.000000 +129770 -1.000000 +129771 -1.000000 +129772 -1.000000 +129773 -1.000000 +129774 -1.000000 +129778 -1.000000 +129785 -1.000000 +129786 -1.000000 +129788 -1.000000 +129791 -1.000000 +129793 -1.000000 +129796 -1.000000 +129800 -1.000000 +129803 -1.000000 +129805 -1.000000 +129806 -1.000000 +129807 -1.000000 +129808 -1.000000 +129809 -1.000000 +129810 -1.000000 +129811 -1.000000 +129812 -1.000000 +129813 -1.000000 +129814 -1.000000 +129815 -1.000000 +129816 -1.000000 +129817 -1.000000 +129818 -1.000000 +129819 -1.000000 +129820 -1.000000 +129822 -1.000000 +129823 -1.000000 +129824 -1.000000 +129825 -1.000000 +129826 -1.000000 +129827 -1.000000 +129828 -1.000000 +129829 -1.000000 +129830 -1.000000 +129831 -1.000000 +129832 -1.000000 +129836 -1.000000 +129837 -1.000000 +129838 -1.000000 +129839 -1.000000 +129840 -1.000000 +129841 -1.000000 +129842 -1.000000 +129843 -1.000000 +129844 -1.000000 +129845 -1.000000 +129846 -1.000000 +129847 -1.000000 +129849 -1.000000 +129850 -1.000000 +129851 -1.000000 +129852 -1.000000 +129864 -1.000000 +129865 -1.000000 +129866 -1.000000 +129872 -1.000000 +129873 -1.000000 +129874 -1.000000 +129875 -1.000000 +129876 -1.000000 +129877 -1.000000 +129878 -1.000000 +129879 -1.000000 +129880 -1.000000 +129881 -1.000000 +129884 -1.000000 +129885 -1.000000 +129886 -1.000000 +129887 -1.000000 +129892 -1.000000 +129896 -1.000000 +129897 -1.000000 +129898 -1.000000 +129899 -1.000000 +129901 -1.000000 +129902 -1.000000 +129903 -1.000000 +129904 -1.000000 +129905 -1.000000 +129906 -1.000000 +129907 -1.000000 +129908 -1.000000 +129909 -1.000000 +129910 -1.000000 +129911 -1.000000 +129912 -1.000000 +129913 -1.000000 +129915 -1.000000 +129916 -1.000000 +129917 -1.000000 +129918 -1.000000 +129919 -1.000000 +129920 -1.000000 +129921 -1.000000 +129924 -1.000000 +129926 -1.000000 +129927 -1.000000 +129928 -1.000000 +129929 -1.000000 +129930 -1.000000 +129931 -1.000000 +129932 -1.000000 +129933 -1.000000 +129934 -1.000000 +129935 -1.000000 +129936 -1.000000 +129937 -1.000000 +129938 -1.000000 +129943 -1.000000 +129945 -1.000000 +129954 -1.000000 +129958 -1.000000 +129972 -1.000000 +129975 -1.000000 +129978 -1.000000 +129981 -1.000000 +129982 -1.000000 +129983 -1.000000 +129984 -1.000000 +129985 -1.000000 +129986 -1.000000 +129987 -1.000000 +129988 -1.000000 +129991 -1.000000 +129992 -1.000000 +129993 -1.000000 +129994 -1.000000 +129995 -1.000000 +129997 -1.000000 +130003 -1.000000 +130006 -1.000000 +130008 -1.000000 +130010 -1.000000 +130012 -1.000000 +130013 -1.000000 +130014 -1.000000 +130015 -1.000000 +130016 -1.000000 +130017 -1.000000 +130018 -1.000000 +130019 -1.000000 +130020 -1.000000 +130021 -1.000000 +130022 -1.000000 +130023 -1.000000 +130024 -1.000000 +130025 -1.000000 +130026 -1.000000 +130027 -1.000000 +130028 -1.000000 +130029 -1.000000 +130030 -1.000000 +130031 -1.000000 +130032 -1.000000 +130033 -1.000000 +130034 -1.000000 +130035 -1.000000 +130036 -1.000000 +130037 -1.000000 +130038 -1.000000 +130039 -1.000000 +130040 -1.000000 +130041 -1.000000 +130044 -1.000000 +130045 -1.000000 +130046 -1.000000 +130047 -1.000000 +130048 -1.000000 +130049 -1.000000 +130050 -1.000000 +130051 -1.000000 +130052 -1.000000 +130057 -1.000000 +130063 -1.000000 +130064 -1.000000 +130065 -1.000000 +130066 -1.000000 +130067 -1.000000 +130068 -1.000000 +130069 -1.000000 +130070 -1.000000 +130071 -1.000000 +130072 -1.000000 +130075 -1.000000 +130076 -1.000000 +130077 -1.000000 +130078 -1.000000 +130079 -1.000000 +130080 -1.000000 +130081 -1.000000 +130082 -1.000000 +130083 -1.000000 +130084 -1.000000 +130085 -1.000000 +130086 -1.000000 +130087 -1.000000 +130088 -1.000000 +130089 -1.000000 +130090 -1.000000 +130091 -1.000000 +130093 -1.000000 +130094 -1.000000 +130110 -1.000000 +130111 -1.000000 +130136 -1.000000 +130137 -1.000000 +130142 -1.000000 +130143 -1.000000 +130150 -1.000000 +130151 -1.000000 +130155 -1.000000 +130156 -1.000000 +130159 -1.000000 +130162 -1.000000 +130166 -1.000000 +130168 -1.000000 +130170 -1.000000 +130171 -1.000000 +130176 -1.000000 +130183 -1.000000 +130184 -1.000000 +130185 -1.000000 +130186 -1.000000 +130187 -1.000000 +130188 -1.000000 +130189 -1.000000 +130190 -1.000000 +130191 -1.000000 +130192 -1.000000 +130217 -1.000000 +130218 -1.000000 +130233 -1.000000 +130235 -1.000000 +130236 -1.000000 +130273 -1.000000 +130277 -1.000000 +130284 -1.000000 +130285 -1.000000 +130286 -1.000000 +130287 -1.000000 +130288 -1.000000 +130289 -1.000000 +130290 -1.000000 +130291 -1.000000 +130292 -1.000000 +130293 -1.000000 +130294 -1.000000 +130295 -1.000000 +130298 -1.000000 +130299 -1.000000 +130300 -1.000000 +130301 -1.000000 +130302 -1.000000 +130303 -1.000000 +130304 -1.000000 +130305 -1.000000 +130306 -1.000000 +130307 -1.000000 +130403 -1.000000 +130405 -1.000000 +130406 -1.000000 +130407 -1.000000 +130408 -1.000000 +130409 -1.000000 +130410 -1.000000 +130411 -1.000000 +130412 -1.000000 +130413 -1.000000 +130414 -1.000000 +130415 -1.000000 +130416 -1.000000 +130417 -1.000000 +130418 -1.000000 +130419 -1.000000 +130420 -1.000000 +130421 -1.000000 +130422 -1.000000 +130423 -1.000000 +130424 -1.000000 +130425 -1.000000 +130426 -1.000000 +130427 -1.000000 +130428 -1.000000 +130429 -1.000000 +130430 -1.000000 +130432 -1.000000 +130433 -1.000000 +130434 -1.000000 +130435 -1.000000 +130436 -1.000000 +130437 -1.000000 +130438 -1.000000 +130439 -1.000000 +130440 -1.000000 +130441 -1.000000 +130442 -1.000000 +130443 -1.000000 +130444 -1.000000 +130445 -1.000000 +130446 -1.000000 +130447 -1.000000 +130448 -1.000000 +130449 -1.000000 +130452 -1.000000 +130453 -1.000000 +130454 -1.000000 +130455 -1.000000 +130456 -1.000000 +130457 -1.000000 +130458 -1.000000 +130459 -1.000000 +130460 -1.000000 +130461 -1.000000 +130462 -1.000000 +130463 -1.000000 +130464 -1.000000 +130465 -1.000000 +130466 -1.000000 +130467 -1.000000 +130468 -1.000000 +130469 -1.000000 +130470 -1.000000 +130471 -1.000000 +130472 -1.000000 +130473 -1.000000 +130474 -1.000000 +130475 -1.000000 +130476 -1.000000 +130477 -1.000000 +130478 -1.000000 +130479 -1.000000 +130480 -1.000000 +130481 -1.000000 +130482 -1.000000 +130483 -1.000000 +130484 -1.000000 +130485 -1.000000 +130486 -1.000000 +130487 -1.000000 +130488 -1.000000 +130489 -1.000000 +130490 -1.000000 +130491 -1.000000 +130492 -1.000000 +130493 -1.000000 +130494 -1.000000 +130495 -1.000000 +130496 -1.000000 +130497 -1.000000 +130498 -1.000000 +130499 -1.000000 +130500 -1.000000 +130501 -1.000000 +130502 -1.000000 +130503 -1.000000 +130505 -1.000000 +130508 -1.000000 +130509 -1.000000 +130510 -1.000000 +130511 -1.000000 +130512 -1.000000 +130513 -1.000000 +130514 -1.000000 +130515 -1.000000 +130516 -1.000000 +130517 -1.000000 +130518 -1.000000 +130519 -1.000000 +130520 -1.000000 +130521 -1.000000 +130522 -1.000000 +130523 -1.000000 +130524 -1.000000 +130525 -1.000000 +130526 -1.000000 +130527 -1.000000 +130528 -1.000000 +130529 -1.000000 +130530 -1.000000 +130531 -1.000000 +130532 -1.000000 +130533 -1.000000 +130534 -1.000000 +130535 -1.000000 +130536 -1.000000 +130537 -1.000000 +130538 -1.000000 +130539 -1.000000 +130540 -1.000000 +130541 -1.000000 +130542 -1.000000 +130543 -1.000000 +130544 -1.000000 +130545 -1.000000 +130546 -1.000000 +130547 -1.000000 +130548 -1.000000 +130549 -1.000000 +130568 -1.000000 +130569 -1.000000 +130570 -1.000000 +130571 -1.000000 +130572 -1.000000 +130573 -1.000000 +130574 -1.000000 +130575 -1.000000 +130576 -1.000000 +130577 -1.000000 +130578 -1.000000 +130579 -1.000000 +130580 -1.000000 +130581 -1.000000 +130582 -1.000000 +130583 -1.000000 +130625 -1.000000 +130626 -1.000000 +130627 -1.000000 +130628 -1.000000 +130629 -1.000000 +130630 -1.000000 +130631 -1.000000 +130632 -1.000000 +130638 -1.000000 +130641 -1.000000 +130642 -1.000000 +130643 -1.000000 +130644 -1.000000 +130645 -1.000000 +130646 -1.000000 +130647 -1.000000 +130648 -1.000000 +130649 -1.000000 +130650 -1.000000 +130652 -1.000000 +130653 -1.000000 +130654 -1.000000 +130655 -1.000000 +130656 -1.000000 +130657 -1.000000 +130659 -1.000000 +130660 -1.000000 +130661 -1.000000 +130671 -1.000000 +130674 -1.000000 +130676 -1.000000 +130677 -1.000000 +130678 -1.000000 +130680 -1.000000 +130681 -1.000000 +130682 -1.000000 +130683 -1.000000 +130684 -1.000000 +130686 -1.000000 +130687 -1.000000 +130688 -1.000000 +130689 -1.000000 +130690 -1.000000 +130691 -1.000000 +130692 -1.000000 +130693 -1.000000 +130694 -1.000000 +130695 -1.000000 +130696 -1.000000 +130697 -1.000000 +130701 -1.000000 +130702 -1.000000 +130703 -1.000000 +130718 -1.000000 +130720 -1.000000 +130721 -1.000000 +130722 -1.000000 +130723 -1.000000 +130724 -1.000000 +130725 -1.000000 +130726 -1.000000 +130727 -1.000000 +130728 -1.000000 +130729 -1.000000 +130730 -1.000000 +130731 -1.000000 +130733 -1.000000 +130734 -1.000000 +130735 -1.000000 +130736 -1.000000 +130737 -1.000000 +130740 -1.000000 +130741 -1.000000 +130742 -1.000000 +130743 -1.000000 +130745 -1.000000 +130746 -1.000000 +130749 -1.000000 +130750 -1.000000 +130751 -1.000000 +130752 -1.000000 +130753 -1.000000 +130754 -1.000000 +130755 -1.000000 +130756 -1.000000 +130757 -1.000000 +130758 -1.000000 +130759 -1.000000 +130762 -1.000000 +130764 -1.000000 +130765 -1.000000 +130766 -1.000000 +130767 -1.000000 +130768 -1.000000 +130769 -1.000000 +130770 -1.000000 +130771 -1.000000 +130772 -1.000000 +130773 -1.000000 +130774 -1.000000 +130775 -1.000000 +130776 -1.000000 +130777 -1.000000 +130778 -1.000000 +130780 -1.000000 +130781 -1.000000 +130782 -1.000000 +130783 -1.000000 +130784 -1.000000 +130785 -1.000000 +130786 -1.000000 +130787 -1.000000 +130788 -1.000000 +130789 -1.000000 +130790 -1.000000 +130791 -1.000000 +130792 -1.000000 +130793 -1.000000 +130794 -1.000000 +130795 -1.000000 +130796 -1.000000 +130797 -1.000000 +130798 -1.000000 +130799 -1.000000 +130800 -1.000000 +130801 -1.000000 +130802 -1.000000 +130803 -1.000000 +130805 -1.000000 +130806 -1.000000 +130807 -1.000000 +130808 -1.000000 +130809 -1.000000 +130810 -1.000000 +130811 -1.000000 +130812 -1.000000 +130813 -1.000000 +130814 -1.000000 +130815 -1.000000 +130816 -1.000000 +130817 -1.000000 +130818 -1.000000 +130819 -1.000000 +130820 -1.000000 +130821 -1.000000 +130822 -1.000000 +130823 -1.000000 +130824 -1.000000 +130825 -1.000000 +130826 -1.000000 +130827 -1.000000 +130828 -1.000000 +130829 -1.000000 +130830 -1.000000 +130831 -1.000000 +130832 -1.000000 +130833 -1.000000 +130834 -1.000000 +130835 -1.000000 +130836 -1.000000 +130837 -1.000000 +130838 -1.000000 +130839 -1.000000 +130840 -1.000000 +130841 -1.000000 +130842 -1.000000 +130843 -1.000000 +130844 -1.000000 +130845 -1.000000 +130847 -1.000000 +130848 -1.000000 +130849 -1.000000 +130850 -1.000000 +130851 -1.000000 +130852 -1.000000 +130853 -1.000000 +130854 -1.000000 +130855 -1.000000 +130856 -1.000000 +130861 -1.000000 +130868 -1.000000 +130869 -1.000000 +130870 -1.000000 +130871 -1.000000 +130872 -1.000000 +130873 -1.000000 +130874 -1.000000 +130875 -1.000000 +130876 -1.000000 +130877 -1.000000 +130880 -1.000000 +130881 -1.000000 +130882 -1.000000 +130884 -1.000000 +130885 -1.000000 +130886 -1.000000 +130887 -1.000000 +130888 -1.000000 +130890 -1.000000 +130891 -1.000000 +130895 -1.000000 +130907 -1.000000 +130908 -1.000000 +130916 -1.000000 +130917 -1.000000 +130918 -1.000000 +130919 -1.000000 +130921 -1.000000 +130922 -1.000000 +130923 -1.000000 +130924 -1.000000 +130927 -1.000000 +130928 -1.000000 +130929 -1.000000 +130931 -1.000000 +130932 -1.000000 +130934 -1.000000 +130936 -1.000000 +130937 -1.000000 +130938 -1.000000 +130939 -1.000000 +130940 -1.000000 +130941 -1.000000 +130942 -1.000000 +130943 -1.000000 +130944 -1.000000 +130945 -1.000000 +130946 -1.000000 +130947 -1.000000 +130948 -1.000000 +130949 -1.000000 +130950 -1.000000 +130951 -1.000000 +130952 -1.000000 +130953 -1.000000 +130954 -1.000000 +130955 -1.000000 +130956 -1.000000 +130957 -1.000000 +130958 -1.000000 +130963 -1.000000 +130964 -1.000000 +130965 -1.000000 +130966 -1.000000 +130967 -1.000000 +130968 -1.000000 +130969 -1.000000 +130970 -1.000000 +130971 -1.000000 +130972 -1.000000 +130973 -1.000000 +130974 -1.000000 +130975 -1.000000 +130976 -1.000000 +130977 -1.000000 +130978 -1.000000 +130979 -1.000000 +130980 -1.000000 +130981 -1.000000 +130982 -1.000000 +130983 -1.000000 +130984 -1.000000 +130985 -1.000000 +130986 -1.000000 +130987 -1.000000 +130989 -1.000000 +130990 -1.000000 +130991 -1.000000 +130992 -1.000000 +130993 -1.000000 +130994 -1.000000 +130995 -1.000000 +130996 -1.000000 +130997 -1.000000 +130998 -1.000000 +130999 -1.000000 +131000 -1.000000 +131002 -1.000000 +131003 -1.000000 +131004 -1.000000 +131007 -1.000000 +131008 -1.000000 +131009 -1.000000 +131011 -1.000000 +131012 -1.000000 +131013 -1.000000 +131014 -1.000000 +131015 -1.000000 +131016 -1.000000 +131017 -1.000000 +131018 -1.000000 +131056 -1.000000 +131057 -1.000000 +131060 -1.000000 +131061 -1.000000 +131062 -1.000000 +131063 -1.000000 +131064 -1.000000 +131065 -1.000000 +131066 -1.000000 +131067 -1.000000 +131068 -1.000000 +131069 -1.000000 +131070 -1.000000 +131072 -1.000000 +131080 -1.000000 +131081 -1.000000 +131082 -1.000000 +131083 -1.000000 +131084 -1.000000 +131085 -1.000000 +131086 -1.000000 +131087 -1.000000 +131090 -1.000000 +131091 -1.000000 +131107 -1.000000 +131114 -1.000000 +131115 -1.000000 +131116 -1.000000 +131117 -1.000000 +131118 -1.000000 +131119 -1.000000 +131120 -1.000000 +131126 -1.000000 +131127 -1.000000 +131128 -1.000000 +131129 -1.000000 +131130 -1.000000 +131131 -1.000000 +131132 -1.000000 +131133 -1.000000 +131135 -1.000000 +131136 -1.000000 +131137 -1.000000 +131138 -1.000000 +131141 -1.000000 +131142 -1.000000 +131150 -1.000000 +131151 -1.000000 +131152 -1.000000 +131155 -1.000000 +131159 -1.000000 +131160 -1.000000 +131161 -1.000000 +131162 -1.000000 +131163 -1.000000 +131167 -1.000000 +131168 -1.000000 +131169 -1.000000 +131170 -1.000000 +131171 -1.000000 +131178 -1.000000 +131184 -1.000000 +131185 -1.000000 +131186 -1.000000 +131187 -1.000000 +131189 -1.000000 +131190 -1.000000 +131192 -1.000000 +131194 -1.000000 +131196 -1.000000 +131198 -1.000000 +131199 -1.000000 +131201 -1.000000 +131203 -1.000000 +131204 -1.000000 +131205 -1.000000 +131206 -1.000000 +131208 -1.000000 +131209 -1.000000 +131212 -1.000000 +131215 -1.000000 +131233 -1.000000 +131234 -1.000000 +131235 -1.000000 +131236 -1.000000 +131237 -1.000000 +131238 -1.000000 +131239 -1.000000 +131240 -1.000000 +131241 -1.000000 +131242 -1.000000 +131243 -1.000000 +131244 -1.000000 +131245 -1.000000 +131246 -1.000000 +131247 -1.000000 +131262 -1.000000 +131265 -1.000000 +131266 -1.000000 +131267 -1.000000 +131268 -1.000000 +131271 -1.000000 +131272 -1.000000 +131273 -1.000000 +131274 -1.000000 +131275 -1.000000 +131276 -1.000000 +131277 -1.000000 +131278 -1.000000 +131279 -1.000000 +131280 -1.000000 +131281 -1.000000 +131282 -1.000000 +131310 -1.000000 +131312 -1.000000 +131313 -1.000000 +131314 -1.000000 +131315 -1.000000 +131316 -1.000000 +131317 -1.000000 +131318 -1.000000 +131319 -1.000000 +131320 -1.000000 +131321 -1.000000 +131322 -1.000000 +131323 -1.000000 +131324 -1.000000 +131325 -1.000000 +131326 -1.000000 +131327 -1.000000 +131328 -1.000000 +131329 -1.000000 +131330 -1.000000 +131331 -1.000000 +131332 -1.000000 +131333 -1.000000 +131334 -1.000000 +131335 -1.000000 +131336 -1.000000 +131339 -1.000000 +131345 -1.000000 +131346 -1.000000 +131347 -1.000000 +131351 -1.000000 +131362 -1.000000 +131363 -1.000000 +131365 -1.000000 +131368 -1.000000 +131369 -1.000000 +131373 -1.000000 +131374 -1.000000 +131379 -1.000000 +131380 -1.000000 +131383 -1.000000 +131384 -1.000000 +131385 -1.000000 +131386 -1.000000 +131389 -1.000000 +131392 -1.000000 +131394 -1.000000 +131395 -1.000000 +131396 -1.000000 +131397 -1.000000 +131398 -1.000000 +131399 -1.000000 +131400 -1.000000 +131401 -1.000000 +131402 -1.000000 +131403 -1.000000 +131404 -1.000000 +131405 -1.000000 +131406 -1.000000 +131407 -1.000000 +131408 -1.000000 +131409 -1.000000 +131411 -1.000000 +131412 -1.000000 +131415 -1.000000 +131416 -1.000000 +131417 -1.000000 +131418 -1.000000 +131419 -1.000000 +131420 -1.000000 +131422 -1.000000 +131427 -1.000000 +131428 -1.000000 +131429 -1.000000 +131430 -1.000000 +131431 -1.000000 +131432 -1.000000 +131444 -1.000000 +131445 -1.000000 +131446 -1.000000 +131447 -1.000000 +131448 -1.000000 +131451 -1.000000 +131452 -1.000000 +131453 -1.000000 +131454 -1.000000 +131455 -1.000000 +131456 -1.000000 +131457 -1.000000 +131458 -1.000000 +131460 -1.000000 +131461 -1.000000 +131462 -1.000000 +131463 -1.000000 +131466 -1.000000 +131467 -1.000000 +131468 -1.000000 +131472 -1.000000 +131473 -1.000000 +131475 -1.000000 +131477 -1.000000 +131482 -1.000000 +131485 -1.000000 +131487 -1.000000 +131488 -1.000000 +131489 -1.000000 +131490 -1.000000 +131491 -1.000000 +131492 -1.000000 +131493 -1.000000 +131497 -1.000000 +131499 -1.000000 +131500 -1.000000 +131521 -1.000000 +131526 -1.000000 +131532 -1.000000 +131545 -1.000000 +131615 -1.000000 +131618 -1.000000 +131619 -1.000000 +131620 -1.000000 +131621 -1.000000 +131626 -1.000000 +131627 -1.000000 +131628 -1.000000 +131630 -1.000000 +131634 -1.000000 +131638 -1.000000 +131640 -1.000000 +131663 -1.000000 +131671 -1.000000 +131672 -1.000000 +131673 -1.000000 +131674 -1.000000 +131676 -1.000000 +131677 -1.000000 +131678 -1.000000 +131679 -1.000000 +131681 -1.000000 +131682 -1.000000 +131683 -1.000000 +131698 -1.000000 +131699 -1.000000 +131701 -1.000000 +131702 -1.000000 +131703 -1.000000 +131704 -1.000000 +131706 -1.000000 +131707 -1.000000 +131708 -1.000000 +131709 -1.000000 +131710 -1.000000 +131711 -1.000000 +131712 -1.000000 +131713 -1.000000 +131714 -1.000000 +131715 -1.000000 +131716 -1.000000 +131717 -1.000000 +131718 -1.000000 +131719 -1.000000 +131721 -1.000000 +131722 -1.000000 +131723 -1.000000 +131724 -1.000000 +131725 -1.000000 +131726 -1.000000 +131727 -1.000000 +131729 -1.000000 +131731 -1.000000 +131732 -1.000000 +131733 -1.000000 +131734 -1.000000 +131735 -1.000000 +131736 -1.000000 +131737 -1.000000 +131738 -1.000000 +131739 -1.000000 +131740 -1.000000 +131741 -1.000000 +131742 -1.000000 +131745 -1.000000 +131746 -1.000000 +131747 -1.000000 +131748 -1.000000 +131749 -1.000000 +131750 -1.000000 +131751 -1.000000 +131752 -1.000000 +131753 -1.000000 +131754 -1.000000 +131755 -1.000000 +131756 -1.000000 +131757 -1.000000 +131758 -1.000000 +131759 -1.000000 +131760 -1.000000 +131761 -1.000000 +131762 -1.000000 +131763 -1.000000 +131764 -1.000000 +131765 -1.000000 +131766 -1.000000 +131767 -1.000000 +131768 -1.000000 +131769 -1.000000 +131771 -1.000000 +131773 -1.000000 +131774 -1.000000 +131775 -1.000000 +131776 -1.000000 +131777 -1.000000 +131778 -1.000000 +131779 -1.000000 +131780 -1.000000 +131781 -1.000000 +131782 -1.000000 +131783 -1.000000 +131784 -1.000000 +131785 -1.000000 +131805 -1.000000 +131806 -1.000000 +131807 -1.000000 +131815 -1.000000 +131820 -1.000000 +131822 -1.000000 +131824 -1.000000 +131825 -1.000000 +131826 -1.000000 +131827 -1.000000 +131828 -1.000000 +131829 -1.000000 +131830 -1.000000 +131831 -1.000000 +131832 -1.000000 +131833 -1.000000 +131834 -1.000000 +131835 -1.000000 +131836 -1.000000 +131837 -1.000000 +131838 -1.000000 +131839 -1.000000 +131840 -1.000000 +131841 -1.000000 +131842 -1.000000 +131843 -1.000000 +131845 -1.000000 +131846 -1.000000 +131848 -1.000000 +131849 -1.000000 +131850 -1.000000 +131852 -1.000000 +131854 -1.000000 +131855 -1.000000 +131856 -1.000000 +131857 -1.000000 +131858 -1.000000 +131859 -1.000000 +131860 -1.000000 +131861 -1.000000 +131862 -1.000000 +131863 -1.000000 +131864 -1.000000 +131865 -1.000000 +131866 -1.000000 +131867 -1.000000 +131868 -1.000000 +131869 -1.000000 +131874 -1.000000 +131875 -1.000000 +131876 -1.000000 +131877 -1.000000 +131878 -1.000000 +131879 -1.000000 +131881 -1.000000 +131885 -1.000000 +131888 -1.000000 +131889 -1.000000 +131890 -1.000000 +131891 -1.000000 +131892 -1.000000 +131893 -1.000000 +131894 -1.000000 +131895 -1.000000 +131896 -1.000000 +131897 -1.000000 +131898 -1.000000 +131899 -1.000000 +131900 -1.000000 +131901 -1.000000 +131902 -1.000000 +131906 -1.000000 +131907 -1.000000 +131910 -1.000000 +131913 -1.000000 +131915 -1.000000 +131917 -1.000000 +131918 -1.000000 +131919 -1.000000 +131920 -1.000000 +131921 -1.000000 +131922 -1.000000 +131923 -1.000000 +131924 -1.000000 +131931 -1.000000 +131932 -1.000000 +131933 -1.000000 +131934 -1.000000 +131935 -1.000000 +131938 -1.000000 +131939 -1.000000 +131940 -1.000000 +131942 -1.000000 +131946 -1.000000 +131947 -1.000000 +131948 -1.000000 +131950 -1.000000 +131952 -1.000000 +131953 -1.000000 +131954 -1.000000 +131955 -1.000000 +131957 -1.000000 +131958 -1.000000 +131961 -1.000000 +131964 -1.000000 +131965 -1.000000 +131966 -1.000000 +131967 -1.000000 +131968 -1.000000 +131969 -1.000000 +131971 -1.000000 +131975 -1.000000 +131976 -1.000000 +131977 -1.000000 +131978 -1.000000 +131979 -1.000000 +131980 -1.000000 +131981 -1.000000 +131982 -1.000000 +131983 -1.000000 +131984 -1.000000 +131985 -1.000000 +131986 -1.000000 +131987 -1.000000 +131989 -1.000000 +131993 -1.000000 +131994 -1.000000 +131996 -1.000000 +132000 -1.000000 +132003 -1.000000 +132006 -1.000000 +132010 -1.000000 +132011 -1.000000 +132012 -1.000000 +132013 -1.000000 +132014 -1.000000 +132015 -1.000000 +132016 -1.000000 +132017 -1.000000 +132018 -1.000000 +132019 -1.000000 +132027 -1.000000 +132028 -1.000000 +132029 -1.000000 +132030 -1.000000 +132031 -1.000000 +132032 -1.000000 +132033 -1.000000 +132034 -1.000000 +132035 -1.000000 +132036 -1.000000 +132037 -1.000000 +132038 -1.000000 +132039 -1.000000 +132040 -1.000000 +132041 -1.000000 +132042 -1.000000 +132043 -1.000000 +132044 -1.000000 +132045 -1.000000 +132046 -1.000000 +132047 -1.000000 +132051 -1.000000 +132052 -1.000000 +132053 -1.000000 +132055 -1.000000 +132056 -1.000000 +132057 -1.000000 +132058 -1.000000 +132059 -1.000000 +132063 -1.000000 +132064 -1.000000 +132065 -1.000000 +132066 -1.000000 +132067 -1.000000 +132068 -1.000000 +132069 -1.000000 +132070 -1.000000 +132071 -1.000000 +132072 -1.000000 +132073 -1.000000 +132074 -1.000000 +132075 -1.000000 +132076 -1.000000 +132077 -1.000000 +132078 -1.000000 +132079 -1.000000 +132081 -1.000000 +132082 -1.000000 +132083 -1.000000 +132084 -1.000000 +132085 -1.000000 +132087 -1.000000 +132096 -1.000000 +132097 -1.000000 +132098 -1.000000 +132099 -1.000000 +132108 -1.000000 +132146 -1.000000 +132147 -1.000000 +132149 -1.000000 +132153 -1.000000 +132170 -1.000000 +132181 -1.000000 +132182 -1.000000 +132184 -1.000000 +132188 -1.000000 +132191 -1.000000 +132193 -1.000000 +132195 -1.000000 +132201 -1.000000 +132202 -1.000000 +132203 -1.000000 +132204 -1.000000 +132206 -1.000000 +132210 -1.000000 +132213 -1.000000 +132214 -1.000000 +132215 -1.000000 +132216 -1.000000 +132217 -1.000000 +132218 -1.000000 +132219 -1.000000 +132220 -1.000000 +132221 -1.000000 +132222 -1.000000 +132223 -1.000000 +132224 -1.000000 +132225 -1.000000 +132226 -1.000000 +132227 -1.000000 +132228 -1.000000 +132229 -1.000000 +132236 -1.000000 +132237 -1.000000 +132238 -1.000000 +132239 -1.000000 +132240 -1.000000 +132242 -1.000000 +132243 -1.000000 +132244 -1.000000 +132245 -1.000000 +132246 -1.000000 +132247 -1.000000 +132248 -1.000000 +132249 -1.000000 +132250 -1.000000 +132251 -1.000000 +132252 -1.000000 +132253 -1.000000 +132255 -1.000000 +132256 -1.000000 +132257 -1.000000 +132258 -1.000000 +132259 -1.000000 +132260 -1.000000 +132261 -1.000000 +132262 -1.000000 +132263 -1.000000 +132264 -1.000000 +132265 -1.000000 +132266 -1.000000 +132267 -1.000000 +132268 -1.000000 +132269 -1.000000 +132270 -1.000000 +132271 -1.000000 +132272 -1.000000 +132273 -1.000000 +132276 -1.000000 +132279 -1.000000 +132280 -1.000000 +132281 -1.000000 +132282 -1.000000 +132284 -1.000000 +132285 -1.000000 +132286 -1.000000 +132287 -1.000000 +132288 -1.000000 +132290 -1.000000 +132292 -1.000000 +132293 -1.000000 +132294 -1.000000 +132295 -1.000000 +132296 -1.000000 +132297 -1.000000 +132299 -1.000000 +132300 -1.000000 +132301 -1.000000 +132302 -1.000000 +132303 -1.000000 +132304 -1.000000 +132305 -1.000000 +132306 -1.000000 +132311 -1.000000 +132312 -1.000000 +132313 -1.000000 +132315 -1.000000 +132317 -1.000000 +132318 -1.000000 +132319 -1.000000 +132320 -1.000000 +132321 -1.000000 +132336 -1.000000 +132338 -1.000000 +132340 -1.000000 +132341 -1.000000 +132343 -1.000000 +132344 -1.000000 +132345 -1.000000 +132346 -1.000000 +132348 -1.000000 +132349 -1.000000 +132350 -1.000000 +132352 -1.000000 +132354 -1.000000 +132355 -1.000000 +132356 -1.000000 +132357 -1.000000 +132358 -1.000000 +132359 -1.000000 +132360 -1.000000 +132362 -1.000000 +132363 -1.000000 +132364 -1.000000 +132367 -1.000000 +132368 -1.000000 +132370 -1.000000 +132371 -1.000000 +132373 -1.000000 +132374 -1.000000 +132377 -1.000000 +132380 -1.000000 +132381 -1.000000 +132382 -1.000000 +132384 -1.000000 +132391 -1.000000 +132392 -1.000000 +132394 -1.000000 +132398 -1.000000 +132399 -1.000000 +132400 -1.000000 +132401 -1.000000 +132402 -1.000000 +132403 -1.000000 +132406 -1.000000 +132407 -1.000000 +132411 -1.000000 +132414 -1.000000 +132415 -1.000000 +132416 -1.000000 +132417 -1.000000 +132418 -1.000000 +132419 -1.000000 +132420 -1.000000 +132423 -1.000000 +132424 -1.000000 +132425 -1.000000 +132426 -1.000000 +132427 -1.000000 +132428 -1.000000 +132429 -1.000000 +132430 -1.000000 +132431 -1.000000 +132432 -1.000000 +132433 -1.000000 +132435 -1.000000 +132436 -1.000000 +132438 -1.000000 +132439 -1.000000 +132440 -1.000000 +132441 -1.000000 +132443 -1.000000 +132444 -1.000000 +132445 -1.000000 +132446 -1.000000 +132447 -1.000000 +132448 -1.000000 +132449 -1.000000 +132450 -1.000000 +132451 -1.000000 +132452 -1.000000 +132453 -1.000000 +132455 -1.000000 +132456 -1.000000 +132457 -1.000000 +132459 -1.000000 +132461 -1.000000 +132465 -1.000000 +132467 -1.000000 +132468 -1.000000 +132471 -1.000000 +132478 -1.000000 +132481 -1.000000 +132482 -1.000000 +132483 -1.000000 +132484 -1.000000 +132485 -1.000000 +132486 -1.000000 +132487 -1.000000 +132489 -1.000000 +132493 -1.000000 +132494 -1.000000 +132503 -1.000000 +132504 -1.000000 +132505 -1.000000 +132506 -1.000000 +132507 -1.000000 +132508 -1.000000 +132509 -1.000000 +132511 -1.000000 +132512 -1.000000 +132513 -1.000000 +132514 -1.000000 +132516 -1.000000 +132517 -1.000000 +132518 -1.000000 +132519 -1.000000 +132520 -1.000000 +132521 -1.000000 +132522 -1.000000 +132527 -1.000000 +132528 -1.000000 +132530 -1.000000 +132532 -1.000000 +132533 -1.000000 +132534 -1.000000 +132535 -1.000000 +132536 -1.000000 +132537 -1.000000 +132538 -1.000000 +132542 -1.000000 +132543 -1.000000 +132544 -1.000000 +132545 -1.000000 +132546 -1.000000 +132547 -1.000000 +132548 -1.000000 +132549 -1.000000 +132550 -1.000000 +132551 -1.000000 +132552 -1.000000 +132553 -1.000000 +132554 -1.000000 +132557 -1.000000 +132558 -1.000000 +132575 -1.000000 +132580 -1.000000 +132590 -1.000000 +132592 -1.000000 +132593 -1.000000 +132594 -1.000000 +132595 -1.000000 +132596 -1.000000 +132597 -1.000000 +132598 -1.000000 +132599 -1.000000 +132600 -1.000000 +132601 -1.000000 +132602 -1.000000 +132603 -1.000000 +132604 -1.000000 +132605 -1.000000 +132606 -1.000000 +132607 -1.000000 +132609 -1.000000 +132610 -1.000000 +132611 -1.000000 +132612 -1.000000 +132613 -1.000000 +132614 -1.000000 +132615 -1.000000 +132625 -1.000000 +132626 -1.000000 +132633 -1.000000 +132634 -1.000000 +132645 -1.000000 +132646 -1.000000 +132647 -1.000000 +132650 -1.000000 +132651 -1.000000 +132652 -1.000000 +132653 -1.000000 +132654 -1.000000 +132655 -1.000000 +132658 -1.000000 +132659 -1.000000 +132669 -1.000000 +132672 -1.000000 +132673 -1.000000 +132674 -1.000000 +132676 -1.000000 +132678 -1.000000 +132679 -1.000000 +132681 -1.000000 +132683 -1.000000 +132684 -1.000000 +132685 -1.000000 +132686 -1.000000 +132687 -1.000000 +132688 -1.000000 +132689 -1.000000 +132690 -1.000000 +132691 -1.000000 +132692 -1.000000 +132693 -1.000000 +132695 -1.000000 +132696 -1.000000 +132697 -1.000000 +132699 -1.000000 +132700 -1.000000 +132701 -1.000000 +132702 -1.000000 +132703 -1.000000 +132704 -1.000000 +132705 -1.000000 +132707 -1.000000 +132708 -1.000000 +132709 -1.000000 +132710 -1.000000 +132711 -1.000000 +132712 -1.000000 +132713 -1.000000 +132714 -1.000000 +132715 -1.000000 +132716 -1.000000 +132717 -1.000000 +132718 -1.000000 +132719 -1.000000 +132722 -1.000000 +132737 -1.000000 +132738 -1.000000 +132740 -1.000000 +132746 -1.000000 +132747 -1.000000 +132748 -1.000000 +132752 -1.000000 +132753 -1.000000 +132754 -1.000000 +132756 -1.000000 +132758 -1.000000 +132760 -1.000000 +132761 -1.000000 +132763 -1.000000 +132764 -1.000000 +132765 -1.000000 +132766 -1.000000 +132779 -1.000000 +132782 -1.000000 +132783 -1.000000 +132784 -1.000000 +132785 -1.000000 +132786 -1.000000 +132789 -1.000000 +132791 -1.000000 +132794 -1.000000 +132796 -1.000000 +132797 -1.000000 +132798 -1.000000 +132799 -1.000000 +132800 -1.000000 +132801 -1.000000 +132802 -1.000000 +132803 -1.000000 +132804 -1.000000 +132805 -1.000000 +132816 -1.000000 +132848 -1.000000 +132850 -1.000000 +132851 -1.000000 +132873 -1.000000 +132881 -1.000000 +132884 -1.000000 +132886 -1.000000 +132887 -1.000000 +132889 -1.000000 +132904 -1.000000 +132907 -1.000000 +132908 -1.000000 +132910 -1.000000 +132917 -1.000000 +132926 -1.000000 +132927 -1.000000 +132932 -1.000000 +132933 -1.000000 +132934 -1.000000 +132935 -1.000000 +132936 -1.000000 +132937 -1.000000 +132938 -1.000000 +132939 -1.000000 +132940 -1.000000 +132941 -1.000000 +132942 -1.000000 +132943 -1.000000 +132944 -1.000000 +132945 -1.000000 +132946 -1.000000 +132947 -1.000000 +132948 -1.000000 +132949 -1.000000 +132950 -1.000000 +132951 -1.000000 +132952 -1.000000 +132953 -1.000000 +132954 -1.000000 +132955 -1.000000 +132956 -1.000000 +132957 -1.000000 +132958 -1.000000 +132960 -1.000000 +132961 -1.000000 +132966 -1.000000 +132967 -1.000000 +132968 -1.000000 +132969 -1.000000 +132970 -1.000000 +132971 -1.000000 +132972 -1.000000 +132973 -1.000000 +132974 -1.000000 +132976 -1.000000 +132977 -1.000000 +132978 -1.000000 +132979 -1.000000 +132980 -1.000000 +132981 -1.000000 +132982 -1.000000 +132983 -1.000000 +132984 -1.000000 +132985 -1.000000 +132986 -1.000000 +132987 -1.000000 +132988 -1.000000 +132989 -1.000000 +132990 -1.000000 +132991 -1.000000 +132992 -1.000000 +132993 -1.000000 +132994 -1.000000 +132995 -1.000000 +132998 -1.000000 +133016 -1.000000 +133029 -1.000000 +133033 -1.000000 +133034 -1.000000 +133039 -1.000000 +133047 -1.000000 +133051 -1.000000 +133052 -1.000000 +133055 -1.000000 +133063 -1.000000 +133074 -1.000000 +133075 -1.000000 +133076 -1.000000 +133078 -1.000000 +133079 -1.000000 +133080 -1.000000 +133081 -1.000000 +133082 -1.000000 +133083 -1.000000 +133086 -1.000000 +133088 -1.000000 +133089 -1.000000 +133090 -1.000000 +133091 -1.000000 +133092 -1.000000 +133093 -1.000000 +133094 -1.000000 +133095 -1.000000 +133096 -1.000000 +133097 -1.000000 +133098 -1.000000 +133100 -1.000000 +133101 -1.000000 +133102 -1.000000 +133103 -1.000000 +133110 -1.000000 +133118 -1.000000 +133119 -1.000000 +133120 -1.000000 +133121 -1.000000 +133125 -1.000000 +133126 -1.000000 +133127 -1.000000 +133135 -1.000000 +133136 -1.000000 +133145 -1.000000 +133146 -1.000000 +133149 -1.000000 +133162 -1.000000 +133165 -1.000000 +133167 -1.000000 +133168 -1.000000 +133169 -1.000000 +133170 -1.000000 +133171 -1.000000 +133172 -1.000000 +133173 -1.000000 +133174 -1.000000 +133175 -1.000000 +133176 -1.000000 +133178 -1.000000 +133180 -1.000000 +133181 -1.000000 +133182 -1.000000 +133183 -1.000000 +133184 -1.000000 +133185 -1.000000 +133186 -1.000000 +133187 -1.000000 +133188 -1.000000 +133189 -1.000000 +133190 -1.000000 +133191 -1.000000 +133192 -1.000000 +133193 -1.000000 +133194 -1.000000 +133197 -1.000000 +133198 -1.000000 +133201 -1.000000 +133202 -1.000000 +133203 -1.000000 +133204 -1.000000 +133206 -1.000000 +133207 -1.000000 +133208 -1.000000 +133210 -1.000000 +133211 -1.000000 +133212 -1.000000 +133213 -1.000000 +133214 -1.000000 +133215 -1.000000 +133216 -1.000000 +133217 -1.000000 +133218 -1.000000 +133219 -1.000000 +133220 -1.000000 +133221 -1.000000 +133222 -1.000000 +133223 -1.000000 +133225 -1.000000 +133227 -1.000000 +133229 -1.000000 +133230 -1.000000 +133236 -1.000000 +133241 -1.000000 +133245 -1.000000 +133247 -1.000000 +133250 -1.000000 +133251 -1.000000 +133252 -1.000000 +133253 -1.000000 +133256 -1.000000 +133257 -1.000000 +133258 -1.000000 +133270 -1.000000 +133271 -1.000000 +133272 -1.000000 +133273 -1.000000 +133277 -1.000000 +133278 -1.000000 +133279 -1.000000 +133280 -1.000000 +133281 -1.000000 +133282 -1.000000 +133283 -1.000000 +133284 -1.000000 +133285 -1.000000 +133286 -1.000000 +133287 -1.000000 +133288 -1.000000 +133289 -1.000000 +133290 -1.000000 +133291 -1.000000 +133296 -1.000000 +133302 -1.000000 +133305 -1.000000 +133306 -1.000000 +133307 -1.000000 +133310 -1.000000 +133311 -1.000000 +133312 -1.000000 +133314 -1.000000 +133315 -1.000000 +133316 -1.000000 +133317 -1.000000 +133318 -1.000000 +133319 -1.000000 +133320 -1.000000 +133321 -1.000000 +133326 -1.000000 +133327 -1.000000 +133328 -1.000000 +133329 -1.000000 +133332 -1.000000 +133334 -1.000000 +133335 -1.000000 +133336 -1.000000 +133338 -1.000000 +133339 -1.000000 +133340 -1.000000 +133341 -1.000000 +133342 -1.000000 +133343 -1.000000 +133344 -1.000000 +133345 -1.000000 +133351 -1.000000 +133352 -1.000000 +133353 -1.000000 +133354 -1.000000 +133355 -1.000000 +133357 -1.000000 +133358 -1.000000 +133359 -1.000000 +133360 -1.000000 +133361 -1.000000 +133362 -1.000000 +133363 -1.000000 +133365 -1.000000 +133366 -1.000000 +133367 -1.000000 +133369 -1.000000 +133374 -1.000000 +133380 -1.000000 +133381 -1.000000 +133382 -1.000000 +133385 -1.000000 +133395 -1.000000 +133396 -1.000000 +133399 -1.000000 +133416 -1.000000 +133417 -1.000000 +133418 -1.000000 +133419 -1.000000 +133421 -1.000000 +133422 -1.000000 +133423 -1.000000 +133424 -1.000000 +133425 -1.000000 +133426 -1.000000 +133427 -1.000000 +133429 -1.000000 +133430 -1.000000 +133440 -1.000000 +133443 -1.000000 +133452 -1.000000 +133454 -1.000000 +133466 -1.000000 +133470 -1.000000 +133476 -1.000000 +133480 -1.000000 +133481 -1.000000 +133482 -1.000000 +133483 -1.000000 +133487 -1.000000 +133489 -1.000000 +133490 -1.000000 +133491 -1.000000 +133498 -1.000000 +133499 -1.000000 +133501 -1.000000 +133502 -1.000000 +133503 -1.000000 +133504 -1.000000 +133505 -1.000000 +133506 -1.000000 +133507 -1.000000 +133508 -1.000000 +133520 -1.000000 +133527 -1.000000 +133528 -1.000000 +133529 -1.000000 +133530 -1.000000 +133531 -1.000000 +133532 -1.000000 +133533 -1.000000 +133534 -1.000000 +133536 -1.000000 +133537 -1.000000 +133538 -1.000000 +133541 -1.000000 +133542 -1.000000 +133543 -1.000000 +133544 -1.000000 +133545 -1.000000 +133547 -1.000000 +133548 -1.000000 +133549 -1.000000 +133550 -1.000000 +133552 -1.000000 +133554 -1.000000 +133556 -1.000000 +133558 -1.000000 +133561 -1.000000 +133563 -1.000000 +133566 -1.000000 +133567 -1.000000 +133568 -1.000000 +133569 -1.000000 +133570 -1.000000 +133571 -1.000000 +133572 -1.000000 +133585 -1.000000 +133588 -1.000000 +133590 -1.000000 +133591 -1.000000 +133592 -1.000000 +133596 -1.000000 +133597 -1.000000 +133598 -1.000000 +133599 -1.000000 +133600 -1.000000 +133601 -1.000000 +133602 -1.000000 +133603 -1.000000 +133604 -1.000000 +133606 -1.000000 +133607 -1.000000 +133608 -1.000000 +133609 -1.000000 +133610 -1.000000 +133612 -1.000000 +133613 -1.000000 +133614 -1.000000 +133615 -1.000000 +133617 -1.000000 +133618 -1.000000 +133619 -1.000000 +133620 -1.000000 +133621 -1.000000 +133622 -1.000000 +133623 -1.000000 +133624 -1.000000 +133625 -1.000000 +133626 -1.000000 +133640 -1.000000 +133643 -1.000000 +133646 -1.000000 +133656 -1.000000 +133660 -1.000000 +133664 -1.000000 +133665 -1.000000 +133666 -1.000000 +133667 -1.000000 +133668 -1.000000 +133669 -1.000000 +133670 -1.000000 +133671 -1.000000 +133672 -1.000000 +133673 -1.000000 +133674 -1.000000 +133675 -1.000000 +133676 -1.000000 +133677 -1.000000 +133678 -1.000000 +133679 -1.000000 +133680 -1.000000 +133681 -1.000000 +133682 -1.000000 +133683 -1.000000 +133684 -1.000000 +133685 -1.000000 +133686 -1.000000 +133687 -1.000000 +133688 -1.000000 +133689 -1.000000 +133690 -1.000000 +133691 -1.000000 +133692 -1.000000 +133693 -1.000000 +133694 -1.000000 +133695 -1.000000 +133696 -1.000000 +133699 -1.000000 +133700 -1.000000 +133701 -1.000000 +133702 -1.000000 +133705 -1.000000 +133706 -1.000000 +133707 -1.000000 +133710 -1.000000 +133714 -1.000000 +133721 -1.000000 +133722 -1.000000 +133723 -1.000000 +133724 -1.000000 +133725 -1.000000 +133726 -1.000000 +133727 -1.000000 +133728 -1.000000 +133729 -1.000000 +133730 -1.000000 +133731 -1.000000 +133733 -1.000000 +133735 -1.000000 +133737 -1.000000 +133738 -1.000000 +133740 -1.000000 +133741 -1.000000 +133742 -1.000000 +133747 -1.000000 +133748 -1.000000 +133749 -1.000000 +133750 -1.000000 +133751 -1.000000 +133752 -1.000000 +133753 -1.000000 +133754 -1.000000 +133755 -1.000000 +133757 -1.000000 +133764 -1.000000 +133765 -1.000000 +133766 -1.000000 +133767 -1.000000 +133769 -1.000000 +133770 -1.000000 +133771 -1.000000 +133772 -1.000000 +133773 -1.000000 +133774 -1.000000 +133775 -1.000000 +133776 -1.000000 +133778 -1.000000 +133779 -1.000000 +133781 -1.000000 +133785 -1.000000 +133786 -1.000000 +133790 -1.000000 +133793 -1.000000 +133796 -1.000000 +133797 -1.000000 +133798 -1.000000 +133799 -1.000000 +133800 -1.000000 +133801 -1.000000 +133802 -1.000000 +133803 -1.000000 +133804 -1.000000 +133805 -1.000000 +133806 -1.000000 +133807 -1.000000 +133808 -1.000000 +133809 -1.000000 +133810 -1.000000 +133811 -1.000000 +133813 -1.000000 +133816 -1.000000 +133822 -1.000000 +133829 -1.000000 +133830 -1.000000 +133832 -1.000000 +133833 -1.000000 +133834 -1.000000 +133836 -1.000000 +133838 -1.000000 +133839 -1.000000 +133840 -1.000000 +133841 -1.000000 +133843 -1.000000 +133844 -1.000000 +133845 -1.000000 +133846 -1.000000 +133847 -1.000000 +133848 -1.000000 +133849 -1.000000 +133850 -1.000000 +133852 -1.000000 +133858 -1.000000 +133861 -1.000000 +133862 -1.000000 +133863 -1.000000 +133866 -1.000000 +133868 -1.000000 +133870 -1.000000 +133871 -1.000000 +133872 -1.000000 +133873 -1.000000 +133874 -1.000000 +133875 -1.000000 +133877 -1.000000 +133879 -1.000000 +133880 -1.000000 +133881 -1.000000 +133882 -1.000000 +133883 -1.000000 +133884 -1.000000 +133888 -1.000000 +133889 -1.000000 +133891 -1.000000 +133892 -1.000000 +133894 -1.000000 +133895 -1.000000 +133896 -1.000000 +133897 -1.000000 +133898 -1.000000 +133900 -1.000000 +133901 -1.000000 +133903 -1.000000 +133904 -1.000000 +133905 -1.000000 +133907 -1.000000 +133908 -1.000000 +133910 -1.000000 +133923 -1.000000 +133924 -1.000000 +133926 -1.000000 +133931 -1.000000 +133932 -1.000000 +133933 -1.000000 +133934 -1.000000 +133935 -1.000000 +133936 -1.000000 +133937 -1.000000 +133939 -1.000000 +133940 -1.000000 +133942 -1.000000 +133943 -1.000000 +133944 -1.000000 +133948 -1.000000 +133949 -1.000000 +133950 -1.000000 +133953 -1.000000 +133954 -1.000000 +133956 -1.000000 +133957 -1.000000 +133958 -1.000000 +133960 -1.000000 +133961 -1.000000 +133962 -1.000000 +133963 -1.000000 +133964 -1.000000 +133965 -1.000000 +133966 -1.000000 +133967 -1.000000 +133968 -1.000000 +133969 -1.000000 +133970 -1.000000 +133971 -1.000000 +133972 -1.000000 +133973 -1.000000 +133980 -1.000000 +133981 -1.000000 +133982 -1.000000 +133985 -1.000000 +133987 -1.000000 +133988 -1.000000 +133990 -1.000000 +133992 -1.000000 +133996 -1.000000 +134000 -1.000000 +134002 -1.000000 +134003 -1.000000 +134004 -1.000000 +134005 -1.000000 +134007 -1.000000 +134008 -1.000000 +134009 -1.000000 +134011 -1.000000 +134012 -1.000000 +134013 -1.000000 +134015 -1.000000 +134016 -1.000000 +134018 -1.000000 +134019 -1.000000 +134020 -1.000000 +134021 -1.000000 +134024 -1.000000 +134025 -1.000000 +134026 -1.000000 +134027 -1.000000 +134028 -1.000000 +134029 -1.000000 +134030 -1.000000 +134043 -1.000000 +134045 -1.000000 +134046 -1.000000 +134047 -1.000000 +134048 -1.000000 +134049 -1.000000 +134050 -1.000000 +134051 -1.000000 +134052 -1.000000 +134053 -1.000000 +134055 -1.000000 +134057 -1.000000 +134058 -1.000000 +134059 -1.000000 +134060 -1.000000 +134062 -1.000000 +134063 -1.000000 +134064 -1.000000 +134066 -1.000000 +134069 -1.000000 +134070 -1.000000 +134071 -1.000000 +134072 -1.000000 +134073 -1.000000 +134074 -1.000000 +134076 -1.000000 +134077 -1.000000 +134078 -1.000000 +134079 -1.000000 +134080 -1.000000 +134081 -1.000000 +134082 -1.000000 +134083 -1.000000 +134085 -1.000000 +134087 -1.000000 +134090 -1.000000 +134091 -1.000000 +134094 -1.000000 +134095 -1.000000 +134097 -1.000000 +134098 -1.000000 +134099 -1.000000 +134100 -1.000000 +134101 -1.000000 +134102 -1.000000 +134105 -1.000000 +134106 -1.000000 +134107 -1.000000 +134108 -1.000000 +134109 -1.000000 +134110 -1.000000 +134111 -1.000000 +134112 -1.000000 +134113 -1.000000 +134114 -1.000000 +134115 -1.000000 +134116 -1.000000 +134117 -1.000000 +134118 -1.000000 +134119 -1.000000 +134122 -1.000000 +134123 -1.000000 +134124 -1.000000 +134129 -1.000000 +134131 -1.000000 +134132 -1.000000 +134133 -1.000000 +134134 -1.000000 +134135 -1.000000 +134137 -1.000000 +134138 -1.000000 +134145 -1.000000 +134146 -1.000000 +134147 -1.000000 +134148 -1.000000 +134149 -1.000000 +134150 -1.000000 +134151 -1.000000 +134152 -1.000000 +134153 -1.000000 +134155 -1.000000 +134156 -1.000000 +134157 -1.000000 +134169 -1.000000 +134170 -1.000000 +134171 -1.000000 +134172 -1.000000 +134173 -1.000000 +134174 -1.000000 +134175 -1.000000 +134176 -1.000000 +134178 -1.000000 +134179 -1.000000 +134180 -1.000000 +134181 -1.000000 +134182 -1.000000 +134183 -1.000000 +134185 -1.000000 +134186 -1.000000 +134188 -1.000000 +134189 -1.000000 +134196 -1.000000 +134197 -1.000000 +134198 -1.000000 +134199 -1.000000 +134200 -1.000000 +134201 -1.000000 +134202 -1.000000 +134208 -1.000000 +134209 -1.000000 +134210 -1.000000 +134211 -1.000000 +134212 -1.000000 +134213 -1.000000 +134215 -1.000000 +134216 -1.000000 +134217 -1.000000 +134218 -1.000000 +134219 -1.000000 +134220 -1.000000 +134221 -1.000000 +134222 -1.000000 +134223 -1.000000 +134224 -1.000000 +134225 -1.000000 +134226 -1.000000 +134227 -1.000000 +134228 -1.000000 +134229 -1.000000 +134230 -1.000000 +134231 -1.000000 +134232 -1.000000 +134233 -1.000000 +134234 -1.000000 +134235 -1.000000 +134236 -1.000000 +134237 -1.000000 +134238 -1.000000 +134239 -1.000000 +134241 -1.000000 +134242 -1.000000 +134243 -1.000000 +134244 -1.000000 +134245 -1.000000 +134246 -1.000000 +134247 -1.000000 +134248 -1.000000 +134249 -1.000000 +134250 -1.000000 +134251 -1.000000 +134252 -1.000000 +134253 -1.000000 +134254 -1.000000 +134255 -1.000000 +134256 -1.000000 +134257 -1.000000 +134258 -1.000000 +134259 -1.000000 +134260 -1.000000 +134261 -1.000000 +134262 -1.000000 +134263 -1.000000 +134264 -1.000000 +134265 -1.000000 +134266 -1.000000 +134267 -1.000000 +134268 -1.000000 +134269 -1.000000 +134270 -1.000000 +134271 -1.000000 +134272 -1.000000 +134273 -1.000000 +134274 -1.000000 +134275 -1.000000 +134277 -1.000000 +134278 -1.000000 +134279 -1.000000 +134280 -1.000000 +134281 -1.000000 +134284 -1.000000 +134287 -1.000000 +134289 -1.000000 +134312 -1.000000 +134313 -1.000000 +134314 -1.000000 +134315 -1.000000 +134316 -1.000000 +134317 -1.000000 +134318 -1.000000 +134319 -1.000000 +134345 -1.000000 +134347 -1.000000 +134348 -1.000000 +134349 -1.000000 +134350 -1.000000 +134351 -1.000000 +134352 -1.000000 +134353 -1.000000 +134354 -1.000000 +134355 -1.000000 +134356 -1.000000 +134357 -1.000000 +134358 -1.000000 +134359 -1.000000 +134360 -1.000000 +134361 -1.000000 +134362 -1.000000 +134363 -1.000000 +134364 -1.000000 +134365 -1.000000 +134366 -1.000000 +134367 -1.000000 +134368 -1.000000 +134369 -1.000000 +134371 -1.000000 +134372 -1.000000 +134373 -1.000000 +134375 -1.000000 +134377 -1.000000 +134378 -1.000000 +134379 -1.000000 +134380 -1.000000 +134381 -1.000000 +134382 -1.000000 +134385 -1.000000 +134386 -1.000000 +134387 -1.000000 +134388 -1.000000 +134389 -1.000000 +134390 -1.000000 +134391 -1.000000 +134393 -1.000000 +134394 -1.000000 +134395 -1.000000 +134396 -1.000000 +134397 -1.000000 +134398 -1.000000 +134399 -1.000000 +134400 -1.000000 +134401 -1.000000 +134402 -1.000000 +134403 -1.000000 +134404 -1.000000 +134405 -1.000000 +134406 -1.000000 +134407 -1.000000 +134408 -1.000000 +134409 -1.000000 +134410 -1.000000 +134411 -1.000000 +134412 -1.000000 +134416 -1.000000 +134417 -1.000000 +134418 -1.000000 +134428 -1.000000 +134432 -1.000000 +134433 -1.000000 +134434 -1.000000 +134436 -1.000000 +134437 -1.000000 +134438 -1.000000 +134439 -1.000000 +134440 -1.000000 +134441 -1.000000 +134442 -1.000000 +134443 -1.000000 +134444 -1.000000 +134445 -1.000000 +134446 -1.000000 +134448 -1.000000 +134452 -1.000000 +134453 -1.000000 +134454 -1.000000 +134455 -1.000000 +134456 -1.000000 +134457 -1.000000 +134462 -1.000000 +134463 -1.000000 +134468 -1.000000 +134469 -1.000000 +134470 -1.000000 +134471 -1.000000 +134472 -1.000000 +134473 -1.000000 +134474 -1.000000 +134475 -1.000000 +134476 -1.000000 +134477 -1.000000 +134478 -1.000000 +134480 -1.000000 +134481 -1.000000 +134482 -1.000000 +134483 -1.000000 +134484 -1.000000 +134485 -1.000000 +134486 -1.000000 +134487 -1.000000 +134488 -1.000000 +134489 -1.000000 +134490 -1.000000 +134491 -1.000000 +134492 -1.000000 +134495 -1.000000 +134497 -1.000000 +134498 -1.000000 +134500 -1.000000 +134501 -1.000000 +134502 -1.000000 +134503 -1.000000 +134505 -1.000000 +134506 -1.000000 +134507 -1.000000 +134508 -1.000000 +134509 -1.000000 +134510 -1.000000 +134511 -1.000000 +134513 -1.000000 +134514 -1.000000 +134515 -1.000000 +134516 -1.000000 +134517 -1.000000 +134518 -1.000000 +134519 -1.000000 +134520 -1.000000 +134521 -1.000000 +134522 -1.000000 +134523 -1.000000 +134524 -1.000000 +134526 -1.000000 +134527 -1.000000 +134528 -1.000000 +134530 -1.000000 +134531 -1.000000 +134533 -1.000000 +134534 -1.000000 +134535 -1.000000 +134536 -1.000000 +134537 -1.000000 +134538 -1.000000 +134539 -1.000000 +134540 -1.000000 +134541 -1.000000 +134543 -1.000000 +134545 -1.000000 +134546 -1.000000 +134551 -1.000000 +134552 -1.000000 +134557 -1.000000 +134560 -1.000000 +134561 -1.000000 +134562 -1.000000 +134563 -1.000000 +134564 -1.000000 +134565 -1.000000 +134566 -1.000000 +134567 -1.000000 +134568 -1.000000 +134569 -1.000000 +134570 -1.000000 +134571 -1.000000 +134572 -1.000000 +134574 -1.000000 +134575 -1.000000 +134576 -1.000000 +134577 -1.000000 +134578 -1.000000 +134579 -1.000000 +134580 -1.000000 +134581 -1.000000 +134582 -1.000000 +134583 -1.000000 +134584 -1.000000 +134585 -1.000000 +134586 -1.000000 +134587 -1.000000 +134588 -1.000000 +134589 -1.000000 +134590 -1.000000 +134591 -1.000000 +134592 -1.000000 +134593 -1.000000 +134594 -1.000000 +134595 -1.000000 +134596 -1.000000 +134597 -1.000000 +134640 -1.000000 +134641 -1.000000 +134652 -1.000000 +135123 -1.000000 +135124 -1.000000 +135125 -1.000000 +135126 -1.000000 +135127 -1.000000 +135128 -1.000000 +135129 -1.000000 +135130 -1.000000 +135131 -1.000000 +135132 -1.000000 +135133 -1.000000 +135134 -1.000000 +135135 -1.000000 +135136 -1.000000 +135137 -1.000000 +135138 -1.000000 +135139 -1.000000 +135140 -1.000000 +135141 -1.000000 +135142 -1.000000 +135143 -1.000000 +135144 -1.000000 +135145 -1.000000 +135146 -1.000000 +135147 -1.000000 +135155 -1.000000 +135156 -1.000000 +135157 -1.000000 +135158 -1.000000 +135159 -1.000000 +135160 -1.000000 +135161 -1.000000 +135162 -1.000000 +135163 -1.000000 +135164 -1.000000 +135165 -1.000000 +135166 -1.000000 +135167 -1.000000 +135168 -1.000000 +135169 -1.000000 +135170 -1.000000 +135171 -1.000000 +135173 -1.000000 +135174 -1.000000 +135175 -1.000000 +135176 -1.000000 +135177 -1.000000 +135178 -1.000000 +135179 -1.000000 +135183 -1.000000 +135184 -1.000000 +135186 -1.000000 +135187 -1.000000 +135188 -1.000000 +135189 -1.000000 +135190 -1.000000 +135191 -1.000000 +135194 -1.000000 +135195 -1.000000 +135196 -1.000000 +135197 -1.000000 +135198 -1.000000 +135199 -1.000000 +135205 -1.000000 +135209 -1.000000 +135210 -1.000000 +135211 -1.000000 +135212 -1.000000 +135213 -1.000000 +135214 -1.000000 +135215 -1.000000 +135216 -1.000000 +135220 -1.000000 +135222 -1.000000 +135225 -1.000000 +135226 -1.000000 +135227 -1.000000 +135228 -1.000000 +135229 -1.000000 +135230 -1.000000 +135232 -1.000000 +135233 -1.000000 +135234 -1.000000 +135235 -1.000000 +135237 -1.000000 +135240 -1.000000 +135241 -1.000000 +135242 -1.000000 +135243 -1.000000 +135244 -1.000000 +135245 -1.000000 +135246 -1.000000 +135247 -1.000000 +135248 -1.000000 +135249 -1.000000 +135250 -1.000000 +135251 -1.000000 +135252 -1.000000 +135253 -1.000000 +135258 -1.000000 +135259 -1.000000 +135260 -1.000000 +135261 -1.000000 +135263 -1.000000 +135264 -1.000000 +135266 -1.000000 +135267 -1.000000 +135270 -1.000000 +135271 -1.000000 +135272 -1.000000 +135274 -1.000000 +135277 -1.000000 +135283 -1.000000 +135285 -1.000000 +135286 -1.000000 +135287 -1.000000 +135288 -1.000000 +135289 -1.000000 +135290 -1.000000 +135291 -1.000000 +135292 -1.000000 +135293 -1.000000 +135294 -1.000000 +135295 -1.000000 +135296 -1.000000 +135297 -1.000000 +135298 -1.000000 +135299 -1.000000 +135300 -1.000000 +135301 -1.000000 +135304 -1.000000 +135305 -1.000000 +135306 -1.000000 +135308 -1.000000 +135311 -1.000000 +135314 -1.000000 +135315 -1.000000 +135317 -1.000000 +135321 -1.000000 +135322 -1.000000 +135324 -1.000000 +135325 -1.000000 +135328 -1.000000 +135329 -1.000000 +135331 -1.000000 +135332 -1.000000 +135335 -1.000000 +135336 -1.000000 +135337 -1.000000 +135338 -1.000000 +135339 -1.000000 +135340 -1.000000 +135345 -1.000000 +135354 -1.000000 +135357 -1.000000 +135359 -1.000000 +135371 -1.000000 +135373 -1.000000 +135374 -1.000000 +135379 -1.000000 +135390 -1.000000 +135396 -1.000000 +135399 -1.000000 +135405 -1.000000 +135406 -1.000000 +135407 -1.000000 +135408 -1.000000 +135410 -1.000000 +135412 -1.000000 +135413 -1.000000 +135416 -1.000000 +135417 -1.000000 +135418 -1.000000 +135419 -1.000000 +135420 -1.000000 +135421 -1.000000 +135422 -1.000000 +135423 -1.000000 +135424 -1.000000 +135425 -1.000000 +135426 -1.000000 +135427 -1.000000 +135429 -1.000000 +135434 -1.000000 +135435 -1.000000 +135437 -1.000000 +135442 -1.000000 +135443 -1.000000 +135444 -1.000000 +135445 -1.000000 +135446 -1.000000 +135447 -1.000000 +135448 -1.000000 +135449 -1.000000 +135450 -1.000000 +135459 -1.000000 +135467 -1.000000 +135470 -1.000000 +135471 -1.000000 +135472 -1.000000 +135473 -1.000000 +135474 -1.000000 +135475 -1.000000 +135476 -1.000000 +135477 -1.000000 +135479 -1.000000 +135480 -1.000000 +135481 -1.000000 +135482 -1.000000 +135483 -1.000000 +135484 -1.000000 +135485 -1.000000 +135486 -1.000000 +135487 -1.000000 +135489 -1.000000 +135490 -1.000000 +135491 -1.000000 +135492 -1.000000 +135493 -1.000000 +135494 -1.000000 +135495 -1.000000 +135510 -1.000000 +135511 -1.000000 +135516 -1.000000 +135518 -1.000000 +135519 -1.000000 +135521 -1.000000 +135522 -1.000000 +135524 -1.000000 +135525 -1.000000 +135526 -1.000000 +135529 -1.000000 +135534 -1.000000 +135540 -1.000000 +135543 -1.000000 +135553 -1.000000 +135554 -1.000000 +135556 -1.000000 +135557 -1.000000 +135558 -1.000000 +135560 -1.000000 +135561 -1.000000 +135562 -1.000000 +135563 -1.000000 +135564 -1.000000 +135568 -1.000000 +135571 -1.000000 +135572 -1.000000 +135578 -1.000000 +135592 -1.000000 +135593 -1.000000 +135594 -1.000000 +135595 -1.000000 +135596 -1.000000 +135597 -1.000000 +135598 -1.000000 +135601 -1.000000 +135603 -1.000000 +135605 -1.000000 +135608 -1.000000 +135610 -1.000000 +135614 -1.000000 +135616 -1.000000 +135617 -1.000000 +135643 -1.000000 +135648 -1.000000 +135649 -1.000000 +135650 -1.000000 +135652 -1.000000 +135653 -1.000000 +135654 -1.000000 +135686 -1.000000 +135687 -1.000000 +135688 -1.000000 +135689 -1.000000 +135691 -1.000000 +135692 -1.000000 +135693 -1.000000 +135694 -1.000000 +135695 -1.000000 +135696 -1.000000 +135697 -1.000000 +135698 -1.000000 +135699 -1.000000 +135700 -1.000000 +135701 -1.000000 +135702 -1.000000 +135703 -1.000000 +135704 -1.000000 +135705 -1.000000 +135706 -1.000000 +135714 -1.000000 +135715 -1.000000 +135716 -1.000000 +135717 -1.000000 +135718 -1.000000 +135719 -1.000000 +135720 -1.000000 +135722 -1.000000 +135725 -1.000000 +135726 -1.000000 +135727 -1.000000 +135728 -1.000000 +135729 -1.000000 +135730 -1.000000 +135731 -1.000000 +135733 -1.000000 +135737 -1.000000 +135739 -1.000000 +135740 -1.000000 +135741 -1.000000 +135743 -1.000000 +135746 -1.000000 +135747 -1.000000 +135751 -1.000000 +135752 -1.000000 +135753 -1.000000 +135756 -1.000000 +135758 -1.000000 +135759 -1.000000 +135760 -1.000000 +135761 -1.000000 +135762 -1.000000 +135763 -1.000000 +135764 -1.000000 +135765 -1.000000 +135767 -1.000000 +135768 -1.000000 +135769 -1.000000 +135770 -1.000000 +135771 -1.000000 +135774 -1.000000 +135777 -1.000000 +135778 -1.000000 +135779 -1.000000 +135780 -1.000000 +135782 -1.000000 +135786 -1.000000 +135804 -1.000000 +135806 -1.000000 +135807 -1.000000 +135808 -1.000000 +135809 -1.000000 +135810 -1.000000 +135811 -1.000000 +135812 -1.000000 +135813 -1.000000 +135816 -1.000000 +135817 -1.000000 +135818 -1.000000 +135822 -1.000000 +135823 -1.000000 +135832 -1.000000 +135833 -1.000000 +135834 -1.000000 +135835 -1.000000 +135836 -1.000000 +135837 -1.000000 +135838 -1.000000 +135839 -1.000000 +135840 -1.000000 +135841 -1.000000 +135842 -1.000000 +135855 -1.000000 +135858 -1.000000 +135859 -1.000000 +135860 -1.000000 +135862 -1.000000 +135863 -1.000000 +135864 -1.000000 +135865 -1.000000 +135867 -1.000000 +135870 -1.000000 +135879 -1.000000 +135885 -1.000000 +135891 -1.000000 +135892 -1.000000 +135893 -1.000000 +135896 -1.000000 +135897 -1.000000 +135898 -1.000000 +135900 -1.000000 +135901 -1.000000 +135902 -1.000000 +135904 -1.000000 +135905 -1.000000 +135907 -1.000000 +135908 -1.000000 +135912 -1.000000 +135915 -1.000000 +135921 -1.000000 +135925 -1.000000 +135930 -1.000000 +135931 -1.000000 +135932 -1.000000 +135933 -1.000000 +135934 -1.000000 +135935 -1.000000 +135936 -1.000000 +135937 -1.000000 +135960 -1.000000 +135987 -1.000000 +135991 -1.000000 +135992 -1.000000 +135993 -1.000000 +135994 -1.000000 +135998 -1.000000 +136000 -1.000000 +136002 -1.000000 +136003 -1.000000 +136004 -1.000000 +136005 -1.000000 +136006 -1.000000 +136007 -1.000000 +136008 -1.000000 +136010 -1.000000 +136011 -1.000000 +136013 -1.000000 +136018 -1.000000 +136020 -1.000000 +136034 -1.000000 +136035 -1.000000 +136045 -1.000000 +136046 -1.000000 +136048 -1.000000 +136049 -1.000000 +136050 -1.000000 +136051 -1.000000 +136052 -1.000000 +136053 -1.000000 +136054 -1.000000 +136056 -1.000000 +136057 -1.000000 +136059 -1.000000 +136061 -1.000000 +136062 -1.000000 +136068 -1.000000 +136069 -1.000000 +136070 -1.000000 +136071 -1.000000 +136072 -1.000000 +136073 -1.000000 +136076 -1.000000 +136077 -1.000000 +136078 -1.000000 +136079 -1.000000 +136080 -1.000000 +136081 -1.000000 +136082 -1.000000 +136084 -1.000000 +136085 -1.000000 +136087 -1.000000 +136088 -1.000000 +136089 -1.000000 +136091 -1.000000 +136092 -1.000000 +136093 -1.000000 +136100 -1.000000 +136101 -1.000000 +136105 -1.000000 +136106 -1.000000 +136107 -1.000000 +136119 -1.000000 +136122 -1.000000 +136126 -1.000000 +136128 -1.000000 +136134 -1.000000 +136137 -1.000000 +136138 -1.000000 +136139 -1.000000 +136140 -1.000000 +136141 -1.000000 +136155 -1.000000 +136156 -1.000000 +136161 -1.000000 +136171 -1.000000 +136175 -1.000000 +136176 -1.000000 +136177 -1.000000 +136179 -1.000000 +136184 -1.000000 +136186 -1.000000 +136187 -1.000000 +136188 -1.000000 +136189 -1.000000 +136190 -1.000000 +136192 -1.000000 +136193 -1.000000 +136194 -1.000000 +136195 -1.000000 +136196 -1.000000 +136197 -1.000000 +136198 -1.000000 +136199 -1.000000 +136200 -1.000000 +136201 -1.000000 +136202 -1.000000 +136203 -1.000000 +136204 -1.000000 +136205 -1.000000 +136206 -1.000000 +136207 -1.000000 +136208 -1.000000 +136209 -1.000000 +136210 -1.000000 +136211 -1.000000 +136212 -1.000000 +136213 -1.000000 +136214 -1.000000 +136216 -1.000000 +136222 -1.000000 +136224 -1.000000 +136248 -1.000000 +136249 -1.000000 +136250 -1.000000 +136280 -1.000000 +136288 -1.000000 +136298 -1.000000 +136299 -1.000000 +136300 -1.000000 +136301 -1.000000 +136302 -1.000000 +136303 -1.000000 +136305 -1.000000 +136306 -1.000000 +136307 -1.000000 +136312 -1.000000 +136313 -1.000000 +136314 -1.000000 +136315 -1.000000 +136316 -1.000000 +136318 -1.000000 +136320 -1.000000 +136321 -1.000000 +136322 -1.000000 +136323 -1.000000 +136326 -1.000000 +136327 -1.000000 +136334 -1.000000 +136338 -1.000000 +136343 -1.000000 +136345 -1.000000 +136448 -1.000000 +136452 -1.000000 +136455 -1.000000 +136459 -1.000000 +136461 -1.000000 +136475 -1.000000 +136476 -1.000000 +136490 -1.000000 +136491 -1.000000 +136508 -1.000000 +136510 -1.000000 +136511 -1.000000 +136512 -1.000000 +136513 -1.000000 +136514 -1.000000 +136515 -1.000000 +136516 -1.000000 +136517 -1.000000 +136518 -1.000000 +136519 -1.000000 +136520 -1.000000 +136521 -1.000000 +136522 -1.000000 +136523 -1.000000 +136524 -1.000000 +136525 -1.000000 +136526 -1.000000 +136528 -1.000000 +136530 -1.000000 +136531 -1.000000 +136532 -1.000000 +136533 -1.000000 +136534 -1.000000 +136535 -1.000000 +136536 -1.000000 +136539 -1.000000 +136540 -1.000000 +136541 -1.000000 +136544 -1.000000 +136546 -1.000000 +136550 -1.000000 +136551 -1.000000 +136553 -1.000000 +136555 -1.000000 +136556 -1.000000 +136557 -1.000000 +136558 -1.000000 +136563 -1.000000 +136565 -1.000000 +136566 -1.000000 +136568 -1.000000 +136569 -1.000000 +136580 -1.000000 +136581 -1.000000 +136587 -1.000000 +136593 -1.000000 +136594 -1.000000 +136595 -1.000000 +136597 -1.000000 +136602 -1.000000 +136603 -1.000000 +136604 -1.000000 +136605 -1.000000 +136606 -1.000000 +136607 -1.000000 +136608 -1.000000 +136609 -1.000000 +136611 -1.000000 +136612 -1.000000 +136649 -1.000000 +136650 -1.000000 +136651 -1.000000 +136652 -1.000000 +136653 -1.000000 +136654 -1.000000 +136655 -1.000000 +136656 -1.000000 +136657 -1.000000 +136658 -1.000000 +136659 -1.000000 +136660 -1.000000 +136661 -1.000000 +136662 -1.000000 +136663 -1.000000 +136664 -1.000000 +136665 -1.000000 +136669 -1.000000 +136670 -1.000000 +136671 -1.000000 +136672 -1.000000 +136673 -1.000000 +136675 -1.000000 +136680 -1.000000 +136683 -1.000000 +136686 -1.000000 +136688 -1.000000 +136689 -1.000000 +136690 -1.000000 +136691 -1.000000 +136692 -1.000000 +136693 -1.000000 +136694 -1.000000 +136697 -1.000000 +136698 -1.000000 +136700 -1.000000 +136701 -1.000000 +136702 -1.000000 +136703 -1.000000 +136704 -1.000000 +136705 -1.000000 +136706 -1.000000 +136707 -1.000000 +136708 -1.000000 +136710 -1.000000 +136711 -1.000000 +136713 -1.000000 +136714 -1.000000 +136715 -1.000000 +136717 -1.000000 +136722 -1.000000 +136723 -1.000000 +136724 -1.000000 +136726 -1.000000 +136728 -1.000000 +136729 -1.000000 +136730 -1.000000 +136731 -1.000000 +136732 -1.000000 +136733 -1.000000 +136735 -1.000000 +136736 -1.000000 +136739 -1.000000 +136740 -1.000000 +136741 -1.000000 +136742 -1.000000 +136745 -1.000000 +136746 -1.000000 +136749 -1.000000 +136755 -1.000000 +136757 -1.000000 +136758 -1.000000 +136759 -1.000000 +136761 -1.000000 +136762 -1.000000 +136764 -1.000000 +136766 -1.000000 +136768 -1.000000 +136769 -1.000000 +136770 -1.000000 +136771 -1.000000 +136774 -1.000000 +136775 -1.000000 +136781 -1.000000 +136782 -1.000000 +136783 -1.000000 +136784 -1.000000 +136785 -1.000000 +136791 -1.000000 +136792 -1.000000 +136793 -1.000000 +136794 -1.000000 +136796 -1.000000 +136797 -1.000000 +136798 -1.000000 +136799 -1.000000 +136800 -1.000000 +136801 -1.000000 +136802 -1.000000 +136803 -1.000000 +136804 -1.000000 +136805 -1.000000 +136806 -1.000000 +136807 -1.000000 +136808 -1.000000 +136809 -1.000000 +136810 -1.000000 +136811 -1.000000 +136812 -1.000000 +136813 -1.000000 +136815 -1.000000 +136818 -1.000000 +136824 -1.000000 +136825 -1.000000 +136826 -1.000000 +136827 -1.000000 +136829 -1.000000 +136830 -1.000000 +136831 -1.000000 +136832 -1.000000 +136833 -1.000000 +136834 -1.000000 +136835 -1.000000 +136836 -1.000000 +136838 -1.000000 +136839 -1.000000 +136840 -1.000000 +136842 -1.000000 +136843 -1.000000 +136844 -1.000000 +136845 -1.000000 +136846 -1.000000 +136847 -1.000000 +136848 -1.000000 +136849 -1.000000 +136850 -1.000000 +136851 -1.000000 +136852 -1.000000 +136853 -1.000000 +136854 -1.000000 +136855 -1.000000 +136861 -1.000000 +136862 -1.000000 +136869 -1.000000 +136870 -1.000000 +136871 -1.000000 +136872 -1.000000 +136874 -1.000000 +136875 -1.000000 +136877 -1.000000 +136879 -1.000000 +136894 -1.000000 +136895 -1.000000 +136896 -1.000000 +136898 -1.000000 +136899 -1.000000 +136900 -1.000000 +136901 -1.000000 +136902 -1.000000 +136903 -1.000000 +136904 -1.000000 +136905 -1.000000 +136907 -1.000000 +136908 -1.000000 +136909 -1.000000 +136910 -1.000000 +136921 -1.000000 +136923 -1.000000 +136927 -1.000000 +136928 -1.000000 +136929 -1.000000 +136930 -1.000000 +136931 -1.000000 +136932 -1.000000 +136933 -1.000000 +136934 -1.000000 +136935 -1.000000 +136936 -1.000000 +136937 -1.000000 +136938 -1.000000 +136939 -1.000000 +136940 -1.000000 +136941 -1.000000 +136942 -1.000000 +136943 -1.000000 +136944 -1.000000 +136948 -1.000000 +136949 -1.000000 +136958 -1.000000 +136959 -1.000000 +136960 -1.000000 +136963 -1.000000 +136964 -1.000000 +136965 -1.000000 +136966 -1.000000 +136967 -1.000000 +136968 -1.000000 +136969 -1.000000 +136970 -1.000000 +136971 -1.000000 +136972 -1.000000 +136973 -1.000000 +136974 -1.000000 +136975 -1.000000 +136976 -1.000000 +136977 -1.000000 +136978 -1.000000 +136979 -1.000000 +136980 -1.000000 +136981 -1.000000 +136982 -1.000000 +136983 -1.000000 +136984 -1.000000 +136985 -1.000000 +136986 -1.000000 +136987 -1.000000 +136988 -1.000000 +136989 -1.000000 +136990 -1.000000 +136991 -1.000000 +136992 -1.000000 +136993 -1.000000 +136994 -1.000000 +136995 -1.000000 +136996 -1.000000 +136997 -1.000000 +137102 -1.000000 +137110 -1.000000 +137112 -1.000000 +137117 -1.000000 +137118 -1.000000 +137119 -1.000000 +137122 -1.000000 +137126 -1.000000 +137130 -1.000000 +137131 -1.000000 +137158 -1.000000 +137159 -1.000000 +137160 -1.000000 +137161 -1.000000 +137162 -1.000000 +137163 -1.000000 +137164 -1.000000 +137165 -1.000000 +137166 -1.000000 +137167 -1.000000 +137168 -1.000000 +137169 -1.000000 +137172 -1.000000 +137174 -1.000000 +137176 -1.000000 +137177 -1.000000 +137179 -1.000000 +137180 -1.000000 +137181 -1.000000 +137185 -1.000000 +137190 -1.000000 +137192 -1.000000 +137193 -1.000000 +137194 -1.000000 +137197 -1.000000 +137199 -1.000000 +137201 -1.000000 +137202 -1.000000 +137207 -1.000000 +137221 -1.000000 +137224 -1.000000 +137225 -1.000000 +137226 -1.000000 +137227 -1.000000 +137228 -1.000000 +137229 -1.000000 +137231 -1.000000 +137236 -1.000000 +137237 -1.000000 +137238 -1.000000 +137239 -1.000000 +137240 -1.000000 +137241 -1.000000 +137242 -1.000000 +137243 -1.000000 +137244 -1.000000 +137245 -1.000000 +137246 -1.000000 +137247 -1.000000 +137248 -1.000000 +137249 -1.000000 +137250 -1.000000 +137251 -1.000000 +137252 -1.000000 +137253 -1.000000 +137254 -1.000000 +137255 -1.000000 +137256 -1.000000 +137261 -1.000000 +137262 -1.000000 +137266 -1.000000 +137268 -1.000000 +137269 -1.000000 +137270 -1.000000 +137271 -1.000000 +137272 -1.000000 +137273 -1.000000 +137274 -1.000000 +137275 -1.000000 +137278 -1.000000 +137279 -1.000000 +137280 -1.000000 +137281 -1.000000 +137283 -1.000000 +137285 -1.000000 +137286 -1.000000 +137288 -1.000000 +137289 -1.000000 +137290 -1.000000 +137291 -1.000000 +137292 -1.000000 +137293 -1.000000 +137294 -1.000000 +137295 -1.000000 +137296 -1.000000 +137299 -1.000000 +137300 -1.000000 +137301 -1.000000 +137303 -1.000000 +137304 -1.000000 +137306 -1.000000 +137307 -1.000000 +137308 -1.000000 +137309 -1.000000 +137310 -1.000000 +137311 -1.000000 +137312 -1.000000 +137313 -1.000000 +137314 -1.000000 +137315 -1.000000 +137316 -1.000000 +137317 -1.000000 +137318 -1.000000 +137319 -1.000000 +137320 -1.000000 +137321 -1.000000 +137322 -1.000000 +137323 -1.000000 +137324 -1.000000 +137325 -1.000000 +137326 -1.000000 +137327 -1.000000 +137328 -1.000000 +137329 -1.000000 +137330 -1.000000 +137331 -1.000000 +137332 -1.000000 +137335 -1.000000 +137336 -1.000000 +137337 -1.000000 +137338 -1.000000 +137339 -1.000000 +137340 -1.000000 +137341 -1.000000 +137342 -1.000000 +137343 -1.000000 +137344 -1.000000 +137345 -1.000000 +137346 -1.000000 +137347 -1.000000 +137348 -1.000000 +137349 -1.000000 +137350 -1.000000 +137351 -1.000000 +137352 -1.000000 +137353 -1.000000 +137354 -1.000000 +137355 -1.000000 +137356 -1.000000 +137357 -1.000000 +137358 -1.000000 +137359 -1.000000 +137360 -1.000000 +137361 -1.000000 +137362 -1.000000 +137364 -1.000000 +137365 -1.000000 +137366 -1.000000 +137377 -1.000000 +137378 -1.000000 +137380 -1.000000 +137381 -1.000000 +137382 -1.000000 +137383 -1.000000 +137384 -1.000000 +137385 -1.000000 +137386 -1.000000 +137387 -1.000000 +137388 -1.000000 +137389 -1.000000 +137390 -1.000000 +137392 -1.000000 +137393 -1.000000 +137394 -1.000000 +137395 -1.000000 +137396 -1.000000 +137397 -1.000000 +137398 -1.000000 +137400 -1.000000 +137401 -1.000000 +137402 -1.000000 +137408 -1.000000 +137409 -1.000000 +137410 -1.000000 +137411 -1.000000 +137412 -1.000000 +137413 -1.000000 +137414 -1.000000 +137415 -1.000000 +137416 -1.000000 +137417 -1.000000 +137418 -1.000000 +137419 -1.000000 +137420 -1.000000 +137421 -1.000000 +137422 -1.000000 +137423 -1.000000 +137424 -1.000000 +137425 -1.000000 +137426 -1.000000 +137427 -1.000000 +137428 -1.000000 +137429 -1.000000 +137430 -1.000000 +137431 -1.000000 +137434 -1.000000 +137435 -1.000000 +137436 -1.000000 +137437 -1.000000 +137443 -1.000000 +137444 -1.000000 +137445 -1.000000 +137446 -1.000000 +137447 -1.000000 +137450 -1.000000 +137451 -1.000000 +137452 -1.000000 +137453 -1.000000 +137454 -1.000000 +137455 -1.000000 +137456 -1.000000 +137457 -1.000000 +137458 -1.000000 +137459 -1.000000 +137460 -1.000000 +137461 -1.000000 +137462 -1.000000 +137463 -1.000000 +137464 -1.000000 +137465 -1.000000 +137466 -1.000000 +137467 -1.000000 +137468 -1.000000 +137469 -1.000000 +137470 -1.000000 +137471 -1.000000 +137472 -1.000000 +137473 -1.000000 +137477 -1.000000 +137478 -1.000000 +137480 -1.000000 +137481 -1.000000 +137482 -1.000000 +137483 -1.000000 +137484 -1.000000 +137485 -1.000000 +137486 -1.000000 +137487 -1.000000 +137488 -1.000000 +137489 -1.000000 +137490 -1.000000 +137491 -1.000000 +137492 -1.000000 +137493 -1.000000 +137494 -1.000000 +137495 -1.000000 +137496 -1.000000 +137497 -1.000000 +137498 -1.000000 +137499 -1.000000 +137500 -1.000000 +137501 -1.000000 +137502 -1.000000 +137503 -1.000000 +137504 -1.000000 +137505 -1.000000 +137506 -1.000000 +137509 -1.000000 +137510 -1.000000 +137515 -1.000000 +137516 -1.000000 +137518 -1.000000 +137519 -1.000000 +137520 -1.000000 +137521 -1.000000 +137522 -1.000000 +137524 -1.000000 +137529 -1.000000 +137530 -1.000000 +137531 -1.000000 +137532 -1.000000 +137533 -1.000000 +137534 -1.000000 +137535 -1.000000 +137536 -1.000000 +137537 -1.000000 +137538 -1.000000 +137539 -1.000000 +137541 -1.000000 +137542 -1.000000 +137543 -1.000000 +137544 -1.000000 +137545 -1.000000 +137546 -1.000000 +137547 -1.000000 +137548 -1.000000 +137549 -1.000000 +137556 -1.000000 +137557 -1.000000 +137558 -1.000000 +137559 -1.000000 +137560 -1.000000 +137561 -1.000000 +137562 -1.000000 +137563 -1.000000 +137564 -1.000000 +137565 -1.000000 +137566 -1.000000 +137567 -1.000000 +137568 -1.000000 +137570 -1.000000 +137571 -1.000000 +137572 -1.000000 +137573 -1.000000 +137574 -1.000000 +137575 -1.000000 +137576 -1.000000 +137577 -1.000000 +137578 -1.000000 +137579 -1.000000 +137581 -1.000000 +137583 -1.000000 +137587 -1.000000 +137588 -1.000000 +137596 -1.000000 +137597 -1.000000 +137598 -1.000000 +137599 -1.000000 +137706 -1.000000 +137708 -1.000000 +137709 -1.000000 +137710 -1.000000 +137711 -1.000000 +137712 -1.000000 +137713 -1.000000 +137714 -1.000000 +137715 -1.000000 +137716 -1.000000 +137717 -1.000000 +137718 -1.000000 +137719 -1.000000 +137720 -1.000000 +137721 -1.000000 +137722 -1.000000 +137723 -1.000000 +137863 -1.000000 +137864 -1.000000 +137867 -1.000000 +137868 -1.000000 +137878 -1.000000 +137880 -1.000000 +137881 -1.000000 +137889 -1.000000 +137890 -1.000000 +137891 -1.000000 +137892 -1.000000 +137895 -1.000000 +137896 -1.000000 +137897 -1.000000 +137899 -1.000000 +137902 -1.000000 +137903 -1.000000 +137904 -1.000000 +137905 -1.000000 +137906 -1.000000 +137907 -1.000000 +137908 -1.000000 +137909 -1.000000 +137910 -1.000000 +137911 -1.000000 +137915 -1.000000 +137916 -1.000000 +137917 -1.000000 +137918 -1.000000 +137931 -1.000000 +137932 -1.000000 +137933 -1.000000 +137934 -1.000000 +137935 -1.000000 +137936 -1.000000 +137937 -1.000000 +137938 -1.000000 +137939 -1.000000 +137940 -1.000000 +137941 -1.000000 +137942 -1.000000 +137943 -1.000000 +137945 -1.000000 +137950 -1.000000 +137951 -1.000000 +137953 -1.000000 +137954 -1.000000 +137955 -1.000000 +137956 -1.000000 +137957 -1.000000 +137959 -1.000000 +137961 -1.000000 +137963 -1.000000 +137965 -1.000000 +137973 -1.000000 +137976 -1.000000 +137997 -1.000000 +137998 -1.000000 +138011 -1.000000 +138016 -1.000000 +138018 -1.000000 +138020 -1.000000 +138022 -1.000000 +138023 -1.000000 +138025 -1.000000 +138026 -1.000000 +138030 -1.000000 +138031 -1.000000 +138034 -1.000000 +138035 -1.000000 +138036 -1.000000 +138037 -1.000000 +138038 -1.000000 +138039 -1.000000 +138040 -1.000000 +138041 -1.000000 +138042 -1.000000 +138043 -1.000000 +138044 -1.000000 +138045 -1.000000 +138046 -1.000000 +138047 -1.000000 +138049 -1.000000 +138050 -1.000000 +138051 -1.000000 +138052 -1.000000 +138053 -1.000000 +138054 -1.000000 +138105 -1.000000 +138130 -1.000000 +138131 -1.000000 +138132 -1.000000 +138133 -1.000000 +138135 -1.000000 +138136 -1.000000 +138137 -1.000000 +138138 -1.000000 +138140 -1.000000 +138141 -1.000000 +138142 -1.000000 +138143 -1.000000 +138144 -1.000000 +138147 -1.000000 +138151 -1.000000 +138152 -1.000000 +138153 -1.000000 +138154 -1.000000 +138162 -1.000000 +138185 -1.000000 +138186 -1.000000 +138187 -1.000000 +138188 -1.000000 +138192 -1.000000 +138193 -1.000000 +138194 -1.000000 +138199 -1.000000 +138200 -1.000000 +138201 -1.000000 +138203 -1.000000 +138211 -1.000000 +138216 -1.000000 +138219 -1.000000 +138220 -1.000000 +138221 -1.000000 +138222 -1.000000 +138223 -1.000000 +138225 -1.000000 +138226 -1.000000 +138227 -1.000000 +138228 -1.000000 +138229 -1.000000 +138230 -1.000000 +138234 -1.000000 +138235 -1.000000 +138236 -1.000000 +138237 -1.000000 +138239 -1.000000 +138240 -1.000000 +138241 -1.000000 +138242 -1.000000 +138243 -1.000000 +138244 -1.000000 +138247 -1.000000 +138257 -1.000000 +138258 -1.000000 +138303 -1.000000 +138305 -1.000000 +138307 -1.000000 +138308 -1.000000 +138309 -1.000000 +138310 -1.000000 +138311 -1.000000 +138312 -1.000000 +138313 -1.000000 +138314 -1.000000 +138315 -1.000000 +138317 -1.000000 +138318 -1.000000 +138319 -1.000000 +138320 -1.000000 +138321 -1.000000 +138322 -1.000000 +138323 -1.000000 +138324 -1.000000 +138325 -1.000000 +138326 -1.000000 +138327 -1.000000 +138328 -1.000000 +138329 -1.000000 +138330 -1.000000 +138334 -1.000000 +138335 -1.000000 +138336 -1.000000 +138337 -1.000000 +138338 -1.000000 +138340 -1.000000 +138341 -1.000000 +138342 -1.000000 +138343 -1.000000 +138344 -1.000000 +138345 -1.000000 +138358 -1.000000 +138359 -1.000000 +138360 -1.000000 +138362 -1.000000 +138363 -1.000000 +138364 -1.000000 +138372 -1.000000 +138374 -1.000000 +138380 -1.000000 +138381 -1.000000 +138382 -1.000000 +138383 -1.000000 +138384 -1.000000 +138385 -1.000000 +138386 -1.000000 +138387 -1.000000 +138389 -1.000000 +138390 -1.000000 +138391 -1.000000 +138392 -1.000000 +138394 -1.000000 +138397 -1.000000 +138400 -1.000000 +138402 -1.000000 +138403 -1.000000 +138404 -1.000000 +138405 -1.000000 +138406 -1.000000 +138407 -1.000000 +138408 -1.000000 +138409 -1.000000 +138411 -1.000000 +138429 -1.000000 +138431 -1.000000 +138432 -1.000000 +138434 -1.000000 +138459 -1.000000 +138460 -1.000000 +138464 -1.000000 +138475 -1.000000 +138476 -1.000000 +138477 -1.000000 +138480 -1.000000 +138481 -1.000000 +138482 -1.000000 +138484 -1.000000 +138485 -1.000000 +138487 -1.000000 +138488 -1.000000 +138489 -1.000000 +138490 -1.000000 +138498 -1.000000 +138499 -1.000000 +138500 -1.000000 +138502 -1.000000 +138504 -1.000000 +138507 -1.000000 +138512 -1.000000 +138513 -1.000000 +138515 -1.000000 +138516 -1.000000 +138529 -1.000000 +138531 -1.000000 +138532 -1.000000 +138533 -1.000000 +138535 -1.000000 +138536 -1.000000 +138538 -1.000000 +138539 -1.000000 +138542 -1.000000 +138543 -1.000000 +138548 -1.000000 +138551 -1.000000 +138563 -1.000000 +138565 -1.000000 +138567 -1.000000 +138569 -1.000000 +138570 -1.000000 +138572 -1.000000 +138573 -1.000000 +138575 -1.000000 +138578 -1.000000 +138579 -1.000000 +138580 -1.000000 +138581 -1.000000 +138582 -1.000000 +138583 -1.000000 +138584 -1.000000 +138585 -1.000000 +138587 -1.000000 +138588 -1.000000 +138589 -1.000000 +138590 -1.000000 +138592 -1.000000 +138596 -1.000000 +138601 -1.000000 +138606 -1.000000 +138609 -1.000000 +138611 -1.000000 +138613 -1.000000 +138614 -1.000000 +138615 -1.000000 +138616 -1.000000 +138618 -1.000000 +138620 -1.000000 +138621 -1.000000 +138622 -1.000000 +138623 -1.000000 +138624 -1.000000 +138627 -1.000000 +138628 -1.000000 +138629 -1.000000 +138630 -1.000000 +138631 -1.000000 +138632 -1.000000 +138633 -1.000000 +138634 -1.000000 +138635 -1.000000 +138636 -1.000000 +138637 -1.000000 +138638 -1.000000 +138639 -1.000000 +138641 -1.000000 +138642 -1.000000 +138645 -1.000000 +138648 -1.000000 +138651 -1.000000 +138658 -1.000000 +138661 -1.000000 +138662 -1.000000 +138663 -1.000000 +138664 -1.000000 +138665 -1.000000 +138673 -1.000000 +138675 -1.000000 +138676 -1.000000 +138677 -1.000000 +138678 -1.000000 +138681 -1.000000 +138682 -1.000000 +138688 -1.000000 +138689 -1.000000 +138690 -1.000000 +138693 -1.000000 +138694 -1.000000 +138698 -1.000000 +138699 -1.000000 +138703 -1.000000 +138705 -1.000000 +138706 -1.000000 +138707 -1.000000 +138708 -1.000000 +138709 -1.000000 +138714 -1.000000 +138716 -1.000000 +138717 -1.000000 +138720 -1.000000 +138721 -1.000000 +138725 -1.000000 +138726 -1.000000 +138730 -1.000000 +138732 -1.000000 +138734 -1.000000 +138735 -1.000000 +138736 -1.000000 +138737 -1.000000 +138738 -1.000000 +138739 -1.000000 +138742 -1.000000 +138745 -1.000000 +138746 -1.000000 +138751 -1.000000 +138753 -1.000000 +138754 -1.000000 +138756 -1.000000 +138757 -1.000000 +138758 -1.000000 +138759 -1.000000 +138760 -1.000000 +138761 -1.000000 +138763 -1.000000 +138767 -1.000000 +138768 -1.000000 +138769 -1.000000 +138773 -1.000000 +138774 -1.000000 +138778 -1.000000 +138779 -1.000000 +138780 -1.000000 +138781 -1.000000 +138783 -1.000000 +138784 -1.000000 +138786 -1.000000 +138789 -1.000000 +138792 -1.000000 +138795 -1.000000 +138798 -1.000000 +138799 -1.000000 +138809 -1.000000 +138812 -1.000000 +138813 -1.000000 +138819 -1.000000 +138821 -1.000000 +138823 -1.000000 +138827 -1.000000 +138828 -1.000000 +138832 -1.000000 +138853 -1.000000 +139282 -1.000000 +139283 -1.000000 +139284 -1.000000 +139285 -1.000000 +139286 -1.000000 +139287 -1.000000 +139288 -1.000000 +139294 -1.000000 +139295 -1.000000 +139303 -1.000000 +139316 -1.000000 +139321 -1.000000 +139322 -1.000000 +139323 -1.000000 +139324 -1.000000 +139325 -1.000000 +139326 -1.000000 +139327 -1.000000 +139328 -1.000000 +139329 -1.000000 +139330 -1.000000 +139346 -1.000000 +139347 -1.000000 +139348 -1.000000 +139349 -1.000000 +139350 -1.000000 +139351 -1.000000 +139352 -1.000000 +139356 -1.000000 +139357 -1.000000 +139358 -1.000000 +139362 -1.000000 +139363 -1.000000 +139364 -1.000000 +139365 -1.000000 +139366 -1.000000 +139367 -1.000000 +139368 -1.000000 +139370 -1.000000 +139372 -1.000000 +139373 -1.000000 +139374 -1.000000 +139375 -1.000000 +139376 -1.000000 +139377 -1.000000 +139379 -1.000000 +139380 -1.000000 +139381 -1.000000 +139383 -1.000000 +139384 -1.000000 +139399 -1.000000 +139400 -1.000000 +139404 -1.000000 +139406 -1.000000 +139407 -1.000000 +139409 -1.000000 +139412 -1.000000 +139414 -1.000000 +139415 -1.000000 +139416 -1.000000 +139437 -1.000000 +139446 -1.000000 +139447 -1.000000 +139452 -1.000000 +139454 -1.000000 +139455 -1.000000 +139456 -1.000000 +139457 -1.000000 +139458 -1.000000 +139460 -1.000000 +139461 -1.000000 +139462 -1.000000 +139464 -1.000000 +139465 -1.000000 +139469 -1.000000 +139472 -1.000000 +139473 -1.000000 +139474 -1.000000 +139475 -1.000000 +139476 -1.000000 +139477 -1.000000 +139478 -1.000000 +139479 -1.000000 +139480 -1.000000 +139481 -1.000000 +139482 -1.000000 +139483 -1.000000 +139484 -1.000000 +139485 -1.000000 +139486 -1.000000 +139489 -1.000000 +139491 -1.000000 +139492 -1.000000 +139493 -1.000000 +139494 -1.000000 +139495 -1.000000 +139496 -1.000000 +139498 -1.000000 +139499 -1.000000 +139510 -1.000000 +139529 -1.000000 +139539 -1.000000 +139540 -1.000000 +139544 -1.000000 +139549 -1.000000 +139561 -1.000000 +139562 -1.000000 +139564 -1.000000 +139565 -1.000000 +139569 -1.000000 +139570 -1.000000 +139583 -1.000000 +139589 -1.000000 +139600 -1.000000 +139601 -1.000000 +139602 -1.000000 +139603 -1.000000 +139604 -1.000000 +139605 -1.000000 +139606 -1.000000 +139611 -1.000000 +139615 -1.000000 +139616 -1.000000 +139619 -1.000000 +139620 -1.000000 +139621 -1.000000 +139622 -1.000000 +139625 -1.000000 +139626 -1.000000 +139635 -1.000000 +139636 -1.000000 +139647 -1.000000 +139648 -1.000000 +139649 -1.000000 +139650 -1.000000 +139651 -1.000000 +139652 -1.000000 +139653 -1.000000 +139654 -1.000000 +139655 -1.000000 +139656 -1.000000 +139657 -1.000000 +139658 -1.000000 +139659 -1.000000 +139661 -1.000000 +139662 -1.000000 +139663 -1.000000 +139664 -1.000000 +139665 -1.000000 +139666 -1.000000 +139667 -1.000000 +139668 -1.000000 +139669 -1.000000 +139670 -1.000000 +139671 -1.000000 +139673 -1.000000 +139674 -1.000000 +139675 -1.000000 +139676 -1.000000 +139677 -1.000000 +139678 -1.000000 +139679 -1.000000 +139680 -1.000000 +139682 -1.000000 +139686 -1.000000 +139688 -1.000000 +139689 -1.000000 +139690 -1.000000 +139691 -1.000000 +139692 -1.000000 +139693 -1.000000 +139695 -1.000000 +139702 -1.000000 +139703 -1.000000 +139707 -1.000000 +139708 -1.000000 +139711 -1.000000 +139714 -1.000000 +139715 -1.000000 +139716 -1.000000 +139718 -1.000000 +139719 -1.000000 +139724 -1.000000 +139728 -1.000000 +139735 -1.000000 +139738 -1.000000 +139740 -1.000000 +139744 -1.000000 +139745 -1.000000 +139747 -1.000000 +139748 -1.000000 +139749 -1.000000 +139750 -1.000000 +139751 -1.000000 +139752 -1.000000 +139757 -1.000000 +139758 -1.000000 +139760 -1.000000 +139761 -1.000000 +139764 -1.000000 +139768 -1.000000 +139769 -1.000000 +139772 -1.000000 +139773 -1.000000 +139777 -1.000000 +139783 -1.000000 +139784 -1.000000 +139785 -1.000000 +139788 -1.000000 +139789 -1.000000 +139790 -1.000000 +139791 -1.000000 +139792 -1.000000 +139802 -1.000000 +139816 -1.000000 +139817 -1.000000 +139869 -1.000000 +139872 -1.000000 +139876 -1.000000 +139877 -1.000000 +139878 -1.000000 +139879 -1.000000 +139880 -1.000000 +139881 -1.000000 +139882 -1.000000 +139883 -1.000000 +139884 -1.000000 +139885 -1.000000 +139887 -1.000000 +139890 -1.000000 +139891 -1.000000 +139893 -1.000000 +139894 -1.000000 +139895 -1.000000 +139896 -1.000000 +139900 -1.000000 +139901 -1.000000 +139902 -1.000000 +139904 -1.000000 +139905 -1.000000 +139906 -1.000000 +139907 -1.000000 +139908 -1.000000 +139909 -1.000000 +139910 -1.000000 +139911 -1.000000 +139912 -1.000000 +139915 -1.000000 +139916 -1.000000 +139917 -1.000000 +139918 -1.000000 +139919 -1.000000 +139920 -1.000000 +139921 -1.000000 +139922 -1.000000 +139924 -1.000000 +139925 -1.000000 +139926 -1.000000 +139928 -1.000000 +139929 -1.000000 +139930 -1.000000 +139931 -1.000000 +139938 -1.000000 +139939 -1.000000 +139940 -1.000000 +139943 -1.000000 +139944 -1.000000 +139945 -1.000000 +139950 -1.000000 +139953 -1.000000 +139955 -1.000000 +139957 -1.000000 +139958 -1.000000 +139968 -1.000000 +139971 -1.000000 +139974 -1.000000 +139983 -1.000000 +139984 -1.000000 +139985 -1.000000 +139991 -1.000000 +139995 -1.000000 +139997 -1.000000 +139998 -1.000000 +139999 -1.000000 +140000 -1.000000 +140001 -1.000000 +140002 -1.000000 +140003 -1.000000 +140019 -1.000000 +140020 -1.000000 +140029 -1.000000 +140030 -1.000000 +140031 -1.000000 +140032 -1.000000 +140033 -1.000000 +140034 -1.000000 +140035 -1.000000 +140036 -1.000000 +140037 -1.000000 +140038 -1.000000 +140039 -1.000000 +140040 -1.000000 +140041 -1.000000 +140045 -1.000000 +140048 -1.000000 +140049 -1.000000 +140050 -1.000000 +140052 -1.000000 +140053 -1.000000 +140056 -1.000000 +140059 -1.000000 +140061 -1.000000 +140063 -1.000000 +140064 -1.000000 +140065 -1.000000 +140066 -1.000000 +140067 -1.000000 +140068 -1.000000 +140069 -1.000000 +140070 -1.000000 +140071 -1.000000 +140072 -1.000000 +140073 -1.000000 +140074 -1.000000 +140075 -1.000000 +140076 -1.000000 +140077 -1.000000 +140078 -1.000000 +140082 -1.000000 +140083 -1.000000 +140084 -1.000000 +140086 -1.000000 +140087 -1.000000 +140089 -1.000000 +140090 -1.000000 +140092 -1.000000 +140093 -1.000000 +140094 -1.000000 +140095 -1.000000 +140097 -1.000000 +140099 -1.000000 +140102 -1.000000 +140105 -1.000000 +140111 -1.000000 +140112 -1.000000 +140113 -1.000000 +140114 -1.000000 +140116 -1.000000 +140117 -1.000000 +140120 -1.000000 +140122 -1.000000 +140129 -1.000000 +140134 -1.000000 +140135 -1.000000 +140138 -1.000000 +140141 -1.000000 +140142 -1.000000 +140144 -1.000000 +140145 -1.000000 +140146 -1.000000 +140150 -1.000000 +140151 -1.000000 +140153 -1.000000 +140154 -1.000000 +140156 -1.000000 +140162 -1.000000 +140163 -1.000000 +140165 -1.000000 +140166 -1.000000 +140169 -1.000000 +140170 -1.000000 +140175 -1.000000 +140178 -1.000000 +140179 -1.000000 +140180 -1.000000 +140182 -1.000000 +140183 -1.000000 +140184 -1.000000 +140185 -1.000000 +140187 -1.000000 +140188 -1.000000 +140189 -1.000000 +140191 -1.000000 +140192 -1.000000 +140193 -1.000000 +140195 -1.000000 +140196 -1.000000 +140198 -1.000000 +140199 -1.000000 +140200 -1.000000 +140202 -1.000000 +140203 -1.000000 +140204 -1.000000 +140205 -1.000000 +140209 -1.000000 +140210 -1.000000 +140211 -1.000000 +140214 -1.000000 +140215 -1.000000 +140216 -1.000000 +140219 -1.000000 +140220 -1.000000 +140221 -1.000000 +140222 -1.000000 +140224 -1.000000 +140225 -1.000000 +140226 -1.000000 +140227 -1.000000 +140228 -1.000000 +140229 -1.000000 +140230 -1.000000 +140235 -1.000000 +140236 -1.000000 +140241 -1.000000 +140242 -1.000000 +140265 -1.000000 +140273 -1.000000 +140281 -1.000000 +140300 -1.000000 +140301 -1.000000 +140302 -1.000000 +140303 -1.000000 +140304 -1.000000 +140305 -1.000000 +140306 -1.000000 +140307 -1.000000 +140324 -1.000000 +140325 -1.000000 +140326 -1.000000 +140327 -1.000000 +140328 -1.000000 +140329 -1.000000 +140331 -1.000000 +140337 -1.000000 +140338 -1.000000 +140339 -1.000000 +140340 -1.000000 +140348 -1.000000 +140349 -1.000000 +140350 -1.000000 +140351 -1.000000 +140352 -1.000000 +140353 -1.000000 +140354 -1.000000 +140355 -1.000000 +140356 -1.000000 +140357 -1.000000 +140358 -1.000000 +140359 -1.000000 +140360 -1.000000 +140361 -1.000000 +140362 -1.000000 +140363 -1.000000 +140364 -1.000000 +140365 -1.000000 +140366 -1.000000 +140367 -1.000000 +140368 -1.000000 +140369 -1.000000 +140372 -1.000000 +140374 -1.000000 +140375 -1.000000 +140377 -1.000000 +140378 -1.000000 +140379 -1.000000 +140381 -1.000000 +140383 -1.000000 +140384 -1.000000 +140386 -1.000000 +140388 -1.000000 +140389 -1.000000 +140390 -1.000000 +140391 -1.000000 +140392 -1.000000 +140393 -1.000000 +140394 -1.000000 +140396 -1.000000 +140398 -1.000000 +140400 -1.000000 +140401 -1.000000 +140404 -1.000000 +140405 -1.000000 +140406 -1.000000 +140407 -1.000000 +140408 -1.000000 +140409 -1.000000 +140413 -1.000000 +140414 -1.000000 +140415 -1.000000 +140416 -1.000000 +140417 -1.000000 +140418 -1.000000 +140419 -1.000000 +140420 -1.000000 +140421 -1.000000 +140422 -1.000000 +140423 -1.000000 +140424 -1.000000 +140427 -1.000000 +140428 -1.000000 +140429 -1.000000 +140430 -1.000000 +140431 -1.000000 +140432 -1.000000 +140433 -1.000000 +140434 -1.000000 +140435 -1.000000 +140436 -1.000000 +140437 -1.000000 +140438 -1.000000 +140441 -1.000000 +140445 -1.000000 +140446 -1.000000 +140448 -1.000000 +140450 -1.000000 +140451 -1.000000 +140452 -1.000000 +140453 -1.000000 +140454 -1.000000 +140455 -1.000000 +140456 -1.000000 +140457 -1.000000 +140458 -1.000000 +140465 -1.000000 +140469 -1.000000 +140471 -1.000000 +140475 -1.000000 +140494 -1.000000 +140495 -1.000000 +140496 -1.000000 +140498 -1.000000 +140499 -1.000000 +140500 -1.000000 +140501 -1.000000 +140502 -1.000000 +140503 -1.000000 +140504 -1.000000 +140506 -1.000000 +140507 -1.000000 +140508 -1.000000 +140509 -1.000000 +140510 -1.000000 +140511 -1.000000 +140512 -1.000000 +140513 -1.000000 +140514 -1.000000 +140515 -1.000000 +140518 -1.000000 +140519 -1.000000 +140520 -1.000000 +140521 -1.000000 +140522 -1.000000 +140523 -1.000000 +140524 -1.000000 +140531 -1.000000 +140532 -1.000000 +140534 -1.000000 +140535 -1.000000 +140536 -1.000000 +140537 -1.000000 +140538 -1.000000 +140539 -1.000000 +140540 -1.000000 +140541 -1.000000 +140542 -1.000000 +140543 -1.000000 +140544 -1.000000 +140545 -1.000000 +140560 -1.000000 +140561 -1.000000 +140562 -1.000000 +140563 -1.000000 +140585 -1.000000 +140591 -1.000000 +140592 -1.000000 +140593 -1.000000 +140594 -1.000000 +140596 -1.000000 +140597 -1.000000 +140598 -1.000000 +140599 -1.000000 +140600 -1.000000 +140601 -1.000000 +140602 -1.000000 +140603 -1.000000 +140604 -1.000000 +140605 -1.000000 +140606 -1.000000 +140607 -1.000000 +140608 -1.000000 +140609 -1.000000 +140610 -1.000000 +140611 -1.000000 +140612 -1.000000 +140613 -1.000000 +140614 -1.000000 +140615 -1.000000 +140616 -1.000000 +140617 -1.000000 +140618 -1.000000 +140619 -1.000000 +140628 -1.000000 +140629 -1.000000 +140630 -1.000000 +140631 -1.000000 +140632 -1.000000 +140633 -1.000000 +140634 -1.000000 +140635 -1.000000 +140636 -1.000000 +140637 -1.000000 +140638 -1.000000 +140639 -1.000000 +140641 -1.000000 +140643 -1.000000 +140648 -1.000000 +140651 -1.000000 +140654 -1.000000 +140655 -1.000000 +140656 -1.000000 +140657 -1.000000 +140659 -1.000000 +140661 -1.000000 +140662 -1.000000 +140663 -1.000000 +140665 -1.000000 +140667 -1.000000 +140669 -1.000000 +140673 -1.000000 +140674 -1.000000 +140675 -1.000000 +140676 -1.000000 +140677 -1.000000 +140678 -1.000000 +140679 -1.000000 +140680 -1.000000 +140682 -1.000000 +140683 -1.000000 +140684 -1.000000 +140685 -1.000000 +140686 -1.000000 +140687 -1.000000 +140688 -1.000000 +140689 -1.000000 +140690 -1.000000 +140691 -1.000000 +140692 -1.000000 +140693 -1.000000 +140695 -1.000000 +140696 -1.000000 +140697 -1.000000 +140698 -1.000000 +140699 -1.000000 +140700 -1.000000 +140701 -1.000000 +140702 -1.000000 +140703 -1.000000 +140705 -1.000000 +140707 -1.000000 +140708 -1.000000 +140709 -1.000000 +140710 -1.000000 +140712 -1.000000 +140713 -1.000000 +140714 -1.000000 +140715 -1.000000 +140717 -1.000000 +140718 -1.000000 +140719 -1.000000 +140720 -1.000000 +140721 -1.000000 +140722 -1.000000 +140723 -1.000000 +140724 -1.000000 +140725 -1.000000 +140726 -1.000000 +140727 -1.000000 +140730 -1.000000 +140731 -1.000000 +140736 -1.000000 +140738 -1.000000 +140743 -1.000000 +140744 -1.000000 +140745 -1.000000 +140746 -1.000000 +140747 -1.000000 +140749 -1.000000 +140750 -1.000000 +140751 -1.000000 +140752 -1.000000 +140753 -1.000000 +140754 -1.000000 +140756 -1.000000 +140757 -1.000000 +140758 -1.000000 +140759 -1.000000 +140761 -1.000000 +140838 -1.000000 +140839 -1.000000 +140840 -1.000000 +140841 -1.000000 +140842 -1.000000 +140843 -1.000000 +140844 -1.000000 +140845 -1.000000 +140846 -1.000000 +140847 -1.000000 +140848 -1.000000 +140849 -1.000000 +140850 -1.000000 +140851 -1.000000 +140852 -1.000000 +140853 -1.000000 +140854 -1.000000 +140855 -1.000000 +140856 -1.000000 +140857 -1.000000 +140858 -1.000000 +140859 -1.000000 +140860 -1.000000 +140862 -1.000000 +140864 -1.000000 +140866 -1.000000 +140868 -1.000000 +140869 -1.000000 +140871 -1.000000 +140872 -1.000000 +140873 -1.000000 +140874 -1.000000 +140875 -1.000000 +140876 -1.000000 +140877 -1.000000 +140878 -1.000000 +140879 -1.000000 +140880 -1.000000 +140881 -1.000000 +140882 -1.000000 +140883 -1.000000 +140884 -1.000000 +140885 -1.000000 +140886 -1.000000 +140887 -1.000000 +140888 -1.000000 +140889 -1.000000 +140890 -1.000000 +140891 -1.000000 +140892 -1.000000 +140893 -1.000000 +140894 -1.000000 +140895 -1.000000 +140899 -1.000000 +140900 -1.000000 +140901 -1.000000 +140903 -1.000000 +140904 -1.000000 +140905 -1.000000 +140906 -1.000000 +140907 -1.000000 +140908 -1.000000 +140909 -1.000000 +140912 -1.000000 +140913 -1.000000 +140914 -1.000000 +140915 -1.000000 +140916 -1.000000 +140917 -1.000000 +140918 -1.000000 +140920 -1.000000 +140924 -1.000000 +140927 -1.000000 +140929 -1.000000 +140931 -1.000000 +140933 -1.000000 +140934 -1.000000 +140935 -1.000000 +140936 -1.000000 +140937 -1.000000 +140938 -1.000000 +140940 -1.000000 +140941 -1.000000 +140944 -1.000000 +140946 -1.000000 +140952 -1.000000 +140954 -1.000000 +140974 -1.000000 +140987 -1.000000 +141005 -1.000000 +141007 -1.000000 +141008 -1.000000 +141009 -1.000000 +141011 -1.000000 +141013 -1.000000 +141014 -1.000000 +141015 -1.000000 +141016 -1.000000 +141017 -1.000000 +141018 -1.000000 +141019 -1.000000 +141020 -1.000000 +141021 -1.000000 +141022 -1.000000 +141023 -1.000000 +141024 -1.000000 +141026 -1.000000 +141027 -1.000000 +141029 -1.000000 +141042 -1.000000 +141043 -1.000000 +141045 -1.000000 +141046 -1.000000 +141068 -1.000000 +141069 -1.000000 +141070 -1.000000 +141071 -1.000000 +141072 -1.000000 +141073 -1.000000 +141074 -1.000000 +141075 -1.000000 +141076 -1.000000 +141077 -1.000000 +141080 -1.000000 +141081 -1.000000 +141083 -1.000000 +141084 -1.000000 +141089 -1.000000 +141090 -1.000000 +141091 -1.000000 +141092 -1.000000 +141094 -1.000000 +141095 -1.000000 +141096 -1.000000 +141105 -1.000000 +141106 -1.000000 +141118 -1.000000 +141132 -1.000000 +141135 -1.000000 +141136 -1.000000 +141137 -1.000000 +141138 -1.000000 +141139 -1.000000 +141140 -1.000000 +141141 -1.000000 +141142 -1.000000 +141143 -1.000000 +141144 -1.000000 +141145 -1.000000 +141146 -1.000000 +141147 -1.000000 +141148 -1.000000 +141149 -1.000000 +141150 -1.000000 +141166 -1.000000 +141167 -1.000000 +141169 -1.000000 +141170 -1.000000 +141171 -1.000000 +141179 -1.000000 +141180 -1.000000 +141182 -1.000000 +141183 -1.000000 +141184 -1.000000 +141185 -1.000000 +141187 -1.000000 +141188 -1.000000 +141189 -1.000000 +141190 -1.000000 +141191 -1.000000 +141195 -1.000000 +141196 -1.000000 +141210 -1.000000 +141211 -1.000000 +141212 -1.000000 +141213 -1.000000 +141214 -1.000000 +141215 -1.000000 +141216 -1.000000 +141217 -1.000000 +141218 -1.000000 +141219 -1.000000 +141220 -1.000000 +141221 -1.000000 +141222 -1.000000 +141223 -1.000000 +141224 -1.000000 +141225 -1.000000 +141226 -1.000000 +141227 -1.000000 +141228 -1.000000 +141229 -1.000000 +141230 -1.000000 +141231 -1.000000 +141232 -1.000000 +141233 -1.000000 +141234 -1.000000 +141241 -1.000000 +141263 -1.000000 +141264 -1.000000 +141266 -1.000000 +141267 -1.000000 +141268 -1.000000 +141270 -1.000000 +141271 -1.000000 +141272 -1.000000 +141273 -1.000000 +141274 -1.000000 +141275 -1.000000 +141276 -1.000000 +141277 -1.000000 +141278 -1.000000 +141279 -1.000000 +141284 -1.000000 +141285 -1.000000 +141298 -1.000000 +141313 -1.000000 +141320 -1.000000 +141321 -1.000000 +141323 -1.000000 +141328 -1.000000 +141338 -1.000000 +141339 -1.000000 +141340 -1.000000 +141342 -1.000000 +141344 -1.000000 +141352 -1.000000 +141354 -1.000000 +141357 -1.000000 +141363 -1.000000 +141365 -1.000000 +141366 -1.000000 +141370 -1.000000 +141377 -1.000000 +141378 -1.000000 +141381 -1.000000 +141383 -1.000000 +141384 -1.000000 +141385 -1.000000 +141386 -1.000000 +141387 -1.000000 +141388 -1.000000 +141392 -1.000000 +141395 -1.000000 +141397 -1.000000 +141398 -1.000000 +141399 -1.000000 +141400 -1.000000 +141401 -1.000000 +141402 -1.000000 +141403 -1.000000 +141404 -1.000000 +141405 -1.000000 +141406 -1.000000 +141407 -1.000000 +141408 -1.000000 +141409 -1.000000 +141410 -1.000000 +141412 -1.000000 +141413 -1.000000 +141414 -1.000000 +141415 -1.000000 +141416 -1.000000 +141417 -1.000000 +141418 -1.000000 +141419 -1.000000 +141420 -1.000000 +141422 -1.000000 +141423 -1.000000 +141424 -1.000000 +141425 -1.000000 +141426 -1.000000 +141427 -1.000000 +141428 -1.000000 +141429 -1.000000 +141430 -1.000000 +141431 -1.000000 +141432 -1.000000 +141438 -1.000000 +141440 -1.000000 +141445 -1.000000 +141446 -1.000000 +141449 -1.000000 +141451 -1.000000 +141452 -1.000000 +141453 -1.000000 +141455 -1.000000 +141458 -1.000000 +141460 -1.000000 +141461 -1.000000 +141462 -1.000000 +141464 -1.000000 +141466 -1.000000 +141467 -1.000000 +141468 -1.000000 +141469 -1.000000 +141470 -1.000000 +141471 -1.000000 +141472 -1.000000 +141474 -1.000000 +141489 -1.000000 +141490 -1.000000 +141499 -1.000000 +141501 -1.000000 +141502 -1.000000 +141503 -1.000000 +141504 -1.000000 +141505 -1.000000 +141506 -1.000000 +141507 -1.000000 +141508 -1.000000 +141509 -1.000000 +141510 -1.000000 +141511 -1.000000 +141513 -1.000000 +141514 -1.000000 +141515 -1.000000 +141516 -1.000000 +141517 -1.000000 +141518 -1.000000 +141519 -1.000000 +141520 -1.000000 +141523 -1.000000 +141531 -1.000000 +141532 -1.000000 +141533 -1.000000 +141534 -1.000000 +141535 -1.000000 +141538 -1.000000 +141540 -1.000000 +141542 -1.000000 +141545 -1.000000 +141546 -1.000000 +141547 -1.000000 +141548 -1.000000 +141550 -1.000000 +141552 -1.000000 +141553 -1.000000 +141554 -1.000000 +141555 -1.000000 +141556 -1.000000 +141557 -1.000000 +141558 -1.000000 +141559 -1.000000 +141560 -1.000000 +141561 -1.000000 +141562 -1.000000 +141563 -1.000000 +141564 -1.000000 +141566 -1.000000 +141568 -1.000000 +141569 -1.000000 +141570 -1.000000 +141571 -1.000000 +141572 -1.000000 +141573 -1.000000 +141575 -1.000000 +141576 -1.000000 +141577 -1.000000 +141578 -1.000000 +141580 -1.000000 +141581 -1.000000 +141582 -1.000000 +141583 -1.000000 +141584 -1.000000 +141585 -1.000000 +141586 -1.000000 +141587 -1.000000 +141588 -1.000000 +141589 -1.000000 +141590 -1.000000 +141591 -1.000000 +141593 -1.000000 +141594 -1.000000 +141595 -1.000000 +141596 -1.000000 +141597 -1.000000 +141598 -1.000000 +141599 -1.000000 +141600 -1.000000 +141601 -1.000000 +141602 -1.000000 +141603 -1.000000 +141604 -1.000000 +141608 -1.000000 +141609 -1.000000 +141612 -1.000000 +141614 -1.000000 +141617 -1.000000 +141618 -1.000000 +141620 -1.000000 +141622 -1.000000 +141623 -1.000000 +141624 -1.000000 +141627 -1.000000 +141628 -1.000000 +141629 -1.000000 +141630 -1.000000 +141631 -1.000000 +141634 -1.000000 +141635 -1.000000 +141636 -1.000000 +141638 -1.000000 +141647 -1.000000 +141648 -1.000000 +141649 -1.000000 +141650 -1.000000 +141651 -1.000000 +141652 -1.000000 +141653 -1.000000 +141654 -1.000000 +141655 -1.000000 +141656 -1.000000 +141657 -1.000000 +141658 -1.000000 +141659 -1.000000 +141660 -1.000000 +141661 -1.000000 +141662 -1.000000 +141663 -1.000000 +141664 -1.000000 +141665 -1.000000 +141666 -1.000000 +141667 -1.000000 +141668 -1.000000 +141669 -1.000000 +141670 -1.000000 +141671 -1.000000 +141672 -1.000000 +141673 -1.000000 +141674 -1.000000 +141675 -1.000000 +141676 -1.000000 +141677 -1.000000 +141678 -1.000000 +141679 -1.000000 +141681 -1.000000 +141682 -1.000000 +141683 -1.000000 +141684 -1.000000 +141685 -1.000000 +141686 -1.000000 +141687 -1.000000 +141690 -1.000000 +141691 -1.000000 +141692 -1.000000 +141693 -1.000000 +141694 -1.000000 +141695 -1.000000 +141696 -1.000000 +141697 -1.000000 +141698 -1.000000 +141699 -1.000000 +141700 -1.000000 +141701 -1.000000 +141702 -1.000000 +141703 -1.000000 +141704 -1.000000 +141705 -1.000000 +141706 -1.000000 +141707 -1.000000 +141708 -1.000000 +141709 -1.000000 +141711 -1.000000 +141712 -1.000000 +141714 -1.000000 +141719 -1.000000 +141720 -1.000000 +141721 -1.000000 +141722 -1.000000 +141723 -1.000000 +141724 -1.000000 +141728 -1.000000 +141729 -1.000000 +141750 -1.000000 +141811 -1.000000 +141812 -1.000000 +141813 -1.000000 +141815 -1.000000 +141816 -1.000000 +141817 -1.000000 +141819 -1.000000 +141822 -1.000000 +141823 -1.000000 +141824 -1.000000 +141825 -1.000000 +141826 -1.000000 +141827 -1.000000 +141828 -1.000000 +141829 -1.000000 +141830 -1.000000 +141832 -1.000000 +141835 -1.000000 +141837 -1.000000 +141839 -1.000000 +141840 -1.000000 +141841 -1.000000 +141842 -1.000000 +141844 -1.000000 +141854 -1.000000 +141856 -1.000000 +141858 -1.000000 +141861 -1.000000 +141862 -1.000000 +141863 -1.000000 +141864 -1.000000 +141865 -1.000000 +141866 -1.000000 +141867 -1.000000 +141868 -1.000000 +141869 -1.000000 +141870 -1.000000 +141871 -1.000000 +141872 -1.000000 +141873 -1.000000 +141874 -1.000000 +141875 -1.000000 +141877 -1.000000 +141878 -1.000000 +141879 -1.000000 +141881 -1.000000 +141884 -1.000000 +141886 -1.000000 +141887 -1.000000 +141888 -1.000000 +141889 -1.000000 +141890 -1.000000 +141891 -1.000000 +141892 -1.000000 +141893 -1.000000 +141896 -1.000000 +141897 -1.000000 +141904 -1.000000 +141905 -1.000000 +141906 -1.000000 +141911 -1.000000 +141913 -1.000000 +141919 -1.000000 +141920 -1.000000 +141921 -1.000000 +141922 -1.000000 +141923 -1.000000 +141925 -1.000000 +141927 -1.000000 +141928 -1.000000 +141929 -1.000000 +141930 -1.000000 +141931 -1.000000 +141932 -1.000000 +141933 -1.000000 +141934 -1.000000 +141935 -1.000000 +141936 -1.000000 +141937 -1.000000 +141938 -1.000000 +141939 -1.000000 +141940 -1.000000 +141941 -1.000000 +141942 -1.000000 +141943 -1.000000 +141944 -1.000000 +141945 -1.000000 +141946 -1.000000 +141947 -1.000000 +141948 -1.000000 +141949 -1.000000 +141950 -1.000000 +141951 -1.000000 +141952 -1.000000 +141953 -1.000000 +141954 -1.000000 +141955 -1.000000 +141956 -1.000000 +141958 -1.000000 +141959 -1.000000 +141961 -1.000000 +141962 -1.000000 +141964 -1.000000 +141966 -1.000000 +141967 -1.000000 +141968 -1.000000 +141969 -1.000000 +141972 -1.000000 +141973 -1.000000 +141974 -1.000000 +141975 -1.000000 +141976 -1.000000 +141977 -1.000000 +141978 -1.000000 +141981 -1.000000 +141985 -1.000000 +141986 -1.000000 +141987 -1.000000 +141994 -1.000000 +141997 -1.000000 +141999 -1.000000 +142000 -1.000000 +142002 -1.000000 +142005 -1.000000 +142006 -1.000000 +142007 -1.000000 +142008 -1.000000 +142009 -1.000000 +142010 -1.000000 +142011 -1.000000 +142012 -1.000000 +142013 -1.000000 +142014 -1.000000 +142015 -1.000000 +142016 -1.000000 +142017 -1.000000 +142018 -1.000000 +142019 -1.000000 +142020 -1.000000 +142021 -1.000000 +142022 -1.000000 +142023 -1.000000 +142024 -1.000000 +142025 -1.000000 +142026 -1.000000 +142027 -1.000000 +142028 -1.000000 +142029 -1.000000 +142030 -1.000000 +142031 -1.000000 +142034 -1.000000 +142035 -1.000000 +142038 -1.000000 +142045 -1.000000 +142046 -1.000000 +142047 -1.000000 +142049 -1.000000 +142051 -1.000000 +142052 -1.000000 +142053 -1.000000 +142054 -1.000000 +142055 -1.000000 +142056 -1.000000 +142057 -1.000000 +142062 -1.000000 +142063 -1.000000 +142065 -1.000000 +142066 -1.000000 +142070 -1.000000 +142071 -1.000000 +142073 -1.000000 +142074 -1.000000 +142075 -1.000000 +142077 -1.000000 +142078 -1.000000 +142079 -1.000000 +142080 -1.000000 +142081 -1.000000 +142082 -1.000000 +142083 -1.000000 +142084 -1.000000 +142085 -1.000000 +142087 -1.000000 +142088 -1.000000 +142091 -1.000000 +142092 -1.000000 +142093 -1.000000 +142094 -1.000000 +142095 -1.000000 +142096 -1.000000 +142097 -1.000000 +142098 -1.000000 +142099 -1.000000 +142104 -1.000000 +142105 -1.000000 +142106 -1.000000 +142107 -1.000000 +142108 -1.000000 +142109 -1.000000 +142110 -1.000000 +142111 -1.000000 +142112 -1.000000 +142114 -1.000000 +142115 -1.000000 +142117 -1.000000 +142118 -1.000000 +142119 -1.000000 +142120 -1.000000 +142121 -1.000000 +142122 -1.000000 +142123 -1.000000 +142124 -1.000000 +142125 -1.000000 +142126 -1.000000 +142128 -1.000000 +142129 -1.000000 +142130 -1.000000 +142131 -1.000000 +142132 -1.000000 +142135 -1.000000 +142136 -1.000000 +142137 -1.000000 +142145 -1.000000 +142146 -1.000000 +142148 -1.000000 +142150 -1.000000 +142152 -1.000000 +142154 -1.000000 +142156 -1.000000 +142158 -1.000000 +142160 -1.000000 +142162 -1.000000 +142164 -1.000000 +142168 -1.000000 +142169 -1.000000 +142171 -1.000000 +142172 -1.000000 +142173 -1.000000 +142174 -1.000000 +142175 -1.000000 +142176 -1.000000 +142177 -1.000000 +142178 -1.000000 +142179 -1.000000 +142180 -1.000000 +142181 -1.000000 +142182 -1.000000 +142183 -1.000000 +142184 -1.000000 +142185 -1.000000 +142186 -1.000000 +142187 -1.000000 +142188 -1.000000 +142189 -1.000000 +142190 -1.000000 +142191 -1.000000 +142192 -1.000000 +142193 -1.000000 +142194 -1.000000 +142195 -1.000000 +142196 -1.000000 +142197 -1.000000 +142198 -1.000000 +142203 -1.000000 +142204 -1.000000 +142206 -1.000000 +142207 -1.000000 +142208 -1.000000 +142209 -1.000000 +142211 -1.000000 +142212 -1.000000 +142213 -1.000000 +142214 -1.000000 +142215 -1.000000 +142216 -1.000000 +142217 -1.000000 +142218 -1.000000 +142223 -1.000000 +142224 -1.000000 +142231 -1.000000 +142236 -1.000000 +142240 -1.000000 +142245 -1.000000 +142246 -1.000000 +142247 -1.000000 +142248 -1.000000 +142249 -1.000000 +142254 -1.000000 +142256 -1.000000 +142259 -1.000000 +142261 -1.000000 +142264 -1.000000 +142265 -1.000000 +142266 -1.000000 +142267 -1.000000 +142268 -1.000000 +142269 -1.000000 +142270 -1.000000 +142272 -1.000000 +142273 -1.000000 +142274 -1.000000 +142275 -1.000000 +142276 -1.000000 +142282 -1.000000 +142283 -1.000000 +142284 -1.000000 +142285 -1.000000 +142286 -1.000000 +142287 -1.000000 +142288 -1.000000 +142289 -1.000000 +142290 -1.000000 +142292 -1.000000 +142293 -1.000000 +142294 -1.000000 +142295 -1.000000 +142301 -1.000000 +142302 -1.000000 +142303 -1.000000 +142304 -1.000000 +142305 -1.000000 +142306 -1.000000 +142307 -1.000000 +142308 -1.000000 +142309 -1.000000 +142310 -1.000000 +142311 -1.000000 +142312 -1.000000 +142313 -1.000000 +142314 -1.000000 +142315 -1.000000 +142316 -1.000000 +142317 -1.000000 +142319 -1.000000 +142320 -1.000000 +142321 -1.000000 +142322 -1.000000 +142323 -1.000000 +142324 -1.000000 +142325 -1.000000 +142326 -1.000000 +142327 -1.000000 +142328 -1.000000 +142329 -1.000000 +142330 -1.000000 +142331 -1.000000 +142332 -1.000000 +142333 -1.000000 +142334 -1.000000 +142335 -1.000000 +142336 -1.000000 +142337 -1.000000 +142338 -1.000000 +142339 -1.000000 +142340 -1.000000 +142341 -1.000000 +142342 -1.000000 +142343 -1.000000 +142344 -1.000000 +142345 -1.000000 +142346 -1.000000 +142347 -1.000000 +142348 -1.000000 +142349 -1.000000 +142351 -1.000000 +142355 -1.000000 +142356 -1.000000 +142357 -1.000000 +142358 -1.000000 +142359 -1.000000 +142360 -1.000000 +142361 -1.000000 +142362 -1.000000 +142363 -1.000000 +142364 -1.000000 +142365 -1.000000 +142366 -1.000000 +142367 -1.000000 +142368 -1.000000 +142369 -1.000000 +142370 -1.000000 +142371 -1.000000 +142372 -1.000000 +142373 -1.000000 +142374 -1.000000 +142375 -1.000000 +142376 -1.000000 +142377 -1.000000 +142378 -1.000000 +142379 -1.000000 +142380 -1.000000 +142381 -1.000000 +142382 -1.000000 +142383 -1.000000 +142385 -1.000000 +142386 -1.000000 +142387 -1.000000 +142388 -1.000000 +142389 -1.000000 +142390 -1.000000 +142391 -1.000000 +142392 -1.000000 +142393 -1.000000 +142394 -1.000000 +142395 -1.000000 +142396 -1.000000 +142397 -1.000000 +142398 -1.000000 +142399 -1.000000 +142400 -1.000000 +142401 -1.000000 +142402 -1.000000 +142403 -1.000000 +142404 -1.000000 +142405 -1.000000 +142406 -1.000000 +142409 -1.000000 +142411 -1.000000 +142413 -1.000000 +142414 -1.000000 +142416 -1.000000 +142419 -1.000000 +142421 -1.000000 +142422 -1.000000 +142423 -1.000000 +142425 -1.000000 +142426 -1.000000 +142427 -1.000000 +142428 -1.000000 +142429 -1.000000 +142430 -1.000000 +142431 -1.000000 +142433 -1.000000 +142434 -1.000000 +142435 -1.000000 +142436 -1.000000 +142437 -1.000000 +142438 -1.000000 +142439 -1.000000 +142440 -1.000000 +142441 -1.000000 +142442 -1.000000 +142443 -1.000000 +142444 -1.000000 +142445 -1.000000 +142446 -1.000000 +142447 -1.000000 +142448 -1.000000 +142449 -1.000000 +142450 -1.000000 +142451 -1.000000 +142452 -1.000000 +142453 -1.000000 +142454 -1.000000 +142455 -1.000000 +142456 -1.000000 +142457 -1.000000 +142460 -1.000000 +142462 -1.000000 +142463 -1.000000 +142467 -1.000000 +142473 -1.000000 +142475 -1.000000 +142476 -1.000000 +142477 -1.000000 +142478 -1.000000 +142479 -1.000000 +142480 -1.000000 +142481 -1.000000 +142483 -1.000000 +142484 -1.000000 +142485 -1.000000 +142486 -1.000000 +142487 -1.000000 +142489 -1.000000 +142580 -1.000000 +142581 -1.000000 +142582 -1.000000 +142583 -1.000000 +142584 -1.000000 +142585 -1.000000 +142586 -1.000000 +142590 -1.000000 +142591 -1.000000 +142592 -1.000000 +142593 -1.000000 +142594 -1.000000 +142596 -1.000000 +142598 -1.000000 +142599 -1.000000 +142600 -1.000000 +142601 -1.000000 +142602 -1.000000 +142603 -1.000000 +142604 -1.000000 +142605 -1.000000 +142606 -1.000000 +142615 -1.000000 +142616 -1.000000 +142619 -1.000000 +142625 -1.000000 +142626 -1.000000 +142627 -1.000000 +142628 -1.000000 +142629 -1.000000 +142631 -1.000000 +142632 -1.000000 +142634 -1.000000 +142636 -1.000000 +142637 -1.000000 +142638 -1.000000 +142639 -1.000000 +142640 -1.000000 +142641 -1.000000 +142642 -1.000000 +142643 -1.000000 +142644 -1.000000 +142645 -1.000000 +142650 -1.000000 +142651 -1.000000 +142652 -1.000000 +142654 -1.000000 +142655 -1.000000 +142660 -1.000000 +142663 -1.000000 +142665 -1.000000 +142666 -1.000000 +142668 -1.000000 +142670 -1.000000 +142671 -1.000000 +142672 -1.000000 +142676 -1.000000 +142677 -1.000000 +142679 -1.000000 +142680 -1.000000 +142681 -1.000000 +142682 -1.000000 +142683 -1.000000 +142684 -1.000000 +142685 -1.000000 +142686 -1.000000 +142688 -1.000000 +142697 -1.000000 +142698 -1.000000 +142704 -1.000000 +142705 -1.000000 +142709 -1.000000 +142710 -1.000000 +142712 -1.000000 +142713 -1.000000 +142714 -1.000000 +142715 -1.000000 +142717 -1.000000 +142718 -1.000000 +142720 -1.000000 +142722 -1.000000 +142723 -1.000000 +142724 -1.000000 +142725 -1.000000 +142726 -1.000000 +142728 -1.000000 +142732 -1.000000 +142757 -1.000000 +142761 -1.000000 +142762 -1.000000 +142763 -1.000000 +142766 -1.000000 +142768 -1.000000 +142769 -1.000000 +142773 -1.000000 +142774 -1.000000 +142776 -1.000000 +142777 -1.000000 +142778 -1.000000 +142779 -1.000000 +142782 -1.000000 +142783 -1.000000 +142786 -1.000000 +142787 -1.000000 +142790 -1.000000 +142791 -1.000000 +142792 -1.000000 +142794 -1.000000 +142795 -1.000000 +142796 -1.000000 +142797 -1.000000 +142798 -1.000000 +142799 -1.000000 +142800 -1.000000 +142801 -1.000000 +142802 -1.000000 +142803 -1.000000 +142804 -1.000000 +142806 -1.000000 +142808 -1.000000 +142809 -1.000000 +142810 -1.000000 +142811 -1.000000 +142812 -1.000000 +142813 -1.000000 +142814 -1.000000 +142815 -1.000000 +142816 -1.000000 +142817 -1.000000 +142818 -1.000000 +142819 -1.000000 +142820 -1.000000 +142822 -1.000000 +142823 -1.000000 +142824 -1.000000 +142825 -1.000000 +142826 -1.000000 +142827 -1.000000 +142828 -1.000000 +142829 -1.000000 +142830 -1.000000 +142831 -1.000000 +142832 -1.000000 +142833 -1.000000 +142834 -1.000000 +142835 -1.000000 +142836 -1.000000 +142837 -1.000000 +142838 -1.000000 +142839 -1.000000 +142861 -1.000000 +142862 -1.000000 +142863 -1.000000 +142864 -1.000000 +142865 -1.000000 +142866 -1.000000 +142867 -1.000000 +142868 -1.000000 +142869 -1.000000 +142870 -1.000000 +142871 -1.000000 +142874 -1.000000 +142878 -1.000000 +142880 -1.000000 +142881 -1.000000 +142882 -1.000000 +142891 -1.000000 +142892 -1.000000 +142893 -1.000000 +142894 -1.000000 +142895 -1.000000 +142896 -1.000000 +142897 -1.000000 +142898 -1.000000 +142899 -1.000000 +142900 -1.000000 +142901 -1.000000 +142902 -1.000000 +142903 -1.000000 +142904 -1.000000 +142905 -1.000000 +142906 -1.000000 +142907 -1.000000 +142908 -1.000000 +142909 -1.000000 +142910 -1.000000 +142911 -1.000000 +142912 -1.000000 +142918 -1.000000 +142919 -1.000000 +142920 -1.000000 +142921 -1.000000 +142922 -1.000000 +142923 -1.000000 +142924 -1.000000 +142925 -1.000000 +142926 -1.000000 +142927 -1.000000 +142928 -1.000000 +143703 -1.000000 +143704 -1.000000 +143705 -1.000000 +143708 -1.000000 +143709 -1.000000 +143713 -1.000000 +143714 -1.000000 +143715 -1.000000 +143716 -1.000000 +143717 -1.000000 +143718 -1.000000 +143719 -1.000000 +143720 -1.000000 +143721 -1.000000 +143724 -1.000000 +143725 -1.000000 +143726 -1.000000 +143727 -1.000000 +143728 -1.000000 +143729 -1.000000 +143730 -1.000000 +143731 -1.000000 +143732 -1.000000 +143733 -1.000000 +143736 -1.000000 +143737 -1.000000 +143739 -1.000000 +143741 -1.000000 +143742 -1.000000 +143743 -1.000000 +143745 -1.000000 +143746 -1.000000 +143747 -1.000000 +143748 -1.000000 +143750 -1.000000 +143751 -1.000000 +143752 -1.000000 +143753 -1.000000 +143754 -1.000000 +143755 -1.000000 +143756 -1.000000 +143757 -1.000000 +143758 -1.000000 +143759 -1.000000 +143760 -1.000000 +143761 -1.000000 +143762 -1.000000 +143763 -1.000000 +143764 -1.000000 +143765 -1.000000 +143767 -1.000000 +143768 -1.000000 +143769 -1.000000 +143770 -1.000000 +143771 -1.000000 +143772 -1.000000 +143773 -1.000000 +143774 -1.000000 +143775 -1.000000 +143776 -1.000000 +143777 -1.000000 +143778 -1.000000 +143779 -1.000000 +143780 -1.000000 +143781 -1.000000 +143783 -1.000000 +143784 -1.000000 +143785 -1.000000 +143786 -1.000000 +143787 -1.000000 +143788 -1.000000 +143789 -1.000000 +143790 -1.000000 +143791 -1.000000 +143792 -1.000000 +143793 -1.000000 +143794 -1.000000 +143795 -1.000000 +143796 -1.000000 +143797 -1.000000 +143798 -1.000000 +143799 -1.000000 +143800 -1.000000 +143801 -1.000000 +143802 -1.000000 +143803 -1.000000 +143804 -1.000000 +143805 -1.000000 +143806 -1.000000 +143807 -1.000000 +143808 -1.000000 +143809 -1.000000 +143810 -1.000000 +143811 -1.000000 +143812 -1.000000 +143813 -1.000000 +143814 -1.000000 +143815 -1.000000 +143816 -1.000000 +143817 -1.000000 +143818 -1.000000 +143819 -1.000000 +143820 -1.000000 +143821 -1.000000 +143822 -1.000000 +143823 -1.000000 +143824 -1.000000 +143825 -1.000000 +143826 -1.000000 +143827 -1.000000 +143828 -1.000000 +143829 -1.000000 +143830 -1.000000 +143831 -1.000000 +143832 -1.000000 +143833 -1.000000 +143834 -1.000000 +143837 -1.000000 +143839 -1.000000 +143840 -1.000000 +143841 -1.000000 +143842 -1.000000 +143843 -1.000000 +143845 -1.000000 +143846 -1.000000 +143847 -1.000000 +143848 -1.000000 +143849 -1.000000 +143850 -1.000000 +143851 -1.000000 +143852 -1.000000 +143853 -1.000000 +143854 -1.000000 +143855 -1.000000 +143856 -1.000000 +143857 -1.000000 +143858 -1.000000 +143859 -1.000000 +143860 -1.000000 +143861 -1.000000 +143862 -1.000000 +143863 -1.000000 +143864 -1.000000 +143865 -1.000000 +143866 -1.000000 +143867 -1.000000 +143868 -1.000000 +143869 -1.000000 +143870 -1.000000 +143871 -1.000000 +143872 -1.000000 +143873 -1.000000 +143875 -1.000000 +143876 -1.000000 +143877 -1.000000 +143880 -1.000000 +143881 -1.000000 +143884 -1.000000 +143885 -1.000000 +143887 -1.000000 +143889 -1.000000 +143890 -1.000000 +143891 -1.000000 +143892 -1.000000 +143893 -1.000000 +143894 -1.000000 +143897 -1.000000 +143898 -1.000000 +143899 -1.000000 +143900 -1.000000 +143901 -1.000000 +143902 -1.000000 +143903 -1.000000 +143904 -1.000000 +143905 -1.000000 +143906 -1.000000 +143907 -1.000000 +143908 -1.000000 +143909 -1.000000 +143910 -1.000000 +143911 -1.000000 +143912 -1.000000 +143913 -1.000000 +143914 -1.000000 +143915 -1.000000 +143916 -1.000000 +143917 -1.000000 +143918 -1.000000 +143919 -1.000000 +143920 -1.000000 +143921 -1.000000 +143922 -1.000000 +143923 -1.000000 +143924 -1.000000 +143925 -1.000000 +143926 -1.000000 +143927 -1.000000 +143928 -1.000000 +143929 -1.000000 +143930 -1.000000 +143931 -1.000000 +143932 -1.000000 +143933 -1.000000 +143934 -1.000000 +143935 -1.000000 +143936 -1.000000 +143937 -1.000000 +143938 -1.000000 +143939 -1.000000 +143940 -1.000000 +143941 -1.000000 +143967 -1.000000 +143968 -1.000000 +143972 -1.000000 +143973 -1.000000 +143976 -1.000000 +143977 -1.000000 +143978 -1.000000 +143979 -1.000000 +143980 -1.000000 +143981 -1.000000 +143982 -1.000000 +143983 -1.000000 +143984 -1.000000 +143988 -1.000000 +143998 -1.000000 +144000 -1.000000 +144001 -1.000000 +144004 -1.000000 +144005 -1.000000 +144011 -1.000000 +144012 -1.000000 +144013 -1.000000 +144014 -1.000000 +144015 -1.000000 +144020 -1.000000 +144022 -1.000000 +144026 -1.000000 +144027 -1.000000 +144028 -1.000000 +144029 -1.000000 +144030 -1.000000 +144033 -1.000000 +144034 -1.000000 +144035 -1.000000 +144036 -1.000000 +144037 -1.000000 +144038 -1.000000 +144039 -1.000000 +144040 -1.000000 +144057 -1.000000 +144058 -1.000000 +144059 -1.000000 +144061 -1.000000 +144062 -1.000000 +144065 -1.000000 +144073 -1.000000 +144074 -1.000000 +144075 -1.000000 +144076 -1.000000 +144077 -1.000000 +144078 -1.000000 +144079 -1.000000 +144080 -1.000000 +144083 -1.000000 +144084 -1.000000 +144085 -1.000000 +144086 -1.000000 +144087 -1.000000 +144088 -1.000000 +144093 -1.000000 +144094 -1.000000 +144095 -1.000000 +144097 -1.000000 +144101 -1.000000 +144102 -1.000000 +144104 -1.000000 +144105 -1.000000 +144106 -1.000000 +144107 -1.000000 +144108 -1.000000 +144109 -1.000000 +144110 -1.000000 +144115 -1.000000 +144116 -1.000000 +144117 -1.000000 +144118 -1.000000 +144119 -1.000000 +144120 -1.000000 +144121 -1.000000 +144122 -1.000000 +144123 -1.000000 +144124 -1.000000 +144125 -1.000000 +144126 -1.000000 +144127 -1.000000 +144128 -1.000000 +144129 -1.000000 +144130 -1.000000 +144131 -1.000000 +144132 -1.000000 +144135 -1.000000 +144136 -1.000000 +144137 -1.000000 +144141 -1.000000 +144142 -1.000000 +144143 -1.000000 +144144 -1.000000 +144145 -1.000000 +144146 -1.000000 +144147 -1.000000 +144149 -1.000000 +144150 -1.000000 +144151 -1.000000 +144152 -1.000000 +144153 -1.000000 +144154 -1.000000 +144155 -1.000000 +144156 -1.000000 +144160 -1.000000 +144161 -1.000000 +144162 -1.000000 +144163 -1.000000 +144166 -1.000000 +144167 -1.000000 +144169 -1.000000 +144171 -1.000000 +144174 -1.000000 +144183 -1.000000 +144185 -1.000000 +144186 -1.000000 +144188 -1.000000 +144192 -1.000000 +144197 -1.000000 +144198 -1.000000 +144199 -1.000000 +144201 -1.000000 +144202 -1.000000 +144203 -1.000000 +144205 -1.000000 +144206 -1.000000 +144208 -1.000000 +144211 -1.000000 +144213 -1.000000 +144214 -1.000000 +144216 -1.000000 +144223 -1.000000 +144224 -1.000000 +144225 -1.000000 +144226 -1.000000 +144227 -1.000000 +144228 -1.000000 +144229 -1.000000 +144230 -1.000000 +144231 -1.000000 +144232 -1.000000 +144233 -1.000000 +144234 -1.000000 +144236 -1.000000 +144237 -1.000000 +144238 -1.000000 +144239 -1.000000 +144240 -1.000000 +144241 -1.000000 +144242 -1.000000 +144243 -1.000000 +144244 -1.000000 +144245 -1.000000 +144246 -1.000000 +144247 -1.000000 +144248 -1.000000 +144249 -1.000000 +144250 -1.000000 +144251 -1.000000 +144252 -1.000000 +144253 -1.000000 +144254 -1.000000 +144255 -1.000000 +144256 -1.000000 +144261 -1.000000 +144263 -1.000000 +144264 -1.000000 +144265 -1.000000 +144266 -1.000000 +144267 -1.000000 +144268 -1.000000 +144269 -1.000000 +144270 -1.000000 +144271 -1.000000 +144272 -1.000000 +144273 -1.000000 +144274 -1.000000 +144275 -1.000000 +144278 -1.000000 +144279 -1.000000 +144280 -1.000000 +144281 -1.000000 +144282 -1.000000 +144283 -1.000000 +144284 -1.000000 +144285 -1.000000 +144286 -1.000000 +144287 -1.000000 +144288 -1.000000 +144289 -1.000000 +144290 -1.000000 +144291 -1.000000 +144298 -1.000000 +144299 -1.000000 +144300 -1.000000 +144301 -1.000000 +144302 -1.000000 +144303 -1.000000 +144304 -1.000000 +144305 -1.000000 +144306 -1.000000 +144307 -1.000000 +144308 -1.000000 +144309 -1.000000 +144310 -1.000000 +144311 -1.000000 +144313 -1.000000 +144314 -1.000000 +144315 -1.000000 +144316 -1.000000 +144317 -1.000000 +144318 -1.000000 +144319 -1.000000 +144320 -1.000000 +144321 -1.000000 +144322 -1.000000 +144323 -1.000000 +144331 -1.000000 +144332 -1.000000 +144333 -1.000000 +144334 -1.000000 +144335 -1.000000 +144336 -1.000000 +144337 -1.000000 +144338 -1.000000 +144340 -1.000000 +144341 -1.000000 +144342 -1.000000 +144343 -1.000000 +144344 -1.000000 +144345 -1.000000 +144346 -1.000000 +144347 -1.000000 +144348 -1.000000 +144349 -1.000000 +144350 -1.000000 +144351 -1.000000 +144352 -1.000000 +144353 -1.000000 +144354 -1.000000 +144356 -1.000000 +144357 -1.000000 +144358 -1.000000 +144359 -1.000000 +144360 -1.000000 +144361 -1.000000 +144365 -1.000000 +144366 -1.000000 +144367 -1.000000 +144368 -1.000000 +144372 -1.000000 +144373 -1.000000 +144374 -1.000000 +144376 -1.000000 +144377 -1.000000 +144378 -1.000000 +144380 -1.000000 +144383 -1.000000 +144389 -1.000000 +144392 -1.000000 +144393 -1.000000 +144405 -1.000000 +144406 -1.000000 +144408 -1.000000 +144409 -1.000000 +144410 -1.000000 +144412 -1.000000 +144413 -1.000000 +144414 -1.000000 +144415 -1.000000 +144416 -1.000000 +144417 -1.000000 +144418 -1.000000 +144419 -1.000000 +144420 -1.000000 +144424 -1.000000 +144426 -1.000000 +144431 -1.000000 +144443 -1.000000 +144444 -1.000000 +144445 -1.000000 +144446 -1.000000 +144448 -1.000000 +144449 -1.000000 +144450 -1.000000 +144451 -1.000000 +144452 -1.000000 +144453 -1.000000 +144454 -1.000000 +144455 -1.000000 +144456 -1.000000 +144457 -1.000000 +144461 -1.000000 +144462 -1.000000 +144463 -1.000000 +144464 -1.000000 +144465 -1.000000 +144466 -1.000000 +144467 -1.000000 +144468 -1.000000 +144469 -1.000000 +144470 -1.000000 +144471 -1.000000 +144472 -1.000000 +144473 -1.000000 +144474 -1.000000 +144475 -1.000000 +144476 -1.000000 +144477 -1.000000 +144478 -1.000000 +144479 -1.000000 +144480 -1.000000 +144481 -1.000000 +144482 -1.000000 +144483 -1.000000 +144484 -1.000000 +144485 -1.000000 +144486 -1.000000 +144487 -1.000000 +144488 -1.000000 +144489 -1.000000 +144490 -1.000000 +144491 -1.000000 +144492 -1.000000 +144506 -1.000000 +144507 -1.000000 +144508 -1.000000 +144510 -1.000000 +144511 -1.000000 +144512 -1.000000 +144513 -1.000000 +144514 -1.000000 +144516 -1.000000 +144518 -1.000000 +144519 -1.000000 +144522 -1.000000 +144523 -1.000000 +144528 -1.000000 +144529 -1.000000 +144533 -1.000000 +144536 -1.000000 +144546 -1.000000 +144547 -1.000000 +144549 -1.000000 +144550 -1.000000 +144552 -1.000000 +144554 -1.000000 +144557 -1.000000 +144558 -1.000000 +144565 -1.000000 +144566 -1.000000 +144567 -1.000000 +144568 -1.000000 +144569 -1.000000 +144570 -1.000000 +144571 -1.000000 +144572 -1.000000 +144573 -1.000000 +144574 -1.000000 +144575 -1.000000 +144576 -1.000000 +144577 -1.000000 +144578 -1.000000 +144579 -1.000000 +144673 -1.000000 +144678 -1.000000 +144684 -1.000000 +144688 -1.000000 +144693 -1.000000 +144702 -1.000000 +144703 -1.000000 +144709 -1.000000 +144712 -1.000000 +144714 -1.000000 +144715 -1.000000 +144716 -1.000000 +144717 -1.000000 +144718 -1.000000 +144719 -1.000000 +144720 -1.000000 +144721 -1.000000 +144723 -1.000000 +144724 -1.000000 +144727 -1.000000 +144729 -1.000000 +144730 -1.000000 +144735 -1.000000 +144737 -1.000000 +144739 -1.000000 +144740 -1.000000 +144742 -1.000000 +144743 -1.000000 +144744 -1.000000 +144745 -1.000000 +144746 -1.000000 +144747 -1.000000 +144748 -1.000000 +144749 -1.000000 +144750 -1.000000 +144751 -1.000000 +144752 -1.000000 +144753 -1.000000 +144754 -1.000000 +144757 -1.000000 +144762 -1.000000 +144765 -1.000000 +144768 -1.000000 +144770 -1.000000 +144771 -1.000000 +144773 -1.000000 +144774 -1.000000 +144778 -1.000000 +144781 -1.000000 +144782 -1.000000 +144784 -1.000000 +144786 -1.000000 +144787 -1.000000 +144788 -1.000000 +144789 -1.000000 +144790 -1.000000 +144791 -1.000000 +144800 -1.000000 +144801 -1.000000 +144802 -1.000000 +144804 -1.000000 +144807 -1.000000 +144810 -1.000000 +144816 -1.000000 +144818 -1.000000 +144830 -1.000000 +144853 -1.000000 +144854 -1.000000 +144855 -1.000000 +144856 -1.000000 +144857 -1.000000 +144858 -1.000000 +144859 -1.000000 +144860 -1.000000 +144863 -1.000000 +144864 -1.000000 +144865 -1.000000 +144866 -1.000000 +144867 -1.000000 +144868 -1.000000 +144869 -1.000000 +144870 -1.000000 +144871 -1.000000 +144872 -1.000000 +144873 -1.000000 +144883 -1.000000 +144884 -1.000000 +144885 -1.000000 +144886 -1.000000 +144887 -1.000000 +144888 -1.000000 +144889 -1.000000 +144890 -1.000000 +144891 -1.000000 +144892 -1.000000 +144893 -1.000000 +144895 -1.000000 +144899 -1.000000 +144902 -1.000000 +144903 -1.000000 +144907 -1.000000 +144908 -1.000000 +144912 -1.000000 +144913 -1.000000 +144914 -1.000000 +144915 -1.000000 +144916 -1.000000 +144917 -1.000000 +144918 -1.000000 +144919 -1.000000 +144920 -1.000000 +144921 -1.000000 +144922 -1.000000 +144923 -1.000000 +144925 -1.000000 +144926 -1.000000 +144927 -1.000000 +144928 -1.000000 +144929 -1.000000 +144930 -1.000000 +144933 -1.000000 +144934 -1.000000 +144935 -1.000000 +144936 -1.000000 +144937 -1.000000 +144938 -1.000000 +144939 -1.000000 +144940 -1.000000 +144941 -1.000000 +144942 -1.000000 +144943 -1.000000 +144944 -1.000000 +144945 -1.000000 +144946 -1.000000 +144947 -1.000000 +144948 -1.000000 +144949 -1.000000 +144950 -1.000000 +144951 -1.000000 +144952 -1.000000 +144953 -1.000000 +144954 -1.000000 +144956 -1.000000 +144958 -1.000000 +144959 -1.000000 +144960 -1.000000 +144961 -1.000000 +144963 -1.000000 +144964 -1.000000 +144973 -1.000000 +144974 -1.000000 +144975 -1.000000 +144976 -1.000000 +144977 -1.000000 +144978 -1.000000 +144979 -1.000000 +144980 -1.000000 +144981 -1.000000 +144983 -1.000000 +144984 -1.000000 +144985 -1.000000 +144986 -1.000000 +144987 -1.000000 +144988 -1.000000 +144989 -1.000000 +144990 -1.000000 +144991 -1.000000 +144992 -1.000000 +144993 -1.000000 +145000 -1.000000 +145001 -1.000000 +145002 -1.000000 +145008 -1.000000 +145012 -1.000000 +145024 -1.000000 +145025 -1.000000 +145028 -1.000000 +145030 -1.000000 +145035 -1.000000 +145038 -1.000000 +145039 -1.000000 +145041 -1.000000 +145042 -1.000000 +145043 -1.000000 +145044 -1.000000 +145045 -1.000000 +145046 -1.000000 +145047 -1.000000 +145048 -1.000000 +145049 -1.000000 +145051 -1.000000 +145052 -1.000000 +145053 -1.000000 +145054 -1.000000 +145055 -1.000000 +145056 -1.000000 +145057 -1.000000 +145058 -1.000000 +145059 -1.000000 +145060 -1.000000 +145061 -1.000000 +145063 -1.000000 +145065 -1.000000 +145066 -1.000000 +145067 -1.000000 +145069 -1.000000 +145072 -1.000000 +145073 -1.000000 +145074 -1.000000 +145076 -1.000000 +145077 -1.000000 +145079 -1.000000 +145082 -1.000000 +145083 -1.000000 +145085 -1.000000 +145086 -1.000000 +145088 -1.000000 +145091 -1.000000 +145093 -1.000000 +145094 -1.000000 +145098 -1.000000 +145102 -1.000000 +145103 -1.000000 +145104 -1.000000 +145105 -1.000000 +145106 -1.000000 +145107 -1.000000 +145110 -1.000000 +145111 -1.000000 +145117 -1.000000 +145123 -1.000000 +145125 -1.000000 +145137 -1.000000 +145138 -1.000000 +145140 -1.000000 +145142 -1.000000 +145143 -1.000000 +145145 -1.000000 +145146 -1.000000 +145147 -1.000000 +145148 -1.000000 +145149 -1.000000 +145157 -1.000000 +145161 -1.000000 +145162 -1.000000 +145166 -1.000000 +145167 -1.000000 +145170 -1.000000 +145171 -1.000000 +145172 -1.000000 +145173 -1.000000 +145174 -1.000000 +145175 -1.000000 +145176 -1.000000 +145177 -1.000000 +145178 -1.000000 +145179 -1.000000 +145180 -1.000000 +145181 -1.000000 +145182 -1.000000 +145183 -1.000000 +145184 -1.000000 +145185 -1.000000 +145186 -1.000000 +145187 -1.000000 +145188 -1.000000 +145189 -1.000000 +145190 -1.000000 +145191 -1.000000 +145192 -1.000000 +145193 -1.000000 +145194 -1.000000 +145195 -1.000000 +145196 -1.000000 +145197 -1.000000 +145198 -1.000000 +145199 -1.000000 +145200 -1.000000 +145201 -1.000000 +145202 -1.000000 +145203 -1.000000 +145205 -1.000000 +145206 -1.000000 +145207 -1.000000 +145208 -1.000000 +145209 -1.000000 +145214 -1.000000 +145215 -1.000000 +145216 -1.000000 +145217 -1.000000 +145218 -1.000000 +145219 -1.000000 +145220 -1.000000 +145221 -1.000000 +145222 -1.000000 +145223 -1.000000 +145224 -1.000000 +145225 -1.000000 +145226 -1.000000 +145227 -1.000000 +145228 -1.000000 +145229 -1.000000 +145230 -1.000000 +145231 -1.000000 +145232 -1.000000 +145233 -1.000000 +145234 -1.000000 +145236 -1.000000 +145241 -1.000000 +145242 -1.000000 +145243 -1.000000 +145245 -1.000000 +145296 -1.000000 +145298 -1.000000 +145299 -1.000000 +145300 -1.000000 +145302 -1.000000 +145303 -1.000000 +145305 -1.000000 +145306 -1.000000 +145307 -1.000000 +145308 -1.000000 +145309 -1.000000 +145310 -1.000000 +145311 -1.000000 +145312 -1.000000 +145313 -1.000000 +145314 -1.000000 +145315 -1.000000 +145316 -1.000000 +145317 -1.000000 +145318 -1.000000 +145319 -1.000000 +145322 -1.000000 +145323 -1.000000 +145324 -1.000000 +145329 -1.000000 +145332 -1.000000 +145333 -1.000000 +145334 -1.000000 +145339 -1.000000 +145344 -1.000000 +145346 -1.000000 +145349 -1.000000 +145350 -1.000000 +145352 -1.000000 +145354 -1.000000 +145355 -1.000000 +145356 -1.000000 +145357 -1.000000 +145358 -1.000000 +145359 -1.000000 +145360 -1.000000 +145361 -1.000000 +145362 -1.000000 +145364 -1.000000 +145371 -1.000000 +145389 -1.000000 +145393 -1.000000 +145394 -1.000000 +145395 -1.000000 +145405 -1.000000 +145414 -1.000000 +145418 -1.000000 +145423 -1.000000 +145424 -1.000000 +145433 -1.000000 +145434 -1.000000 +145435 -1.000000 +145436 -1.000000 +145437 -1.000000 +145438 -1.000000 +145439 -1.000000 +145440 -1.000000 +145441 -1.000000 +145442 -1.000000 +145444 -1.000000 +145445 -1.000000 +145446 -1.000000 +145447 -1.000000 +145448 -1.000000 +145449 -1.000000 +145451 -1.000000 +145452 -1.000000 +145453 -1.000000 +145455 -1.000000 +145456 -1.000000 +145457 -1.000000 +145458 -1.000000 +145459 -1.000000 +145460 -1.000000 +145461 -1.000000 +145462 -1.000000 +145463 -1.000000 +145465 -1.000000 +145466 -1.000000 +145468 -1.000000 +145470 -1.000000 +145471 -1.000000 +145472 -1.000000 +145473 -1.000000 +145474 -1.000000 +145477 -1.000000 +145478 -1.000000 +145482 -1.000000 +145485 -1.000000 +145487 -1.000000 +145488 -1.000000 +145489 -1.000000 +145492 -1.000000 +145494 -1.000000 +145499 -1.000000 +145512 -1.000000 +145513 -1.000000 +145520 -1.000000 +145521 -1.000000 +145523 -1.000000 +145524 -1.000000 +145530 -1.000000 +145542 -1.000000 +145545 -1.000000 +145546 -1.000000 +145551 -1.000000 +145552 -1.000000 +145553 -1.000000 +145555 -1.000000 +145556 -1.000000 +145557 -1.000000 +145558 -1.000000 +145560 -1.000000 +145561 -1.000000 +145567 -1.000000 +145568 -1.000000 +145569 -1.000000 +145570 -1.000000 +145575 -1.000000 +145577 -1.000000 +145582 -1.000000 +145583 -1.000000 +145586 -1.000000 +145587 -1.000000 +145598 -1.000000 +145599 -1.000000 +145633 -1.000000 +145635 -1.000000 +145643 -1.000000 +145664 -1.000000 +145667 -1.000000 +145668 -1.000000 +145669 -1.000000 +145670 -1.000000 +145671 -1.000000 +145672 -1.000000 +145673 -1.000000 +145674 -1.000000 +145675 -1.000000 +145676 -1.000000 +145677 -1.000000 +145678 -1.000000 +145679 -1.000000 +145680 -1.000000 +145683 -1.000000 +145684 -1.000000 +145685 -1.000000 +145686 -1.000000 +145687 -1.000000 +145690 -1.000000 +145692 -1.000000 +145698 -1.000000 +145699 -1.000000 +145700 -1.000000 +145701 -1.000000 +145702 -1.000000 +145703 -1.000000 +145705 -1.000000 +145706 -1.000000 +145707 -1.000000 +145708 -1.000000 +145709 -1.000000 +145710 -1.000000 +145711 -1.000000 +145712 -1.000000 +145713 -1.000000 +145714 -1.000000 +145715 -1.000000 +145717 -1.000000 +145718 -1.000000 +145720 -1.000000 +145722 -1.000000 +145723 -1.000000 +145724 -1.000000 +145725 -1.000000 +145726 -1.000000 +145727 -1.000000 +145728 -1.000000 +145729 -1.000000 +145730 -1.000000 +145731 -1.000000 +145732 -1.000000 +145733 -1.000000 +145736 -1.000000 +145737 -1.000000 +145738 -1.000000 +145739 -1.000000 +145740 -1.000000 +145741 -1.000000 +145742 -1.000000 +145743 -1.000000 +145744 -1.000000 +145745 -1.000000 +145746 -1.000000 +145747 -1.000000 +145749 -1.000000 +145750 -1.000000 +145751 -1.000000 +145752 -1.000000 +145753 -1.000000 +145754 -1.000000 +145755 -1.000000 +145756 -1.000000 +145757 -1.000000 +145758 -1.000000 +145759 -1.000000 +145760 -1.000000 +145761 -1.000000 +145762 -1.000000 +145764 -1.000000 +145765 -1.000000 +145776 -1.000000 +145777 -1.000000 +145778 -1.000000 +145779 -1.000000 +145780 -1.000000 +145781 -1.000000 +145782 -1.000000 +145783 -1.000000 +145785 -1.000000 +145786 -1.000000 +145787 -1.000000 +145788 -1.000000 +145789 -1.000000 +145790 -1.000000 +145791 -1.000000 +145793 -1.000000 +145794 -1.000000 +145795 -1.000000 +145796 -1.000000 +145797 -1.000000 +145798 -1.000000 +145799 -1.000000 +145800 -1.000000 +145801 -1.000000 +145802 -1.000000 +145803 -1.000000 +145804 -1.000000 +145805 -1.000000 +145806 -1.000000 +145807 -1.000000 +145808 -1.000000 +145809 -1.000000 +145810 -1.000000 +145815 -1.000000 +145817 -1.000000 +145819 -1.000000 +145820 -1.000000 +145826 -1.000000 +145828 -1.000000 +145830 -1.000000 +145831 -1.000000 +145832 -1.000000 +145835 -1.000000 +145837 -1.000000 +145838 -1.000000 +145839 -1.000000 +145840 -1.000000 +145841 -1.000000 +145842 -1.000000 +145843 -1.000000 +145844 -1.000000 +145846 -1.000000 +145849 -1.000000 +145851 -1.000000 +145852 -1.000000 +145853 -1.000000 +145854 -1.000000 +145855 -1.000000 +145856 -1.000000 +145859 -1.000000 +145861 -1.000000 +145863 -1.000000 +145864 -1.000000 +145865 -1.000000 +145867 -1.000000 +145868 -1.000000 +145869 -1.000000 +145870 -1.000000 +145871 -1.000000 +145872 -1.000000 +145873 -1.000000 +145874 -1.000000 +145875 -1.000000 +145876 -1.000000 +145877 -1.000000 +145878 -1.000000 +145879 -1.000000 +145880 -1.000000 +145882 -1.000000 +145885 -1.000000 +145886 -1.000000 +145888 -1.000000 +145892 -1.000000 +145893 -1.000000 +145894 -1.000000 +145895 -1.000000 +145896 -1.000000 +145897 -1.000000 +145898 -1.000000 +145899 -1.000000 +145900 -1.000000 +145901 -1.000000 +145902 -1.000000 +145903 -1.000000 +145904 -1.000000 +145905 -1.000000 +145907 -1.000000 +145908 -1.000000 +145909 -1.000000 +145910 -1.000000 +145911 -1.000000 +145914 -1.000000 +145915 -1.000000 +145918 -1.000000 +145919 -1.000000 +145923 -1.000000 +145924 -1.000000 +145925 -1.000000 +145927 -1.000000 +145928 -1.000000 +145930 -1.000000 +145932 -1.000000 +145933 -1.000000 +145935 -1.000000 +145936 -1.000000 +145937 -1.000000 +145938 -1.000000 +145939 -1.000000 +145940 -1.000000 +145942 -1.000000 +145943 -1.000000 +145944 -1.000000 +145945 -1.000000 +145946 -1.000000 +145947 -1.000000 +145948 -1.000000 +145949 -1.000000 +145951 -1.000000 +145952 -1.000000 +145953 -1.000000 +145954 -1.000000 +145958 -1.000000 +145959 -1.000000 +145960 -1.000000 +145961 -1.000000 +145962 -1.000000 +145963 -1.000000 +145964 -1.000000 +145965 -1.000000 +145966 -1.000000 +145967 -1.000000 +145968 -1.000000 +145969 -1.000000 +145970 -1.000000 +145971 -1.000000 +145972 -1.000000 +145973 -1.000000 +145974 -1.000000 +145975 -1.000000 +145976 -1.000000 +145977 -1.000000 +145978 -1.000000 +145979 -1.000000 +145980 -1.000000 +145981 -1.000000 +145982 -1.000000 +145983 -1.000000 +145984 -1.000000 +145985 -1.000000 +145986 -1.000000 +145987 -1.000000 +145988 -1.000000 +145989 -1.000000 +145990 -1.000000 +145992 -1.000000 +145993 -1.000000 +145994 -1.000000 +145996 -1.000000 +145997 -1.000000 +145998 -1.000000 +146001 -1.000000 +146002 -1.000000 +146003 -1.000000 +146004 -1.000000 +146005 -1.000000 +146006 -1.000000 +146007 -1.000000 +146008 -1.000000 +146009 -1.000000 +146010 -1.000000 +146011 -1.000000 +146012 -1.000000 +146013 -1.000000 +146016 -1.000000 +146017 -1.000000 +146018 -1.000000 +146019 -1.000000 +146020 -1.000000 +146021 -1.000000 +146022 -1.000000 +146023 -1.000000 +146027 -1.000000 +146028 -1.000000 +146029 -1.000000 +146031 -1.000000 +146032 -1.000000 +146034 -1.000000 +146035 -1.000000 +146037 -1.000000 +146039 -1.000000 +146040 -1.000000 +146041 -1.000000 +146043 -1.000000 +146044 -1.000000 +146045 -1.000000 +146047 -1.000000 +146048 -1.000000 +146050 -1.000000 +146051 -1.000000 +146053 -1.000000 +146054 -1.000000 +146055 -1.000000 +146056 -1.000000 +146057 -1.000000 +146058 -1.000000 +146059 -1.000000 +146060 -1.000000 +146065 -1.000000 +146073 -1.000000 +146074 -1.000000 +146075 -1.000000 +146076 -1.000000 +146077 -1.000000 +146078 -1.000000 +146079 -1.000000 +146080 -1.000000 +146082 -1.000000 +146083 -1.000000 +146084 -1.000000 +146085 -1.000000 +146086 -1.000000 +146088 -1.000000 +146089 -1.000000 +146090 -1.000000 +146091 -1.000000 +146093 -1.000000 +146094 -1.000000 +146095 -1.000000 +146096 -1.000000 +146097 -1.000000 +146098 -1.000000 +146099 -1.000000 +146101 -1.000000 +146102 -1.000000 +146104 -1.000000 +146105 -1.000000 +146106 -1.000000 +146107 -1.000000 +146108 -1.000000 +146113 -1.000000 +146114 -1.000000 +146116 -1.000000 +146117 -1.000000 +146118 -1.000000 +146119 -1.000000 +146120 -1.000000 +146121 -1.000000 +146122 -1.000000 +146123 -1.000000 +146126 -1.000000 +146127 -1.000000 +146128 -1.000000 +146129 -1.000000 +146130 -1.000000 +146133 -1.000000 +146134 -1.000000 +146135 -1.000000 +146138 -1.000000 +146143 -1.000000 +146146 -1.000000 +146149 -1.000000 +146150 -1.000000 +146151 -1.000000 +146152 -1.000000 +146153 -1.000000 +146154 -1.000000 +146158 -1.000000 +146159 -1.000000 +146160 -1.000000 +146161 -1.000000 +146162 -1.000000 +146163 -1.000000 +146164 -1.000000 +146165 -1.000000 +146166 -1.000000 +146167 -1.000000 +146168 -1.000000 +146169 -1.000000 +146170 -1.000000 +146171 -1.000000 +146172 -1.000000 +146173 -1.000000 +146174 -1.000000 +146175 -1.000000 +146176 -1.000000 +146177 -1.000000 +146178 -1.000000 +146180 -1.000000 +146183 -1.000000 +146188 -1.000000 +146189 -1.000000 +146191 -1.000000 +146197 -1.000000 +146198 -1.000000 +146199 -1.000000 +146212 -1.000000 +146213 -1.000000 +146269 -1.000000 +146270 -1.000000 +146272 -1.000000 +146273 -1.000000 +146278 -1.000000 +146279 -1.000000 +146280 -1.000000 +146281 -1.000000 +146284 -1.000000 +146285 -1.000000 +146286 -1.000000 +146290 -1.000000 +146291 -1.000000 +146292 -1.000000 +146294 -1.000000 +146295 -1.000000 +146296 -1.000000 +146297 -1.000000 +146298 -1.000000 +146299 -1.000000 +146300 -1.000000 +146312 -1.000000 +146313 -1.000000 +146315 -1.000000 +146316 -1.000000 +146317 -1.000000 +146318 -1.000000 +146319 -1.000000 +146336 -1.000000 +146338 -1.000000 +146339 -1.000000 +146340 -1.000000 +146341 -1.000000 +146342 -1.000000 +146343 -1.000000 +146344 -1.000000 +146345 -1.000000 +146346 -1.000000 +146347 -1.000000 +146348 -1.000000 +146349 -1.000000 +146350 -1.000000 +146351 -1.000000 +146352 -1.000000 +146353 -1.000000 +146354 -1.000000 +146355 -1.000000 +146356 -1.000000 +146357 -1.000000 +146358 -1.000000 +146359 -1.000000 +146360 -1.000000 +146361 -1.000000 +146362 -1.000000 +146363 -1.000000 +146365 -1.000000 +146366 -1.000000 +146367 -1.000000 +146368 -1.000000 +146369 -1.000000 +146370 -1.000000 +146371 -1.000000 +146372 -1.000000 +146373 -1.000000 +146374 -1.000000 +146375 -1.000000 +146376 -1.000000 +146378 -1.000000 +146379 -1.000000 +146381 -1.000000 +146384 -1.000000 +146385 -1.000000 +146406 -1.000000 +146407 -1.000000 +146408 -1.000000 +146409 -1.000000 +146410 -1.000000 +146411 -1.000000 +146412 -1.000000 +146413 -1.000000 +146415 -1.000000 +146416 -1.000000 +146417 -1.000000 +146418 -1.000000 +146419 -1.000000 +146420 -1.000000 +146422 -1.000000 +146425 -1.000000 +146427 -1.000000 +146428 -1.000000 +146429 -1.000000 +146430 -1.000000 +146436 -1.000000 +146439 -1.000000 +146440 -1.000000 +146441 -1.000000 +146443 -1.000000 +146444 -1.000000 +146446 -1.000000 +146447 -1.000000 +146448 -1.000000 +146449 -1.000000 +146450 -1.000000 +146451 -1.000000 +146452 -1.000000 +146453 -1.000000 +146454 -1.000000 +146455 -1.000000 +146456 -1.000000 +146457 -1.000000 +146458 -1.000000 +146459 -1.000000 +146461 -1.000000 +146462 -1.000000 +146463 -1.000000 +146467 -1.000000 +146469 -1.000000 +146470 -1.000000 +146471 -1.000000 +146472 -1.000000 +146473 -1.000000 +146474 -1.000000 +146476 -1.000000 +146480 -1.000000 +146481 -1.000000 +146483 -1.000000 +146485 -1.000000 +146486 -1.000000 +146488 -1.000000 +146489 -1.000000 +146490 -1.000000 +146491 -1.000000 +146492 -1.000000 +146493 -1.000000 +146501 -1.000000 +146502 -1.000000 +146503 -1.000000 +146504 -1.000000 +146505 -1.000000 +146506 -1.000000 +146507 -1.000000 +146508 -1.000000 +146509 -1.000000 +146510 -1.000000 +146511 -1.000000 +146512 -1.000000 +146513 -1.000000 +146514 -1.000000 +146520 -1.000000 +146521 -1.000000 +146524 -1.000000 +146525 -1.000000 +146526 -1.000000 +146530 -1.000000 +146531 -1.000000 +146534 -1.000000 +146535 -1.000000 +146536 -1.000000 +146537 -1.000000 +146538 -1.000000 +146539 -1.000000 +146540 -1.000000 +146541 -1.000000 +146542 -1.000000 +146544 -1.000000 +146545 -1.000000 +146548 -1.000000 +146549 -1.000000 +146551 -1.000000 +146552 -1.000000 +146553 -1.000000 +146554 -1.000000 +146555 -1.000000 +146556 -1.000000 +146557 -1.000000 +146558 -1.000000 +146559 -1.000000 +146563 -1.000000 +146564 -1.000000 +146565 -1.000000 +146566 -1.000000 +146567 -1.000000 +146568 -1.000000 +146569 -1.000000 +146570 -1.000000 +146571 -1.000000 +146573 -1.000000 +146574 -1.000000 +146575 -1.000000 +146576 -1.000000 +146577 -1.000000 +146578 -1.000000 +146579 -1.000000 +146580 -1.000000 +146581 -1.000000 +146582 -1.000000 +146588 -1.000000 +146589 -1.000000 +146590 -1.000000 +146591 -1.000000 +146592 -1.000000 +146593 -1.000000 +146595 -1.000000 +146596 -1.000000 +146597 -1.000000 +146600 -1.000000 +146601 -1.000000 +146602 -1.000000 +146603 -1.000000 +146604 -1.000000 +146605 -1.000000 +146606 -1.000000 +146607 -1.000000 +146611 -1.000000 +146612 -1.000000 +146613 -1.000000 +146615 -1.000000 +146616 -1.000000 +146617 -1.000000 +146618 -1.000000 +146619 -1.000000 +146622 -1.000000 +146624 -1.000000 +146625 -1.000000 +146629 -1.000000 +146631 -1.000000 +146632 -1.000000 +146636 -1.000000 +146637 -1.000000 +146638 -1.000000 +146639 -1.000000 +146640 -1.000000 +146641 -1.000000 +146643 -1.000000 +146652 -1.000000 +146653 -1.000000 +146656 -1.000000 +146661 -1.000000 +146662 -1.000000 +146664 -1.000000 +146665 -1.000000 +146666 -1.000000 +146671 -1.000000 +146673 -1.000000 +146674 -1.000000 +146675 -1.000000 +146677 -1.000000 +146681 -1.000000 +146682 -1.000000 +146702 -1.000000 +146704 -1.000000 +146710 -1.000000 +146713 -1.000000 +146716 -1.000000 +146717 -1.000000 +146718 -1.000000 +146719 -1.000000 +146720 -1.000000 +146721 -1.000000 +146722 -1.000000 +146723 -1.000000 +146724 -1.000000 +146725 -1.000000 +146726 -1.000000 +146727 -1.000000 +146728 -1.000000 +146729 -1.000000 +146730 -1.000000 +146731 -1.000000 +146732 -1.000000 +146733 -1.000000 +146734 -1.000000 +146735 -1.000000 +146736 -1.000000 +146737 -1.000000 +146738 -1.000000 +146739 -1.000000 +146740 -1.000000 +146741 -1.000000 +146742 -1.000000 +146743 -1.000000 +146744 -1.000000 +146745 -1.000000 +146746 -1.000000 +146747 -1.000000 +146748 -1.000000 +146749 -1.000000 +146750 -1.000000 +146751 -1.000000 +146752 -1.000000 +146753 -1.000000 +146754 -1.000000 +146755 -1.000000 +146756 -1.000000 +146757 -1.000000 +146758 -1.000000 +146759 -1.000000 +146761 -1.000000 +146762 -1.000000 +146763 -1.000000 +146764 -1.000000 +146765 -1.000000 +146766 -1.000000 +146767 -1.000000 +146770 -1.000000 +146772 -1.000000 +146773 -1.000000 +146774 -1.000000 +146775 -1.000000 +146776 -1.000000 +146777 -1.000000 +146778 -1.000000 +146779 -1.000000 +146780 -1.000000 +146781 -1.000000 +146782 -1.000000 +146784 -1.000000 +146785 -1.000000 +146788 -1.000000 +146789 -1.000000 +146803 -1.000000 +146807 -1.000000 +146809 -1.000000 +146812 -1.000000 +146814 -1.000000 +146815 -1.000000 +146818 -1.000000 +146820 -1.000000 +146821 -1.000000 +146822 -1.000000 +146823 -1.000000 +146824 -1.000000 +146825 -1.000000 +146835 -1.000000 +146838 -1.000000 +146839 -1.000000 +146840 -1.000000 +146841 -1.000000 +146842 -1.000000 +146846 -1.000000 +146848 -1.000000 +146850 -1.000000 +146857 -1.000000 +146863 -1.000000 +146864 -1.000000 +146865 -1.000000 +146868 -1.000000 +146869 -1.000000 +146870 -1.000000 +146871 -1.000000 +146875 -1.000000 +146881 -1.000000 +146882 -1.000000 +146883 -1.000000 +146884 -1.000000 +146885 -1.000000 +146886 -1.000000 +146887 -1.000000 +146888 -1.000000 +146889 -1.000000 +146890 -1.000000 +146891 -1.000000 +146892 -1.000000 +146893 -1.000000 +146894 -1.000000 +146895 -1.000000 +146896 -1.000000 +146897 -1.000000 +146898 -1.000000 +146899 -1.000000 +146900 -1.000000 +146907 -1.000000 +146908 -1.000000 +146910 -1.000000 +146915 -1.000000 +146917 -1.000000 +146928 -1.000000 +146936 -1.000000 +146939 -1.000000 +146942 -1.000000 +146944 -1.000000 +146945 -1.000000 +146946 -1.000000 +146948 -1.000000 +146950 -1.000000 +146951 -1.000000 +146952 -1.000000 +146954 -1.000000 +146955 -1.000000 +146956 -1.000000 +146957 -1.000000 +146960 -1.000000 +146963 -1.000000 +146964 -1.000000 +146965 -1.000000 +146967 -1.000000 +146968 -1.000000 +146969 -1.000000 +146970 -1.000000 +146971 -1.000000 +146975 -1.000000 +146977 -1.000000 +146980 -1.000000 +146981 -1.000000 +146982 -1.000000 +146983 -1.000000 +146984 -1.000000 +146990 -1.000000 +146993 -1.000000 +146994 -1.000000 +146997 -1.000000 +146998 -1.000000 +146999 -1.000000 +147000 -1.000000 +147001 -1.000000 +147005 -1.000000 +147007 -1.000000 +147012 -1.000000 +147020 -1.000000 +147021 -1.000000 +147023 -1.000000 +147041 -1.000000 +147042 -1.000000 +147043 -1.000000 +147051 -1.000000 +147054 -1.000000 +147055 -1.000000 +147056 -1.000000 +147057 -1.000000 +147058 -1.000000 +147059 -1.000000 +147061 -1.000000 +147063 -1.000000 +147064 -1.000000 +147065 -1.000000 +147066 -1.000000 +147071 -1.000000 +147073 -1.000000 +147076 -1.000000 +147077 -1.000000 +147078 -1.000000 +147083 -1.000000 +147086 -1.000000 +147087 -1.000000 +147089 -1.000000 +147093 -1.000000 +147094 -1.000000 +147097 -1.000000 +147098 -1.000000 +147106 -1.000000 +147108 -1.000000 +147109 -1.000000 +147113 -1.000000 +147115 -1.000000 +147116 -1.000000 +147119 -1.000000 +147120 -1.000000 +147121 -1.000000 +147122 -1.000000 +147126 -1.000000 +147127 -1.000000 +147128 -1.000000 +147129 -1.000000 +147130 -1.000000 +147131 -1.000000 +147133 -1.000000 +147134 -1.000000 +147135 -1.000000 +147137 -1.000000 +147138 -1.000000 +147139 -1.000000 +147140 -1.000000 +147141 -1.000000 +147144 -1.000000 +147145 -1.000000 +147149 -1.000000 +147150 -1.000000 +147151 -1.000000 +147152 -1.000000 +147153 -1.000000 +147154 -1.000000 +147155 -1.000000 +147156 -1.000000 +147157 -1.000000 +147158 -1.000000 +147159 -1.000000 +147160 -1.000000 +147162 -1.000000 +147163 -1.000000 +147165 -1.000000 +147166 -1.000000 +147177 -1.000000 +147180 -1.000000 +147182 -1.000000 +147186 -1.000000 +147187 -1.000000 +147188 -1.000000 +147193 -1.000000 +147195 -1.000000 +147196 -1.000000 +147197 -1.000000 +147198 -1.000000 +147217 -1.000000 +147218 -1.000000 +147219 -1.000000 +147228 -1.000000 +147229 -1.000000 +147230 -1.000000 +147231 -1.000000 +147232 -1.000000 +147257 -1.000000 +147258 -1.000000 +147259 -1.000000 +147260 -1.000000 +147261 -1.000000 +147262 -1.000000 +147264 -1.000000 +147265 -1.000000 +147267 -1.000000 +147274 -1.000000 +147275 -1.000000 +147276 -1.000000 +147277 -1.000000 +147281 -1.000000 +147282 -1.000000 +147283 -1.000000 +147285 -1.000000 +147288 -1.000000 +147290 -1.000000 +147293 -1.000000 +147327 -1.000000 +147330 -1.000000 +147331 -1.000000 +147332 -1.000000 +147334 -1.000000 +147343 -1.000000 +147346 -1.000000 +147349 -1.000000 +147354 -1.000000 +147367 -1.000000 +147368 -1.000000 +147369 -1.000000 +147370 -1.000000 +147371 -1.000000 +147372 -1.000000 +147373 -1.000000 +147374 -1.000000 +147375 -1.000000 +147376 -1.000000 +147377 -1.000000 +147378 -1.000000 +147379 -1.000000 +147380 -1.000000 +147381 -1.000000 +147382 -1.000000 +147383 -1.000000 +147384 -1.000000 +147385 -1.000000 +147391 -1.000000 +147392 -1.000000 +147394 -1.000000 +147396 -1.000000 +147397 -1.000000 +147398 -1.000000 +147399 -1.000000 +147402 -1.000000 +147404 -1.000000 +147405 -1.000000 +147407 -1.000000 +147408 -1.000000 +147410 -1.000000 +147411 -1.000000 +147412 -1.000000 +147413 -1.000000 +147414 -1.000000 +147415 -1.000000 +147416 -1.000000 +147417 -1.000000 +147418 -1.000000 +147419 -1.000000 +147420 -1.000000 +147421 -1.000000 +147422 -1.000000 +147423 -1.000000 +147424 -1.000000 +147425 -1.000000 +147426 -1.000000 +147428 -1.000000 +147429 -1.000000 +147430 -1.000000 +147432 -1.000000 +147436 -1.000000 +147441 -1.000000 +147455 -1.000000 +147456 -1.000000 +147457 -1.000000 +147459 -1.000000 +147460 -1.000000 +147461 -1.000000 +147462 -1.000000 +147464 -1.000000 +147465 -1.000000 +147466 -1.000000 +147467 -1.000000 +147468 -1.000000 +147469 -1.000000 +147512 -1.000000 +147518 -1.000000 +147519 -1.000000 +147520 -1.000000 +147521 -1.000000 +147522 -1.000000 +147523 -1.000000 +147524 -1.000000 +147525 -1.000000 +147526 -1.000000 +147527 -1.000000 +147529 -1.000000 +147530 -1.000000 +147531 -1.000000 +147532 -1.000000 +147533 -1.000000 +147534 -1.000000 +147535 -1.000000 +147582 -1.000000 +147587 -1.000000 +147588 -1.000000 +147589 -1.000000 +147592 -1.000000 +147594 -1.000000 +147596 -1.000000 +147597 -1.000000 +147598 -1.000000 +147599 -1.000000 +147600 -1.000000 +147603 -1.000000 +147607 -1.000000 +147608 -1.000000 +147609 -1.000000 +147610 -1.000000 +147615 -1.000000 +147616 -1.000000 +147617 -1.000000 +147618 -1.000000 +147619 -1.000000 +147620 -1.000000 +147621 -1.000000 +147622 -1.000000 +147623 -1.000000 +147624 -1.000000 +147625 -1.000000 +147626 -1.000000 +147627 -1.000000 +147628 -1.000000 +147629 -1.000000 +147630 -1.000000 +147631 -1.000000 +147632 -1.000000 +147633 -1.000000 +147634 -1.000000 +147639 -1.000000 +147640 -1.000000 +147642 -1.000000 +147645 -1.000000 +147646 -1.000000 +147647 -1.000000 +147648 -1.000000 +147649 -1.000000 +147650 -1.000000 +147651 -1.000000 +147652 -1.000000 +147653 -1.000000 +147656 -1.000000 +147657 -1.000000 +147658 -1.000000 +147659 -1.000000 +147660 -1.000000 +147661 -1.000000 +147662 -1.000000 +147663 -1.000000 +147664 -1.000000 +147665 -1.000000 +147667 -1.000000 +147670 -1.000000 +147671 -1.000000 +147673 -1.000000 +147675 -1.000000 +147676 -1.000000 +147677 -1.000000 +147678 -1.000000 +147680 -1.000000 +147681 -1.000000 +147682 -1.000000 +147684 -1.000000 +147685 -1.000000 +147686 -1.000000 +147689 -1.000000 +147690 -1.000000 +147691 -1.000000 +147692 -1.000000 +147693 -1.000000 +147694 -1.000000 +147695 -1.000000 +147696 -1.000000 +147697 -1.000000 +147699 -1.000000 +147700 -1.000000 +147701 -1.000000 +147703 -1.000000 +147704 -1.000000 +147705 -1.000000 +147707 -1.000000 +147708 -1.000000 +147709 -1.000000 +147714 -1.000000 +147715 -1.000000 +147717 -1.000000 +147720 -1.000000 +147721 -1.000000 +147722 -1.000000 +147723 -1.000000 +147724 -1.000000 +147725 -1.000000 +147726 -1.000000 +147727 -1.000000 +147728 -1.000000 +147729 -1.000000 +147730 -1.000000 +147731 -1.000000 +147732 -1.000000 +147733 -1.000000 +147734 -1.000000 +147736 -1.000000 +147737 -1.000000 +147739 -1.000000 +147740 -1.000000 +147742 -1.000000 +148158 -1.000000 +148159 -1.000000 +148160 -1.000000 +148161 -1.000000 +148164 -1.000000 +148165 -1.000000 +148166 -1.000000 +148167 -1.000000 +148169 -1.000000 +148170 -1.000000 +148172 -1.000000 +148173 -1.000000 +148174 -1.000000 +148175 -1.000000 +148176 -1.000000 +148177 -1.000000 +148179 -1.000000 +148180 -1.000000 +148208 -1.000000 +148209 -1.000000 +148210 -1.000000 +148211 -1.000000 +148212 -1.000000 +148214 -1.000000 +148215 -1.000000 +148218 -1.000000 +148219 -1.000000 +148220 -1.000000 +148221 -1.000000 +148222 -1.000000 +148223 -1.000000 +148224 -1.000000 +148225 -1.000000 +148226 -1.000000 +148227 -1.000000 +148228 -1.000000 +148229 -1.000000 +148230 -1.000000 +148231 -1.000000 +148232 -1.000000 +148233 -1.000000 +148234 -1.000000 +148235 -1.000000 +148236 -1.000000 +148237 -1.000000 +148238 -1.000000 +148239 -1.000000 +148250 -1.000000 +148255 -1.000000 +148258 -1.000000 +148261 -1.000000 +148262 -1.000000 +148263 -1.000000 +148264 -1.000000 +148265 -1.000000 +148266 -1.000000 +148267 -1.000000 +148268 -1.000000 +148270 -1.000000 +148271 -1.000000 +148272 -1.000000 +148273 -1.000000 +148274 -1.000000 +148275 -1.000000 +148284 -1.000000 +148285 -1.000000 +148288 -1.000000 +148289 -1.000000 +148290 -1.000000 +148291 -1.000000 +148292 -1.000000 +148293 -1.000000 +148294 -1.000000 +148295 -1.000000 +148296 -1.000000 +148297 -1.000000 +148307 -1.000000 +148308 -1.000000 +148309 -1.000000 +148311 -1.000000 +148312 -1.000000 +148313 -1.000000 +148314 -1.000000 +148318 -1.000000 +148319 -1.000000 +148320 -1.000000 +148321 -1.000000 +148323 -1.000000 +148324 -1.000000 +148325 -1.000000 +148327 -1.000000 +148335 -1.000000 +148336 -1.000000 +148337 -1.000000 +148341 -1.000000 +148344 -1.000000 +148346 -1.000000 +148347 -1.000000 +148348 -1.000000 +148349 -1.000000 +148350 -1.000000 +148351 -1.000000 +148352 -1.000000 +148353 -1.000000 +148354 -1.000000 +148355 -1.000000 +148356 -1.000000 +148357 -1.000000 +148359 -1.000000 +148360 -1.000000 +148361 -1.000000 +148362 -1.000000 +148363 -1.000000 +148364 -1.000000 +148365 -1.000000 +148368 -1.000000 +148369 -1.000000 +148370 -1.000000 +148376 -1.000000 +148377 -1.000000 +148378 -1.000000 +148379 -1.000000 +148381 -1.000000 +148382 -1.000000 +148384 -1.000000 +148385 -1.000000 +148386 -1.000000 +148387 -1.000000 +148388 -1.000000 +148450 -1.000000 +148451 -1.000000 +148452 -1.000000 +148453 -1.000000 +148455 -1.000000 +148456 -1.000000 +148457 -1.000000 +148458 -1.000000 +148459 -1.000000 +148460 -1.000000 +148462 -1.000000 +148463 -1.000000 +148464 -1.000000 +148465 -1.000000 +148466 -1.000000 +148467 -1.000000 +148472 -1.000000 +148473 -1.000000 +148474 -1.000000 +148475 -1.000000 +148476 -1.000000 +148477 -1.000000 +148478 -1.000000 +148479 -1.000000 +148490 -1.000000 +148491 -1.000000 +148493 -1.000000 +148495 -1.000000 +148496 -1.000000 +148497 -1.000000 +148500 -1.000000 +148501 -1.000000 +148511 -1.000000 +148512 -1.000000 +148513 -1.000000 +148514 -1.000000 +148515 -1.000000 +148516 -1.000000 +148517 -1.000000 +148527 -1.000000 +148528 -1.000000 +148529 -1.000000 +148530 -1.000000 +148532 -1.000000 +148533 -1.000000 +148534 -1.000000 +148535 -1.000000 +148536 -1.000000 +148537 -1.000000 +148538 -1.000000 +148539 -1.000000 +148540 -1.000000 +148541 -1.000000 +148542 -1.000000 +148546 -1.000000 +148547 -1.000000 +148548 -1.000000 +148549 -1.000000 +148550 -1.000000 +148551 -1.000000 +148552 -1.000000 +148553 -1.000000 +148555 -1.000000 +148557 -1.000000 +148558 -1.000000 +148559 -1.000000 +148560 -1.000000 +148561 -1.000000 +148562 -1.000000 +148563 -1.000000 +148564 -1.000000 +148565 -1.000000 +148566 -1.000000 +148567 -1.000000 +148568 -1.000000 +148569 -1.000000 +148570 -1.000000 +148571 -1.000000 +148572 -1.000000 +148573 -1.000000 +148574 -1.000000 +148575 -1.000000 +148576 -1.000000 +148579 -1.000000 +148583 -1.000000 +148584 -1.000000 +148585 -1.000000 +148586 -1.000000 +148587 -1.000000 +148588 -1.000000 +148589 -1.000000 +148590 -1.000000 +148591 -1.000000 +148592 -1.000000 +148594 -1.000000 +148595 -1.000000 +148596 -1.000000 +148597 -1.000000 +148598 -1.000000 +148599 -1.000000 +148600 -1.000000 +148601 -1.000000 +148602 -1.000000 +148603 -1.000000 +148604 -1.000000 +148605 -1.000000 +148606 -1.000000 +148614 -1.000000 +148615 -1.000000 +148616 -1.000000 +148619 -1.000000 +148622 -1.000000 +148624 -1.000000 +148626 -1.000000 +148627 -1.000000 +148629 -1.000000 +148630 -1.000000 +148631 -1.000000 +148632 -1.000000 +148633 -1.000000 +148634 -1.000000 +148635 -1.000000 +148636 -1.000000 +148637 -1.000000 +148638 -1.000000 +148639 -1.000000 +148640 -1.000000 +148641 -1.000000 +148642 -1.000000 +148653 -1.000000 +148654 -1.000000 +148656 -1.000000 +148658 -1.000000 +148659 -1.000000 +148661 -1.000000 +148662 -1.000000 +148664 -1.000000 +148665 -1.000000 +148671 -1.000000 +148672 -1.000000 +148673 -1.000000 +148674 -1.000000 +148675 -1.000000 +148679 -1.000000 +148680 -1.000000 +148681 -1.000000 +148682 -1.000000 +148683 -1.000000 +148684 -1.000000 +148687 -1.000000 +148688 -1.000000 +148689 -1.000000 +148690 -1.000000 +148691 -1.000000 +148692 -1.000000 +148693 -1.000000 +148694 -1.000000 +148695 -1.000000 +148696 -1.000000 +148697 -1.000000 +148698 -1.000000 +148704 -1.000000 +148705 -1.000000 +148706 -1.000000 +148709 -1.000000 +148712 -1.000000 +148715 -1.000000 +148717 -1.000000 +148718 -1.000000 +148730 -1.000000 +148734 -1.000000 +148738 -1.000000 +148742 -1.000000 +148745 -1.000000 +148746 -1.000000 +148747 -1.000000 +148749 -1.000000 +148750 -1.000000 +148756 -1.000000 +148764 -1.000000 +148766 -1.000000 +148768 -1.000000 +148772 -1.000000 +148773 -1.000000 +148774 -1.000000 +148775 -1.000000 +148776 -1.000000 +148777 -1.000000 +148778 -1.000000 +148779 -1.000000 +148780 -1.000000 +148781 -1.000000 +148783 -1.000000 +148784 -1.000000 +148785 -1.000000 +148786 -1.000000 +148787 -1.000000 +148788 -1.000000 +148790 -1.000000 +148791 -1.000000 +148792 -1.000000 +148793 -1.000000 +148794 -1.000000 +148796 -1.000000 +148797 -1.000000 +148798 -1.000000 +148799 -1.000000 +148800 -1.000000 +148801 -1.000000 +148802 -1.000000 +148803 -1.000000 +148804 -1.000000 +148805 -1.000000 +148806 -1.000000 +148807 -1.000000 +148835 -1.000000 +148840 -1.000000 +148842 -1.000000 +148844 -1.000000 +148846 -1.000000 +148850 -1.000000 +148851 -1.000000 +148852 -1.000000 +148853 -1.000000 +148854 -1.000000 +148855 -1.000000 +148864 -1.000000 +148865 -1.000000 +148866 -1.000000 +148867 -1.000000 +148868 -1.000000 +148869 -1.000000 +148870 -1.000000 +148873 -1.000000 +148874 -1.000000 +148876 -1.000000 +148877 -1.000000 +148878 -1.000000 +148879 -1.000000 +148880 -1.000000 +148882 -1.000000 +148883 -1.000000 +148884 -1.000000 +148885 -1.000000 +148886 -1.000000 +148887 -1.000000 +148888 -1.000000 +148889 -1.000000 +148890 -1.000000 +148891 -1.000000 +148892 -1.000000 +148893 -1.000000 +148894 -1.000000 +148895 -1.000000 +148896 -1.000000 +148897 -1.000000 +148901 -1.000000 +148902 -1.000000 +148903 -1.000000 +148904 -1.000000 +148905 -1.000000 +148906 -1.000000 +148907 -1.000000 +148908 -1.000000 +148909 -1.000000 +148910 -1.000000 +148912 -1.000000 +148913 -1.000000 +148914 -1.000000 +148915 -1.000000 +148916 -1.000000 +148917 -1.000000 +148918 -1.000000 +148919 -1.000000 +148920 -1.000000 +148922 -1.000000 +148923 -1.000000 +148924 -1.000000 +148925 -1.000000 +148926 -1.000000 +148927 -1.000000 +148929 -1.000000 +148930 -1.000000 +148931 -1.000000 +148939 -1.000000 +148940 -1.000000 +148941 -1.000000 +148942 -1.000000 +148943 -1.000000 +148944 -1.000000 +148945 -1.000000 +148946 -1.000000 +148947 -1.000000 +148948 -1.000000 +148949 -1.000000 +148951 -1.000000 +148952 -1.000000 +148953 -1.000000 +148954 -1.000000 +148955 -1.000000 +148956 -1.000000 +148959 -1.000000 +148961 -1.000000 +148966 -1.000000 +148973 -1.000000 +148976 -1.000000 +148977 -1.000000 +148978 -1.000000 +148979 -1.000000 +148980 -1.000000 +148981 -1.000000 +148982 -1.000000 +148983 -1.000000 +148984 -1.000000 +148985 -1.000000 +148986 -1.000000 +148987 -1.000000 +148988 -1.000000 +148989 -1.000000 +148990 -1.000000 +148991 -1.000000 +148994 -1.000000 +148995 -1.000000 +148996 -1.000000 +148997 -1.000000 +148998 -1.000000 +148999 -1.000000 +149000 -1.000000 +149010 -1.000000 +149011 -1.000000 +149015 -1.000000 +149020 -1.000000 +149026 -1.000000 +149027 -1.000000 +149038 -1.000000 +149039 -1.000000 +149040 -1.000000 +149041 -1.000000 +149042 -1.000000 +149043 -1.000000 +149046 -1.000000 +149047 -1.000000 +149048 -1.000000 +149049 -1.000000 +149052 -1.000000 +149054 -1.000000 +149055 -1.000000 +149056 -1.000000 +149057 -1.000000 +149058 -1.000000 +149059 -1.000000 +149060 -1.000000 +149061 -1.000000 +149063 -1.000000 +149064 -1.000000 +149080 -1.000000 +149081 -1.000000 +149082 -1.000000 +149083 -1.000000 +149084 -1.000000 +149085 -1.000000 +149086 -1.000000 +149096 -1.000000 +149101 -1.000000 +149109 -1.000000 +149110 -1.000000 +149111 -1.000000 +149113 -1.000000 +149114 -1.000000 +149115 -1.000000 +149116 -1.000000 +149117 -1.000000 +149120 -1.000000 +149121 -1.000000 +149122 -1.000000 +149123 -1.000000 +149124 -1.000000 +149132 -1.000000 +149133 -1.000000 +149136 -1.000000 +149137 -1.000000 +149138 -1.000000 +149139 -1.000000 +149142 -1.000000 +149144 -1.000000 +149145 -1.000000 +149146 -1.000000 +149147 -1.000000 +149148 -1.000000 +149149 -1.000000 +149150 -1.000000 +149151 -1.000000 +149152 -1.000000 +149154 -1.000000 +149155 -1.000000 +149156 -1.000000 +149157 -1.000000 +149158 -1.000000 +149159 -1.000000 +149164 -1.000000 +149195 -1.000000 +149196 -1.000000 +149197 -1.000000 +149198 -1.000000 +149200 -1.000000 +149201 -1.000000 +149203 -1.000000 +149204 -1.000000 +149209 -1.000000 +149210 -1.000000 +149217 -1.000000 +149218 -1.000000 +149223 -1.000000 +149228 -1.000000 +149229 -1.000000 +149230 -1.000000 +149231 -1.000000 +149242 -1.000000 +149249 -1.000000 +149250 -1.000000 +149252 -1.000000 +149253 -1.000000 +149260 -1.000000 +149261 -1.000000 +149262 -1.000000 +149263 -1.000000 +149265 -1.000000 +149267 -1.000000 +149268 -1.000000 +149284 -1.000000 +149285 -1.000000 +149286 -1.000000 +149287 -1.000000 +149288 -1.000000 +149289 -1.000000 +149290 -1.000000 +149291 -1.000000 +149292 -1.000000 +149293 -1.000000 +149299 -1.000000 +149300 -1.000000 +149301 -1.000000 +149303 -1.000000 +149304 -1.000000 +149308 -1.000000 +149310 -1.000000 +149318 -1.000000 +149322 -1.000000 +149323 -1.000000 +149325 -1.000000 +149328 -1.000000 +149330 -1.000000 +149332 -1.000000 +149333 -1.000000 +149334 -1.000000 +149335 -1.000000 +149336 -1.000000 +149337 -1.000000 +149339 -1.000000 +149344 -1.000000 +149345 -1.000000 +149346 -1.000000 +149347 -1.000000 +149348 -1.000000 +149350 -1.000000 +149357 -1.000000 +149358 -1.000000 +149359 -1.000000 +149360 -1.000000 +149361 -1.000000 +149362 -1.000000 +149364 -1.000000 +149367 -1.000000 +149370 -1.000000 +149371 -1.000000 +149372 -1.000000 +149373 -1.000000 +149375 -1.000000 +149376 -1.000000 +149377 -1.000000 +149378 -1.000000 +149380 -1.000000 +149383 -1.000000 +149384 -1.000000 +149385 -1.000000 +149386 -1.000000 +149387 -1.000000 +149388 -1.000000 +149393 -1.000000 +149394 -1.000000 +149395 -1.000000 +149396 -1.000000 +149397 -1.000000 +149398 -1.000000 +149399 -1.000000 +149400 -1.000000 +149401 -1.000000 +149403 -1.000000 +149404 -1.000000 +149405 -1.000000 +149406 -1.000000 +149407 -1.000000 +149408 -1.000000 +149409 -1.000000 +149410 -1.000000 +149411 -1.000000 +149412 -1.000000 +149413 -1.000000 +149414 -1.000000 +149415 -1.000000 +149416 -1.000000 +149431 -1.000000 +149437 -1.000000 +149460 -1.000000 +149461 -1.000000 +149465 -1.000000 +149466 -1.000000 +149467 -1.000000 +149468 -1.000000 +149469 -1.000000 +149476 -1.000000 +149485 -1.000000 +149487 -1.000000 +149492 -1.000000 +149493 -1.000000 +149494 -1.000000 +149495 -1.000000 +149496 -1.000000 +149497 -1.000000 +149498 -1.000000 +149509 -1.000000 +149510 -1.000000 +149511 -1.000000 +149512 -1.000000 +149513 -1.000000 +149514 -1.000000 +149515 -1.000000 +149516 -1.000000 +149517 -1.000000 +149518 -1.000000 +149519 -1.000000 +149520 -1.000000 +149521 -1.000000 +149522 -1.000000 +149526 -1.000000 +149527 -1.000000 +149528 -1.000000 +149529 -1.000000 +149533 -1.000000 +149534 -1.000000 +149535 -1.000000 +149536 -1.000000 +149537 -1.000000 +149538 -1.000000 +149539 -1.000000 +149541 -1.000000 +149542 -1.000000 +149543 -1.000000 +149581 -1.000000 +149582 -1.000000 +149583 -1.000000 +149584 -1.000000 +149585 -1.000000 +149587 -1.000000 +149588 -1.000000 +149589 -1.000000 +149590 -1.000000 +149595 -1.000000 +149596 -1.000000 +149598 -1.000000 +149599 -1.000000 +149600 -1.000000 +149601 -1.000000 +149604 -1.000000 +149605 -1.000000 +149606 -1.000000 +149607 -1.000000 +149608 -1.000000 +149609 -1.000000 +149610 -1.000000 +149611 -1.000000 +149613 -1.000000 +149614 -1.000000 +149615 -1.000000 +149617 -1.000000 +149618 -1.000000 +149619 -1.000000 +149620 -1.000000 +149621 -1.000000 +149622 -1.000000 +149623 -1.000000 +149624 -1.000000 +149625 -1.000000 +149651 -1.000000 +149652 -1.000000 +149653 -1.000000 +149654 -1.000000 +149655 -1.000000 +149656 -1.000000 +149658 -1.000000 +149661 -1.000000 +149680 -1.000000 +149681 -1.000000 +149682 -1.000000 +149689 -1.000000 +149690 -1.000000 +149691 -1.000000 +149693 -1.000000 +149697 -1.000000 +149699 -1.000000 +149704 -1.000000 +149705 -1.000000 +149706 -1.000000 +149707 -1.000000 +149708 -1.000000 +149709 -1.000000 +149710 -1.000000 +149711 -1.000000 +149712 -1.000000 +149713 -1.000000 +149714 -1.000000 +149715 -1.000000 +149716 -1.000000 +149717 -1.000000 +149718 -1.000000 +149719 -1.000000 +149722 -1.000000 +149727 -1.000000 +149728 -1.000000 +149729 -1.000000 +149730 -1.000000 +149731 -1.000000 +149732 -1.000000 +149733 -1.000000 +149734 -1.000000 +149735 -1.000000 +149736 -1.000000 +149737 -1.000000 +149738 -1.000000 +149739 -1.000000 +149740 -1.000000 +149741 -1.000000 +149743 -1.000000 +149747 -1.000000 +149754 -1.000000 +149755 -1.000000 +149756 -1.000000 +149757 -1.000000 +149758 -1.000000 +149759 -1.000000 +149760 -1.000000 +149765 -1.000000 +149766 -1.000000 +149767 -1.000000 +149770 -1.000000 +149773 -1.000000 +149774 -1.000000 +149776 -1.000000 +149777 -1.000000 +149779 -1.000000 +149780 -1.000000 +149781 -1.000000 +149782 -1.000000 +149783 -1.000000 +149784 -1.000000 +149785 -1.000000 +149786 -1.000000 +149787 -1.000000 +149789 -1.000000 +149790 -1.000000 +149791 -1.000000 +149792 -1.000000 +149793 -1.000000 +149794 -1.000000 +149795 -1.000000 +149796 -1.000000 +149800 -1.000000 +149801 -1.000000 +149803 -1.000000 +149804 -1.000000 +149805 -1.000000 +149806 -1.000000 +149807 -1.000000 +149808 -1.000000 +149810 -1.000000 +149811 -1.000000 +149813 -1.000000 +149815 -1.000000 +149816 -1.000000 +149818 -1.000000 +149820 -1.000000 +149821 -1.000000 +149822 -1.000000 +149824 -1.000000 +149827 -1.000000 +149828 -1.000000 +149829 -1.000000 +149830 -1.000000 +149834 -1.000000 +149835 -1.000000 +149836 -1.000000 +149837 -1.000000 +149838 -1.000000 +149839 -1.000000 +149840 -1.000000 +149842 -1.000000 +149843 -1.000000 +149845 -1.000000 +149847 -1.000000 +149848 -1.000000 +149849 -1.000000 +149850 -1.000000 +149852 -1.000000 +149853 -1.000000 +149854 -1.000000 +149855 -1.000000 +149856 -1.000000 +149857 -1.000000 +149862 -1.000000 +149863 -1.000000 +149864 -1.000000 +149866 -1.000000 +149867 -1.000000 +149868 -1.000000 +149869 -1.000000 +149870 -1.000000 +149871 -1.000000 +149872 -1.000000 +149878 -1.000000 +149896 -1.000000 +149901 -1.000000 +149902 -1.000000 +149903 -1.000000 +149907 -1.000000 +149922 -1.000000 +149923 -1.000000 +149924 -1.000000 +149925 -1.000000 +149926 -1.000000 +149927 -1.000000 +149928 -1.000000 +149929 -1.000000 +149930 -1.000000 +149931 -1.000000 +149932 -1.000000 +149933 -1.000000 +149934 -1.000000 +149935 -1.000000 +149937 -1.000000 +149938 -1.000000 +149940 -1.000000 +149941 -1.000000 +149942 -1.000000 +149943 -1.000000 +149944 -1.000000 +149945 -1.000000 +149946 -1.000000 +149947 -1.000000 +149948 -1.000000 +149949 -1.000000 +149950 -1.000000 +149951 -1.000000 +149952 -1.000000 +149953 -1.000000 +149954 -1.000000 +149955 -1.000000 +149956 -1.000000 +149957 -1.000000 +149961 -1.000000 +149962 -1.000000 +149967 -1.000000 +149970 -1.000000 +149971 -1.000000 +149973 -1.000000 +149976 -1.000000 +149979 -1.000000 +149983 -1.000000 +149984 -1.000000 +149985 -1.000000 +149986 -1.000000 +149987 -1.000000 +149988 -1.000000 +149989 -1.000000 +149990 -1.000000 +150005 -1.000000 +150015 -1.000000 +150017 -1.000000 +150018 -1.000000 +150019 -1.000000 +150020 -1.000000 +150022 -1.000000 +150023 -1.000000 +150024 -1.000000 +150025 -1.000000 +150026 -1.000000 +150027 -1.000000 +150028 -1.000000 +150029 -1.000000 +150030 -1.000000 +150031 -1.000000 +150032 -1.000000 +150034 -1.000000 +150035 -1.000000 +150036 -1.000000 +150037 -1.000000 +150038 -1.000000 +150039 -1.000000 +150040 -1.000000 +150044 -1.000000 +150045 -1.000000 +150046 -1.000000 +150047 -1.000000 +150048 -1.000000 +150049 -1.000000 +150050 -1.000000 +150052 -1.000000 +150053 -1.000000 +150054 -1.000000 +150055 -1.000000 +150056 -1.000000 +150057 -1.000000 +150058 -1.000000 +150059 -1.000000 +150060 -1.000000 +150061 -1.000000 +150062 -1.000000 +150063 -1.000000 +150064 -1.000000 +150065 -1.000000 +150066 -1.000000 +150068 -1.000000 +150069 -1.000000 +150070 -1.000000 +150071 -1.000000 +150072 -1.000000 +150073 -1.000000 +150074 -1.000000 +150075 -1.000000 +150076 -1.000000 +150077 -1.000000 +150078 -1.000000 +150079 -1.000000 +150080 -1.000000 +150083 -1.000000 +150086 -1.000000 +150092 -1.000000 +150093 -1.000000 +150094 -1.000000 +150095 -1.000000 +150096 -1.000000 +150097 -1.000000 +150098 -1.000000 +150099 -1.000000 +150100 -1.000000 +150101 -1.000000 +150102 -1.000000 +150103 -1.000000 +150104 -1.000000 +150105 -1.000000 +150106 -1.000000 +150107 -1.000000 +150108 -1.000000 +150109 -1.000000 +150111 -1.000000 +150113 -1.000000 +150114 -1.000000 +150115 -1.000000 +150116 -1.000000 +150122 -1.000000 +150124 -1.000000 +150125 -1.000000 +150126 -1.000000 +150132 -1.000000 +150133 -1.000000 +150137 -1.000000 +150139 -1.000000 +150140 -1.000000 +150141 -1.000000 +150142 -1.000000 +150143 -1.000000 +150144 -1.000000 +150145 -1.000000 +150147 -1.000000 +150148 -1.000000 +150149 -1.000000 +150150 -1.000000 +150151 -1.000000 +150152 -1.000000 +150153 -1.000000 +150154 -1.000000 +150155 -1.000000 +150156 -1.000000 +150157 -1.000000 +150158 -1.000000 +150159 -1.000000 +150160 -1.000000 +150161 -1.000000 +150162 -1.000000 +150163 -1.000000 +150164 -1.000000 +150168 -1.000000 +150169 -1.000000 +150170 -1.000000 +150174 -1.000000 +150176 -1.000000 +150179 -1.000000 +150181 -1.000000 +150183 -1.000000 +150184 -1.000000 +150186 -1.000000 +150219 -1.000000 +150220 -1.000000 +150222 -1.000000 +150223 -1.000000 +150225 -1.000000 +150226 -1.000000 +150228 -1.000000 +150247 -1.000000 +150264 -1.000000 +150266 -1.000000 +150269 -1.000000 +150270 -1.000000 +150281 -1.000000 +150282 -1.000000 +150284 -1.000000 +150285 -1.000000 +150287 -1.000000 +150294 -1.000000 +150299 -1.000000 +150300 -1.000000 +150301 -1.000000 +150302 -1.000000 +150306 -1.000000 +150307 -1.000000 +150308 -1.000000 +150309 -1.000000 +150310 -1.000000 +150311 -1.000000 +150312 -1.000000 +150313 -1.000000 +150314 -1.000000 +150315 -1.000000 +150316 -1.000000 +150317 -1.000000 +150318 -1.000000 +150319 -1.000000 +150320 -1.000000 +150321 -1.000000 +150326 -1.000000 +150327 -1.000000 +150328 -1.000000 +150329 -1.000000 +150330 -1.000000 +150331 -1.000000 +150332 -1.000000 +150333 -1.000000 +150334 -1.000000 +150335 -1.000000 +150336 -1.000000 +150337 -1.000000 +150363 -1.000000 +150374 -1.000000 +150401 -1.000000 +150406 -1.000000 +150409 -1.000000 +150411 -1.000000 +150412 -1.000000 +150414 -1.000000 +150415 -1.000000 +150416 -1.000000 +150417 -1.000000 +150418 -1.000000 +150419 -1.000000 +150420 -1.000000 +150422 -1.000000 +150423 -1.000000 +150424 -1.000000 +150426 -1.000000 +150427 -1.000000 +150428 -1.000000 +150430 -1.000000 +150431 -1.000000 +150432 -1.000000 +150433 -1.000000 +150434 -1.000000 +150435 -1.000000 +150436 -1.000000 +150441 -1.000000 +150442 -1.000000 +150443 -1.000000 +150444 -1.000000 +150445 -1.000000 +150446 -1.000000 +150454 -1.000000 +150455 -1.000000 +150456 -1.000000 +150457 -1.000000 +150458 -1.000000 +150459 -1.000000 +150460 -1.000000 +150472 -1.000000 +150473 -1.000000 +150512 -1.000000 +150518 -1.000000 +150519 -1.000000 +150520 -1.000000 +150521 -1.000000 +150523 -1.000000 +150526 -1.000000 +150530 -1.000000 +150549 -1.000000 +150550 -1.000000 +150552 -1.000000 +150554 -1.000000 +150559 -1.000000 +150602 -1.000000 +150603 -1.000000 +150604 -1.000000 +150605 -1.000000 +150606 -1.000000 +150607 -1.000000 +150608 -1.000000 +150609 -1.000000 +150610 -1.000000 +150611 -1.000000 +150612 -1.000000 +150614 -1.000000 +150615 -1.000000 +150616 -1.000000 +150618 -1.000000 +150620 -1.000000 +150622 -1.000000 +150623 -1.000000 +150624 -1.000000 +150633 -1.000000 +150637 -1.000000 +150640 -1.000000 +150645 -1.000000 +150652 -1.000000 +150653 -1.000000 +150655 -1.000000 +150657 -1.000000 +150658 -1.000000 +150660 -1.000000 +150662 -1.000000 +150663 -1.000000 +150664 -1.000000 +150665 -1.000000 +150666 -1.000000 +150667 -1.000000 +150672 -1.000000 +150673 -1.000000 +150674 -1.000000 +150675 -1.000000 +150676 -1.000000 +150677 -1.000000 +150678 -1.000000 +150679 -1.000000 +150680 -1.000000 +150681 -1.000000 +150682 -1.000000 +150683 -1.000000 +150684 -1.000000 +150685 -1.000000 +150686 -1.000000 +150687 -1.000000 +150697 -1.000000 +150699 -1.000000 +150700 -1.000000 +150701 -1.000000 +150702 -1.000000 +150703 -1.000000 +150704 -1.000000 +150713 -1.000000 +150717 -1.000000 +150718 -1.000000 +150719 -1.000000 +150720 -1.000000 +150721 -1.000000 +150724 -1.000000 +150726 -1.000000 +150727 -1.000000 +150729 -1.000000 +150731 -1.000000 +150734 -1.000000 +150735 -1.000000 +150739 -1.000000 +150743 -1.000000 +150747 -1.000000 +150748 -1.000000 +150749 -1.000000 +150750 -1.000000 +150751 -1.000000 +150752 -1.000000 +150753 -1.000000 +150754 -1.000000 +150757 -1.000000 +150758 -1.000000 +150759 -1.000000 +150760 -1.000000 +150761 -1.000000 +150762 -1.000000 +150763 -1.000000 +150764 -1.000000 +150765 -1.000000 +150766 -1.000000 +150767 -1.000000 +150768 -1.000000 +150769 -1.000000 +150770 -1.000000 +150771 -1.000000 +150772 -1.000000 +150773 -1.000000 +150774 -1.000000 +150778 -1.000000 +150779 -1.000000 +150780 -1.000000 +150782 -1.000000 +150783 -1.000000 +150785 -1.000000 +150786 -1.000000 +150787 -1.000000 +150789 -1.000000 +150790 -1.000000 +150792 -1.000000 +150795 -1.000000 +150796 -1.000000 +150797 -1.000000 +150798 -1.000000 +150799 -1.000000 +150800 -1.000000 +150801 -1.000000 +150802 -1.000000 +150803 -1.000000 +150804 -1.000000 +150805 -1.000000 +150806 -1.000000 +150807 -1.000000 +150808 -1.000000 +150809 -1.000000 +150810 -1.000000 +150811 -1.000000 +150812 -1.000000 +150814 -1.000000 +150815 -1.000000 +150816 -1.000000 +150817 -1.000000 +150821 -1.000000 +150822 -1.000000 +150823 -1.000000 +150825 -1.000000 +150826 -1.000000 +150828 -1.000000 +150833 -1.000000 +150836 -1.000000 +150837 -1.000000 +150839 -1.000000 +150840 -1.000000 +150842 -1.000000 +150843 -1.000000 +150844 -1.000000 +150846 -1.000000 +150847 -1.000000 +150849 -1.000000 +150862 -1.000000 +150863 -1.000000 +150865 -1.000000 +150867 -1.000000 +150869 -1.000000 +150870 -1.000000 +150872 -1.000000 +150877 -1.000000 +150878 -1.000000 +150879 -1.000000 +150881 -1.000000 +150882 -1.000000 +150883 -1.000000 +150885 -1.000000 +150886 -1.000000 +150887 -1.000000 +150888 -1.000000 +150890 -1.000000 +150891 -1.000000 +150900 -1.000000 +150901 -1.000000 +150902 -1.000000 +150903 -1.000000 +150907 -1.000000 +150908 -1.000000 +150909 -1.000000 +150910 -1.000000 +152129 -1.000000 +152130 -1.000000 +152132 -1.000000 +152133 -1.000000 +152134 -1.000000 +152135 -1.000000 +152137 -1.000000 +152138 -1.000000 +152139 -1.000000 +152140 -1.000000 +152141 -1.000000 +152142 -1.000000 +152143 -1.000000 +152144 -1.000000 +152145 -1.000000 +152146 -1.000000 +152147 -1.000000 +152148 -1.000000 +152149 -1.000000 +152150 -1.000000 +152151 -1.000000 +152152 -1.000000 +152153 -1.000000 +152154 -1.000000 +152165 -1.000000 +152166 -1.000000 +152167 -1.000000 +152168 -1.000000 +152169 -1.000000 +152170 -1.000000 +152171 -1.000000 +152173 -1.000000 +152175 -1.000000 +152177 -1.000000 +152178 -1.000000 +152179 -1.000000 +152180 -1.000000 +152181 -1.000000 +152182 -1.000000 +152183 -1.000000 +152192 -1.000000 +152193 -1.000000 +152194 -1.000000 +152195 -1.000000 +152196 -1.000000 +152197 -1.000000 +152201 -1.000000 +152202 -1.000000 +152203 -1.000000 +152204 -1.000000 +152207 -1.000000 +152208 -1.000000 +152209 -1.000000 +152210 -1.000000 +152211 -1.000000 +152228 -1.000000 +152230 -1.000000 +152232 -1.000000 +152233 -1.000000 +152235 -1.000000 +152236 -1.000000 +152237 -1.000000 +152238 -1.000000 +152239 -1.000000 +152240 -1.000000 +152244 -1.000000 +152245 -1.000000 +152246 -1.000000 +152248 -1.000000 +152249 -1.000000 +152250 -1.000000 +152251 -1.000000 +152252 -1.000000 +152253 -1.000000 +152254 -1.000000 +152255 -1.000000 +152256 -1.000000 +152257 -1.000000 +152269 -1.000000 +152270 -1.000000 +152271 -1.000000 +152272 -1.000000 +152273 -1.000000 +152274 -1.000000 +152275 -1.000000 +152276 -1.000000 +152277 -1.000000 +152278 -1.000000 +152279 -1.000000 +152280 -1.000000 +152281 -1.000000 +152282 -1.000000 +152286 -1.000000 +152287 -1.000000 +152288 -1.000000 +152289 -1.000000 +152290 -1.000000 +152291 -1.000000 +152292 -1.000000 +152293 -1.000000 +152294 -1.000000 +152295 -1.000000 +152296 -1.000000 +152305 -1.000000 +152306 -1.000000 +152314 -1.000000 +152316 -1.000000 +152318 -1.000000 +152319 -1.000000 +152320 -1.000000 +152321 -1.000000 +152322 -1.000000 +152323 -1.000000 +152325 -1.000000 +152326 -1.000000 +152327 -1.000000 +152328 -1.000000 +152329 -1.000000 +152330 -1.000000 +152331 -1.000000 +152332 -1.000000 +152333 -1.000000 +152339 -1.000000 +152340 -1.000000 +152341 -1.000000 +152342 -1.000000 +152343 -1.000000 +152344 -1.000000 +152345 -1.000000 +152346 -1.000000 +152347 -1.000000 +152348 -1.000000 +152349 -1.000000 +152350 -1.000000 +152351 -1.000000 +152352 -1.000000 +152353 -1.000000 +152354 -1.000000 +152355 -1.000000 +152356 -1.000000 +152358 -1.000000 +152359 -1.000000 +152364 -1.000000 +152365 -1.000000 +152366 -1.000000 +152372 -1.000000 +152373 -1.000000 +152374 -1.000000 +152375 -1.000000 +152425 -1.000000 +152426 -1.000000 +152427 -1.000000 +152428 -1.000000 +152429 -1.000000 +152430 -1.000000 +152431 -1.000000 +152432 -1.000000 +152433 -1.000000 +152434 -1.000000 +152435 -1.000000 +152436 -1.000000 +152437 -1.000000 +152438 -1.000000 +152440 -1.000000 +152441 -1.000000 +152442 -1.000000 +152443 -1.000000 +152444 -1.000000 +152445 -1.000000 +152446 -1.000000 +152483 -1.000000 +152484 -1.000000 +152485 -1.000000 +152486 -1.000000 +152487 -1.000000 +152488 -1.000000 +152489 -1.000000 +152490 -1.000000 +152491 -1.000000 +152492 -1.000000 +152493 -1.000000 +152494 -1.000000 +152495 -1.000000 +152496 -1.000000 +152497 -1.000000 +152498 -1.000000 +152504 -1.000000 +152505 -1.000000 +152506 -1.000000 +152507 -1.000000 +152508 -1.000000 +152509 -1.000000 +152510 -1.000000 +152511 -1.000000 +152512 -1.000000 +152513 -1.000000 +152548 -1.000000 +152549 -1.000000 +152550 -1.000000 +152551 -1.000000 +152552 -1.000000 +152554 -1.000000 +152555 -1.000000 +152556 -1.000000 +152557 -1.000000 +152563 -1.000000 +152564 -1.000000 +152565 -1.000000 +152566 -1.000000 +152567 -1.000000 +152568 -1.000000 +152570 -1.000000 +152583 -1.000000 +152584 -1.000000 +152597 -1.000000 +152598 -1.000000 +152599 -1.000000 +152601 -1.000000 +152603 -1.000000 +152604 -1.000000 +152605 -1.000000 +152606 -1.000000 +152616 -1.000000 +152617 -1.000000 +152618 -1.000000 +152619 -1.000000 +152620 -1.000000 +152621 -1.000000 +152622 -1.000000 +152624 -1.000000 +152625 -1.000000 +152630 -1.000000 +152631 -1.000000 +152632 -1.000000 +152633 -1.000000 +152634 -1.000000 +152635 -1.000000 +152636 -1.000000 +152637 -1.000000 +152638 -1.000000 +152639 -1.000000 +152640 -1.000000 +152642 -1.000000 +152643 -1.000000 +152697 -1.000000 +152699 -1.000000 +152700 -1.000000 +152703 -1.000000 +152704 -1.000000 +152705 -1.000000 +152706 -1.000000 +152719 -1.000000 +152720 -1.000000 +152721 -1.000000 +152722 -1.000000 +152723 -1.000000 +152725 -1.000000 +152726 -1.000000 +152727 -1.000000 +152728 -1.000000 +152729 -1.000000 +152730 -1.000000 +152731 -1.000000 +152733 -1.000000 +152734 -1.000000 +152735 -1.000000 +152736 -1.000000 +152737 -1.000000 +152738 -1.000000 +152741 -1.000000 +152742 -1.000000 +152743 -1.000000 +152744 -1.000000 +152745 -1.000000 +152758 -1.000000 +152759 -1.000000 +152760 -1.000000 +152761 -1.000000 +152762 -1.000000 +152763 -1.000000 +152764 -1.000000 +152765 -1.000000 +152766 -1.000000 +152767 -1.000000 +152768 -1.000000 +152769 -1.000000 +152773 -1.000000 +152774 -1.000000 +152775 -1.000000 +152776 -1.000000 +152781 -1.000000 +152789 -1.000000 +152790 -1.000000 +152791 -1.000000 +152796 -1.000000 +152814 -1.000000 +152815 -1.000000 +152816 -1.000000 +152817 -1.000000 +152818 -1.000000 +152821 -1.000000 +152822 -1.000000 +152823 -1.000000 +152824 -1.000000 +152825 -1.000000 +152826 -1.000000 +152827 -1.000000 +152828 -1.000000 +152833 -1.000000 +152834 -1.000000 +152835 -1.000000 +152836 -1.000000 +152837 -1.000000 +152838 -1.000000 +152839 -1.000000 +152840 -1.000000 +152841 -1.000000 +152842 -1.000000 +152843 -1.000000 +152844 -1.000000 +152851 -1.000000 +152855 -1.000000 +152857 -1.000000 +152862 -1.000000 +152863 -1.000000 +152864 -1.000000 +152865 -1.000000 +152866 -1.000000 +152867 -1.000000 +152868 -1.000000 +152869 -1.000000 +152870 -1.000000 +152871 -1.000000 +152872 -1.000000 +152873 -1.000000 +152874 -1.000000 +152875 -1.000000 +152876 -1.000000 +152877 -1.000000 +152878 -1.000000 +152880 -1.000000 +152886 -1.000000 +152891 -1.000000 +152898 -1.000000 +152911 -1.000000 +152912 -1.000000 +152915 -1.000000 +152919 -1.000000 +152921 -1.000000 +152922 -1.000000 +152923 -1.000000 +152924 -1.000000 +152926 -1.000000 +152927 -1.000000 +152928 -1.000000 +152929 -1.000000 +152930 -1.000000 +152932 -1.000000 +152933 -1.000000 +152934 -1.000000 +152935 -1.000000 +152936 -1.000000 +152937 -1.000000 +152965 -1.000000 +152975 -1.000000 +152976 -1.000000 +152977 -1.000000 +152978 -1.000000 +152979 -1.000000 +152982 -1.000000 +152985 -1.000000 +152987 -1.000000 +152988 -1.000000 +152989 -1.000000 +152990 -1.000000 +152991 -1.000000 +152992 -1.000000 +152993 -1.000000 +152994 -1.000000 +152995 -1.000000 +152996 -1.000000 +152997 -1.000000 +152998 -1.000000 +152999 -1.000000 +153000 -1.000000 +153001 -1.000000 +153002 -1.000000 +153003 -1.000000 +153004 -1.000000 +153005 -1.000000 +153006 -1.000000 +153007 -1.000000 +153008 -1.000000 +153009 -1.000000 +153010 -1.000000 +153011 -1.000000 +153012 -1.000000 +153022 -1.000000 +153023 -1.000000 +153024 -1.000000 +153025 -1.000000 +153026 -1.000000 +153027 -1.000000 +153028 -1.000000 +153029 -1.000000 +153030 -1.000000 +153031 -1.000000 +153032 -1.000000 +153033 -1.000000 +153034 -1.000000 +153035 -1.000000 +153036 -1.000000 +153037 -1.000000 +153038 -1.000000 +153039 -1.000000 +153040 -1.000000 +153041 -1.000000 +153042 -1.000000 +153043 -1.000000 +153044 -1.000000 +153045 -1.000000 +153046 -1.000000 +153047 -1.000000 +153048 -1.000000 +153049 -1.000000 +153050 -1.000000 +153054 -1.000000 +153060 -1.000000 +153061 -1.000000 +153062 -1.000000 +153063 -1.000000 +153064 -1.000000 +153065 -1.000000 +153066 -1.000000 +153067 -1.000000 +153068 -1.000000 +153070 -1.000000 +153071 -1.000000 +153072 -1.000000 +153073 -1.000000 +153074 -1.000000 +153075 -1.000000 +153076 -1.000000 +153077 -1.000000 +153078 -1.000000 +153079 -1.000000 +153080 -1.000000 +153081 -1.000000 +153082 -1.000000 +153083 -1.000000 +153084 -1.000000 +153085 -1.000000 +153093 -1.000000 +153094 -1.000000 +153095 -1.000000 +153096 -1.000000 +153098 -1.000000 +153099 -1.000000 +153100 -1.000000 +153101 -1.000000 +153102 -1.000000 +153103 -1.000000 +153104 -1.000000 +153105 -1.000000 +153106 -1.000000 +153108 -1.000000 +153109 -1.000000 +153110 -1.000000 +153111 -1.000000 +153112 -1.000000 +153114 -1.000000 +153115 -1.000000 +153116 -1.000000 +153117 -1.000000 +153118 -1.000000 +153119 -1.000000 +153151 -1.000000 +153152 -1.000000 +153153 -1.000000 +153154 -1.000000 +153156 -1.000000 +153158 -1.000000 +153252 -1.000000 +153253 -1.000000 +153254 -1.000000 +153255 -1.000000 +153256 -1.000000 +153260 -1.000000 +153261 -1.000000 +153269 -1.000000 +153277 -1.000000 +153283 -1.000000 +153284 -1.000000 +153286 -1.000000 +153287 -1.000000 +153289 -1.000000 +153290 -1.000000 +153291 -1.000000 +153292 -1.000000 +153293 -1.000000 +153295 -1.000000 +153296 -1.000000 +153297 -1.000000 +153298 -1.000000 +153299 -1.000000 +153301 -1.000000 +153304 -1.000000 +153306 -1.000000 +153308 -1.000000 +153309 -1.000000 +153314 -1.000000 +153318 -1.000000 +153322 -1.000000 +153326 -1.000000 +153328 -1.000000 +153333 -1.000000 +153341 -1.000000 +153342 -1.000000 +153348 -1.000000 +153349 -1.000000 +153350 -1.000000 +153357 -1.000000 +153359 -1.000000 +153368 -1.000000 +153370 -1.000000 +153375 -1.000000 +153377 -1.000000 +153378 -1.000000 +153382 -1.000000 +153396 -1.000000 +153398 -1.000000 +153399 -1.000000 +153402 -1.000000 +153403 -1.000000 +153404 -1.000000 +153405 -1.000000 +153406 -1.000000 +153407 -1.000000 +153408 -1.000000 +153412 -1.000000 +153418 -1.000000 +153419 -1.000000 +153421 -1.000000 +153422 -1.000000 +153424 -1.000000 +153425 -1.000000 +153427 -1.000000 +153428 -1.000000 +153429 -1.000000 +153430 -1.000000 +153431 -1.000000 +153432 -1.000000 +153433 -1.000000 +153434 -1.000000 +153435 -1.000000 +153436 -1.000000 +153437 -1.000000 +153439 -1.000000 +153441 -1.000000 +153442 -1.000000 +153457 -1.000000 +153458 -1.000000 +153463 -1.000000 +153464 -1.000000 +153465 -1.000000 +153466 -1.000000 +153467 -1.000000 +153470 -1.000000 +153471 -1.000000 +153472 -1.000000 +153473 -1.000000 +153474 -1.000000 +153475 -1.000000 +153476 -1.000000 +153481 -1.000000 +153482 -1.000000 +153485 -1.000000 +153486 -1.000000 +153487 -1.000000 +153488 -1.000000 +153489 -1.000000 +153491 -1.000000 +153492 -1.000000 +153493 -1.000000 +153495 -1.000000 +153496 -1.000000 +153497 -1.000000 +153498 -1.000000 +153499 -1.000000 +153500 -1.000000 +153501 -1.000000 +153502 -1.000000 +153503 -1.000000 +153504 -1.000000 +153505 -1.000000 +153506 -1.000000 +153509 -1.000000 +153510 -1.000000 +153511 -1.000000 +153512 -1.000000 +153513 -1.000000 +153514 -1.000000 +153515 -1.000000 +153516 -1.000000 +153517 -1.000000 +153518 -1.000000 +153519 -1.000000 +153520 -1.000000 +153533 -1.000000 +153537 -1.000000 +153541 -1.000000 +153542 -1.000000 +153543 -1.000000 +153544 -1.000000 +153550 -1.000000 +153551 -1.000000 +153561 -1.000000 +153562 -1.000000 +153564 -1.000000 +153576 -1.000000 +153577 -1.000000 +153578 -1.000000 +153580 -1.000000 +153581 -1.000000 +153582 -1.000000 +153589 -1.000000 +153590 -1.000000 +153591 -1.000000 +153592 -1.000000 +153595 -1.000000 +153596 -1.000000 +153597 -1.000000 +153598 -1.000000 +153599 -1.000000 +153600 -1.000000 +153606 -1.000000 +153609 -1.000000 +153611 -1.000000 +153612 -1.000000 +153614 -1.000000 +153615 -1.000000 +153616 -1.000000 +153617 -1.000000 +153618 -1.000000 +153619 -1.000000 +153620 -1.000000 +153622 -1.000000 +153623 -1.000000 +153624 -1.000000 +153625 -1.000000 +153626 -1.000000 +153627 -1.000000 +153628 -1.000000 +153629 -1.000000 +153630 -1.000000 +153631 -1.000000 +153638 -1.000000 +153639 -1.000000 +153640 -1.000000 +153641 -1.000000 +153642 -1.000000 +153643 -1.000000 +153644 -1.000000 +153645 -1.000000 +153646 -1.000000 +153647 -1.000000 +153648 -1.000000 +153649 -1.000000 +153650 -1.000000 +153651 -1.000000 +153653 -1.000000 +153654 -1.000000 +153655 -1.000000 +153656 -1.000000 +153657 -1.000000 +153658 -1.000000 +153659 -1.000000 +153661 -1.000000 +153662 -1.000000 +153663 -1.000000 +153669 -1.000000 +153670 -1.000000 +153671 -1.000000 +153672 -1.000000 +153673 -1.000000 +153677 -1.000000 +153678 -1.000000 +153679 -1.000000 +153680 -1.000000 +153682 -1.000000 +153683 -1.000000 +153684 -1.000000 +153685 -1.000000 +153686 -1.000000 +153694 -1.000000 +153695 -1.000000 +153696 -1.000000 +153697 -1.000000 +153700 -1.000000 +153701 -1.000000 +153702 -1.000000 +153703 -1.000000 +153704 -1.000000 +153705 -1.000000 +153707 -1.000000 +153708 -1.000000 +153709 -1.000000 +153710 -1.000000 +153711 -1.000000 +153712 -1.000000 +153721 -1.000000 +153722 -1.000000 +153726 -1.000000 +153727 -1.000000 +153734 -1.000000 +153735 -1.000000 +153737 -1.000000 +153740 -1.000000 +153754 -1.000000 +153757 -1.000000 +153759 -1.000000 +153760 -1.000000 +153761 -1.000000 +153762 -1.000000 +153763 -1.000000 +153764 -1.000000 +153765 -1.000000 +153766 -1.000000 +153767 -1.000000 +153768 -1.000000 +153769 -1.000000 +153771 -1.000000 +153774 -1.000000 +153801 -1.000000 +153802 -1.000000 +153803 -1.000000 +153804 -1.000000 +153805 -1.000000 +153806 -1.000000 +153813 -1.000000 +153816 -1.000000 +153818 -1.000000 +153819 -1.000000 +153820 -1.000000 +153821 -1.000000 +153822 -1.000000 +153823 -1.000000 +153824 -1.000000 +153825 -1.000000 +153826 -1.000000 +153827 -1.000000 +153828 -1.000000 +153829 -1.000000 +153830 -1.000000 +153831 -1.000000 +153832 -1.000000 +153833 -1.000000 +153834 -1.000000 +153835 -1.000000 +153836 -1.000000 +153837 -1.000000 +153838 -1.000000 +153839 -1.000000 +153840 -1.000000 +153841 -1.000000 +153852 -1.000000 +153853 -1.000000 +153854 -1.000000 +153855 -1.000000 +153856 -1.000000 +153857 -1.000000 +153858 -1.000000 +153859 -1.000000 +153860 -1.000000 +153861 -1.000000 +153862 -1.000000 +153863 -1.000000 +153864 -1.000000 +153867 -1.000000 +153869 -1.000000 +153871 -1.000000 +153872 -1.000000 +153888 -1.000000 +153891 -1.000000 +153893 -1.000000 +153902 -1.000000 +153903 -1.000000 +153904 -1.000000 +153905 -1.000000 +153906 -1.000000 +153909 -1.000000 +153911 -1.000000 +153919 -1.000000 +153920 -1.000000 +153921 -1.000000 +153922 -1.000000 +153923 -1.000000 +153924 -1.000000 +153925 -1.000000 +153926 -1.000000 +153927 -1.000000 +153928 -1.000000 +153929 -1.000000 +153931 -1.000000 +153932 -1.000000 +153933 -1.000000 +153934 -1.000000 +153935 -1.000000 +153936 -1.000000 +153937 -1.000000 +153938 -1.000000 +153939 -1.000000 +153940 -1.000000 +153941 -1.000000 +153942 -1.000000 +153943 -1.000000 +153944 -1.000000 +153949 -1.000000 +153950 -1.000000 +153951 -1.000000 +153952 -1.000000 +153955 -1.000000 +153957 -1.000000 +153958 -1.000000 +153962 -1.000000 +153963 -1.000000 +153966 -1.000000 +153988 -1.000000 +153989 -1.000000 +153990 -1.000000 +153991 -1.000000 +153992 -1.000000 +153993 -1.000000 +153994 -1.000000 +153995 -1.000000 +153996 -1.000000 +153997 -1.000000 +153998 -1.000000 +153999 -1.000000 +154000 -1.000000 +154003 -1.000000 +154033 -1.000000 +154035 -1.000000 +154037 -1.000000 +154038 -1.000000 +154044 -1.000000 +154045 -1.000000 +154046 -1.000000 +154047 -1.000000 +154048 -1.000000 +154049 -1.000000 +154050 -1.000000 +154051 -1.000000 +154052 -1.000000 +154053 -1.000000 +154054 -1.000000 +154055 -1.000000 +154057 -1.000000 +154058 -1.000000 +154059 -1.000000 +154060 -1.000000 +154061 -1.000000 +154062 -1.000000 +154063 -1.000000 +154064 -1.000000 +154065 -1.000000 +154066 -1.000000 +154067 -1.000000 +154068 -1.000000 +154079 -1.000000 +154081 -1.000000 +154082 -1.000000 +154083 -1.000000 +154092 -1.000000 +154105 -1.000000 +154117 -1.000000 +154118 -1.000000 +154119 -1.000000 +154122 -1.000000 +154123 -1.000000 +154124 -1.000000 +154125 -1.000000 +154126 -1.000000 +154128 -1.000000 +154165 -1.000000 +154247 -1.000000 +154248 -1.000000 +154249 -1.000000 +154250 -1.000000 +154251 -1.000000 +154252 -1.000000 +154253 -1.000000 +154254 -1.000000 +154256 -1.000000 +154257 -1.000000 +154258 -1.000000 +154259 -1.000000 +154260 -1.000000 +154267 -1.000000 +154268 -1.000000 +154284 -1.000000 +154285 -1.000000 +154286 -1.000000 +154287 -1.000000 +154288 -1.000000 +154289 -1.000000 +154290 -1.000000 +154291 -1.000000 +154292 -1.000000 +154293 -1.000000 +154294 -1.000000 +154295 -1.000000 +154296 -1.000000 +154297 -1.000000 +154298 -1.000000 +154310 -1.000000 +154317 -1.000000 +154318 -1.000000 +154319 -1.000000 +154320 -1.000000 +154321 -1.000000 +154322 -1.000000 +154323 -1.000000 +154324 -1.000000 +154325 -1.000000 +154326 -1.000000 +154327 -1.000000 +154328 -1.000000 +154329 -1.000000 +154330 -1.000000 +154331 -1.000000 +154332 -1.000000 +154333 -1.000000 +154334 -1.000000 +154335 -1.000000 +154336 -1.000000 +154337 -1.000000 +154338 -1.000000 +154339 -1.000000 +154340 -1.000000 +154341 -1.000000 +154342 -1.000000 +154343 -1.000000 +154344 -1.000000 +154345 -1.000000 +154346 -1.000000 +154347 -1.000000 +154348 -1.000000 +154349 -1.000000 +154357 -1.000000 +154358 -1.000000 +154359 -1.000000 +154360 -1.000000 +154362 -1.000000 +154363 -1.000000 +154364 -1.000000 +154365 -1.000000 +154366 -1.000000 +154368 -1.000000 +154369 -1.000000 +154370 -1.000000 +154371 -1.000000 +154372 -1.000000 +154373 -1.000000 +154374 -1.000000 +154375 -1.000000 +154376 -1.000000 +154377 -1.000000 +154378 -1.000000 +154380 -1.000000 +154381 -1.000000 +154383 -1.000000 +154384 -1.000000 +154385 -1.000000 +154387 -1.000000 +154388 -1.000000 +154389 -1.000000 +154390 -1.000000 +154391 -1.000000 +154392 -1.000000 +154396 -1.000000 +154397 -1.000000 +154398 -1.000000 +154399 -1.000000 +154400 -1.000000 +154401 -1.000000 +154402 -1.000000 +154403 -1.000000 +154404 -1.000000 +154405 -1.000000 +154406 -1.000000 +154407 -1.000000 +154408 -1.000000 +154410 -1.000000 +154411 -1.000000 +154412 -1.000000 +154414 -1.000000 +154415 -1.000000 +154416 -1.000000 +154417 -1.000000 +154418 -1.000000 +154419 -1.000000 +154421 -1.000000 +154427 -1.000000 +154428 -1.000000 +154429 -1.000000 +154430 -1.000000 +154431 -1.000000 +154432 -1.000000 +154433 -1.000000 +154434 -1.000000 +154435 -1.000000 +154436 -1.000000 +154437 -1.000000 +154438 -1.000000 +154440 -1.000000 +154441 -1.000000 +154442 -1.000000 +154443 -1.000000 +154445 -1.000000 +154446 -1.000000 +154447 -1.000000 +154448 -1.000000 +154449 -1.000000 +154450 -1.000000 +154451 -1.000000 +154464 -1.000000 +154466 -1.000000 +154477 -1.000000 +154481 -1.000000 +154486 -1.000000 +154497 -1.000000 +154503 -1.000000 +154504 -1.000000 +154505 -1.000000 +154506 -1.000000 +154507 -1.000000 +154508 -1.000000 +154509 -1.000000 +154510 -1.000000 +154511 -1.000000 +154516 -1.000000 +154518 -1.000000 +154523 -1.000000 +154525 -1.000000 +154527 -1.000000 +154531 -1.000000 +154532 -1.000000 +154535 -1.000000 +154536 -1.000000 +154537 -1.000000 +154538 -1.000000 +154540 -1.000000 +154541 -1.000000 +154544 -1.000000 +154547 -1.000000 +154548 -1.000000 +154550 -1.000000 +154554 -1.000000 +154556 -1.000000 +154557 -1.000000 +154562 -1.000000 +154564 -1.000000 +154565 -1.000000 +154566 -1.000000 +154567 -1.000000 +154569 -1.000000 +154570 -1.000000 +154572 -1.000000 +154573 -1.000000 +154574 -1.000000 +154578 -1.000000 +154579 -1.000000 +154583 -1.000000 +154584 -1.000000 +154585 -1.000000 +154586 -1.000000 +154587 -1.000000 +154588 -1.000000 +154589 -1.000000 +154591 -1.000000 +154592 -1.000000 +154593 -1.000000 +154595 -1.000000 +154606 -1.000000 +154613 -1.000000 +154647 -1.000000 +154648 -1.000000 +154649 -1.000000 +154650 -1.000000 +154652 -1.000000 +154655 -1.000000 +154656 -1.000000 +154657 -1.000000 +154658 -1.000000 +154659 -1.000000 +154660 -1.000000 +154663 -1.000000 +154665 -1.000000 +154666 -1.000000 +154667 -1.000000 +154668 -1.000000 +154670 -1.000000 +154671 -1.000000 +154672 -1.000000 +154674 -1.000000 +154675 -1.000000 +154677 -1.000000 +154678 -1.000000 +154679 -1.000000 +154680 -1.000000 +154681 -1.000000 +154684 -1.000000 +154685 -1.000000 +154686 -1.000000 +154687 -1.000000 +154688 -1.000000 +154689 -1.000000 +154690 -1.000000 +154691 -1.000000 +154692 -1.000000 +154693 -1.000000 +154694 -1.000000 +154695 -1.000000 +154696 -1.000000 +154723 -1.000000 +154724 -1.000000 +154725 -1.000000 +154726 -1.000000 +154727 -1.000000 +154728 -1.000000 +154729 -1.000000 +154730 -1.000000 +154731 -1.000000 +154732 -1.000000 +154733 -1.000000 +154734 -1.000000 +154735 -1.000000 +154736 -1.000000 +154737 -1.000000 +154738 -1.000000 +154739 -1.000000 +154740 -1.000000 +154741 -1.000000 +154742 -1.000000 +154743 -1.000000 +154744 -1.000000 +154747 -1.000000 +154748 -1.000000 +154749 -1.000000 +154750 -1.000000 +154751 -1.000000 +154752 -1.000000 +154753 -1.000000 +154754 -1.000000 +154755 -1.000000 +154759 -1.000000 +154760 -1.000000 +154761 -1.000000 +154763 -1.000000 +154764 -1.000000 +154765 -1.000000 +154767 -1.000000 +154774 -1.000000 +154776 -1.000000 +154777 -1.000000 +154779 -1.000000 +154780 -1.000000 +154781 -1.000000 +154785 -1.000000 +154786 -1.000000 +154787 -1.000000 +154788 -1.000000 +154789 -1.000000 +154797 -1.000000 +154830 -1.000000 +154831 -1.000000 +154833 -1.000000 +154834 -1.000000 +154835 -1.000000 +154836 -1.000000 +154837 -1.000000 +154842 -1.000000 +154849 -1.000000 +154858 -1.000000 +154859 -1.000000 +154860 -1.000000 +154861 -1.000000 +154862 -1.000000 +154863 -1.000000 +154864 -1.000000 +154865 -1.000000 +154866 -1.000000 +154867 -1.000000 +154868 -1.000000 +154869 -1.000000 +154870 -1.000000 +154871 -1.000000 +154872 -1.000000 +154873 -1.000000 +154879 -1.000000 +154893 -1.000000 +154894 -1.000000 +154919 -1.000000 +154922 -1.000000 +154926 -1.000000 +154927 -1.000000 +154928 -1.000000 +154929 -1.000000 +154930 -1.000000 +154931 -1.000000 +154932 -1.000000 +154933 -1.000000 +154934 -1.000000 +154935 -1.000000 +154937 -1.000000 +154939 -1.000000 +154971 -1.000000 +154976 -1.000000 +154980 -1.000000 +154982 -1.000000 +154984 -1.000000 +154993 -1.000000 +155003 -1.000000 +155004 -1.000000 +155005 -1.000000 +155008 -1.000000 +155011 -1.000000 +155013 -1.000000 +155023 -1.000000 +155024 -1.000000 +155025 -1.000000 +155026 -1.000000 +155027 -1.000000 +155028 -1.000000 +155029 -1.000000 +155030 -1.000000 +155038 -1.000000 +155039 -1.000000 +155068 -1.000000 +155103 -1.000000 +155105 -1.000000 +155106 -1.000000 +155107 -1.000000 +155113 -1.000000 +155114 -1.000000 +155115 -1.000000 +155117 -1.000000 +155118 -1.000000 +155119 -1.000000 +155120 -1.000000 +155121 -1.000000 +155122 -1.000000 +155123 -1.000000 +155125 -1.000000 +155126 -1.000000 +155127 -1.000000 +155128 -1.000000 +155129 -1.000000 +155130 -1.000000 +155131 -1.000000 +155132 -1.000000 +155133 -1.000000 +155134 -1.000000 +155135 -1.000000 +155136 -1.000000 +155137 -1.000000 +155138 -1.000000 +155139 -1.000000 +155140 -1.000000 +155141 -1.000000 +155142 -1.000000 +155143 -1.000000 +155147 -1.000000 +155148 -1.000000 +155149 -1.000000 +155150 -1.000000 +155151 -1.000000 +155152 -1.000000 +155153 -1.000000 +155154 -1.000000 +155156 -1.000000 +155157 -1.000000 +155158 -1.000000 +155159 -1.000000 +155160 -1.000000 +155161 -1.000000 +155162 -1.000000 +155163 -1.000000 +155164 -1.000000 +155165 -1.000000 +155166 -1.000000 +155167 -1.000000 +155168 -1.000000 +155170 -1.000000 +155171 -1.000000 +155172 -1.000000 +155173 -1.000000 +155174 -1.000000 +155175 -1.000000 +155182 -1.000000 +155183 -1.000000 +155194 -1.000000 +155195 -1.000000 +155199 -1.000000 +155209 -1.000000 +155212 -1.000000 +155213 -1.000000 +155225 -1.000000 +155227 -1.000000 +155228 -1.000000 +155229 -1.000000 +155230 -1.000000 +155231 -1.000000 +155232 -1.000000 +155233 -1.000000 +155234 -1.000000 +155235 -1.000000 +155236 -1.000000 +155237 -1.000000 +155238 -1.000000 +155239 -1.000000 +155240 -1.000000 +155241 -1.000000 +155242 -1.000000 +155243 -1.000000 +155244 -1.000000 +155245 -1.000000 +155247 -1.000000 +155248 -1.000000 +155249 -1.000000 +155250 -1.000000 +155251 -1.000000 +155252 -1.000000 +155253 -1.000000 +155254 -1.000000 +155256 -1.000000 +155258 -1.000000 +155259 -1.000000 +155270 -1.000000 +155272 -1.000000 +155273 -1.000000 +155279 -1.000000 +155281 -1.000000 +155282 -1.000000 +155283 -1.000000 +155284 -1.000000 +155285 -1.000000 +155288 -1.000000 +155290 -1.000000 +155291 -1.000000 +155292 -1.000000 +155293 -1.000000 +155295 -1.000000 +155296 -1.000000 +155297 -1.000000 +155298 -1.000000 +155299 -1.000000 +155320 -1.000000 +155321 -1.000000 +155322 -1.000000 +155323 -1.000000 +155324 -1.000000 +155326 -1.000000 +155328 -1.000000 +155330 -1.000000 +155335 -1.000000 +155337 -1.000000 +155342 -1.000000 +155343 -1.000000 +155344 -1.000000 +155345 -1.000000 +155346 -1.000000 +155347 -1.000000 +155348 -1.000000 +155352 -1.000000 +155355 -1.000000 +155365 -1.000000 +155366 -1.000000 +155367 -1.000000 +155368 -1.000000 +155369 -1.000000 +155370 -1.000000 +155371 -1.000000 +155372 -1.000000 +155373 -1.000000 +155374 -1.000000 +155375 -1.000000 +155377 -1.000000 +155378 -1.000000 +155379 -1.000000 +155381 -1.000000 +155382 -1.000000 +155383 -1.000000 +155384 -1.000000 +155385 -1.000000 +155386 -1.000000 +155390 -1.000000 +155391 -1.000000 +155392 -1.000000 +155393 -1.000000 +155394 -1.000000 +155407 -1.000000 +155408 -1.000000 +155409 -1.000000 +155411 -1.000000 +155412 -1.000000 +155413 -1.000000 +155414 -1.000000 +155417 -1.000000 +155418 -1.000000 +155419 -1.000000 +155420 -1.000000 +155421 -1.000000 +155422 -1.000000 +155423 -1.000000 +155425 -1.000000 +155426 -1.000000 +155427 -1.000000 +155428 -1.000000 +155429 -1.000000 +155430 -1.000000 +155431 -1.000000 +155432 -1.000000 +155433 -1.000000 +155434 -1.000000 +155435 -1.000000 +155436 -1.000000 +155437 -1.000000 +155439 -1.000000 +155440 -1.000000 +155442 -1.000000 +155446 -1.000000 +155447 -1.000000 +155448 -1.000000 +155449 -1.000000 +155451 -1.000000 +155463 -1.000000 +155466 -1.000000 +155467 -1.000000 +155474 -1.000000 +155475 -1.000000 +155476 -1.000000 +155477 -1.000000 +155478 -1.000000 +155479 -1.000000 +155480 -1.000000 +155481 -1.000000 +155483 -1.000000 +155484 -1.000000 +155485 -1.000000 +155486 -1.000000 +155487 -1.000000 +155499 -1.000000 +155500 -1.000000 +155501 -1.000000 +155502 -1.000000 +155503 -1.000000 +155504 -1.000000 +155505 -1.000000 +155506 -1.000000 +155507 -1.000000 +155508 -1.000000 +155509 -1.000000 +155510 -1.000000 +155511 -1.000000 +155512 -1.000000 +155513 -1.000000 +155514 -1.000000 +155515 -1.000000 +155516 -1.000000 +155517 -1.000000 +155518 -1.000000 +155519 -1.000000 +155520 -1.000000 +155521 -1.000000 +155522 -1.000000 +155523 -1.000000 +155524 -1.000000 +155526 -1.000000 +155527 -1.000000 +155528 -1.000000 +155529 -1.000000 +155530 -1.000000 +155535 -1.000000 +155536 -1.000000 +155537 -1.000000 +155538 -1.000000 +155539 -1.000000 +155540 -1.000000 +155541 -1.000000 +155542 -1.000000 +155543 -1.000000 +155545 -1.000000 +155546 -1.000000 +155548 -1.000000 +155551 -1.000000 +155552 -1.000000 +155553 -1.000000 +155558 -1.000000 +155559 -1.000000 +155564 -1.000000 +155565 -1.000000 +155566 -1.000000 +155567 -1.000000 +155568 -1.000000 +155569 -1.000000 +155570 -1.000000 +155571 -1.000000 +155572 -1.000000 +155573 -1.000000 +155574 -1.000000 +155575 -1.000000 +155576 -1.000000 +155577 -1.000000 +155578 -1.000000 +155579 -1.000000 +155580 -1.000000 +155581 -1.000000 +155582 -1.000000 +155583 -1.000000 +155584 -1.000000 +155585 -1.000000 +155586 -1.000000 +155589 -1.000000 +155590 -1.000000 +155592 -1.000000 +155593 -1.000000 +155595 -1.000000 +155596 -1.000000 +155599 -1.000000 +155600 -1.000000 +155601 -1.000000 +155602 -1.000000 +155611 -1.000000 +155612 -1.000000 +155613 -1.000000 +155614 -1.000000 +155615 -1.000000 +155616 -1.000000 +155617 -1.000000 +155618 -1.000000 +155619 -1.000000 +155620 -1.000000 +155621 -1.000000 +155622 -1.000000 +155623 -1.000000 +155624 -1.000000 +155625 -1.000000 +155626 -1.000000 +155627 -1.000000 +155628 -1.000000 +155629 -1.000000 +155630 -1.000000 +155631 -1.000000 +155632 -1.000000 +155633 -1.000000 +155641 -1.000000 +155644 -1.000000 +155645 -1.000000 +155646 -1.000000 +155648 -1.000000 +155649 -1.000000 +155650 -1.000000 +155651 -1.000000 +155654 -1.000000 +155655 -1.000000 +155656 -1.000000 +155657 -1.000000 +155658 -1.000000 +155660 -1.000000 +155674 -1.000000 +155681 -1.000000 +156197 -1.000000 +156201 -1.000000 +156202 -1.000000 +156203 -1.000000 +156204 -1.000000 +156206 -1.000000 +156207 -1.000000 +156225 -1.000000 +156226 -1.000000 +156227 -1.000000 +156228 -1.000000 +156229 -1.000000 +156230 -1.000000 +156231 -1.000000 +156232 -1.000000 +156233 -1.000000 +156234 -1.000000 +156235 -1.000000 +156236 -1.000000 +156242 -1.000000 +156243 -1.000000 +156245 -1.000000 +156246 -1.000000 +156247 -1.000000 +156248 -1.000000 +156249 -1.000000 +156250 -1.000000 +156251 -1.000000 +156252 -1.000000 +156253 -1.000000 +156256 -1.000000 +156257 -1.000000 +156258 -1.000000 +156259 -1.000000 +156260 -1.000000 +156261 -1.000000 +156262 -1.000000 +156263 -1.000000 +156264 -1.000000 +156265 -1.000000 +156266 -1.000000 +156274 -1.000000 +156275 -1.000000 +156276 -1.000000 +156277 -1.000000 +156278 -1.000000 +156279 -1.000000 +156280 -1.000000 +156281 -1.000000 +156282 -1.000000 +156283 -1.000000 +156284 -1.000000 +156285 -1.000000 +156286 -1.000000 +156287 -1.000000 +156288 -1.000000 +156292 -1.000000 +156294 -1.000000 +156297 -1.000000 +156298 -1.000000 +156299 -1.000000 +156300 -1.000000 +156301 -1.000000 +156302 -1.000000 +156307 -1.000000 +156308 -1.000000 +156309 -1.000000 +156310 -1.000000 +156311 -1.000000 +156312 -1.000000 +156313 -1.000000 +156314 -1.000000 +156315 -1.000000 +156317 -1.000000 +156318 -1.000000 +156320 -1.000000 +156327 -1.000000 +156332 -1.000000 +156337 -1.000000 +156339 -1.000000 +156340 -1.000000 +156341 -1.000000 +156342 -1.000000 +156349 -1.000000 +156351 -1.000000 +156352 -1.000000 +156353 -1.000000 +156354 -1.000000 +156355 -1.000000 +156356 -1.000000 +156357 -1.000000 +156358 -1.000000 +156359 -1.000000 +156360 -1.000000 +156361 -1.000000 +156362 -1.000000 +156363 -1.000000 +156364 -1.000000 +156365 -1.000000 +156366 -1.000000 +156367 -1.000000 +156368 -1.000000 +156369 -1.000000 +156370 -1.000000 +156371 -1.000000 +156372 -1.000000 +156373 -1.000000 +156374 -1.000000 +156375 -1.000000 +156376 -1.000000 +156384 -1.000000 +156386 -1.000000 +156387 -1.000000 +156388 -1.000000 +156389 -1.000000 +156393 -1.000000 +156394 -1.000000 +156395 -1.000000 +156396 -1.000000 +156397 -1.000000 +156398 -1.000000 +156400 -1.000000 +156401 -1.000000 +156402 -1.000000 +156403 -1.000000 +156413 -1.000000 +156414 -1.000000 +156415 -1.000000 +156416 -1.000000 +156417 -1.000000 +156418 -1.000000 +156419 -1.000000 +156420 -1.000000 +156421 -1.000000 +156422 -1.000000 +156423 -1.000000 +156425 -1.000000 +156426 -1.000000 +156429 -1.000000 +156464 -1.000000 +156465 -1.000000 +156466 -1.000000 +156467 -1.000000 +156468 -1.000000 +156473 -1.000000 +156478 -1.000000 +156481 -1.000000 +156484 -1.000000 +156485 -1.000000 +156502 -1.000000 +156503 -1.000000 +156504 -1.000000 +156505 -1.000000 +156507 -1.000000 +156508 -1.000000 +156509 -1.000000 +156510 -1.000000 +156513 -1.000000 +156516 -1.000000 +156530 -1.000000 +156531 -1.000000 +156532 -1.000000 +156544 -1.000000 +156547 -1.000000 +156548 -1.000000 +156549 -1.000000 +156550 -1.000000 +156554 -1.000000 +156555 -1.000000 +156556 -1.000000 +156557 -1.000000 +156558 -1.000000 +156559 -1.000000 +156562 -1.000000 +156564 -1.000000 +156606 -1.000000 +156607 -1.000000 +156608 -1.000000 +156609 -1.000000 +156610 -1.000000 +156611 -1.000000 +156612 -1.000000 +156613 -1.000000 +156614 -1.000000 +156615 -1.000000 +156616 -1.000000 +156617 -1.000000 +156619 -1.000000 +156620 -1.000000 +156621 -1.000000 +156625 -1.000000 +156636 -1.000000 +156638 -1.000000 +156640 -1.000000 +156642 -1.000000 +156643 -1.000000 +156644 -1.000000 +156645 -1.000000 +156646 -1.000000 +156647 -1.000000 +156648 -1.000000 +156649 -1.000000 +156650 -1.000000 +156651 -1.000000 +156653 -1.000000 +156654 -1.000000 +156655 -1.000000 +156656 -1.000000 +156657 -1.000000 +156659 -1.000000 +156660 -1.000000 +156661 -1.000000 +156662 -1.000000 +156663 -1.000000 +156666 -1.000000 +156668 -1.000000 +156669 -1.000000 +156678 -1.000000 +156679 -1.000000 +156680 -1.000000 +156687 -1.000000 +156692 -1.000000 +156697 -1.000000 +156699 -1.000000 +156700 -1.000000 +156701 -1.000000 +156702 -1.000000 +156703 -1.000000 +156704 -1.000000 +156705 -1.000000 +156706 -1.000000 +156707 -1.000000 +156708 -1.000000 +156709 -1.000000 +156710 -1.000000 +156712 -1.000000 +156713 -1.000000 +156714 -1.000000 +156716 -1.000000 +156722 -1.000000 +156725 -1.000000 +156730 -1.000000 +156731 -1.000000 +156732 -1.000000 +156735 -1.000000 +156737 -1.000000 +156740 -1.000000 +156743 -1.000000 +156744 -1.000000 +156753 -1.000000 +156762 -1.000000 +156763 -1.000000 +156771 -1.000000 +156772 -1.000000 +156773 -1.000000 +156774 -1.000000 +156775 -1.000000 +156776 -1.000000 +156777 -1.000000 +156779 -1.000000 +156780 -1.000000 +156781 -1.000000 +156785 -1.000000 +156786 -1.000000 +156789 -1.000000 +156793 -1.000000 +156797 -1.000000 +156799 -1.000000 +156800 -1.000000 +156801 -1.000000 +156802 -1.000000 +156803 -1.000000 +156805 -1.000000 +156807 -1.000000 +156808 -1.000000 +156809 -1.000000 +156810 -1.000000 +156811 -1.000000 +156814 -1.000000 +156815 -1.000000 +156817 -1.000000 +156820 -1.000000 +156822 -1.000000 +156831 -1.000000 +156832 -1.000000 +156833 -1.000000 +156834 -1.000000 +156835 -1.000000 +156836 -1.000000 +156837 -1.000000 +156838 -1.000000 +156842 -1.000000 +156843 -1.000000 +156844 -1.000000 +156845 -1.000000 +156846 -1.000000 +156847 -1.000000 +156848 -1.000000 +156849 -1.000000 +156850 -1.000000 +156851 -1.000000 +156852 -1.000000 +156853 -1.000000 +156854 -1.000000 +156855 -1.000000 +156856 -1.000000 +156857 -1.000000 +156858 -1.000000 +156859 -1.000000 +156860 -1.000000 +156861 -1.000000 +156862 -1.000000 +156863 -1.000000 +156864 -1.000000 +156865 -1.000000 +156866 -1.000000 +156867 -1.000000 +156868 -1.000000 +156869 -1.000000 +156870 -1.000000 +156871 -1.000000 +156872 -1.000000 +156873 -1.000000 +156874 -1.000000 +156875 -1.000000 +156879 -1.000000 +156882 -1.000000 +156883 -1.000000 +156884 -1.000000 +156885 -1.000000 +156886 -1.000000 +156888 -1.000000 +156889 -1.000000 +156891 -1.000000 +156892 -1.000000 +156893 -1.000000 +156894 -1.000000 +156896 -1.000000 +156897 -1.000000 +156898 -1.000000 +156911 -1.000000 +156912 -1.000000 +156913 -1.000000 +156914 -1.000000 +156915 -1.000000 +156916 -1.000000 +156917 -1.000000 +156921 -1.000000 +156925 -1.000000 +157037 -1.000000 +157038 -1.000000 +157039 -1.000000 +157041 -1.000000 +157042 -1.000000 +157043 -1.000000 +157044 -1.000000 +157046 -1.000000 +157047 -1.000000 +157048 -1.000000 +157049 -1.000000 +157050 -1.000000 +157051 -1.000000 +157052 -1.000000 +157053 -1.000000 +157058 -1.000000 +157059 -1.000000 +157060 -1.000000 +157061 -1.000000 +157062 -1.000000 +157063 -1.000000 +157064 -1.000000 +157065 -1.000000 +157066 -1.000000 +157067 -1.000000 +157068 -1.000000 +157069 -1.000000 +157070 -1.000000 +157071 -1.000000 +157072 -1.000000 +157073 -1.000000 +157074 -1.000000 +157075 -1.000000 +157081 -1.000000 +157082 -1.000000 +157083 -1.000000 +157084 -1.000000 +157087 -1.000000 +157088 -1.000000 +157089 -1.000000 +157090 -1.000000 +157091 -1.000000 +157096 -1.000000 +157097 -1.000000 +157098 -1.000000 +157099 -1.000000 +157100 -1.000000 +157101 -1.000000 +157102 -1.000000 +157103 -1.000000 +157104 -1.000000 +157105 -1.000000 +157106 -1.000000 +157108 -1.000000 +157109 -1.000000 +157116 -1.000000 +157117 -1.000000 +157118 -1.000000 +157119 -1.000000 +157120 -1.000000 +157121 -1.000000 +157122 -1.000000 +157123 -1.000000 +157124 -1.000000 +157125 -1.000000 +157126 -1.000000 +157127 -1.000000 +157128 -1.000000 +157129 -1.000000 +157130 -1.000000 +157131 -1.000000 +157132 -1.000000 +157133 -1.000000 +157134 -1.000000 +157135 -1.000000 +157136 -1.000000 +157137 -1.000000 +157138 -1.000000 +157140 -1.000000 +157143 -1.000000 +157150 -1.000000 +157151 -1.000000 +157152 -1.000000 +157153 -1.000000 +157154 -1.000000 +157155 -1.000000 +157156 -1.000000 +157157 -1.000000 +157158 -1.000000 +157169 -1.000000 +157186 -1.000000 +157188 -1.000000 +157189 -1.000000 +157192 -1.000000 +157193 -1.000000 +157194 -1.000000 +157195 -1.000000 +157196 -1.000000 +157197 -1.000000 +157198 -1.000000 +157202 -1.000000 +157203 -1.000000 +157216 -1.000000 +157218 -1.000000 +157230 -1.000000 +157231 -1.000000 +157232 -1.000000 +157233 -1.000000 +157234 -1.000000 +157235 -1.000000 +157236 -1.000000 +157237 -1.000000 +157238 -1.000000 +157239 -1.000000 +157241 -1.000000 +157243 -1.000000 +157248 -1.000000 +157250 -1.000000 +157255 -1.000000 +157256 -1.000000 +157258 -1.000000 +157259 -1.000000 +157260 -1.000000 +157261 -1.000000 +157262 -1.000000 +157263 -1.000000 +157264 -1.000000 +157265 -1.000000 +157266 -1.000000 +157267 -1.000000 +157268 -1.000000 +157269 -1.000000 +157270 -1.000000 +157271 -1.000000 +157272 -1.000000 +157273 -1.000000 +157274 -1.000000 +157275 -1.000000 +157276 -1.000000 +157277 -1.000000 +157278 -1.000000 +157279 -1.000000 +157281 -1.000000 +157284 -1.000000 +157295 -1.000000 +157296 -1.000000 +157298 -1.000000 +157303 -1.000000 +157304 -1.000000 +157308 -1.000000 +157313 -1.000000 +157318 -1.000000 +157321 -1.000000 +157323 -1.000000 +157369 -1.000000 +157370 -1.000000 +157372 -1.000000 +157373 -1.000000 +157374 -1.000000 +157376 -1.000000 +157377 -1.000000 +157378 -1.000000 +157379 -1.000000 +157381 -1.000000 +157387 -1.000000 +157391 -1.000000 +157399 -1.000000 +157400 -1.000000 +157401 -1.000000 +157402 -1.000000 +157404 -1.000000 +157407 -1.000000 +157408 -1.000000 +157409 -1.000000 +157410 -1.000000 +157411 -1.000000 +157412 -1.000000 +157413 -1.000000 +157414 -1.000000 +157415 -1.000000 +157416 -1.000000 +157417 -1.000000 +157418 -1.000000 +157420 -1.000000 +157424 -1.000000 +157428 -1.000000 +157431 -1.000000 +157432 -1.000000 +157433 -1.000000 +157435 -1.000000 +157458 -1.000000 +157464 -1.000000 +157471 -1.000000 +157482 -1.000000 +157483 -1.000000 +157484 -1.000000 +157485 -1.000000 +157486 -1.000000 +157487 -1.000000 +157488 -1.000000 +157489 -1.000000 +157494 -1.000000 +157495 -1.000000 +157496 -1.000000 +157498 -1.000000 +157499 -1.000000 +157500 -1.000000 +157501 -1.000000 +157502 -1.000000 +157503 -1.000000 +157504 -1.000000 +157505 -1.000000 +157506 -1.000000 +157507 -1.000000 +157508 -1.000000 +157509 -1.000000 +157518 -1.000000 +157519 -1.000000 +157520 -1.000000 +157521 -1.000000 +157523 -1.000000 +157524 -1.000000 +157525 -1.000000 +157527 -1.000000 +157528 -1.000000 +157529 -1.000000 +157530 -1.000000 +157534 -1.000000 +157535 -1.000000 +157536 -1.000000 +157537 -1.000000 +157542 -1.000000 +157545 -1.000000 +157551 -1.000000 +157552 -1.000000 +157553 -1.000000 +157554 -1.000000 +157555 -1.000000 +157556 -1.000000 +157557 -1.000000 +157558 -1.000000 +157559 -1.000000 +157560 -1.000000 +157562 -1.000000 +157564 -1.000000 +157565 -1.000000 +157566 -1.000000 +157567 -1.000000 +157571 -1.000000 +157572 -1.000000 +157573 -1.000000 +157574 -1.000000 +157575 -1.000000 +157576 -1.000000 +157577 -1.000000 +157578 -1.000000 +157579 -1.000000 +157580 -1.000000 +157654 -1.000000 +157655 -1.000000 +157656 -1.000000 +157657 -1.000000 +157658 -1.000000 +157661 -1.000000 +157664 -1.000000 +157665 -1.000000 +157666 -1.000000 +157667 -1.000000 +157668 -1.000000 +157669 -1.000000 +157671 -1.000000 +157672 -1.000000 +157673 -1.000000 +157674 -1.000000 +157675 -1.000000 +157676 -1.000000 +157677 -1.000000 +157678 -1.000000 +157679 -1.000000 +157685 -1.000000 +157686 -1.000000 +157687 -1.000000 +157694 -1.000000 +157699 -1.000000 +157700 -1.000000 +157704 -1.000000 +157705 -1.000000 +157706 -1.000000 +157707 -1.000000 +157708 -1.000000 +157709 -1.000000 +157710 -1.000000 +157713 -1.000000 +157714 -1.000000 +157715 -1.000000 +157723 -1.000000 +157724 -1.000000 +157725 -1.000000 +157726 -1.000000 +157727 -1.000000 +157728 -1.000000 +157729 -1.000000 +157730 -1.000000 +157731 -1.000000 +157732 -1.000000 +157733 -1.000000 +157734 -1.000000 +157735 -1.000000 +157736 -1.000000 +157737 -1.000000 +157738 -1.000000 +157739 -1.000000 +157740 -1.000000 +157741 -1.000000 +157742 -1.000000 +157743 -1.000000 +157744 -1.000000 +157745 -1.000000 +157746 -1.000000 +157747 -1.000000 +157748 -1.000000 +157749 -1.000000 +157750 -1.000000 +157751 -1.000000 +157752 -1.000000 +157753 -1.000000 +157754 -1.000000 +157755 -1.000000 +157756 -1.000000 +157757 -1.000000 +157758 -1.000000 +157759 -1.000000 +157777 -1.000000 +157782 -1.000000 +157783 -1.000000 +157784 -1.000000 +157787 -1.000000 +157793 -1.000000 +157804 -1.000000 +157805 -1.000000 +157806 -1.000000 +157814 -1.000000 +157817 -1.000000 +157819 -1.000000 +157850 -1.000000 +157851 -1.000000 +157858 -1.000000 +157864 -1.000000 +157868 -1.000000 +157880 -1.000000 +157896 -1.000000 +157898 -1.000000 +157899 -1.000000 +157900 -1.000000 +157901 -1.000000 +157902 -1.000000 +157903 -1.000000 +157904 -1.000000 +157905 -1.000000 +157906 -1.000000 +157907 -1.000000 +157908 -1.000000 +157910 -1.000000 +157911 -1.000000 +157912 -1.000000 +157913 -1.000000 +157914 -1.000000 +157915 -1.000000 +157916 -1.000000 +157917 -1.000000 +157918 -1.000000 +157919 -1.000000 +157920 -1.000000 +157930 -1.000000 +157931 -1.000000 +157932 -1.000000 +157933 -1.000000 +157934 -1.000000 +157935 -1.000000 +157947 -1.000000 +157948 -1.000000 +157949 -1.000000 +157950 -1.000000 +157951 -1.000000 +157952 -1.000000 +157953 -1.000000 +157954 -1.000000 +157955 -1.000000 +157956 -1.000000 +157957 -1.000000 +157958 -1.000000 +157959 -1.000000 +157960 -1.000000 +157961 -1.000000 +157962 -1.000000 +157963 -1.000000 +157964 -1.000000 +157965 -1.000000 +157966 -1.000000 +157967 -1.000000 +157968 -1.000000 +157970 -1.000000 +157971 -1.000000 +157972 -1.000000 +157974 -1.000000 +157975 -1.000000 +157976 -1.000000 +157978 -1.000000 +157983 -1.000000 +157985 -1.000000 +157987 -1.000000 +157988 -1.000000 +157989 -1.000000 +157993 -1.000000 +157994 -1.000000 +157996 -1.000000 +157997 -1.000000 +158002 -1.000000 +158006 -1.000000 +158008 -1.000000 +158011 -1.000000 +158012 -1.000000 +158013 -1.000000 +158016 -1.000000 +158017 -1.000000 +158019 -1.000000 +158021 -1.000000 +158030 -1.000000 +158031 -1.000000 +158032 -1.000000 +158033 -1.000000 +158035 -1.000000 +158036 -1.000000 +158037 -1.000000 +158038 -1.000000 +158039 -1.000000 +158040 -1.000000 +158041 -1.000000 +158042 -1.000000 +158043 -1.000000 +158051 -1.000000 +158052 -1.000000 +158053 -1.000000 +158054 -1.000000 +158055 -1.000000 +158056 -1.000000 +158057 -1.000000 +158058 -1.000000 +158072 -1.000000 +158076 -1.000000 +158087 -1.000000 +158088 -1.000000 +158104 -1.000000 +158106 -1.000000 +158108 -1.000000 +158109 -1.000000 +158110 -1.000000 +158111 -1.000000 +158115 -1.000000 +158121 -1.000000 +158126 -1.000000 +158131 -1.000000 +158132 -1.000000 +158133 -1.000000 +158134 -1.000000 +158135 -1.000000 +158138 -1.000000 +158140 -1.000000 +158141 -1.000000 +158142 -1.000000 +158143 -1.000000 +158144 -1.000000 +158145 -1.000000 +158146 -1.000000 +158147 -1.000000 +158148 -1.000000 +158149 -1.000000 +158150 -1.000000 +158151 -1.000000 +158152 -1.000000 +158153 -1.000000 +158154 -1.000000 +158155 -1.000000 +158156 -1.000000 +158157 -1.000000 +158158 -1.000000 +158160 -1.000000 +158161 -1.000000 +158163 -1.000000 +158164 -1.000000 +158165 -1.000000 +158166 -1.000000 +158167 -1.000000 +158168 -1.000000 +158169 -1.000000 +158289 -1.000000 +158290 -1.000000 +158293 -1.000000 +158294 -1.000000 +158295 -1.000000 +158298 -1.000000 +158304 -1.000000 +158305 -1.000000 +158306 -1.000000 +158307 -1.000000 +158308 -1.000000 +158309 -1.000000 +158310 -1.000000 +158311 -1.000000 +158312 -1.000000 +158313 -1.000000 +158314 -1.000000 +158315 -1.000000 +158316 -1.000000 +158317 -1.000000 +158318 -1.000000 +158319 -1.000000 +158327 -1.000000 +158329 -1.000000 +158330 -1.000000 +158331 -1.000000 +158332 -1.000000 +158333 -1.000000 +158337 -1.000000 +158345 -1.000000 +158346 -1.000000 +158347 -1.000000 +158349 -1.000000 +158355 -1.000000 +158356 -1.000000 +158364 -1.000000 +158370 -1.000000 +158371 -1.000000 +158372 -1.000000 +158374 -1.000000 +158375 -1.000000 +158376 -1.000000 +158380 -1.000000 +158381 -1.000000 +158385 -1.000000 +158386 -1.000000 +158388 -1.000000 +158391 -1.000000 +158392 -1.000000 +158393 -1.000000 +158400 -1.000000 +158403 -1.000000 +158404 -1.000000 +158405 -1.000000 +158406 -1.000000 +158411 -1.000000 +158412 -1.000000 +158413 -1.000000 +158414 -1.000000 +158415 -1.000000 +158416 -1.000000 +158417 -1.000000 +158421 -1.000000 +158423 -1.000000 +158426 -1.000000 +158428 -1.000000 +158438 -1.000000 +158444 -1.000000 +158445 -1.000000 +158446 -1.000000 +158449 -1.000000 +158450 -1.000000 +158454 -1.000000 +158455 -1.000000 +158457 -1.000000 +158458 -1.000000 +158459 -1.000000 +158499 -1.000000 +158500 -1.000000 +158501 -1.000000 +158502 -1.000000 +158512 -1.000000 +158513 -1.000000 +158514 -1.000000 +158515 -1.000000 +158517 -1.000000 +158518 -1.000000 +158519 -1.000000 +158520 -1.000000 +158521 -1.000000 +158522 -1.000000 +158525 -1.000000 +158526 -1.000000 +158527 -1.000000 +158529 -1.000000 +158530 -1.000000 +158531 -1.000000 +158532 -1.000000 +158533 -1.000000 +158534 -1.000000 +158535 -1.000000 +158537 -1.000000 +158538 -1.000000 +158539 -1.000000 +158540 -1.000000 +158541 -1.000000 +158542 -1.000000 +158543 -1.000000 +158544 -1.000000 +158545 -1.000000 +158546 -1.000000 +158553 -1.000000 +158554 -1.000000 +158555 -1.000000 +158556 -1.000000 +158557 -1.000000 +158558 -1.000000 +158559 -1.000000 +158560 -1.000000 +158561 -1.000000 +158562 -1.000000 +158563 -1.000000 +158564 -1.000000 +158565 -1.000000 +158566 -1.000000 +158567 -1.000000 +158568 -1.000000 +158569 -1.000000 +158570 -1.000000 +158571 -1.000000 +158572 -1.000000 +158573 -1.000000 +158574 -1.000000 +158576 -1.000000 +158577 -1.000000 +158578 -1.000000 +158579 -1.000000 +158580 -1.000000 +158582 -1.000000 +158589 -1.000000 +158590 -1.000000 +158591 -1.000000 +158592 -1.000000 +158593 -1.000000 +158594 -1.000000 +158595 -1.000000 +158596 -1.000000 +158597 -1.000000 +158598 -1.000000 +158599 -1.000000 +158600 -1.000000 +158601 -1.000000 +158602 -1.000000 +158603 -1.000000 +158604 -1.000000 +158605 -1.000000 +158606 -1.000000 +158607 -1.000000 +158608 -1.000000 +158609 -1.000000 +158610 -1.000000 +158611 -1.000000 +158612 -1.000000 +158613 -1.000000 +158615 -1.000000 +158616 -1.000000 +158617 -1.000000 +158619 -1.000000 +158620 -1.000000 +158621 -1.000000 +158624 -1.000000 +158629 -1.000000 +158631 -1.000000 +158633 -1.000000 +158634 -1.000000 +158635 -1.000000 +158636 -1.000000 +158637 -1.000000 +158638 -1.000000 +158640 -1.000000 +158641 -1.000000 +158642 -1.000000 +158643 -1.000000 +158644 -1.000000 +158645 -1.000000 +158646 -1.000000 +158647 -1.000000 +158648 -1.000000 +158649 -1.000000 +158651 -1.000000 +158654 -1.000000 +158655 -1.000000 +158656 -1.000000 +158657 -1.000000 +158658 -1.000000 +158659 -1.000000 +158660 -1.000000 +158661 -1.000000 +158662 -1.000000 +158663 -1.000000 +158664 -1.000000 +158672 -1.000000 +158673 -1.000000 +158674 -1.000000 +158675 -1.000000 +158676 -1.000000 +158677 -1.000000 +158678 -1.000000 +158679 -1.000000 +158680 -1.000000 +158681 -1.000000 +158682 -1.000000 +158683 -1.000000 +158684 -1.000000 +158685 -1.000000 +158686 -1.000000 +158687 -1.000000 +158688 -1.000000 +158689 -1.000000 +158690 -1.000000 +158691 -1.000000 +158692 -1.000000 +158693 -1.000000 +158694 -1.000000 +158695 -1.000000 +158696 -1.000000 +158697 -1.000000 +158698 -1.000000 +158699 -1.000000 +158700 -1.000000 +158701 -1.000000 +158702 -1.000000 +158703 -1.000000 +158704 -1.000000 +158705 -1.000000 +158706 -1.000000 +158739 -1.000000 +158741 -1.000000 +158742 -1.000000 +158743 -1.000000 +158744 -1.000000 +158745 -1.000000 +158746 -1.000000 +158747 -1.000000 +158748 -1.000000 +158749 -1.000000 +158750 -1.000000 +158751 -1.000000 +158752 -1.000000 +158754 -1.000000 +158755 -1.000000 +158756 -1.000000 +158760 -1.000000 +158761 -1.000000 +158762 -1.000000 +158763 -1.000000 +158764 -1.000000 +158766 -1.000000 +158767 -1.000000 +158768 -1.000000 +158769 -1.000000 +158770 -1.000000 +158771 -1.000000 +158772 -1.000000 +158774 -1.000000 +158775 -1.000000 +158776 -1.000000 +158777 -1.000000 +158778 -1.000000 +158779 -1.000000 +158780 -1.000000 +158781 -1.000000 +158782 -1.000000 +158783 -1.000000 +158784 -1.000000 +158787 -1.000000 +158789 -1.000000 +158790 -1.000000 +158791 -1.000000 +158792 -1.000000 +158793 -1.000000 +158800 -1.000000 +158803 -1.000000 +158804 -1.000000 +158805 -1.000000 +158806 -1.000000 +158811 -1.000000 +158816 -1.000000 +158817 -1.000000 +158818 -1.000000 +158819 -1.000000 +158821 -1.000000 +158822 -1.000000 +158823 -1.000000 +158824 -1.000000 +158825 -1.000000 +158827 -1.000000 +158828 -1.000000 +158829 -1.000000 +158830 -1.000000 +158831 -1.000000 +158832 -1.000000 +158833 -1.000000 +158834 -1.000000 +158835 -1.000000 +158852 -1.000000 +158854 -1.000000 +158855 -1.000000 +158856 -1.000000 +158858 -1.000000 +158859 -1.000000 +158860 -1.000000 +158861 -1.000000 +158862 -1.000000 +158864 -1.000000 +158865 -1.000000 +158866 -1.000000 +158867 -1.000000 +158868 -1.000000 +158869 -1.000000 +158871 -1.000000 +158872 -1.000000 +158873 -1.000000 +158874 -1.000000 +158875 -1.000000 +158876 -1.000000 +158877 -1.000000 +158878 -1.000000 +158883 -1.000000 +158885 -1.000000 +158886 -1.000000 +158888 -1.000000 +158895 -1.000000 +158896 -1.000000 +158897 -1.000000 +158898 -1.000000 +158899 -1.000000 +158900 -1.000000 +158901 -1.000000 +158902 -1.000000 +158903 -1.000000 +158904 -1.000000 +158905 -1.000000 +158906 -1.000000 +158911 -1.000000 +158912 -1.000000 +158913 -1.000000 +158914 -1.000000 +158915 -1.000000 +158916 -1.000000 +158917 -1.000000 +158918 -1.000000 +158919 -1.000000 +158920 -1.000000 +158921 -1.000000 +158922 -1.000000 +158923 -1.000000 +158924 -1.000000 +158925 -1.000000 +158926 -1.000000 +158929 -1.000000 +158933 -1.000000 +158934 -1.000000 +158936 -1.000000 +158939 -1.000000 +158940 -1.000000 +158942 -1.000000 +158949 -1.000000 +158950 -1.000000 +158951 -1.000000 +158952 -1.000000 +158953 -1.000000 +158954 -1.000000 +158955 -1.000000 +158956 -1.000000 +158957 -1.000000 +158958 -1.000000 +158959 -1.000000 +158960 -1.000000 +158961 -1.000000 +158962 -1.000000 +158963 -1.000000 +158964 -1.000000 +158965 -1.000000 +158967 -1.000000 +158968 -1.000000 +158969 -1.000000 +158970 -1.000000 +158971 -1.000000 +158972 -1.000000 +158973 -1.000000 +158974 -1.000000 +158975 -1.000000 +158976 -1.000000 +158977 -1.000000 +158978 -1.000000 +158979 -1.000000 +158980 -1.000000 +158981 -1.000000 +158986 -1.000000 +158987 -1.000000 +158988 -1.000000 +158989 -1.000000 +158991 -1.000000 +158992 -1.000000 +158993 -1.000000 +158994 -1.000000 +158995 -1.000000 +158996 -1.000000 +158997 -1.000000 +159001 -1.000000 +159002 -1.000000 +159003 -1.000000 +159004 -1.000000 +159006 -1.000000 +159007 -1.000000 +159008 -1.000000 +159009 -1.000000 +159010 -1.000000 +159011 -1.000000 +159012 -1.000000 +159013 -1.000000 +159014 -1.000000 +159015 -1.000000 +159016 -1.000000 +159017 -1.000000 +159018 -1.000000 +159019 -1.000000 +159020 -1.000000 +159021 -1.000000 +159024 -1.000000 +159033 -1.000000 +159034 -1.000000 +159111 -1.000000 +159113 -1.000000 +159114 -1.000000 +159115 -1.000000 +159116 -1.000000 +159117 -1.000000 +159118 -1.000000 +159119 -1.000000 +159120 -1.000000 +159121 -1.000000 +159122 -1.000000 +159123 -1.000000 +159124 -1.000000 +159125 -1.000000 +159126 -1.000000 +159127 -1.000000 +159128 -1.000000 +159129 -1.000000 +159130 -1.000000 +159131 -1.000000 +159132 -1.000000 +159133 -1.000000 +159141 -1.000000 +159147 -1.000000 +159149 -1.000000 +159150 -1.000000 +159161 -1.000000 +159168 -1.000000 +159170 -1.000000 +159172 -1.000000 +159173 -1.000000 +159174 -1.000000 +159175 -1.000000 +159176 -1.000000 +159177 -1.000000 +159178 -1.000000 +159179 -1.000000 +159180 -1.000000 +159181 -1.000000 +159182 -1.000000 +159183 -1.000000 +159184 -1.000000 +159189 -1.000000 +159190 -1.000000 +159191 -1.000000 +159192 -1.000000 +159193 -1.000000 +159194 -1.000000 +159201 -1.000000 +159202 -1.000000 +159207 -1.000000 +159210 -1.000000 +159211 -1.000000 +159219 -1.000000 +159222 -1.000000 +159229 -1.000000 +159231 -1.000000 +159242 -1.000000 +159243 -1.000000 +159244 -1.000000 +159245 -1.000000 +159248 -1.000000 +159249 -1.000000 +159250 -1.000000 +159251 -1.000000 +159253 -1.000000 +159254 -1.000000 +159255 -1.000000 +159256 -1.000000 +159257 -1.000000 +159258 -1.000000 +159262 -1.000000 +159263 -1.000000 +159264 -1.000000 +159265 -1.000000 +159267 -1.000000 +159268 -1.000000 +159269 -1.000000 +159270 -1.000000 +159271 -1.000000 +159272 -1.000000 +159273 -1.000000 +159274 -1.000000 +159275 -1.000000 +159276 -1.000000 +159277 -1.000000 +159282 -1.000000 +159283 -1.000000 +159284 -1.000000 +159286 -1.000000 +159287 -1.000000 +159288 -1.000000 +159289 -1.000000 +159290 -1.000000 +159291 -1.000000 +159292 -1.000000 +159293 -1.000000 +159294 -1.000000 +159295 -1.000000 +159296 -1.000000 +159297 -1.000000 +159298 -1.000000 +159299 -1.000000 +159300 -1.000000 +159301 -1.000000 +159302 -1.000000 +159303 -1.000000 +159304 -1.000000 +159305 -1.000000 +159306 -1.000000 +159307 -1.000000 +159308 -1.000000 +159309 -1.000000 +159310 -1.000000 +159311 -1.000000 +159312 -1.000000 +159313 -1.000000 +159314 -1.000000 +159315 -1.000000 +159316 -1.000000 +159318 -1.000000 +159319 -1.000000 +159320 -1.000000 +159321 -1.000000 +159339 -1.000000 +159351 -1.000000 +159352 -1.000000 +159353 -1.000000 +159354 -1.000000 +159355 -1.000000 +159357 -1.000000 +159358 -1.000000 +159359 -1.000000 +159365 -1.000000 +159366 -1.000000 +159367 -1.000000 +159371 -1.000000 +159375 -1.000000 +159376 -1.000000 +159377 -1.000000 +159379 -1.000000 +159386 -1.000000 +159387 -1.000000 +159388 -1.000000 +159389 -1.000000 +159390 -1.000000 +159391 -1.000000 +159392 -1.000000 +159393 -1.000000 +159394 -1.000000 +159395 -1.000000 +159398 -1.000000 +159416 -1.000000 +159423 -1.000000 +159432 -1.000000 +159438 -1.000000 +159442 -1.000000 +159443 -1.000000 +159448 -1.000000 +159449 -1.000000 +159450 -1.000000 +159451 -1.000000 +159452 -1.000000 +159453 -1.000000 +159454 -1.000000 +159455 -1.000000 +159456 -1.000000 +159457 -1.000000 +159458 -1.000000 +159460 -1.000000 +159461 -1.000000 +159462 -1.000000 +159463 -1.000000 +159464 -1.000000 +159465 -1.000000 +159467 -1.000000 +159468 -1.000000 +159469 -1.000000 +159470 -1.000000 +159471 -1.000000 +159472 -1.000000 +159473 -1.000000 +159474 -1.000000 +159475 -1.000000 +159476 -1.000000 +159482 -1.000000 +159530 -1.000000 +159531 -1.000000 +159532 -1.000000 +159533 -1.000000 +159534 -1.000000 +159535 -1.000000 +159536 -1.000000 +159537 -1.000000 +159539 -1.000000 +159540 -1.000000 +159541 -1.000000 +159543 -1.000000 +159552 -1.000000 +159554 -1.000000 +159555 -1.000000 +159556 -1.000000 +159557 -1.000000 +159558 -1.000000 +159559 -1.000000 +159560 -1.000000 +159561 -1.000000 +159563 -1.000000 +159564 -1.000000 +159565 -1.000000 +159566 -1.000000 +159569 -1.000000 +159580 -1.000000 +159581 -1.000000 +159582 -1.000000 +159583 -1.000000 +159584 -1.000000 +159585 -1.000000 +159588 -1.000000 +159589 -1.000000 +159591 -1.000000 +159592 -1.000000 +159596 -1.000000 +159597 -1.000000 +159598 -1.000000 +159599 -1.000000 +159600 -1.000000 +159601 -1.000000 +159602 -1.000000 +159603 -1.000000 +159605 -1.000000 +159607 -1.000000 +159608 -1.000000 +159609 -1.000000 +159611 -1.000000 +159613 -1.000000 +159614 -1.000000 +159621 -1.000000 +159631 -1.000000 +159632 -1.000000 +159634 -1.000000 +159636 -1.000000 +159637 -1.000000 +159638 -1.000000 +159639 -1.000000 +159640 -1.000000 +159641 -1.000000 +159642 -1.000000 +159643 -1.000000 +159644 -1.000000 +159645 -1.000000 +159646 -1.000000 +159647 -1.000000 +159648 -1.000000 +159649 -1.000000 +159650 -1.000000 +159651 -1.000000 +159652 -1.000000 +159653 -1.000000 +159654 -1.000000 +159655 -1.000000 +159656 -1.000000 +159657 -1.000000 +159658 -1.000000 +159659 -1.000000 +159661 -1.000000 +159662 -1.000000 +159663 -1.000000 +159664 -1.000000 +159665 -1.000000 +159666 -1.000000 +159667 -1.000000 +159680 -1.000000 +159682 -1.000000 +159684 -1.000000 +159685 -1.000000 +159686 -1.000000 +159688 -1.000000 +159690 -1.000000 +159691 -1.000000 +159694 -1.000000 +159700 -1.000000 +159701 -1.000000 +159703 -1.000000 +159704 -1.000000 +159710 -1.000000 +159711 -1.000000 +159712 -1.000000 +159713 -1.000000 +159714 -1.000000 +159715 -1.000000 +159716 -1.000000 +159717 -1.000000 +159718 -1.000000 +159719 -1.000000 +159720 -1.000000 +159721 -1.000000 +159722 -1.000000 +159723 -1.000000 +159724 -1.000000 +159725 -1.000000 +159726 -1.000000 +159727 -1.000000 +159728 -1.000000 +159729 -1.000000 +159730 -1.000000 +159731 -1.000000 +159732 -1.000000 +159733 -1.000000 +159735 -1.000000 +159736 -1.000000 +159737 -1.000000 +159740 -1.000000 +159741 -1.000000 +159742 -1.000000 +159754 -1.000000 +159760 -1.000000 +159807 -1.000000 +159808 -1.000000 +159810 -1.000000 +159811 -1.000000 +159823 -1.000000 +159824 -1.000000 +159827 -1.000000 +159828 -1.000000 +159829 -1.000000 +159831 -1.000000 +159832 -1.000000 +159983 -1.000000 +159984 -1.000000 +159986 -1.000000 +159987 -1.000000 +159989 -1.000000 +159990 -1.000000 +159991 -1.000000 +159992 -1.000000 +159993 -1.000000 +159994 -1.000000 +159995 -1.000000 +159997 -1.000000 +159998 -1.000000 +159999 -1.000000 +160000 -1.000000 +160001 -1.000000 +160002 -1.000000 +160005 -1.000000 +160006 -1.000000 +160007 -1.000000 +160008 -1.000000 +160013 -1.000000 +160014 -1.000000 +160015 -1.000000 +160016 -1.000000 +160017 -1.000000 +160019 -1.000000 +160020 -1.000000 +160021 -1.000000 +160022 -1.000000 +160023 -1.000000 +160027 -1.000000 +160028 -1.000000 +160029 -1.000000 +160030 -1.000000 +160031 -1.000000 +160032 -1.000000 +160033 -1.000000 +160034 -1.000000 +160035 -1.000000 +160037 -1.000000 +160038 -1.000000 +160040 -1.000000 +160042 -1.000000 +160043 -1.000000 +160047 -1.000000 +160054 -1.000000 +160055 -1.000000 +160058 -1.000000 +160059 -1.000000 +160060 -1.000000 +160061 -1.000000 +160062 -1.000000 +160063 -1.000000 +160064 -1.000000 +160065 -1.000000 +160066 -1.000000 +160067 -1.000000 +160068 -1.000000 +160069 -1.000000 +160070 -1.000000 +160072 -1.000000 +160073 -1.000000 +160074 -1.000000 +160075 -1.000000 +160077 -1.000000 +160078 -1.000000 +160079 -1.000000 +160080 -1.000000 +160081 -1.000000 +160082 -1.000000 +160083 -1.000000 +160084 -1.000000 +160086 -1.000000 +160087 -1.000000 +160092 -1.000000 +160097 -1.000000 +160099 -1.000000 +160102 -1.000000 +160103 -1.000000 +160104 -1.000000 +160109 -1.000000 +160110 -1.000000 +160111 -1.000000 +160112 -1.000000 +160113 -1.000000 +160114 -1.000000 +160115 -1.000000 +160116 -1.000000 +160118 -1.000000 +160119 -1.000000 +160120 -1.000000 +160122 -1.000000 +160123 -1.000000 +160124 -1.000000 +160125 -1.000000 +160126 -1.000000 +160127 -1.000000 +160136 -1.000000 +160138 -1.000000 +160139 -1.000000 +160141 -1.000000 +160145 -1.000000 +160147 -1.000000 +160150 -1.000000 +160154 -1.000000 +160155 -1.000000 +160156 -1.000000 +160157 -1.000000 +160159 -1.000000 +160161 -1.000000 +160162 -1.000000 +160163 -1.000000 +160169 -1.000000 +160171 -1.000000 +160173 -1.000000 +160177 -1.000000 +160178 -1.000000 +160179 -1.000000 +160180 -1.000000 +160225 -1.000000 +160238 -1.000000 +160239 -1.000000 +160240 -1.000000 +160241 -1.000000 +160242 -1.000000 +160243 -1.000000 +160244 -1.000000 +160245 -1.000000 +160246 -1.000000 +160247 -1.000000 +160248 -1.000000 +160249 -1.000000 +160250 -1.000000 +160251 -1.000000 +160252 -1.000000 +160253 -1.000000 +160254 -1.000000 +160255 -1.000000 +160256 -1.000000 +160257 -1.000000 +160258 -1.000000 +160259 -1.000000 +160260 -1.000000 +160262 -1.000000 +160268 -1.000000 +160269 -1.000000 +160270 -1.000000 +160271 -1.000000 +160282 -1.000000 +160283 -1.000000 +160285 -1.000000 +160286 -1.000000 +160287 -1.000000 +160288 -1.000000 +160290 -1.000000 +160291 -1.000000 +160294 -1.000000 +160295 -1.000000 +160296 -1.000000 +160297 -1.000000 +160298 -1.000000 +160301 -1.000000 +160303 -1.000000 +160304 -1.000000 +160306 -1.000000 +160308 -1.000000 +160309 -1.000000 +160311 -1.000000 +160312 -1.000000 +160313 -1.000000 +160314 -1.000000 +160323 -1.000000 +160324 -1.000000 +160326 -1.000000 +160327 -1.000000 +160329 -1.000000 +160330 -1.000000 +160331 -1.000000 +160332 -1.000000 +160333 -1.000000 +160334 -1.000000 +160335 -1.000000 +160336 -1.000000 +160339 -1.000000 +160340 -1.000000 +160341 -1.000000 +160354 -1.000000 +160355 -1.000000 +160356 -1.000000 +160357 -1.000000 +160358 -1.000000 +160362 -1.000000 +160365 -1.000000 +160367 -1.000000 +160369 -1.000000 +160371 -1.000000 +160372 -1.000000 +160374 -1.000000 +160395 -1.000000 +160396 -1.000000 +160397 -1.000000 +160398 -1.000000 +160399 -1.000000 +160400 -1.000000 +160401 -1.000000 +160404 -1.000000 +160405 -1.000000 +160406 -1.000000 +160407 -1.000000 +160408 -1.000000 +160409 -1.000000 +160410 -1.000000 +160411 -1.000000 +160412 -1.000000 +160413 -1.000000 +160414 -1.000000 +160415 -1.000000 +160416 -1.000000 +160417 -1.000000 +160418 -1.000000 +160419 -1.000000 +160420 -1.000000 +160421 -1.000000 +160422 -1.000000 +160423 -1.000000 +160441 -1.000000 +160442 -1.000000 +160443 -1.000000 +160444 -1.000000 +160445 -1.000000 +160446 -1.000000 +160447 -1.000000 +160449 -1.000000 +160450 -1.000000 +160451 -1.000000 +160452 -1.000000 +160453 -1.000000 +160454 -1.000000 +160455 -1.000000 +160456 -1.000000 +160457 -1.000000 +160458 -1.000000 +160459 -1.000000 +160460 -1.000000 +160461 -1.000000 +160463 -1.000000 +160464 -1.000000 +160466 -1.000000 +160467 -1.000000 +160468 -1.000000 +160469 -1.000000 +160470 -1.000000 +160471 -1.000000 +160472 -1.000000 +160473 -1.000000 +160474 -1.000000 +160475 -1.000000 +160476 -1.000000 +160477 -1.000000 +160478 -1.000000 +160484 -1.000000 +160485 -1.000000 +160486 -1.000000 +160487 -1.000000 +160488 -1.000000 +160489 -1.000000 +160490 -1.000000 +160491 -1.000000 +160492 -1.000000 +160493 -1.000000 +160494 -1.000000 +160497 -1.000000 +160498 -1.000000 +160499 -1.000000 +160500 -1.000000 +160502 -1.000000 +160503 -1.000000 +160504 -1.000000 +160505 -1.000000 +160508 -1.000000 +160509 -1.000000 +160510 -1.000000 +160511 -1.000000 +160518 -1.000000 +160520 -1.000000 +160521 -1.000000 +160522 -1.000000 +160523 -1.000000 +160524 -1.000000 +160525 -1.000000 +160526 -1.000000 +160527 -1.000000 +160528 -1.000000 +160529 -1.000000 +160534 -1.000000 +160538 -1.000000 +160542 -1.000000 +160544 -1.000000 +160545 -1.000000 +160546 -1.000000 +160552 -1.000000 +160553 -1.000000 +160554 -1.000000 +160555 -1.000000 +160556 -1.000000 +160557 -1.000000 +160558 -1.000000 +160562 -1.000000 +160563 -1.000000 +160564 -1.000000 +160565 -1.000000 +160566 -1.000000 +160567 -1.000000 +160568 -1.000000 +160569 -1.000000 +160570 -1.000000 +160571 -1.000000 +160572 -1.000000 +160573 -1.000000 +160574 -1.000000 +160575 -1.000000 +160576 -1.000000 +160578 -1.000000 +160579 -1.000000 +160580 -1.000000 +160581 -1.000000 +160583 -1.000000 +160584 -1.000000 +160585 -1.000000 +160586 -1.000000 +160590 -1.000000 +160593 -1.000000 +160602 -1.000000 +160612 -1.000000 +160632 -1.000000 +160633 -1.000000 +160635 -1.000000 +160638 -1.000000 +160640 -1.000000 +160645 -1.000000 +160646 -1.000000 +160647 -1.000000 +160652 -1.000000 +160657 -1.000000 +160660 -1.000000 +160665 -1.000000 +160666 -1.000000 +160667 -1.000000 +160669 -1.000000 +160670 -1.000000 +160672 -1.000000 +160673 -1.000000 +160674 -1.000000 +160675 -1.000000 +160677 -1.000000 +160680 -1.000000 +160681 -1.000000 +160682 -1.000000 +160683 -1.000000 +160684 -1.000000 +160685 -1.000000 +160686 -1.000000 +160687 -1.000000 +160688 -1.000000 +160689 -1.000000 +160690 -1.000000 +160691 -1.000000 +160692 -1.000000 +160693 -1.000000 +160694 -1.000000 +160695 -1.000000 +160700 -1.000000 +160702 -1.000000 +160703 -1.000000 +160704 -1.000000 +160705 -1.000000 +160706 -1.000000 +160707 -1.000000 +160708 -1.000000 +160710 -1.000000 +160711 -1.000000 +160712 -1.000000 +160713 -1.000000 +160714 -1.000000 +160715 -1.000000 +160716 -1.000000 +160717 -1.000000 +160718 -1.000000 +160719 -1.000000 +160720 -1.000000 +160721 -1.000000 +160774 -1.000000 +160776 -1.000000 +160777 -1.000000 +160784 -1.000000 +160785 -1.000000 +160786 -1.000000 +160787 -1.000000 +160788 -1.000000 +160789 -1.000000 +160790 -1.000000 +160791 -1.000000 +160792 -1.000000 +160793 -1.000000 +160794 -1.000000 +160795 -1.000000 +160796 -1.000000 +160797 -1.000000 +160798 -1.000000 +160799 -1.000000 +160800 -1.000000 +160801 -1.000000 +160802 -1.000000 +160810 -1.000000 +160811 -1.000000 +160812 -1.000000 +160813 -1.000000 +160814 -1.000000 +160815 -1.000000 +160817 -1.000000 +160819 -1.000000 +160829 -1.000000 +160836 -1.000000 +160837 -1.000000 +160840 -1.000000 +160841 -1.000000 +160842 -1.000000 +160843 -1.000000 +160844 -1.000000 +160845 -1.000000 +160850 -1.000000 +160852 -1.000000 +160854 -1.000000 +160862 -1.000000 +160863 -1.000000 +160867 -1.000000 +160869 -1.000000 +160872 -1.000000 +160876 -1.000000 +160881 -1.000000 +160884 -1.000000 +160889 -1.000000 +160894 -1.000000 +160895 -1.000000 +160899 -1.000000 +160900 -1.000000 +160901 -1.000000 +160902 -1.000000 +160903 -1.000000 +160904 -1.000000 +160905 -1.000000 +160906 -1.000000 +160907 -1.000000 +160908 -1.000000 +160910 -1.000000 +160911 -1.000000 +160912 -1.000000 +160913 -1.000000 +160914 -1.000000 +160915 -1.000000 +160917 -1.000000 +160918 -1.000000 +160919 -1.000000 +160920 -1.000000 +160921 -1.000000 +160938 -1.000000 +160939 -1.000000 +160940 -1.000000 +160942 -1.000000 +160943 -1.000000 +160944 -1.000000 +160945 -1.000000 +160947 -1.000000 +160948 -1.000000 +160949 -1.000000 +160950 -1.000000 +160951 -1.000000 +160964 -1.000000 +160965 -1.000000 +160966 -1.000000 +160968 -1.000000 +160969 -1.000000 +160970 -1.000000 +160971 -1.000000 +160972 -1.000000 +160973 -1.000000 +160974 -1.000000 +160975 -1.000000 +160980 -1.000000 +160981 -1.000000 +160982 -1.000000 +160984 -1.000000 +160985 -1.000000 +160986 -1.000000 +160987 -1.000000 +160988 -1.000000 +160994 -1.000000 +160995 -1.000000 +160996 -1.000000 +160997 -1.000000 +160999 -1.000000 +161002 -1.000000 +161003 -1.000000 +161004 -1.000000 +161005 -1.000000 +161006 -1.000000 +161007 -1.000000 +161008 -1.000000 +161009 -1.000000 +161011 -1.000000 +161012 -1.000000 +161013 -1.000000 +161015 -1.000000 +161016 -1.000000 +161017 -1.000000 +161018 -1.000000 +161019 -1.000000 +161027 -1.000000 +161028 -1.000000 +161030 -1.000000 +161032 -1.000000 +161033 -1.000000 +161034 -1.000000 +161035 -1.000000 +161036 -1.000000 +161037 -1.000000 +161038 -1.000000 +161039 -1.000000 +161040 -1.000000 +161041 -1.000000 +161042 -1.000000 +161043 -1.000000 +161044 -1.000000 +161049 -1.000000 +161050 -1.000000 +161051 -1.000000 +161052 -1.000000 +161053 -1.000000 +161054 -1.000000 +161055 -1.000000 +161056 -1.000000 +161057 -1.000000 +161058 -1.000000 +161064 -1.000000 +161065 -1.000000 +161066 -1.000000 +161067 -1.000000 +161078 -1.000000 +161080 -1.000000 +161081 -1.000000 +161083 -1.000000 +161084 -1.000000 +161085 -1.000000 +161086 -1.000000 +161087 -1.000000 +161088 -1.000000 +161089 -1.000000 +161090 -1.000000 +161091 -1.000000 +161092 -1.000000 +161093 -1.000000 +161094 -1.000000 +161095 -1.000000 +161096 -1.000000 +161102 -1.000000 +161103 -1.000000 +161104 -1.000000 +161105 -1.000000 +161106 -1.000000 +161107 -1.000000 +161108 -1.000000 +161109 -1.000000 +161110 -1.000000 +161111 -1.000000 +161115 -1.000000 +161116 -1.000000 +161117 -1.000000 +161118 -1.000000 +161119 -1.000000 +161121 -1.000000 +161122 -1.000000 +161123 -1.000000 +161124 -1.000000 +161125 -1.000000 +161127 -1.000000 +161129 -1.000000 +161136 -1.000000 +161137 -1.000000 +161138 -1.000000 +161139 -1.000000 +161140 -1.000000 +161141 -1.000000 +161142 -1.000000 +161143 -1.000000 +161144 -1.000000 +161145 -1.000000 +161146 -1.000000 +161147 -1.000000 +161148 -1.000000 +161149 -1.000000 +161150 -1.000000 +161151 -1.000000 +161152 -1.000000 +161153 -1.000000 +161154 -1.000000 +161155 -1.000000 +161156 -1.000000 +161157 -1.000000 +161158 -1.000000 +161159 -1.000000 +161160 -1.000000 +161162 -1.000000 +161163 -1.000000 +161164 -1.000000 +161165 -1.000000 +161166 -1.000000 +161167 -1.000000 +161168 -1.000000 +161169 -1.000000 +161170 -1.000000 +161171 -1.000000 +161172 -1.000000 +161173 -1.000000 +161174 -1.000000 +161179 -1.000000 +161188 -1.000000 +161196 -1.000000 +161197 -1.000000 +161198 -1.000000 +161199 -1.000000 +161202 -1.000000 +161203 -1.000000 +161212 -1.000000 +161215 -1.000000 +161216 -1.000000 +161218 -1.000000 +161219 -1.000000 +161220 -1.000000 +161221 -1.000000 +161222 -1.000000 +161223 -1.000000 +161233 -1.000000 +161252 -1.000000 +161253 -1.000000 +161254 -1.000000 +161255 -1.000000 +161256 -1.000000 +161257 -1.000000 +161258 -1.000000 +161259 -1.000000 +161260 -1.000000 +161261 -1.000000 +161262 -1.000000 +161263 -1.000000 +161264 -1.000000 +161265 -1.000000 +161266 -1.000000 +161272 -1.000000 +161273 -1.000000 +161274 -1.000000 +161275 -1.000000 +161276 -1.000000 +161277 -1.000000 +161280 -1.000000 +161283 -1.000000 +161284 -1.000000 +161285 -1.000000 +161286 -1.000000 +161287 -1.000000 +161291 -1.000000 +161292 -1.000000 +161294 -1.000000 +161295 -1.000000 +161300 -1.000000 +161304 -1.000000 +161306 -1.000000 +161307 -1.000000 +161308 -1.000000 +161309 -1.000000 +161310 -1.000000 +161314 -1.000000 +161317 -1.000000 +161319 -1.000000 +161320 -1.000000 +161321 -1.000000 +161322 -1.000000 +161329 -1.000000 +161331 -1.000000 +161333 -1.000000 +161335 -1.000000 +161336 -1.000000 +161345 -1.000000 +161346 -1.000000 +161347 -1.000000 +161348 -1.000000 +161349 -1.000000 +161350 -1.000000 +161351 -1.000000 +161352 -1.000000 +161353 -1.000000 +161354 -1.000000 +161356 -1.000000 +161357 -1.000000 +161358 -1.000000 +161359 -1.000000 +161361 -1.000000 +161364 -1.000000 +161367 -1.000000 +161370 -1.000000 +161371 -1.000000 +161372 -1.000000 +161373 -1.000000 +161374 -1.000000 +161376 -1.000000 +161381 -1.000000 +161382 -1.000000 +161383 -1.000000 +161384 -1.000000 +161385 -1.000000 +161386 -1.000000 +161388 -1.000000 +161389 -1.000000 +161390 -1.000000 +161391 -1.000000 +161392 -1.000000 +161393 -1.000000 +161394 -1.000000 +161395 -1.000000 +161397 -1.000000 +161398 -1.000000 +161399 -1.000000 +161400 -1.000000 +161401 -1.000000 +161402 -1.000000 +161403 -1.000000 +161404 -1.000000 +161405 -1.000000 +161406 -1.000000 +161407 -1.000000 +161408 -1.000000 +161409 -1.000000 +161410 -1.000000 +161411 -1.000000 +161412 -1.000000 +161413 -1.000000 +161414 -1.000000 +161415 -1.000000 +161416 -1.000000 +161417 -1.000000 +161418 -1.000000 +161420 -1.000000 +161424 -1.000000 +161425 -1.000000 +161426 -1.000000 +161437 -1.000000 +161438 -1.000000 +161444 -1.000000 +161446 -1.000000 +161447 -1.000000 +161448 -1.000000 +161449 -1.000000 +161450 -1.000000 +161452 -1.000000 +161453 -1.000000 +161454 -1.000000 +161455 -1.000000 +161456 -1.000000 +161458 -1.000000 +161459 -1.000000 +161460 -1.000000 +161461 -1.000000 +161465 -1.000000 +161466 -1.000000 +161467 -1.000000 +161468 -1.000000 +161469 -1.000000 +161470 -1.000000 +161471 -1.000000 +161472 -1.000000 +161473 -1.000000 +161474 -1.000000 +161475 -1.000000 +161476 -1.000000 +161477 -1.000000 +161478 -1.000000 +161479 -1.000000 +161480 -1.000000 +161481 -1.000000 +161482 -1.000000 +161483 -1.000000 +161484 -1.000000 +161485 -1.000000 +161491 -1.000000 +161492 -1.000000 +161493 -1.000000 +161494 -1.000000 +161495 -1.000000 +161496 -1.000000 +161497 -1.000000 +161498 -1.000000 +161499 -1.000000 +161500 -1.000000 +161501 -1.000000 +161502 -1.000000 +161503 -1.000000 +161505 -1.000000 +161506 -1.000000 +161507 -1.000000 +161508 -1.000000 +161509 -1.000000 +161510 -1.000000 +161511 -1.000000 +161512 -1.000000 +161513 -1.000000 +161514 -1.000000 +161515 -1.000000 +161516 -1.000000 +161517 -1.000000 +161518 -1.000000 +161519 -1.000000 +161520 -1.000000 +161521 -1.000000 +161522 -1.000000 +161524 -1.000000 +161525 -1.000000 +161526 -1.000000 +161527 -1.000000 +161528 -1.000000 +161529 -1.000000 +161530 -1.000000 +161535 -1.000000 +161536 -1.000000 +161537 -1.000000 +161538 -1.000000 +161539 -1.000000 +161540 -1.000000 +161541 -1.000000 +161545 -1.000000 +161546 -1.000000 +161548 -1.000000 +161549 -1.000000 +161550 -1.000000 +161552 -1.000000 +161553 -1.000000 +161554 -1.000000 +161555 -1.000000 +161556 -1.000000 +161557 -1.000000 +161558 -1.000000 +161559 -1.000000 +161560 -1.000000 +161561 -1.000000 +161562 -1.000000 +161564 -1.000000 +161565 -1.000000 +161566 -1.000000 +161567 -1.000000 +161582 -1.000000 +161583 -1.000000 +161584 -1.000000 +161586 -1.000000 +161587 -1.000000 +161588 -1.000000 +161590 -1.000000 +161591 -1.000000 +161592 -1.000000 +161593 -1.000000 +161595 -1.000000 +161596 -1.000000 +161597 -1.000000 +161598 -1.000000 +161599 -1.000000 +161600 -1.000000 +161601 -1.000000 +161602 -1.000000 +161603 -1.000000 +161604 -1.000000 +161605 -1.000000 +161607 -1.000000 +161608 -1.000000 +161609 -1.000000 +161610 -1.000000 +161611 -1.000000 +161612 -1.000000 +161613 -1.000000 +161614 -1.000000 +161615 -1.000000 +161623 -1.000000 +161624 -1.000000 +161625 -1.000000 +161626 -1.000000 +161627 -1.000000 +161628 -1.000000 +161629 -1.000000 +161630 -1.000000 +161631 -1.000000 +161633 -1.000000 +161635 -1.000000 +161636 -1.000000 +161637 -1.000000 +161638 -1.000000 +161639 -1.000000 +161640 -1.000000 +161641 -1.000000 +161642 -1.000000 +161643 -1.000000 +161644 -1.000000 +161645 -1.000000 +161646 -1.000000 +161647 -1.000000 +161648 -1.000000 +161649 -1.000000 +161650 -1.000000 +162164 -1.000000 +162165 -1.000000 +162166 -1.000000 +162167 -1.000000 +162168 -1.000000 +162169 -1.000000 +162170 -1.000000 +162171 -1.000000 +162172 -1.000000 +162173 -1.000000 +162174 -1.000000 +162175 -1.000000 +162176 -1.000000 +162177 -1.000000 +162178 -1.000000 +162179 -1.000000 +162180 -1.000000 +162181 -1.000000 +162182 -1.000000 +162208 -1.000000 +162209 -1.000000 +162212 -1.000000 +162213 -1.000000 +162214 -1.000000 +162215 -1.000000 +162216 -1.000000 +162217 -1.000000 +162219 -1.000000 +162220 -1.000000 +162237 -1.000000 +162238 -1.000000 +162240 -1.000000 +162241 -1.000000 +162242 -1.000000 +162243 -1.000000 +162244 -1.000000 +162245 -1.000000 +162246 -1.000000 +162247 -1.000000 +162248 -1.000000 +162249 -1.000000 +162250 -1.000000 +162251 -1.000000 +162252 -1.000000 +162253 -1.000000 +162254 -1.000000 +162255 -1.000000 +162256 -1.000000 +162257 -1.000000 +162258 -1.000000 +162260 -1.000000 +162261 -1.000000 +162262 -1.000000 +162263 -1.000000 +162264 -1.000000 +162276 -1.000000 +162278 -1.000000 +162279 -1.000000 +162280 -1.000000 +162281 -1.000000 +162282 -1.000000 +162283 -1.000000 +162284 -1.000000 +162285 -1.000000 +162287 -1.000000 +162298 -1.000000 +162299 -1.000000 +162300 -1.000000 +162301 -1.000000 +162302 -1.000000 +162303 -1.000000 +162304 -1.000000 +162305 -1.000000 +162306 -1.000000 +162307 -1.000000 +162309 -1.000000 +162312 -1.000000 +162313 -1.000000 +162314 -1.000000 +162316 -1.000000 +162317 -1.000000 +162318 -1.000000 +162319 -1.000000 +162320 -1.000000 +162333 -1.000000 +162335 -1.000000 +162336 -1.000000 +162337 -1.000000 +162343 -1.000000 +162344 -1.000000 +162346 -1.000000 +162347 -1.000000 +162348 -1.000000 +162349 -1.000000 +162350 -1.000000 +162352 -1.000000 +162399 -1.000000 +162400 -1.000000 +162402 -1.000000 +162403 -1.000000 +162404 -1.000000 +162405 -1.000000 +162406 -1.000000 +162407 -1.000000 +162408 -1.000000 +162409 -1.000000 +162410 -1.000000 +162411 -1.000000 +162412 -1.000000 +162413 -1.000000 +162414 -1.000000 +162415 -1.000000 +162416 -1.000000 +162419 -1.000000 +162422 -1.000000 +162431 -1.000000 +162439 -1.000000 +162441 -1.000000 +162442 -1.000000 +162443 -1.000000 +162444 -1.000000 +162445 -1.000000 +162446 -1.000000 +162447 -1.000000 +162448 -1.000000 +162449 -1.000000 +162450 -1.000000 +162451 -1.000000 +162452 -1.000000 +162453 -1.000000 +162454 -1.000000 +162489 -1.000000 +162494 -1.000000 +162495 -1.000000 +162499 -1.000000 +162500 -1.000000 +162501 -1.000000 +162502 -1.000000 +162503 -1.000000 +162504 -1.000000 +162505 -1.000000 +162506 -1.000000 +162507 -1.000000 +162508 -1.000000 +162509 -1.000000 +162510 -1.000000 +162511 -1.000000 +162512 -1.000000 +162520 -1.000000 +162521 -1.000000 +162522 -1.000000 +162523 -1.000000 +162524 -1.000000 +162525 -1.000000 +162526 -1.000000 +162527 -1.000000 +162528 -1.000000 +162529 -1.000000 +162530 -1.000000 +162531 -1.000000 +162532 -1.000000 +162533 -1.000000 +162534 -1.000000 +162535 -1.000000 +162536 -1.000000 +162537 -1.000000 +162540 -1.000000 +162543 -1.000000 +162556 -1.000000 +162557 -1.000000 +162558 -1.000000 +162559 -1.000000 +162691 -1.000000 +162693 -1.000000 +162695 -1.000000 +162696 -1.000000 +162697 -1.000000 +162706 -1.000000 +162707 -1.000000 +162708 -1.000000 +162709 -1.000000 +162710 -1.000000 +162711 -1.000000 +162712 -1.000000 +162713 -1.000000 +162715 -1.000000 +162716 -1.000000 +162717 -1.000000 +162718 -1.000000 +162719 -1.000000 +162722 -1.000000 +162723 -1.000000 +162724 -1.000000 +162725 -1.000000 +162727 -1.000000 +162728 -1.000000 +162729 -1.000000 +162730 -1.000000 +162731 -1.000000 +162732 -1.000000 +162733 -1.000000 +162734 -1.000000 +162742 -1.000000 +162743 -1.000000 +162744 -1.000000 +162745 -1.000000 +162746 -1.000000 +162747 -1.000000 +162748 -1.000000 +162749 -1.000000 +162750 -1.000000 +162751 -1.000000 +162752 -1.000000 +162753 -1.000000 +162754 -1.000000 +162760 -1.000000 +162761 -1.000000 +162762 -1.000000 +162763 -1.000000 +162764 -1.000000 +162765 -1.000000 +162766 -1.000000 +162767 -1.000000 +162768 -1.000000 +162769 -1.000000 +162770 -1.000000 +162771 -1.000000 +162777 -1.000000 +162778 -1.000000 +162779 -1.000000 +162780 -1.000000 +162781 -1.000000 +162782 -1.000000 +162783 -1.000000 +162784 -1.000000 +162785 -1.000000 +162786 -1.000000 +162787 -1.000000 +162788 -1.000000 +162789 -1.000000 +162790 -1.000000 +162793 -1.000000 +162795 -1.000000 +162796 -1.000000 +162797 -1.000000 +162798 -1.000000 +162799 -1.000000 +162800 -1.000000 +162801 -1.000000 +162802 -1.000000 +162803 -1.000000 +162804 -1.000000 +162807 -1.000000 +162815 -1.000000 +162865 -1.000000 +162866 -1.000000 +162867 -1.000000 +162868 -1.000000 +162869 -1.000000 +162870 -1.000000 +162871 -1.000000 +162872 -1.000000 +162873 -1.000000 +162874 -1.000000 +162875 -1.000000 +162876 -1.000000 +162877 -1.000000 +162887 -1.000000 +162888 -1.000000 +162889 -1.000000 +162890 -1.000000 +162891 -1.000000 +162892 -1.000000 +162893 -1.000000 +162894 -1.000000 +162895 -1.000000 +162896 -1.000000 +162897 -1.000000 +162898 -1.000000 +162899 -1.000000 +162900 -1.000000 +162905 -1.000000 +162906 -1.000000 +162907 -1.000000 +162908 -1.000000 +162910 -1.000000 +162911 -1.000000 +162912 -1.000000 +162913 -1.000000 +162914 -1.000000 +162915 -1.000000 +162916 -1.000000 +162917 -1.000000 +162918 -1.000000 +162919 -1.000000 +162920 -1.000000 +162921 -1.000000 +162922 -1.000000 +162926 -1.000000 +162927 -1.000000 +162928 -1.000000 +162929 -1.000000 +162930 -1.000000 +162931 -1.000000 +162932 -1.000000 +162933 -1.000000 +162934 -1.000000 +162938 -1.000000 +162939 -1.000000 +162940 -1.000000 +162941 -1.000000 +162942 -1.000000 +162943 -1.000000 +162944 -1.000000 +162946 -1.000000 +162947 -1.000000 +162948 -1.000000 +162949 -1.000000 +162950 -1.000000 +162953 -1.000000 +162954 -1.000000 +162955 -1.000000 +162959 -1.000000 +162960 -1.000000 +162963 -1.000000 +162964 -1.000000 +162965 -1.000000 +162966 -1.000000 +162967 -1.000000 +162968 -1.000000 +162973 -1.000000 +162977 -1.000000 +162989 -1.000000 +162996 -1.000000 +162997 -1.000000 +163000 -1.000000 +163001 -1.000000 +163002 -1.000000 +163003 -1.000000 +163004 -1.000000 +163005 -1.000000 +163019 -1.000000 +163021 -1.000000 +163032 -1.000000 +163067 -1.000000 +163068 -1.000000 +163069 -1.000000 +163070 -1.000000 +163071 -1.000000 +163072 -1.000000 +163073 -1.000000 +163074 -1.000000 +163077 -1.000000 +163078 -1.000000 +163079 -1.000000 +163080 -1.000000 +163081 -1.000000 +163082 -1.000000 +163083 -1.000000 +163084 -1.000000 +163085 -1.000000 +163086 -1.000000 +163087 -1.000000 +163088 -1.000000 +163089 -1.000000 +163090 -1.000000 +163091 -1.000000 +163092 -1.000000 +163093 -1.000000 +163094 -1.000000 +163095 -1.000000 +163100 -1.000000 +163101 -1.000000 +163102 -1.000000 +163103 -1.000000 +163104 -1.000000 +163105 -1.000000 +163106 -1.000000 +163107 -1.000000 +163108 -1.000000 +163109 -1.000000 +163110 -1.000000 +163111 -1.000000 +163112 -1.000000 +163113 -1.000000 +163114 -1.000000 +163115 -1.000000 +163116 -1.000000 +163117 -1.000000 +163118 -1.000000 +163119 -1.000000 +163120 -1.000000 +163121 -1.000000 +163122 -1.000000 +163123 -1.000000 +163124 -1.000000 +163125 -1.000000 +163126 -1.000000 +163127 -1.000000 +163128 -1.000000 +163129 -1.000000 +163130 -1.000000 +163136 -1.000000 +163144 -1.000000 +163145 -1.000000 +163146 -1.000000 +163147 -1.000000 +163148 -1.000000 +163149 -1.000000 +163150 -1.000000 +163151 -1.000000 +163152 -1.000000 +163153 -1.000000 +163155 -1.000000 +163156 -1.000000 +163157 -1.000000 +163158 -1.000000 +163160 -1.000000 +163161 -1.000000 +163162 -1.000000 +163163 -1.000000 +163164 -1.000000 +163165 -1.000000 +163166 -1.000000 +163167 -1.000000 +163168 -1.000000 +163169 -1.000000 +163170 -1.000000 +163171 -1.000000 +163172 -1.000000 +163173 -1.000000 +163174 -1.000000 +163175 -1.000000 +163176 -1.000000 +163177 -1.000000 +163178 -1.000000 +163179 -1.000000 +163180 -1.000000 +163181 -1.000000 +163182 -1.000000 +163183 -1.000000 +163184 -1.000000 +163201 -1.000000 +163202 -1.000000 +163204 -1.000000 +163205 -1.000000 +163206 -1.000000 +163208 -1.000000 +163214 -1.000000 +163215 -1.000000 +163216 -1.000000 +163217 -1.000000 +163218 -1.000000 +163219 -1.000000 +163220 -1.000000 +163222 -1.000000 +163223 -1.000000 +163225 -1.000000 +163228 -1.000000 +163229 -1.000000 +163230 -1.000000 +163236 -1.000000 +163237 -1.000000 +163238 -1.000000 +163240 -1.000000 +163244 -1.000000 +163249 -1.000000 +163250 -1.000000 +163251 -1.000000 +163252 -1.000000 +163253 -1.000000 +163256 -1.000000 +163260 -1.000000 +163261 -1.000000 +163262 -1.000000 +163263 -1.000000 +163264 -1.000000 +163265 -1.000000 +163273 -1.000000 +163274 -1.000000 +163285 -1.000000 +163288 -1.000000 +163290 -1.000000 +163291 -1.000000 +163292 -1.000000 +163293 -1.000000 +163294 -1.000000 +163295 -1.000000 +163296 -1.000000 +163297 -1.000000 +163304 -1.000000 +163305 -1.000000 +163310 -1.000000 +163313 -1.000000 +163315 -1.000000 +163316 -1.000000 +163317 -1.000000 +163318 -1.000000 +163328 -1.000000 +163330 -1.000000 +163331 -1.000000 +163332 -1.000000 +163333 -1.000000 +163334 -1.000000 +163335 -1.000000 +163336 -1.000000 +163427 -1.000000 +163428 -1.000000 +163429 -1.000000 +163430 -1.000000 +163431 -1.000000 +163432 -1.000000 +163435 -1.000000 +163436 -1.000000 +163437 -1.000000 +163438 -1.000000 +163439 -1.000000 +163440 -1.000000 +163441 -1.000000 +163442 -1.000000 +163443 -1.000000 +163444 -1.000000 +163445 -1.000000 +163446 -1.000000 +163447 -1.000000 +163448 -1.000000 +163449 -1.000000 +163450 -1.000000 +163451 -1.000000 +163455 -1.000000 +163456 -1.000000 +163457 -1.000000 +163458 -1.000000 +163459 -1.000000 +163463 -1.000000 +163464 -1.000000 +163465 -1.000000 +163466 -1.000000 +163467 -1.000000 +163468 -1.000000 +163469 -1.000000 +163470 -1.000000 +163471 -1.000000 +163472 -1.000000 +163473 -1.000000 +163475 -1.000000 +163476 -1.000000 +163477 -1.000000 +163478 -1.000000 +163479 -1.000000 +163480 -1.000000 +163481 -1.000000 +163482 -1.000000 +163483 -1.000000 +163484 -1.000000 +163485 -1.000000 +163486 -1.000000 +163487 -1.000000 +163488 -1.000000 +163489 -1.000000 +163490 -1.000000 +163491 -1.000000 +163492 -1.000000 +163497 -1.000000 +163498 -1.000000 +163499 -1.000000 +163500 -1.000000 +163501 -1.000000 +163502 -1.000000 +163503 -1.000000 +163504 -1.000000 +163505 -1.000000 +163506 -1.000000 +163507 -1.000000 +163508 -1.000000 +163509 -1.000000 +163510 -1.000000 +163511 -1.000000 +163512 -1.000000 +163513 -1.000000 +163514 -1.000000 +163515 -1.000000 +163517 -1.000000 +163518 -1.000000 +163519 -1.000000 +163520 -1.000000 +163521 -1.000000 +163524 -1.000000 +163525 -1.000000 +163526 -1.000000 +163531 -1.000000 +163532 -1.000000 +163533 -1.000000 +163534 -1.000000 +163535 -1.000000 +163536 -1.000000 +163537 -1.000000 +163538 -1.000000 +163539 -1.000000 +163540 -1.000000 +163541 -1.000000 +163542 -1.000000 +163543 -1.000000 +163544 -1.000000 +163545 -1.000000 +163546 -1.000000 +163547 -1.000000 +163548 -1.000000 +163549 -1.000000 +163550 -1.000000 +163551 -1.000000 +163552 -1.000000 +163553 -1.000000 +163590 -1.000000 +163591 -1.000000 +163600 -1.000000 +163606 -1.000000 +163607 -1.000000 +163608 -1.000000 +163609 -1.000000 +163610 -1.000000 +163650 -1.000000 +163651 -1.000000 +163652 -1.000000 +163653 -1.000000 +163655 -1.000000 +163656 -1.000000 +163657 -1.000000 +163658 -1.000000 +163659 -1.000000 +163660 -1.000000 +163661 -1.000000 +163662 -1.000000 +163663 -1.000000 +163664 -1.000000 +163665 -1.000000 +163666 -1.000000 +163698 -1.000000 +163703 -1.000000 +163706 -1.000000 +163707 -1.000000 +163708 -1.000000 +163710 -1.000000 +163711 -1.000000 +163712 -1.000000 +163713 -1.000000 +163715 -1.000000 +163716 -1.000000 +163717 -1.000000 +163718 -1.000000 +163719 -1.000000 +163721 -1.000000 +163722 -1.000000 +163723 -1.000000 +163724 -1.000000 +163725 -1.000000 +163726 -1.000000 +163727 -1.000000 +163734 -1.000000 +163736 -1.000000 +163737 -1.000000 +163738 -1.000000 +163739 -1.000000 +163740 -1.000000 +163742 -1.000000 +163750 -1.000000 +163752 -1.000000 +163753 -1.000000 +163754 -1.000000 +163755 -1.000000 +163756 -1.000000 +163757 -1.000000 +163758 -1.000000 +163759 -1.000000 +163782 -1.000000 +163786 -1.000000 +163787 -1.000000 +163788 -1.000000 +163789 -1.000000 +163790 -1.000000 +163791 -1.000000 +163792 -1.000000 +163793 -1.000000 +163794 -1.000000 +163795 -1.000000 +163796 -1.000000 +163797 -1.000000 +163799 -1.000000 +163800 -1.000000 +163802 -1.000000 +163804 -1.000000 +163808 -1.000000 +163811 -1.000000 +163818 -1.000000 +163819 -1.000000 +163821 -1.000000 +163823 -1.000000 +163825 -1.000000 +163826 -1.000000 +163828 -1.000000 +163829 -1.000000 +163830 -1.000000 +163831 -1.000000 +163832 -1.000000 +163833 -1.000000 +163834 -1.000000 +163835 -1.000000 +164030 -1.000000 +164031 -1.000000 +164032 -1.000000 +164033 -1.000000 +164034 -1.000000 +164035 -1.000000 +164036 -1.000000 +164038 -1.000000 +164039 -1.000000 +164040 -1.000000 +164041 -1.000000 +164042 -1.000000 +164043 -1.000000 +164044 -1.000000 +164045 -1.000000 +164046 -1.000000 +164047 -1.000000 +164048 -1.000000 +164049 -1.000000 +164050 -1.000000 +164062 -1.000000 +164063 -1.000000 +164064 -1.000000 +164065 -1.000000 +164066 -1.000000 +164067 -1.000000 +164068 -1.000000 +164069 -1.000000 +164070 -1.000000 +164071 -1.000000 +164073 -1.000000 +164075 -1.000000 +164076 -1.000000 +164077 -1.000000 +164078 -1.000000 +164079 -1.000000 +164084 -1.000000 +164085 -1.000000 +164086 -1.000000 +164087 -1.000000 +164088 -1.000000 +164089 -1.000000 +164090 -1.000000 +164091 -1.000000 +164092 -1.000000 +164093 -1.000000 +164094 -1.000000 +164095 -1.000000 +164096 -1.000000 +164097 -1.000000 +164098 -1.000000 +164099 -1.000000 +164100 -1.000000 +164101 -1.000000 +164102 -1.000000 +164103 -1.000000 +164104 -1.000000 +164105 -1.000000 +164106 -1.000000 +164107 -1.000000 +164108 -1.000000 +164109 -1.000000 +164110 -1.000000 +164111 -1.000000 +164112 -1.000000 +164113 -1.000000 +164114 -1.000000 +164123 -1.000000 +164124 -1.000000 +164125 -1.000000 +164127 -1.000000 +164134 -1.000000 +164135 -1.000000 +164136 -1.000000 +164137 -1.000000 +164138 -1.000000 +164139 -1.000000 +164140 -1.000000 +164141 -1.000000 +164142 -1.000000 +164143 -1.000000 +164144 -1.000000 +164145 -1.000000 +164146 -1.000000 +164169 -1.000000 +164170 -1.000000 +164171 -1.000000 +164172 -1.000000 +164173 -1.000000 +164174 -1.000000 +164176 -1.000000 +164178 -1.000000 +164179 -1.000000 +164186 -1.000000 +164187 -1.000000 +164188 -1.000000 +164189 -1.000000 +164190 -1.000000 +164191 -1.000000 +164192 -1.000000 +164193 -1.000000 +164194 -1.000000 +164195 -1.000000 +164205 -1.000000 +164206 -1.000000 +164207 -1.000000 +164208 -1.000000 +164209 -1.000000 +164210 -1.000000 +164211 -1.000000 +164212 -1.000000 +164213 -1.000000 +164214 -1.000000 +164215 -1.000000 +164216 -1.000000 +164218 -1.000000 +164220 -1.000000 +164221 -1.000000 +164222 -1.000000 +164228 -1.000000 +164229 -1.000000 +164237 -1.000000 +164239 -1.000000 +164240 -1.000000 +164241 -1.000000 +164242 -1.000000 +164244 -1.000000 +164245 -1.000000 +164246 -1.000000 +164248 -1.000000 +164249 -1.000000 +164250 -1.000000 +164251 -1.000000 +164252 -1.000000 +164253 -1.000000 +164254 -1.000000 +164260 -1.000000 +164261 -1.000000 +164262 -1.000000 +164263 -1.000000 +164264 -1.000000 +164265 -1.000000 +164266 -1.000000 +164267 -1.000000 +164268 -1.000000 +164269 -1.000000 +164270 -1.000000 +164271 -1.000000 +164275 -1.000000 +164282 -1.000000 +164283 -1.000000 +164284 -1.000000 +164285 -1.000000 +164287 -1.000000 +164288 -1.000000 +164289 -1.000000 +164298 -1.000000 +164304 -1.000000 +164309 -1.000000 +164310 -1.000000 +164311 -1.000000 +164312 -1.000000 +164315 -1.000000 +164316 -1.000000 +164318 -1.000000 +164320 -1.000000 +164322 -1.000000 +164325 -1.000000 +164326 -1.000000 +164327 -1.000000 +164328 -1.000000 +164329 -1.000000 +164336 -1.000000 +164337 -1.000000 +164345 -1.000000 +164346 -1.000000 +164348 -1.000000 +164349 -1.000000 +164353 -1.000000 +164354 -1.000000 +164356 -1.000000 +164357 -1.000000 +164358 -1.000000 +164359 -1.000000 +164362 -1.000000 +164371 -1.000000 +164374 -1.000000 +164376 -1.000000 +164377 -1.000000 +164385 -1.000000 +164386 -1.000000 +164387 -1.000000 +164388 -1.000000 +164389 -1.000000 +164390 -1.000000 +164392 -1.000000 +164393 -1.000000 +164394 -1.000000 +164395 -1.000000 +164396 -1.000000 +164397 -1.000000 +164399 -1.000000 +164402 -1.000000 +164404 -1.000000 +164405 -1.000000 +164406 -1.000000 +164407 -1.000000 +164408 -1.000000 +164409 -1.000000 +164410 -1.000000 +164411 -1.000000 +164412 -1.000000 +164413 -1.000000 +164426 -1.000000 +164427 -1.000000 +164428 -1.000000 +164429 -1.000000 +164430 -1.000000 +164431 -1.000000 +164432 -1.000000 +164433 -1.000000 +164434 -1.000000 +164435 -1.000000 +164436 -1.000000 +164440 -1.000000 +164441 -1.000000 +164442 -1.000000 +164443 -1.000000 +164447 -1.000000 +164449 -1.000000 +164452 -1.000000 +164454 -1.000000 +164455 -1.000000 +164456 -1.000000 +164463 -1.000000 +164464 -1.000000 +164465 -1.000000 +164466 -1.000000 +164467 -1.000000 +164468 -1.000000 +164470 -1.000000 +164473 -1.000000 +164476 -1.000000 +164477 -1.000000 +164478 -1.000000 +164479 -1.000000 +164480 -1.000000 +164481 -1.000000 +164482 -1.000000 +164483 -1.000000 +164484 -1.000000 +164485 -1.000000 +164486 -1.000000 +164492 -1.000000 +164493 -1.000000 +164494 -1.000000 +164495 -1.000000 +164496 -1.000000 +164497 -1.000000 +164498 -1.000000 +164499 -1.000000 +164500 -1.000000 +164501 -1.000000 +164502 -1.000000 +164503 -1.000000 +164504 -1.000000 +164505 -1.000000 +164506 -1.000000 +164507 -1.000000 +164508 -1.000000 +164509 -1.000000 +164510 -1.000000 +164511 -1.000000 +164512 -1.000000 +164513 -1.000000 +164515 -1.000000 +164517 -1.000000 +164518 -1.000000 +164519 -1.000000 +164520 -1.000000 +164521 -1.000000 +164522 -1.000000 +164523 -1.000000 +164527 -1.000000 +164529 -1.000000 +164530 -1.000000 +164531 -1.000000 +164532 -1.000000 +164533 -1.000000 +164534 -1.000000 +164535 -1.000000 +164536 -1.000000 +164537 -1.000000 +164539 -1.000000 +164540 -1.000000 +164541 -1.000000 +164542 -1.000000 +164549 -1.000000 +164552 -1.000000 +164556 -1.000000 +164559 -1.000000 +164565 -1.000000 +164567 -1.000000 +164568 -1.000000 +164569 -1.000000 +164570 -1.000000 +164572 -1.000000 +164573 -1.000000 +164575 -1.000000 +164576 -1.000000 +164577 -1.000000 +164578 -1.000000 +164585 -1.000000 +164593 -1.000000 +164594 -1.000000 +164595 -1.000000 +164596 -1.000000 +164597 -1.000000 +164598 -1.000000 +164599 -1.000000 +164600 -1.000000 +164601 -1.000000 +164602 -1.000000 +164603 -1.000000 +164604 -1.000000 +164605 -1.000000 +164606 -1.000000 +164607 -1.000000 +164608 -1.000000 +164609 -1.000000 +164610 -1.000000 +164611 -1.000000 +164612 -1.000000 +164613 -1.000000 +164614 -1.000000 +164618 -1.000000 +164619 -1.000000 +164620 -1.000000 +164621 -1.000000 +164622 -1.000000 +164623 -1.000000 +164624 -1.000000 +164625 -1.000000 +164626 -1.000000 +164627 -1.000000 +164628 -1.000000 +164629 -1.000000 +164642 -1.000000 +164647 -1.000000 +164648 -1.000000 +164649 -1.000000 +164650 -1.000000 +164651 -1.000000 +164652 -1.000000 +164653 -1.000000 +164654 -1.000000 +164655 -1.000000 +164656 -1.000000 +164657 -1.000000 +164658 -1.000000 +164659 -1.000000 +164660 -1.000000 +164661 -1.000000 +164662 -1.000000 +164663 -1.000000 +164664 -1.000000 +164666 -1.000000 +164675 -1.000000 +164681 -1.000000 +164684 -1.000000 +164685 -1.000000 +164687 -1.000000 +164688 -1.000000 +164689 -1.000000 +164693 -1.000000 +164704 -1.000000 +164705 -1.000000 +164706 -1.000000 +164714 -1.000000 +164715 -1.000000 +164718 -1.000000 +164719 -1.000000 +164720 -1.000000 +164721 -1.000000 +164722 -1.000000 +164724 -1.000000 +164725 -1.000000 +164775 -1.000000 +164776 -1.000000 +164778 -1.000000 +164780 -1.000000 +164787 -1.000000 +164788 -1.000000 +164789 -1.000000 +164790 -1.000000 +164791 -1.000000 +164792 -1.000000 +164793 -1.000000 +164795 -1.000000 +164797 -1.000000 +164798 -1.000000 +164799 -1.000000 +164800 -1.000000 +164801 -1.000000 +164806 -1.000000 +164814 -1.000000 +164817 -1.000000 +164818 -1.000000 +164819 -1.000000 +164820 -1.000000 +164824 -1.000000 +164825 -1.000000 +164826 -1.000000 +164827 -1.000000 +164828 -1.000000 +164829 -1.000000 +164830 -1.000000 +164831 -1.000000 +164832 -1.000000 +164834 -1.000000 +164835 -1.000000 +164836 -1.000000 +164837 -1.000000 +164839 -1.000000 +164840 -1.000000 +164841 -1.000000 +164843 -1.000000 +164844 -1.000000 +164845 -1.000000 +164846 -1.000000 +164847 -1.000000 +164848 -1.000000 +164851 -1.000000 +164852 -1.000000 +164853 -1.000000 +164854 -1.000000 +164866 -1.000000 +164870 -1.000000 +164873 -1.000000 +164874 -1.000000 +164875 -1.000000 +164877 -1.000000 +164878 -1.000000 +164879 -1.000000 +164880 -1.000000 +164883 -1.000000 +164884 -1.000000 +164886 -1.000000 +164892 -1.000000 +164893 -1.000000 +164895 -1.000000 +164896 -1.000000 +164897 -1.000000 +164898 -1.000000 +164899 -1.000000 +164900 -1.000000 +164901 -1.000000 +164902 -1.000000 +164903 -1.000000 +164907 -1.000000 +164910 -1.000000 +164911 -1.000000 +164912 -1.000000 +164913 -1.000000 +164931 -1.000000 +164936 -1.000000 +164940 -1.000000 +164941 -1.000000 +164954 -1.000000 +164955 -1.000000 +164956 -1.000000 +164957 -1.000000 +164958 -1.000000 +164960 -1.000000 +164965 -1.000000 +164966 -1.000000 +164967 -1.000000 +164973 -1.000000 +164974 -1.000000 +164975 -1.000000 +164977 -1.000000 +164978 -1.000000 +164979 -1.000000 +164980 -1.000000 +164981 -1.000000 +164982 -1.000000 +164985 -1.000000 +164986 -1.000000 +164987 -1.000000 +164988 -1.000000 +164991 -1.000000 +164993 -1.000000 +164998 -1.000000 +164999 -1.000000 +165010 -1.000000 +165012 -1.000000 +165013 -1.000000 +165014 -1.000000 +165015 -1.000000 +165016 -1.000000 +165017 -1.000000 +165018 -1.000000 +165019 -1.000000 +165020 -1.000000 +165021 -1.000000 +165022 -1.000000 +165023 -1.000000 +165024 -1.000000 +165025 -1.000000 +165026 -1.000000 +165027 -1.000000 +165028 -1.000000 +165029 -1.000000 +165030 -1.000000 +165031 -1.000000 +165032 -1.000000 +165033 -1.000000 +165034 -1.000000 +165035 -1.000000 +165036 -1.000000 +165037 -1.000000 +165038 -1.000000 +165039 -1.000000 +165040 -1.000000 +165041 -1.000000 +165042 -1.000000 +165043 -1.000000 +165044 -1.000000 +165051 -1.000000 +165052 -1.000000 +165053 -1.000000 +165054 -1.000000 +165055 -1.000000 +165056 -1.000000 +165057 -1.000000 +165058 -1.000000 +165059 -1.000000 +165060 -1.000000 +165061 -1.000000 +165062 -1.000000 +165063 -1.000000 +165064 -1.000000 +165065 -1.000000 +165066 -1.000000 +165067 -1.000000 +165068 -1.000000 +165069 -1.000000 +165070 -1.000000 +165071 -1.000000 +165072 -1.000000 +165073 -1.000000 +165074 -1.000000 +165075 -1.000000 +165076 -1.000000 +165077 -1.000000 +165078 -1.000000 +165079 -1.000000 +165080 -1.000000 +165086 -1.000000 +165087 -1.000000 +165088 -1.000000 +165089 -1.000000 +165090 -1.000000 +165091 -1.000000 +165094 -1.000000 +165095 -1.000000 +165096 -1.000000 +165097 -1.000000 +165098 -1.000000 +165099 -1.000000 +165100 -1.000000 +165102 -1.000000 +165113 -1.000000 +165114 -1.000000 +165115 -1.000000 +165116 -1.000000 +165120 -1.000000 +165122 -1.000000 +165124 -1.000000 +165125 -1.000000 +165129 -1.000000 +165130 -1.000000 +165131 -1.000000 +165134 -1.000000 +165135 -1.000000 +165137 -1.000000 +165138 -1.000000 +165141 -1.000000 +165142 -1.000000 +165143 -1.000000 +165145 -1.000000 +165146 -1.000000 +165147 -1.000000 +165148 -1.000000 +165149 -1.000000 +165151 -1.000000 +165153 -1.000000 +165156 -1.000000 +165157 -1.000000 +165158 -1.000000 +165159 -1.000000 +165160 -1.000000 +165167 -1.000000 +165168 -1.000000 +165169 -1.000000 +165170 -1.000000 +165171 -1.000000 +165172 -1.000000 +165173 -1.000000 +165175 -1.000000 +165176 -1.000000 +165177 -1.000000 +165178 -1.000000 +165179 -1.000000 +165180 -1.000000 +165181 -1.000000 +165182 -1.000000 +165183 -1.000000 +165184 -1.000000 +165185 -1.000000 +165186 -1.000000 +165188 -1.000000 +165190 -1.000000 +165195 -1.000000 +165196 -1.000000 +165202 -1.000000 +165203 -1.000000 +165204 -1.000000 +165205 -1.000000 +165209 -1.000000 +165210 -1.000000 +165211 -1.000000 +165212 -1.000000 +165213 -1.000000 +165214 -1.000000 +165215 -1.000000 +165216 -1.000000 +165217 -1.000000 +165218 -1.000000 +165219 -1.000000 +165220 -1.000000 +165221 -1.000000 +165222 -1.000000 +165223 -1.000000 +165225 -1.000000 +165240 -1.000000 +165241 -1.000000 +165252 -1.000000 +165260 -1.000000 +165262 -1.000000 +165264 -1.000000 +165266 -1.000000 +165267 -1.000000 +165268 -1.000000 +165269 -1.000000 +165270 -1.000000 +165275 -1.000000 +165276 -1.000000 +165277 -1.000000 +165278 -1.000000 +165280 -1.000000 +165281 -1.000000 +165284 -1.000000 +165285 -1.000000 +165286 -1.000000 +165287 -1.000000 +165288 -1.000000 +165289 -1.000000 +165295 -1.000000 +165296 -1.000000 +165297 -1.000000 +165298 -1.000000 +165299 -1.000000 +165300 -1.000000 +165301 -1.000000 +165302 -1.000000 +165303 -1.000000 +165304 -1.000000 +165305 -1.000000 +165306 -1.000000 +165307 -1.000000 +165308 -1.000000 +165309 -1.000000 +165310 -1.000000 +165311 -1.000000 +165312 -1.000000 +165313 -1.000000 +165314 -1.000000 +165315 -1.000000 +165316 -1.000000 +165317 -1.000000 +165318 -1.000000 +165319 -1.000000 +165320 -1.000000 +165321 -1.000000 +165322 -1.000000 +165323 -1.000000 +165324 -1.000000 +165325 -1.000000 +165334 -1.000000 +165335 -1.000000 +165338 -1.000000 +165339 -1.000000 +165340 -1.000000 +165341 -1.000000 +165342 -1.000000 +165343 -1.000000 +165345 -1.000000 +165346 -1.000000 +165349 -1.000000 +165350 -1.000000 +165351 -1.000000 +165352 -1.000000 +165353 -1.000000 +165354 -1.000000 +165365 -1.000000 +165366 -1.000000 +165367 -1.000000 +165368 -1.000000 +165369 -1.000000 +165370 -1.000000 +165372 -1.000000 +165373 -1.000000 +165375 -1.000000 +165376 -1.000000 +165377 -1.000000 +165378 -1.000000 +165379 -1.000000 +165380 -1.000000 +165381 -1.000000 +165382 -1.000000 +165383 -1.000000 +165386 -1.000000 +165387 -1.000000 +165388 -1.000000 +165389 -1.000000 +165396 -1.000000 +165397 -1.000000 +165398 -1.000000 +165400 -1.000000 +165402 -1.000000 +165403 -1.000000 +165405 -1.000000 +165406 -1.000000 +165407 -1.000000 +165408 -1.000000 +165410 -1.000000 +165413 -1.000000 +165415 -1.000000 +165419 -1.000000 +165420 -1.000000 +165427 -1.000000 +165428 -1.000000 +165429 -1.000000 +165430 -1.000000 +165431 -1.000000 +165432 -1.000000 +165433 -1.000000 +165434 -1.000000 +165435 -1.000000 +165436 -1.000000 +165437 -1.000000 +165438 -1.000000 +165439 -1.000000 +165440 -1.000000 +165441 -1.000000 +165442 -1.000000 +165443 -1.000000 +165444 -1.000000 +165445 -1.000000 +165446 -1.000000 +165447 -1.000000 +165448 -1.000000 +165449 -1.000000 +165450 -1.000000 +165451 -1.000000 +165452 -1.000000 +165454 -1.000000 +165455 -1.000000 +165460 -1.000000 +165461 -1.000000 +165462 -1.000000 +165463 -1.000000 +165464 -1.000000 +165465 -1.000000 +165466 -1.000000 +165467 -1.000000 +165468 -1.000000 +165469 -1.000000 +165470 -1.000000 +165472 -1.000000 +165473 -1.000000 +165474 -1.000000 +165475 -1.000000 +165476 -1.000000 +165477 -1.000000 +165478 -1.000000 +165479 -1.000000 +165480 -1.000000 +165481 -1.000000 +165482 -1.000000 +165483 -1.000000 +165484 -1.000000 +165488 -1.000000 +165489 -1.000000 +165491 -1.000000 +165492 -1.000000 +165494 -1.000000 +165495 -1.000000 +165497 -1.000000 +165498 -1.000000 +165499 -1.000000 +165500 -1.000000 +165501 -1.000000 +165502 -1.000000 +165504 -1.000000 +165505 -1.000000 +165506 -1.000000 +165507 -1.000000 +165508 -1.000000 +165509 -1.000000 +165510 -1.000000 +165512 -1.000000 +165513 -1.000000 +165514 -1.000000 +165515 -1.000000 +165516 -1.000000 +165518 -1.000000 +165520 -1.000000 +165530 -1.000000 +165537 -1.000000 +165538 -1.000000 +165541 -1.000000 +165545 -1.000000 +165546 -1.000000 +165547 -1.000000 +165548 -1.000000 +165549 -1.000000 +165550 -1.000000 +165551 -1.000000 +165552 -1.000000 +165554 -1.000000 +165555 -1.000000 +165556 -1.000000 +165557 -1.000000 +165558 -1.000000 +165559 -1.000000 +165674 -1.000000 +165675 -1.000000 +165679 -1.000000 +165683 -1.000000 +165684 -1.000000 +165685 -1.000000 +165687 -1.000000 +165689 -1.000000 +165690 -1.000000 +165692 -1.000000 +165707 -1.000000 +165708 -1.000000 +165710 -1.000000 +165713 -1.000000 +165714 -1.000000 +165719 -1.000000 +165720 -1.000000 +165721 -1.000000 +165723 -1.000000 +165725 -1.000000 +165730 -1.000000 +165732 -1.000000 +165733 -1.000000 +165742 -1.000000 +165743 -1.000000 +165744 -1.000000 +165745 -1.000000 +165746 -1.000000 +165747 -1.000000 +165748 -1.000000 +165749 -1.000000 +165750 -1.000000 +165751 -1.000000 +165752 -1.000000 +165753 -1.000000 +165754 -1.000000 +165756 -1.000000 +165757 -1.000000 +165758 -1.000000 +165759 -1.000000 +165760 -1.000000 +165761 -1.000000 +165762 -1.000000 +165763 -1.000000 +165764 -1.000000 +165765 -1.000000 +165766 -1.000000 +165767 -1.000000 +165768 -1.000000 +165769 -1.000000 +165770 -1.000000 +165771 -1.000000 +165772 -1.000000 +165773 -1.000000 +165774 -1.000000 +165776 -1.000000 +165777 -1.000000 +165778 -1.000000 +165779 -1.000000 +165810 -1.000000 +165813 -1.000000 +165818 -1.000000 +165820 -1.000000 +165829 -1.000000 +165842 -1.000000 +165843 -1.000000 +165844 -1.000000 +165846 -1.000000 +165847 -1.000000 +165849 -1.000000 +165852 -1.000000 +165853 -1.000000 +165854 -1.000000 +165857 -1.000000 +165859 -1.000000 +165860 -1.000000 +165861 -1.000000 +165862 -1.000000 +165863 -1.000000 +165864 -1.000000 +165865 -1.000000 +165866 -1.000000 +165867 -1.000000 +165868 -1.000000 +165869 -1.000000 +165870 -1.000000 +165871 -1.000000 +165872 -1.000000 +165873 -1.000000 +165874 -1.000000 +165875 -1.000000 +165876 -1.000000 +165877 -1.000000 +165878 -1.000000 +165885 -1.000000 +165887 -1.000000 +165888 -1.000000 +165889 -1.000000 +165890 -1.000000 +165891 -1.000000 +165892 -1.000000 +165893 -1.000000 +165894 -1.000000 +165895 -1.000000 +165896 -1.000000 +165897 -1.000000 +165898 -1.000000 +165904 -1.000000 +165905 -1.000000 +165906 -1.000000 +165910 -1.000000 +165917 -1.000000 +165918 -1.000000 +165919 -1.000000 +165920 -1.000000 +165921 -1.000000 +165922 -1.000000 +165923 -1.000000 +165924 -1.000000 +165925 -1.000000 +165926 -1.000000 +165927 -1.000000 +165928 -1.000000 +165929 -1.000000 +165930 -1.000000 +165931 -1.000000 +165932 -1.000000 +165933 -1.000000 +165934 -1.000000 +165935 -1.000000 +165936 -1.000000 +165937 -1.000000 +165938 -1.000000 +165939 -1.000000 +165940 -1.000000 +165941 -1.000000 +165942 -1.000000 +165943 -1.000000 +165944 -1.000000 +165948 -1.000000 +165949 -1.000000 +165950 -1.000000 +165951 -1.000000 +165952 -1.000000 +165953 -1.000000 +165954 -1.000000 +165955 -1.000000 +165956 -1.000000 +165957 -1.000000 +165958 -1.000000 +165959 -1.000000 +165960 -1.000000 +165961 -1.000000 +165962 -1.000000 +165963 -1.000000 +165964 -1.000000 +165965 -1.000000 +165971 -1.000000 +165972 -1.000000 +165973 -1.000000 +165974 -1.000000 +165975 -1.000000 +165976 -1.000000 +165977 -1.000000 +165980 -1.000000 +166009 -1.000000 +166010 -1.000000 +166013 -1.000000 +166021 -1.000000 +166023 -1.000000 +166025 -1.000000 +166026 -1.000000 +166027 -1.000000 +166029 -1.000000 +166030 -1.000000 +166031 -1.000000 +166032 -1.000000 +166033 -1.000000 +166034 -1.000000 +166035 -1.000000 +166036 -1.000000 +166037 -1.000000 +166040 -1.000000 +166041 -1.000000 +166042 -1.000000 +166043 -1.000000 +166044 -1.000000 +166045 -1.000000 +166046 -1.000000 +166048 -1.000000 +166050 -1.000000 +166051 -1.000000 +166052 -1.000000 +166054 -1.000000 +166055 -1.000000 +166060 -1.000000 +166061 -1.000000 +166062 -1.000000 +166063 -1.000000 +166064 -1.000000 +166065 -1.000000 +166066 -1.000000 +166067 -1.000000 +166068 -1.000000 +166069 -1.000000 +166070 -1.000000 +166071 -1.000000 +166073 -1.000000 +166074 -1.000000 +166075 -1.000000 +166077 -1.000000 +166078 -1.000000 +166080 -1.000000 +166081 -1.000000 +166083 -1.000000 +166084 -1.000000 +166085 -1.000000 +166086 -1.000000 +166087 -1.000000 +166089 -1.000000 +166091 -1.000000 +166092 -1.000000 +166093 -1.000000 +166094 -1.000000 +166102 -1.000000 +166103 -1.000000 +166104 -1.000000 +166105 -1.000000 +166106 -1.000000 +166107 -1.000000 +166108 -1.000000 +166109 -1.000000 +166110 -1.000000 +166111 -1.000000 +166112 -1.000000 +166113 -1.000000 +166114 -1.000000 +166115 -1.000000 +166117 -1.000000 +166120 -1.000000 +166122 -1.000000 +166123 -1.000000 +166124 -1.000000 +166126 -1.000000 +166127 -1.000000 +166129 -1.000000 +166130 -1.000000 +166131 -1.000000 +166135 -1.000000 +166136 -1.000000 +166137 -1.000000 +166138 -1.000000 +166140 -1.000000 +166141 -1.000000 +166142 -1.000000 +166143 -1.000000 +166144 -1.000000 +166145 -1.000000 +166146 -1.000000 +166147 -1.000000 +166149 -1.000000 +166150 -1.000000 +166151 -1.000000 +166156 -1.000000 +166158 -1.000000 +166162 -1.000000 +166163 -1.000000 +166168 -1.000000 +166169 -1.000000 +166171 -1.000000 +166172 -1.000000 +166173 -1.000000 +166174 -1.000000 +166175 -1.000000 +166176 -1.000000 +166177 -1.000000 +166181 -1.000000 +166182 -1.000000 +166183 -1.000000 +166189 -1.000000 +166253 -1.000000 +166256 -1.000000 +166259 -1.000000 +166263 -1.000000 +166264 -1.000000 +166265 -1.000000 +166266 -1.000000 +166267 -1.000000 +166283 -1.000000 +166286 -1.000000 +166303 -1.000000 +166308 -1.000000 +166309 -1.000000 +166310 -1.000000 +166313 -1.000000 +166316 -1.000000 +166317 -1.000000 +166326 -1.000000 +166327 -1.000000 +166335 -1.000000 +166336 -1.000000 +166337 -1.000000 +166338 -1.000000 +166339 -1.000000 +166340 -1.000000 +166343 -1.000000 +166345 -1.000000 +166346 -1.000000 +166347 -1.000000 +166348 -1.000000 +166349 -1.000000 +166350 -1.000000 +166351 -1.000000 +166352 -1.000000 +166353 -1.000000 +166354 -1.000000 +166355 -1.000000 +166356 -1.000000 +166357 -1.000000 +166358 -1.000000 +166359 -1.000000 +166360 -1.000000 +166361 -1.000000 +166362 -1.000000 +166386 -1.000000 +166387 -1.000000 +166388 -1.000000 +166389 -1.000000 +166390 -1.000000 +166391 -1.000000 +166392 -1.000000 +166393 -1.000000 +166394 -1.000000 +166396 -1.000000 +166397 -1.000000 +166398 -1.000000 +166399 -1.000000 +166400 -1.000000 +166401 -1.000000 +166402 -1.000000 +166403 -1.000000 +166407 -1.000000 +166408 -1.000000 +166409 -1.000000 +166410 -1.000000 +166411 -1.000000 +166412 -1.000000 +166415 -1.000000 +166416 -1.000000 +166417 -1.000000 +166419 -1.000000 +166420 -1.000000 +166421 -1.000000 +166428 -1.000000 +166429 -1.000000 +166430 -1.000000 +166431 -1.000000 +166432 -1.000000 +166433 -1.000000 +166434 -1.000000 +166442 -1.000000 +166444 -1.000000 +166455 -1.000000 +166480 -1.000000 +166481 -1.000000 +166482 -1.000000 +166483 -1.000000 +166484 -1.000000 +166485 -1.000000 +166486 -1.000000 +166487 -1.000000 +166488 -1.000000 +166489 -1.000000 +166490 -1.000000 +166491 -1.000000 +166492 -1.000000 +166494 -1.000000 +166495 -1.000000 +166496 -1.000000 +166497 -1.000000 +166498 -1.000000 +166499 -1.000000 +166501 -1.000000 +166504 -1.000000 +166505 -1.000000 +166506 -1.000000 +166507 -1.000000 +166508 -1.000000 +166509 -1.000000 +166515 -1.000000 +166516 -1.000000 +166517 -1.000000 +166518 -1.000000 +166519 -1.000000 +166520 -1.000000 +166521 -1.000000 +166522 -1.000000 +166523 -1.000000 +166524 -1.000000 +166525 -1.000000 +166526 -1.000000 +166528 -1.000000 +166529 -1.000000 +166530 -1.000000 +166531 -1.000000 +166532 -1.000000 +166533 -1.000000 +166534 -1.000000 +166535 -1.000000 +166536 -1.000000 +166537 -1.000000 +166538 -1.000000 +166539 -1.000000 +166540 -1.000000 +166541 -1.000000 +166542 -1.000000 +166543 -1.000000 +166548 -1.000000 +166549 -1.000000 +166556 -1.000000 +166557 -1.000000 +166558 -1.000000 +166561 -1.000000 +166566 -1.000000 +166567 -1.000000 +166568 -1.000000 +166569 -1.000000 +166572 -1.000000 +166573 -1.000000 +166574 -1.000000 +166577 -1.000000 +166578 -1.000000 +166579 -1.000000 +166580 -1.000000 +166581 -1.000000 +166582 -1.000000 +166583 -1.000000 +166584 -1.000000 +166585 -1.000000 +166593 -1.000000 +166595 -1.000000 +166596 -1.000000 +166597 -1.000000 +166598 -1.000000 +166600 -1.000000 +166602 -1.000000 +166603 -1.000000 +166604 -1.000000 +166606 -1.000000 +166608 -1.000000 +166609 -1.000000 +166612 -1.000000 +166613 -1.000000 +166614 -1.000000 +166615 -1.000000 +166617 -1.000000 +166618 -1.000000 +166619 -1.000000 +166620 -1.000000 +166621 -1.000000 +166626 -1.000000 +166628 -1.000000 +166634 -1.000000 +166647 -1.000000 +166661 -1.000000 +166662 -1.000000 +166668 -1.000000 +166669 -1.000000 +166670 -1.000000 +166676 -1.000000 +166678 -1.000000 +166679 -1.000000 +166680 -1.000000 +166683 -1.000000 +166685 -1.000000 +166690 -1.000000 +166695 -1.000000 +166696 -1.000000 +166697 -1.000000 +166698 -1.000000 +166699 -1.000000 +166700 -1.000000 +166701 -1.000000 +166702 -1.000000 +166703 -1.000000 +166704 -1.000000 +166705 -1.000000 +166710 -1.000000 +166711 -1.000000 +166717 -1.000000 +166718 -1.000000 +166720 -1.000000 +166721 -1.000000 +166722 -1.000000 +166723 -1.000000 +166724 -1.000000 +166725 -1.000000 +166726 -1.000000 +166727 -1.000000 +166728 -1.000000 +166730 -1.000000 +166731 -1.000000 +166732 -1.000000 +166733 -1.000000 +166734 -1.000000 +166736 -1.000000 +166737 -1.000000 +166739 -1.000000 +166740 -1.000000 +166777 -1.000000 +166782 -1.000000 +166785 -1.000000 +166786 -1.000000 +166787 -1.000000 +166788 -1.000000 +166789 -1.000000 +166790 -1.000000 +166791 -1.000000 +166793 -1.000000 +166794 -1.000000 +166795 -1.000000 +166797 -1.000000 +166798 -1.000000 +166812 -1.000000 +166813 -1.000000 +166814 -1.000000 +166833 -1.000000 +166838 -1.000000 +166839 -1.000000 +166841 -1.000000 +166842 -1.000000 +166843 -1.000000 +166844 -1.000000 +166845 -1.000000 +166846 -1.000000 +166847 -1.000000 +166848 -1.000000 +166849 -1.000000 +166850 -1.000000 +166851 -1.000000 +166852 -1.000000 +166853 -1.000000 +166854 -1.000000 +166857 -1.000000 +166858 -1.000000 +166868 -1.000000 +166883 -1.000000 +166889 -1.000000 +166899 -1.000000 +166900 -1.000000 +166901 -1.000000 +166902 -1.000000 +166903 -1.000000 +166904 -1.000000 +166905 -1.000000 +166906 -1.000000 +166907 -1.000000 +166908 -1.000000 +166909 -1.000000 +166911 -1.000000 +166912 -1.000000 +166916 -1.000000 +166917 -1.000000 +166920 -1.000000 +166921 -1.000000 +166922 -1.000000 +166923 -1.000000 +166946 -1.000000 +166947 -1.000000 +166948 -1.000000 +166949 -1.000000 +166951 -1.000000 +167060 -1.000000 +167061 -1.000000 +167062 -1.000000 +167064 -1.000000 +167069 -1.000000 +167070 -1.000000 +167071 -1.000000 +167072 -1.000000 +167073 -1.000000 +167074 -1.000000 +167075 -1.000000 +167076 -1.000000 +167077 -1.000000 +167078 -1.000000 +167079 -1.000000 +167080 -1.000000 +167081 -1.000000 +167082 -1.000000 +167083 -1.000000 +167084 -1.000000 +167087 -1.000000 +167088 -1.000000 +167089 -1.000000 +167090 -1.000000 +167091 -1.000000 +167092 -1.000000 +167093 -1.000000 +167095 -1.000000 +167097 -1.000000 +167104 -1.000000 +167109 -1.000000 +167110 -1.000000 +167111 -1.000000 +167112 -1.000000 +167113 -1.000000 +167114 -1.000000 +167115 -1.000000 +167116 -1.000000 +167117 -1.000000 +167119 -1.000000 +167120 -1.000000 +167129 -1.000000 +167130 -1.000000 +167131 -1.000000 +167132 -1.000000 +167134 -1.000000 +167135 -1.000000 +167136 -1.000000 +167138 -1.000000 +167139 -1.000000 +167140 -1.000000 +167141 -1.000000 +167142 -1.000000 +167143 -1.000000 +167144 -1.000000 +167145 -1.000000 +167147 -1.000000 +167148 -1.000000 +167149 -1.000000 +167151 -1.000000 +167152 -1.000000 +167153 -1.000000 +167160 -1.000000 +167161 -1.000000 +167162 -1.000000 +167164 -1.000000 +167165 -1.000000 +167166 -1.000000 +167167 -1.000000 +167168 -1.000000 +167169 -1.000000 +167170 -1.000000 +167171 -1.000000 +167172 -1.000000 +167173 -1.000000 +167174 -1.000000 +167175 -1.000000 +167176 -1.000000 +167177 -1.000000 +167179 -1.000000 +167180 -1.000000 +167181 -1.000000 +167182 -1.000000 +167183 -1.000000 +167184 -1.000000 +167185 -1.000000 +167190 -1.000000 +167191 -1.000000 +167192 -1.000000 +167193 -1.000000 +167194 -1.000000 +167195 -1.000000 +167196 -1.000000 +167197 -1.000000 +167198 -1.000000 +167199 -1.000000 +167200 -1.000000 +167201 -1.000000 +167202 -1.000000 +167203 -1.000000 +167204 -1.000000 +167205 -1.000000 +167206 -1.000000 +167207 -1.000000 +167208 -1.000000 +167209 -1.000000 +167210 -1.000000 +167211 -1.000000 +167212 -1.000000 +167213 -1.000000 +167214 -1.000000 +167215 -1.000000 +167216 -1.000000 +167217 -1.000000 +167218 -1.000000 +167219 -1.000000 +167220 -1.000000 +167223 -1.000000 +167225 -1.000000 +167226 -1.000000 +167227 -1.000000 +167228 -1.000000 +167229 -1.000000 +167230 -1.000000 +167231 -1.000000 +167232 -1.000000 +167233 -1.000000 +167234 -1.000000 +167235 -1.000000 +167236 -1.000000 +167237 -1.000000 +167238 -1.000000 +167239 -1.000000 +167240 -1.000000 +167241 -1.000000 +167242 -1.000000 +167243 -1.000000 +167244 -1.000000 +167246 -1.000000 +167247 -1.000000 +167251 -1.000000 +167252 -1.000000 +167253 -1.000000 +167254 -1.000000 +167255 -1.000000 +167256 -1.000000 +167257 -1.000000 +167258 -1.000000 +167259 -1.000000 +167260 -1.000000 +167261 -1.000000 +167262 -1.000000 +167263 -1.000000 +167264 -1.000000 +167265 -1.000000 +167266 -1.000000 +167267 -1.000000 +167268 -1.000000 +167270 -1.000000 +167271 -1.000000 +167272 -1.000000 +167273 -1.000000 +167274 -1.000000 +167275 -1.000000 +167276 -1.000000 +167277 -1.000000 +167279 -1.000000 +167280 -1.000000 +167281 -1.000000 +167284 -1.000000 +167285 -1.000000 +167286 -1.000000 +167287 -1.000000 +167291 -1.000000 +167292 -1.000000 +167293 -1.000000 +167294 -1.000000 +167295 -1.000000 +167296 -1.000000 +167297 -1.000000 +167298 -1.000000 +167299 -1.000000 +167300 -1.000000 +167301 -1.000000 +167302 -1.000000 +167303 -1.000000 +167305 -1.000000 +167306 -1.000000 +167307 -1.000000 +167308 -1.000000 +167309 -1.000000 +167310 -1.000000 +167311 -1.000000 +167313 -1.000000 +167314 -1.000000 +167315 -1.000000 +167317 -1.000000 +167318 -1.000000 +167319 -1.000000 +167320 -1.000000 +167321 -1.000000 +167322 -1.000000 +167328 -1.000000 +167329 -1.000000 +167330 -1.000000 +167331 -1.000000 +167332 -1.000000 +167348 -1.000000 +167349 -1.000000 +167350 -1.000000 +167351 -1.000000 +167353 -1.000000 +167354 -1.000000 +167355 -1.000000 +167356 -1.000000 +167357 -1.000000 +167358 -1.000000 +167364 -1.000000 +167365 -1.000000 +167366 -1.000000 +167367 -1.000000 +167368 -1.000000 +167369 -1.000000 +167370 -1.000000 +167371 -1.000000 +167372 -1.000000 +167373 -1.000000 +167374 -1.000000 +167375 -1.000000 +167376 -1.000000 +167377 -1.000000 +167378 -1.000000 +167379 -1.000000 +167380 -1.000000 +167381 -1.000000 +167382 -1.000000 +167383 -1.000000 +167384 -1.000000 +167385 -1.000000 +167386 -1.000000 +167387 -1.000000 +167388 -1.000000 +167389 -1.000000 +167390 -1.000000 +167391 -1.000000 +167392 -1.000000 +167393 -1.000000 +167399 -1.000000 +167400 -1.000000 +167401 -1.000000 +167402 -1.000000 +167403 -1.000000 +167404 -1.000000 +167405 -1.000000 +167406 -1.000000 +167408 -1.000000 +167409 -1.000000 +167410 -1.000000 +167411 -1.000000 +167412 -1.000000 +167413 -1.000000 +167414 -1.000000 +167416 -1.000000 +167417 -1.000000 +167418 -1.000000 +167419 -1.000000 +167420 -1.000000 +167421 -1.000000 +167422 -1.000000 +167423 -1.000000 +167424 -1.000000 +167425 -1.000000 +167430 -1.000000 +167431 -1.000000 +167432 -1.000000 +167433 -1.000000 +167434 -1.000000 +167435 -1.000000 +167437 -1.000000 +167439 -1.000000 +167440 -1.000000 +167441 -1.000000 +167443 -1.000000 +167444 -1.000000 +167449 -1.000000 +167451 -1.000000 +167453 -1.000000 +167455 -1.000000 +167457 -1.000000 +167460 -1.000000 +167463 -1.000000 +167473 -1.000000 +167474 -1.000000 +167475 -1.000000 +167481 -1.000000 +167482 -1.000000 +167483 -1.000000 +167484 -1.000000 +167485 -1.000000 +167486 -1.000000 +167489 -1.000000 +167490 -1.000000 +167491 -1.000000 +167493 -1.000000 +167495 -1.000000 +167499 -1.000000 +167502 -1.000000 +167504 -1.000000 +167506 -1.000000 +167515 -1.000000 +167516 -1.000000 +167517 -1.000000 +167518 -1.000000 +167519 -1.000000 +167520 -1.000000 +167521 -1.000000 +167522 -1.000000 +167523 -1.000000 +167524 -1.000000 +167525 -1.000000 +167526 -1.000000 +167527 -1.000000 +167528 -1.000000 +167529 -1.000000 +167530 -1.000000 +167531 -1.000000 +167532 -1.000000 +167533 -1.000000 +167534 -1.000000 +167535 -1.000000 +167536 -1.000000 +167537 -1.000000 +167538 -1.000000 +167539 -1.000000 +167540 -1.000000 +167541 -1.000000 +167542 -1.000000 +167547 -1.000000 +167548 -1.000000 +167549 -1.000000 +167551 -1.000000 +167552 -1.000000 +167553 -1.000000 +167554 -1.000000 +167555 -1.000000 +167563 -1.000000 +167567 -1.000000 +167568 -1.000000 +167569 -1.000000 +167570 -1.000000 +167571 -1.000000 +167572 -1.000000 +167574 -1.000000 +167575 -1.000000 +167576 -1.000000 +167577 -1.000000 +167578 -1.000000 +167579 -1.000000 +167580 -1.000000 +167589 -1.000000 +167600 -1.000000 +167601 -1.000000 +167602 -1.000000 +167603 -1.000000 +167605 -1.000000 +167606 -1.000000 +167607 -1.000000 +167608 -1.000000 +167618 -1.000000 +168439 -1.000000 +168440 -1.000000 +168441 -1.000000 +168444 -1.000000 +168450 -1.000000 +168451 -1.000000 +168484 -1.000000 +168487 -1.000000 +168488 -1.000000 +168490 -1.000000 +168491 -1.000000 +168500 -1.000000 +168504 -1.000000 +168516 -1.000000 +168519 -1.000000 +168529 -1.000000 +168530 -1.000000 +168534 -1.000000 +168536 -1.000000 +168537 -1.000000 +168544 -1.000000 +168548 -1.000000 +168551 -1.000000 +168554 -1.000000 diff --git a/data/shot_lists/d3d/d3d_disrupt_data_avail.txt b/data/shot_lists/d3d/d3d_disrupt_data_avail.txt new file mode 100644 index 00000000..f68f4f58 --- /dev/null +++ b/data/shot_lists/d3d/d3d_disrupt_data_avail.txt @@ -0,0 +1,10422 @@ +125500 5.290000 +125501 6.300000 +125508 0.672000 +125520 0.744000 +125521 0.748000 +125522 1.183000 +125553 2.431000 +125554 5.230000 +125555 4.476000 +125557 2.404000 +125558 1.342000 +125559 2.084000 +125560 1.370000 +125561 3.840000 +125562 0.986000 +125563 2.457000 +125564 1.518000 +125565 2.099000 +125588 0.640000 +125590 4.030000 +125592 2.898000 +125593 2.482000 +125594 5.410000 +125595 5.485000 +125596 4.766000 +125597 5.145000 +125598 4.402000 +125600 6.050000 +125601 2.010000 +125602 4.130000 +125603 6.140000 +125605 5.490000 +125608 3.778000 +125609 3.864000 +125610 4.770000 +125611 3.770000 +125612 5.310000 +125613 3.032000 +125619 0.824000 +125626 4.490000 +125628 4.496000 +125631 4.424000 +125632 4.520000 +125634 4.476000 +125636 2.523000 +125637 3.308000 +125640 4.442000 +125641 4.482000 +125642 4.458000 +125659 2.464000 +125660 4.098000 +125661 4.124000 +125662 3.074000 +125666 5.915000 +125671 7.710000 +125673 3.754000 +125674 5.360000 +125676 6.100000 +125677 7.530000 +125683 4.436000 +125685 4.484000 +125686 4.532000 +125687 4.464000 +125688 4.418000 +125689 4.416000 +125691 4.442000 +125692 4.452000 +125693 4.438000 +125694 4.444000 +125697 4.468000 +125699 4.450000 +125702 4.464000 +125703 4.438000 +125704 4.516000 +125706 4.428000 +125707 4.512000 +125708 4.442000 +125709 4.470000 +125715 1.060000 +125717 4.294000 +125722 3.692000 +125723 3.904000 +125726 1.559000 +125728 1.591000 +125730 4.788000 +125731 4.955000 +125732 5.290000 +125735 5.280000 +125739 4.660000 +125740 5.040000 +125750 1.185000 +125751 0.520000 +125752 1.881000 +125753 5.110000 +125754 5.095000 +125756 5.110000 +125757 5.390000 +125758 5.230000 +125760 0.584000 +125762 5.515000 +125765 3.118000 +125766 5.115000 +125768 3.418000 +125769 3.388000 +125777 1.986000 +125779 4.332000 +125780 4.398000 +125781 4.296000 +125784 3.372000 +125785 1.634000 +125786 4.436000 +125787 5.285000 +125788 3.096000 +125789 4.456000 +125791 1.634000 +125793 5.005000 +125794 2.159000 +125795 3.646000 +125796 2.515000 +125805 2.602000 +125809 3.808000 +125810 2.196000 +125811 5.010000 +125814 4.238000 +125817 5.370000 +125819 3.322000 +125821 2.764000 +125822 5.585000 +125823 1.684000 +125825 3.284000 +125826 3.878000 +125827 3.094000 +125830 5.690000 +125831 5.960000 +125832 2.714000 +125833 5.095000 +125834 4.362000 +125835 3.564000 +125836 4.500000 +125846 6.605000 +125848 6.185000 +125853 6.270000 +125859 7.000000 +125886 1.743000 +125893 4.638000 +125897 5.085000 +125898 3.358000 +125900 5.935000 +125901 5.220000 +125902 5.640000 +125906 1.939000 +125907 6.020000 +125908 3.434000 +125909 5.245000 +125910 3.996000 +125911 5.070000 +125912 4.590000 +125913 4.716000 +125914 3.608000 +125916 5.600000 +125917 2.599000 +125919 2.912000 +125923 2.221000 +125925 6.140000 +125926 5.070000 +125927 2.827000 +125928 3.578000 +125929 5.210000 +125930 5.155000 +125931 5.105000 +125932 3.142000 +125933 4.758000 +125934 3.730000 +125935 3.110000 +125936 3.060000 +125937 3.026000 +125938 3.304000 +125939 4.995000 +125940 3.040000 +125941 2.910000 +125942 3.518000 +125943 3.320000 +125944 3.602000 +125945 5.015000 +125946 4.164000 +125947 2.237000 +125948 1.670000 +125949 0.770000 +125950 1.937000 +125968 3.758000 +125969 4.672000 +125974 2.944000 +125986 3.588000 +125987 3.210000 +125988 3.120000 +125989 3.446000 +125990 3.128000 +125992 2.894000 +125993 2.506000 +125996 2.794000 +125997 3.156000 +125998 4.370000 +126001 2.865000 +126002 4.728000 +126003 5.370000 +126004 4.594000 +126005 3.898000 +126006 4.882000 +126007 3.412000 +126008 5.345000 +126009 3.028000 +126010 2.058000 +126011 2.047000 +126012 2.568000 +126018 4.454000 +126019 4.456000 +126022 4.458000 +126025 4.400000 +126026 4.468000 +126027 4.518000 +126028 4.456000 +126029 4.450000 +126030 4.386000 +126031 3.062000 +126032 4.476000 +126033 4.474000 +126034 4.444000 +126035 4.444000 +126037 4.488000 +126040 4.556000 +126045 1.327000 +126046 3.180000 +126057 3.786000 +126111 0.500000 +126114 4.226000 +126121 3.718000 +126130 2.732000 +126139 5.860000 +126147 3.754000 +126148 5.665000 +126149 4.174000 +126150 4.578000 +126152 3.636000 +126153 0.712000 +126154 4.468000 +126156 4.566000 +126159 4.778000 +126169 3.504000 +126175 1.963000 +126191 4.376000 +126193 3.576000 +126199 3.712000 +126208 4.610000 +126209 4.464000 +126211 4.544000 +126217 4.540000 +126221 4.578000 +126227 0.666000 +126231 3.712000 +126281 4.114000 +126290 3.970000 +126305 0.498000 +126311 3.604000 +126333 6.170000 +126334 6.190000 +126335 5.965000 +126350 4.438000 +126363 4.724000 +126372 1.021000 +126373 0.936000 +126396 3.448000 +126398 4.048000 +126409 5.475000 +126410 2.399000 +126414 4.444000 +126415 1.171000 +126416 4.644000 +126417 4.488000 +126420 5.065000 +126421 5.245000 +126422 5.540000 +126424 4.935000 +126425 5.605000 +126430 2.240000 +126432 2.554000 +126433 6.005000 +126436 1.732000 +126438 3.560000 +126440 5.875000 +126442 5.670000 +126443 5.050000 +126444 3.490000 +126445 4.520000 +126446 4.242000 +126447 4.398000 +126450 5.525000 +126451 5.405000 +126463 4.888000 +126491 4.742000 +126492 4.670000 +126506 4.048000 +126508 3.804000 +126529 5.400000 +126530 5.405000 +126535 5.400000 +126537 5.340000 +126538 5.330000 +126539 5.370000 +126540 5.350000 +126542 5.400000 +126543 5.370000 +126544 4.092000 +126546 5.040000 +126547 4.915000 +126548 4.925000 +126549 4.828000 +126550 4.338000 +126551 0.993000 +126557 3.422000 +126559 3.182000 +126561 3.236000 +126571 4.222000 +126572 4.390000 +126578 3.662000 +126580 2.916000 +126581 4.935000 +126582 4.778000 +126584 4.995000 +126585 4.935000 +126586 4.940000 +126591 4.602000 +126594 4.570000 +126608 4.290000 +126609 4.368000 +126610 4.484000 +126611 4.975000 +126612 5.965000 +126613 3.580000 +126614 3.700000 +126615 3.426000 +126616 2.787000 +126617 2.924000 +126618 2.934000 +126619 2.487000 +126620 3.388000 +126621 3.728000 +126622 4.955000 +126623 6.240000 +126624 5.190000 +126625 6.275000 +126628 3.802000 +126630 5.360000 +126631 3.968000 +126632 3.712000 +126633 5.205000 +126636 5.675000 +126637 3.592000 +126638 4.870000 +126639 2.708000 +126640 5.275000 +126646 3.340000 +126647 4.798000 +126648 4.778000 +126649 4.812000 +126650 4.744000 +126651 2.779000 +126652 4.150000 +126653 5.400000 +126654 5.495000 +126655 5.425000 +126656 5.465000 +126658 5.455000 +126659 5.475000 +126662 5.445000 +126663 5.460000 +126665 1.467000 +126666 5.475000 +126667 5.460000 +126669 5.430000 +126671 4.286000 +126672 5.110000 +126673 3.962000 +126674 3.096000 +126682 5.230000 +126684 2.794000 +126686 5.095000 +126687 5.080000 +126688 4.526000 +126689 3.672000 +126691 3.864000 +126693 2.964000 +126694 2.892000 +126695 3.010000 +126696 5.180000 +126697 3.210000 +126698 4.100000 +126699 4.372000 +126709 5.785000 +126710 6.010000 +126732 5.480000 +126736 4.860000 +126739 6.270000 +126741 3.118000 +126759 0.916000 +126807 5.405000 +126808 5.385000 +126809 5.380000 +126810 4.608000 +126821 6.235000 +126823 6.300000 +126841 5.680000 +126844 5.725000 +126852 5.525000 +126853 5.425000 +126854 5.300000 +126855 5.465000 +126856 5.465000 +126857 5.470000 +126858 5.455000 +126859 5.450000 +126876 4.760000 +126877 3.790000 +126886 6.090000 +126887 3.956000 +126888 6.095000 +126892 6.285000 +126893 6.350000 +126895 6.345000 +126900 3.908000 +126901 4.104000 +126902 4.620000 +126903 4.526000 +126904 3.886000 +126909 4.678000 +126910 4.714000 +126911 4.702000 +126913 4.614000 +126926 4.500000 +126928 3.303000 +126931 4.738000 +126932 3.001800 +126933 3.000600 +126934 2.001000 +126935 2.000400 +126936 1.680000 +127330 2.771000 +127331 3.120000 +127332 3.440000 +127342 4.866000 +127350 0.652000 +127351 0.616000 +127352 0.662000 +127362 0.568000 +127366 0.666000 +127367 0.522000 +127372 4.356000 +127375 1.431000 +127376 5.075000 +127377 1.196000 +127384 1.693000 +127387 3.604000 +127388 3.656000 +127396 2.574000 +127400 4.320000 +127444 6.415000 +127450 4.124000 +127456 5.465000 +127458 5.560000 +127538 5.770000 +127539 4.292000 +127540 6.105000 +127543 5.565000 +127545 1.826000 +127546 1.648000 +127547 2.348000 +127548 3.442000 +127549 3.444000 +127550 3.674000 +127551 1.053000 +127552 3.820000 +127553 3.824000 +127554 4.112000 +127555 3.352000 +127556 3.284000 +127580 3.604000 +127581 4.460000 +127582 3.940000 +127583 3.980000 +127584 3.926000 +127585 2.784000 +127586 2.196000 +127588 4.870000 +127589 4.116000 +127590 4.024000 +127591 4.458000 +127592 2.198000 +127593 4.438000 +127594 4.310000 +127611 2.691000 +127613 3.532000 +127634 4.462000 +127635 4.900000 +127652 5.710000 +127653 6.280000 +127666 5.690000 +127668 2.928000 +127676 1.437000 +127677 3.412000 +127678 3.508000 +127679 3.272000 +127680 3.410000 +127681 4.210000 +127682 4.166000 +127683 3.960000 +127684 3.798000 +127685 3.620000 +127686 4.346000 +127687 4.920000 +127688 5.040000 +127689 4.846000 +127690 4.510000 +127691 4.612000 +127692 2.860000 +127694 3.334000 +127703 4.354000 +127704 4.628000 +127705 4.488000 +127706 4.286000 +127707 4.498000 +127708 5.750000 +127709 5.745000 +127710 5.195000 +127711 6.265000 +127712 6.255000 +127713 5.780000 +127714 6.335000 +127715 5.705000 +127716 6.290000 +127725 3.194000 +127726 3.488000 +127727 3.538000 +127729 4.756000 +127738 2.932000 +127750 1.185000 +127754 3.216000 +127755 4.416000 +127756 3.380000 +127757 3.252000 +127762 3.924000 +127764 4.326000 +127766 3.660000 +127767 5.365000 +127768 3.490000 +127770 3.680000 +127771 3.956000 +127772 6.085000 +127773 4.604000 +127774 4.354000 +127776 6.170000 +127777 4.050000 +127778 3.886000 +127780 4.356000 +127785 5.025000 +127786 5.500000 +127787 5.790000 +127788 5.405000 +127789 2.546000 +127790 4.572000 +127791 5.215000 +127792 4.720000 +127793 3.282000 +127794 3.770000 +127795 5.395000 +127797 5.545000 +127799 3.438000 +127800 4.980000 +127801 3.040000 +127803 2.972000 +127804 3.340000 +127809 4.846000 +127810 4.810000 +127819 2.996000 +127820 3.484000 +127821 2.992000 +127822 3.464000 +127823 3.442000 +127824 3.490000 +127825 3.440000 +127826 3.380000 +127827 3.486000 +127828 3.498000 +127830 3.152000 +127831 4.096000 +127833 4.216000 +127834 0.938000 +127836 4.484000 +127837 4.242000 +127838 4.170000 +127853 3.758000 +127855 4.310000 +127858 4.336000 +127860 4.530000 +127861 4.260000 +127862 4.410000 +127863 4.408000 +127864 4.338000 +127866 4.262000 +127867 3.376000 +127868 3.710000 +127870 3.798000 +127871 0.700000 +127872 3.754000 +127875 3.786000 +127876 4.102000 +127892 5.195000 +127913 0.660000 +127921 5.085000 +127924 4.782000 +127939 4.768000 +127941 3.766000 +127947 5.325000 +127948 2.644000 +127950 5.350000 +127977 1.220000 +127978 0.730000 +127979 0.672000 +127980 0.660000 +127981 1.156000 +127982 0.994000 +127983 0.994000 +127984 0.950000 +127985 1.010000 +127986 1.022000 +127999 6.760000 +128001 7.070000 +128002 7.370000 +128006 3.472000 +128009 4.134000 +128012 3.054000 +128013 4.970000 +128014 3.020000 +128015 3.132000 +128016 5.295000 +128017 3.304000 +128160 2.132000 +128161 1.753000 +128162 2.326000 +128163 5.710000 +128164 5.480000 +128165 5.470000 +128166 5.475000 +128167 5.525000 +128168 1.127000 +128169 5.505000 +128170 5.500000 +128171 5.965000 +128172 5.860000 +128180 0.676000 +128185 0.670000 +128187 5.510000 +128188 5.505000 +128189 5.530000 +128190 5.535000 +128191 5.485000 +128192 5.510000 +128193 5.510000 +128195 5.575000 +128196 5.590000 +128197 5.710000 +128203 5.540000 +128206 5.700000 +128207 5.710000 +128212 5.615000 +128213 5.560000 +128218 1.742000 +128219 3.235000 +128222 3.510000 +128223 4.580000 +128224 3.024000 +128225 0.818000 +128226 3.003400 +128227 3.013000 +128229 3.006600 +128230 3.004400 +128231 3.008400 +128232 3.004600 +128233 0.828000 +128247 4.732000 +128256 5.005000 +128257 4.882000 +128258 1.810000 +128261 4.106000 +128267 4.398000 +128274 1.610000 +128275 1.624000 +128277 3.378000 +128281 3.472000 +128282 3.718000 +128284 3.602000 +128287 2.881000 +128288 4.690000 +128289 3.248000 +128290 2.847000 +128293 4.566000 +128295 3.132000 +128296 3.024000 +128297 4.634000 +128298 4.538000 +128299 4.754000 +128300 4.756000 +128301 4.694000 +128308 3.578000 +128309 4.576000 +128310 4.506000 +128311 3.324000 +128317 1.055000 +128318 0.708000 +128319 1.101000 +128320 1.050000 +128321 1.034000 +128322 1.032000 +128323 1.013000 +128324 1.019000 +128327 1.050000 +128328 1.039000 +128329 0.570000 +128340 3.194000 +128341 3.466000 +128357 3.316000 +128358 2.745000 +128360 4.348000 +128361 4.324000 +128362 3.966000 +128364 4.684000 +128365 3.578000 +128367 5.065000 +128368 2.520000 +128369 3.670000 +128374 4.854000 +128378 4.672000 +128398 5.972000 +128400 6.280000 +128402 6.248000 +128404 5.578000 +128406 6.830000 +128409 5.846000 +128410 6.995000 +128413 7.205000 +128414 7.130000 +128415 7.140000 +128416 7.200000 +128422 3.260000 +128423 3.370000 +128424 3.424000 +128425 3.218000 +128426 4.034000 +128427 3.288000 +128429 3.966000 +128431 2.992000 +128433 2.958000 +128437 2.950000 +128438 3.572000 +128440 4.414000 +128441 2.988000 +128443 3.860000 +128449 0.544000 +128450 5.000000 +128451 3.618000 +128452 2.970000 +128453 2.944000 +128454 2.788000 +128467 5.845000 +128468 5.875000 +128471 5.870000 +128472 5.935000 +128473 5.645000 +128474 4.868000 +128475 5.420000 +128476 4.532000 +128477 4.950000 +128478 4.520000 +128479 4.678000 +128482 4.975000 +128483 5.340000 +128488 2.010000 +128496 5.515000 +128499 5.325000 +128500 5.520000 +128502 5.330000 +128503 5.490000 +128504 3.632000 +128505 5.510000 +128506 4.318000 +128507 5.085000 +128510 5.215000 +128511 3.592000 +128512 5.375000 +128519 4.084000 +128520 5.165000 +128521 3.140000 +128527 5.160000 +128528 3.248000 +128529 1.015000 +128530 5.155000 +128531 1.222000 +128533 4.042000 +128534 5.125000 +128537 5.295000 +128538 5.210000 +128541 5.165000 +128542 5.155000 +128543 3.048000 +128544 5.310000 +128545 3.604000 +128547 3.762000 +128548 3.418000 +128549 5.415000 +128568 5.405000 +128575 6.095000 +128576 6.355000 +128577 6.335000 +128588 4.955000 +128596 4.736000 +128611 2.855000 +128616 2.066500 +128618 2.093500 +128628 1.602000 +128637 4.368000 +128638 4.480000 +128639 4.640000 +128640 3.027000 +128641 3.004200 +128642 3.006200 +128643 3.006400 +128644 3.009400 +128645 1.922000 +128646 3.002600 +128855 2.673000 +128857 2.593000 +128860 1.777000 +128861 2.670000 +128862 2.660000 +128865 4.514000 +128866 4.548000 +128867 3.236000 +128879 0.550000 +128881 0.568000 +128882 0.576000 +128886 0.512000 +128889 0.506000 +128890 2.470000 +128891 3.154000 +128892 2.439000 +128893 2.633000 +128894 2.798000 +128895 4.915000 +128896 4.935000 +128897 6.225000 +128898 5.095000 +128899 5.970000 +128900 2.880000 +128901 6.220000 +128902 2.607000 +128903 5.390000 +128909 3.712000 +128920 0.968000 +128937 4.346000 +128938 4.308000 +128939 4.130000 +128940 3.606000 +128941 3.174000 +128942 6.030000 +128943 6.145000 +128946 4.888000 +128947 3.374000 +128948 3.360000 +128949 3.438000 +128950 3.092000 +128951 6.035000 +128952 2.715000 +128954 6.180000 +128961 6.175000 +128963 6.265000 +128966 4.292000 +128967 3.408000 +128968 4.566000 +128969 5.935000 +128970 5.870000 +128971 4.458000 +128972 4.550000 +128975 1.824000 +128976 3.598000 +128977 5.520000 +128979 3.104000 +128986 4.640000 +128988 5.435000 +128989 5.460000 +128990 5.455000 +128991 5.475000 +128992 5.420000 +128993 5.430000 +128995 5.045000 +128996 5.425000 +128997 5.420000 +128998 5.420000 +128999 5.435000 +129041 5.540000 +129045 5.550000 +129053 1.807000 +129055 5.155000 +129056 2.447000 +129057 5.295000 +129063 4.955000 +129064 4.930000 +129092 0.500000 +129093 0.502000 +129096 2.960000 +129097 6.640000 +129104 3.322000 +129121 0.718000 +129123 5.140000 +129138 5.670000 +129149 4.816000 +129154 3.431000 +129158 0.850000 +129159 0.635000 +129162 4.268000 +129163 5.965000 +129164 3.834000 +129165 4.142000 +129166 3.762000 +129171 5.145000 +129172 5.075000 +129173 5.190000 +129174 0.522000 +129175 5.280000 +129177 5.400000 +129179 5.170000 +129181 5.300000 +129182 6.325000 +129187 2.444000 +129188 2.416000 +129189 5.970000 +129190 5.765000 +129191 4.414000 +129192 4.576000 +129193 5.215000 +129196 5.620000 +129197 3.906000 +129198 5.500000 +129200 5.810000 +129201 5.940000 +129203 4.048000 +129204 5.485000 +129205 4.014000 +129206 5.605000 +129207 2.936000 +129208 3.674000 +129218 5.245000 +129219 0.630000 +129222 0.910000 +129227 3.062000 +129231 3.976000 +129243 3.060000 +129259 2.882000 +129270 2.635000 +129271 6.405000 +129280 3.606000 +129281 2.592000 +129288 4.436000 +129289 3.416000 +129290 4.662000 +129291 3.512000 +129295 1.848000 +129297 4.686000 +129298 1.738000 +129301 1.719000 +129305 2.992000 +129306 1.835000 +129308 3.120000 +129309 2.723000 +129312 2.738000 +129322 5.645000 +129323 5.800000 +129326 5.880000 +129327 5.605000 +129328 5.550000 +129329 5.645000 +129330 5.780000 +129331 5.775000 +129395 5.915000 +129397 5.620000 +129407 5.970000 +129408 6.300000 +129415 4.408000 +129416 4.554000 +129417 3.652000 +129424 3.580000 +129428 2.845000 +129429 6.390000 +129433 2.889000 +129439 3.606000 +129443 0.640000 +129446 4.554000 +129447 5.415000 +129452 2.539000 +129467 0.936000 +129471 0.674000 +129472 0.642000 +129484 2.605000 +129485 2.542000 +129486 2.643000 +129489 3.336000 +129490 3.220000 +129491 3.448000 +129492 5.170000 +129493 5.660000 +129494 4.985000 +129495 4.590000 +129496 5.535000 +129501 2.663000 +129502 6.030000 +129516 6.260000 +129517 5.990000 +129518 5.885000 +129526 6.245000 +129539 3.496000 +129540 4.070000 +129551 2.239500 +129552 2.241500 +129553 2.264500 +129554 2.187000 +129559 5.305000 +129561 5.785000 +129562 4.250000 +129563 5.090000 +129564 3.558000 +129566 2.850000 +129567 4.164000 +129568 4.580000 +129569 5.330000 +129570 5.510000 +129582 4.782000 +129584 5.080000 +129595 0.568000 +129598 0.554000 +129600 0.552000 +129602 2.889000 +129603 2.298000 +129605 1.615000 +129612 2.119000 +129614 1.898000 +129618 2.200000 +129619 2.012000 +129620 2.016000 +129637 6.355000 +129643 5.185000 +129647 5.615000 +129662 3.844000 +129663 3.948000 +129664 3.628000 +129683 3.648000 +129694 4.775000 +129696 3.180000 +129697 3.535000 +129698 3.755000 +129699 3.725000 +129700 2.009000 +129701 2.005000 +129702 2.003800 +129703 2.004800 +129704 2.008400 +129705 2.003800 +129706 2.004800 +129707 2.005800 +129708 3.725000 +129709 2.006200 +129723 3.060000 +129724 4.796000 +129727 5.545000 +129731 5.535000 +129732 5.525000 +129737 0.864000 +129739 3.186000 +129740 5.185000 +129741 4.814000 +129742 4.654000 +129743 2.507000 +129744 3.336000 +129745 5.765000 +129746 2.837000 +129747 3.628000 +129748 3.794000 +129749 3.880000 +129750 4.808000 +129751 1.535000 +129752 5.120000 +129753 1.917000 +129754 4.854000 +129755 3.266000 +129756 1.679000 +129757 2.645000 +129758 2.942000 +129759 1.853000 +129760 5.350000 +129761 5.890000 +129762 2.395000 +129763 2.277000 +129764 4.854000 +129765 5.625000 +129766 5.395000 +129767 4.426000 +129768 2.864000 +129775 0.506000 +129776 0.754000 +129777 3.608000 +129779 1.037000 +129780 2.623000 +129781 2.303000 +129782 3.434000 +129783 2.599000 +129784 3.214000 +129787 3.654000 +129789 3.718000 +129790 1.979000 +129792 1.881000 +129794 1.061000 +129795 1.068000 +129797 3.634000 +129798 3.740000 +129799 1.916000 +129804 5.360000 +129821 3.378000 +129848 1.032000 +129853 0.916000 +129854 0.980000 +129855 0.653000 +129856 0.892000 +129857 0.637000 +129858 0.646000 +129859 0.645000 +129860 1.015000 +129861 0.689000 +129862 1.017000 +129863 0.949000 +129867 2.686000 +129868 2.261000 +129869 3.004500 +129870 2.823500 +129871 3.151000 +129888 3.110000 +129889 3.996000 +129890 4.488000 +129891 5.050000 +129893 5.015000 +129894 5.500000 +129895 5.475000 +129900 4.124000 +129922 4.206000 +129923 4.170000 +129925 1.530000 +129939 3.952000 +129940 4.762000 +129944 4.510000 +129946 1.967000 +129947 3.968000 +129948 3.220000 +129949 3.988000 +129950 3.270000 +129951 3.346000 +129952 3.452000 +129953 2.823000 +129955 3.510000 +129956 3.438000 +129957 3.136000 +129959 3.632000 +129960 2.319000 +129961 2.674000 +129962 2.645000 +129963 4.336000 +129964 1.685000 +129965 2.388000 +129966 3.166000 +129967 2.701000 +129968 2.719000 +129969 3.118000 +129970 4.784000 +129971 3.356000 +129973 3.302000 +129974 3.258000 +129979 2.938000 +129980 2.289000 +129989 5.025000 +129990 5.915000 +129996 3.540000 +129998 4.694000 +129999 3.678000 +130000 5.810000 +130001 5.565000 +130002 5.815000 +130004 5.600000 +130005 5.820000 +130007 5.845000 +130011 4.826000 +130053 2.848000 +130054 3.552000 +130055 3.420000 +130056 3.194000 +130058 2.892000 +130059 2.934000 +130060 2.994000 +130061 4.314000 +130062 4.294000 +130092 5.070000 +130095 4.940000 +130096 2.850000 +130097 4.716000 +130098 4.510000 +130099 4.510000 +130100 4.979000 +130101 4.937000 +130102 4.556000 +130103 4.852000 +130104 4.876000 +130105 4.962000 +130106 4.939000 +130107 4.944500 +130112 4.424000 +130113 4.146000 +130114 4.194000 +130115 4.694000 +130116 4.668000 +130117 4.164000 +130118 4.122000 +130119 4.088000 +130120 4.096000 +130121 4.136000 +130122 4.124000 +130123 4.112000 +130124 4.088000 +130125 4.314000 +130126 4.290000 +130127 4.284000 +130128 4.296000 +130129 4.226000 +130130 4.268000 +130131 4.096000 +130132 4.094000 +130133 4.528000 +130134 4.872000 +130135 4.208000 +130138 6.265000 +130139 3.224000 +130140 3.596000 +130144 5.705000 +130145 5.700000 +130146 3.742000 +130147 5.495000 +130148 5.490000 +130149 4.696000 +130152 5.450000 +130153 5.345000 +130154 5.935000 +130157 3.008800 +130158 2.162000 +130160 1.506200 +130161 1.505200 +130163 1.504000 +130164 1.503400 +130165 1.504800 +130169 1.724000 +130172 2.962000 +130173 2.816000 +130174 3.040000 +130175 2.966000 +130177 4.796000 +130178 4.602000 +130179 4.925000 +130180 4.905000 +130181 4.884000 +130182 4.756000 +130239 0.948000 +130240 0.948000 +130241 0.948000 +130242 0.948000 +130243 0.948000 +130244 0.948000 +130245 0.948000 +130246 0.948000 +130247 0.948000 +130248 0.948000 +130249 0.948000 +130250 0.948000 +130251 0.948000 +130253 0.948000 +130254 0.948000 +130255 0.948000 +130256 0.948000 +130257 0.948000 +130258 0.948000 +130259 0.948000 +130260 0.948000 +130261 0.948000 +130262 0.948000 +130263 0.948000 +130264 0.948000 +130265 0.948000 +130266 0.948000 +130267 0.948000 +130268 0.946000 +130269 0.948000 +130270 0.948000 +130271 0.948000 +130272 0.948000 +130274 0.948000 +130275 0.948000 +130276 0.948000 +130278 0.948000 +130279 0.948000 +130280 0.948000 +130281 0.948000 +130282 0.946000 +130283 0.948000 +130639 0.528000 +130640 0.532000 +130662 2.638000 +130663 3.432000 +130664 3.416000 +130665 3.152000 +130666 0.900000 +130667 1.873000 +130668 1.696000 +130669 2.399000 +130672 2.509000 +130673 4.222000 +130675 4.364000 +130679 5.120000 +130685 3.294000 +130698 4.256000 +130699 3.578000 +130704 5.510000 +130705 0.684000 +130706 5.545000 +130707 5.380000 +130708 5.315000 +130709 5.360000 +130710 5.335000 +130711 4.520000 +130712 5.410000 +130713 5.400000 +130714 5.445000 +130715 5.250000 +130716 3.504000 +130717 3.150000 +130732 0.596000 +130738 3.928000 +130739 2.123000 +130744 5.015000 +130760 1.724000 +130761 6.025000 +130763 5.110000 +130862 0.514000 +130863 0.548000 +130864 1.791000 +130865 4.576000 +130866 5.255000 +130867 1.246000 +130883 1.836000 +130889 4.840000 +130892 5.105000 +130893 5.095000 +130894 5.070000 +130896 5.110000 +130897 5.115000 +130898 2.906000 +130899 3.414000 +130900 3.738000 +130901 3.758000 +130902 3.780000 +130903 0.918000 +130904 1.405000 +130905 3.708000 +130906 3.456000 +130920 2.896000 +130930 3.240000 +130933 3.430000 +130935 4.104000 +131001 4.046000 +131005 3.826000 +131006 3.598000 +131010 0.876000 +131058 5.095000 +131059 5.105000 +131071 4.768000 +131073 4.268000 +131074 0.892000 +131075 0.614000 +131076 0.860000 +131077 4.646000 +131078 4.124000 +131088 4.138000 +131089 4.084000 +131092 4.300000 +131093 4.228000 +131094 3.368000 +131095 0.734000 +131096 3.062000 +131097 3.028000 +131098 3.034000 +131099 5.085000 +131100 3.662000 +131101 1.500000 +131102 4.106000 +131103 4.646000 +131104 3.204000 +131105 3.234000 +131108 1.817000 +131109 3.396000 +131110 1.737000 +131111 1.148000 +131112 5.825000 +131113 3.702000 +131134 4.644000 +131143 4.072000 +131144 4.322000 +131145 2.529000 +131146 2.604000 +131147 2.535000 +131148 5.595000 +131149 6.020000 +131153 3.374000 +131154 1.938000 +131156 1.756000 +131164 2.591000 +131165 0.568000 +131166 0.622000 +131172 4.360000 +131173 4.316000 +131174 4.326000 +131175 4.400000 +131176 4.326000 +131177 4.334000 +131188 2.051000 +131191 4.012000 +131193 3.618000 +131195 2.875000 +131197 3.424000 +131200 2.689000 +131202 3.354000 +131207 4.242000 +131210 3.556000 +131213 5.565000 +131214 4.410000 +131216 4.604000 +131217 4.546000 +131218 4.442000 +131219 0.986000 +131220 4.438000 +131221 4.104000 +131222 4.058000 +131223 4.502000 +131224 3.814000 +131225 3.826000 +131226 3.742000 +131227 5.660000 +131228 3.764000 +131229 5.475000 +131230 5.800000 +131231 5.775000 +131248 1.211000 +131249 1.170000 +131250 2.075000 +131251 3.180000 +131252 3.514000 +131253 3.454000 +131254 3.515000 +131255 3.526500 +131256 3.388000 +131257 2.802500 +131258 2.920500 +131259 2.826000 +131260 2.924000 +131263 4.188000 +131264 4.222000 +131269 3.844000 +131270 3.200000 +131311 3.272000 +131340 4.494000 +131342 2.520000 +131343 2.025000 +131344 4.420000 +131348 4.260000 +131349 3.980000 +131350 4.266000 +131352 4.748000 +131354 4.965000 +131355 1.424000 +131356 3.116000 +131357 2.750000 +131358 2.754000 +131359 3.334000 +131360 4.214000 +131361 4.424000 +131364 5.035000 +131366 3.224000 +131367 5.155000 +131370 3.186000 +131371 5.175000 +131372 5.020000 +131375 1.137000 +131376 5.085000 +131381 5.475000 +131382 5.390000 +131387 5.215000 +131388 5.135000 +131390 5.195000 +131391 5.230000 +131393 5.525000 +131413 5.675000 +131414 4.648000 +131421 5.070000 +131433 4.408000 +131434 1.625000 +131435 4.985000 +131443 2.045000 +131449 5.570000 +131450 5.570000 +131464 2.287000 +131465 3.726000 +131469 1.647000 +131470 5.500000 +131471 3.444000 +131474 2.142000 +131476 5.545000 +131478 3.554000 +131479 3.128000 +131480 3.730000 +131481 5.720000 +131483 1.550000 +131484 5.590000 +131494 4.888000 +131495 2.998000 +131496 4.288000 +131498 5.015000 +131501 5.370000 +131502 4.632000 +131503 4.930000 +131504 5.150000 +131505 3.188000 +131506 2.757000 +131507 4.642000 +131508 5.085000 +131509 4.244000 +131510 4.925000 +131511 3.168000 +131512 4.066000 +131513 4.686000 +131514 5.015000 +131515 4.284000 +131516 4.104000 +131517 4.146000 +131518 4.306000 +131519 5.650000 +131522 5.525000 +131523 3.924000 +131524 3.604000 +131525 4.630000 +131527 3.004000 +131528 4.234000 +131529 2.768000 +131530 3.082000 +131531 4.070000 +131533 1.033000 +131534 1.608000 +131535 3.026400 +131536 3.015000 +131537 3.008000 +131538 3.006200 +131539 3.002800 +131540 3.002400 +131541 3.005200 +131542 1.140000 +131543 3.002400 +131544 3.004200 +131546 3.010600 +131547 0.510000 +131548 0.594000 +131549 3.960000 +131675 0.824000 +131680 0.726000 +131684 0.752000 +131685 0.728000 +131686 0.828000 +131687 0.784000 +131688 0.824000 +131700 1.178000 +131705 2.838000 +131720 2.956000 +131730 4.296000 +131743 3.224000 +131744 3.176000 +131772 5.135000 +131786 2.906000 +131787 2.468000 +131788 4.492000 +131789 1.840000 +131790 2.336000 +131791 2.278000 +131792 2.094000 +131793 2.182000 +131794 1.166000 +131795 1.964000 +131796 2.182000 +131797 2.434000 +131798 2.164000 +131799 2.864000 +131808 0.564000 +131809 3.734000 +131810 5.145000 +131811 3.596000 +131812 3.430000 +131813 2.047000 +131814 2.188000 +131823 5.085000 +131844 6.290000 +131847 5.095000 +131870 4.396000 +131871 3.966000 +131872 4.652000 +131873 4.852000 +131903 1.123000 +131904 5.410000 +131905 5.360000 +131908 5.255000 +131909 5.265000 +131911 5.340000 +131912 4.608000 +131914 4.718000 +131916 4.518000 +131936 4.214000 +131937 3.332000 +131941 3.494000 +131943 4.216000 +131944 5.520000 +131956 3.056000 +131970 4.874000 +131972 4.864000 +131973 4.858000 +131974 4.890000 +131995 5.690000 +131997 4.844000 +131998 0.980000 +131999 5.640000 +132001 5.715000 +132002 5.720000 +132004 4.846000 +132005 5.400000 +132007 2.443000 +132008 3.544000 +132009 5.735000 +132020 3.322000 +132021 3.084000 +132048 4.598000 +132049 6.090000 +132050 6.160000 +132054 5.220000 +132080 2.976000 +132086 2.170000 +132088 2.852000 +132089 3.711000 +132090 2.802000 +132091 2.599000 +132092 2.420000 +132100 5.405000 +132101 5.090000 +132102 4.418000 +132103 5.580000 +132104 4.536000 +132105 3.740000 +132106 3.420000 +132107 3.578000 +132109 3.692000 +132110 3.862000 +132111 3.562000 +132112 5.590000 +132113 3.942000 +132114 3.394000 +132115 4.058000 +132116 4.316000 +132117 4.082000 +132118 4.406000 +132119 3.822000 +132120 3.612000 +132121 3.888000 +132208 5.760000 +132209 6.275000 +132230 3.272000 +132231 3.148000 +132232 3.944000 +132233 6.050000 +132234 5.650000 +132235 5.750000 +132254 4.386000 +132277 2.777000 +132278 4.688000 +132283 1.888000 +132289 2.029000 +132291 1.917000 +132298 4.880000 +132314 5.325000 +132316 3.742000 +132322 1.244000 +132323 1.211000 +132324 0.844000 +132325 4.754000 +132326 1.487000 +132327 5.595000 +132328 5.570000 +132329 4.746000 +132330 3.746000 +132331 3.548000 +132332 3.752000 +132333 3.698000 +132337 4.504000 +132339 0.552000 +132342 0.548000 +132347 1.056000 +132351 5.675000 +132353 0.512000 +132365 1.881000 +132366 2.310000 +132369 2.660000 +132372 5.260000 +132375 4.955000 +132376 1.170000 +132378 1.076000 +132379 3.342000 +132383 3.012000 +132385 5.565000 +132386 1.130000 +132387 1.700000 +132393 2.161000 +132395 4.076000 +132396 4.024000 +132397 4.004000 +132404 1.932000 +132405 4.404000 +132408 2.671000 +132409 2.496000 +132410 4.430000 +132412 0.918000 +132413 0.914000 +132434 5.115000 +132437 6.265000 +132442 0.536000 +132458 2.744000 +132460 2.980000 +132462 5.655000 +132463 5.525000 +132464 5.495000 +132466 3.628000 +132469 5.025000 +132470 4.686000 +132472 3.278000 +132473 4.178000 +132474 4.424000 +132475 3.816000 +132476 4.930000 +132477 2.560000 +132479 3.648000 +132480 3.184000 +132488 3.995000 +132490 1.960000 +132495 1.899000 +132496 2.267000 +132497 2.814000 +132498 3.820000 +132499 3.796000 +132500 4.008000 +132501 1.695000 +132502 1.768000 +132510 5.700000 +132515 5.280000 +132529 0.508000 +132531 0.502000 +132541 4.330000 +132559 5.845000 +132560 5.965000 +132561 4.416000 +132562 5.855000 +132563 5.855000 +132564 5.870000 +132565 3.100000 +132566 5.815000 +132567 5.895000 +132568 5.830000 +132569 5.860000 +132570 5.840000 +132571 5.840000 +132572 5.925000 +132573 5.920000 +132574 5.840000 +132576 5.760000 +132577 5.860000 +132578 5.920000 +132579 5.860000 +132581 3.688000 +132582 5.885000 +132583 5.825000 +132584 5.860000 +132585 5.845000 +132586 2.386000 +132587 2.251000 +132591 5.670000 +132608 3.276000 +132616 5.325000 +132635 1.510000 +132636 1.191000 +132637 1.297000 +132638 1.183000 +132639 1.928000 +132640 3.548000 +132641 1.994000 +132642 2.165000 +132643 0.904000 +132644 1.129000 +132648 4.920000 +132649 2.884000 +132656 1.096000 +132657 2.443000 +132660 4.400000 +132661 4.394000 +132662 4.112000 +132663 4.052000 +132664 4.072000 +132665 4.040000 +132670 2.597000 +132671 2.425000 +132675 1.653000 +132677 4.332000 +132680 4.338000 +132682 3.048000 +132698 4.650000 +132706 1.690000 +132723 5.460000 +132724 3.594000 +132725 5.435000 +132726 5.190000 +132727 3.358000 +132728 5.915000 +132729 5.615000 +132730 5.790000 +132731 5.300000 +132732 5.320000 +132733 5.095000 +132734 5.200000 +132735 2.889000 +132736 1.914000 +132739 5.935000 +132741 5.950000 +132742 5.975000 +132743 6.015000 +132744 3.138000 +132745 3.688000 +132749 5.235000 +132750 3.552000 +132755 6.075000 +132757 6.110000 +132759 6.075000 +132762 6.105000 +132767 5.400000 +132768 5.265000 +132769 5.090000 +132770 5.135000 +132771 5.020000 +132772 5.010000 +132773 5.110000 +132774 5.125000 +132775 5.090000 +132776 4.930000 +132777 5.055000 +132778 4.935000 +132787 4.586000 +132788 5.745000 +132790 5.855000 +132795 2.219000 +132806 2.416000 +132807 3.188000 +132808 3.378000 +132809 2.445000 +132810 2.035000 +132811 3.577000 +132812 2.542000 +132817 2.340000 +132818 2.249800 +132819 2.009000 +132820 2.007000 +132821 1.018000 +132822 1.060000 +132823 2.007400 +132824 2.004800 +132825 2.004800 +132826 2.005600 +132827 2.005400 +132828 2.005200 +132829 2.009400 +132830 2.006400 +132831 2.008000 +132832 2.004400 +132833 1.006000 +132834 2.005200 +132835 2.005800 +132836 2.009600 +132837 2.004800 +132838 2.005600 +132839 1.046000 +132840 2.005600 +132841 2.005400 +132842 2.008800 +132909 5.920000 +132911 2.756000 +132912 4.965000 +132913 1.908000 +132914 3.874000 +132915 4.950000 +132916 4.598000 +132918 4.868000 +132924 3.220000 +132925 4.864000 +132928 4.970000 +132959 6.215000 +132975 3.914000 +132999 5.760000 +133000 0.816000 +133001 0.778000 +133002 0.800000 +133003 0.629500 +133004 0.606500 +133005 0.583500 +133006 0.828500 +133007 0.825500 +133008 0.585000 +133009 0.842500 +133010 0.824000 +133011 0.833500 +133012 0.836000 +133013 0.838000 +133014 0.795500 +133015 0.855500 +133017 0.774500 +133018 1.091000 +133019 1.078000 +133020 0.656000 +133021 0.992500 +133022 1.080000 +133023 1.087000 +133024 1.098000 +133025 0.686000 +133026 1.110000 +133027 0.635500 +133028 0.962500 +133035 6.210000 +133036 6.210000 +133037 6.260000 +133038 5.565000 +133040 6.120000 +133041 6.295000 +133042 3.254000 +133043 6.240000 +133044 6.295000 +133045 6.270000 +133046 6.220000 +133048 6.230000 +133049 6.230000 +133050 3.114000 +133053 6.180000 +133054 6.310000 +133056 6.335000 +133057 6.245000 +133058 5.780000 +133059 3.710000 +133060 5.360000 +133061 6.235000 +133062 6.215000 +133064 5.715000 +133065 5.625000 +133066 5.465000 +133067 5.605000 +133068 5.430000 +133077 5.660000 +133084 1.981000 +133085 1.836000 +133087 6.140000 +133099 0.596000 +133111 6.275000 +133112 1.334000 +133113 2.122000 +133114 1.797000 +133115 2.521000 +133116 2.732000 +133117 2.942000 +133122 2.368000 +133123 2.532000 +133124 2.862000 +133128 2.312000 +133129 2.268000 +133130 3.028000 +133131 1.908000 +133132 2.378000 +133133 2.603000 +133134 2.420000 +133137 5.680000 +133138 4.524000 +133139 2.853000 +133140 2.954000 +133141 2.286000 +133147 2.026000 +133148 2.632000 +133150 2.426000 +133151 2.467500 +133152 2.455000 +133153 2.225500 +133154 2.448000 +133155 2.350500 +133156 2.446000 +133157 2.061500 +133158 2.229000 +133159 2.859000 +133160 2.672000 +133161 3.335000 +133163 4.510000 +133164 4.036000 +133166 4.026000 +133195 4.888000 +133196 3.064000 +133205 5.505000 +133209 6.015000 +133224 1.358000 +133228 3.079000 +133231 3.146000 +133232 5.338000 +133233 4.009000 +133274 2.126000 +133275 2.280000 +133276 3.616000 +133308 3.150000 +133309 3.032000 +133313 3.052000 +133322 2.130000 +133323 2.606000 +133324 3.400000 +133325 2.982000 +133330 2.994000 +133337 5.065000 +133346 1.561000 +133347 1.420000 +133348 1.692000 +133349 1.747000 +133350 1.910000 +133356 5.120000 +133364 5.380000 +133370 2.980000 +133371 1.852000 +133372 1.905000 +133373 1.986000 +133375 4.965000 +133428 3.498000 +133431 0.502000 +133432 3.500000 +133433 4.076000 +133434 4.472000 +133435 4.786000 +133436 4.114000 +133437 4.872000 +133438 5.710000 +133444 1.799000 +133445 4.042000 +133446 5.465000 +133447 5.230000 +133448 5.840000 +133449 3.820000 +133450 4.072000 +133451 4.568000 +133453 4.454000 +133455 4.714000 +133456 4.248000 +133457 3.412000 +133458 2.382000 +133459 3.272000 +133460 3.400000 +133461 4.280000 +133462 6.065000 +133463 2.732000 +133464 3.536000 +133465 3.200000 +133467 4.370000 +133468 3.846000 +133469 3.928000 +133471 4.072000 +133472 3.858000 +133473 3.730000 +133477 4.530000 +133478 4.188000 +133479 3.814000 +133500 4.144000 +133509 4.364000 +133510 4.250000 +133511 2.745000 +133512 6.295000 +133513 3.866000 +133514 6.415000 +133515 3.776000 +133516 3.284000 +133517 3.670000 +133518 2.685000 +133519 3.068000 +133521 3.622000 +133522 3.158000 +133523 3.608000 +133524 4.546000 +133539 4.870000 +133540 4.788000 +133546 5.215000 +133551 5.120000 +133553 3.544000 +133555 2.986000 +133557 5.030000 +133559 2.498000 +133560 2.822000 +133562 4.925000 +133573 5.235000 +133574 4.985000 +133575 4.560000 +133576 4.624000 +133577 4.500000 +133578 4.392000 +133579 4.686000 +133580 4.754000 +133581 5.245000 +133582 4.852000 +133583 3.728000 +133584 5.105000 +133586 1.218000 +133587 5.465000 +133589 5.470000 +133593 5.450000 +133605 5.500000 +133611 5.495000 +133616 5.500000 +133641 5.170000 +133642 3.094000 +133644 3.774000 +133645 3.636000 +133647 6.070000 +133648 2.618000 +133649 2.738000 +133650 6.005000 +133651 2.116000 +133652 6.140000 +133653 4.915000 +133654 6.375000 +133655 6.065000 +133657 6.175000 +133658 4.602000 +133659 5.475000 +133661 2.141000 +133698 2.050000 +133703 2.103000 +133708 3.964000 +133709 3.136000 +133711 5.050000 +133712 5.125000 +133713 5.470000 +133715 5.490000 +133716 5.485000 +133717 5.480000 +133718 5.495000 +133719 5.495000 +133720 5.535000 +133743 3.902000 +133744 4.128000 +133745 4.578000 +133746 4.748000 +133758 1.179000 +133759 4.012000 +133760 5.140000 +133761 5.395000 +133762 5.345000 +133763 5.340000 +133768 4.166000 +133777 4.548000 +133780 5.035000 +133782 3.308000 +133783 3.314000 +133784 4.935000 +133787 5.085000 +133792 3.974000 +133794 1.165000 +133795 3.336000 +133812 3.862000 +133817 4.410000 +133818 4.044000 +133819 4.730000 +133820 3.624000 +133823 3.576000 +133824 4.380000 +133825 4.404000 +133826 4.840000 +133827 3.244000 +133828 5.180000 +133831 5.030000 +133835 4.790000 +133837 2.673000 +133842 5.580000 +133855 5.715000 +133856 5.700000 +133857 5.780000 +133859 5.290000 +133860 5.220000 +133864 5.280000 +133865 3.566000 +133867 5.755000 +133869 2.287000 +133876 5.695000 +133878 4.108000 +133885 4.418000 +133886 4.038000 +133890 0.518000 +133893 4.140000 +133899 5.740000 +133902 2.566000 +133906 4.360000 +133909 7.165000 +133911 3.756000 +133912 4.416000 +133913 2.620000 +133914 4.370000 +133915 5.108000 +133916 5.260000 +133917 4.334000 +133918 4.482000 +133925 4.694000 +133927 5.360000 +133928 5.360000 +133929 5.395000 +133930 5.395000 +133938 5.395000 +133941 5.340000 +133945 5.320000 +133946 5.395000 +133947 5.385000 +133951 4.905000 +133952 5.400000 +133959 3.292000 +133974 0.894000 +133975 0.606000 +133976 0.622000 +133977 0.624000 +133978 1.134000 +133979 1.550000 +133983 5.335000 +133984 2.695000 +133997 1.792000 +133998 2.069000 +133999 2.543000 +134001 5.845000 +134006 2.986000 +134010 6.315000 +134014 5.845000 +134017 6.255000 +134022 1.071000 +134023 6.135000 +134044 0.586000 +134056 4.764000 +134061 4.940000 +134065 5.385000 +134067 5.390000 +134068 5.390000 +134084 5.855000 +134086 4.580000 +134088 5.470000 +134089 3.804000 +134092 3.658000 +134093 5.870000 +134096 5.175000 +134103 5.500000 +134120 4.128000 +134121 3.598000 +134125 2.675000 +134126 4.738000 +134127 4.382000 +134128 4.168000 +134130 4.544000 +134136 3.060000 +134154 5.605000 +134158 2.625000 +134159 6.215000 +134160 6.190000 +134161 1.151000 +134162 5.540000 +134163 1.419000 +134164 6.240000 +134165 6.210000 +134166 6.220000 +134167 6.220000 +134177 4.198000 +134184 1.561000 +134187 2.109000 +134190 4.470000 +134191 4.696000 +134192 4.438000 +134193 4.328000 +134194 4.196000 +134195 4.080000 +134214 6.005000 +134282 2.007400 +134283 2.008400 +134285 2.025600 +134286 2.007400 +134288 2.039400 +134290 2.024600 +134291 2.022000 +134292 2.019400 +134293 2.018600 +134294 2.019600 +134295 2.019400 +134296 2.019000 +134297 2.021000 +134298 2.022800 +134299 2.019000 +134300 2.021000 +134301 2.020200 +134302 2.019000 +134303 2.018600 +134304 2.021200 +134305 4.250000 +134306 5.645000 +134307 5.670000 +134308 5.710000 +134309 5.625000 +134320 3.008000 +134321 3.008400 +134322 3.506000 +134323 3.504000 +134324 3.230000 +134325 3.507400 +134326 2.004600 +134327 2.005200 +134328 0.502000 +134329 2.005400 +134330 2.006400 +134331 0.702000 +134332 1.504000 +134333 1.507200 +134334 1.504800 +134335 1.504800 +134336 1.505200 +134337 2.004000 +134338 1.916600 +134339 2.005200 +134340 2.005200 +134341 2.006200 +134342 1.995800 +134346 6.300000 +134370 3.546000 +134374 3.610000 +134383 1.627000 +134384 4.452000 +134392 0.804000 +134419 5.320000 +134420 5.315000 +134421 5.315000 +134422 5.320000 +134423 5.355000 +134424 5.380000 +134425 5.335000 +134426 5.530000 +134427 5.345000 +134429 5.305000 +134430 5.355000 +134431 5.395000 +134435 1.059000 +134449 4.094000 +134450 2.573000 +134451 5.765000 +134458 3.086000 +134459 5.000000 +134460 5.030000 +134461 3.652000 +134464 5.495000 +134465 5.500000 +134466 5.445000 +134467 5.430000 +134493 4.176000 +134494 4.708000 +134496 5.595000 +134499 4.454000 +134504 3.438000 +134525 0.522000 +134529 0.895000 +134532 4.626000 +134544 5.495000 +134547 4.616000 +134548 4.856000 +134549 5.480000 +134550 5.850000 +134553 5.560000 +134554 6.040000 +134555 5.055000 +134556 4.910000 +134558 4.856000 +134559 2.338000 +135121 2.654000 +135172 5.535000 +135185 1.133000 +135192 3.432000 +135193 3.094000 +135200 0.650000 +135201 0.616000 +135202 0.516000 +135217 5.200000 +135218 3.772000 +135219 0.644000 +135221 3.900000 +135223 4.754000 +135224 5.250000 +135231 1.774000 +135238 2.094000 +135239 3.314000 +135254 3.320000 +135255 1.314000 +135256 1.071000 +135257 0.872000 +135262 1.146000 +135265 1.151000 +135414 4.212000 +135415 5.265000 +135428 5.070000 +135430 4.935000 +135431 4.878000 +135432 4.895000 +135433 4.822000 +135436 1.539000 +135438 3.002000 +135439 2.671000 +135440 4.226000 +135451 5.185000 +135452 3.016000 +135453 3.552000 +135454 4.146000 +135455 5.105000 +135456 5.095000 +135457 5.170000 +135458 5.150000 +135460 1.253000 +135461 1.969000 +135462 1.662000 +135463 2.417000 +135464 3.030000 +135465 2.034000 +135466 4.082000 +135468 5.085000 +135469 3.258000 +135488 5.410000 +135496 3.876000 +135497 3.068000 +135498 5.105000 +135499 4.356000 +135500 4.354000 +135501 1.075000 +135502 0.592000 +135503 0.854000 +135504 0.596000 +135505 0.510000 +135506 0.616000 +135507 0.884000 +135508 3.894000 +135509 3.146000 +135520 4.330000 +135523 4.002000 +135527 3.590000 +135528 3.546000 +135530 4.082000 +135533 3.464000 +135535 3.292000 +135536 3.342000 +135537 3.068000 +135538 3.014000 +135541 5.950000 +135542 0.606000 +135544 5.015000 +135545 0.808000 +135546 4.788000 +135547 1.735000 +135548 1.715000 +135549 1.666000 +135550 1.637000 +135551 3.022000 +135552 3.428000 +135555 2.252000 +135559 5.275000 +135565 4.324000 +135579 2.173000 +135580 3.810000 +135581 2.646000 +135582 3.912000 +135583 4.078000 +135584 4.162000 +135585 3.652000 +135586 0.670000 +135587 0.796000 +135588 0.636000 +135589 2.154000 +135590 0.850000 +135591 1.796000 +135599 4.058000 +135600 4.536000 +135602 4.430000 +135651 0.690000 +135655 0.710000 +135656 0.720000 +135657 0.662000 +135659 0.548000 +135660 0.602000 +135661 1.067000 +135662 1.084000 +135663 1.171000 +135664 3.848000 +135665 0.582000 +135690 1.243000 +135707 4.806000 +135708 4.676000 +135709 4.404000 +135710 4.210000 +135721 5.100000 +135723 4.250000 +135724 5.220000 +135732 5.475000 +135734 3.024000 +135735 2.125000 +135736 1.908000 +135738 2.833000 +135742 5.450000 +135748 4.844000 +135749 4.496000 +135750 2.798000 +135754 2.719000 +135755 2.507000 +135757 2.495000 +135766 4.490000 +135772 2.712000 +135773 3.230000 +135775 2.487000 +135781 3.011600 +135783 2.606000 +135784 3.007000 +135785 2.467000 +135787 3.009600 +135788 2.134000 +135789 1.909000 +135790 3.007200 +135791 3.006800 +135792 3.006000 +135793 3.006000 +135794 2.008200 +135795 3.006600 +135796 3.007600 +135801 3.008000 +135814 4.945000 +135815 4.332000 +135819 1.106000 +135820 0.894500 +135821 0.503000 +135824 0.698000 +135825 0.692500 +135826 0.966500 +135843 3.769000 +135844 2.620000 +135845 2.571000 +135846 2.588000 +135847 2.946000 +135848 2.814000 +135849 3.117000 +135850 3.151000 +135851 4.277000 +135852 5.058000 +135856 0.524000 +135857 0.670000 +135861 5.005000 +135866 4.558000 +135868 3.684000 +135869 4.638000 +135871 1.038000 +135872 0.667500 +135873 0.681000 +135877 0.688500 +135878 0.702000 +135880 0.568000 +135881 0.541000 +135886 3.306000 +135887 3.506000 +135888 3.956000 +135889 3.632000 +135890 3.506000 +135894 1.910000 +135895 4.428000 +135899 3.798000 +135903 4.108000 +135906 5.284000 +135913 5.360000 +135914 4.612000 +135916 4.136000 +135917 5.580000 +135918 3.456000 +135919 4.276000 +135920 3.546000 +135922 4.012000 +135923 3.390000 +135924 4.332000 +135926 4.768000 +135927 2.414000 +135928 4.548000 +135929 5.120000 +135995 3.064000 +135996 3.460000 +135997 3.386000 +135999 3.296000 +136001 5.795000 +136009 5.045000 +136012 4.180000 +136014 3.626000 +136015 3.094000 +136019 5.290000 +136023 2.964000 +136024 1.218000 +136025 1.182000 +136026 2.639000 +136027 2.512000 +136028 2.234000 +136029 2.411000 +136030 1.384000 +136031 2.158000 +136032 1.170000 +136033 1.170000 +136036 2.514000 +136037 5.790000 +136038 3.602000 +136039 3.090000 +136040 2.625000 +136041 2.668000 +136042 2.442000 +136043 2.460000 +136047 5.775000 +136055 5.770000 +136058 1.443000 +136060 5.795000 +136063 1.437000 +136064 1.135000 +136065 1.081000 +136066 1.000000 +136067 5.830000 +136083 0.760000 +136086 5.305000 +136090 1.984000 +136094 4.384000 +136095 0.796000 +136096 2.821000 +136097 5.440000 +136109 0.689500 +136110 0.794000 +136111 0.702000 +136112 0.623000 +136113 0.569000 +136114 0.632000 +136115 1.220000 +136116 0.666500 +136117 0.669500 +136118 0.614000 +136120 0.917500 +136121 0.511000 +136123 0.687000 +136124 0.521000 +136125 0.601500 +136127 0.497500 +136129 0.507000 +136130 0.619000 +136131 0.554000 +136132 0.590000 +136133 0.638000 +136157 3.199800 +136158 4.368000 +136159 3.700000 +136160 3.748000 +136162 3.014800 +136163 3.015400 +136164 3.014600 +136165 3.010400 +136166 0.534000 +136167 0.592000 +136168 0.732000 +136169 2.104000 +136170 3.009800 +136172 1.620000 +136173 3.009600 +136174 3.010600 +136180 3.010000 +136181 3.015200 +136185 6.285000 +136191 3.390000 +136217 4.878000 +136218 5.565000 +136219 5.600000 +136220 5.375000 +136221 5.385000 +136223 5.280000 +136225 5.295000 +136226 4.250000 +136227 3.658000 +136228 4.098000 +136229 3.970000 +136230 4.004000 +136231 3.344000 +136232 2.681000 +136233 5.350000 +136234 5.555000 +136235 3.756000 +136236 3.728000 +136237 3.954000 +136238 3.540000 +136239 4.764000 +136240 3.524000 +136241 2.704000 +136242 2.859000 +136243 3.320000 +136244 3.576000 +136245 5.115000 +136251 2.275000 +136252 3.412000 +136253 3.896000 +136254 4.240000 +136255 4.440000 +136256 4.274000 +136257 4.202000 +136258 4.252000 +136259 4.400000 +136260 4.664000 +136261 4.682000 +136262 4.618000 +136263 4.864000 +136264 4.356000 +136265 4.614000 +136266 4.636000 +136267 4.584000 +136268 4.866000 +136269 4.880000 +136270 4.960000 +136271 4.866000 +136272 4.390000 +136273 4.740000 +136274 3.602000 +136275 3.530000 +136276 3.648000 +136277 4.474000 +136278 5.480000 +136281 1.451000 +136282 1.700000 +136283 5.206000 +136284 5.394000 +136285 5.206000 +136286 5.292000 +136287 4.802000 +136289 3.108000 +136290 2.185000 +136291 3.990000 +136292 3.158000 +136293 2.932000 +136294 3.144000 +136295 2.255000 +136296 4.372000 +136297 3.500000 +136304 6.170000 +136308 4.048000 +136309 4.352000 +136319 1.878000 +136324 3.966000 +136325 4.214000 +136328 1.720000 +136329 5.216000 +136330 0.604000 +136331 5.040000 +136335 6.100000 +136336 5.905000 +136337 6.110000 +136339 2.742000 +136340 3.068000 +136341 2.219000 +136342 2.665000 +136344 4.598000 +136346 2.508000 +136347 6.120000 +136348 6.055000 +136451 4.328000 +136453 2.277000 +136454 1.314000 +136457 2.517000 +136458 3.360000 +136460 4.048000 +136462 1.775000 +136463 3.134000 +136477 3.288000 +136478 3.060000 +136481 5.240000 +136482 3.300000 +136483 5.265000 +136484 5.265000 +136485 5.285000 +136486 1.570000 +136487 4.832000 +136488 5.320000 +136489 5.335000 +136492 5.430000 +136493 5.115000 +136494 5.425000 +136495 5.430000 +136496 5.115000 +136497 3.062000 +136498 5.160000 +136499 3.154000 +136500 3.154000 +136502 3.118000 +136509 5.010000 +136527 5.220000 +136529 5.435000 +136542 5.415000 +136543 1.246000 +136545 1.634000 +136547 1.493000 +136548 4.310000 +136549 5.135000 +136552 3.900000 +136554 3.566000 +136559 4.674000 +136560 4.134000 +136561 5.420000 +136562 4.446000 +136564 4.985000 +136579 5.090000 +136582 5.290000 +136583 5.230000 +136584 5.005000 +136585 5.335000 +136586 5.310000 +136588 5.270000 +136589 5.320000 +136590 2.863000 +136591 5.120000 +136592 1.766000 +136596 1.101000 +136598 2.482000 +136599 2.948000 +136613 1.719800 +136614 1.750000 +136615 1.759400 +136616 1.744400 +136617 1.761800 +136618 0.819000 +136619 1.380000 +136620 1.759200 +136621 0.963000 +136622 1.749000 +136623 1.765200 +136624 1.728600 +136625 1.760400 +136626 1.761000 +136627 1.757600 +136628 1.755600 +136629 1.731200 +136630 1.727600 +136631 1.778000 +136632 1.733200 +136633 1.731200 +136634 1.735400 +136635 1.733400 +136636 1.730800 +136637 1.725000 +136638 1.724800 +136639 1.724400 +136640 1.729600 +136641 1.719400 +136642 1.731000 +136643 1.732600 +136644 1.726200 +136645 1.719000 +136646 1.717600 +136647 1.717200 +136666 5.455000 +136667 5.505000 +136668 5.485000 +136674 5.535000 +136681 5.535000 +136682 5.540000 +136684 5.535000 +136685 5.480000 +136687 3.674000 +136695 4.888000 +136696 4.980000 +136699 0.750000 +136712 0.546000 +136716 4.390000 +136718 3.904000 +136719 4.722000 +136720 4.664000 +136721 4.658000 +136725 5.345000 +136727 5.365000 +136734 3.722000 +136737 1.504000 +136738 3.880000 +136747 2.940000 +136748 4.988000 +136750 2.462000 +136751 4.350000 +136752 4.332000 +136753 4.338000 +136754 4.642000 +136756 4.118000 +136760 4.456000 +136763 4.108000 +136765 4.436000 +136767 4.244000 +136772 4.014000 +136773 4.462000 +136776 4.624000 +136777 4.622000 +136778 5.780000 +136779 4.570000 +136780 3.536000 +136814 4.876000 +136816 5.945000 +136817 6.055000 +136819 5.940000 +136820 5.865000 +136821 4.628000 +136822 4.718000 +136828 5.360000 +136837 3.408000 +136841 4.320000 +136863 0.924000 +136864 1.003000 +136865 1.123000 +136866 1.400000 +136867 1.413000 +136868 1.415000 +136873 4.744000 +136876 3.250000 +136878 5.400000 +136880 5.410000 +136881 5.785000 +136882 1.511000 +136883 1.421000 +136884 2.200000 +136885 4.704000 +136886 5.400000 +136897 4.842000 +136906 5.305000 +136911 5.930000 +136912 6.000000 +136913 5.900000 +136914 5.905000 +136915 6.025000 +136916 5.885000 +136917 5.875000 +136918 5.880000 +136919 5.360000 +136920 5.950000 +136922 4.394000 +136945 5.235000 +136946 5.255000 +136947 5.255000 +136950 5.295000 +136951 5.295000 +136952 5.300000 +136953 5.305000 +136954 5.300000 +136955 5.285000 +136956 5.310000 +136957 5.300000 +136998 5.045000 +136999 5.005000 +137111 5.460000 +137113 2.910000 +137114 2.976000 +137115 3.370000 +137116 3.602000 +137120 3.608000 +137121 3.734000 +137123 3.224000 +137124 3.464000 +137125 0.844000 +137127 5.470000 +137128 0.852000 +137129 4.018000 +137132 1.074000 +137173 2.928000 +137175 5.455000 +137178 5.120000 +137182 4.062000 +137183 5.125000 +137184 4.724000 +137186 2.436000 +137187 5.105000 +137188 5.115000 +137195 1.965000 +137196 5.425000 +137198 5.100000 +137203 3.354000 +137204 4.554000 +137205 4.044000 +137206 4.800000 +137208 3.112000 +137209 3.444000 +137210 4.568000 +137211 4.398000 +137212 3.276000 +137213 3.372000 +137214 2.874000 +137215 4.618000 +137216 4.554000 +137217 2.876000 +137218 3.658000 +137219 3.626000 +137220 4.458000 +137222 4.030000 +137223 2.604000 +137230 4.336000 +137232 4.274000 +137233 4.636000 +137234 4.244000 +137257 5.245000 +137258 3.942000 +137259 2.607000 +137260 4.965000 +137263 4.106000 +137264 3.526000 +137265 5.145000 +137267 5.115000 +137282 5.400000 +137284 3.646000 +137287 5.400000 +137297 3.928000 +137298 4.038000 +137305 4.688000 +137363 4.334000 +137367 3.908000 +137368 2.072000 +137379 4.428000 +137399 4.552000 +137438 3.884000 +137448 0.599800 +137449 0.982000 +137479 6.060000 +137507 4.822000 +137508 4.822000 +137517 1.665000 +137523 1.165000 +137525 1.414000 +137526 1.460000 +137527 1.171000 +137528 1.121000 +137540 5.315000 +137569 3.222000 +137580 2.607000 +137582 0.636000 +137584 0.934000 +137585 3.308000 +137586 2.037000 +137600 2.003000 +137601 2.002800 +137602 2.004200 +137603 2.003000 +137604 2.004600 +137605 2.004000 +137606 2.002800 +137607 2.003600 +137608 2.004200 +137609 2.003200 +137610 2.004000 +137611 2.003000 +137612 2.004200 +137613 2.004200 +137614 2.004000 +137615 2.004200 +137616 2.004200 +137617 2.004600 +137618 2.003000 +137619 2.004200 +137620 2.003800 +137621 2.003800 +137622 0.649000 +137623 2.004000 +137624 2.003600 +137625 2.004200 +137865 4.890000 +137866 5.115000 +137869 4.888000 +137870 4.832000 +137871 4.844000 +137872 4.910000 +137873 4.930000 +137874 4.910000 +137875 4.945000 +137876 4.930000 +137877 4.945000 +137879 6.020000 +137882 5.205000 +137883 0.996000 +137884 4.774000 +137885 4.792000 +137886 4.174000 +137887 5.010000 +137888 4.985000 +137898 5.210000 +137900 5.390000 +137901 5.360000 +137912 5.310000 +137919 5.390000 +137920 5.315000 +137921 5.375000 +137922 5.370000 +137923 5.355000 +137924 5.360000 +137944 3.758000 +137946 3.902000 +137947 5.395000 +137948 5.385000 +137949 5.395000 +137952 5.290000 +137958 0.528000 +137960 4.820000 +137964 0.910000 +137966 2.026000 +137967 2.002000 +137968 2.002000 +137969 2.004000 +137970 2.001000 +137974 3.242000 +137975 2.984000 +137977 2.612000 +137978 2.908000 +137979 4.174000 +137980 5.840000 +137981 3.902000 +137982 2.998000 +137983 5.505000 +137984 3.304000 +137985 3.162000 +137986 5.360000 +137987 2.159000 +137988 2.924000 +137989 2.865000 +137990 1.800000 +137991 2.393000 +137992 1.798000 +137993 2.896000 +138000 5.995000 +138001 3.280000 +138002 6.195000 +138003 6.240000 +138004 5.375000 +138005 1.966000 +138006 4.950000 +138007 4.380000 +138008 6.200000 +138009 1.759000 +138010 5.660000 +138012 2.046000 +138013 2.946000 +138017 2.663000 +138019 2.589000 +138024 4.935000 +138027 4.812000 +138028 5.140000 +138029 5.015000 +138032 4.864000 +138033 4.736000 +138048 5.140000 +138106 4.418000 +138107 4.486000 +138108 4.086000 +138109 4.112000 +138110 5.065000 +138111 1.006000 +138112 4.220000 +138113 1.684000 +138114 5.020000 +138115 2.178000 +138116 2.778000 +138117 3.780000 +138118 3.506000 +138119 2.786000 +138120 5.180000 +138121 2.714000 +138122 2.581000 +138123 3.350000 +138124 4.570000 +138125 1.945000 +138126 2.061000 +138134 5.156000 +138139 4.280000 +138145 1.944000 +138148 5.074000 +138149 2.468000 +138150 2.060000 +138155 1.706000 +138156 0.622000 +138157 1.872000 +138158 0.696000 +138163 0.622000 +138164 2.003000 +138165 2.002600 +138166 2.004200 +138167 0.772000 +138168 0.744000 +138169 2.004200 +138170 2.003800 +138171 2.003800 +138172 2.004000 +138173 0.744000 +138174 2.002800 +138175 2.004000 +138176 2.002800 +138177 2.003400 +138178 2.004000 +138179 2.002800 +138180 2.003200 +138181 2.003000 +138182 2.003200 +138183 2.003200 +138195 3.014800 +138196 3.031600 +138197 3.006600 +138198 0.760000 +138202 0.764000 +138204 3.004200 +138205 3.220000 +138206 3.009800 +138207 3.003200 +138208 3.003800 +138209 3.189800 +138210 3.036600 +138212 2.998600 +138213 3.000200 +138217 4.360000 +138218 3.196000 +138224 3.832000 +138231 4.742000 +138232 4.562000 +138233 4.534000 +138238 4.010000 +138248 0.958000 +138249 3.400000 +138250 1.907000 +138251 1.824000 +138252 1.745000 +138253 1.579000 +138254 2.684000 +138255 1.969000 +138256 4.636000 +138259 4.326000 +138260 3.586000 +138261 2.928000 +138262 3.074000 +138263 3.114000 +138264 3.472000 +138265 2.922000 +138266 4.086000 +138267 4.420000 +138268 3.222000 +138269 2.567000 +138304 0.572000 +138306 3.746000 +138316 3.242000 +138331 4.000000 +138339 5.485000 +138346 4.486000 +138347 5.215000 +138348 3.706000 +138349 5.215000 +138350 4.634000 +138351 5.205000 +138352 5.970000 +138353 3.814000 +138354 4.690000 +138355 2.731000 +138356 4.486000 +138357 4.622000 +138361 4.200000 +138365 4.352000 +138373 2.696000 +138375 2.335000 +138376 2.116000 +138377 3.554000 +138378 5.090000 +138379 1.882000 +138388 3.820000 +138393 1.394000 +138398 3.742000 +138399 3.728000 +138401 4.772000 +138410 2.826000 +138412 0.534000 +138413 0.624000 +138414 0.626000 +138415 0.514000 +138416 0.508000 +138417 0.546000 +138418 0.556000 +138420 0.560000 +138421 0.528000 +138422 0.520000 +138423 0.594000 +138424 0.594000 +138425 0.534000 +138430 5.265000 +138433 5.790000 +138435 5.565000 +138436 2.787000 +138437 5.585000 +138438 1.188000 +138439 5.510000 +138440 2.970000 +138441 5.515000 +138442 3.186000 +138443 5.495000 +138444 2.061000 +138445 3.410000 +138446 5.655000 +138447 4.332000 +138448 5.685000 +138449 5.655000 +138450 5.695000 +138451 4.810000 +138452 2.801000 +138453 5.575000 +138465 5.785000 +138466 5.225000 +138467 5.525000 +138468 5.165000 +138469 5.165000 +138470 4.734000 +138471 5.425000 +138472 5.805000 +138473 5.820000 +138474 5.875000 +138478 5.840000 +138479 5.845000 +138483 1.916000 +138486 1.642000 +138501 3.021800 +138505 3.025000 +138506 1.092000 +138508 1.801000 +138509 3.215000 +138510 0.600000 +138511 0.714000 +138514 1.115000 +138517 2.002000 +138518 2.004000 +138519 2.004600 +138520 2.580000 +138521 2.004000 +138522 2.003000 +138523 1.503800 +138524 1.503600 +138525 1.503000 +138530 4.810000 +138534 2.361000 +138537 5.380000 +138540 6.255000 +138541 6.045000 +138544 6.300000 +138545 5.915000 +138546 6.320000 +138547 2.301000 +138549 1.350000 +138550 2.450000 +138552 3.966000 +138553 4.610000 +138554 5.405000 +138555 2.509000 +138556 4.146000 +138557 6.275000 +138558 4.456000 +138559 3.100000 +138560 5.405000 +138564 3.244000 +138566 5.370000 +138568 5.370000 +138571 5.400000 +138574 5.395000 +138576 5.390000 +138577 5.380000 +138586 4.462000 +138591 5.040000 +138593 4.516000 +138597 0.798000 +138598 4.538000 +138599 3.896000 +138600 3.468000 +138602 3.576000 +138603 3.924000 +138604 4.802000 +138605 3.674000 +138607 4.048000 +138608 3.540000 +138610 3.442000 +138612 4.038000 +138617 4.286000 +138619 5.325000 +138640 1.192000 +138643 3.030000 +138644 2.037000 +138646 2.025600 +138647 2.747000 +138649 2.014600 +138650 4.312000 +138652 3.350000 +138653 3.128000 +138654 3.798000 +138655 3.854000 +138659 4.562000 +138660 1.128000 +138666 1.683000 +138667 1.816000 +138668 2.864000 +138669 2.259000 +138670 1.796000 +138671 4.614000 +138672 4.522000 +138674 4.542000 +138679 4.810000 +138680 4.816000 +138683 4.704000 +138684 4.838000 +138685 5.218000 +138686 4.816000 +138687 4.930000 +138695 3.982000 +138696 0.554000 +138697 5.635000 +138700 1.597000 +138701 1.856000 +138702 4.935000 +138704 5.475000 +138710 4.094000 +138711 2.040000 +138715 4.222000 +138722 4.200000 +138723 4.114000 +138724 4.895000 +138727 1.578000 +138728 1.173000 +138729 1.190000 +138731 1.407000 +138733 0.598000 +138743 0.648000 +138744 0.960000 +138747 2.889000 +138748 2.555000 +138749 3.248000 +138750 3.090000 +138752 4.204000 +138755 5.085000 +138762 5.360000 +138764 3.702000 +138765 2.970000 +138766 2.922000 +138770 5.570000 +138775 3.558000 +138776 3.150000 +138777 2.840000 +138782 5.485000 +138785 1.689000 +138787 5.580000 +138788 5.090000 +138790 4.504000 +138791 3.104000 +138793 1.934000 +138794 1.854000 +138800 4.224000 +138801 4.712000 +138802 4.740000 +138803 4.672000 +138804 2.033000 +138805 2.118000 +138806 2.756000 +138807 2.377000 +138808 2.704000 +138810 2.978000 +138811 5.142000 +138814 1.140000 +138815 5.774000 +138816 2.812000 +138817 2.256000 +138818 2.022000 +138822 4.728000 +138824 2.474000 +138825 5.266000 +138826 2.360000 +139296 4.804000 +139297 4.106000 +139298 4.524000 +139299 5.690000 +139300 5.455000 +139302 5.485000 +139307 5.465000 +139308 0.510000 +139309 5.565000 +139310 5.555000 +139311 5.530000 +139317 3.918000 +139318 3.684000 +139319 2.234000 +139320 5.695000 +139353 5.035000 +139354 5.005000 +139355 5.065000 +139378 5.215000 +139382 1.991000 +139385 4.188000 +139386 5.275000 +139388 5.295000 +139389 2.223000 +139401 5.160000 +139402 4.434000 +139405 5.300000 +139408 2.604000 +139410 5.285000 +139411 5.285000 +139413 2.274000 +139436 1.939000 +139438 5.145000 +139439 4.544000 +139442 3.230000 +139443 4.392000 +139444 3.480000 +139445 3.968000 +139448 5.140000 +139449 3.676000 +139450 5.095000 +139451 5.175000 +139453 4.995000 +139459 4.622000 +139463 1.983000 +139470 0.544000 +139471 4.786000 +139497 5.540000 +139512 1.979000 +139513 3.308000 +139514 3.688000 +139515 5.035000 +139516 3.940000 +139517 3.342000 +139518 3.556000 +139519 4.542000 +139520 3.612000 +139521 2.638000 +139522 4.840000 +139523 3.582000 +139524 2.626000 +139525 3.500000 +139526 2.253000 +139527 2.055000 +139528 2.231000 +139530 3.990000 +139531 4.124000 +139532 4.658000 +139533 2.819000 +139534 4.106000 +139535 5.030000 +139536 4.670000 +139537 5.240000 +139538 5.005000 +139545 3.908000 +139546 4.356000 +139547 4.046000 +139548 3.548000 +139550 0.916000 +139551 4.234000 +139552 1.891000 +139553 3.332000 +139554 3.808000 +139555 2.904000 +139556 1.927000 +139557 3.710000 +139558 3.570000 +139559 3.594000 +139560 5.205000 +139563 3.690000 +139566 1.907000 +139567 1.660000 +139568 3.746000 +139571 3.500000 +139572 3.114000 +139573 2.789000 +139584 4.930000 +139585 5.130000 +139586 5.320000 +139587 4.006000 +139590 6.170000 +139591 5.205000 +139592 3.968000 +139593 6.405000 +139594 5.750000 +139595 5.975000 +139596 5.505000 +139597 5.945000 +139598 4.068000 +139599 4.566000 +139608 5.130000 +139610 2.559000 +139612 0.908000 +139613 2.371000 +139623 3.730000 +139624 2.017600 +139627 3.464000 +139628 3.370000 +139629 2.005400 +139630 3.476000 +139631 2.011200 +139632 3.944000 +139633 1.812000 +139634 3.944000 +139637 4.020000 +139638 2.008000 +139639 2.010400 +139660 5.460000 +139672 2.823000 +139681 5.580000 +139687 0.912000 +139694 2.541000 +139696 5.975000 +139697 5.840000 +139698 5.855000 +139699 5.840000 +139700 5.850000 +139701 5.850000 +139704 1.897000 +139705 2.116000 +139706 5.945000 +139709 5.810000 +139710 6.195000 +139712 5.940000 +139713 5.945000 +139717 6.195000 +139726 2.556000 +139727 2.570000 +139729 1.768000 +139730 5.310000 +139731 5.580000 +139732 5.585000 +139733 2.151000 +139734 5.640000 +139736 5.825000 +139737 5.885000 +139739 5.810000 +139741 5.735000 +139742 5.695000 +139743 4.026000 +139746 5.580000 +139759 3.112000 +139762 5.915000 +139763 1.643000 +139765 2.636000 +139766 3.600000 +139767 3.316000 +139770 5.655000 +139771 3.878000 +139774 4.756000 +139775 5.825000 +139776 4.980000 +139778 5.825000 +139779 3.966000 +139780 5.870000 +139781 5.580000 +139782 2.488000 +139786 5.835000 +139787 5.525000 +139803 1.537000 +139805 3.070000 +139806 5.100000 +139807 1.515000 +139808 1.898000 +139809 1.580000 +139810 1.896000 +139811 3.914000 +139812 3.008000 +139813 1.795000 +139814 1.699000 +139815 1.684000 +139818 4.652000 +139819 2.077000 +139820 5.105000 +139821 5.505000 +139822 6.110000 +139823 4.524000 +139824 2.410000 +139825 1.426000 +139826 1.576000 +139827 3.268000 +139828 2.730000 +139829 2.289000 +139830 2.603000 +139831 2.324000 +139832 1.024000 +139870 0.524000 +139871 5.180000 +139873 4.390000 +139874 3.988000 +139875 2.450000 +139886 5.200000 +139888 3.816000 +139889 3.764000 +139892 1.723000 +139903 0.666000 +139913 5.425000 +139914 4.666000 +139927 5.650000 +139932 5.455000 +139933 5.490000 +139934 5.540000 +139935 5.590000 +139936 5.495000 +139937 5.585000 +139941 5.525000 +139942 5.565000 +139946 5.475000 +139947 5.375000 +139948 5.510000 +139949 5.470000 +139951 2.407000 +139952 1.568000 +139954 5.125000 +139956 5.465000 +139959 5.620000 +139960 5.470000 +139961 6.090000 +139962 6.060000 +139963 5.630000 +139964 6.035000 +139965 5.540000 +139966 5.145000 +139967 5.415000 +139969 6.045000 +139975 1.834000 +139976 3.500000 +139977 4.930000 +139978 5.155000 +139979 4.880000 +139980 5.155000 +139981 4.882000 +139982 5.265000 +139986 4.706000 +139987 4.860000 +139988 4.935000 +139989 4.985000 +139990 4.562000 +139992 4.995000 +139993 3.308000 +139994 4.520000 +139996 2.459000 +140004 4.442000 +140005 4.810000 +140006 4.560000 +140007 4.476000 +140008 4.030000 +140009 5.230000 +140010 3.480000 +140011 2.779000 +140021 2.972000 +140022 3.872000 +140023 5.025000 +140024 3.918000 +140025 3.578000 +140026 3.012000 +140027 2.875000 +140028 3.998000 +140042 4.818000 +140043 3.822000 +140044 4.682000 +140046 4.410000 +140047 4.874000 +140051 5.750000 +140054 1.048000 +140055 5.655000 +140057 5.420000 +140058 3.590000 +140062 2.426000 +140079 4.074000 +140080 0.924000 +140081 0.966000 +140085 8.050000 +140088 8.045000 +140091 8.030000 +140098 3.862000 +140100 4.100000 +140101 4.014000 +140103 5.290000 +140104 5.070000 +140106 7.045000 +140107 7.050000 +140108 7.045000 +140109 7.090000 +140110 7.060000 +140115 7.035000 +140118 3.558000 +140119 3.892000 +140121 3.474000 +140123 1.476000 +140124 5.665000 +140125 1.446000 +140126 2.871000 +140127 2.926000 +140128 5.685000 +140130 5.765000 +140131 5.715000 +140132 4.228000 +140133 5.550000 +140139 4.402000 +140140 3.376000 +140143 4.660000 +140147 6.130000 +140148 6.170000 +140149 5.390000 +140152 5.205000 +140155 6.220000 +140157 6.170000 +140158 5.390000 +140159 3.910000 +140160 0.956000 +140161 5.695000 +140164 1.355000 +140167 4.874000 +140168 3.740000 +140171 5.185000 +140172 5.195000 +140173 5.695000 +140174 5.515000 +140176 5.535000 +140177 3.298000 +140186 4.368000 +140190 6.070000 +140194 4.300000 +140197 6.020000 +140201 5.375000 +140206 4.388000 +140207 4.540000 +140208 4.458000 +140212 5.365000 +140213 5.400000 +140217 4.114000 +140218 3.102000 +140231 5.550000 +140232 4.148000 +140233 2.303000 +140234 2.353000 +140237 3.970000 +140238 3.384000 +140239 3.068000 +140240 6.330000 +140243 3.910000 +140244 4.292000 +140245 2.841000 +140246 2.095000 +140247 1.660000 +140248 1.548000 +140249 1.227000 +140250 1.697000 +140251 4.698000 +140252 4.496000 +140253 2.968000 +140254 3.098000 +140255 2.436000 +140256 2.024000 +140257 1.815000 +140258 2.348000 +140259 3.060000 +140260 3.132000 +140261 3.424000 +140262 4.300000 +140263 4.326000 +140266 4.740000 +140267 4.002000 +140268 3.916000 +140269 4.614000 +140270 4.530000 +140271 3.868000 +140272 4.784000 +140275 2.405000 +140276 4.276000 +140277 3.548000 +140278 3.414000 +140279 3.762000 +140280 3.496000 +140282 2.581000 +140283 3.658000 +140284 4.472000 +140285 2.821000 +140286 2.572000 +140287 2.583000 +140288 2.972000 +140289 2.622000 +140290 1.678000 +140291 2.019000 +140292 2.575000 +140293 2.333000 +140294 4.792000 +140295 5.515000 +140296 5.360000 +140297 5.440000 +140298 5.400000 +140299 5.260000 +140330 2.990000 +140332 3.794000 +140333 5.456000 +140334 1.712000 +140335 1.700000 +140336 1.690000 +140341 2.768000 +140370 6.490000 +140371 6.484000 +140373 6.244000 +140380 1.088000 +140382 2.376000 +140385 3.138000 +140387 4.540000 +140395 4.230000 +140397 5.176000 +140399 5.210000 +140402 5.062000 +140403 4.478000 +140410 3.504000 +140425 6.055000 +140426 5.385000 +140439 5.990000 +140440 4.392000 +140444 5.955000 +140447 5.395000 +140459 5.295000 +140460 2.821000 +140461 1.469000 +140462 2.773000 +140463 1.507000 +140464 0.964000 +140466 3.256000 +140467 3.446000 +140468 3.672000 +140470 6.265000 +140472 6.390000 +140473 0.734000 +140474 0.924000 +140476 3.864000 +140505 5.755000 +140516 5.265000 +140517 5.255000 +140533 5.155000 +140546 0.589500 +140547 0.780500 +140548 0.777000 +140549 0.576000 +140550 0.587500 +140551 0.690500 +140552 0.785500 +140553 0.755000 +140554 0.785000 +140555 0.586000 +140556 0.628500 +140557 0.790500 +140558 0.849000 +140564 2.006600 +140565 2.006200 +140566 2.006600 +140567 2.005400 +140568 2.006200 +140569 1.726000 +140570 1.662000 +140571 2.004400 +140572 2.060200 +140573 2.004800 +140574 2.004800 +140575 2.004200 +140576 2.004600 +140577 2.065600 +140578 2.003600 +140579 2.004800 +140580 2.005200 +140581 2.005000 +140582 2.004400 +140583 2.004600 +140584 2.004800 +140586 2.005600 +140587 2.004600 +140588 2.004600 +140589 2.004800 +140595 4.836000 +140620 5.405000 +140621 5.405000 +140622 5.410000 +140623 5.405000 +140624 5.405000 +140625 5.410000 +140626 5.405000 +140640 4.744000 +140642 3.414000 +140644 4.214000 +140645 3.554000 +140646 3.760000 +140647 1.380000 +140649 4.812000 +140650 1.388000 +140652 4.000000 +140653 1.909000 +140658 5.220000 +140660 4.844000 +140664 5.640000 +140666 1.910000 +140670 5.385000 +140671 5.385000 +140672 5.385000 +140681 3.406000 +140694 3.416000 +140706 1.599000 +140711 3.032000 +140716 3.428000 +140728 0.696000 +140732 4.384000 +140733 3.458000 +140734 6.435000 +140735 3.200000 +140737 3.464000 +140739 6.325000 +140740 5.250000 +140741 5.105000 +140742 0.662000 +140748 6.065000 +140755 6.055000 +140762 4.022000 +140763 6.195000 +140764 2.543000 +140765 1.427000 +140766 3.190000 +140767 4.814000 +140768 4.802000 +140769 3.670000 +140770 2.459000 +140771 3.286000 +140772 4.434000 +140773 6.170000 +140774 4.604000 +140775 4.112000 +140776 2.644000 +140777 5.435000 +140778 2.790000 +140779 4.354000 +140780 4.362000 +140781 4.478000 +140782 2.389000 +140783 2.608000 +140784 2.958000 +140785 3.472000 +140786 3.768000 +140787 3.436000 +140788 3.922000 +140789 2.222000 +140790 4.340000 +140791 1.334000 +140792 4.860000 +140793 2.702000 +140794 5.310000 +140795 3.302000 +140796 2.752000 +140797 2.804000 +140798 3.084000 +140799 2.898000 +140800 2.040000 +140861 5.454000 +140863 5.170000 +140865 5.484000 +140867 5.296000 +140896 4.700000 +140898 4.152000 +140919 5.945000 +140921 5.085000 +140922 4.360000 +140923 4.438000 +140925 3.952000 +140926 6.390000 +140928 5.740000 +140930 5.295000 +140942 3.790000 +140943 3.250000 +140945 4.076000 +140947 4.146000 +140948 4.624000 +140949 3.040000 +140950 3.770000 +140951 2.306000 +140953 5.315000 +140955 4.314000 +140956 3.916000 +140957 3.082000 +140958 3.868000 +140959 4.482000 +140960 4.028000 +140961 3.572000 +140962 4.042000 +140963 2.074000 +140964 3.404000 +140965 3.524000 +140966 4.975000 +140967 3.394000 +140968 4.414000 +140969 3.332000 +140975 0.846000 +140976 1.172000 +140977 1.419000 +140978 2.906000 +140979 3.944000 +140980 4.428000 +140981 0.802000 +140982 2.605000 +140983 2.550000 +140984 1.946000 +140985 2.958000 +140986 2.012000 +140988 2.883000 +140989 3.940000 +140990 0.526000 +140991 0.588000 +140992 0.692000 +140993 0.760000 +140994 4.448000 +140995 3.144000 +140996 4.496000 +140997 3.300000 +140998 3.372000 +140999 2.026000 +141000 3.460000 +141001 2.630000 +141002 3.000000 +141003 2.342000 +141006 0.568000 +141010 3.714000 +141012 4.734000 +141025 4.192000 +141028 4.794000 +141030 4.134000 +141031 2.118000 +141032 2.354000 +141033 3.050000 +141034 2.988000 +141035 3.312000 +141036 2.942000 +141037 2.252000 +141038 2.460000 +141039 2.976000 +141040 2.902000 +141044 2.686000 +141047 3.256000 +141048 4.634000 +141049 3.432000 +141050 4.980000 +141051 5.020000 +141052 4.112000 +141053 4.732000 +141054 4.662000 +141055 5.135000 +141056 4.930000 +141057 2.513000 +141058 4.790000 +141059 4.965000 +141060 6.340000 +141061 5.280000 +141062 5.080000 +141063 5.120000 +141064 4.530000 +141065 5.440000 +141066 4.700000 +141078 4.890000 +141079 2.324000 +141082 4.004000 +141085 4.460000 +141086 4.956000 +141087 4.916000 +141088 4.932000 +141093 4.256000 +141097 1.862000 +141098 1.566000 +141099 1.606000 +141100 1.582000 +141101 1.918000 +141102 3.840000 +141103 3.146000 +141107 4.310000 +141108 4.750000 +141109 4.754000 +141110 4.486000 +141111 4.524000 +141112 4.376000 +141113 4.428000 +141114 4.282000 +141115 3.756000 +141116 3.868000 +141117 3.900000 +141119 4.480000 +141120 4.524000 +141121 4.296000 +141122 1.983000 +141123 4.870000 +141124 4.800000 +141125 4.224000 +141126 4.930000 +141127 5.540000 +141128 4.138000 +141129 5.815000 +141130 3.642000 +141131 3.146000 +141133 5.785000 +141151 4.012000 +141168 2.689000 +141172 4.492000 +141173 4.098000 +141174 3.902000 +141175 3.896000 +141176 4.048000 +141177 1.536000 +141178 1.650000 +141181 5.795000 +141186 6.120000 +141192 5.725000 +141193 6.130000 +141194 6.130000 +141235 0.679500 +141236 0.657500 +141237 0.651000 +141238 0.623000 +141239 0.648500 +141240 0.653500 +141242 0.644500 +141243 0.622000 +141265 4.645000 +141269 0.736500 +141299 2.063000 +141300 2.407000 +141301 2.094000 +141302 2.136000 +141303 2.127000 +141304 1.733000 +141305 1.757000 +141306 1.375000 +141307 1.690000 +141308 2.439000 +141309 1.732000 +141310 1.827000 +141311 1.691000 +141312 2.525000 +141314 2.582000 +141315 2.938000 +141316 1.935000 +141317 1.656000 +141318 1.716000 +141319 1.656000 +141324 4.636000 +141325 3.460000 +141326 4.042000 +141327 3.558000 +141329 4.344000 +141330 3.764000 +141331 3.468000 +141332 3.482000 +141333 3.350000 +141334 3.454000 +141335 4.332000 +141336 4.030000 +141337 3.402000 +141341 5.290000 +141343 5.275000 +141345 3.128000 +141346 3.150000 +141347 3.212000 +141348 2.781000 +141349 3.918000 +141350 3.336000 +141353 4.268000 +141355 5.270000 +141356 5.385000 +141358 4.494000 +141359 3.912000 +141360 3.676000 +141361 3.668000 +141362 4.590000 +141364 4.470000 +141367 4.414000 +141368 2.615000 +141369 4.314000 +141371 4.096000 +141372 4.818000 +141373 3.418000 +141374 3.806000 +141375 3.922000 +141376 2.750000 +141379 2.865000 +141382 0.524000 +141389 4.716000 +141390 5.120000 +141391 5.135000 +141393 1.289000 +141394 5.150000 +141396 2.492000 +141421 4.860000 +141434 4.940000 +141435 4.586000 +141436 4.306000 +141437 5.030000 +141439 4.850000 +141441 3.670000 +141442 4.070000 +141443 3.272000 +141447 4.710000 +141448 4.320000 +141450 4.858000 +141454 5.185000 +141456 4.796000 +141457 4.262000 +141459 5.680000 +141463 5.740000 +141465 4.102000 +141473 0.626000 +141491 5.575000 +141492 5.430000 +141493 2.452000 +141494 4.580000 +141495 3.804000 +141496 2.460000 +141497 2.397000 +141498 2.896000 +141500 2.340000 +141512 6.090000 +141521 1.527000 +141522 5.780000 +141524 6.400000 +141525 6.375000 +141526 6.420000 +141527 6.355000 +141536 5.575000 +141537 1.300000 +141539 1.298000 +141541 0.956000 +141543 0.948000 +141544 2.060000 +141549 4.995000 +141551 4.014000 +141567 4.614000 +141574 4.995000 +141579 1.848000 +141592 3.600000 +141610 1.008000 +141611 4.178000 +141613 5.380000 +141615 4.198000 +141616 4.940000 +141619 3.390000 +141621 4.558000 +141625 5.265000 +141626 5.025000 +141632 4.640000 +141633 4.598000 +141637 2.401000 +141639 4.556000 +141680 2.009000 +141710 3.444000 +141713 4.500000 +141715 5.195000 +141716 5.135000 +141717 5.370000 +141718 3.658000 +141732 2.984000 +141733 2.004000 +141734 2.004000 +141735 2.004200 +141736 2.004000 +141737 2.003800 +141738 2.004200 +141739 2.003600 +141740 2.004200 +141741 2.003600 +141742 2.003800 +141743 2.003400 +141744 2.003800 +141745 2.004000 +141746 2.004000 +141747 2.003800 +141748 2.003800 +141749 2.003800 +141751 2.003000 +141752 2.002800 +141753 2.003800 +141754 2.003200 +141755 2.003600 +141756 2.003600 +141757 2.003400 +141758 2.003600 +141759 2.004000 +141760 2.004000 +141821 4.380000 +141831 4.520000 +141836 3.172000 +141838 3.862000 +141843 5.720000 +141845 2.482000 +141846 3.062000 +141847 4.542000 +141848 3.858000 +141849 1.867000 +141850 3.810000 +141851 3.848000 +141852 5.100000 +141853 4.410000 +141855 4.404000 +141857 4.436000 +141876 6.060000 +141880 5.578000 +141882 5.712000 +141883 4.552000 +141885 5.428000 +141898 5.210000 +141899 5.270000 +141900 1.280000 +141901 1.069000 +141902 0.950000 +141903 0.644000 +141907 4.658000 +141908 4.560000 +141909 4.674000 +141910 4.672000 +141912 3.910000 +141914 3.848000 +141915 3.794000 +141916 4.074000 +141917 4.154000 +141918 4.196000 +141924 4.274000 +141957 2.008000 +141960 2.009000 +141963 2.011000 +141970 5.365000 +141971 5.445000 +141979 5.595000 +141980 5.310000 +141982 5.255000 +141983 5.360000 +141984 5.395000 +141988 5.900000 +141989 5.095000 +141990 5.115000 +141991 5.120000 +141992 5.355000 +141993 5.115000 +141995 5.160000 +141996 5.525000 +142001 2.343000 +142003 5.460000 +142004 5.680000 +142036 4.846000 +142037 4.610000 +142039 6.525000 +142040 6.045000 +142041 4.052000 +142042 4.356000 +142043 4.798000 +142044 3.786000 +142048 2.902000 +142050 3.452000 +142058 5.900000 +142059 5.980000 +142060 5.920000 +142061 5.910000 +142067 5.550000 +142068 4.864000 +142069 3.392000 +142072 3.378000 +142076 5.255000 +142086 3.554000 +142089 3.424000 +142090 3.592000 +142100 5.228000 +142101 5.254000 +142102 5.520000 +142113 2.634000 +142116 3.108000 +142138 2.006000 +142139 2.535000 +142140 2.005600 +142141 2.920000 +142142 2.005600 +142143 4.315000 +142144 2.007200 +142147 2.005400 +142149 2.006200 +142151 2.007000 +142153 2.015600 +142155 2.014200 +142157 2.008400 +142159 2.010400 +142161 2.010200 +142163 2.011600 +142165 2.009600 +142170 5.110000 +142205 1.725000 +142210 5.405000 +142219 4.468000 +142220 5.350000 +142221 4.925000 +142222 4.060000 +142225 3.828000 +142226 4.016000 +142227 3.274000 +142228 1.096000 +142229 1.027000 +142232 2.683000 +142233 4.248000 +142234 4.024000 +142235 4.372000 +142237 4.098000 +142238 6.010000 +142239 2.546000 +142241 5.345000 +142242 5.685000 +142243 5.250000 +142244 5.730000 +142250 5.270000 +142251 5.125000 +142252 4.668000 +142253 2.279000 +142255 2.735000 +142257 5.355000 +142271 0.746000 +142277 2.478000 +142278 2.763000 +142279 4.374000 +142280 1.289000 +142291 1.396000 +142296 5.695000 +142297 5.870000 +142298 5.875000 +142299 5.605000 +142300 5.610000 +142352 0.800000 +142353 0.780000 +142354 0.740000 +142407 5.215000 +142408 5.900000 +142410 4.418000 +142412 3.904000 +142415 4.132000 +142417 2.211000 +142420 3.936000 +142424 5.210000 +142458 7.805000 +142459 4.812000 +142461 5.002000 +142465 1.302000 +142466 1.298000 +142468 4.842000 +142469 4.876000 +142470 4.936000 +142471 4.934000 +142474 6.255000 +142482 1.315000 +142488 5.510000 +142490 5.680000 +142491 5.455000 +142587 5.685000 +142588 4.200000 +142589 4.856000 +142595 4.646000 +142597 3.044000 +142607 3.964000 +142609 5.190000 +142610 4.638000 +142611 4.126000 +142612 4.750000 +142613 5.485000 +142614 5.235000 +142617 5.520000 +142618 5.510000 +142620 5.235000 +142630 4.318000 +142633 3.682000 +142635 4.578000 +142646 3.598000 +142647 3.594000 +142648 5.250000 +142649 5.875000 +142653 3.968000 +142656 4.550000 +142657 5.280000 +142661 2.004000 +142662 2.005200 +142664 2.003400 +142667 2.003800 +142669 2.004200 +142673 2.059600 +142674 2.004000 +142675 2.003200 +142678 2.003200 +142687 2.003600 +142689 2.004000 +142690 2.003800 +142691 2.003400 +142692 2.004000 +142694 4.662000 +142695 3.994000 +142696 4.406000 +142699 5.155000 +142700 5.190000 +142701 5.260000 +142706 3.120000 +142707 2.003800 +142708 2.003600 +142711 2.003400 +142716 2.056200 +142719 2.157200 +142721 2.253400 +142727 2.004000 +142729 2.003400 +142730 2.003800 +142731 2.005800 +142733 2.003800 +142758 4.320000 +142760 5.550000 +142764 1.229000 +142765 1.274000 +142770 5.610000 +142771 5.350000 +142772 1.493000 +142775 6.310000 +142780 2.188000 +142781 2.394000 +142784 1.434000 +142785 5.915000 +142793 5.595000 +142877 4.738000 +143706 0.606000 +143707 1.506000 +143710 0.708000 +143711 1.032000 +143712 2.324000 +143722 3.156000 +143723 2.154000 +143734 5.056000 +143735 1.590000 +143738 5.472000 +143740 2.722000 +143744 5.488000 +143749 2.200000 +143766 1.649000 +143782 1.782000 +143835 5.015000 +143836 0.842000 +143838 0.918000 +143874 1.831000 +143878 1.371000 +143879 1.878000 +143882 1.767000 +143883 1.791000 +143886 1.820000 +143888 4.336000 +143895 0.542000 +143896 5.545000 +143969 4.700000 +143970 4.866000 +143971 4.676000 +143974 4.888000 +143975 4.810000 +143999 3.500000 +144002 3.420000 +144003 4.392000 +144023 5.610000 +144024 4.228000 +144025 3.200000 +144032 5.925000 +144060 2.492000 +144063 4.930000 +144064 4.402000 +144066 4.614000 +144067 4.666000 +144068 4.482000 +144069 4.656000 +144070 4.488000 +144089 4.718000 +144090 4.618000 +144091 5.305000 +144092 5.695000 +144096 2.656000 +144103 5.360000 +144138 3.060000 +144139 1.899000 +144140 2.780000 +144148 5.140000 +144164 3.336000 +144165 3.666000 +144168 2.299000 +144170 4.294000 +144172 2.495000 +144173 2.842000 +144175 3.326000 +144176 2.958000 +144177 1.904000 +144178 2.255000 +144179 2.824000 +144180 2.348000 +144181 1.980000 +144182 3.878000 +144187 0.778000 +144189 3.816000 +144190 1.589000 +144191 1.646000 +144193 1.649000 +144200 4.338000 +144204 4.198000 +144207 4.292000 +144209 4.596000 +144210 4.198000 +144212 1.570000 +144215 2.830000 +144217 3.486000 +144218 2.261000 +144219 4.242000 +144220 3.892000 +144235 3.836000 +144257 5.795000 +144262 5.130000 +144292 5.090000 +144293 5.065000 +144294 5.040000 +144312 0.764000 +144339 1.135000 +144369 0.604000 +144370 0.616000 +144371 0.656000 +144375 1.732000 +144379 1.449000 +144381 5.415000 +144382 5.545000 +144384 5.670000 +144385 5.710000 +144386 5.585000 +144387 5.655000 +144388 5.095000 +144390 5.365000 +144391 4.068000 +144394 4.812000 +144395 4.410000 +144396 5.470000 +144397 5.665000 +144407 4.780000 +144411 5.355000 +144425 2.922000 +144427 1.452000 +144428 2.812000 +144429 4.332000 +144430 3.240000 +144432 4.076000 +144433 1.340000 +144434 1.505000 +144435 3.070000 +144436 3.340000 +144437 3.560000 +144438 3.874000 +144439 2.988000 +144440 4.456000 +144441 3.518000 +144442 2.720000 +144447 1.158000 +144509 4.874000 +144515 5.660000 +144517 0.524000 +144520 1.307000 +144521 1.039000 +144524 5.475000 +144525 5.390000 +144526 5.365000 +144527 0.936000 +144530 1.399000 +144531 4.768000 +144532 1.347000 +144534 0.746000 +144535 0.712000 +144539 2.238000 +144540 2.241000 +144541 0.544000 +144542 0.638000 +144543 2.238000 +144548 5.805000 +144551 1.400000 +144553 5.325000 +144555 1.228000 +144559 1.635000 +144560 3.442000 +144561 1.857000 +144562 2.662000 +144563 2.962000 +144564 3.220000 +144685 0.620000 +144686 0.618000 +144687 2.130000 +144689 0.526000 +144690 1.914000 +144691 2.090000 +144692 5.908000 +144694 4.508000 +144695 1.212000 +144696 1.040000 +144697 1.158000 +144698 1.208000 +144699 6.030000 +144700 5.592000 +144701 6.200000 +144710 4.512000 +144711 5.470000 +144713 5.520000 +144722 5.490000 +144725 5.420000 +144726 5.500000 +144728 5.450000 +144731 5.495000 +144732 0.810000 +144733 5.500000 +144734 5.510000 +144736 5.030000 +144741 3.996000 +144755 4.594000 +144756 5.070000 +144758 1.603000 +144759 5.525000 +144760 2.778000 +144761 5.085000 +144763 2.970000 +144764 4.066000 +144766 4.202000 +144767 2.722000 +144769 1.453000 +144772 5.300000 +144775 5.390000 +144783 1.589000 +144785 1.653000 +144792 5.205000 +144793 3.430000 +144794 3.738000 +144795 3.432000 +144796 5.095000 +144797 3.830000 +144798 3.434000 +144799 4.496000 +144803 3.432000 +144805 2.641000 +144806 3.006000 +144808 2.599000 +144809 2.488000 +144811 4.132000 +144812 5.070000 +144813 4.696000 +144814 3.918000 +144817 6.160000 +144819 3.016000 +144820 3.018000 +144821 2.697000 +144822 2.559000 +144823 2.365000 +144824 2.525000 +144825 2.263000 +144826 2.167000 +144827 2.123000 +144828 2.127000 +144829 2.566000 +144831 2.314000 +144832 2.110000 +144833 2.170000 +144834 2.168000 +144835 2.659000 +144836 3.024000 +144837 3.024000 +144838 3.020000 +144839 1.847000 +144840 3.022000 +144841 3.018000 +144842 3.038000 +144843 3.028000 +144844 4.580000 +144845 3.630000 +144846 3.286000 +144847 4.354000 +144848 3.996000 +144849 2.884000 +144850 3.686000 +144851 1.660000 +144852 2.116000 +144874 5.525000 +144875 5.470000 +144876 5.500000 +144877 5.495000 +144878 5.525000 +144879 5.475000 +144880 5.495000 +144881 5.450000 +144882 5.530000 +144894 5.970000 +144896 5.065000 +144897 1.415000 +144898 5.800000 +144900 4.658000 +144901 5.100000 +144909 2.944000 +144910 3.234000 +144911 3.484000 +144924 3.284000 +144955 1.926000 +144957 1.122000 +144962 1.797000 +144982 4.910000 +144994 3.842000 +144995 4.480000 +144996 3.952000 +144997 6.205000 +144998 6.190000 +144999 6.235000 +145003 1.455000 +145009 5.160000 +145010 3.982000 +145011 3.278000 +145013 4.324000 +145014 3.814000 +145015 3.998000 +145016 5.150000 +145017 3.552000 +145018 3.480000 +145019 4.344000 +145020 5.060000 +145021 3.754000 +145022 3.172000 +145023 3.838000 +145026 5.875000 +145027 5.530000 +145029 4.448000 +145031 3.958000 +145032 2.034000 +145033 4.382000 +145034 4.172000 +145037 0.776000 +145050 1.701000 +145062 4.840000 +145064 3.782000 +145068 4.965000 +145070 4.888000 +145075 3.830000 +145078 5.395000 +145080 3.694000 +145081 5.305000 +145084 4.208000 +145087 3.568000 +145089 3.598000 +145090 2.926000 +145092 4.320000 +145095 5.305000 +145096 1.811000 +145097 3.750000 +145108 3.872000 +145109 5.395000 +145112 4.622000 +145113 5.365000 +145114 4.032000 +145115 4.975000 +145116 5.015000 +145118 2.740000 +145119 2.120000 +145120 5.275000 +145121 4.380000 +145122 1.730000 +145124 2.376000 +145126 2.238000 +145127 2.958000 +145128 3.436000 +145129 2.721000 +145130 2.652000 +145131 3.408000 +145139 4.258000 +145141 4.360000 +145144 3.692000 +145150 2.078000 +145163 6.025000 +145164 0.588000 +145165 0.592000 +145210 6.025000 +145211 6.015000 +145235 4.466000 +145237 4.816000 +145238 4.636000 +145239 4.528000 +145240 4.264000 +145244 0.776000 +145301 5.055000 +145304 4.352000 +145321 3.068000 +145325 1.148000 +145326 0.536000 +145335 0.516000 +145336 0.570000 +145337 1.369000 +145338 5.125000 +145340 1.229000 +145341 1.237000 +145342 3.414000 +145343 5.135000 +145345 2.433000 +145347 3.206000 +145348 5.420000 +145351 5.150000 +145353 1.728000 +145363 2.934000 +145365 2.594000 +145366 2.274000 +145367 2.669000 +145373 3.434000 +145374 2.294000 +145375 2.262000 +145378 5.310000 +145379 4.512000 +145380 4.598000 +145381 5.975000 +145382 5.740000 +145383 5.845000 +145384 5.310000 +145385 4.558000 +145386 2.590000 +145387 5.880000 +145388 5.975000 +145390 3.514000 +145391 4.758000 +145392 4.402000 +145407 6.020000 +145408 4.690000 +145409 4.890000 +145410 3.734000 +145411 4.236000 +145412 6.150000 +145413 6.100000 +145415 6.060000 +145416 6.045000 +145417 4.140000 +145419 6.045000 +145420 4.895000 +145421 5.185000 +145422 6.060000 +145425 5.985000 +145426 5.070000 +145427 5.645000 +145443 2.034000 +145450 5.440000 +145454 0.518000 +145464 5.715000 +145467 5.485000 +145469 5.385000 +145476 1.198000 +145479 4.344000 +145483 2.004000 +145484 2.006000 +145486 2.003000 +145490 2.003800 +145491 2.004800 +145493 2.003800 +145495 2.004000 +145496 2.003800 +145497 2.003800 +145498 2.004800 +145500 2.003800 +145501 2.007000 +145502 2.004000 +145503 2.003600 +145504 2.006000 +145505 2.003800 +145506 2.003800 +145507 2.004000 +145508 2.003600 +145509 2.003600 +145510 2.003800 +145511 2.003800 +145514 2.004000 +145515 2.004000 +145516 2.004600 +145517 2.004200 +145518 2.003600 +145519 2.004000 +145522 2.004200 +145525 2.003000 +145526 2.003800 +145527 2.003800 +145544 1.430000 +145547 4.008000 +145548 3.918000 +145549 4.038000 +145550 4.528000 +145554 1.822000 +145559 1.867000 +145576 4.784000 +145578 4.458000 +145581 2.073000 +145584 5.100000 +145585 4.895000 +145588 4.696000 +145589 2.849000 +145590 4.780000 +145591 3.992000 +145592 4.758000 +145593 2.869000 +145594 3.826000 +145595 2.760000 +145596 5.155000 +145597 3.420000 +145634 2.256000 +145638 2.321000 +145639 2.434000 +145640 2.109000 +145641 2.300000 +145642 2.671000 +145644 3.266000 +145645 2.452000 +145646 2.577000 +145647 2.212000 +145648 4.616000 +145649 3.510000 +145650 3.234000 +145651 5.630000 +145652 3.780000 +145653 3.858000 +145654 3.788000 +145655 3.068000 +145656 2.330000 +145657 3.992000 +145658 3.126000 +145659 5.135000 +145660 3.794000 +145661 3.140000 +145665 1.372000 +145666 1.989000 +145681 4.995000 +145682 3.818000 +145688 5.435000 +145689 4.174000 +145691 4.636000 +145704 6.095000 +145716 2.740000 +145721 6.040000 +145748 1.368000 +145763 1.526000 +145766 1.706000 +145816 2.004600 +145818 2.004000 +145821 2.003600 +145822 2.004400 +145823 2.003800 +145824 2.003600 +145825 2.003600 +145827 2.003600 +145829 2.003600 +145833 2.003600 +145834 2.003600 +145836 2.003600 +145845 2.003200 +145847 2.008400 +145848 2.003600 +145857 4.945000 +145858 4.500000 +145860 3.530000 +145862 3.824000 +145866 3.840000 +145881 4.830000 +145887 5.000000 +145889 1.866000 +145890 4.250000 +145891 5.160000 +145906 3.452000 +145912 4.432000 +145913 3.840000 +145916 3.360000 +145917 3.998000 +145926 5.725000 +145929 5.730000 +145934 5.735000 +145941 5.375000 +145950 5.495000 +145995 5.155000 +146014 1.282000 +146015 5.645000 +146024 2.003600 +146025 2.003600 +146026 2.003200 +146030 2.006200 +146033 2.049800 +146036 1.973600 +146042 2.251000 +146046 3.522000 +146049 3.520000 +146052 2.444000 +146061 1.622000 +146062 2.331000 +146063 2.308000 +146064 3.092000 +146066 1.629000 +146067 2.553000 +146068 1.653000 +146069 1.660000 +146070 3.008000 +146071 3.118000 +146081 4.286000 +146087 4.408000 +146092 2.190000 +146100 1.888000 +146103 1.387000 +146124 1.052000 +146125 1.432000 +146131 2.004200 +146132 2.004400 +146136 2.003600 +146137 0.804000 +146139 1.654000 +146140 2.005400 +146141 2.215000 +146142 2.007000 +146144 2.003600 +146145 2.003800 +146147 1.294000 +146190 4.534000 +146192 1.143000 +146193 1.161000 +146194 4.650000 +146195 2.894000 +146196 4.172000 +146200 4.340000 +146201 1.821000 +146202 4.352000 +146203 4.310000 +146204 2.746000 +146205 4.122000 +146206 4.478000 +146207 4.750000 +146208 3.398000 +146209 2.886000 +146210 2.889000 +146211 1.665000 +146271 2.845000 +146282 3.176000 +146283 2.581000 +146293 3.570000 +146314 5.610000 +146337 4.868000 +146380 3.226000 +146382 5.825000 +146383 0.702000 +146386 4.960000 +146387 3.678000 +146388 5.138000 +146389 3.410000 +146390 1.912000 +146391 3.406000 +146392 4.754000 +146393 5.695000 +146394 6.055000 +146395 4.104000 +146396 4.344000 +146397 4.788000 +146398 4.376000 +146399 4.444000 +146400 4.280000 +146401 4.018000 +146402 3.608000 +146403 3.121000 +146404 0.880000 +146405 5.146000 +146414 5.445000 +146421 5.090000 +146426 0.602000 +146431 5.515000 +146432 1.726000 +146433 5.550000 +146434 6.540000 +146435 1.355000 +146437 6.545000 +146438 6.575000 +146442 2.742000 +146445 5.625000 +146460 6.110000 +146464 2.358000 +146468 4.618000 +146475 5.260000 +146477 5.395000 +146478 5.400000 +146479 4.834000 +146482 4.980000 +146484 5.350000 +146487 5.335000 +146494 5.035000 +146495 4.258000 +146496 3.560000 +146497 3.278000 +146498 4.320000 +146499 2.525000 +146516 0.574000 +146517 5.955000 +146518 5.660000 +146519 5.850000 +146532 4.990000 +146543 4.635000 +146546 4.940000 +146547 4.955000 +146550 2.020000 +146572 5.445000 +146583 5.205000 +146584 5.155000 +146585 5.115000 +146586 3.950000 +146587 5.465000 +146594 4.712000 +146598 5.675000 +146599 5.605000 +146614 3.908000 +146620 6.200000 +146621 6.170000 +146623 6.045000 +146626 4.776000 +146627 4.500000 +146628 5.815000 +146630 4.002000 +146633 2.535000 +146634 3.576000 +146635 3.758000 +146642 6.035000 +146644 3.848000 +146645 2.858000 +146646 3.910000 +146647 6.010000 +146648 5.618000 +146649 4.948000 +146650 5.174000 +146651 5.574000 +146654 6.145000 +146655 6.205000 +146657 6.695000 +146663 4.708000 +146667 3.808000 +146668 3.002000 +146669 3.442000 +146670 3.236000 +146672 3.160000 +146676 3.402000 +146683 1.466000 +146684 3.402000 +146685 3.032000 +146686 3.031800 +146687 3.031800 +146688 3.032000 +146689 3.025000 +146690 3.032400 +146691 3.027800 +146692 3.033600 +146693 3.034600 +146694 3.030000 +146695 3.034600 +146696 3.013200 +146697 3.020800 +146698 3.026400 +146699 3.008000 +146700 3.008600 +146701 3.009000 +146703 2.048000 +146705 2.005400 +146706 2.004800 +146707 2.005600 +146708 2.004400 +146709 2.003800 +146714 0.602000 +146715 4.196000 +146760 1.161000 +146771 1.479000 +146783 3.228000 +146786 6.155000 +146787 5.440000 +146790 6.145000 +146791 6.115000 +146792 1.724000 +146793 2.708000 +146794 3.351000 +146795 6.070000 +146796 6.045000 +146797 4.910000 +146798 4.712000 +146799 5.278000 +146800 3.990000 +146801 3.446000 +146802 4.788000 +146804 4.116000 +146805 4.078000 +146806 4.472000 +146808 3.212000 +146810 2.921000 +146811 5.560000 +146813 6.125000 +146819 5.580000 +146837 1.795000 +146843 5.675000 +146844 5.475000 +146845 5.340000 +146847 4.606000 +146849 4.674000 +146851 4.742000 +146852 4.676000 +146853 5.420000 +146854 4.788000 +146855 5.530000 +146856 5.335000 +146866 5.310000 +146867 5.250000 +146872 5.205000 +146873 4.176000 +146874 4.320000 +146909 0.674000 +146911 1.450000 +146912 1.705000 +146913 3.570000 +146914 3.012000 +146916 6.365000 +146918 9.315000 +146919 1.810000 +146920 2.285000 +146921 3.504000 +146922 3.572000 +146923 3.956000 +146924 2.612000 +146925 2.325000 +146926 2.000000 +146927 2.250000 +146929 7.555000 +146930 7.625000 +146931 0.540000 +146932 8.710000 +146933 6.420000 +146937 4.730000 +146938 8.520000 +146940 9.325000 +146941 7.050000 +146943 9.315000 +146947 9.355000 +146949 9.750000 +146953 5.264000 +146958 5.614000 +146959 5.668000 +146961 5.206000 +146962 6.735000 +146966 5.846000 +146976 4.290000 +146978 1.833000 +146979 6.245000 +146985 5.305000 +146986 5.600000 +146987 4.564000 +146988 4.530000 +146989 3.452000 +146991 4.030000 +146992 3.882000 +146995 5.785000 +146996 5.735000 +147002 3.192000 +147006 0.654000 +147008 4.258000 +147009 2.782000 +147010 3.634000 +147011 7.070000 +147013 3.244000 +147014 2.962000 +147015 7.760000 +147016 8.300000 +147017 4.048000 +147018 5.796000 +147019 4.406000 +147022 4.684000 +147024 6.650000 +147025 8.210000 +147026 8.420000 +147027 8.700000 +147028 3.496000 +147029 2.840000 +147030 3.178000 +147031 2.410000 +147032 3.264000 +147033 5.702000 +147034 9.085000 +147035 8.715000 +147036 3.722000 +147037 2.270000 +147044 8.490000 +147045 4.122000 +147046 3.714000 +147047 3.612000 +147048 2.594000 +147049 9.155000 +147050 9.050000 +147052 5.140000 +147053 9.785000 +147060 9.695000 +147062 9.710000 +147067 9.840000 +147068 3.306000 +147069 3.360000 +147070 9.880000 +147072 9.110000 +147079 3.176000 +147080 3.078000 +147081 4.280000 +147082 3.046000 +147084 9.660000 +147085 7.915000 +147088 1.035000 +147090 5.760000 +147091 10.640000 +147092 7.845000 +147095 3.506000 +147096 3.646000 +147099 5.985000 +147100 6.425000 +147101 7.675000 +147102 7.420000 +147103 5.795000 +147104 8.200000 +147105 7.770000 +147107 5.225000 +147114 2.656000 +147117 5.805000 +147118 5.780000 +147123 5.775000 +147124 5.760000 +147125 4.336000 +147132 5.820000 +147136 5.785000 +147142 5.830000 +147143 5.685000 +147161 3.898000 +147164 5.805000 +147167 6.240000 +147168 6.245000 +147169 4.766000 +147170 5.085000 +147171 4.608000 +147172 3.844000 +147173 4.034000 +147174 3.730000 +147175 5.995000 +147176 5.950000 +147178 5.955000 +147179 4.905000 +147189 2.567000 +147190 2.614000 +147191 3.702000 +147192 1.736000 +147194 5.175000 +147199 4.130000 +147200 2.642000 +147201 4.040000 +147202 4.856000 +147203 4.262000 +147204 1.404000 +147205 2.063000 +147206 2.044000 +147207 4.450000 +147208 3.714000 +147209 3.284000 +147210 3.144000 +147211 3.520000 +147212 3.702000 +147213 4.472000 +147263 2.429000 +147266 1.546000 +147268 5.180000 +147278 5.170000 +147279 5.185000 +147280 5.170000 +147284 4.090000 +147286 3.118000 +147287 3.358000 +147289 1.812000 +147291 4.364000 +147292 1.942000 +147328 1.795000 +147329 3.684000 +147333 1.560000 +147335 1.701000 +147336 3.172000 +147337 2.651000 +147338 1.277000 +147339 2.740000 +147340 1.234000 +147341 1.409000 +147342 1.841000 +147344 2.888000 +147345 2.059000 +147347 3.438000 +147348 2.256000 +147350 3.456000 +147351 3.946000 +147352 3.484000 +147353 1.615000 +147355 1.602000 +147356 1.732000 +147357 3.330000 +147358 1.628000 +147359 2.474000 +147360 2.838000 +147361 1.601000 +147362 2.240000 +147363 3.472000 +147386 4.354000 +147387 3.606000 +147388 3.998000 +147389 4.980000 +147390 4.338000 +147393 4.608000 +147395 4.022000 +147403 2.630000 +147406 5.130000 +147409 5.075000 +147427 1.188000 +147431 1.945000 +147433 1.630000 +147434 1.657000 +147435 2.806000 +147437 2.520000 +147442 1.910000 +147445 2.009400 +147447 2.019200 +147448 2.034000 +147449 2.026600 +147450 2.010000 +147451 2.008800 +147452 2.021800 +147453 2.483000 +147458 3.918000 +147463 4.878000 +147513 5.060000 +147514 5.310000 +147515 4.132000 +147516 4.062000 +147517 4.330000 +147590 5.605000 +147591 5.925000 +147593 5.470000 +147595 3.716000 +147602 5.670000 +147611 5.805000 +147612 4.532000 +147613 4.406000 +147614 4.308000 +147641 0.614000 +147643 4.888000 +147644 3.884000 +147654 5.205000 +147655 5.185000 +147666 4.720000 +147672 5.095000 +147674 4.080000 +147679 3.928000 +147683 3.944000 +147687 3.804000 +147688 3.714000 +147698 5.235000 +147702 4.194000 +147706 2.936000 +147710 2.024000 +147716 0.764000 +147738 0.542000 +147741 1.655000 +147743 7.760000 +148162 5.115000 +148163 5.530000 +148168 5.385000 +148171 1.051000 +148178 1.111000 +148207 5.305000 +148213 0.874000 +148248 4.096000 +148249 3.398000 +148251 5.290000 +148252 5.275000 +148253 5.570000 +148254 3.812000 +148256 5.575000 +148257 5.580000 +148259 4.888000 +148260 3.682000 +148283 5.645000 +148286 5.230000 +148287 5.340000 +148304 4.340000 +148305 5.105000 +148306 4.550000 +148310 4.812000 +148315 2.603000 +148316 2.799000 +148317 4.234000 +148322 4.965000 +148326 4.544000 +148328 5.130000 +148329 4.550000 +148330 4.554000 +148331 4.548000 +148332 4.558000 +148333 4.534000 +148334 5.350000 +148342 2.591000 +148343 4.146000 +148345 4.166000 +148358 0.984000 +148371 4.334000 +148372 4.128000 +148373 3.142000 +148374 3.950000 +148375 3.654000 +148380 3.672000 +148383 5.555000 +148389 0.574000 +148390 0.530000 +148391 4.316000 +148392 4.010000 +148454 5.325000 +148461 5.215000 +148468 3.736000 +148469 1.603000 +148470 2.341000 +148471 5.455000 +148480 4.774000 +148481 5.005000 +148484 2.119000 +148488 3.946000 +148489 4.052000 +148492 1.026000 +148494 4.486000 +148498 0.860000 +148505 6.050000 +148506 5.865000 +148507 5.800000 +148508 4.624000 +148509 5.820000 +148510 5.880000 +148531 0.526000 +148556 1.670000 +148582 4.002000 +148593 5.290000 +148611 4.106000 +148612 5.225000 +148613 5.345000 +148617 2.741000 +148618 3.028000 +148620 4.198000 +148621 3.154000 +148623 3.600000 +148625 5.430000 +148628 5.620000 +148650 4.516000 +148651 3.548000 +148652 4.526000 +148655 5.615000 +148657 4.530000 +148660 4.544000 +148663 6.065000 +148670 2.313000 +148676 0.706000 +148677 5.325000 +148678 1.821000 +148685 6.185000 +148686 6.175000 +148707 6.085000 +148708 3.828000 +148710 1.180000 +148711 1.690000 +148713 3.974000 +148714 2.089000 +148716 4.878000 +148719 4.732000 +148720 4.905000 +148721 5.005000 +148722 5.300000 +148723 5.205000 +148724 6.285000 +148725 6.065000 +148726 6.305000 +148727 6.035000 +148728 4.144000 +148729 3.936000 +148731 6.240000 +148732 4.660000 +148733 3.378000 +148737 5.905000 +148739 4.082000 +148740 6.150000 +148741 5.670000 +148743 3.898000 +148744 5.370000 +148748 3.102000 +148751 4.950000 +148752 5.340000 +148753 4.352000 +148754 3.042000 +148755 2.859000 +148757 2.109000 +148758 4.532000 +148759 4.380000 +148760 4.588000 +148761 6.175000 +148762 5.315000 +148763 5.110000 +148765 5.955000 +148767 4.184000 +148771 5.520000 +148782 4.940000 +148789 5.360000 +148795 1.514000 +148836 0.520000 +148837 0.962000 +148838 3.888000 +148839 2.324000 +148841 5.515000 +148843 5.385000 +148845 5.190000 +148847 5.270000 +148848 5.265000 +148849 5.445000 +148856 5.295000 +148871 5.195000 +148872 1.379000 +148875 3.894000 +148900 0.550000 +148921 1.486000 +148928 1.768000 +148960 4.925000 +148962 3.636000 +148963 3.958000 +148964 4.940000 +148965 5.785000 +148967 4.314000 +148968 2.529000 +148969 2.485000 +148970 2.964000 +148971 3.862000 +148972 5.765000 +148974 3.350000 +149001 1.733000 +149002 1.744000 +149003 2.373000 +149004 1.804000 +149005 1.854000 +149006 3.388000 +149007 1.716000 +149008 2.278000 +149009 2.996000 +149012 4.846000 +149013 1.586000 +149014 3.370000 +149016 3.552000 +149017 3.924000 +149018 1.798000 +149019 4.206000 +149021 3.288000 +149024 4.212000 +149025 1.310000 +149028 4.272000 +149029 4.186000 +149030 2.325000 +149031 1.624000 +149032 1.811000 +149033 2.005000 +149034 1.864000 +149035 2.226000 +149036 1.970000 +149037 2.461000 +149044 1.455000 +149045 3.984000 +149053 1.349000 +149062 1.307000 +149065 3.522000 +149066 3.380000 +149067 3.418000 +149068 4.850000 +149069 1.145000 +149070 0.980000 +149071 1.986000 +149072 0.874000 +149073 1.820000 +149074 3.434000 +149075 1.066000 +149076 3.538000 +149077 2.784000 +149078 3.170000 +149079 2.670000 +149090 1.114000 +149091 5.985000 +149092 5.255000 +149093 1.132000 +149094 4.510000 +149095 5.570000 +149097 1.365000 +149098 6.100000 +149099 3.468000 +149100 4.476000 +149102 1.112000 +149103 6.120000 +149104 6.130000 +149105 3.660000 +149106 6.090000 +149107 5.400000 +149108 5.530000 +149112 1.215000 +149118 6.120000 +149119 2.709000 +149125 1.635000 +149131 4.576000 +149134 1.101000 +149135 5.520000 +149140 4.492000 +149141 4.965000 +149143 4.542000 +149153 4.686000 +149163 2.336000 +149165 3.438000 +149166 3.716000 +149167 4.604000 +149168 4.608000 +149169 4.532000 +149170 2.452000 +149171 4.562000 +149172 4.422000 +149173 4.860000 +149174 4.940000 +149175 2.413000 +149176 4.474000 +149177 4.674000 +149178 2.769000 +149179 4.558000 +149180 3.896000 +149181 3.528000 +149182 4.030000 +149183 3.442000 +149184 2.593000 +149185 1.935000 +149186 4.696000 +149187 3.530000 +149188 3.930000 +149189 4.462000 +149190 3.518000 +149191 3.660000 +149199 5.020000 +149202 5.410000 +149205 5.360000 +149206 5.400000 +149207 2.389000 +149208 4.396000 +149211 5.400000 +149212 2.524000 +149213 4.126000 +149214 3.724000 +149215 3.630000 +149216 4.736000 +149219 4.406000 +149220 5.390000 +149221 4.364000 +149222 5.370000 +149224 5.405000 +149225 5.400000 +149226 5.360000 +149227 4.662000 +149243 3.968000 +149244 6.205000 +149248 6.215000 +149251 4.140000 +149254 5.860000 +149255 5.865000 +149256 5.860000 +149257 4.410000 +149258 5.855000 +149259 5.870000 +149264 5.865000 +149266 6.200000 +149294 2.263000 +149295 2.278000 +149296 1.058000 +149297 2.936000 +149298 3.238000 +149302 5.230000 +149306 1.251000 +149307 6.120000 +149309 4.704000 +149311 5.470000 +149312 4.232000 +149313 4.080000 +149314 3.678000 +149315 4.915000 +149320 5.875000 +149321 5.880000 +149324 3.384000 +149326 5.880000 +149327 5.885000 +149329 5.885000 +149331 5.850000 +149338 4.148000 +149340 5.880000 +149341 5.910000 +149342 4.402000 +149343 5.265000 +149349 6.425000 +149355 5.360000 +149356 5.370000 +149363 6.210000 +149365 4.876000 +149366 2.194000 +149368 2.430000 +149369 5.230000 +149374 3.180000 +149379 5.720000 +149381 5.805000 +149382 4.250000 +149392 2.517000 +149402 3.946000 +149432 3.436000 +149433 1.664000 +149434 2.300000 +149435 2.422000 +149436 1.377000 +149438 2.466000 +149439 1.558000 +149440 1.911000 +149441 1.949000 +149442 1.998000 +149443 2.032000 +149444 2.139000 +149446 1.969000 +149447 3.398000 +149448 6.045000 +149449 6.015000 +149450 5.570000 +149451 5.750000 +149452 3.856000 +149453 5.530000 +149454 5.170000 +149455 6.125000 +149456 5.755000 +149457 6.040000 +149458 6.095000 +149459 5.070000 +149462 5.575000 +149470 1.771000 +149471 1.427000 +149472 2.015000 +149473 3.014000 +149474 3.866000 +149475 2.706000 +149477 1.594000 +149478 3.448000 +149479 3.788000 +149480 2.328000 +149481 2.347000 +149482 2.515000 +149483 3.324000 +149484 1.945000 +149486 1.845000 +149488 5.435000 +149489 1.045000 +149490 1.106000 +149491 4.670000 +149499 2.226000 +149500 1.493000 +149501 2.998000 +149502 2.416000 +149503 1.720000 +149504 1.931000 +149505 1.744000 +149508 0.552000 +149530 6.070000 +149531 5.355000 +149532 5.820000 +149540 3.508000 +149544 4.798000 +149586 3.906000 +149597 0.564000 +149602 3.518000 +149603 5.705000 +149612 5.725000 +149626 6.350000 +149632 0.528000 +149633 5.680000 +149634 5.690000 +149635 5.690000 +149636 5.685000 +149637 5.695000 +149638 5.690000 +149639 5.095000 +149640 5.595000 +149641 5.595000 +149642 5.590000 +149643 5.595000 +149644 4.274000 +149645 3.758000 +149646 3.610000 +149647 3.458000 +149648 3.314000 +149649 3.782000 +149657 1.685000 +149659 1.913000 +149660 4.548000 +149662 2.914000 +149683 2.889000 +149684 2.287000 +149685 3.594000 +149686 5.915000 +149687 3.158000 +149688 2.616000 +149692 3.750000 +149694 3.962000 +149695 3.136000 +149696 3.266000 +149698 3.118000 +149720 2.029000 +149721 2.012000 +149723 2.010000 +149742 5.325000 +149745 5.575000 +149746 4.850000 +149748 5.400000 +149749 1.884000 +149750 3.472000 +149751 4.398000 +149752 1.730000 +149753 3.310000 +149771 4.730000 +149772 4.842000 +149775 2.166000 +149778 3.966000 +149802 3.826000 +149809 4.422000 +149812 4.820000 +149814 3.066000 +149817 4.334000 +149819 3.486000 +149823 5.795000 +149825 5.795000 +149826 5.970000 +149841 5.280000 +149844 4.314000 +149846 4.100000 +149851 4.606000 +149858 4.318000 +149859 4.616000 +149865 1.963000 +149873 5.340000 +149875 5.295000 +149876 1.301000 +149877 6.035000 +149879 6.045000 +149880 6.045000 +149881 6.030000 +149882 6.025000 +149883 6.020000 +149884 6.020000 +149885 6.020000 +149886 6.015000 +149887 6.010000 +149888 6.025000 +149889 6.015000 +149890 6.020000 +149891 6.010000 +149892 6.015000 +149893 6.035000 +149897 4.334000 +149898 5.415000 +149899 3.478000 +149900 5.375000 +149904 0.694000 +149905 3.162000 +149908 5.920000 +149909 5.915000 +149910 5.910000 +149911 5.920000 +149912 5.920000 +149913 5.915000 +149914 5.915000 +149915 5.915000 +149916 5.920000 +149917 5.920000 +149936 5.770000 +149939 3.220000 +149963 1.996000 +149964 6.045000 +149965 3.918000 +149966 2.078000 +149968 4.202000 +149969 2.549000 +149972 3.098000 +149974 5.620000 +149975 4.190000 +149977 4.230000 +149978 4.985000 +149980 2.057000 +149981 2.188000 +149992 5.605000 +149993 5.595000 +149994 5.585000 +149995 5.585000 +149996 5.595000 +149997 5.585000 +149998 5.590000 +149999 5.640000 +150000 5.640000 +150006 5.115000 +150007 5.125000 +150008 5.190000 +150009 5.195000 +150010 5.065000 +150011 5.060000 +150012 5.190000 +150013 0.698000 +150014 5.190000 +150016 3.192000 +150021 1.143000 +150033 4.670000 +150043 5.830000 +150051 4.248000 +150067 2.665000 +150082 5.065000 +150084 3.526000 +150085 5.695000 +150087 3.218000 +150110 5.270000 +150112 5.945000 +150117 3.018000 +150118 3.022000 +150119 3.052000 +150120 1.695000 +150121 3.444000 +150123 6.190000 +150130 5.395000 +150131 5.380000 +150134 5.120000 +150135 5.425000 +150136 5.335000 +150138 5.490000 +150146 5.270000 +150171 2.008000 +150172 3.160000 +150173 2.019000 +150175 2.013600 +150177 2.009000 +150178 2.005600 +150180 1.175000 +150182 2.007000 +150185 2.005000 +150187 2.008000 +150218 4.148000 +150221 5.240000 +150224 3.372000 +150227 0.878000 +150229 1.771000 +150230 0.612000 +150231 4.905000 +150238 3.158000 +150239 3.092600 +150240 3.029400 +150241 3.032400 +150242 3.032600 +150243 3.034000 +150244 3.343500 +150245 3.032000 +150246 3.033800 +150248 2.237000 +150249 2.238600 +150250 2.239600 +150265 3.090000 +150267 2.064200 +150271 3.149800 +150272 3.516000 +150273 3.024000 +150274 3.017400 +150275 2.233800 +150276 2.234000 +150277 2.235000 +150278 2.234400 +150279 2.237800 +150283 2.024000 +150286 2.020400 +150295 5.750000 +150298 5.735000 +150303 3.554000 +150304 3.340000 +150305 3.276000 +150322 6.205000 +150361 5.610000 +150362 5.525000 +150364 5.545000 +150365 5.420000 +150366 5.330000 +150367 5.090000 +150368 5.300000 +150369 5.230000 +150370 5.310000 +150371 5.300000 +150372 3.952000 +150373 5.060000 +150375 5.280000 +150402 5.240000 +150403 6.110000 +150404 4.166000 +150405 5.330000 +150407 4.925000 +150408 5.130000 +150410 4.142000 +150413 5.705000 +150421 4.708000 +150425 2.454000 +150429 2.611000 +150437 6.200000 +150438 6.235000 +150439 4.466000 +150440 6.215000 +150447 5.630000 +150461 1.214000 +150462 1.218000 +150463 1.078000 +150464 1.072000 +150465 1.215500 +150466 1.219000 +150467 1.209600 +150468 1.274200 +150469 1.210000 +150470 1.210400 +150471 1.210000 +150501 4.660000 +150502 2.793000 +150503 2.121000 +150504 2.378000 +150505 2.427000 +150506 2.528000 +150507 2.480000 +150508 2.514000 +150509 3.040000 +150510 1.769000 +150511 2.736000 +150513 2.370000 +150514 2.487000 +150515 2.448000 +150522 0.938000 +150524 3.568000 +150525 3.306000 +150527 2.871000 +150528 3.770000 +150529 3.180000 +150531 3.398000 +150532 2.850000 +150533 4.762000 +150534 2.459000 +150535 2.934000 +150536 3.588000 +150537 4.094000 +150555 1.164000 +150556 1.128000 +150557 3.740000 +150558 1.201000 +150578 5.415000 +150579 3.586000 +150580 3.108000 +150581 2.982000 +150582 2.649000 +150583 2.731000 +150584 5.555000 +150585 2.621000 +150586 2.660000 +150587 2.660000 +150588 2.648000 +150589 2.201000 +150590 2.772000 +150591 2.787000 +150592 2.521000 +150593 2.980000 +150594 2.906000 +150595 2.886000 +150596 2.898000 +150597 2.898000 +150598 2.936000 +150599 2.325000 +150601 5.020000 +150613 4.850000 +150617 3.206000 +150619 2.610000 +150621 4.438000 +150634 4.274000 +150635 3.930000 +150636 5.865000 +150638 5.870000 +150639 3.620000 +150641 4.078000 +150642 5.135000 +150643 4.666000 +150644 4.030000 +150646 3.638000 +150647 4.888000 +150648 3.842000 +150649 3.512000 +150650 5.870000 +150651 3.290000 +150654 5.540000 +150656 5.225000 +150659 6.200000 +150661 5.525000 +150689 1.212200 +150690 1.213000 +150691 1.213000 +150692 1.213200 +150693 1.215400 +150694 1.215000 +150695 1.209400 +150696 1.215800 +150698 1.216200 +150714 5.970000 +150715 2.553000 +150716 5.290000 +150722 3.220000 +150723 3.220000 +150725 4.432000 +150728 5.050000 +150730 4.320000 +150732 4.028000 +150733 3.926000 +150736 5.150000 +150737 4.118000 +150738 5.225000 +150740 2.058000 +150741 3.652000 +150742 4.046000 +150744 2.745000 +150745 3.170000 +150746 3.044000 +150776 3.158000 +150777 4.614000 +150781 3.120000 +150784 3.948000 +150788 6.230000 +150791 5.275000 +150818 5.010000 +150819 5.855000 +150820 5.875000 +150824 5.885000 +150827 5.890000 +150829 5.090000 +150830 5.550000 +150834 5.520000 +150835 4.568000 +150838 3.518000 +150841 3.550000 +150845 3.094000 +150848 3.194000 +150860 6.000000 +150861 5.965000 +150868 4.186000 +150871 4.342000 +150873 6.366000 +150874 4.368000 +150875 4.480000 +150880 2.006000 +150884 2.005000 +150889 2.003400 +150892 2.008000 +152131 1.550500 +152136 1.486500 +152172 4.754500 +152174 4.982500 +152199 1.405000 +152200 5.539500 +152205 5.469000 +152206 5.350000 +152213 0.782500 +152214 1.347500 +152215 1.318500 +152216 1.346000 +152217 2.935000 +152227 3.824000 +152231 6.578500 +152247 0.805500 +152267 7.119000 +152268 7.092500 +152283 5.060500 +152304 2.990000 +152313 3.803500 +152317 4.493500 +152324 2.704500 +152338 6.245500 +152357 3.694500 +152360 4.607000 +152361 4.770500 +152362 2.695500 +152363 4.550500 +152367 6.600500 +152368 7.166500 +152369 6.620000 +152370 6.644000 +152371 6.314500 +152439 5.498000 +152481 7.089000 +152482 7.082000 +152514 3.046500 +152515 6.257000 +152546 5.179500 +152547 6.606000 +152553 0.864000 +152558 0.886500 +152559 2.041000 +152560 2.042000 +152561 5.571500 +152562 5.725000 +152571 6.327500 +152572 5.118000 +152573 4.942500 +152574 6.380000 +152575 6.358000 +152576 6.376000 +152579 7.069500 +152580 7.086000 +152581 7.077000 +152582 7.515000 +152585 7.423000 +152586 7.426500 +152587 7.423500 +152588 7.418000 +152589 7.421000 +152590 7.447500 +152591 7.418500 +152593 2.544500 +152594 6.563500 +152595 6.608500 +152596 1.946500 +152600 5.926500 +152602 5.166500 +152614 7.398000 +152615 3.556500 +152623 1.652000 +152626 4.392500 +152627 4.111000 +152628 4.131500 +152629 4.090500 +152641 5.210500 +152701 0.716500 +152702 4.264500 +152717 6.390500 +152724 5.609000 +152732 4.510500 +152739 5.897500 +152740 6.024000 +152777 5.902000 +152778 5.806500 +152779 6.472000 +152780 6.449500 +152782 6.471500 +152783 6.579000 +152784 7.162500 +152785 6.621500 +152786 7.109500 +152787 7.094500 +152788 5.350500 +152792 6.944500 +152793 7.095500 +152794 7.094500 +152795 5.864000 +152797 5.206000 +152798 6.374500 +152799 5.362000 +152800 4.403500 +152801 3.377500 +152802 3.909000 +152803 5.728000 +152804 5.418000 +152805 5.408500 +152806 3.486500 +152807 3.712000 +152808 4.140000 +152812 5.658500 +152813 7.369500 +152819 4.514500 +152820 5.044500 +152829 3.464500 +152831 4.974500 +152832 5.384000 +152845 4.594000 +152846 4.138000 +152850 7.354000 +152852 3.500500 +152853 4.947000 +152854 4.582000 +152856 6.404500 +152858 6.663000 +152859 5.697500 +152860 2.590000 +152861 4.265000 +152881 4.801500 +152882 0.883000 +152883 4.428000 +152884 4.141000 +152885 4.241500 +152892 7.545500 +152893 7.544500 +152894 7.546000 +152895 7.217500 +152896 7.112500 +152897 7.542500 +152899 7.753000 +152900 5.540000 +152908 2.007500 +152909 2.017500 +152910 2.014500 +152913 1.210500 +152914 1.209500 +152925 7.040000 +152931 2.233000 +152938 7.035500 +152959 5.845000 +152960 5.816500 +152961 5.859500 +152962 5.849500 +152963 5.842000 +152964 5.840500 +152966 5.858500 +152967 5.842000 +152968 5.847000 +152969 2.185500 +152970 5.843500 +152971 5.848000 +152972 5.867500 +152973 5.867000 +152980 3.111500 +152981 3.788500 +152986 6.569000 +153016 6.535000 +153017 5.812000 +153018 5.851000 +153019 5.849500 +153020 5.841500 +153021 5.839000 +153052 5.424000 +153053 6.605500 +153069 3.834000 +153090 0.518500 +153091 5.540000 +153092 5.536000 +153097 5.867500 +153107 4.620500 +153113 5.672500 +153122 2.301500 +153123 2.169500 +153124 2.180500 +153125 2.323500 +153126 2.535000 +153127 3.412000 +153128 2.862500 +153129 1.595000 +153130 2.537000 +153131 1.692500 +153132 4.913500 +153133 4.499500 +153134 2.577500 +153135 3.953000 +153136 2.753500 +153137 3.151000 +153138 2.219500 +153139 3.687000 +153140 6.416000 +153141 5.427000 +153142 4.392000 +153143 5.944500 +153144 2.828500 +153145 3.674000 +153146 3.896500 +153147 7.037000 +153148 1.793500 +153149 7.042000 +153150 7.039000 +153155 5.221500 +153157 1.495000 +153262 5.297500 +153263 3.981000 +153264 4.095500 +153265 3.705500 +153266 4.736000 +153267 5.278500 +153268 3.500500 +153270 3.559500 +153271 3.277500 +153272 3.365000 +153273 3.397000 +153274 3.439000 +153275 3.313000 +153276 3.525500 +153278 5.309000 +153279 3.612000 +153282 3.384500 +153285 5.389500 +153288 1.558500 +153294 3.232000 +153300 3.949000 +153302 5.495500 +153303 5.498500 +153305 5.339500 +153307 5.070000 +153313 2.350000 +153315 2.201000 +153316 2.390500 +153317 4.721000 +153319 2.387000 +153320 5.032500 +153321 4.632000 +153323 4.657000 +153324 5.038500 +153325 4.333000 +153327 2.929000 +153329 5.060000 +153330 5.015000 +153331 1.646000 +153332 3.189000 +153334 4.445500 +153335 2.342500 +153336 2.337000 +153337 2.750500 +153338 4.319000 +153339 1.473500 +153340 4.801000 +153343 3.820000 +153344 5.098500 +153345 4.095500 +153351 5.076500 +153352 3.238500 +153353 3.689000 +153354 4.457500 +153355 4.581000 +153356 4.221000 +153358 5.520000 +153360 1.233000 +153361 1.074000 +153362 4.440500 +153363 3.539000 +153364 3.362000 +153365 4.361500 +153366 4.579000 +153367 4.516000 +153369 2.711500 +153371 5.086500 +153372 4.678000 +153373 4.542000 +153374 5.069500 +153376 3.193000 +153381 5.355500 +153383 3.763500 +153384 3.740000 +153385 3.583500 +153386 3.140500 +153387 3.634500 +153388 3.115000 +153389 3.055500 +153390 3.287000 +153391 3.524000 +153392 1.679000 +153393 3.416000 +153394 4.077500 +153395 2.879500 +153397 4.111500 +153400 4.204500 +153401 3.808500 +153413 5.045000 +153414 1.442500 +153415 1.562000 +153416 1.733500 +153417 1.479000 +153420 1.636500 +153423 1.633500 +153438 5.302500 +153440 4.958500 +153449 5.731500 +153450 1.180500 +153451 0.859500 +153452 1.973500 +153453 2.387500 +153454 3.333000 +153455 2.372000 +153456 3.762000 +153459 2.986500 +153460 2.897000 +153461 2.891500 +153468 4.148000 +153469 4.040500 +153479 5.822500 +153480 7.121000 +153483 4.968500 +153484 6.673500 +153490 5.345500 +153522 3.715500 +153523 4.636000 +153524 3.448500 +153525 3.482500 +153526 2.286000 +153527 2.534500 +153528 2.484000 +153529 1.720000 +153530 1.585000 +153531 3.280500 +153532 2.386000 +153536 2.968500 +153538 6.558000 +153539 7.002000 +153540 7.868500 +153545 7.100000 +153546 5.190500 +153548 1.352000 +153549 1.200000 +153552 0.804000 +153554 4.999500 +153556 1.201000 +153557 1.203000 +153558 1.202500 +153559 1.200500 +153560 1.200500 +153563 1.201500 +153575 6.013000 +153583 4.354500 +153584 6.985000 +153585 6.598000 +153586 6.291000 +153587 3.777500 +153593 2.911000 +153594 2.911000 +153602 6.096000 +153603 2.839000 +153604 3.024500 +153605 3.545500 +153610 5.667000 +153613 0.819500 +153621 5.812000 +153632 2.849000 +153633 5.629500 +153634 4.373500 +153637 5.937500 +153652 7.046500 +153660 3.459500 +153674 5.726500 +153675 5.425500 +153676 6.071500 +153687 6.823500 +153688 6.480500 +153689 6.429000 +153690 4.582500 +153693 5.866500 +153698 3.973000 +153699 4.131500 +153713 7.028000 +153714 7.062000 +153715 4.628500 +153723 4.107500 +153724 2.486000 +153725 3.173000 +153728 4.669000 +153729 5.070500 +153730 3.264000 +153731 5.122000 +153732 3.722500 +153733 2.205500 +153736 2.922500 +153738 5.268500 +153739 5.504000 +153741 5.134000 +153742 2.705000 +153743 5.491500 +153744 3.058000 +153753 4.827000 +153755 4.008000 +153756 4.207500 +153770 5.552000 +153775 0.592000 +153776 0.653500 +153777 2.353500 +153778 3.514500 +153779 2.830000 +153780 3.489500 +153781 1.742000 +153782 2.129500 +153783 4.668500 +153784 3.437000 +153785 3.161500 +153786 2.407000 +153787 3.789000 +153788 2.146500 +153789 2.554000 +153790 2.213500 +153792 2.109500 +153793 3.975000 +153794 3.069000 +153795 1.222500 +153796 2.431500 +153797 2.456500 +153798 2.112000 +153799 3.424000 +153814 4.768500 +153815 4.753000 +153817 4.747000 +153868 3.060000 +153870 3.665500 +153873 3.641500 +153874 3.876500 +153875 4.938000 +153876 3.079500 +153877 4.729000 +153878 5.497000 +153889 1.579500 +153890 2.948500 +153892 5.739000 +153894 2.895000 +153895 3.340500 +153896 3.362500 +153897 4.146500 +153898 4.314500 +153899 5.870500 +153907 4.053000 +153908 4.342500 +153910 4.287000 +153912 4.288500 +153913 4.366500 +153914 4.021000 +153930 7.057000 +153953 4.305500 +153954 3.823500 +153956 4.116500 +153959 5.059000 +153960 5.052000 +153961 4.056500 +153967 3.872000 +153968 2.716500 +153969 2.819000 +153970 2.575000 +153971 3.787000 +153972 2.916000 +153973 5.461500 +153974 3.499500 +153975 3.275500 +153976 2.151000 +153983 1.320000 +153984 1.200000 +153985 1.199500 +153986 1.202500 +153987 1.200000 +154001 1.203500 +154002 1.203500 +154004 1.208000 +154005 1.203000 +154006 1.209500 +154007 1.284000 +154010 0.507000 +154011 5.968000 +154012 3.893500 +154013 2.012000 +154014 2.012000 +154015 2.011500 +154016 2.012500 +154017 2.012000 +154018 2.010000 +154019 2.011000 +154020 2.013500 +154021 2.013000 +154022 2.012000 +154023 2.012500 +154024 2.013000 +154025 2.012000 +154026 2.013000 +154027 2.012500 +154028 2.012000 +154029 2.012500 +154030 2.013000 +154031 2.012500 +154036 7.794000 +154043 6.090500 +154056 4.185500 +154071 5.904500 +154072 2.967000 +154073 2.567000 +154074 2.759500 +154075 5.845000 +154076 5.359500 +154077 2.688500 +154078 2.344000 +154080 4.784000 +154084 2.861500 +154085 2.781500 +154086 2.089000 +154087 2.077000 +154088 2.486000 +154089 2.147500 +154090 2.417500 +154091 2.260500 +154093 2.181000 +154094 2.752000 +154095 2.574500 +154096 3.965500 +154097 2.529500 +154098 2.519000 +154106 2.844000 +154107 2.850500 +154108 2.432000 +154109 2.446500 +154110 4.653000 +154111 3.567500 +154112 6.247500 +154113 3.360000 +154114 2.241500 +154115 2.108000 +154120 5.083000 +154121 5.091500 +154129 2.647000 +154130 2.769500 +154134 6.101500 +154135 3.074500 +154136 3.058000 +154137 3.056500 +154138 2.097000 +154139 1.820000 +154140 1.796000 +154141 1.808500 +154142 3.022000 +154143 2.033500 +154144 2.035000 +154145 2.030500 +154146 2.032500 +154147 2.029000 +154148 2.026000 +154149 2.019500 +154150 2.032500 +154151 2.028000 +154152 2.023000 +154153 2.018000 +154154 2.017000 +154155 2.031000 +154156 2.028500 +154157 2.028000 +154158 2.021500 +154159 2.026500 +154160 2.018000 +154164 5.616000 +154166 2.011000 +154167 2.012000 +154168 2.009000 +154169 2.008500 +154170 2.007000 +154171 2.009500 +154172 2.009000 +154173 2.007500 +154174 2.008000 +154175 2.007500 +154176 2.008000 +154177 2.008500 +154178 2.010000 +154179 2.009000 +154180 2.009000 +154181 2.007500 +154182 2.008500 +154183 2.006500 +154184 2.008500 +154185 2.007500 +154186 2.007500 +154187 2.007000 +154188 2.007000 +154189 2.007000 +154190 2.011500 +154191 2.011500 +154192 2.010000 +154246 5.211500 +154255 5.179000 +154261 5.985500 +154262 5.045500 +154263 5.119000 +154264 5.761000 +154265 5.804500 +154266 1.226500 +154281 1.110000 +154282 6.361500 +154283 6.153000 +154299 5.183500 +154300 4.107500 +154301 4.827000 +154302 4.912000 +154303 4.781500 +154304 2.056500 +154305 2.920500 +154306 5.648500 +154307 5.353500 +154308 4.864000 +154309 4.926000 +154311 1.072500 +154312 4.999000 +154313 4.966500 +154316 1.912500 +154361 7.343500 +154367 5.759000 +154379 5.564000 +154382 6.039000 +154386 7.059000 +154395 7.142000 +154409 6.964000 +154413 5.091000 +154420 4.861000 +154426 7.317500 +154444 6.615500 +154454 1.319500 +154455 6.898500 +154456 6.636000 +154457 6.615000 +154458 6.880500 +154459 6.325000 +154462 6.847500 +154463 1.651500 +154465 2.842500 +154467 3.017000 +154468 1.686000 +154469 1.906000 +154470 1.792000 +154471 2.011500 +154472 1.736000 +154473 1.939500 +154474 1.916500 +154475 1.935000 +154476 1.930000 +154478 2.537000 +154479 1.467500 +154480 1.984500 +154482 2.989500 +154483 1.231000 +154484 1.474000 +154485 2.821000 +154487 1.929500 +154488 1.350500 +154489 1.621000 +154490 1.909000 +154491 1.587000 +154492 1.920000 +154493 1.274000 +154494 1.766000 +154495 1.663000 +154496 1.898500 +154498 2.850500 +154499 1.268000 +154502 7.317000 +154512 6.459500 +154513 6.180500 +154514 6.192000 +154515 6.440500 +154517 1.790000 +154519 4.440500 +154520 6.219500 +154521 6.513500 +154522 6.236500 +154524 6.116000 +154526 5.888000 +154528 5.605500 +154529 2.325000 +154530 3.455000 +154534 3.136500 +154539 0.754000 +154545 7.312000 +154546 3.365000 +154549 5.373000 +154551 4.133000 +154552 5.328000 +154553 0.909000 +154555 5.364500 +154558 5.026000 +154559 4.013000 +154560 2.261500 +154561 4.238000 +154563 5.358000 +154571 5.386000 +154575 3.447000 +154576 3.327500 +154577 2.139000 +154580 5.036500 +154590 4.493500 +154594 0.861500 +154605 2.003000 +154607 2.002000 +154608 2.003000 +154609 2.005500 +154610 2.005000 +154611 2.005000 +154612 2.006000 +154614 2.006000 +154615 1.996500 +154616 2.012500 +154617 2.008000 +154618 2.012500 +154619 2.009000 +154620 2.012500 +154621 2.011500 +154622 2.014000 +154623 2.008500 +154624 2.007500 +154625 2.008000 +154651 7.037500 +154653 7.044500 +154654 5.107000 +154664 7.043000 +154669 7.047500 +154673 7.037500 +154676 7.040000 +154716 4.736000 +154717 7.095000 +154718 7.055500 +154719 7.045500 +154720 7.055000 +154721 7.073500 +154722 7.046000 +154756 5.862000 +154757 5.833500 +154758 5.844500 +154762 4.209500 +154766 5.861500 +154768 5.803500 +154769 5.780500 +154770 5.834500 +154771 5.721000 +154772 5.723000 +154773 5.856000 +154775 0.617000 +154778 5.517000 +154783 5.698000 +154784 4.684500 +154792 4.376500 +154793 3.827000 +154794 3.335500 +154795 3.238500 +154796 5.575500 +154798 4.404500 +154799 3.756000 +154800 5.138500 +154801 4.755500 +154802 2.698000 +154803 2.735500 +154804 2.889000 +154805 2.449500 +154806 2.320000 +154807 1.967000 +154808 3.404000 +154809 3.835000 +154810 4.565000 +154811 3.997000 +154812 3.835500 +154813 3.696500 +154814 4.206000 +154815 4.190000 +154816 4.197500 +154817 4.053000 +154818 4.171500 +154819 4.306500 +154820 3.674000 +154821 4.178000 +154822 3.891000 +154823 4.243000 +154824 3.656000 +154825 2.781000 +154826 4.331000 +154832 6.200000 +154838 4.940000 +154839 5.995000 +154840 5.328000 +154841 3.745000 +154843 4.365000 +154844 4.599000 +154845 5.955500 +154846 5.811000 +154847 4.446500 +154848 3.868500 +154850 5.556000 +154851 2.854500 +154852 4.636000 +154853 4.755000 +154854 4.303500 +154855 3.194000 +154856 4.750000 +154857 5.696000 +154876 3.032500 +154877 2.579500 +154878 2.793500 +154880 3.206000 +154881 2.707000 +154882 3.037000 +154883 3.303500 +154884 4.239500 +154885 3.177500 +154886 3.195000 +154887 3.259500 +154888 2.994000 +154889 3.315500 +154890 0.579000 +154891 3.528000 +154892 3.375000 +154895 3.213000 +154896 4.334000 +154897 3.703500 +154898 3.397500 +154899 5.721500 +154900 5.632000 +154901 4.636000 +154902 5.737000 +154903 4.051000 +154904 3.860000 +154905 2.623500 +154906 3.381000 +154907 2.760000 +154908 3.284000 +154909 4.961500 +154910 4.048000 +154911 4.151000 +154912 4.184000 +154913 4.173000 +154914 3.575500 +154920 6.456000 +154921 5.884000 +154923 3.139500 +154924 2.524000 +154925 2.963500 +154936 5.846500 +154938 6.073500 +154941 2.729000 +154942 2.484000 +154943 3.467000 +154944 2.496500 +154945 2.404500 +154946 2.470000 +154947 3.770500 +154948 3.058000 +154949 3.560500 +154950 3.641000 +154951 3.840500 +154952 3.176000 +154953 2.856000 +154954 3.089500 +154955 2.923500 +154956 2.959500 +154957 4.781000 +154958 2.797000 +154959 3.113500 +154962 7.351000 +154963 2.850000 +154964 4.459500 +154965 4.286000 +154966 5.558000 +154967 4.748500 +154968 3.996500 +154969 1.445000 +154970 1.678000 +154972 3.166000 +154973 2.845500 +154974 1.782000 +154975 3.200500 +154977 3.140000 +154978 2.763000 +154979 5.781000 +154981 5.678000 +154983 4.538000 +154985 5.362500 +154986 4.441000 +154987 4.374000 +154988 5.230500 +154989 6.008000 +154990 4.089500 +154991 6.075000 +154992 6.074500 +154994 6.086000 +154995 6.084500 +154996 3.726500 +154997 4.225500 +155001 2.161000 +155002 7.052000 +155006 4.304000 +155007 2.529000 +155010 1.408000 +155012 4.077500 +155014 2.992500 +155015 2.821500 +155016 4.284500 +155017 4.194500 +155018 4.254500 +155019 4.440500 +155020 4.210000 +155021 3.768500 +155036 1.201000 +155037 1.201500 +155040 1.296000 +155041 1.222500 +155042 1.198500 +155043 1.230000 +155044 1.211000 +155045 1.212500 +155046 1.168500 +155047 1.206000 +155048 1.211500 +155104 1.168500 +155111 4.819500 +155112 6.531500 +155124 5.205000 +155146 5.814500 +155155 5.665000 +155169 1.969500 +155181 7.321000 +155184 3.112500 +155185 2.612500 +155186 2.904000 +155187 2.747500 +155188 2.712000 +155189 3.400000 +155190 3.498500 +155191 2.920000 +155192 2.717000 +155193 4.136500 +155196 4.334500 +155197 3.776000 +155198 3.920500 +155200 5.317000 +155201 5.305000 +155202 3.392000 +155203 3.433000 +155204 4.421000 +155205 3.413500 +155206 5.590000 +155207 4.811000 +155208 5.376000 +155210 5.668500 +155211 5.559000 +155214 5.684000 +155215 5.099500 +155216 5.689500 +155224 6.879000 +155226 4.133000 +155246 6.701500 +155255 6.731500 +155257 6.750000 +155265 5.084000 +155266 5.063000 +155267 3.419500 +155268 4.065000 +155269 5.445500 +155271 6.259000 +155274 5.122500 +155275 5.329000 +155276 4.002000 +155277 4.005500 +155278 4.160000 +155280 5.996500 +155286 5.631500 +155287 3.378000 +155289 5.513500 +155294 5.374000 +155300 4.939000 +155301 5.413000 +155302 5.269500 +155325 5.581000 +155327 6.652500 +155329 6.718000 +155331 6.558500 +155332 6.647500 +155333 6.608500 +155334 6.539500 +155336 6.740000 +155338 6.354500 +155339 6.458500 +155340 6.165000 +155341 6.277500 +155349 6.470500 +155350 6.595000 +155351 6.616500 +155353 6.565500 +155354 6.632500 +155364 3.388500 +155376 6.499500 +155380 5.735000 +155387 5.703500 +155388 5.678000 +155389 6.472500 +155410 6.129000 +155415 6.228000 +155416 6.231000 +155424 4.278500 +155438 1.770000 +155441 3.326500 +155450 3.260000 +155454 4.183000 +155455 4.173000 +155456 4.155000 +155457 4.131000 +155458 4.132000 +155459 4.137500 +155460 4.143500 +155461 5.130500 +155462 5.086500 +155464 5.144500 +155465 5.136500 +155468 5.725500 +155469 5.708000 +155470 4.766500 +155471 5.684500 +155472 5.597500 +155482 5.427000 +155498 7.344500 +155525 6.394500 +155533 7.346000 +155544 4.527500 +155547 4.669000 +155549 5.245000 +155550 4.789000 +155554 3.884000 +155555 3.691500 +155556 4.292000 +155557 5.467500 +155563 7.352000 +155587 4.125500 +155588 5.538500 +155591 5.834500 +155594 5.571500 +155598 7.150000 +155603 4.197000 +155604 7.631500 +155610 7.347500 +155634 4.780000 +155635 5.379500 +155636 4.621000 +155637 4.618500 +155638 5.031500 +155639 4.759000 +155640 5.021500 +155642 5.089500 +155643 4.320500 +155647 4.378500 +155659 2.008500 +155661 2.010000 +155662 2.010500 +155663 2.010500 +155664 2.008000 +155665 2.011000 +155666 2.011000 +155667 2.011000 +155668 2.011000 +155669 2.009500 +155670 2.011500 +155671 2.009500 +155672 2.010000 +155673 2.008500 +155675 2.009500 +155676 2.010500 +155677 2.009000 +155678 2.010000 +155679 2.009000 +155680 2.010500 +155682 2.008500 +155683 2.009000 +155684 2.007500 +155685 2.008500 +155686 2.010500 +155687 2.009500 +155688 2.007500 +155689 2.007500 +155690 2.009000 +155691 2.010500 +155692 2.008000 +155693 2.008500 +155694 2.009000 +155695 2.010000 +155696 2.010500 +156199 4.208000 +156200 4.741500 +156205 3.996500 +156244 6.603000 +156255 1.517000 +156272 1.428000 +156273 1.487000 +156291 3.088000 +156293 3.979000 +156295 5.679500 +156296 6.285500 +156305 7.340500 +156306 1.148500 +156316 4.374000 +156336 4.435500 +156338 4.236500 +156350 7.347000 +156381 7.349000 +156382 7.343000 +156383 7.346000 +156385 7.314000 +156390 5.345000 +156391 3.460500 +156392 3.004500 +156404 2.538000 +156405 4.400500 +156406 4.426000 +156411 7.346000 +156412 7.347000 +156424 5.073500 +156427 4.549500 +156428 4.111000 +156430 4.539500 +156431 4.520500 +156432 4.557500 +156433 4.544500 +156461 2.433000 +156462 7.337500 +156463 3.335500 +156474 1.389000 +156475 3.912000 +156476 3.051000 +156477 6.522500 +156479 3.284000 +156480 3.376500 +156482 3.602500 +156483 6.864000 +156486 6.751000 +156487 6.751500 +156488 6.741000 +156489 6.384000 +156490 6.736000 +156491 4.511000 +156492 5.137500 +156493 6.535000 +156494 6.873500 +156495 6.867500 +156501 7.347500 +156506 4.384500 +156511 3.298000 +156512 3.033500 +156514 5.458000 +156515 5.087500 +156517 5.170500 +156518 5.173500 +156519 2.081500 +156520 3.849500 +156521 5.058000 +156522 4.150500 +156523 5.507500 +156524 6.578000 +156525 6.570500 +156526 6.556000 +156527 5.199500 +156528 2.429000 +156529 3.396000 +156533 5.177500 +156541 7.355000 +156542 4.840500 +156543 4.909500 +156545 3.360000 +156546 4.062500 +156552 0.661500 +156553 0.841000 +156560 2.045500 +156563 6.421500 +156565 6.440000 +156566 6.430500 +156567 6.441500 +156605 7.354500 +156618 2.686000 +156623 2.466500 +156624 1.656500 +156633 1.514000 +156634 5.345000 +156635 1.053500 +156637 5.329000 +156639 1.045000 +156641 5.404500 +156652 5.082000 +156658 2.896000 +156667 4.055500 +156670 3.082500 +156671 4.330500 +156672 5.225500 +156673 1.799000 +156674 2.103000 +156675 3.347500 +156676 4.865000 +156677 4.897500 +156681 2.993000 +156682 3.382000 +156683 3.389500 +156684 3.619500 +156685 1.695500 +156686 4.207000 +156688 4.502500 +156693 5.421000 +156694 5.208500 +156695 6.197000 +156696 4.718000 +156698 5.595000 +156715 6.769500 +156721 7.319000 +156723 8.074500 +156724 8.064000 +156726 8.066000 +156727 8.173000 +156728 7.480500 +156729 8.050500 +156733 7.575000 +156734 5.822000 +156736 7.598500 +156738 6.861500 +156739 5.673000 +156741 3.378000 +156742 7.611000 +156745 6.623500 +156746 7.102500 +156747 5.351000 +156748 6.988000 +156752 4.246000 +156754 5.514000 +156755 5.499500 +156756 6.375000 +156757 6.503500 +156758 6.585500 +156759 6.419000 +156760 6.742500 +156761 6.453000 +156764 6.585000 +156765 6.651000 +156766 7.248000 +156767 0.922000 +156768 7.239000 +156769 7.135000 +156770 7.072500 +156778 7.283500 +156784 4.625500 +156787 1.648000 +156788 1.924500 +156790 5.034500 +156791 3.793000 +156792 3.253500 +156794 3.954500 +156795 4.693000 +156796 3.383000 +156798 5.177000 +156804 2.535500 +156806 2.951000 +156816 3.562000 +156818 2.984500 +156819 6.266000 +156821 2.533500 +156823 6.265000 +156824 2.280000 +156825 3.262500 +156826 6.090500 +156827 5.070000 +156828 2.932000 +156829 3.272500 +156880 7.341000 +156881 7.060000 +156887 6.843000 +156890 6.400000 +156895 3.336000 +156899 6.789500 +156900 3.718500 +156901 6.034000 +156902 3.267000 +156903 5.378500 +156904 4.111000 +156905 7.402000 +156906 6.309000 +156907 7.489000 +156908 7.317500 +156909 7.024500 +156910 5.676500 +156922 2.023600 +156923 2.018600 +156924 2.222200 +156926 3.496800 +156927 2.788000 +156928 2.768600 +156929 2.772600 +156930 2.756000 +156931 2.768200 +156932 2.748600 +156933 2.756800 +156934 2.840600 +156935 3.055600 +156936 2.676800 +156937 2.935000 +156938 2.958200 +156939 3.140400 +156940 2.688400 +156941 2.951200 +156942 2.882600 +156943 3.899400 +156944 2.369400 +156945 2.369600 +156946 2.396200 +156947 2.399000 +156948 2.481600 +156949 2.374200 +156950 2.423400 +156951 2.466800 +157031 1.042500 +157032 1.001000 +157033 0.998500 +157034 0.989000 +157035 0.981500 +157036 0.753000 +157040 4.848000 +157045 4.618500 +157085 5.211500 +157086 5.138500 +157092 5.211500 +157107 4.508000 +157139 3.391000 +157141 5.218000 +157142 5.516000 +157165 1.566500 +157166 1.583500 +157167 1.612500 +157168 5.740500 +157170 3.230000 +157171 3.042500 +157172 1.125000 +157173 1.129500 +157174 2.615500 +157175 3.633500 +157176 2.849000 +157177 3.062500 +157178 3.214500 +157179 2.680500 +157180 3.317000 +157187 2.136500 +157190 4.720500 +157191 4.451500 +157200 8.159000 +157201 8.730500 +157204 7.727500 +157205 6.960000 +157206 9.015500 +157207 7.867000 +157208 8.078000 +157209 7.899500 +157210 7.966500 +157211 7.733000 +157212 7.536500 +157213 7.648500 +157214 8.038000 +157215 9.007500 +157217 6.639000 +157228 7.310000 +157240 4.316500 +157242 5.478000 +157244 3.942500 +157245 1.795500 +157246 5.003500 +157247 3.730500 +157249 3.455500 +157257 7.341000 +157282 7.324500 +157283 0.687000 +157297 5.938000 +157299 4.719500 +157300 4.273500 +157301 4.510500 +157302 4.458500 +157305 5.375000 +157306 6.379000 +157307 6.012500 +157309 4.045000 +157310 5.583000 +157311 5.440500 +157312 5.735500 +157315 5.536500 +157316 6.004000 +157317 5.817000 +157319 6.669000 +157320 6.357500 +157322 5.617500 +157368 5.070000 +157371 6.053500 +157375 6.016000 +157380 3.132000 +157383 2.710000 +157384 3.183500 +157385 3.136500 +157386 3.334500 +157388 1.781500 +157389 3.170000 +157390 2.355000 +157392 2.832500 +157393 2.924000 +157394 2.205000 +157395 3.473000 +157398 5.826500 +157403 5.330000 +157405 4.617500 +157406 1.704500 +157419 5.875500 +157421 5.679500 +157422 5.419000 +157423 6.044000 +157425 4.726500 +157426 4.925500 +157427 4.937000 +157430 5.324500 +157434 6.543500 +157441 0.503500 +157442 0.628500 +157443 0.624000 +157444 3.600000 +157445 3.064500 +157446 3.010000 +157447 2.817000 +157448 4.095000 +157449 3.906000 +157450 2.480000 +157451 2.944000 +157452 2.374000 +157453 3.098000 +157454 3.264500 +157455 3.256000 +157456 2.901000 +157457 3.646000 +157459 3.071000 +157460 3.836500 +157461 7.057500 +157462 4.664500 +157463 2.606500 +157465 2.590500 +157466 2.499000 +157467 2.776500 +157468 2.772500 +157469 2.487000 +157470 3.137500 +157472 2.692500 +157473 4.051500 +157480 7.318000 +157481 3.867500 +157491 3.426500 +157492 5.290500 +157493 4.373000 +157497 5.499000 +157517 7.311500 +157522 5.470500 +157526 2.063500 +157531 2.526500 +157532 5.508000 +157533 5.845500 +157538 6.062500 +157539 5.426000 +157540 6.329000 +157541 5.742500 +157543 5.704500 +157544 2.627000 +157546 5.319000 +157561 4.913500 +157563 1.078500 +157569 1.200000 +157570 1.202500 +157581 0.740500 +157582 0.699500 +157583 1.282000 +157653 5.113000 +157659 5.161000 +157660 7.350000 +157662 4.769500 +157663 7.184500 +157670 4.656000 +157688 2.962000 +157689 4.342500 +157690 2.899500 +157691 2.963000 +157692 4.576500 +157693 3.481500 +157695 3.390500 +157696 4.721500 +157697 4.718500 +157698 4.700000 +157701 2.168000 +157702 4.474000 +157703 3.043500 +157711 4.551500 +157712 4.583500 +157721 7.311500 +157722 0.779500 +157775 7.341500 +157776 1.672500 +157778 1.342500 +157779 1.931000 +157780 6.586500 +157781 6.578000 +157786 3.900000 +157788 6.030000 +157789 6.746500 +157790 4.587500 +157791 6.685500 +157792 6.760500 +157794 7.085500 +157795 6.763500 +157796 6.782000 +157797 7.102500 +157798 7.104500 +157799 5.941000 +157800 7.079000 +157803 5.314000 +157810 6.036500 +157812 1.303000 +157813 7.056500 +157815 3.662000 +157816 4.782500 +157818 6.613500 +157820 4.703000 +157821 5.028000 +157822 2.807000 +157823 5.836500 +157824 4.367500 +157825 3.807000 +157826 2.365000 +157827 7.048000 +157828 3.314500 +157829 2.987000 +157830 3.083000 +157831 2.591500 +157832 2.874000 +157833 2.376000 +157834 2.919500 +157835 5.736000 +157836 7.062500 +157837 4.708000 +157838 5.490500 +157839 5.575500 +157840 3.800000 +157841 7.054500 +157842 4.218000 +157843 2.770000 +157844 3.123500 +157845 2.730500 +157846 0.616500 +157847 0.585000 +157848 0.587000 +157849 0.592000 +157852 0.583000 +157856 7.369000 +157857 5.106000 +157859 6.054000 +157860 5.508000 +157861 3.534500 +157862 7.053000 +157863 4.131500 +157865 4.343000 +157866 2.636500 +157867 4.471000 +157869 5.535000 +157870 3.546500 +157871 3.840500 +157873 3.640500 +157874 3.587500 +157875 6.759500 +157876 6.834500 +157877 6.761500 +157878 5.906500 +157879 7.094000 +157881 6.331500 +157882 5.390000 +157883 5.499500 +157884 5.411000 +157885 6.749500 +157886 5.234000 +157887 7.183500 +157888 6.537000 +157889 6.763000 +157890 7.338500 +157897 6.128500 +157929 0.729000 +157946 5.387500 +157969 7.025500 +157973 7.031500 +157977 7.033000 +157979 7.034500 +157980 7.032500 +157981 7.034000 +157982 7.032500 +157984 7.028500 +157986 7.027500 +157995 7.054000 +157998 7.056500 +157999 7.053000 +158000 7.070000 +158001 7.073500 +158003 7.054000 +158004 7.067000 +158005 5.513500 +158007 4.085000 +158009 5.813500 +158010 5.879000 +158014 3.506500 +158015 4.184000 +158018 5.646500 +158020 5.574000 +158022 3.909000 +158023 5.187500 +158029 6.959500 +158034 4.369500 +158071 6.670500 +158073 6.496500 +158074 6.633000 +158075 6.621500 +158077 6.574000 +158078 4.977500 +158079 5.678000 +158080 6.597000 +158081 6.374000 +158082 6.580500 +158083 6.571000 +158084 6.364000 +158089 6.266500 +158090 6.297500 +158091 6.271000 +158096 6.567500 +158097 5.571000 +158098 5.802000 +158099 6.439000 +158100 6.488000 +158101 6.252500 +158102 5.633500 +158103 6.309500 +158105 6.546000 +158107 6.331500 +158112 6.442000 +158113 5.380500 +158114 6.457500 +158116 6.464000 +158117 4.959000 +158118 4.965500 +158119 4.283000 +158120 6.429000 +158122 6.644000 +158123 6.403500 +158124 5.760500 +158125 6.452500 +158130 7.302000 +158136 4.644000 +158137 4.954000 +158139 4.513500 +158159 4.891000 +158174 7.335000 +158175 2.018500 +158176 2.030500 +158177 2.032000 +158178 2.024500 +158179 2.030500 +158180 2.032000 +158181 2.027500 +158182 2.027500 +158183 2.032000 +158184 2.029000 +158185 2.022000 +158186 2.025500 +158187 2.028500 +158188 2.030000 +158189 2.030500 +158190 2.033000 +158191 2.034000 +158192 2.035500 +158193 2.028000 +158194 2.029500 +158195 2.028000 +158196 2.029000 +158197 2.031500 +158198 2.021000 +158199 2.031500 +158200 2.032000 +158201 2.032000 +158202 2.021000 +158203 2.028000 +158204 2.030000 +158205 2.030500 +158206 2.031000 +158207 2.026500 +158208 2.027000 +158291 6.024000 +158292 2.035500 +158296 4.296000 +158297 5.667000 +158299 3.444000 +158300 3.134500 +158301 3.664500 +158302 4.536500 +158303 5.910000 +158328 5.703000 +158334 5.895000 +158335 6.656500 +158336 6.663500 +158338 0.998500 +158339 0.993000 +158340 0.998000 +158341 0.982000 +158342 1.014500 +158344 4.259500 +158348 6.355500 +158350 6.071000 +158351 6.355500 +158352 6.650500 +158353 6.638500 +158354 6.646500 +158357 6.655000 +158358 6.670500 +158365 4.258000 +158367 4.464500 +158368 3.262500 +158369 4.375500 +158373 3.021000 +158378 2.444500 +158379 5.014000 +158382 2.997000 +158383 4.141500 +158384 2.793500 +158387 2.686500 +158389 4.410000 +158390 4.658500 +158398 5.186000 +158399 5.187000 +158401 4.093500 +158402 1.840500 +158407 5.224000 +158408 5.229000 +158409 5.281000 +158410 1.883000 +158418 5.189500 +158419 4.901500 +158420 5.273500 +158422 3.366000 +158424 2.804000 +158425 1.519500 +158427 4.349500 +158429 5.349000 +158430 4.992500 +158431 3.175000 +158432 4.161500 +158433 4.979000 +158434 5.015500 +158439 4.757000 +158443 5.546000 +158447 5.002500 +158448 4.999000 +158451 4.936000 +158452 4.937500 +158453 4.937000 +158456 5.162000 +158460 5.101500 +158461 5.064500 +158462 5.098500 +158463 5.093000 +158464 1.881500 +158465 4.510000 +158466 4.247000 +158472 5.016500 +158473 4.406000 +158474 4.951500 +158475 5.009000 +158476 5.002500 +158477 5.006000 +158478 4.981500 +158479 4.998500 +158480 5.020500 +158481 5.016500 +158482 5.019000 +158483 5.014000 +158484 4.995500 +158485 4.985500 +158486 5.009000 +158487 5.036500 +158488 5.002000 +158489 5.039500 +158490 4.988500 +158491 5.026500 +158492 4.960000 +158493 5.034000 +158494 4.968500 +158495 5.031000 +158497 4.420500 +158498 4.463000 +158503 3.610500 +158510 5.885500 +158511 5.997500 +158516 1.084000 +158523 7.025000 +158524 7.020500 +158528 7.021500 +158536 7.026500 +158552 6.929000 +158575 7.795500 +158581 5.896500 +158588 7.339500 +158614 5.489500 +158622 5.262500 +158623 5.252500 +158625 5.264000 +158630 7.343500 +158632 4.658500 +158639 3.825000 +158650 2.793500 +158652 6.941000 +158653 7.347500 +158671 7.310500 +158740 0.861000 +158753 5.127500 +158759 7.343000 +158765 1.092000 +158773 0.905500 +158785 5.459000 +158786 5.454000 +158788 5.843500 +158798 7.347000 +158799 5.428500 +158801 6.248000 +158802 6.358000 +158807 6.197500 +158808 6.299000 +158809 6.355000 +158810 6.269500 +158812 5.337500 +158813 6.125000 +158814 6.137000 +158815 5.501000 +158820 3.327500 +158826 3.473000 +158840 0.909500 +158841 1.484000 +158842 3.819500 +158843 2.011500 +158844 2.010000 +158853 1.204000 +158857 1.201000 +158863 1.201500 +158870 1.208500 +158884 1.860000 +158887 1.335000 +158889 0.752500 +158890 1.316500 +158891 1.218000 +158892 2.228500 +158893 1.870500 +158910 7.350500 +158928 3.785000 +158930 4.145500 +158931 4.026000 +158932 4.575000 +158935 4.366000 +158937 4.131000 +158938 4.614500 +158941 4.033500 +158990 5.259500 +158998 5.286500 +158999 4.403500 +159000 5.284500 +159022 7.013500 +159023 7.015500 +159025 6.021500 +159029 3.414500 +159030 3.512000 +159031 4.094000 +159032 3.785000 +159035 2.350000 +159036 2.212500 +159037 2.730000 +159038 2.864500 +159039 2.007500 +159040 2.007500 +159041 2.008500 +159042 2.006500 +159043 2.007500 +159044 2.008500 +159045 2.008500 +159046 2.008000 +159047 2.006500 +159048 2.008000 +159049 2.007000 +159050 2.008000 +159051 2.006500 +159052 2.006500 +159053 2.006000 +159054 2.006500 +159055 2.007500 +159056 2.006000 +159057 2.006000 +159058 2.008500 +159059 2.007000 +159060 2.006000 +159061 2.007000 +159112 4.897000 +159143 1.686000 +159144 4.027000 +159145 2.551500 +159146 2.677000 +159148 4.599500 +159151 5.619500 +159152 3.019500 +159153 3.181000 +159154 1.620000 +159155 3.289500 +159156 3.643500 +159157 3.112000 +159158 4.457500 +159159 4.368500 +159160 1.454000 +159162 1.350500 +159169 1.741000 +159171 3.269500 +159185 5.455000 +159186 3.887000 +159195 5.880500 +159196 6.048500 +159203 5.935500 +159204 6.658500 +159205 5.978000 +159206 4.884000 +159208 6.659000 +159209 5.712500 +159212 5.776500 +159213 5.088500 +159214 7.037500 +159215 4.572500 +159216 5.414500 +159217 5.733000 +159218 5.766500 +159220 5.682000 +159221 5.684500 +159223 5.736500 +159224 5.750000 +159225 5.790000 +159226 5.736500 +159227 5.956000 +159228 7.042000 +159230 7.036000 +159241 7.347500 +159246 4.377500 +159247 4.356000 +159252 4.364500 +159259 4.385000 +159260 4.379500 +159266 6.477000 +159285 5.616000 +159317 1.474500 +159326 6.488000 +159327 6.428000 +159328 6.442000 +159329 6.201000 +159330 4.125500 +159331 4.798000 +159332 6.414500 +159333 5.344500 +159334 4.402500 +159335 4.214500 +159336 2.464500 +159337 6.671000 +159338 6.567500 +159340 0.806500 +159341 1.242000 +159342 0.878000 +159343 6.346500 +159344 5.046500 +159345 6.542000 +159346 6.525000 +159347 6.534500 +159348 6.518000 +159350 5.350000 +159356 4.326500 +159364 4.018500 +159368 5.794500 +159369 1.625500 +159370 5.708500 +159372 5.959500 +159373 3.833000 +159374 1.137000 +159378 3.876500 +159380 3.755000 +159381 4.294000 +159382 3.983000 +159383 3.869500 +159384 3.498500 +159396 5.545000 +159397 5.534500 +159399 3.225500 +159403 4.577000 +159404 7.368000 +159405 3.649500 +159406 7.248500 +159407 7.267500 +159408 7.238500 +159409 3.139500 +159410 3.123500 +159411 2.723000 +159412 2.581500 +159413 7.253500 +159414 7.107000 +159415 7.058000 +159417 7.123000 +159418 6.107500 +159419 6.289500 +159420 2.808000 +159421 7.075000 +159422 7.276000 +159424 5.254500 +159425 2.692000 +159426 6.070500 +159427 2.553000 +159428 2.402500 +159429 6.540000 +159430 2.645500 +159431 2.638500 +159433 2.711500 +159434 6.005000 +159435 6.495000 +159436 6.559500 +159439 6.002500 +159440 5.063000 +159441 6.157500 +159459 3.958000 +159466 4.555000 +159481 2.624000 +159483 2.010500 +159484 2.011000 +159485 2.007500 +159486 2.007500 +159487 2.009500 +159488 2.008000 +159489 2.009000 +159490 2.010000 +159491 2.010000 +159492 2.007500 +159493 2.010000 +159494 2.010500 +159495 2.010000 +159496 2.558000 +159497 2.011500 +159498 2.011500 +159499 2.009500 +159500 2.009500 +159501 2.010500 +159502 2.010500 +159503 2.011000 +159504 2.008000 +159505 1.507500 +159506 1.507500 +159507 1.509000 +159508 1.507500 +159509 1.511500 +159510 1.507500 +159511 1.510500 +159512 1.508000 +159513 1.506500 +159514 1.508500 +159515 1.508000 +159516 1.511500 +159517 1.509000 +159518 1.511000 +159519 1.508500 +159520 1.508000 +159521 1.509000 +159522 1.507500 +159523 1.508000 +159524 1.507500 +159538 5.562500 +159542 5.418500 +159544 5.454000 +159545 5.283000 +159546 5.087000 +159550 2.722000 +159551 5.410000 +159553 4.960000 +159562 5.394500 +159567 1.530500 +159568 2.449000 +159570 1.458500 +159579 2.232500 +159586 4.318500 +159587 3.809500 +159590 5.473000 +159593 4.268000 +159595 4.970000 +159604 5.095000 +159606 5.075500 +159610 2.734500 +159612 3.495500 +159615 2.796000 +159616 3.312500 +159617 3.409000 +159618 3.439500 +159619 3.000000 +159620 1.789500 +159622 3.011500 +159633 6.333500 +159635 6.232000 +159677 1.206000 +159678 1.250500 +159679 1.196000 +159681 1.197000 +159683 1.199000 +159687 1.200000 +159689 1.198000 +159692 1.197000 +159693 1.198000 +159695 1.198500 +159696 1.197500 +159697 1.197500 +159698 1.198000 +159699 1.198000 +159702 1.199500 +159705 1.197500 +159709 7.341000 +159734 6.576000 +159739 5.597500 +159743 6.064500 +159744 6.535000 +159745 1.688500 +159746 1.088500 +159747 2.654000 +159755 5.345000 +159756 2.509000 +159757 3.778500 +159758 6.158000 +159759 5.078000 +159761 4.380000 +159762 7.051000 +159763 3.548500 +159764 3.712000 +159765 4.078500 +159766 5.226000 +159767 4.567000 +159768 3.859500 +159769 5.622000 +159778 7.328000 +159779 4.374500 +159780 3.329500 +159781 3.315500 +159782 3.539000 +159783 1.978000 +159784 7.051000 +159785 4.409500 +159786 2.515000 +159787 2.308000 +159788 2.433000 +159789 5.509500 +159797 5.049000 +159798 2.599000 +159799 5.630000 +159800 5.838500 +159801 4.436500 +159802 4.630000 +159803 4.506500 +159804 2.254000 +159805 7.043500 +159806 7.043000 +159809 7.048500 +159812 4.179500 +159818 7.314000 +159819 5.454000 +159820 5.259000 +159821 4.170000 +159822 5.086500 +159825 3.901500 +159826 7.071500 +159830 5.966500 +159833 4.393000 +159834 5.175500 +159982 4.927500 +159985 6.492500 +159988 5.088000 +159996 5.149500 +160003 2.408000 +160004 3.594500 +160012 5.972500 +160018 3.802000 +160024 3.962000 +160025 3.298500 +160026 3.739500 +160036 5.383000 +160039 2.215000 +160041 3.450500 +160044 1.968500 +160045 4.365500 +160046 1.604500 +160056 2.846500 +160057 4.165500 +160071 1.154500 +160076 3.961000 +160085 1.717500 +160093 7.050000 +160094 3.656000 +160095 4.062500 +160096 7.049500 +160098 4.478000 +160100 5.432000 +160101 3.526500 +160105 5.141500 +160106 2.738500 +160107 5.586500 +160108 2.803500 +160117 6.246500 +160121 3.163000 +160128 5.496000 +160129 2.394000 +160130 6.142000 +160137 6.193500 +160140 2.972500 +160142 2.087500 +160143 2.504500 +160144 2.062000 +160146 2.994500 +160148 4.706500 +160149 5.124000 +160151 7.059000 +160152 6.527000 +160153 5.030000 +160158 4.466000 +160160 3.735500 +160164 3.739000 +160165 3.186000 +160166 4.486000 +160167 3.877500 +160168 6.107500 +160170 4.810000 +160172 3.705500 +160175 0.674000 +160176 0.609500 +160181 4.127500 +160185 7.356000 +160186 4.110500 +160187 4.590500 +160189 4.811500 +160190 4.341500 +160191 4.273500 +160192 4.439500 +160193 4.063000 +160194 3.305000 +160195 2.857500 +160196 3.362000 +160197 4.238000 +160198 4.539500 +160199 4.072000 +160200 3.974500 +160201 3.918000 +160202 3.649500 +160203 3.864000 +160204 4.122500 +160205 3.820500 +160206 4.084000 +160207 3.491000 +160208 4.191000 +160209 4.222000 +160210 3.908000 +160211 3.011000 +160212 3.011000 +160213 3.012000 +160214 3.707000 +160215 3.539500 +160216 3.806500 +160217 3.877000 +160218 4.222000 +160219 3.774500 +160220 4.428500 +160221 3.363500 +160222 4.049000 +160223 4.099000 +160224 2.511000 +160226 3.742000 +160237 7.312500 +160261 1.568000 +160263 1.838000 +160264 1.772000 +160265 1.764500 +160281 7.309000 +160284 5.418000 +160289 4.879500 +160293 2.130000 +160299 5.250000 +160300 5.404500 +160302 4.197000 +160305 4.424500 +160307 5.033500 +160320 3.862500 +160321 4.611500 +160322 5.229000 +160325 4.444000 +160337 3.958500 +160338 2.825500 +160352 3.644000 +160353 5.527500 +160359 6.040500 +160360 5.989000 +160361 3.112000 +160363 5.889000 +160364 3.120000 +160366 3.139500 +160368 6.037000 +160373 5.630500 +160375 5.106000 +160376 4.613000 +160377 4.609000 +160378 0.821000 +160379 4.630500 +160380 4.604000 +160381 4.618000 +160382 4.600000 +160402 6.625500 +160403 6.412500 +160440 5.251000 +160448 4.923000 +160462 5.571000 +160483 7.352500 +160495 5.933500 +160496 5.851000 +160501 3.254000 +160506 5.983000 +160507 5.839000 +160512 6.052000 +160517 7.343000 +160519 5.094000 +160530 5.737500 +160531 5.865500 +160532 5.520000 +160535 1.321000 +160536 5.320500 +160537 5.381500 +160539 2.923000 +160540 5.319500 +160541 5.353500 +160543 5.453500 +160559 5.488500 +160560 5.330000 +160561 5.143000 +160587 6.266000 +160588 6.346000 +160589 6.964500 +160591 6.890000 +160592 6.532000 +160594 6.078500 +160599 7.353500 +160600 5.578500 +160601 4.099500 +160603 3.016500 +160604 3.022000 +160605 3.193500 +160606 3.011000 +160607 3.010000 +160608 3.007500 +160609 3.006000 +160610 3.018500 +160613 3.006500 +160614 3.005000 +160615 3.007000 +160616 3.006000 +160617 0.522000 +160618 3.007000 +160619 3.006500 +160620 3.007000 +160621 3.012500 +160622 3.014000 +160623 0.536500 +160624 3.009000 +160625 3.009000 +160626 3.007000 +160627 3.009000 +160631 7.347000 +160634 7.011000 +160636 5.856000 +160637 5.836500 +160639 5.841000 +160641 5.872500 +160642 5.884000 +160643 5.876500 +160644 5.842500 +160648 5.815000 +160649 5.822500 +160650 5.836000 +160651 5.788500 +160653 5.867000 +160654 6.095000 +160655 6.080000 +160656 5.947000 +160658 6.053000 +160659 6.095500 +160664 6.862000 +160668 7.028000 +160671 7.027000 +160676 4.834000 +160678 7.028500 +160679 7.028000 +160699 5.103500 +160701 5.903000 +160709 5.184000 +160722 5.731000 +160775 6.080000 +160778 5.494500 +160779 5.501500 +160780 5.485500 +160781 5.478000 +160782 5.508000 +160783 5.513000 +160816 3.418000 +160818 2.882500 +160820 5.337500 +160821 4.846000 +160822 5.771000 +160824 5.571500 +160825 5.577500 +160826 5.774500 +160827 3.767500 +160828 0.704000 +160830 4.287000 +160831 4.559500 +160832 5.920000 +160833 3.085000 +160834 5.772000 +160835 5.959500 +160838 4.363500 +160839 3.828500 +160849 7.322000 +160851 6.285000 +160853 5.825500 +160855 4.298500 +160857 2.026000 +160858 4.824000 +160859 2.014000 +160860 6.174500 +160861 6.254500 +160864 6.228000 +160865 6.396500 +160866 6.114000 +160868 6.074000 +160870 6.188500 +160871 6.093500 +160873 6.066500 +160874 6.014500 +160875 6.253500 +160877 6.111000 +160878 4.564500 +160879 5.881000 +160880 6.136000 +160882 4.169000 +160883 4.144000 +160885 4.515000 +160890 6.730500 +160891 5.187500 +160892 4.303000 +160893 6.149500 +160896 6.173500 +160898 3.414500 +160909 3.592000 +160916 5.431500 +160922 1.860000 +160946 6.456500 +160960 7.314500 +160978 1.412500 +160979 4.810000 +160993 7.345000 +160998 5.053000 +161000 5.519500 +161001 4.880500 +161010 5.089500 +161014 4.759000 +161025 7.346000 +161026 4.231500 +161029 2.746500 +161031 2.597500 +161045 0.947000 +161046 0.664000 +161047 1.945000 +161048 1.459000 +161063 7.347000 +161068 7.556500 +161069 7.558000 +161070 7.551000 +161071 7.535000 +161072 7.550000 +161073 7.549500 +161074 7.549000 +161075 7.546500 +161076 7.550000 +161077 7.552000 +161082 4.514500 +161101 7.364000 +161112 7.425500 +161113 7.425000 +161120 0.615500 +161126 1.693500 +161128 2.307500 +161130 1.079500 +161131 0.846500 +161135 7.346000 +161180 1.015000 +161181 1.049000 +161182 1.000500 +161183 0.933500 +161184 0.941500 +161185 0.956000 +161186 0.962000 +161187 0.980500 +161189 0.924500 +161190 1.089000 +161191 1.134500 +161192 0.705000 +161193 0.666500 +161194 0.880500 +161195 0.915500 +161200 6.159000 +161201 6.208000 +161204 5.519000 +161205 5.523500 +161206 5.516500 +161207 6.404500 +161213 6.877000 +161214 6.873500 +161217 6.948000 +161224 6.426000 +161225 6.154500 +161226 4.424000 +161227 4.093000 +161228 5.093500 +161229 6.576000 +161230 6.581000 +161231 6.369500 +161232 6.347500 +161234 5.824000 +161235 6.752500 +161236 6.759500 +161237 4.150000 +161238 5.120500 +161239 6.739500 +161240 2.416000 +161241 3.320500 +161242 2.480500 +161243 3.922500 +161244 3.432000 +161245 2.801500 +161246 3.659000 +161247 2.230000 +161278 1.612500 +161279 2.095000 +161281 1.867000 +161282 1.812500 +161288 3.351500 +161289 3.703000 +161290 2.996000 +161293 3.793500 +161296 3.673500 +161297 4.343500 +161298 4.947000 +161299 4.783000 +161301 3.238000 +161302 3.318500 +161303 0.742000 +161315 3.925000 +161316 1.724500 +161318 2.189500 +161323 3.730000 +161324 5.036000 +161325 4.676500 +161326 4.466000 +161327 1.402000 +161328 3.183500 +161330 2.550000 +161332 2.558500 +161334 1.440000 +161337 3.329500 +161338 3.007500 +161339 1.661500 +161340 1.699000 +161341 2.141000 +161355 5.066000 +161362 2.476000 +161363 0.995000 +161365 1.991500 +161366 1.458500 +161368 2.189000 +161369 1.511000 +161375 2.591500 +161396 4.154000 +161419 2.649000 +161427 4.784500 +161428 3.578500 +161429 3.703000 +161430 3.599000 +161431 3.822500 +161432 3.137500 +161433 4.113500 +161434 4.133000 +161435 3.824000 +161436 5.145000 +161439 4.232500 +161440 5.085000 +161441 4.385500 +161442 3.885500 +161443 3.646500 +161445 4.224000 +161451 3.729500 +161457 3.587000 +161490 7.335500 +161534 7.337500 +161542 6.190000 +161543 6.191000 +161544 6.670500 +161547 6.690000 +161563 4.329000 +161569 3.466500 +161570 3.384000 +161571 2.606000 +161572 2.358500 +161573 2.753500 +161574 2.377000 +161575 3.294000 +161585 5.259000 +161589 4.469500 +161594 3.126000 +161606 3.428000 +161616 5.235000 +161617 4.955000 +161632 0.544000 +161634 3.065000 +161715 5.089500 +162163 3.803500 +162207 6.852500 +162210 6.454500 +162211 1.811000 +162218 6.847000 +162223 4.340500 +162239 5.985000 +162259 5.907000 +162270 7.032500 +162271 3.704500 +162272 5.885500 +162273 4.920500 +162274 2.494500 +162275 3.556500 +162277 2.724000 +162286 5.509000 +162288 5.658000 +162289 0.500000 +162290 4.042500 +162295 6.190500 +162310 2.130000 +162311 4.893000 +162315 3.630000 +162332 7.079500 +162334 6.824000 +162338 0.639500 +162339 0.598500 +162340 4.311000 +162341 7.221500 +162342 4.369500 +162345 5.817500 +162353 0.580500 +162354 4.899000 +162398 6.832000 +162401 2.818500 +162417 3.907000 +162418 1.654000 +162420 5.535000 +162421 4.187000 +162423 2.235500 +162427 4.824000 +162428 3.952500 +162429 4.004500 +162430 4.028000 +162432 4.229000 +162433 4.088000 +162438 7.077500 +162440 7.060500 +162456 4.227500 +162457 0.944500 +162458 4.905500 +162459 5.249500 +162460 4.875500 +162461 3.842500 +162462 1.456000 +162463 4.722000 +162465 5.057000 +162466 5.172500 +162467 5.353000 +162468 5.305500 +162469 5.184000 +162470 5.251500 +162482 7.098500 +162483 3.872500 +162484 4.057000 +162485 4.227500 +162486 3.942500 +162487 4.224500 +162488 4.115500 +162490 4.353000 +162491 4.046000 +162492 7.045500 +162493 7.702500 +162496 7.036500 +162497 8.017000 +162498 7.488000 +162519 7.136000 +162538 4.283500 +162539 4.516500 +162541 4.184500 +162542 4.789500 +162544 4.868500 +162545 5.614500 +162547 3.295000 +162553 6.429500 +162554 6.459000 +162555 6.443500 +162692 3.395000 +162694 3.518500 +162705 6.948500 +162714 1.483000 +162720 6.087000 +162721 6.161000 +162726 5.552000 +162741 6.961500 +162776 7.079000 +162791 4.969000 +162792 4.509000 +162794 4.138500 +162806 2.216500 +162808 2.995000 +162809 1.811500 +162810 5.950000 +162816 4.587500 +162817 4.062500 +162818 4.742000 +162819 2.504500 +162820 4.420000 +162821 5.628500 +162822 3.282500 +162823 4.473500 +162824 2.506500 +162825 4.911000 +162826 5.418500 +162827 3.974500 +162828 5.847500 +162829 3.968000 +162830 5.418500 +162831 4.335000 +162832 4.499000 +162833 1.481000 +162834 4.371500 +162835 4.704500 +162836 4.371500 +162837 4.997000 +162838 3.747000 +162839 5.981500 +162840 3.006000 +162841 3.006500 +162842 3.007500 +162843 4.414500 +162844 3.005000 +162845 3.007500 +162901 7.105000 +162902 7.093500 +162903 7.077500 +162909 1.194500 +162935 4.299500 +162936 3.121500 +162937 1.503000 +162945 5.776500 +162951 5.635000 +162952 5.232500 +162956 5.158000 +162957 5.413000 +162958 5.504000 +162961 5.444500 +162974 2.651000 +162975 2.148500 +162976 3.473500 +162978 3.404000 +162979 4.324000 +162980 3.277500 +162981 3.821000 +162982 2.557000 +162983 3.307000 +162984 3.102000 +162985 3.208000 +162986 3.078000 +162987 3.242500 +162988 2.530500 +162990 4.987500 +162991 3.614000 +162992 3.717000 +162993 3.593500 +162994 3.497000 +162995 4.440500 +162998 5.423500 +162999 7.052000 +163006 2.630500 +163020 3.576500 +163022 3.630000 +163023 4.083500 +163024 3.434500 +163025 4.670000 +163026 4.136500 +163027 3.861500 +163028 5.264000 +163029 4.081000 +163030 3.987500 +163031 3.238000 +163033 4.076000 +163034 3.251000 +163035 4.413000 +163036 5.108000 +163037 6.149500 +163038 4.063500 +163039 4.816000 +163040 4.884000 +163041 5.094500 +163042 4.593000 +163043 4.724500 +163044 4.558500 +163045 5.070500 +163046 6.004500 +163047 4.823500 +163048 6.235500 +163049 6.048000 +163050 6.372500 +163051 6.276500 +163052 3.168000 +163053 2.436000 +163054 4.591000 +163055 5.146500 +163056 2.929500 +163057 3.003000 +163058 5.014500 +163059 4.276000 +163060 3.051500 +163061 5.011000 +163062 5.219000 +163075 2.888500 +163076 3.210500 +163099 7.375500 +163132 5.142500 +163133 4.976000 +163134 5.204500 +163135 5.208500 +163137 2.694500 +163143 7.371500 +163154 4.339000 +163159 0.695500 +163199 1.905500 +163200 5.804500 +163203 5.783000 +163207 5.723500 +163209 5.676500 +163210 5.453500 +163211 2.899000 +163212 5.638500 +163224 7.724500 +163226 7.723500 +163227 7.723500 +163235 7.366500 +163239 5.099500 +163241 5.081500 +163242 5.160500 +163243 5.156500 +163245 5.165500 +163246 5.183000 +163247 5.150000 +163248 5.163500 +163254 5.131000 +163255 5.525500 +163257 5.337000 +163258 5.379000 +163259 5.387500 +163275 6.209500 +163276 5.613000 +163277 2.571500 +163278 2.578000 +163279 2.506500 +163280 2.550000 +163281 2.490000 +163282 2.507000 +163283 2.506500 +163284 7.049500 +163286 7.052000 +163287 4.836000 +163303 7.370000 +163306 5.439000 +163307 2.322500 +163308 2.311500 +163309 4.628500 +163311 3.011500 +163312 3.649000 +163314 4.675500 +163319 2.566500 +163320 2.955000 +163321 2.988500 +163322 3.898500 +163323 2.626000 +163324 2.804500 +163325 3.322500 +163326 3.090000 +163327 4.209500 +163433 5.495000 +163434 5.477000 +163460 5.146500 +163461 5.100000 +163462 0.899500 +163474 5.405500 +163516 5.468000 +163522 3.972000 +163523 5.182000 +163530 4.519000 +163595 1.164500 +163601 6.631000 +163602 6.513000 +163603 6.519000 +163604 6.544500 +163605 1.665000 +163611 6.108000 +163648 4.259000 +163649 4.174000 +163654 5.901500 +163699 5.333000 +163700 6.054000 +163701 6.060500 +163702 1.857000 +163704 5.971500 +163705 0.992000 +163709 0.952000 +163714 7.040500 +163720 5.167000 +163735 6.103500 +163741 5.547000 +163743 7.020000 +163749 6.878000 +163751 5.739500 +163760 5.521500 +163761 5.499000 +163762 5.462000 +163773 5.476000 +163781 5.151500 +163783 4.856000 +163784 2.335000 +163785 1.764500 +163801 5.670500 +163803 5.655500 +163805 5.647000 +163806 5.777000 +163807 5.645500 +163809 5.652500 +163810 5.649500 +163812 5.242500 +163817 6.897500 +163820 5.961500 +163822 7.022500 +163824 7.022000 +163827 5.946500 +163836 7.020000 +164029 0.705000 +164037 4.956000 +164074 6.820500 +164083 7.133000 +164115 5.265000 +164126 7.089500 +164128 5.904500 +164129 6.013500 +164130 6.033500 +164131 6.042000 +164132 0.935000 +164133 5.414500 +164150 7.094500 +164168 5.355000 +164175 6.126500 +164185 7.135000 +164204 7.068500 +164219 5.969500 +164223 7.237500 +164224 4.082500 +164225 0.507000 +164226 4.827000 +164227 6.800000 +164238 4.235500 +164243 5.399000 +164247 5.004500 +164273 1.866500 +164274 5.456000 +164276 5.701500 +164277 5.030000 +164278 5.160500 +164279 6.109000 +164280 4.175500 +164281 5.646000 +164286 2.441000 +164290 6.393000 +164291 3.336000 +164292 5.688000 +164293 6.082500 +164294 5.329000 +164299 7.119500 +164300 4.873000 +164301 4.157000 +164302 6.034000 +164303 2.234500 +164305 3.460500 +164306 2.650500 +164307 3.972500 +164308 2.425000 +164313 2.428500 +164314 2.940500 +164317 2.989500 +164319 7.091000 +164321 5.542500 +164323 1.835500 +164324 2.415000 +164330 6.149500 +164331 4.768500 +164332 6.197000 +164333 4.571000 +164334 6.206000 +164335 6.229500 +164338 4.828000 +164347 1.199500 +164350 0.891000 +164351 3.069500 +164352 4.792000 +164355 3.292500 +164360 5.414500 +164361 4.194000 +164363 2.162500 +164364 1.865500 +164365 3.876500 +164367 2.340500 +164368 2.996500 +164369 3.570500 +164370 2.696000 +164372 5.018000 +164373 4.814000 +164375 3.798500 +164384 1.284500 +164391 1.309000 +164398 1.198000 +164400 1.197500 +164401 1.315500 +164403 1.198000 +164424 7.365000 +164438 5.362000 +164439 3.107000 +164444 2.427500 +164445 2.428000 +164446 4.209000 +164448 4.228000 +164450 3.401000 +164451 4.642500 +164453 4.479500 +164462 6.944500 +164469 3.866000 +164471 3.865500 +164472 3.315000 +164474 3.217500 +164491 4.812000 +164514 4.133000 +164516 4.199000 +164528 3.989500 +164538 4.035500 +164546 7.374500 +164547 6.380500 +164548 2.308500 +164550 5.724000 +164551 3.615000 +164553 3.807000 +164554 2.161000 +164555 3.660500 +164557 3.769500 +164558 3.870000 +164560 4.546000 +164561 5.051000 +164562 3.644500 +164563 3.725000 +164564 4.484500 +164566 5.585500 +164571 5.018500 +164574 4.823000 +164579 4.579500 +164580 3.763500 +164581 4.939500 +164582 4.342500 +164583 4.304500 +164584 4.860000 +164630 6.561500 +164631 6.566500 +164632 6.564500 +164633 6.563000 +164634 6.563500 +164635 6.553500 +164636 6.549000 +164637 6.565000 +164638 6.560500 +164639 6.562500 +164640 6.566000 +164641 6.561500 +164643 6.563500 +164646 4.531500 +164667 2.741000 +164668 4.419000 +164669 3.984000 +164670 3.567000 +164671 3.528000 +164672 3.584000 +164673 3.180000 +164674 4.377000 +164676 3.690000 +164677 4.875500 +164678 3.868500 +164679 3.655500 +164680 4.567500 +164682 4.668000 +164686 1.676500 +164694 6.557500 +164695 6.562000 +164696 6.561500 +164697 6.565500 +164698 6.535000 +164699 6.552500 +164700 6.540000 +164701 6.541500 +164702 6.551500 +164703 6.552000 +164707 6.551500 +164708 6.548500 +164709 6.552000 +164710 6.550000 +164711 6.544000 +164713 1.557000 +164716 2.470500 +164717 3.601000 +164723 6.406000 +164773 7.375500 +164777 7.379000 +164786 6.873500 +164794 6.724000 +164796 6.831500 +164802 6.358000 +164803 5.856000 +164804 6.286500 +164805 6.139000 +164807 6.498500 +164808 6.876000 +164809 6.871500 +164810 6.869500 +164811 4.803500 +164812 4.064000 +164815 7.040500 +164816 7.052000 +164833 7.036500 +164838 7.037000 +164842 7.039000 +164849 4.576000 +164850 7.032500 +164863 2.160500 +164869 5.294000 +164871 4.356000 +164872 4.624000 +164876 5.534500 +164881 5.271000 +164882 5.209500 +164885 0.655500 +164894 5.211500 +164904 5.062000 +164905 5.311500 +164906 5.156000 +164914 7.035500 +164915 7.035500 +164916 7.033000 +164917 7.032500 +164918 7.032500 +164919 7.030500 +164920 7.036000 +164921 7.036000 +164922 7.037500 +164923 7.039500 +164924 7.039000 +164925 7.034000 +164932 5.853500 +164933 3.359000 +164934 3.189500 +164935 5.359000 +164937 5.831500 +164938 5.376500 +164939 5.706500 +164942 3.588500 +164943 3.093000 +164944 2.283500 +164945 2.168000 +164946 2.140000 +164947 4.128500 +164948 4.135000 +164949 4.306500 +164950 5.551500 +164959 3.721500 +164961 3.172000 +164962 2.961500 +164963 3.134000 +164964 2.931000 +164971 7.354500 +164972 3.860000 +164976 3.424000 +164983 2.791000 +164984 3.487000 +164989 3.408000 +164990 3.747500 +164992 3.107500 +164994 1.744000 +164995 1.725500 +165000 2.307500 +165001 2.701500 +165002 2.949000 +165003 2.043500 +165004 4.216500 +165011 6.454500 +165050 6.391000 +165092 4.538500 +165093 4.920500 +165103 6.180000 +165104 6.378000 +165105 6.207000 +165106 6.872500 +165107 6.875500 +165108 5.901500 +165109 3.856500 +165110 4.365000 +165111 3.900500 +165112 1.231000 +165121 1.053500 +165123 7.040000 +165126 8.916000 +165127 8.972000 +165128 8.984000 +165132 8.950000 +165133 8.396000 +165136 8.339000 +165139 7.276500 +165140 6.272500 +165144 4.433000 +165150 5.239000 +165152 4.884500 +165154 4.885000 +165174 5.856500 +165187 3.380500 +165189 2.951000 +165191 4.084000 +165197 5.426500 +165198 3.287500 +165199 3.300500 +165200 3.792500 +165201 3.688500 +165206 6.123000 +165207 5.733500 +165208 5.257000 +165224 2.531500 +165226 6.163500 +165227 6.786000 +165233 7.371000 +165235 2.986500 +165236 4.640000 +165237 3.310000 +165238 2.744000 +165239 2.481000 +165242 2.804000 +165243 2.974000 +165244 2.743000 +165246 5.050500 +165247 3.581500 +165248 4.692000 +165249 3.925000 +165250 2.879000 +165251 6.871500 +165253 3.742500 +165257 5.182500 +165259 4.922000 +165261 4.965000 +165263 4.330000 +165265 5.007000 +165271 5.787000 +165272 5.678000 +165273 5.653500 +165274 5.649500 +165279 6.363000 +165282 6.835500 +165294 5.336500 +165348 4.656000 +165355 4.547000 +165363 1.081000 +165364 1.197500 +165371 1.198000 +165374 1.200000 +165384 1.199500 +165385 1.198000 +165399 3.424000 +165401 5.448000 +165404 5.337500 +165409 3.687500 +165411 5.443000 +165412 5.618500 +165414 5.594000 +165416 5.617500 +165417 5.523000 +165418 4.084000 +165421 3.356500 +165453 1.280500 +165459 7.364000 +165490 4.580000 +165493 3.722000 +165496 3.489000 +165503 5.512500 +165511 3.082500 +165524 7.367000 +165525 0.944000 +165526 2.261000 +165527 2.494000 +165528 2.425000 +165529 2.392500 +165531 2.319000 +165532 2.696000 +165533 2.266500 +165534 3.569000 +165535 1.770000 +165536 1.952500 +165539 2.699000 +165540 4.215000 +165542 3.246000 +165543 2.529500 +165544 2.959000 +165669 5.548500 +165670 6.205000 +165671 4.875000 +165672 4.755000 +165673 5.222000 +165676 4.819000 +165677 7.097500 +165678 7.077500 +165680 3.824500 +165682 3.008000 +165686 5.157500 +165688 6.094000 +165691 0.557500 +165693 1.280000 +165694 1.305000 +165703 0.749000 +165709 1.670000 +165711 2.224000 +165712 1.755000 +165715 4.545500 +165716 2.814000 +165717 1.084000 +165718 1.398000 +165722 2.276000 +165724 3.409500 +165726 5.542500 +165727 2.317000 +165728 3.328000 +165729 1.471500 +165731 2.415500 +165811 0.701500 +165812 0.709000 +165814 8.524500 +165815 8.773500 +165816 8.364000 +165817 3.328000 +165819 8.182500 +165821 6.182000 +165822 8.939000 +165823 3.673500 +165824 8.283500 +165825 8.637000 +165826 8.103500 +165827 7.650000 +165828 0.850500 +165830 0.728500 +165831 1.035000 +165832 1.229500 +165833 8.264000 +165834 5.796500 +165835 6.416000 +165836 5.846000 +165837 5.023000 +165838 8.247500 +165845 0.824000 +165848 0.794500 +165850 0.804000 +165851 5.665000 +165855 7.023000 +165856 7.021000 +165858 7.061500 +165883 1.541000 +165884 3.719500 +165886 1.993500 +165899 3.652500 +165900 1.141500 +165901 3.660500 +165902 0.577000 +165903 1.003000 +165907 3.622000 +165908 3.657000 +165909 4.088500 +165968 6.133500 +165969 5.141500 +165970 6.136500 +165978 3.706500 +165979 4.392000 +165981 6.874500 +165985 7.376000 +165986 6.873500 +165987 4.666000 +165988 6.130000 +165989 5.341500 +165990 4.721000 +165991 6.128500 +165992 4.528500 +165993 4.597000 +165994 4.504000 +165995 4.066000 +165996 4.524000 +165997 5.130000 +165998 3.553500 +165999 5.178000 +166000 6.137000 +166001 6.136000 +166002 3.245000 +166003 3.091500 +166004 6.140500 +166005 6.594000 +166006 3.079500 +166007 6.813000 +166011 1.464500 +166012 3.739500 +166017 7.375500 +166018 3.170500 +166019 3.104000 +166020 3.202000 +166022 5.481500 +166024 5.252000 +166028 4.048500 +166038 5.532000 +166039 5.195000 +166047 3.737500 +166053 5.434000 +166072 5.713000 +166076 1.704000 +166079 5.437500 +166082 5.560000 +166088 5.480500 +166095 3.881000 +166096 5.476500 +166097 5.689000 +166098 5.769000 +166116 6.058000 +166119 5.500000 +166121 5.339000 +166125 5.386500 +166128 3.336500 +166139 7.070000 +166152 5.840000 +166153 7.009000 +166154 7.013500 +166155 7.009500 +166157 7.010000 +166159 5.882000 +166160 5.853000 +166161 5.843000 +166164 5.887000 +166170 4.815500 +166178 3.918500 +166179 5.433500 +166184 3.407000 +166185 5.114500 +166186 5.107000 +166187 2.835500 +166188 5.043500 +166190 5.060000 +166191 5.076000 +166192 5.114000 +166254 5.385000 +166255 5.945500 +166257 2.609500 +166258 2.743500 +166260 3.786500 +166261 6.075000 +166262 4.591500 +166281 0.872000 +166282 1.856000 +166284 1.852500 +166287 1.040500 +166288 1.258500 +166289 1.092000 +166290 1.300500 +166291 0.908000 +166292 1.206000 +166293 1.034500 +166294 0.791000 +166295 1.102500 +166299 1.181500 +166300 5.736000 +166301 2.237000 +166302 2.138500 +166304 2.433500 +166305 5.557000 +166306 2.899000 +166307 5.523000 +166311 1.607000 +166312 1.560500 +166314 2.694500 +166315 1.480500 +166318 0.977500 +166319 1.014000 +166320 1.962000 +166321 2.454000 +166322 1.771000 +166323 2.741500 +166324 2.657000 +166325 1.983500 +166328 4.104500 +166329 1.742500 +166330 1.990000 +166334 6.963500 +166342 5.222000 +166344 4.802500 +166363 4.637000 +166364 3.482000 +166365 5.297500 +166395 1.394500 +166413 4.430000 +166414 4.922500 +166418 4.658000 +166422 2.659500 +166435 5.569500 +166436 5.445000 +166437 2.427500 +166438 5.051500 +166439 4.867500 +166440 5.329000 +166441 3.928000 +166443 4.451000 +166445 3.787000 +166446 4.699000 +166447 4.701000 +166448 5.217000 +166449 4.478000 +166450 4.461000 +166451 2.443500 +166452 4.280000 +166453 2.278500 +166454 4.837500 +166456 4.992500 +166457 4.171000 +166458 5.322500 +166459 5.606500 +166460 4.747500 +166461 5.549000 +166462 3.526000 +166463 3.614000 +166464 3.506500 +166465 3.790000 +166466 3.688500 +166467 4.269500 +166468 3.757000 +166469 3.656000 +166470 3.508500 +166493 4.079000 +166500 4.080500 +166502 4.956000 +166503 4.033000 +166527 2.580500 +166550 5.122000 +166551 4.000500 +166552 3.457500 +166553 4.474000 +166554 3.895000 +166555 5.035500 +166559 3.257000 +166560 3.396500 +166562 4.293000 +166563 4.003000 +166564 5.055500 +166565 4.187500 +166571 3.029000 +166575 5.315500 +166576 6.179000 +166594 0.553000 +166599 5.618500 +166601 2.505000 +166605 5.589500 +166607 5.651500 +166610 5.418000 +166611 5.363500 +166616 5.621000 +166622 5.638500 +166627 4.192500 +166629 2.826500 +166630 4.170000 +166631 4.205500 +166632 4.198000 +166633 4.170000 +166635 4.146000 +166636 4.151000 +166637 4.147500 +166638 4.153500 +166639 4.152000 +166640 4.159000 +166641 3.278500 +166642 4.150500 +166643 4.151500 +166644 5.156500 +166645 2.218500 +166646 5.202000 +166648 5.156500 +166649 5.168500 +166650 5.163000 +166651 5.172500 +166652 5.170000 +166653 5.174000 +166654 5.160500 +166655 5.161000 +166656 5.165500 +166657 5.162500 +166658 5.166500 +166659 5.166000 +166660 5.174000 +166671 1.659500 +166672 1.727500 +166673 1.632500 +166674 1.788000 +166675 1.692000 +166677 1.915000 +166681 4.836500 +166682 4.692000 +166684 5.514000 +166686 3.270500 +166687 4.721000 +166688 5.213000 +166689 5.935500 +166691 4.508000 +166692 5.251000 +166712 1.034000 +166713 1.150000 +166714 1.040000 +166715 5.345000 +166719 1.923500 +166729 5.508500 +166738 3.744000 +166741 1.511500 +166742 3.308000 +166776 1.074000 +166778 1.088500 +166779 0.894500 +166780 0.912500 +166781 0.966500 +166783 1.571500 +166784 2.023500 +166792 3.830500 +166796 1.505500 +166799 1.393000 +166800 2.193000 +166801 3.007500 +166802 3.758000 +166811 5.160000 +166815 5.113500 +166816 4.729000 +166817 2.436500 +166818 3.124000 +166819 4.611000 +166820 4.022000 +166821 4.340500 +166822 4.279500 +166823 4.161500 +166824 4.267000 +166825 4.304000 +166826 4.482500 +166827 2.559500 +166828 4.965000 +166829 3.224000 +166830 4.550500 +166831 4.716500 +166832 5.033000 +166840 4.949000 +166855 4.367000 +166856 5.820500 +166859 5.542500 +166860 5.404500 +166861 4.097500 +166862 4.806500 +166863 4.617000 +166867 3.153000 +166869 4.392000 +166870 4.478500 +166871 1.504500 +166872 4.060000 +166873 5.047000 +166874 4.759000 +166875 4.478000 +166876 5.145500 +166877 2.637000 +166878 4.153000 +166879 3.578000 +166880 5.237000 +166881 5.431500 +166882 4.975000 +166884 5.129500 +166885 5.227000 +166886 5.299000 +166887 5.671500 +166888 5.345500 +166890 6.104500 +166891 5.377500 +166892 4.732500 +166913 5.838500 +166914 4.631500 +166915 5.392000 +166918 5.389500 +166919 5.366500 +166927 1.065500 +166928 1.742500 +166929 4.976000 +166930 5.046000 +166931 4.051500 +166932 4.228500 +166933 4.225500 +166934 4.400500 +166935 4.478000 +166936 4.230500 +166937 4.190500 +166938 3.778000 +166939 4.098500 +166942 2.899000 +166943 4.016000 +166944 5.286500 +166945 5.955000 +166950 6.116500 +166952 5.292500 +166953 5.259000 +167063 0.673000 +167085 2.085500 +167086 5.535500 +167094 0.660000 +167096 0.741500 +167103 0.736500 +167105 0.789500 +167106 0.783500 +167107 0.787500 +167108 0.723000 +167118 2.798000 +167133 1.693000 +167146 4.320500 +167150 5.478500 +167163 4.934000 +167189 2.112500 +167224 0.789500 +167245 5.410000 +167269 2.186000 +167278 5.405000 +167282 5.119000 +167283 5.136500 +167304 5.651000 +167312 5.370500 +167316 5.685000 +167323 2.984500 +167333 3.190000 +167334 1.819500 +167335 2.169500 +167336 1.749000 +167337 5.923500 +167338 6.031500 +167339 2.289000 +167340 3.335500 +167341 3.055500 +167342 5.238500 +167343 2.486000 +167344 2.552500 +167345 1.991500 +167346 2.029500 +167347 5.761500 +167352 5.717500 +167359 5.725000 +167363 1.167000 +167407 5.777500 +167415 4.738000 +167429 4.494000 +167436 0.886500 +167438 3.657500 +167442 0.734500 +167445 4.861000 +167446 0.689500 +167447 1.046000 +167448 1.219000 +167450 4.776000 +167452 5.180500 +167454 0.991500 +167456 1.013000 +167458 3.967500 +167459 1.044500 +167461 1.095500 +167462 1.143500 +167464 4.364000 +167465 4.265000 +167469 2.654500 +167470 1.177000 +167471 1.076500 +167472 4.538500 +167476 4.870000 +167477 1.109000 +167478 1.092000 +167479 1.026500 +167480 5.073500 +167487 2.159000 +167488 5.269000 +167492 7.088000 +167494 3.478500 +167496 6.479500 +167497 6.663000 +167498 6.497500 +167500 5.281500 +167501 6.870000 +167503 4.615500 +167505 5.835500 +167550 2.418500 +167556 5.325500 +167557 5.263000 +167558 5.222000 +167559 4.382500 +167560 0.883000 +167561 3.428500 +167562 3.831500 +167564 2.640000 +167565 2.804500 +167566 2.733000 +167586 2.967000 +167587 5.072500 +167588 5.124500 +167590 5.076000 +167591 5.206000 +167592 1.541500 +167593 5.521000 +167594 1.891000 +167595 3.250500 +167596 2.214000 +167597 2.118000 +167598 1.967500 +167599 2.018000 +167610 1.717000 +167611 2.536500 +167612 4.774500 +167613 0.619500 +167614 4.767000 +167615 4.079500 +167616 1.237000 +167617 4.100000 +167619 4.916000 +167621 4.590000 +167622 2.778000 +168442 0.847500 +168443 0.626500 +168445 2.576500 +168446 1.405500 +168447 1.776500 +168448 2.082500 +168449 1.831000 +168483 0.672000 +168485 0.662500 +168486 0.820500 +168489 0.714500 +168492 2.338000 +168493 2.316000 +168494 2.341000 +168495 4.422000 +168501 4.676500 +168502 6.203500 +168503 5.755500 +168505 4.525000 +168506 5.711000 +168507 6.390500 +168508 6.281000 +168509 6.097000 +168510 3.070000 +168511 6.675500 +168512 2.955000 +168513 6.267000 +168514 0.940500 +168515 7.020000 +168517 2.807000 +168518 7.039500 +168520 6.258000 +168521 6.160500 +168522 6.134000 +168527 7.124000 +168528 6.484500 +168531 6.278000 +168532 6.127500 +168533 7.128000 +168538 6.271000 +168539 7.039000 +168540 6.139500 +168541 6.132000 +168542 6.280500 +168543 7.031000 +168545 6.141500 +168546 6.151500 +168547 6.142000 +168549 7.032000 +168550 6.307500 +168552 7.019500 +168553 6.141500 +168555 6.704000 From 37d528e8f6a290bbe2ed6802bfced83e606d102c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 4 May 2017 02:07:05 -0400 Subject: [PATCH 012/744] beginning debugging after refactoring for 1D data --- data/get_mdsplus_data.py | 18 +-- data/signals.py | 28 +++-- examples/conf.yaml | 4 + plasma/conf.py | 27 ++++- plasma/models/builder.py | 73 ++++++++++-- plasma/models/data.py | 70 ++++++++++- plasma/models/loader.py | 21 ++-- plasma/preprocessor/normalize.py | 72 ++++++------ plasma/preprocessor/preprocess.py | 186 ++++++++++++++--------------- plasma/primitives/shots.py | 187 +++++++++++++++++++++++++----- plasma/utils/downloading.py | 16 ++- plasma/utils/processing.py | 48 ++++---- 12 files changed, 512 insertions(+), 238 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 83497d3b..d043b291 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -1,26 +1,18 @@ from plasma.utils.downloading import download_all_shot_numbers from data.signals import * +import plasma.conf prepath = '/cscratch/share/frnn/'#'/p/datad2/' shot_numbers_path = 'shot_lists/' save_path = 'signal_data/' machine = d3d#jet#d3d -signals = d3d_signals#jet_signals#d3d_signals +signals = all_signals#jet_signals#d3d_signals print('using signals: ') print(signals) -#nstx -# shot_numbers_files = ['disrupt_nstx.txt'] #nstx +# shot_list_files = plasma.conf.jet_full +shot_list_files = plasma.conf.d3d_full -#d3d -#shot_numbers_files = ['shotlist_JaysonBarr_clear.txt'] -#shot_numbers_files += ['shotlist_JaysonBarr_disrupt.txt'] -# #shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] -#shot_numbers_files = ['d3d_clear.txt', 'd3d_disrupt.txt']#['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] #data only available after shot 125500 -shot_numbers_files = ['d3d_clear_data_avail.txt', 'd3d_disrupt_data_avail.txt'] -#jet -#shot_numbers_files = ['CWall_clear.txt','CFC_unint.txt','BeWall_clear.txt','ILW_unint.txt']#jet - -download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine,signals) +download_all_shot_numbers(prepath,save_path,shot_list_files,signals) diff --git a/data/signals.py b/data/signals.py index 8afcb800..c7c59c58 100644 --- a/data/signals.py +++ b/data/signals.py @@ -6,7 +6,7 @@ import time import sys -from plasma.models.data import Signal,Machine +from plasma.models.data import Signal,ProfileSignal,Machine def create_missing_value_filler(): @@ -58,10 +58,10 @@ def get_units(str): xdata = c.get('dim_of(_s,1)').data() xunits = get_units('dim_of(_s,1)') ydata = c.get('dim_of(_s)').data() - yunits = get_units('dim_of(_s)') + yunits = get_units('dim_of(_s)') else: xdata = c.get('dim_of(_s)').data() - xunits = get_units('dim_of(_s)') + xunits = get_units('dim_of(_s)') found = True # MDSplus seems to return 2-D arrays transposed. Change them back. if np.ndim(data) == 2: data = np.transpose(data) @@ -123,8 +123,9 @@ def fetch_nstx_data(signal_path,shot_num,c): all_machines = [d3d,jet] -etemp_profile = Signal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10]) -edens_profile = Signal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10]) +profile_num_channels = 32 +etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) +edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10]) @@ -139,7 +140,7 @@ def fetch_nstx_data(signal_path,shot_num,c): pradcore = Signal("Radiated Power Core",['d3d/'+r'\bol_l15_p'],[d3d]) pradedge = Signal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) # pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) -pechin = Signal("ECH input power, not always on",['d3d/echpwrc'],[d3d]) +pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) betan = Signal("Normalized Beta",['d3d/efsbetan'],[d3d]) energydt = Signal("stored energy time derivative",['jpf/gs/bl-fdwdt 1: + indices_1d += indices + num_1D += 1 + else: + assert(num_channels == 1) + indices_0d += indices + num_0D += 1 + return np.array(indices_0d), np.array(indices_1d),num_0D,num_1D + + def build_model(self,predict,custom_batch_size=None): conf = self.conf model_conf = conf['model'] @@ -64,7 +87,13 @@ def build_model(self,predict,custom_batch_size=None): stateful = model_conf['stateful'] return_sequences = model_conf['return_sequences'] output_activation = conf['data']['target'].activation#model_conf['output_activation'] - num_signals = conf['data']['num_signals'] + use_signals = conf['paths']['use_signals'] + num_signals = sum([sig.num_channels for sig in use_signals]) + num_conv_filters = model_conf['num_conv_filters'] + num_conv_layers = model_conf['num_conv_layers'] + size_conv_filters = model_conf['size_conv_filters'] + pool_size = model_conf['pool_size'] + # num_signals = conf['data']['num_signals'] batch_size = self.conf['training']['batch_size'] @@ -88,19 +117,45 @@ def build_model(self,predict,custom_batch_size=None): exit(1) batch_input_shape=(batch_size,length, num_signals) - model = Sequential() - #Create layer for 7 density channels -# num_density_channels = 7 + + indices_0d,indices_1d,num_0D,num_1D = self.get_0D_1D_indices() + def slicer(x,indices): + return x[:,:,indices] + + def slicer_output_shape(input_shape,indices): + shape = list(input_shape) + assert len(shape) == 3 # only valid for 3D tensors + shape[-1] = len(indices) + return tuple(shape) + + x_input = Input(batch_shape=batch_input_shape) + if num_1D > 0: + x_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d)) (x_input) + x_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d)) (x_input) + + x_1D = TimeDistributed(Reshape(num_1D,len(indices_1d)/num_1D)) (x_1D) + for i in range(model_conf['num_conv_layers']): + x_1D = TimeDistributed(Conv1D(num_conv_filters,size_conv_filters,activation='relu')) (x_1D) + x_1D = TimeDistributed(MaxPooling1D(pool_size)) (x_1D) + x_1D = TimeDistributed(Flatten()) (x_1D) + x_in = TimeDistributed(Concatenate) ([x_0D,x_1D]) + + else: + x_in = x_input + x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) + x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) + # x = TimeDistributed(Dense(2*(num_0D+num_1D))) # model.add(TimeDistributed(Dense(num_density_channels,bias=True),batch_input_shape=batch_input_shape)) for _ in range(model_conf['rnn_layers']): - model.add(rnn_model(rnn_size, return_sequences=return_sequences,batch_input_shape=batch_input_shape, + x_in = rnn_model(rnn_size, return_sequences=return_sequences,batch_input_shape=batch_input_shape, stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob)) - model.add(Dropout(dropout_prob)) + bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) + x_in = Dropout(dropout_prob) (x_in) if return_sequences: - model.add(TimeDistributed(Dense(1,activation=output_activation))) + x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) else: - model.add(Dense(1,activation=output_activation)) + x_out = Dense(1,activation=output_activation) (x_in) + model = Model(inputs=x_input,outputs=x_out) model.compile(loss=loss_fn, optimizer=optimizer) model.reset_states() #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output diff --git a/plasma/models/data.py b/plasma/models/data.py index 15bc1c27..96a3077e 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -20,6 +20,7 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,i causal_shifts = [0 for m in machines] self.causal_shifts = causal_shifts #causal shift in ms self.is_ip = is_ip + self.num_channels = 1 def is_ip(self): return self.is_ip @@ -38,6 +39,7 @@ def is_saved(self,prepath,shot): def load_data(self,prepath,shot): if not self.is_saved(prepath,shot): + print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) return None,None,False file_path = self.get_file_path(prepath,shot) @@ -51,11 +53,43 @@ def load_data(self,prepath,shot): sig = sig[region,:] #make sure shot is not garbage data - if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1: + if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1:: + if self.is_ip: + print('shot {} has no current'.format(shot.number)) + else: + print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) return None,None,False return t,sig,True + def resample_signal(t,sig,tmin,tmax,dt): + order = np.argsort(t) + t = t[order] + sig = sig[order,:] + sig_width = sig.shape[1] + tt = np.arange(tmin,tmax,dt) + sig_interp = np.zeros((len(tt),sig_width)) + for i in range(sig_width): + f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) + sig_interp[:,i] = f(tt) + + if(np.any(np.isnan(sig_interp))): + print("signals contains nan") + if(np.any(t[1:] - t[:-1] <= 0)): + print("non increasing") + idx = np.where(t[1:] - t[:-1] <= 0)[0][0] + print(t[idx-10:idx+10]) + + return tt,sig_interp + + def cut_signal(t,sig,tmin,tmax): + mask = np.logical_and(t >= tmin, t <= tmax) + return t[mask],sig[mask,:] + + def cut_and_resample_signal(t,sig,tmin,tmax,dt): + t,sig = cut_signal(t,sig,tmin,tmax) + return resample_signal(t,sig,tmin,tmax,dt) + def is_defined_on_machine(self,machine): return machine in self.machines @@ -91,6 +125,36 @@ def __str__(self): def __repr__(self): return self.description +class ProfileSignal(Signal): + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32): + super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False) + self.mapping_range = mapping_range + self.num_channels = num_channels + + def load_data(self,prepath,shot): + if not self.is_saved(prepath,shot): + print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) + return None,None,False + + file_path = self.get_file_path(prepath,shot) + data = np.loadtxt(file_path) + _ = data[0,0] + mapping = data[0,1:] + remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) + t = data[1:,0] + sig = data[1:,1:] + if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): + print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) + return None,None,False + + timesteps = len(t) + sig_interp = np.zeros((timesteps,self.num_channels)) + for i in range(timesteps): + f = UnivariateSpline(mapping,sig[i,:],s=0,k=1,ext=0) + sig_interp[i,:] = f(remapping) + + return t,sig_interp,True + class Machine: def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): @@ -127,8 +191,10 @@ def __hash__(self,other): return self.name.__hash__() def __str__(self): - return self.name.__str__() + return self.name + def __repr__(self): + return self.__str__() def create_missing_value_filler(): time = np.linspace(0,100,100) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index d8c4b1d2..9e0ff92b 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -126,6 +126,7 @@ def load_as_X_y_pred(self,shot_list,verbose=False,custom_batch_size=None): def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): prepath = self.conf['paths']['processed_prepath'] + use_signals = self.conf['paths']['use_signals'] signals = [] results = [] disruptive = [] @@ -144,19 +145,17 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): if self.conf['training']['use_mock_data']: - sig,res = self.get_mock_data() - shot.signals = sig - shot.ttd = res - - total_length += len(shot.ttd) - signals.append(shot.signals) - res = shot.ttd - shot_lengths.append(len(shot.ttd)) + signal,ttd = self.get_mock_data() + ttd,signal = shot.get_data_arrays(use_signals) + + total_length += len(ttd) + signals.append(signal) + shot_lengths.append(len(ttd)) disruptive.append(shot.is_disruptive) - if len(res.shape) == 1: - results.append(np.expand_dims(res,axis=1)) + if len(ttd.shape) == 1: + results.append(np.expand_dims(ttd,axis=1)) else: - results.append(shot.ttd) + results.append(ttd) shot.make_light() if not prediction_mode: return signals,results,total_length diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 69d50d94..65438813 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -64,18 +64,18 @@ def train(self): conf = self.conf #only use training shots here!! "Don't touch testing shots" shot_files = conf['paths']['shot_files']# + conf['paths']['shot_files_test'] - shot_list_dir = conf['paths']['shot_list_dir'] - use_shots = max(400,int(round(0.1*conf['data']['use_shots']))) + # shot_list_dir = conf['paths']['shot_list_dir'] + use_shots = max(400,conf['data']['use_shots']) return self.train_on_files(shot_list_dir,shot_files,use_shots) - def train_on_files(self,shot_list_dir,shot_files,use_shots): + def train_on_files(self,shot_files,use_shots): conf = self.conf - shot_list = ShotList() - shot_list.load_from_files(shot_list_dir,shot_files) + all_signals = conf['paths']['all_signals'] + shot_list = ShotList().load_from_shot_list_files_objects(shot_files,all_signals) + shot_list_picked = shot_list.random_sublist(use_shots) recompute = conf['data']['recompute_normalization'] - shot_list_picked = shot_list.random_sublist(use_shots) if recompute or not self.previously_saved_stats(): use_cores = max(1,mp.cpu_count()-2) @@ -98,20 +98,19 @@ def train_on_files(self,shot_list_dir,shot_files,use_shots): def cut_end_of_shot(self,shot): T_min_warn = self.conf['data']['T_min_warn'] - shot.signals = shot.signals[:-T_min_warn] + for key in shot.signals_dict: + shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] shot.ttd = shot.ttd[:-T_min_warn] - def apply_mask(self,shot): - mask = self.conf['paths']['signals_masks'] - mask = [np.array(subl) for subl in mask] - indices = np.concatenate([indices_sublist[mask[i]] for i,indices_sublist in enumerate(self.get_indices_list())]) - shot.signals = shot.signals[:,indices] + # def apply_mask(self,shot): + # use_signals = self.conf['paths']['use_signals'] + # return shot.get_data_arrays(use_signals) - def apply_positivity_mask(self,shot): - mask = self.conf['paths']['positivity_mask'] - mask = [np.array(subl) for subl in mask] - indices = np.concatenate([indices_sublist[mask[i]] for i,indices_sublist in enumerate(self.get_indices_list())]) - shot.signals[:,indices] = np.clip(shot.signals[:,indices],0,np.Inf) + # def apply_positivity_mask(self,shot): + # mask = self.conf['paths']['positivity_mask'] + # mask = [np.array(subl) for subl in mask] + # indices = np.concatenate([indices_sublist[mask[i]] for i,indices_sublist in enumerate(self.get_indices_list())]) + # shot.signals[:,indices] = np.clip(shot.signals[:,indices],0,np.Inf) def train_on_single_shot(self,shot): assert isinstance(shot,Shot), 'should be instance of shot' @@ -125,8 +124,8 @@ def train_on_single_shot(self,shot): def previously_saved_stats(self): return os.path.isfile(self.path) - def get_indices_list(self): - return get_signal_slices(self.conf['paths']['signals_dirs']) + # def get_indices_list(self): + # return get_signal_slices(self.conf['paths']['signals_dirs']) @@ -146,9 +145,10 @@ def __str__(self): def extract_stats(self,shot): stats = Stats() if shot.valid: - indices_list = self.get_indices_list() - stats.means = np.reshape(np.array([np.mean(shot.signals[:,indices]) for indices in indices_list]),(1,len(indices_list))) - stats.stds = np.reshape(np.array([np.std(shot.signals[:,indices]) for indices in indices_list]),(1,len(indices_list))) + list_of_signals = shot.get_individual_signal_arrays() + num_signals = len(list_of_signals) + stats.means = np.reshape(np.array([np.mean(sig) for sig in list_of_signals]),(1,num_signals)) + stats.stds = np.reshape(np.array([np.std(sig) for sig in list_of_signals]),(1,num_signals)) stats.is_disruptive = shot.is_disruptive else: print('Warning: shot {} not valid, omitting'.format(shot.number)) @@ -174,12 +174,12 @@ def apply(self,shot): assert self.means is not None and self.stds is not None, "self.means or self.stds not initialized" means = np.median(self.means,axis=0) stds = np.median(self.stds,axis=0) - for (i,indices) in enumerate(self.get_indices_list()): - shot.signals[:,indices] = (shot.signals[:,indices] - means[i])/stds[i] + for (i,sig) in enumerate(shot.signals): + shot.signals_dict[sig] = (shot.signals_dict[sig] - means[i])/stds[i] shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) - self.apply_positivity_mask(shot) self.cut_end_of_shot(shot) - self.apply_mask(shot) + # self.apply_positivity_mask(shot) + # self.apply_mask(shot) def save_stats(self): @@ -205,12 +205,10 @@ class VarNormalizer(MeanVarNormalizer): def apply(self,shot): assert self.means is not None and self.stds is not None, "self.means or self.stds not initialized" stds = np.median(self.stds,axis=0) - for (i,indices) in enumerate(self.get_indices_list()): - shot.signals[:,indices] = (shot.signals[:,indices])/stds[i] + for (i,sig) in enumerate(shot.signals): + shot.signals_dict[sig] = (shot.signals_dict[sig])/stds[i] shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) - self.apply_positivity_mask(shot) self.cut_end_of_shot(shot) - self.apply_mask(shot) def __str__(self): stds = np.median(self.stds,axis=0) @@ -225,7 +223,8 @@ def apply(self,shot): window_size = self.conf['data']['window_size'] window = exponential(window_size,0,window_decay,False) window /= np.sum(window) - shot.signals = apply_along_axis(lambda m : correlate(m,window,'valid'),axis=0,arr=shot.signals) + for (i,sig) in enumerate(shot.signals): + shot.signals_dict[sig] = apply_along_axis(lambda m : correlate(m,window,'valid'),axis=0,arr=shot.signals_dict[sig]) shot.ttd = shot.ttd[-shot.signals.shape[0]:] def __str__(self): @@ -249,8 +248,9 @@ def __str__(self): def extract_stats(self,shot): stats = Stats() if shot.valid: - stats.minimums = np.min(shot.signals,0) - stats.maximums = np.max(shot.signals,0) + list_of_signals = shot.get_individual_signal_arrays() + stats.minimums = np.array([np.min(sig) for sig in list_of_signals]) + stats.maximums = np.array([np.max(sig) for sig in list_of_signals]) stats.is_disruptive = shot.is_disruptive else: print('Warning: shot {} not valid, omitting'.format(shot.number)) @@ -275,10 +275,12 @@ def incorporate_stats(self,stats): def apply(self,shot): assert(self.minimums is not None and self.maximums is not None) shot.signals = (shot.signals - self.minimums)/(self.maximums - self.minimums) + for (i,sig) in enumerate(shot.signals): + shot.signals_dict[sig] = (shot.signals_dict[sig] - self.minimums)/(self.maximums - self.minimums) shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) - self.apply_positivity_mask(shot) self.cut_end_of_shot(shot) - self.apply_mask(shot) + # self.apply_positivity_mask(shot) + # self.apply_mask(shot) def save_stats(self): # standard_deviations = dat['standard_deviations'] diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 7c2333ef..fec91893 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -49,27 +49,27 @@ def clean_shot_list(self,path): def preprocess_all(self): conf = self.conf - shot_files_train = conf['paths']['shot_files'] - shot_files_test = conf['paths']['shot_files_test'] - shot_list_dir = conf['paths']['shot_list_dir'] + shot_files_all = conf['paths']['shot_files_all'] + # shot_files_train = conf['paths']['shot_files'] + # shot_files_test = conf['paths']['shot_files_test'] + # shot_list_dir = conf['paths']['shot_list_dir'] use_shots = conf['data']['use_shots'] train_frac = conf['training']['train_frac'] use_shots_train = int(round(train_frac*use_shots)) use_shots_test = int(round((1-train_frac)*use_shots)) # print(use_shots_train) # print(use_shots_test) #each print out 100,000 - if len(shot_files_test) > 0: - return self.preprocess_from_files(shot_list_dir,shot_files_train,use_shots_train) + \ - self.preprocess_from_files(shot_list_dir,shot_files_test,use_shots_test) - else: - return self.preprocess_from_files(shot_list_dir,shot_files_train,use_shots_train) + # if len(shot_files_test) > 0: + # return self.preprocess_from_files(shot_list_dir,shot_files_train,machines_train,use_shots_train) + \ + # self.preprocess_from_files(shot_list_dir,shot_files_test,machines_train,use_shots_test) + # else: + return self.preprocess_from_files(shot_files_all,use_shots) - def preprocess_from_files(self,shot_list_dir,shot_files,use_shots): + def preprocess_from_files(self,shot_files,use_shots): #all shots, including invalid ones - shot_list = ShotList() - shot_list.load_from_files(shot_list_dir,shot_files) - + all_signals = conf['paths']['all_signals'] + shot_list = ShotList().load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) #empty @@ -93,15 +93,7 @@ def preprocess_single_file(self,shot): recompute = self.conf['data']['recompute'] # print('({}/{}): '.format(num_processed,use_shots)) if recompute or not shot.previously_saved(processed_prepath): - sys.stdout.write('\rrecomputing {}'.format(shot.number)) - #get minmax times - signals,times,t_min,t_max,t_thresh,valid = self.get_signals_and_times_from_file(shot.number,shot.t_disrupt) - #cut and resample - signals,ttd = self.cut_and_resample_signals(times,signals,t_min,t_max,shot.is_disruptive) - - shot.signals = signals - shot.ttd = ttd - shot.valid = valid + shot.preprocess() shot.save(processed_prepath) else: @@ -115,82 +107,82 @@ def get_individual_channel_dirs(self): signals_dirs = self.conf['paths']['signals_dirs'] - def get_signals_and_times_from_file(self,shot,t_disrupt): - valid = True - t_min = -1 - t_max = np.Inf - t_thresh = -1 - signals = [] - times = [] - conf = self.conf - - disruptive = t_disrupt >= 0 - - signal_prepath = conf['paths']['signal_prepath'] - signals_dirs = concatenate_sublists(conf['paths']['signals_dirs']) - current_index = conf['data']['current_index'] - current_thresh = conf['data']['current_thresh'] - current_end_thresh = conf['data']['current_end_thresh'] - for (i,dirname) in enumerate(signals_dirs): - data = np.loadtxt(get_individual_shot_file(signal_prepath+dirname + '/',shot)) - t = data[:,0] - sig = data[:,1] - t_min = max(t_min,t[0]) - t_max = min(t_max,t[-1]) - if i == current_index: - #throw out shots that never reach curren threshold - if not (np.any(abs(sig) > current_thresh)): - valid = False - print('Shot {} does not exceed current threshold... invalid.'.format(shot)) - else: - #begin shot once current reaches threshold - index_thresh = np.argwhere(abs(sig) > current_thresh)[0][0] - t_thresh = t[index_thresh] - #end shot once current drops below current_end_thresh - if not disruptive: - acceptable_region = np.zeros_like(sig,dtype=bool) - acceptable_region[index_thresh:] = True - index_end_thresh = np.argwhere(np.logical_and(abs(sig) < current_end_thresh,acceptable_region))[0][0] - t_end_thresh = t[index_end_thresh] - assert(t_thresh < t_end_thresh < t_max) - t_max = t_end_thresh - signals.append(sig) - times.append(t) - if not valid: - t_thresh = t_min - assert(t_thresh >= t_min) - assert(t_disrupt <= t_max) - if disruptive: - assert(t_thresh < t_disrupt) - t_max = t_disrupt - t_min = t_thresh - - return signals,times,t_min,t_max,t_thresh,valid - - - - def cut_and_resample_signals(self,times,signals,t_min,t_max,is_disruptive): - dt = self.conf['data']['dt'] - T_max = self.conf['data']['T_max'] - - #resample signals - signals_processed = [] - assert(len(signals) == len(times) and len(signals) > 0) - tr = 0 - for i in range(len(signals)): - tr,sigr = cut_and_resample_signal(times[i],signals[i],t_min,t_max,dt) - signals_processed.append(sigr) - - signals = signals_processed - signals = np.column_stack(signals) - - if is_disruptive: - ttd = max(tr) - tr - ttd = np.clip(ttd,0,T_max) - else: - ttd = T_max*np.ones_like(tr) - ttd = np.log10(ttd + 1.0*dt/10) - return signals,ttd + # def get_signals_and_times_from_file(self,shot,t_disrupt): + # valid = True + # t_min = -1 + # t_max = np.Inf + # t_thresh = -1 + # signals = [] + # times = [] + # conf = self.conf + + # disruptive = t_disrupt >= 0 + + # signal_prepath = conf['paths']['signal_prepath'] + # signals_dirs = concatenate_sublists(conf['paths']['signals_dirs']) + # current_index = conf['data']['current_index'] + # current_thresh = conf['data']['current_thresh'] + # current_end_thresh = conf['data']['current_end_thresh'] + # for (i,dirname) in enumerate(signals_dirs): + # data = np.loadtxt(get_individual_shot_file(signal_prepath+dirname + '/',shot)) + # t = data[:,0] + # sig = data[:,1] + # t_min = max(t_min,t[0]) + # t_max = min(t_max,t[-1]) + # if i == current_index: + # #throw out shots that never reach curren threshold + # if not (np.any(abs(sig) > current_thresh)): + # valid = False + # print('Shot {} does not exceed current threshold... invalid.'.format(shot)) + # else: + # #begin shot once current reaches threshold + # index_thresh = np.argwhere(abs(sig) > current_thresh)[0][0] + # t_thresh = t[index_thresh] + # #end shot once current drops below current_end_thresh + # if not disruptive: + # acceptable_region = np.zeros_like(sig,dtype=bool) + # acceptable_region[index_thresh:] = True + # index_end_thresh = np.argwhere(np.logical_and(abs(sig) < current_end_thresh,acceptable_region))[0][0] + # t_end_thresh = t[index_end_thresh] + # assert(t_thresh < t_end_thresh < t_max) + # t_max = t_end_thresh + # signals.append(sig) + # times.append(t) + # if not valid: + # t_thresh = t_min + # assert(t_thresh >= t_min) + # assert(t_disrupt <= t_max) + # if disruptive: + # assert(t_thresh < t_disrupt) + # t_max = t_disrupt + # t_min = t_thresh + + # return signals,times,t_min,t_max,t_thresh,valid + + + + # def cut_and_resample_signals(self,times,signals,t_min,t_max,is_disruptive): + # dt = self.conf['data']['dt'] + # T_max = self.conf['data']['T_max'] + + # #resample signals + # signals_processed = [] + # assert(len(signals) == len(times) and len(signals) > 0) + # tr = 0 + # for i in range(len(signals)): + # tr,sigr = cut_and_resample_signal(times[i],signals[i],t_min,t_max,dt) + # signals_processed.append(sigr) + + # signals = signals_processed + # signals = np.column_stack(signals) + + # if is_disruptive: + # ttd = max(tr) - tr + # ttd = np.clip(ttd,0,T_max) + # else: + # ttd = T_max*np.ones_like(tr) + # ttd = np.log10(ttd + 1.0*dt/10) + # return signals,ttd def get_shot_list_path(self,conf): diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 65a6a52a..38c34b62 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -16,6 +16,44 @@ from plasma.utils.processing import train_test_split + + +class ShotListFiles(object): + def __init__(self,machine,prepath,paths,description=''): + self.machine = machine + self.prepath = prepath + self.paths = paths + self.description = description + + def __str__(self): + s = 'machine: ' + self.machine.__str__() + s += '\n' + self.description + return s + + def __repr__(self): + return self.__str__() + + def get_single_shot_numbers_and_disruption_times(self,full_path): + data = np.loadtxt(full_path,ndmin=1,dtype={'names':('num','disrupt_times'), + 'formats':('i4','f4')}) + shots = np.array(list(zip(*data))[0]) + disrupt_times = np.array(list(zip(*data))[1]) + return shots, disrupt_times + + + def get_shot_numbers_and_disruption_times(self): + all_shots = [] + all_disruption_times = [] + all_machines_arr = [] + for path in self.paths: + full_path = self.prepath + path + shots,disruption_times = self.get_single_shot_numbers_and_disruption_times(full_path) + all_shots.append(shots) + all_disruption_times.append(disruption_times) + return np.concatenate(all_shots),np.concatenate(all_disruption_times) + + + class ShotList(object): ''' A wrapper class around list of Shot objects, providing utilities to @@ -35,34 +73,41 @@ def __init__(self,shots=None): assert(all([isinstance(shot,Shot) for shot in shots])) self.shots = [shot for shot in shots] - def load_from_files(self,shot_list_dir,shot_files,machines): - shot_numbers,disruption_times,machines = ShotList.get_multiple_shots_and_disruption_times(shot_list_dir,shot_files) - for number,t,m in list(zip(shot_numbers,disruption_times,machines)): - self.append(Shot(number=number,t_disrupt=t,machine=m)) + def load_from_shot_list_files_object(self,shot_list_files_object,signals): + machine = shot_list_files_object.machine + shot_numbers,disruption_times = shot_list_files_object.get_shot_numbers_and_disruption_times() + for number,t in list(zip(shot_numbers,disruption_times)): + self.append(Shot(number=number,t_disrupt=t,machine=machine,signals=signals)) - ######Generic Methods#### - @staticmethod - def get_shots_and_disruption_times(shots_and_disruption_times_path,machine): - data = np.loadtxt(shots_and_disruption_times_path,ndmin=1,dtype={'names':('num','disrupt_times'), - 'formats':('i4','f4')}) - shots = np.array(list(zip(*data))[0]) - disrupt_times = np.array(list(zip(*data))[1]) - machines = np.array([machine]*len(shots)) - return shots, disrupt_times, machines - @staticmethod - def get_multiple_shots_and_disruption_times(base_path,endings,machines): - all_shots = [] - all_disruption_times = [] - all_machines_arr = [] - for (ending,machine) in zip(endings,machines): - path = base_path + ending - shots,disruption_times,machines_arr = ShotList.get_shots_and_disruption_times(path,machine) - all_shots.append(shots) - all_disruption_times.append(disruption_times) - all_machines_arr.append(machines_arr) - return np.concatenate(all_shots),np.concatenate(all_disruption_times),np.concatenate(all_machines_arr) + def load_from_shot_list_files_objects(self,shot_list_files_objects,signals): + for obj in shot_list_files_objects: + self.load_from_shot_list_files_object(obj,signals) + + # ######Generic Methods#### + + # @staticmethod + # def get_shots_and_disruption_times(shots_and_disruption_times_path,machine): + # data = np.loadtxt(shots_and_disruption_times_path,ndmin=1,dtype={'names':('num','disrupt_times'), + # 'formats':('i4','f4')}) + # shots = np.array(list(zip(*data))[0]) + # disrupt_times = np.array(list(zip(*data))[1]) + # machines = np.array([machine]*len(shots)) + # return shots, disrupt_times, machines + + # @staticmethod + # def get_multiple_shots_and_disruption_times(base_path,endings,machines): + # all_shots = [] + # all_disruption_times = [] + # all_machines_arr = [] + # for (ending,machine) in zip(endings,machines): + # path = base_path + ending + # shots,disruption_times,machines_arr = ShotList.get_shots_and_disruption_times(path,machine) + # all_shots.append(shots) + # all_disruption_times.append(disruption_times) + # all_machines_arr.append(machines_arr) + # return np.concatenate(all_shots),np.concatenate(all_disruption_times),np.concatenate(all_machines_arr) def split_train_test(self,conf): @@ -174,7 +219,7 @@ class Shot(object): For 0D data, each shot is modeled as a 2D Numpy array - time vs a plasma property. ''' - def __init__(self,number=None,machine=None,signals=None,data=None,ttd=None,valid=None,is_disruptive=None,t_disrupt=None): + def __init__(self,number=None,machine=None,signals=None,signals_dict=None,ttd=None,valid=None,is_disruptive=None,t_disrupt=None): ''' Shot objects contain following attributes: @@ -187,13 +232,15 @@ def __init__(self,number=None,machine=None,signals=None,data=None,ttd=None,valid self.number = number #Shot number self.machine = machine #machine on which it is defined self.signals = signals - self.data = data + self.signals_dict = signals_dict # self.ttd = ttd self.valid =valid self.is_disruptive = is_disruptive self.t_disrupt = t_disrupt if t_disrupt is not None: self.is_disruptive = Shot.is_disruptive_given_disruption_time(t_disrupt) + else: + print('Warning, disruption time (disruptivity) not set! Either set t_disrupt or is_disruptive') def __str__(self): string = 'number: {}\n'.format(self.number) @@ -219,12 +266,90 @@ def is_valid(self): def is_disruptive_shot(self): return self.is_disruptive + def get_data_arrays(self,use_signals): + t_array = self.ttd + signal_array = np.zeros((len(ttd),sum([sig.num_channels for sig in use_signals]))) + curr_idx = 0 + for sig in use_signals: + signal_array[curr_idx:curr_idx+sig.num_channels] = self.signals_dict[sig] + curr_idx += sig.num_channels + return t_array,signal_array + + def get_individual_signal_arrays(self): + #guarantee ordering + return [self.signals_dict[sig] for sig in self.signals] + + def preprocess(self,conf): + sys.stdout.write('\rrecomputing {}'.format(self.number)) + #get minmax times + time_arrays,signal_arrays,t_min,t_max,t_thresh,valid = self.get_signals_and_times_from_file(conf) + self.valid = valid + #cut and resample + self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) + + def get_signals_and_times_from_file(self,conf): + valid = True + t_min = -1 + t_max = np.Inf + t_thresh = -1 + signal_arrays = [] + time_arrays = [] + conf = self.conf + + disruptive = self.t_disrupt >= 0 + + signal_prepath = conf['paths']['signal_prepath'] + for (i,dirname) in enumerate(self.signals): + t,sig,valid_signal = signal.load_data(signal_prepath,self) + assert(len(sig.shape) == 2) + assert(len(t.shape) == 1) + if not valid_signal: + valid = False + else: + t_min = max(t_min,t[0]) + t_max = min(t_max,t[-1]) + signal_arrays.append(sig) + time_arrays.append(t) + assert(t_max > t_min or not valid) + if disruptive: + t_max = t_disrupt + assert(self.t_disrupt <= t_max or not valid) + + return time_arrays,signal_arrays,t_min,t_max,valid + + + def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): + dt = conf['data']['dt'] + signals_dict = dict() + + #resample signals + assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) + tr = 0 + for i in range(len(signal_arrays)): + signal = self.signals[i] + tr,sigr = signal.cut_and_resample(time_arrays[i],signal_arrays[i],t_min,t_max,dt) + signals_dict[signal] = sigr + + ttd = self.convert_to_ttd(tr,conf) + self.signals_dict =signals_dict + self.ttd = ttd + + def convert_to_ttd(self,tr,conf) + T_max = conf['data']['T_max'] + if self.is_disruptive: + ttd = max(tr) - tr + ttd = np.clip(ttd,0,T_max) + else: + ttd = T_max*np.ones_like(tr) + ttd = np.log10(ttd + 1.0*dt/10) + return ttd + def save(self,prepath): if not os.path.exists(prepath): os.makedirs(prepath) save_path = self.get_save_path(prepath) np.savez(save_path,valid=self.valid,is_disruptive=self.is_disruptive, - signals=self.data,ttd=self.ttd) + signals_dict=self.signals_dict,ttd=self.ttd) print('...saved shot {}'.format(self.number)) def get_save_path(self,prepath): @@ -239,10 +364,10 @@ def restore(self,prepath,light=False): self.is_disruptive = dat['is_disruptive'][()] if light: - self.data = None + self.signals_dict = None self.ttd = None else: - self.data = dat['data'] + self.signals_dict = dat['signals_dict'] self.ttd = dat['ttd'] def previously_saved(self,prepath): @@ -250,7 +375,7 @@ def previously_saved(self,prepath): return os.path.isfile(save_path) def make_light(self): - self.data = None + self.signals_dict = None self.ttd = None @staticmethod diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 83bed538..80c5bbeb 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -25,7 +25,7 @@ # import gadata -from plasma.primitives.shots import ShotList +# from plasma.primitives.shots import ShotList #from signals import * @@ -130,10 +130,20 @@ def download_shot_numbers(shot_numbers,save_prepath,machine,signals): p.join() -def download_all_shot_numbers(prepath,save_path,shot_numbers_path,shot_numbers_files,machine,signals): +def download_all_shot_numbers(prepath,save_path,shot_list_files,signals_full): max_len = 30000 + + machine = shot_list_files.machine + signals = [sig for sig in signals if sig.is_defined_on_machine(machine)] + + signals = [] + for sig in signals_full: + if not signal.is_defined_on_machine(machine): + print('Signal {} not defined on machine {}, omitting'.format(sig,machine)) + else: + signals.append(sig) save_prepath = prepath+save_path + '/' + machine.name + '/' - shot_numbers,_,_ = ShotList.get_multiple_shots_and_disruption_times(prepath + shot_numbers_path,shot_numbers_files,[machine]*len(shot_numbers_files)) + shot_numbers,_ = shot_list_files.get_shot_numbers_and_disruption_times() shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 start_time = time.time() for shot_numbers_chunk in shot_numbers_chunks: diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index 8084466b..48f68d7d 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -15,30 +15,30 @@ from scipy.interpolate import UnivariateSpline -def resample_signal(t,sig,tmin,tmax,dt): - order = np.argsort(t) - t = t[order] - sig = sig[order] - tt = np.arange(tmin,tmax,dt) - f = UnivariateSpline(t,sig,s=0,k=1,ext=0) - sig_interp = f(tt) - - if(np.any(np.isnan(sig_interp))): - print("signals contains nan") - if(np.any(t[1:] - t[:-1] <= 0)): - print("non increasing") - idx = np.where(t[1:] - t[:-1] <= 0)[0][0] - print(t[idx-10:idx+10]) - - return tt,sig_interp - -def cut_signal(t,sig,tmin,tmax): - mask = np.logical_and(t >= tmin, t <= tmax) - return t[mask],sig[mask] - -def cut_and_resample_signal(t,sig,tmin,tmax,dt): - t,sig = cut_signal(t,sig,tmin,tmax) - return resample_signal(t,sig,tmin,tmax,dt) +# def resample_signal(t,sig,tmin,tmax,dt): +# order = np.argsort(t) +# t = t[order] +# sig = sig[order] +# tt = np.arange(tmin,tmax,dt) +# f = UnivariateSpline(t,sig,s=0,k=1,ext=0) +# sig_interp = f(tt) + +# if(np.any(np.isnan(sig_interp))): +# print("signals contains nan") +# if(np.any(t[1:] - t[:-1] <= 0)): +# print("non increasing") +# idx = np.where(t[1:] - t[:-1] <= 0)[0][0] +# print(t[idx-10:idx+10]) + +# return tt,sig_interp + +# def cut_signal(t,sig,tmin,tmax): +# mask = np.logical_and(t >= tmin, t <= tmax) +# return t[mask],sig[mask] + +# def cut_and_resample_signal(t,sig,tmin,tmax,dt): +# t,sig = cut_signal(t,sig,tmin,tmax) +# return resample_signal(t,sig,tmin,tmax,dt) def get_individual_shot_file(prepath,shot_num,ext='.txt'): return prepath + str(shot_num) + ext From c635b6bbc9ea5757eb12f6d9bc953f36ee6280c6 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 4 May 2017 02:08:37 -0400 Subject: [PATCH 013/744] beginning debugging after refactoring for 1D data --- plasma/models/data.py | 2 +- plasma/primitives/shots.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/data.py b/plasma/models/data.py index 96a3077e..1270ad18 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -53,7 +53,7 @@ def load_data(self,prepath,shot): sig = sig[region,:] #make sure shot is not garbage data - if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1:: + if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1: if self.is_ip: print('shot {} has no current'.format(shot.number)) else: diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 38c34b62..85d2c594 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -334,7 +334,7 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): self.signals_dict =signals_dict self.ttd = ttd - def convert_to_ttd(self,tr,conf) + def convert_to_ttd(self,tr,conf): T_max = conf['data']['T_max'] if self.is_disruptive: ttd = max(tr) - tr From 42ae5c1bad5a1bb69fc6a73f86af25517d538342 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 4 May 2017 02:12:17 -0400 Subject: [PATCH 014/744] beginning debugging after refactoring for 1D data --- plasma/models/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/data.py b/plasma/models/data.py index 1270ad18..b10bbbe5 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -10,7 +10,7 @@ # for i in range(len(signal_paths)) # self.signals.append(Signal(signal_descriptions[i],signal_paths[i])) -class Signal: +class Signal(object): def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,is_ip=False): assert(len(paths) == len(machines)) self.description = description @@ -156,7 +156,7 @@ def load_data(self,prepath,shot): return t,sig_interp,True -class Machine: +class Machine(object): def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): self.name = name self.server = server From 9bf9812e2e04afab95e078a5bfc224c52e0a6223 Mon Sep 17 00:00:00 2001 From: +Julian Kates-Harbeck Date: Wed, 3 May 2017 23:25:19 -0700 Subject: [PATCH 015/744] downloading works --- plasma/conf.py | 17 +++++++++-------- plasma/utils/downloading.py | 4 +--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/plasma/conf.py b/plasma/conf.py index d794034a..96e302f2 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -1,5 +1,5 @@ from plasma.conf_parser import parameters -from plasma.primitives.shots import ShotListFile +from plasma.primitives.shots import ShotListFiles import os import errno @@ -23,16 +23,17 @@ conf['paths']['all_machines'] = all_machines #shot lists -shot_list_dir = conf['paths']['shot_list_dir'] +#shot_list_dir = conf['paths']['shot_list_dir'] +shot_list_dir = '/cscratch/share/frnn/shot_lists/' -jet_carbon_wall = ShotListFile(jet,shot_list_dir,['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') -jet_iterlike_wall = ShotListFile(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') -jet_full = ShotListFile(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') +jet_carbon_wall = ShotListFiles(jet,shot_list_dir,['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') +jet_iterlike_wall = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') +jet_full = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') -d3d_full = ShotListFile(d3d,shot_list_dir,['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') -d3d_jb_full = ShotListFile(d3d,shot_list_dir,['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') +d3d_full = ShotListFiles(d3d,shot_list_dir,['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') +d3d_jb_full = ShotListFiles(d3d,shot_list_dir,['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') -nstx_full = ShotListFile(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') +nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') conf['paths']['shot_files'] = [d3d_full]#[jet_carbon_wall] conf['paths']['shot_files_test'] = []#[jet_iterlike_wall] diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 80c5bbeb..5ef1fa82 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -134,11 +134,9 @@ def download_all_shot_numbers(prepath,save_path,shot_list_files,signals_full): max_len = 30000 machine = shot_list_files.machine - signals = [sig for sig in signals if sig.is_defined_on_machine(machine)] - signals = [] for sig in signals_full: - if not signal.is_defined_on_machine(machine): + if not sig.is_defined_on_machine(machine): print('Signal {} not defined on machine {}, omitting'.format(sig,machine)) else: signals.append(sig) From 09d53781a05c69eee731f72bbbb69df9ada4a44f Mon Sep 17 00:00:00 2001 From: +Julian Kates-Harbeck Date: Thu, 4 May 2017 02:34:29 -0700 Subject: [PATCH 016/744] debugging preprocessing --- data/signals.py | 1 + examples/conf.yaml | 4 +-- plasma/models/data.py | 57 +++++++++++-------------------- plasma/models/runner.py | 2 +- plasma/preprocessor/normalize.py | 3 +- plasma/preprocessor/preprocess.py | 9 +++-- plasma/primitives/shots.py | 38 +++++++++++++-------- plasma/utils/downloading.py | 4 +-- plasma/utils/processing.py | 48 +++++++++++++++----------- setup.py | 2 +- 10 files changed, 85 insertions(+), 83 deletions(-) diff --git a/data/signals.py b/data/signals.py index c7c59c58..d76918ab 100644 --- a/data/signals.py +++ b/data/signals.py @@ -95,6 +95,7 @@ def get_units(str): pass # print ' GADATA Retrieval Time : ',time.time() - t0 + xdata = xdata*1e-3#time is measued in ms return xdata,data,ydata,found diff --git a/examples/conf.yaml b/examples/conf.yaml index 89d3cbee..e1d1bec3 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,7 +3,7 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. # for example tigress/alexeys -fs_path: '/tigress' +fs_path: '/cscratch/share/frnn' #'/tigress' target: 'hinge' paths: @@ -25,7 +25,7 @@ paths: 'jpf/df/g1r-lid:006', 'jpf/df/g1r-lid:007', 'jpf/df/g1r-lid:008']] - signal_prepath: '/signal_data/jet/' + signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' signals_masks: [['jpf/df/g1r-lid:003', 'jpf/df/g1r-lid:004', diff --git a/plasma/models/data.py b/plasma/models/data.py index b10bbbe5..c1d7c4c6 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -1,7 +1,11 @@ import numpy as np import time -import sys +import sys,os + +from scipy.interpolate import UnivariateSpline + from plasma.utils.processing import get_individual_shot_file +from plasma.utils.downloading import format_save_path # class SignalCollection: # """GA Data Obj""" @@ -25,16 +29,16 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,i def is_ip(self): return self.is_ip - def get_file_path(self,prepath,shot): - dirname = self.get_path(shot.machine) - return get_individual_shot_file(prepath+dirname + '/',shot) + def get_file_path(self,prepath,machine,shot_number): + dirname = self.get_path(machine) + return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) def is_valid(self,prepath,shot): t,data,exists = self.load_data(prepath,shot) return exists def is_saved(self,prepath,shot): - file_path = self.get_file_path(prepath,shot) + file_path = self.get_file_path(prepath,shot.machine,shot.number) return os.path.isfile(file_path) def load_data(self,prepath,shot): @@ -42,13 +46,16 @@ def load_data(self,prepath,shot): print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) return None,None,False - file_path = self.get_file_path(prepath,shot) + file_path = self.get_file_path(prepath,shot.machine,shot.number) data = np.loadtxt(file_path) + if np.ndim(data) == 1: + data = np.expand_dims(data,axis=0) + t = data[:,0] sig = data[:,1:] if self.is_ip: #restrict shot to current threshold - region = np.where(np.abs(sig) >= shot.machine.current_threshold) + region = np.where(np.abs(sig) >= shot.machine.current_threshold)[0] t = t[region] sig = sig[region,:] @@ -62,34 +69,6 @@ def load_data(self,prepath,shot): return t,sig,True - def resample_signal(t,sig,tmin,tmax,dt): - order = np.argsort(t) - t = t[order] - sig = sig[order,:] - sig_width = sig.shape[1] - tt = np.arange(tmin,tmax,dt) - sig_interp = np.zeros((len(tt),sig_width)) - for i in range(sig_width): - f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) - sig_interp[:,i] = f(tt) - - if(np.any(np.isnan(sig_interp))): - print("signals contains nan") - if(np.any(t[1:] - t[:-1] <= 0)): - print("non increasing") - idx = np.where(t[1:] - t[:-1] <= 0)[0][0] - print(t[idx-10:idx+10]) - - return tt,sig_interp - - def cut_signal(t,sig,tmin,tmax): - mask = np.logical_and(t >= tmin, t <= tmax) - return t[mask],sig[mask,:] - - def cut_and_resample_signal(t,sig,tmin,tmax,dt): - t,sig = cut_signal(t,sig,tmin,tmax) - return resample_signal(t,sig,tmin,tmax,dt) - def is_defined_on_machine(self,machine): return machine in self.machines @@ -116,7 +95,7 @@ def __eq__(self,other): def __ne__(self,other): return self.description.__ne__(other.description) - def __hash__(self,other): + def __hash__(self): return self.description.__hash__() def __str__(self): @@ -136,8 +115,10 @@ def load_data(self,prepath,shot): print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) return None,None,False - file_path = self.get_file_path(prepath,shot) + file_path = self.get_file_path(prepath,shot.machine,shot.number) data = np.loadtxt(file_path) + if np.ndim(data) == 1: + data = np.expand_dims(data,axis=0) _ = data[0,0] mapping = data[0,1:] remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) @@ -187,7 +168,7 @@ def __eq__(self,other): def __ne__(self,other): return self.name.__ne__(other.name) - def __hash__(self,other): + def __hash__(self): return self.name.__hash__() def __str__(self): diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 7590952c..966524c5 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -7,7 +7,7 @@ from itertools import imap from hyperopt import hp, STATUS_OK -from hyperas.distributions import conditional +#from hyperas.distributions import conditional import time import sys diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 65438813..50b99508 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -72,7 +72,8 @@ def train(self): def train_on_files(self,shot_files,use_shots): conf = self.conf all_signals = conf['paths']['all_signals'] - shot_list = ShotList().load_from_shot_list_files_objects(shot_files,all_signals) + shot_list = ShotList() + shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) recompute = conf['data']['recompute_normalization'] diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index fec91893..e8acb247 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -68,8 +68,9 @@ def preprocess_all(self): def preprocess_from_files(self,shot_files,use_shots): #all shots, including invalid ones - all_signals = conf['paths']['all_signals'] - shot_list = ShotList().load_from_shot_list_files_objects(shot_files,all_signals) + all_signals = self.conf['paths']['all_signals'] + shot_list = ShotList() + shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) #empty @@ -80,9 +81,11 @@ def preprocess_from_files(self,shot_files,use_shots): print('running in parallel on {} processes'.format(pool._processes)) start_time = time.time() for (i,shot) in enumerate(pool.imap_unordered(self.preprocess_single_file,shot_list_picked)): + #for (i,shot) in enumerate(map(self.preprocess_single_file,shot_list_picked)): sys.stdout.write('\r{}/{}'.format(i,len(shot_list_picked))) used_shots.append_if_valid(shot) + pool.join() print('Finished Preprocessing {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) print('{}/{} disruptive shots'.format(used_shots.num_disruptive(),len(used_shots))) @@ -93,7 +96,7 @@ def preprocess_single_file(self,shot): recompute = self.conf['data']['recompute'] # print('({}/{}): '.format(num_processed,use_shots)) if recompute or not shot.previously_saved(processed_prepath): - shot.preprocess() + shot.preprocess(self.conf) shot.save(processed_prepath) else: diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 85d2c594..af1cf248 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -10,11 +10,13 @@ from __future__ import print_function import os +import os.path +import sys import random as rnd import numpy as np -from plasma.utils.processing import train_test_split +from plasma.utils.processing import train_test_split,cut_and_resample_signal @@ -246,7 +248,7 @@ def __str__(self): string = 'number: {}\n'.format(self.number) string = 'machine: {}\n'.format(self.machine) string += 'signals: {}\n'.format(self.signals ) - string += 'data: {}\n'.format(self.data ) + string += 'signals_dict: {}\n'.format(self.signals_dict ) string += 'ttd: {}\n'.format(self.ttd ) string += 'valid: {}\n'.format(self.valid ) string += 'is_disruptive: {}\n'.format(self.is_disruptive) @@ -281,11 +283,13 @@ def get_individual_signal_arrays(self): def preprocess(self,conf): sys.stdout.write('\rrecomputing {}'.format(self.number)) + sys.stdout.flush() #get minmax times - time_arrays,signal_arrays,t_min,t_max,t_thresh,valid = self.get_signals_and_times_from_file(conf) + time_arrays,signal_arrays,t_min,t_max,valid = self.get_signals_and_times_from_file(conf) self.valid = valid #cut and resample - self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) + if self.valid: + self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) def get_signals_and_times_from_file(self,conf): valid = True @@ -294,25 +298,25 @@ def get_signals_and_times_from_file(self,conf): t_thresh = -1 signal_arrays = [] time_arrays = [] - conf = self.conf - disruptive = self.t_disrupt >= 0 + #disruptive = self.t_disrupt >= 0 signal_prepath = conf['paths']['signal_prepath'] - for (i,dirname) in enumerate(self.signals): + for (i,signal) in enumerate(self.signals): t,sig,valid_signal = signal.load_data(signal_prepath,self) - assert(len(sig.shape) == 2) - assert(len(t.shape) == 1) if not valid_signal: - valid = False + return None,None,None,None,False else: + assert(len(sig.shape) == 2) + assert(len(t.shape) == 1) + assert(len(t) > 1) t_min = max(t_min,t[0]) t_max = min(t_max,t[-1]) signal_arrays.append(sig) time_arrays.append(t) assert(t_max > t_min or not valid) - if disruptive: - t_max = t_disrupt + if self.is_disruptive: + t_max = self.t_disrupt assert(self.t_disrupt <= t_max or not valid) return time_arrays,signal_arrays,t_min,t_max,valid @@ -325,9 +329,12 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): #resample signals assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) tr = 0 - for i in range(len(signal_arrays)): - signal = self.signals[i] - tr,sigr = signal.cut_and_resample(time_arrays[i],signal_arrays[i],t_min,t_max,dt) + for (i,signal) in enumerate(self.signals): + sys.stdout.write(time_arrays[i].shape.__str__()) + sys.stdout.write(signal_arrays[i].shape.__str__()) + tr,sigr = cut_and_resample_signal(time_arrays[i],signal_arrays[i],t_min,t_max,dt) + sys.stdout.write('success') + sys.stdout.flush() signals_dict[signal] = sigr ttd = self.convert_to_ttd(tr,conf) @@ -336,6 +343,7 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): def convert_to_ttd(self,tr,conf): T_max = conf['data']['T_max'] + dt = conf['data']['dt'] if self.is_disruptive: ttd = max(tr) - tr ttd = np.clip(ttd,0,T_max) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 5ef1fa82..a43d6d09 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -56,7 +56,7 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): shot_complete = True for signal in signals: signal_path = signal.get_path(machine) - save_path_full = format_save_path(save_prepath,signal_path,shot_num) + save_path_full = signal.get_file_path(save_prepath,machine,shot_num) success = False mapping = None if os.path.isfile(save_path_full): @@ -140,7 +140,7 @@ def download_all_shot_numbers(prepath,save_path,shot_list_files,signals_full): print('Signal {} not defined on machine {}, omitting'.format(sig,machine)) else: signals.append(sig) - save_prepath = prepath+save_path + '/' + machine.name + '/' + save_prepath = prepath+save_path + '/' shot_numbers,_ = shot_list_files.get_shot_numbers_and_disruption_times() shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 start_time = time.time() diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index 48f68d7d..5904e1fb 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -13,32 +13,40 @@ import numpy as np from scipy.interpolate import UnivariateSpline +import sys -# def resample_signal(t,sig,tmin,tmax,dt): -# order = np.argsort(t) -# t = t[order] -# sig = sig[order] -# tt = np.arange(tmin,tmax,dt) -# f = UnivariateSpline(t,sig,s=0,k=1,ext=0) -# sig_interp = f(tt) -# if(np.any(np.isnan(sig_interp))): -# print("signals contains nan") -# if(np.any(t[1:] - t[:-1] <= 0)): -# print("non increasing") -# idx = np.where(t[1:] - t[:-1] <= 0)[0][0] -# print(t[idx-10:idx+10]) -# return tt,sig_interp +def resample_signal(t,sig,tmin,tmax,dt): + order = np.argsort(t) + t = t[order] + sig = sig[order,:] + sig_width = sig.shape[1] + tt = np.arange(tmin,tmax,dt) + sig_interp = np.zeros((len(tt),sig_width)) + for i in range(sig_width): + f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) + sig_interp[:,i] = f(tt) -# def cut_signal(t,sig,tmin,tmax): -# mask = np.logical_and(t >= tmin, t <= tmax) -# return t[mask],sig[mask] + if(np.any(np.isnan(sig_interp))): + print("signals contains nan") + if(np.any(t[1:] - t[:-1] <= 0)): + print("non increasing") + idx = np.where(t[1:] - t[:-1] <= 0)[0][0] + print(t[idx-10:idx+10]) -# def cut_and_resample_signal(t,sig,tmin,tmax,dt): -# t,sig = cut_signal(t,sig,tmin,tmax) -# return resample_signal(t,sig,tmin,tmax,dt) + return tt,sig_interp + +def cut_signal(t,sig,tmin,tmax): + mask = np.logical_and(t >= tmin, t <= tmax) + sys.stdout.write((tmin,tmax).__str__()) + sys.stdout.flush() + return t[mask],sig[mask,:] + +def cut_and_resample_signal(t,sig,tmin,tmax,dt): + t,sig = cut_signal(t,sig,tmin,tmax) + return resample_signal(t,sig,tmin,tmax,dt) def get_individual_shot_file(prepath,shot_num,ext='.txt'): return prepath + str(shot_num) + ext diff --git a/setup.py b/setup.py index 37ce0325..5d8e50b7 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras','theano','pathos','matplotlib'], + install_requires = ['keras','theano','pathos','matplotlib','hyperopt'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From 9160794688e01393ba8254cc32fb828fa9786304 Mon Sep 17 00:00:00 2001 From: +Julian Kates-Harbeck Date: Thu, 4 May 2017 19:39:27 -0700 Subject: [PATCH 017/744] added smaller d3d shotlists --- data/shot_lists/d3d/d3d_clear_100.txt | 100 + data/shot_lists/d3d/d3d_clear_1000.txt | 1000 ++ data/shot_lists/d3d/d3d_clear_10000.txt | 10000 ++++++++++++++++++++ data/shot_lists/d3d/d3d_disrupt_100.txt | 100 + data/shot_lists/d3d/d3d_disrupt_1000.txt | 1000 ++ data/shot_lists/d3d/d3d_disrupt_10000.txt | 10000 ++++++++++++++++++++ 6 files changed, 22200 insertions(+) create mode 100644 data/shot_lists/d3d/d3d_clear_100.txt create mode 100644 data/shot_lists/d3d/d3d_clear_1000.txt create mode 100644 data/shot_lists/d3d/d3d_clear_10000.txt create mode 100644 data/shot_lists/d3d/d3d_disrupt_100.txt create mode 100644 data/shot_lists/d3d/d3d_disrupt_1000.txt create mode 100644 data/shot_lists/d3d/d3d_disrupt_10000.txt diff --git a/data/shot_lists/d3d/d3d_clear_100.txt b/data/shot_lists/d3d/d3d_clear_100.txt new file mode 100644 index 00000000..99153578 --- /dev/null +++ b/data/shot_lists/d3d/d3d_clear_100.txt @@ -0,0 +1,100 @@ +167475 -1.000000 +167481 -1.000000 +167482 -1.000000 +167483 -1.000000 +167484 -1.000000 +167485 -1.000000 +167486 -1.000000 +167489 -1.000000 +167490 -1.000000 +167491 -1.000000 +167493 -1.000000 +167495 -1.000000 +167499 -1.000000 +167502 -1.000000 +167504 -1.000000 +167506 -1.000000 +167515 -1.000000 +167516 -1.000000 +167517 -1.000000 +167518 -1.000000 +167519 -1.000000 +167520 -1.000000 +167521 -1.000000 +167522 -1.000000 +167523 -1.000000 +167524 -1.000000 +167525 -1.000000 +167526 -1.000000 +167527 -1.000000 +167528 -1.000000 +167529 -1.000000 +167530 -1.000000 +167531 -1.000000 +167532 -1.000000 +167533 -1.000000 +167534 -1.000000 +167535 -1.000000 +167536 -1.000000 +167537 -1.000000 +167538 -1.000000 +167539 -1.000000 +167540 -1.000000 +167541 -1.000000 +167542 -1.000000 +167547 -1.000000 +167548 -1.000000 +167549 -1.000000 +167551 -1.000000 +167552 -1.000000 +167553 -1.000000 +167554 -1.000000 +167555 -1.000000 +167563 -1.000000 +167567 -1.000000 +167568 -1.000000 +167569 -1.000000 +167570 -1.000000 +167571 -1.000000 +167572 -1.000000 +167574 -1.000000 +167575 -1.000000 +167576 -1.000000 +167577 -1.000000 +167578 -1.000000 +167579 -1.000000 +167580 -1.000000 +167589 -1.000000 +167600 -1.000000 +167601 -1.000000 +167602 -1.000000 +167603 -1.000000 +167605 -1.000000 +167606 -1.000000 +167607 -1.000000 +167608 -1.000000 +167618 -1.000000 +168439 -1.000000 +168440 -1.000000 +168441 -1.000000 +168444 -1.000000 +168450 -1.000000 +168451 -1.000000 +168484 -1.000000 +168487 -1.000000 +168488 -1.000000 +168490 -1.000000 +168491 -1.000000 +168500 -1.000000 +168504 -1.000000 +168516 -1.000000 +168519 -1.000000 +168529 -1.000000 +168530 -1.000000 +168534 -1.000000 +168536 -1.000000 +168537 -1.000000 +168544 -1.000000 +168548 -1.000000 +168551 -1.000000 +168554 -1.000000 diff --git a/data/shot_lists/d3d/d3d_clear_1000.txt b/data/shot_lists/d3d/d3d_clear_1000.txt new file mode 100644 index 00000000..4cd4285b --- /dev/null +++ b/data/shot_lists/d3d/d3d_clear_1000.txt @@ -0,0 +1,1000 @@ +165500 -1.000000 +165501 -1.000000 +165502 -1.000000 +165504 -1.000000 +165505 -1.000000 +165506 -1.000000 +165507 -1.000000 +165508 -1.000000 +165509 -1.000000 +165510 -1.000000 +165512 -1.000000 +165513 -1.000000 +165514 -1.000000 +165515 -1.000000 +165516 -1.000000 +165518 -1.000000 +165520 -1.000000 +165530 -1.000000 +165537 -1.000000 +165538 -1.000000 +165541 -1.000000 +165545 -1.000000 +165546 -1.000000 +165547 -1.000000 +165548 -1.000000 +165549 -1.000000 +165550 -1.000000 +165551 -1.000000 +165552 -1.000000 +165554 -1.000000 +165555 -1.000000 +165556 -1.000000 +165557 -1.000000 +165558 -1.000000 +165559 -1.000000 +165674 -1.000000 +165675 -1.000000 +165679 -1.000000 +165683 -1.000000 +165684 -1.000000 +165685 -1.000000 +165687 -1.000000 +165689 -1.000000 +165690 -1.000000 +165692 -1.000000 +165707 -1.000000 +165708 -1.000000 +165710 -1.000000 +165713 -1.000000 +165714 -1.000000 +165719 -1.000000 +165720 -1.000000 +165721 -1.000000 +165723 -1.000000 +165725 -1.000000 +165730 -1.000000 +165732 -1.000000 +165733 -1.000000 +165742 -1.000000 +165743 -1.000000 +165744 -1.000000 +165745 -1.000000 +165746 -1.000000 +165747 -1.000000 +165748 -1.000000 +165749 -1.000000 +165750 -1.000000 +165751 -1.000000 +165752 -1.000000 +165753 -1.000000 +165754 -1.000000 +165756 -1.000000 +165757 -1.000000 +165758 -1.000000 +165759 -1.000000 +165760 -1.000000 +165761 -1.000000 +165762 -1.000000 +165763 -1.000000 +165764 -1.000000 +165765 -1.000000 +165766 -1.000000 +165767 -1.000000 +165768 -1.000000 +165769 -1.000000 +165770 -1.000000 +165771 -1.000000 +165772 -1.000000 +165773 -1.000000 +165774 -1.000000 +165776 -1.000000 +165777 -1.000000 +165778 -1.000000 +165779 -1.000000 +165810 -1.000000 +165813 -1.000000 +165818 -1.000000 +165820 -1.000000 +165829 -1.000000 +165842 -1.000000 +165843 -1.000000 +165844 -1.000000 +165846 -1.000000 +165847 -1.000000 +165849 -1.000000 +165852 -1.000000 +165853 -1.000000 +165854 -1.000000 +165857 -1.000000 +165859 -1.000000 +165860 -1.000000 +165861 -1.000000 +165862 -1.000000 +165863 -1.000000 +165864 -1.000000 +165865 -1.000000 +165866 -1.000000 +165867 -1.000000 +165868 -1.000000 +165869 -1.000000 +165870 -1.000000 +165871 -1.000000 +165872 -1.000000 +165873 -1.000000 +165874 -1.000000 +165875 -1.000000 +165876 -1.000000 +165877 -1.000000 +165878 -1.000000 +165885 -1.000000 +165887 -1.000000 +165888 -1.000000 +165889 -1.000000 +165890 -1.000000 +165891 -1.000000 +165892 -1.000000 +165893 -1.000000 +165894 -1.000000 +165895 -1.000000 +165896 -1.000000 +165897 -1.000000 +165898 -1.000000 +165904 -1.000000 +165905 -1.000000 +165906 -1.000000 +165910 -1.000000 +165917 -1.000000 +165918 -1.000000 +165919 -1.000000 +165920 -1.000000 +165921 -1.000000 +165922 -1.000000 +165923 -1.000000 +165924 -1.000000 +165925 -1.000000 +165926 -1.000000 +165927 -1.000000 +165928 -1.000000 +165929 -1.000000 +165930 -1.000000 +165931 -1.000000 +165932 -1.000000 +165933 -1.000000 +165934 -1.000000 +165935 -1.000000 +165936 -1.000000 +165937 -1.000000 +165938 -1.000000 +165939 -1.000000 +165940 -1.000000 +165941 -1.000000 +165942 -1.000000 +165943 -1.000000 +165944 -1.000000 +165948 -1.000000 +165949 -1.000000 +165950 -1.000000 +165951 -1.000000 +165952 -1.000000 +165953 -1.000000 +165954 -1.000000 +165955 -1.000000 +165956 -1.000000 +165957 -1.000000 +165958 -1.000000 +165959 -1.000000 +165960 -1.000000 +165961 -1.000000 +165962 -1.000000 +165963 -1.000000 +165964 -1.000000 +165965 -1.000000 +165971 -1.000000 +165972 -1.000000 +165973 -1.000000 +165974 -1.000000 +165975 -1.000000 +165976 -1.000000 +165977 -1.000000 +165980 -1.000000 +166009 -1.000000 +166010 -1.000000 +166013 -1.000000 +166021 -1.000000 +166023 -1.000000 +166025 -1.000000 +166026 -1.000000 +166027 -1.000000 +166029 -1.000000 +166030 -1.000000 +166031 -1.000000 +166032 -1.000000 +166033 -1.000000 +166034 -1.000000 +166035 -1.000000 +166036 -1.000000 +166037 -1.000000 +166040 -1.000000 +166041 -1.000000 +166042 -1.000000 +166043 -1.000000 +166044 -1.000000 +166045 -1.000000 +166046 -1.000000 +166048 -1.000000 +166050 -1.000000 +166051 -1.000000 +166052 -1.000000 +166054 -1.000000 +166055 -1.000000 +166060 -1.000000 +166061 -1.000000 +166062 -1.000000 +166063 -1.000000 +166064 -1.000000 +166065 -1.000000 +166066 -1.000000 +166067 -1.000000 +166068 -1.000000 +166069 -1.000000 +166070 -1.000000 +166071 -1.000000 +166073 -1.000000 +166074 -1.000000 +166075 -1.000000 +166077 -1.000000 +166078 -1.000000 +166080 -1.000000 +166081 -1.000000 +166083 -1.000000 +166084 -1.000000 +166085 -1.000000 +166086 -1.000000 +166087 -1.000000 +166089 -1.000000 +166091 -1.000000 +166092 -1.000000 +166093 -1.000000 +166094 -1.000000 +166102 -1.000000 +166103 -1.000000 +166104 -1.000000 +166105 -1.000000 +166106 -1.000000 +166107 -1.000000 +166108 -1.000000 +166109 -1.000000 +166110 -1.000000 +166111 -1.000000 +166112 -1.000000 +166113 -1.000000 +166114 -1.000000 +166115 -1.000000 +166117 -1.000000 +166120 -1.000000 +166122 -1.000000 +166123 -1.000000 +166124 -1.000000 +166126 -1.000000 +166127 -1.000000 +166129 -1.000000 +166130 -1.000000 +166131 -1.000000 +166135 -1.000000 +166136 -1.000000 +166137 -1.000000 +166138 -1.000000 +166140 -1.000000 +166141 -1.000000 +166142 -1.000000 +166143 -1.000000 +166144 -1.000000 +166145 -1.000000 +166146 -1.000000 +166147 -1.000000 +166149 -1.000000 +166150 -1.000000 +166151 -1.000000 +166156 -1.000000 +166158 -1.000000 +166162 -1.000000 +166163 -1.000000 +166168 -1.000000 +166169 -1.000000 +166171 -1.000000 +166172 -1.000000 +166173 -1.000000 +166174 -1.000000 +166175 -1.000000 +166176 -1.000000 +166177 -1.000000 +166181 -1.000000 +166182 -1.000000 +166183 -1.000000 +166189 -1.000000 +166253 -1.000000 +166256 -1.000000 +166259 -1.000000 +166263 -1.000000 +166264 -1.000000 +166265 -1.000000 +166266 -1.000000 +166267 -1.000000 +166283 -1.000000 +166286 -1.000000 +166303 -1.000000 +166308 -1.000000 +166309 -1.000000 +166310 -1.000000 +166313 -1.000000 +166316 -1.000000 +166317 -1.000000 +166326 -1.000000 +166327 -1.000000 +166335 -1.000000 +166336 -1.000000 +166337 -1.000000 +166338 -1.000000 +166339 -1.000000 +166340 -1.000000 +166343 -1.000000 +166345 -1.000000 +166346 -1.000000 +166347 -1.000000 +166348 -1.000000 +166349 -1.000000 +166350 -1.000000 +166351 -1.000000 +166352 -1.000000 +166353 -1.000000 +166354 -1.000000 +166355 -1.000000 +166356 -1.000000 +166357 -1.000000 +166358 -1.000000 +166359 -1.000000 +166360 -1.000000 +166361 -1.000000 +166362 -1.000000 +166386 -1.000000 +166387 -1.000000 +166388 -1.000000 +166389 -1.000000 +166390 -1.000000 +166391 -1.000000 +166392 -1.000000 +166393 -1.000000 +166394 -1.000000 +166396 -1.000000 +166397 -1.000000 +166398 -1.000000 +166399 -1.000000 +166400 -1.000000 +166401 -1.000000 +166402 -1.000000 +166403 -1.000000 +166407 -1.000000 +166408 -1.000000 +166409 -1.000000 +166410 -1.000000 +166411 -1.000000 +166412 -1.000000 +166415 -1.000000 +166416 -1.000000 +166417 -1.000000 +166419 -1.000000 +166420 -1.000000 +166421 -1.000000 +166428 -1.000000 +166429 -1.000000 +166430 -1.000000 +166431 -1.000000 +166432 -1.000000 +166433 -1.000000 +166434 -1.000000 +166442 -1.000000 +166444 -1.000000 +166455 -1.000000 +166480 -1.000000 +166481 -1.000000 +166482 -1.000000 +166483 -1.000000 +166484 -1.000000 +166485 -1.000000 +166486 -1.000000 +166487 -1.000000 +166488 -1.000000 +166489 -1.000000 +166490 -1.000000 +166491 -1.000000 +166492 -1.000000 +166494 -1.000000 +166495 -1.000000 +166496 -1.000000 +166497 -1.000000 +166498 -1.000000 +166499 -1.000000 +166501 -1.000000 +166504 -1.000000 +166505 -1.000000 +166506 -1.000000 +166507 -1.000000 +166508 -1.000000 +166509 -1.000000 +166515 -1.000000 +166516 -1.000000 +166517 -1.000000 +166518 -1.000000 +166519 -1.000000 +166520 -1.000000 +166521 -1.000000 +166522 -1.000000 +166523 -1.000000 +166524 -1.000000 +166525 -1.000000 +166526 -1.000000 +166528 -1.000000 +166529 -1.000000 +166530 -1.000000 +166531 -1.000000 +166532 -1.000000 +166533 -1.000000 +166534 -1.000000 +166535 -1.000000 +166536 -1.000000 +166537 -1.000000 +166538 -1.000000 +166539 -1.000000 +166540 -1.000000 +166541 -1.000000 +166542 -1.000000 +166543 -1.000000 +166548 -1.000000 +166549 -1.000000 +166556 -1.000000 +166557 -1.000000 +166558 -1.000000 +166561 -1.000000 +166566 -1.000000 +166567 -1.000000 +166568 -1.000000 +166569 -1.000000 +166572 -1.000000 +166573 -1.000000 +166574 -1.000000 +166577 -1.000000 +166578 -1.000000 +166579 -1.000000 +166580 -1.000000 +166581 -1.000000 +166582 -1.000000 +166583 -1.000000 +166584 -1.000000 +166585 -1.000000 +166593 -1.000000 +166595 -1.000000 +166596 -1.000000 +166597 -1.000000 +166598 -1.000000 +166600 -1.000000 +166602 -1.000000 +166603 -1.000000 +166604 -1.000000 +166606 -1.000000 +166608 -1.000000 +166609 -1.000000 +166612 -1.000000 +166613 -1.000000 +166614 -1.000000 +166615 -1.000000 +166617 -1.000000 +166618 -1.000000 +166619 -1.000000 +166620 -1.000000 +166621 -1.000000 +166626 -1.000000 +166628 -1.000000 +166634 -1.000000 +166647 -1.000000 +166661 -1.000000 +166662 -1.000000 +166668 -1.000000 +166669 -1.000000 +166670 -1.000000 +166676 -1.000000 +166678 -1.000000 +166679 -1.000000 +166680 -1.000000 +166683 -1.000000 +166685 -1.000000 +166690 -1.000000 +166695 -1.000000 +166696 -1.000000 +166697 -1.000000 +166698 -1.000000 +166699 -1.000000 +166700 -1.000000 +166701 -1.000000 +166702 -1.000000 +166703 -1.000000 +166704 -1.000000 +166705 -1.000000 +166710 -1.000000 +166711 -1.000000 +166717 -1.000000 +166718 -1.000000 +166720 -1.000000 +166721 -1.000000 +166722 -1.000000 +166723 -1.000000 +166724 -1.000000 +166725 -1.000000 +166726 -1.000000 +166727 -1.000000 +166728 -1.000000 +166730 -1.000000 +166731 -1.000000 +166732 -1.000000 +166733 -1.000000 +166734 -1.000000 +166736 -1.000000 +166737 -1.000000 +166739 -1.000000 +166740 -1.000000 +166777 -1.000000 +166782 -1.000000 +166785 -1.000000 +166786 -1.000000 +166787 -1.000000 +166788 -1.000000 +166789 -1.000000 +166790 -1.000000 +166791 -1.000000 +166793 -1.000000 +166794 -1.000000 +166795 -1.000000 +166797 -1.000000 +166798 -1.000000 +166812 -1.000000 +166813 -1.000000 +166814 -1.000000 +166833 -1.000000 +166838 -1.000000 +166839 -1.000000 +166841 -1.000000 +166842 -1.000000 +166843 -1.000000 +166844 -1.000000 +166845 -1.000000 +166846 -1.000000 +166847 -1.000000 +166848 -1.000000 +166849 -1.000000 +166850 -1.000000 +166851 -1.000000 +166852 -1.000000 +166853 -1.000000 +166854 -1.000000 +166857 -1.000000 +166858 -1.000000 +166868 -1.000000 +166883 -1.000000 +166889 -1.000000 +166899 -1.000000 +166900 -1.000000 +166901 -1.000000 +166902 -1.000000 +166903 -1.000000 +166904 -1.000000 +166905 -1.000000 +166906 -1.000000 +166907 -1.000000 +166908 -1.000000 +166909 -1.000000 +166911 -1.000000 +166912 -1.000000 +166916 -1.000000 +166917 -1.000000 +166920 -1.000000 +166921 -1.000000 +166922 -1.000000 +166923 -1.000000 +166946 -1.000000 +166947 -1.000000 +166948 -1.000000 +166949 -1.000000 +166951 -1.000000 +167060 -1.000000 +167061 -1.000000 +167062 -1.000000 +167064 -1.000000 +167069 -1.000000 +167070 -1.000000 +167071 -1.000000 +167072 -1.000000 +167073 -1.000000 +167074 -1.000000 +167075 -1.000000 +167076 -1.000000 +167077 -1.000000 +167078 -1.000000 +167079 -1.000000 +167080 -1.000000 +167081 -1.000000 +167082 -1.000000 +167083 -1.000000 +167084 -1.000000 +167087 -1.000000 +167088 -1.000000 +167089 -1.000000 +167090 -1.000000 +167091 -1.000000 +167092 -1.000000 +167093 -1.000000 +167095 -1.000000 +167097 -1.000000 +167104 -1.000000 +167109 -1.000000 +167110 -1.000000 +167111 -1.000000 +167112 -1.000000 +167113 -1.000000 +167114 -1.000000 +167115 -1.000000 +167116 -1.000000 +167117 -1.000000 +167119 -1.000000 +167120 -1.000000 +167129 -1.000000 +167130 -1.000000 +167131 -1.000000 +167132 -1.000000 +167134 -1.000000 +167135 -1.000000 +167136 -1.000000 +167138 -1.000000 +167139 -1.000000 +167140 -1.000000 +167141 -1.000000 +167142 -1.000000 +167143 -1.000000 +167144 -1.000000 +167145 -1.000000 +167147 -1.000000 +167148 -1.000000 +167149 -1.000000 +167151 -1.000000 +167152 -1.000000 +167153 -1.000000 +167160 -1.000000 +167161 -1.000000 +167162 -1.000000 +167164 -1.000000 +167165 -1.000000 +167166 -1.000000 +167167 -1.000000 +167168 -1.000000 +167169 -1.000000 +167170 -1.000000 +167171 -1.000000 +167172 -1.000000 +167173 -1.000000 +167174 -1.000000 +167175 -1.000000 +167176 -1.000000 +167177 -1.000000 +167179 -1.000000 +167180 -1.000000 +167181 -1.000000 +167182 -1.000000 +167183 -1.000000 +167184 -1.000000 +167185 -1.000000 +167190 -1.000000 +167191 -1.000000 +167192 -1.000000 +167193 -1.000000 +167194 -1.000000 +167195 -1.000000 +167196 -1.000000 +167197 -1.000000 +167198 -1.000000 +167199 -1.000000 +167200 -1.000000 +167201 -1.000000 +167202 -1.000000 +167203 -1.000000 +167204 -1.000000 +167205 -1.000000 +167206 -1.000000 +167207 -1.000000 +167208 -1.000000 +167209 -1.000000 +167210 -1.000000 +167211 -1.000000 +167212 -1.000000 +167213 -1.000000 +167214 -1.000000 +167215 -1.000000 +167216 -1.000000 +167217 -1.000000 +167218 -1.000000 +167219 -1.000000 +167220 -1.000000 +167223 -1.000000 +167225 -1.000000 +167226 -1.000000 +167227 -1.000000 +167228 -1.000000 +167229 -1.000000 +167230 -1.000000 +167231 -1.000000 +167232 -1.000000 +167233 -1.000000 +167234 -1.000000 +167235 -1.000000 +167236 -1.000000 +167237 -1.000000 +167238 -1.000000 +167239 -1.000000 +167240 -1.000000 +167241 -1.000000 +167242 -1.000000 +167243 -1.000000 +167244 -1.000000 +167246 -1.000000 +167247 -1.000000 +167251 -1.000000 +167252 -1.000000 +167253 -1.000000 +167254 -1.000000 +167255 -1.000000 +167256 -1.000000 +167257 -1.000000 +167258 -1.000000 +167259 -1.000000 +167260 -1.000000 +167261 -1.000000 +167262 -1.000000 +167263 -1.000000 +167264 -1.000000 +167265 -1.000000 +167266 -1.000000 +167267 -1.000000 +167268 -1.000000 +167270 -1.000000 +167271 -1.000000 +167272 -1.000000 +167273 -1.000000 +167274 -1.000000 +167275 -1.000000 +167276 -1.000000 +167277 -1.000000 +167279 -1.000000 +167280 -1.000000 +167281 -1.000000 +167284 -1.000000 +167285 -1.000000 +167286 -1.000000 +167287 -1.000000 +167291 -1.000000 +167292 -1.000000 +167293 -1.000000 +167294 -1.000000 +167295 -1.000000 +167296 -1.000000 +167297 -1.000000 +167298 -1.000000 +167299 -1.000000 +167300 -1.000000 +167301 -1.000000 +167302 -1.000000 +167303 -1.000000 +167305 -1.000000 +167306 -1.000000 +167307 -1.000000 +167308 -1.000000 +167309 -1.000000 +167310 -1.000000 +167311 -1.000000 +167313 -1.000000 +167314 -1.000000 +167315 -1.000000 +167317 -1.000000 +167318 -1.000000 +167319 -1.000000 +167320 -1.000000 +167321 -1.000000 +167322 -1.000000 +167328 -1.000000 +167329 -1.000000 +167330 -1.000000 +167331 -1.000000 +167332 -1.000000 +167348 -1.000000 +167349 -1.000000 +167350 -1.000000 +167351 -1.000000 +167353 -1.000000 +167354 -1.000000 +167355 -1.000000 +167356 -1.000000 +167357 -1.000000 +167358 -1.000000 +167364 -1.000000 +167365 -1.000000 +167366 -1.000000 +167367 -1.000000 +167368 -1.000000 +167369 -1.000000 +167370 -1.000000 +167371 -1.000000 +167372 -1.000000 +167373 -1.000000 +167374 -1.000000 +167375 -1.000000 +167376 -1.000000 +167377 -1.000000 +167378 -1.000000 +167379 -1.000000 +167380 -1.000000 +167381 -1.000000 +167382 -1.000000 +167383 -1.000000 +167384 -1.000000 +167385 -1.000000 +167386 -1.000000 +167387 -1.000000 +167388 -1.000000 +167389 -1.000000 +167390 -1.000000 +167391 -1.000000 +167392 -1.000000 +167393 -1.000000 +167399 -1.000000 +167400 -1.000000 +167401 -1.000000 +167402 -1.000000 +167403 -1.000000 +167404 -1.000000 +167405 -1.000000 +167406 -1.000000 +167408 -1.000000 +167409 -1.000000 +167410 -1.000000 +167411 -1.000000 +167412 -1.000000 +167413 -1.000000 +167414 -1.000000 +167416 -1.000000 +167417 -1.000000 +167418 -1.000000 +167419 -1.000000 +167420 -1.000000 +167421 -1.000000 +167422 -1.000000 +167423 -1.000000 +167424 -1.000000 +167425 -1.000000 +167430 -1.000000 +167431 -1.000000 +167432 -1.000000 +167433 -1.000000 +167434 -1.000000 +167435 -1.000000 +167437 -1.000000 +167439 -1.000000 +167440 -1.000000 +167441 -1.000000 +167443 -1.000000 +167444 -1.000000 +167449 -1.000000 +167451 -1.000000 +167453 -1.000000 +167455 -1.000000 +167457 -1.000000 +167460 -1.000000 +167463 -1.000000 +167473 -1.000000 +167474 -1.000000 +167475 -1.000000 +167481 -1.000000 +167482 -1.000000 +167483 -1.000000 +167484 -1.000000 +167485 -1.000000 +167486 -1.000000 +167489 -1.000000 +167490 -1.000000 +167491 -1.000000 +167493 -1.000000 +167495 -1.000000 +167499 -1.000000 +167502 -1.000000 +167504 -1.000000 +167506 -1.000000 +167515 -1.000000 +167516 -1.000000 +167517 -1.000000 +167518 -1.000000 +167519 -1.000000 +167520 -1.000000 +167521 -1.000000 +167522 -1.000000 +167523 -1.000000 +167524 -1.000000 +167525 -1.000000 +167526 -1.000000 +167527 -1.000000 +167528 -1.000000 +167529 -1.000000 +167530 -1.000000 +167531 -1.000000 +167532 -1.000000 +167533 -1.000000 +167534 -1.000000 +167535 -1.000000 +167536 -1.000000 +167537 -1.000000 +167538 -1.000000 +167539 -1.000000 +167540 -1.000000 +167541 -1.000000 +167542 -1.000000 +167547 -1.000000 +167548 -1.000000 +167549 -1.000000 +167551 -1.000000 +167552 -1.000000 +167553 -1.000000 +167554 -1.000000 +167555 -1.000000 +167563 -1.000000 +167567 -1.000000 +167568 -1.000000 +167569 -1.000000 +167570 -1.000000 +167571 -1.000000 +167572 -1.000000 +167574 -1.000000 +167575 -1.000000 +167576 -1.000000 +167577 -1.000000 +167578 -1.000000 +167579 -1.000000 +167580 -1.000000 +167589 -1.000000 +167600 -1.000000 +167601 -1.000000 +167602 -1.000000 +167603 -1.000000 +167605 -1.000000 +167606 -1.000000 +167607 -1.000000 +167608 -1.000000 +167618 -1.000000 +168439 -1.000000 +168440 -1.000000 +168441 -1.000000 +168444 -1.000000 +168450 -1.000000 +168451 -1.000000 +168484 -1.000000 +168487 -1.000000 +168488 -1.000000 +168490 -1.000000 +168491 -1.000000 +168500 -1.000000 +168504 -1.000000 +168516 -1.000000 +168519 -1.000000 +168529 -1.000000 +168530 -1.000000 +168534 -1.000000 +168536 -1.000000 +168537 -1.000000 +168544 -1.000000 +168548 -1.000000 +168551 -1.000000 +168554 -1.000000 diff --git a/data/shot_lists/d3d/d3d_clear_10000.txt b/data/shot_lists/d3d/d3d_clear_10000.txt new file mode 100644 index 00000000..5c056208 --- /dev/null +++ b/data/shot_lists/d3d/d3d_clear_10000.txt @@ -0,0 +1,10000 @@ +143800 -1.000000 +143801 -1.000000 +143802 -1.000000 +143803 -1.000000 +143804 -1.000000 +143805 -1.000000 +143806 -1.000000 +143807 -1.000000 +143808 -1.000000 +143809 -1.000000 +143810 -1.000000 +143811 -1.000000 +143812 -1.000000 +143813 -1.000000 +143814 -1.000000 +143815 -1.000000 +143816 -1.000000 +143817 -1.000000 +143818 -1.000000 +143819 -1.000000 +143820 -1.000000 +143821 -1.000000 +143822 -1.000000 +143823 -1.000000 +143824 -1.000000 +143825 -1.000000 +143826 -1.000000 +143827 -1.000000 +143828 -1.000000 +143829 -1.000000 +143830 -1.000000 +143831 -1.000000 +143832 -1.000000 +143833 -1.000000 +143834 -1.000000 +143837 -1.000000 +143839 -1.000000 +143840 -1.000000 +143841 -1.000000 +143842 -1.000000 +143843 -1.000000 +143845 -1.000000 +143846 -1.000000 +143847 -1.000000 +143848 -1.000000 +143849 -1.000000 +143850 -1.000000 +143851 -1.000000 +143852 -1.000000 +143853 -1.000000 +143854 -1.000000 +143855 -1.000000 +143856 -1.000000 +143857 -1.000000 +143858 -1.000000 +143859 -1.000000 +143860 -1.000000 +143861 -1.000000 +143862 -1.000000 +143863 -1.000000 +143864 -1.000000 +143865 -1.000000 +143866 -1.000000 +143867 -1.000000 +143868 -1.000000 +143869 -1.000000 +143870 -1.000000 +143871 -1.000000 +143872 -1.000000 +143873 -1.000000 +143875 -1.000000 +143876 -1.000000 +143877 -1.000000 +143880 -1.000000 +143881 -1.000000 +143884 -1.000000 +143885 -1.000000 +143887 -1.000000 +143889 -1.000000 +143890 -1.000000 +143891 -1.000000 +143892 -1.000000 +143893 -1.000000 +143894 -1.000000 +143897 -1.000000 +143898 -1.000000 +143899 -1.000000 +143900 -1.000000 +143901 -1.000000 +143902 -1.000000 +143903 -1.000000 +143904 -1.000000 +143905 -1.000000 +143906 -1.000000 +143907 -1.000000 +143908 -1.000000 +143909 -1.000000 +143910 -1.000000 +143911 -1.000000 +143912 -1.000000 +143913 -1.000000 +143914 -1.000000 +143915 -1.000000 +143916 -1.000000 +143917 -1.000000 +143918 -1.000000 +143919 -1.000000 +143920 -1.000000 +143921 -1.000000 +143922 -1.000000 +143923 -1.000000 +143924 -1.000000 +143925 -1.000000 +143926 -1.000000 +143927 -1.000000 +143928 -1.000000 +143929 -1.000000 +143930 -1.000000 +143931 -1.000000 +143932 -1.000000 +143933 -1.000000 +143934 -1.000000 +143935 -1.000000 +143936 -1.000000 +143937 -1.000000 +143938 -1.000000 +143939 -1.000000 +143940 -1.000000 +143941 -1.000000 +143967 -1.000000 +143968 -1.000000 +143972 -1.000000 +143973 -1.000000 +143976 -1.000000 +143977 -1.000000 +143978 -1.000000 +143979 -1.000000 +143980 -1.000000 +143981 -1.000000 +143982 -1.000000 +143983 -1.000000 +143984 -1.000000 +143988 -1.000000 +143998 -1.000000 +144000 -1.000000 +144001 -1.000000 +144004 -1.000000 +144005 -1.000000 +144011 -1.000000 +144012 -1.000000 +144013 -1.000000 +144014 -1.000000 +144015 -1.000000 +144020 -1.000000 +144022 -1.000000 +144026 -1.000000 +144027 -1.000000 +144028 -1.000000 +144029 -1.000000 +144030 -1.000000 +144033 -1.000000 +144034 -1.000000 +144035 -1.000000 +144036 -1.000000 +144037 -1.000000 +144038 -1.000000 +144039 -1.000000 +144040 -1.000000 +144057 -1.000000 +144058 -1.000000 +144059 -1.000000 +144061 -1.000000 +144062 -1.000000 +144065 -1.000000 +144073 -1.000000 +144074 -1.000000 +144075 -1.000000 +144076 -1.000000 +144077 -1.000000 +144078 -1.000000 +144079 -1.000000 +144080 -1.000000 +144083 -1.000000 +144084 -1.000000 +144085 -1.000000 +144086 -1.000000 +144087 -1.000000 +144088 -1.000000 +144093 -1.000000 +144094 -1.000000 +144095 -1.000000 +144097 -1.000000 +144101 -1.000000 +144102 -1.000000 +144104 -1.000000 +144105 -1.000000 +144106 -1.000000 +144107 -1.000000 +144108 -1.000000 +144109 -1.000000 +144110 -1.000000 +144115 -1.000000 +144116 -1.000000 +144117 -1.000000 +144118 -1.000000 +144119 -1.000000 +144120 -1.000000 +144121 -1.000000 +144122 -1.000000 +144123 -1.000000 +144124 -1.000000 +144125 -1.000000 +144126 -1.000000 +144127 -1.000000 +144128 -1.000000 +144129 -1.000000 +144130 -1.000000 +144131 -1.000000 +144132 -1.000000 +144135 -1.000000 +144136 -1.000000 +144137 -1.000000 +144141 -1.000000 +144142 -1.000000 +144143 -1.000000 +144144 -1.000000 +144145 -1.000000 +144146 -1.000000 +144147 -1.000000 +144149 -1.000000 +144150 -1.000000 +144151 -1.000000 +144152 -1.000000 +144153 -1.000000 +144154 -1.000000 +144155 -1.000000 +144156 -1.000000 +144160 -1.000000 +144161 -1.000000 +144162 -1.000000 +144163 -1.000000 +144166 -1.000000 +144167 -1.000000 +144169 -1.000000 +144171 -1.000000 +144174 -1.000000 +144183 -1.000000 +144185 -1.000000 +144186 -1.000000 +144188 -1.000000 +144192 -1.000000 +144197 -1.000000 +144198 -1.000000 +144199 -1.000000 +144201 -1.000000 +144202 -1.000000 +144203 -1.000000 +144205 -1.000000 +144206 -1.000000 +144208 -1.000000 +144211 -1.000000 +144213 -1.000000 +144214 -1.000000 +144216 -1.000000 +144223 -1.000000 +144224 -1.000000 +144225 -1.000000 +144226 -1.000000 +144227 -1.000000 +144228 -1.000000 +144229 -1.000000 +144230 -1.000000 +144231 -1.000000 +144232 -1.000000 +144233 -1.000000 +144234 -1.000000 +144236 -1.000000 +144237 -1.000000 +144238 -1.000000 +144239 -1.000000 +144240 -1.000000 +144241 -1.000000 +144242 -1.000000 +144243 -1.000000 +144244 -1.000000 +144245 -1.000000 +144246 -1.000000 +144247 -1.000000 +144248 -1.000000 +144249 -1.000000 +144250 -1.000000 +144251 -1.000000 +144252 -1.000000 +144253 -1.000000 +144254 -1.000000 +144255 -1.000000 +144256 -1.000000 +144261 -1.000000 +144263 -1.000000 +144264 -1.000000 +144265 -1.000000 +144266 -1.000000 +144267 -1.000000 +144268 -1.000000 +144269 -1.000000 +144270 -1.000000 +144271 -1.000000 +144272 -1.000000 +144273 -1.000000 +144274 -1.000000 +144275 -1.000000 +144278 -1.000000 +144279 -1.000000 +144280 -1.000000 +144281 -1.000000 +144282 -1.000000 +144283 -1.000000 +144284 -1.000000 +144285 -1.000000 +144286 -1.000000 +144287 -1.000000 +144288 -1.000000 +144289 -1.000000 +144290 -1.000000 +144291 -1.000000 +144298 -1.000000 +144299 -1.000000 +144300 -1.000000 +144301 -1.000000 +144302 -1.000000 +144303 -1.000000 +144304 -1.000000 +144305 -1.000000 +144306 -1.000000 +144307 -1.000000 +144308 -1.000000 +144309 -1.000000 +144310 -1.000000 +144311 -1.000000 +144313 -1.000000 +144314 -1.000000 +144315 -1.000000 +144316 -1.000000 +144317 -1.000000 +144318 -1.000000 +144319 -1.000000 +144320 -1.000000 +144321 -1.000000 +144322 -1.000000 +144323 -1.000000 +144331 -1.000000 +144332 -1.000000 +144333 -1.000000 +144334 -1.000000 +144335 -1.000000 +144336 -1.000000 +144337 -1.000000 +144338 -1.000000 +144340 -1.000000 +144341 -1.000000 +144342 -1.000000 +144343 -1.000000 +144344 -1.000000 +144345 -1.000000 +144346 -1.000000 +144347 -1.000000 +144348 -1.000000 +144349 -1.000000 +144350 -1.000000 +144351 -1.000000 +144352 -1.000000 +144353 -1.000000 +144354 -1.000000 +144356 -1.000000 +144357 -1.000000 +144358 -1.000000 +144359 -1.000000 +144360 -1.000000 +144361 -1.000000 +144365 -1.000000 +144366 -1.000000 +144367 -1.000000 +144368 -1.000000 +144372 -1.000000 +144373 -1.000000 +144374 -1.000000 +144376 -1.000000 +144377 -1.000000 +144378 -1.000000 +144380 -1.000000 +144383 -1.000000 +144389 -1.000000 +144392 -1.000000 +144393 -1.000000 +144405 -1.000000 +144406 -1.000000 +144408 -1.000000 +144409 -1.000000 +144410 -1.000000 +144412 -1.000000 +144413 -1.000000 +144414 -1.000000 +144415 -1.000000 +144416 -1.000000 +144417 -1.000000 +144418 -1.000000 +144419 -1.000000 +144420 -1.000000 +144424 -1.000000 +144426 -1.000000 +144431 -1.000000 +144443 -1.000000 +144444 -1.000000 +144445 -1.000000 +144446 -1.000000 +144448 -1.000000 +144449 -1.000000 +144450 -1.000000 +144451 -1.000000 +144452 -1.000000 +144453 -1.000000 +144454 -1.000000 +144455 -1.000000 +144456 -1.000000 +144457 -1.000000 +144461 -1.000000 +144462 -1.000000 +144463 -1.000000 +144464 -1.000000 +144465 -1.000000 +144466 -1.000000 +144467 -1.000000 +144468 -1.000000 +144469 -1.000000 +144470 -1.000000 +144471 -1.000000 +144472 -1.000000 +144473 -1.000000 +144474 -1.000000 +144475 -1.000000 +144476 -1.000000 +144477 -1.000000 +144478 -1.000000 +144479 -1.000000 +144480 -1.000000 +144481 -1.000000 +144482 -1.000000 +144483 -1.000000 +144484 -1.000000 +144485 -1.000000 +144486 -1.000000 +144487 -1.000000 +144488 -1.000000 +144489 -1.000000 +144490 -1.000000 +144491 -1.000000 +144492 -1.000000 +144506 -1.000000 +144507 -1.000000 +144508 -1.000000 +144510 -1.000000 +144511 -1.000000 +144512 -1.000000 +144513 -1.000000 +144514 -1.000000 +144516 -1.000000 +144518 -1.000000 +144519 -1.000000 +144522 -1.000000 +144523 -1.000000 +144528 -1.000000 +144529 -1.000000 +144533 -1.000000 +144536 -1.000000 +144546 -1.000000 +144547 -1.000000 +144549 -1.000000 +144550 -1.000000 +144552 -1.000000 +144554 -1.000000 +144557 -1.000000 +144558 -1.000000 +144565 -1.000000 +144566 -1.000000 +144567 -1.000000 +144568 -1.000000 +144569 -1.000000 +144570 -1.000000 +144571 -1.000000 +144572 -1.000000 +144573 -1.000000 +144574 -1.000000 +144575 -1.000000 +144576 -1.000000 +144577 -1.000000 +144578 -1.000000 +144579 -1.000000 +144673 -1.000000 +144678 -1.000000 +144684 -1.000000 +144688 -1.000000 +144693 -1.000000 +144702 -1.000000 +144703 -1.000000 +144709 -1.000000 +144712 -1.000000 +144714 -1.000000 +144715 -1.000000 +144716 -1.000000 +144717 -1.000000 +144718 -1.000000 +144719 -1.000000 +144720 -1.000000 +144721 -1.000000 +144723 -1.000000 +144724 -1.000000 +144727 -1.000000 +144729 -1.000000 +144730 -1.000000 +144735 -1.000000 +144737 -1.000000 +144739 -1.000000 +144740 -1.000000 +144742 -1.000000 +144743 -1.000000 +144744 -1.000000 +144745 -1.000000 +144746 -1.000000 +144747 -1.000000 +144748 -1.000000 +144749 -1.000000 +144750 -1.000000 +144751 -1.000000 +144752 -1.000000 +144753 -1.000000 +144754 -1.000000 +144757 -1.000000 +144762 -1.000000 +144765 -1.000000 +144768 -1.000000 +144770 -1.000000 +144771 -1.000000 +144773 -1.000000 +144774 -1.000000 +144778 -1.000000 +144781 -1.000000 +144782 -1.000000 +144784 -1.000000 +144786 -1.000000 +144787 -1.000000 +144788 -1.000000 +144789 -1.000000 +144790 -1.000000 +144791 -1.000000 +144800 -1.000000 +144801 -1.000000 +144802 -1.000000 +144804 -1.000000 +144807 -1.000000 +144810 -1.000000 +144816 -1.000000 +144818 -1.000000 +144830 -1.000000 +144853 -1.000000 +144854 -1.000000 +144855 -1.000000 +144856 -1.000000 +144857 -1.000000 +144858 -1.000000 +144859 -1.000000 +144860 -1.000000 +144863 -1.000000 +144864 -1.000000 +144865 -1.000000 +144866 -1.000000 +144867 -1.000000 +144868 -1.000000 +144869 -1.000000 +144870 -1.000000 +144871 -1.000000 +144872 -1.000000 +144873 -1.000000 +144883 -1.000000 +144884 -1.000000 +144885 -1.000000 +144886 -1.000000 +144887 -1.000000 +144888 -1.000000 +144889 -1.000000 +144890 -1.000000 +144891 -1.000000 +144892 -1.000000 +144893 -1.000000 +144895 -1.000000 +144899 -1.000000 +144902 -1.000000 +144903 -1.000000 +144907 -1.000000 +144908 -1.000000 +144912 -1.000000 +144913 -1.000000 +144914 -1.000000 +144915 -1.000000 +144916 -1.000000 +144917 -1.000000 +144918 -1.000000 +144919 -1.000000 +144920 -1.000000 +144921 -1.000000 +144922 -1.000000 +144923 -1.000000 +144925 -1.000000 +144926 -1.000000 +144927 -1.000000 +144928 -1.000000 +144929 -1.000000 +144930 -1.000000 +144933 -1.000000 +144934 -1.000000 +144935 -1.000000 +144936 -1.000000 +144937 -1.000000 +144938 -1.000000 +144939 -1.000000 +144940 -1.000000 +144941 -1.000000 +144942 -1.000000 +144943 -1.000000 +144944 -1.000000 +144945 -1.000000 +144946 -1.000000 +144947 -1.000000 +144948 -1.000000 +144949 -1.000000 +144950 -1.000000 +144951 -1.000000 +144952 -1.000000 +144953 -1.000000 +144954 -1.000000 +144956 -1.000000 +144958 -1.000000 +144959 -1.000000 +144960 -1.000000 +144961 -1.000000 +144963 -1.000000 +144964 -1.000000 +144973 -1.000000 +144974 -1.000000 +144975 -1.000000 +144976 -1.000000 +144977 -1.000000 +144978 -1.000000 +144979 -1.000000 +144980 -1.000000 +144981 -1.000000 +144983 -1.000000 +144984 -1.000000 +144985 -1.000000 +144986 -1.000000 +144987 -1.000000 +144988 -1.000000 +144989 -1.000000 +144990 -1.000000 +144991 -1.000000 +144992 -1.000000 +144993 -1.000000 +145000 -1.000000 +145001 -1.000000 +145002 -1.000000 +145008 -1.000000 +145012 -1.000000 +145024 -1.000000 +145025 -1.000000 +145028 -1.000000 +145030 -1.000000 +145035 -1.000000 +145038 -1.000000 +145039 -1.000000 +145041 -1.000000 +145042 -1.000000 +145043 -1.000000 +145044 -1.000000 +145045 -1.000000 +145046 -1.000000 +145047 -1.000000 +145048 -1.000000 +145049 -1.000000 +145051 -1.000000 +145052 -1.000000 +145053 -1.000000 +145054 -1.000000 +145055 -1.000000 +145056 -1.000000 +145057 -1.000000 +145058 -1.000000 +145059 -1.000000 +145060 -1.000000 +145061 -1.000000 +145063 -1.000000 +145065 -1.000000 +145066 -1.000000 +145067 -1.000000 +145069 -1.000000 +145072 -1.000000 +145073 -1.000000 +145074 -1.000000 +145076 -1.000000 +145077 -1.000000 +145079 -1.000000 +145082 -1.000000 +145083 -1.000000 +145085 -1.000000 +145086 -1.000000 +145088 -1.000000 +145091 -1.000000 +145093 -1.000000 +145094 -1.000000 +145098 -1.000000 +145102 -1.000000 +145103 -1.000000 +145104 -1.000000 +145105 -1.000000 +145106 -1.000000 +145107 -1.000000 +145110 -1.000000 +145111 -1.000000 +145117 -1.000000 +145123 -1.000000 +145125 -1.000000 +145137 -1.000000 +145138 -1.000000 +145140 -1.000000 +145142 -1.000000 +145143 -1.000000 +145145 -1.000000 +145146 -1.000000 +145147 -1.000000 +145148 -1.000000 +145149 -1.000000 +145157 -1.000000 +145161 -1.000000 +145162 -1.000000 +145166 -1.000000 +145167 -1.000000 +145170 -1.000000 +145171 -1.000000 +145172 -1.000000 +145173 -1.000000 +145174 -1.000000 +145175 -1.000000 +145176 -1.000000 +145177 -1.000000 +145178 -1.000000 +145179 -1.000000 +145180 -1.000000 +145181 -1.000000 +145182 -1.000000 +145183 -1.000000 +145184 -1.000000 +145185 -1.000000 +145186 -1.000000 +145187 -1.000000 +145188 -1.000000 +145189 -1.000000 +145190 -1.000000 +145191 -1.000000 +145192 -1.000000 +145193 -1.000000 +145194 -1.000000 +145195 -1.000000 +145196 -1.000000 +145197 -1.000000 +145198 -1.000000 +145199 -1.000000 +145200 -1.000000 +145201 -1.000000 +145202 -1.000000 +145203 -1.000000 +145205 -1.000000 +145206 -1.000000 +145207 -1.000000 +145208 -1.000000 +145209 -1.000000 +145214 -1.000000 +145215 -1.000000 +145216 -1.000000 +145217 -1.000000 +145218 -1.000000 +145219 -1.000000 +145220 -1.000000 +145221 -1.000000 +145222 -1.000000 +145223 -1.000000 +145224 -1.000000 +145225 -1.000000 +145226 -1.000000 +145227 -1.000000 +145228 -1.000000 +145229 -1.000000 +145230 -1.000000 +145231 -1.000000 +145232 -1.000000 +145233 -1.000000 +145234 -1.000000 +145236 -1.000000 +145241 -1.000000 +145242 -1.000000 +145243 -1.000000 +145245 -1.000000 +145296 -1.000000 +145298 -1.000000 +145299 -1.000000 +145300 -1.000000 +145302 -1.000000 +145303 -1.000000 +145305 -1.000000 +145306 -1.000000 +145307 -1.000000 +145308 -1.000000 +145309 -1.000000 +145310 -1.000000 +145311 -1.000000 +145312 -1.000000 +145313 -1.000000 +145314 -1.000000 +145315 -1.000000 +145316 -1.000000 +145317 -1.000000 +145318 -1.000000 +145319 -1.000000 +145322 -1.000000 +145323 -1.000000 +145324 -1.000000 +145329 -1.000000 +145332 -1.000000 +145333 -1.000000 +145334 -1.000000 +145339 -1.000000 +145344 -1.000000 +145346 -1.000000 +145349 -1.000000 +145350 -1.000000 +145352 -1.000000 +145354 -1.000000 +145355 -1.000000 +145356 -1.000000 +145357 -1.000000 +145358 -1.000000 +145359 -1.000000 +145360 -1.000000 +145361 -1.000000 +145362 -1.000000 +145364 -1.000000 +145371 -1.000000 +145389 -1.000000 +145393 -1.000000 +145394 -1.000000 +145395 -1.000000 +145405 -1.000000 +145414 -1.000000 +145418 -1.000000 +145423 -1.000000 +145424 -1.000000 +145433 -1.000000 +145434 -1.000000 +145435 -1.000000 +145436 -1.000000 +145437 -1.000000 +145438 -1.000000 +145439 -1.000000 +145440 -1.000000 +145441 -1.000000 +145442 -1.000000 +145444 -1.000000 +145445 -1.000000 +145446 -1.000000 +145447 -1.000000 +145448 -1.000000 +145449 -1.000000 +145451 -1.000000 +145452 -1.000000 +145453 -1.000000 +145455 -1.000000 +145456 -1.000000 +145457 -1.000000 +145458 -1.000000 +145459 -1.000000 +145460 -1.000000 +145461 -1.000000 +145462 -1.000000 +145463 -1.000000 +145465 -1.000000 +145466 -1.000000 +145468 -1.000000 +145470 -1.000000 +145471 -1.000000 +145472 -1.000000 +145473 -1.000000 +145474 -1.000000 +145477 -1.000000 +145478 -1.000000 +145482 -1.000000 +145485 -1.000000 +145487 -1.000000 +145488 -1.000000 +145489 -1.000000 +145492 -1.000000 +145494 -1.000000 +145499 -1.000000 +145512 -1.000000 +145513 -1.000000 +145520 -1.000000 +145521 -1.000000 +145523 -1.000000 +145524 -1.000000 +145530 -1.000000 +145542 -1.000000 +145545 -1.000000 +145546 -1.000000 +145551 -1.000000 +145552 -1.000000 +145553 -1.000000 +145555 -1.000000 +145556 -1.000000 +145557 -1.000000 +145558 -1.000000 +145560 -1.000000 +145561 -1.000000 +145567 -1.000000 +145568 -1.000000 +145569 -1.000000 +145570 -1.000000 +145575 -1.000000 +145577 -1.000000 +145582 -1.000000 +145583 -1.000000 +145586 -1.000000 +145587 -1.000000 +145598 -1.000000 +145599 -1.000000 +145633 -1.000000 +145635 -1.000000 +145643 -1.000000 +145664 -1.000000 +145667 -1.000000 +145668 -1.000000 +145669 -1.000000 +145670 -1.000000 +145671 -1.000000 +145672 -1.000000 +145673 -1.000000 +145674 -1.000000 +145675 -1.000000 +145676 -1.000000 +145677 -1.000000 +145678 -1.000000 +145679 -1.000000 +145680 -1.000000 +145683 -1.000000 +145684 -1.000000 +145685 -1.000000 +145686 -1.000000 +145687 -1.000000 +145690 -1.000000 +145692 -1.000000 +145698 -1.000000 +145699 -1.000000 +145700 -1.000000 +145701 -1.000000 +145702 -1.000000 +145703 -1.000000 +145705 -1.000000 +145706 -1.000000 +145707 -1.000000 +145708 -1.000000 +145709 -1.000000 +145710 -1.000000 +145711 -1.000000 +145712 -1.000000 +145713 -1.000000 +145714 -1.000000 +145715 -1.000000 +145717 -1.000000 +145718 -1.000000 +145720 -1.000000 +145722 -1.000000 +145723 -1.000000 +145724 -1.000000 +145725 -1.000000 +145726 -1.000000 +145727 -1.000000 +145728 -1.000000 +145729 -1.000000 +145730 -1.000000 +145731 -1.000000 +145732 -1.000000 +145733 -1.000000 +145736 -1.000000 +145737 -1.000000 +145738 -1.000000 +145739 -1.000000 +145740 -1.000000 +145741 -1.000000 +145742 -1.000000 +145743 -1.000000 +145744 -1.000000 +145745 -1.000000 +145746 -1.000000 +145747 -1.000000 +145749 -1.000000 +145750 -1.000000 +145751 -1.000000 +145752 -1.000000 +145753 -1.000000 +145754 -1.000000 +145755 -1.000000 +145756 -1.000000 +145757 -1.000000 +145758 -1.000000 +145759 -1.000000 +145760 -1.000000 +145761 -1.000000 +145762 -1.000000 +145764 -1.000000 +145765 -1.000000 +145776 -1.000000 +145777 -1.000000 +145778 -1.000000 +145779 -1.000000 +145780 -1.000000 +145781 -1.000000 +145782 -1.000000 +145783 -1.000000 +145785 -1.000000 +145786 -1.000000 +145787 -1.000000 +145788 -1.000000 +145789 -1.000000 +145790 -1.000000 +145791 -1.000000 +145793 -1.000000 +145794 -1.000000 +145795 -1.000000 +145796 -1.000000 +145797 -1.000000 +145798 -1.000000 +145799 -1.000000 +145800 -1.000000 +145801 -1.000000 +145802 -1.000000 +145803 -1.000000 +145804 -1.000000 +145805 -1.000000 +145806 -1.000000 +145807 -1.000000 +145808 -1.000000 +145809 -1.000000 +145810 -1.000000 +145815 -1.000000 +145817 -1.000000 +145819 -1.000000 +145820 -1.000000 +145826 -1.000000 +145828 -1.000000 +145830 -1.000000 +145831 -1.000000 +145832 -1.000000 +145835 -1.000000 +145837 -1.000000 +145838 -1.000000 +145839 -1.000000 +145840 -1.000000 +145841 -1.000000 +145842 -1.000000 +145843 -1.000000 +145844 -1.000000 +145846 -1.000000 +145849 -1.000000 +145851 -1.000000 +145852 -1.000000 +145853 -1.000000 +145854 -1.000000 +145855 -1.000000 +145856 -1.000000 +145859 -1.000000 +145861 -1.000000 +145863 -1.000000 +145864 -1.000000 +145865 -1.000000 +145867 -1.000000 +145868 -1.000000 +145869 -1.000000 +145870 -1.000000 +145871 -1.000000 +145872 -1.000000 +145873 -1.000000 +145874 -1.000000 +145875 -1.000000 +145876 -1.000000 +145877 -1.000000 +145878 -1.000000 +145879 -1.000000 +145880 -1.000000 +145882 -1.000000 +145885 -1.000000 +145886 -1.000000 +145888 -1.000000 +145892 -1.000000 +145893 -1.000000 +145894 -1.000000 +145895 -1.000000 +145896 -1.000000 +145897 -1.000000 +145898 -1.000000 +145899 -1.000000 +145900 -1.000000 +145901 -1.000000 +145902 -1.000000 +145903 -1.000000 +145904 -1.000000 +145905 -1.000000 +145907 -1.000000 +145908 -1.000000 +145909 -1.000000 +145910 -1.000000 +145911 -1.000000 +145914 -1.000000 +145915 -1.000000 +145918 -1.000000 +145919 -1.000000 +145923 -1.000000 +145924 -1.000000 +145925 -1.000000 +145927 -1.000000 +145928 -1.000000 +145930 -1.000000 +145932 -1.000000 +145933 -1.000000 +145935 -1.000000 +145936 -1.000000 +145937 -1.000000 +145938 -1.000000 +145939 -1.000000 +145940 -1.000000 +145942 -1.000000 +145943 -1.000000 +145944 -1.000000 +145945 -1.000000 +145946 -1.000000 +145947 -1.000000 +145948 -1.000000 +145949 -1.000000 +145951 -1.000000 +145952 -1.000000 +145953 -1.000000 +145954 -1.000000 +145958 -1.000000 +145959 -1.000000 +145960 -1.000000 +145961 -1.000000 +145962 -1.000000 +145963 -1.000000 +145964 -1.000000 +145965 -1.000000 +145966 -1.000000 +145967 -1.000000 +145968 -1.000000 +145969 -1.000000 +145970 -1.000000 +145971 -1.000000 +145972 -1.000000 +145973 -1.000000 +145974 -1.000000 +145975 -1.000000 +145976 -1.000000 +145977 -1.000000 +145978 -1.000000 +145979 -1.000000 +145980 -1.000000 +145981 -1.000000 +145982 -1.000000 +145983 -1.000000 +145984 -1.000000 +145985 -1.000000 +145986 -1.000000 +145987 -1.000000 +145988 -1.000000 +145989 -1.000000 +145990 -1.000000 +145992 -1.000000 +145993 -1.000000 +145994 -1.000000 +145996 -1.000000 +145997 -1.000000 +145998 -1.000000 +146001 -1.000000 +146002 -1.000000 +146003 -1.000000 +146004 -1.000000 +146005 -1.000000 +146006 -1.000000 +146007 -1.000000 +146008 -1.000000 +146009 -1.000000 +146010 -1.000000 +146011 -1.000000 +146012 -1.000000 +146013 -1.000000 +146016 -1.000000 +146017 -1.000000 +146018 -1.000000 +146019 -1.000000 +146020 -1.000000 +146021 -1.000000 +146022 -1.000000 +146023 -1.000000 +146027 -1.000000 +146028 -1.000000 +146029 -1.000000 +146031 -1.000000 +146032 -1.000000 +146034 -1.000000 +146035 -1.000000 +146037 -1.000000 +146039 -1.000000 +146040 -1.000000 +146041 -1.000000 +146043 -1.000000 +146044 -1.000000 +146045 -1.000000 +146047 -1.000000 +146048 -1.000000 +146050 -1.000000 +146051 -1.000000 +146053 -1.000000 +146054 -1.000000 +146055 -1.000000 +146056 -1.000000 +146057 -1.000000 +146058 -1.000000 +146059 -1.000000 +146060 -1.000000 +146065 -1.000000 +146073 -1.000000 +146074 -1.000000 +146075 -1.000000 +146076 -1.000000 +146077 -1.000000 +146078 -1.000000 +146079 -1.000000 +146080 -1.000000 +146082 -1.000000 +146083 -1.000000 +146084 -1.000000 +146085 -1.000000 +146086 -1.000000 +146088 -1.000000 +146089 -1.000000 +146090 -1.000000 +146091 -1.000000 +146093 -1.000000 +146094 -1.000000 +146095 -1.000000 +146096 -1.000000 +146097 -1.000000 +146098 -1.000000 +146099 -1.000000 +146101 -1.000000 +146102 -1.000000 +146104 -1.000000 +146105 -1.000000 +146106 -1.000000 +146107 -1.000000 +146108 -1.000000 +146113 -1.000000 +146114 -1.000000 +146116 -1.000000 +146117 -1.000000 +146118 -1.000000 +146119 -1.000000 +146120 -1.000000 +146121 -1.000000 +146122 -1.000000 +146123 -1.000000 +146126 -1.000000 +146127 -1.000000 +146128 -1.000000 +146129 -1.000000 +146130 -1.000000 +146133 -1.000000 +146134 -1.000000 +146135 -1.000000 +146138 -1.000000 +146143 -1.000000 +146146 -1.000000 +146149 -1.000000 +146150 -1.000000 +146151 -1.000000 +146152 -1.000000 +146153 -1.000000 +146154 -1.000000 +146158 -1.000000 +146159 -1.000000 +146160 -1.000000 +146161 -1.000000 +146162 -1.000000 +146163 -1.000000 +146164 -1.000000 +146165 -1.000000 +146166 -1.000000 +146167 -1.000000 +146168 -1.000000 +146169 -1.000000 +146170 -1.000000 +146171 -1.000000 +146172 -1.000000 +146173 -1.000000 +146174 -1.000000 +146175 -1.000000 +146176 -1.000000 +146177 -1.000000 +146178 -1.000000 +146180 -1.000000 +146183 -1.000000 +146188 -1.000000 +146189 -1.000000 +146191 -1.000000 +146197 -1.000000 +146198 -1.000000 +146199 -1.000000 +146212 -1.000000 +146213 -1.000000 +146269 -1.000000 +146270 -1.000000 +146272 -1.000000 +146273 -1.000000 +146278 -1.000000 +146279 -1.000000 +146280 -1.000000 +146281 -1.000000 +146284 -1.000000 +146285 -1.000000 +146286 -1.000000 +146290 -1.000000 +146291 -1.000000 +146292 -1.000000 +146294 -1.000000 +146295 -1.000000 +146296 -1.000000 +146297 -1.000000 +146298 -1.000000 +146299 -1.000000 +146300 -1.000000 +146312 -1.000000 +146313 -1.000000 +146315 -1.000000 +146316 -1.000000 +146317 -1.000000 +146318 -1.000000 +146319 -1.000000 +146336 -1.000000 +146338 -1.000000 +146339 -1.000000 +146340 -1.000000 +146341 -1.000000 +146342 -1.000000 +146343 -1.000000 +146344 -1.000000 +146345 -1.000000 +146346 -1.000000 +146347 -1.000000 +146348 -1.000000 +146349 -1.000000 +146350 -1.000000 +146351 -1.000000 +146352 -1.000000 +146353 -1.000000 +146354 -1.000000 +146355 -1.000000 +146356 -1.000000 +146357 -1.000000 +146358 -1.000000 +146359 -1.000000 +146360 -1.000000 +146361 -1.000000 +146362 -1.000000 +146363 -1.000000 +146365 -1.000000 +146366 -1.000000 +146367 -1.000000 +146368 -1.000000 +146369 -1.000000 +146370 -1.000000 +146371 -1.000000 +146372 -1.000000 +146373 -1.000000 +146374 -1.000000 +146375 -1.000000 +146376 -1.000000 +146378 -1.000000 +146379 -1.000000 +146381 -1.000000 +146384 -1.000000 +146385 -1.000000 +146406 -1.000000 +146407 -1.000000 +146408 -1.000000 +146409 -1.000000 +146410 -1.000000 +146411 -1.000000 +146412 -1.000000 +146413 -1.000000 +146415 -1.000000 +146416 -1.000000 +146417 -1.000000 +146418 -1.000000 +146419 -1.000000 +146420 -1.000000 +146422 -1.000000 +146425 -1.000000 +146427 -1.000000 +146428 -1.000000 +146429 -1.000000 +146430 -1.000000 +146436 -1.000000 +146439 -1.000000 +146440 -1.000000 +146441 -1.000000 +146443 -1.000000 +146444 -1.000000 +146446 -1.000000 +146447 -1.000000 +146448 -1.000000 +146449 -1.000000 +146450 -1.000000 +146451 -1.000000 +146452 -1.000000 +146453 -1.000000 +146454 -1.000000 +146455 -1.000000 +146456 -1.000000 +146457 -1.000000 +146458 -1.000000 +146459 -1.000000 +146461 -1.000000 +146462 -1.000000 +146463 -1.000000 +146467 -1.000000 +146469 -1.000000 +146470 -1.000000 +146471 -1.000000 +146472 -1.000000 +146473 -1.000000 +146474 -1.000000 +146476 -1.000000 +146480 -1.000000 +146481 -1.000000 +146483 -1.000000 +146485 -1.000000 +146486 -1.000000 +146488 -1.000000 +146489 -1.000000 +146490 -1.000000 +146491 -1.000000 +146492 -1.000000 +146493 -1.000000 +146501 -1.000000 +146502 -1.000000 +146503 -1.000000 +146504 -1.000000 +146505 -1.000000 +146506 -1.000000 +146507 -1.000000 +146508 -1.000000 +146509 -1.000000 +146510 -1.000000 +146511 -1.000000 +146512 -1.000000 +146513 -1.000000 +146514 -1.000000 +146520 -1.000000 +146521 -1.000000 +146524 -1.000000 +146525 -1.000000 +146526 -1.000000 +146530 -1.000000 +146531 -1.000000 +146534 -1.000000 +146535 -1.000000 +146536 -1.000000 +146537 -1.000000 +146538 -1.000000 +146539 -1.000000 +146540 -1.000000 +146541 -1.000000 +146542 -1.000000 +146544 -1.000000 +146545 -1.000000 +146548 -1.000000 +146549 -1.000000 +146551 -1.000000 +146552 -1.000000 +146553 -1.000000 +146554 -1.000000 +146555 -1.000000 +146556 -1.000000 +146557 -1.000000 +146558 -1.000000 +146559 -1.000000 +146563 -1.000000 +146564 -1.000000 +146565 -1.000000 +146566 -1.000000 +146567 -1.000000 +146568 -1.000000 +146569 -1.000000 +146570 -1.000000 +146571 -1.000000 +146573 -1.000000 +146574 -1.000000 +146575 -1.000000 +146576 -1.000000 +146577 -1.000000 +146578 -1.000000 +146579 -1.000000 +146580 -1.000000 +146581 -1.000000 +146582 -1.000000 +146588 -1.000000 +146589 -1.000000 +146590 -1.000000 +146591 -1.000000 +146592 -1.000000 +146593 -1.000000 +146595 -1.000000 +146596 -1.000000 +146597 -1.000000 +146600 -1.000000 +146601 -1.000000 +146602 -1.000000 +146603 -1.000000 +146604 -1.000000 +146605 -1.000000 +146606 -1.000000 +146607 -1.000000 +146611 -1.000000 +146612 -1.000000 +146613 -1.000000 +146615 -1.000000 +146616 -1.000000 +146617 -1.000000 +146618 -1.000000 +146619 -1.000000 +146622 -1.000000 +146624 -1.000000 +146625 -1.000000 +146629 -1.000000 +146631 -1.000000 +146632 -1.000000 +146636 -1.000000 +146637 -1.000000 +146638 -1.000000 +146639 -1.000000 +146640 -1.000000 +146641 -1.000000 +146643 -1.000000 +146652 -1.000000 +146653 -1.000000 +146656 -1.000000 +146661 -1.000000 +146662 -1.000000 +146664 -1.000000 +146665 -1.000000 +146666 -1.000000 +146671 -1.000000 +146673 -1.000000 +146674 -1.000000 +146675 -1.000000 +146677 -1.000000 +146681 -1.000000 +146682 -1.000000 +146702 -1.000000 +146704 -1.000000 +146710 -1.000000 +146713 -1.000000 +146716 -1.000000 +146717 -1.000000 +146718 -1.000000 +146719 -1.000000 +146720 -1.000000 +146721 -1.000000 +146722 -1.000000 +146723 -1.000000 +146724 -1.000000 +146725 -1.000000 +146726 -1.000000 +146727 -1.000000 +146728 -1.000000 +146729 -1.000000 +146730 -1.000000 +146731 -1.000000 +146732 -1.000000 +146733 -1.000000 +146734 -1.000000 +146735 -1.000000 +146736 -1.000000 +146737 -1.000000 +146738 -1.000000 +146739 -1.000000 +146740 -1.000000 +146741 -1.000000 +146742 -1.000000 +146743 -1.000000 +146744 -1.000000 +146745 -1.000000 +146746 -1.000000 +146747 -1.000000 +146748 -1.000000 +146749 -1.000000 +146750 -1.000000 +146751 -1.000000 +146752 -1.000000 +146753 -1.000000 +146754 -1.000000 +146755 -1.000000 +146756 -1.000000 +146757 -1.000000 +146758 -1.000000 +146759 -1.000000 +146761 -1.000000 +146762 -1.000000 +146763 -1.000000 +146764 -1.000000 +146765 -1.000000 +146766 -1.000000 +146767 -1.000000 +146770 -1.000000 +146772 -1.000000 +146773 -1.000000 +146774 -1.000000 +146775 -1.000000 +146776 -1.000000 +146777 -1.000000 +146778 -1.000000 +146779 -1.000000 +146780 -1.000000 +146781 -1.000000 +146782 -1.000000 +146784 -1.000000 +146785 -1.000000 +146788 -1.000000 +146789 -1.000000 +146803 -1.000000 +146807 -1.000000 +146809 -1.000000 +146812 -1.000000 +146814 -1.000000 +146815 -1.000000 +146818 -1.000000 +146820 -1.000000 +146821 -1.000000 +146822 -1.000000 +146823 -1.000000 +146824 -1.000000 +146825 -1.000000 +146835 -1.000000 +146838 -1.000000 +146839 -1.000000 +146840 -1.000000 +146841 -1.000000 +146842 -1.000000 +146846 -1.000000 +146848 -1.000000 +146850 -1.000000 +146857 -1.000000 +146863 -1.000000 +146864 -1.000000 +146865 -1.000000 +146868 -1.000000 +146869 -1.000000 +146870 -1.000000 +146871 -1.000000 +146875 -1.000000 +146881 -1.000000 +146882 -1.000000 +146883 -1.000000 +146884 -1.000000 +146885 -1.000000 +146886 -1.000000 +146887 -1.000000 +146888 -1.000000 +146889 -1.000000 +146890 -1.000000 +146891 -1.000000 +146892 -1.000000 +146893 -1.000000 +146894 -1.000000 +146895 -1.000000 +146896 -1.000000 +146897 -1.000000 +146898 -1.000000 +146899 -1.000000 +146900 -1.000000 +146907 -1.000000 +146908 -1.000000 +146910 -1.000000 +146915 -1.000000 +146917 -1.000000 +146928 -1.000000 +146936 -1.000000 +146939 -1.000000 +146942 -1.000000 +146944 -1.000000 +146945 -1.000000 +146946 -1.000000 +146948 -1.000000 +146950 -1.000000 +146951 -1.000000 +146952 -1.000000 +146954 -1.000000 +146955 -1.000000 +146956 -1.000000 +146957 -1.000000 +146960 -1.000000 +146963 -1.000000 +146964 -1.000000 +146965 -1.000000 +146967 -1.000000 +146968 -1.000000 +146969 -1.000000 +146970 -1.000000 +146971 -1.000000 +146975 -1.000000 +146977 -1.000000 +146980 -1.000000 +146981 -1.000000 +146982 -1.000000 +146983 -1.000000 +146984 -1.000000 +146990 -1.000000 +146993 -1.000000 +146994 -1.000000 +146997 -1.000000 +146998 -1.000000 +146999 -1.000000 +147000 -1.000000 +147001 -1.000000 +147005 -1.000000 +147007 -1.000000 +147012 -1.000000 +147020 -1.000000 +147021 -1.000000 +147023 -1.000000 +147041 -1.000000 +147042 -1.000000 +147043 -1.000000 +147051 -1.000000 +147054 -1.000000 +147055 -1.000000 +147056 -1.000000 +147057 -1.000000 +147058 -1.000000 +147059 -1.000000 +147061 -1.000000 +147063 -1.000000 +147064 -1.000000 +147065 -1.000000 +147066 -1.000000 +147071 -1.000000 +147073 -1.000000 +147076 -1.000000 +147077 -1.000000 +147078 -1.000000 +147083 -1.000000 +147086 -1.000000 +147087 -1.000000 +147089 -1.000000 +147093 -1.000000 +147094 -1.000000 +147097 -1.000000 +147098 -1.000000 +147106 -1.000000 +147108 -1.000000 +147109 -1.000000 +147113 -1.000000 +147115 -1.000000 +147116 -1.000000 +147119 -1.000000 +147120 -1.000000 +147121 -1.000000 +147122 -1.000000 +147126 -1.000000 +147127 -1.000000 +147128 -1.000000 +147129 -1.000000 +147130 -1.000000 +147131 -1.000000 +147133 -1.000000 +147134 -1.000000 +147135 -1.000000 +147137 -1.000000 +147138 -1.000000 +147139 -1.000000 +147140 -1.000000 +147141 -1.000000 +147144 -1.000000 +147145 -1.000000 +147149 -1.000000 +147150 -1.000000 +147151 -1.000000 +147152 -1.000000 +147153 -1.000000 +147154 -1.000000 +147155 -1.000000 +147156 -1.000000 +147157 -1.000000 +147158 -1.000000 +147159 -1.000000 +147160 -1.000000 +147162 -1.000000 +147163 -1.000000 +147165 -1.000000 +147166 -1.000000 +147177 -1.000000 +147180 -1.000000 +147182 -1.000000 +147186 -1.000000 +147187 -1.000000 +147188 -1.000000 +147193 -1.000000 +147195 -1.000000 +147196 -1.000000 +147197 -1.000000 +147198 -1.000000 +147217 -1.000000 +147218 -1.000000 +147219 -1.000000 +147228 -1.000000 +147229 -1.000000 +147230 -1.000000 +147231 -1.000000 +147232 -1.000000 +147257 -1.000000 +147258 -1.000000 +147259 -1.000000 +147260 -1.000000 +147261 -1.000000 +147262 -1.000000 +147264 -1.000000 +147265 -1.000000 +147267 -1.000000 +147274 -1.000000 +147275 -1.000000 +147276 -1.000000 +147277 -1.000000 +147281 -1.000000 +147282 -1.000000 +147283 -1.000000 +147285 -1.000000 +147288 -1.000000 +147290 -1.000000 +147293 -1.000000 +147327 -1.000000 +147330 -1.000000 +147331 -1.000000 +147332 -1.000000 +147334 -1.000000 +147343 -1.000000 +147346 -1.000000 +147349 -1.000000 +147354 -1.000000 +147367 -1.000000 +147368 -1.000000 +147369 -1.000000 +147370 -1.000000 +147371 -1.000000 +147372 -1.000000 +147373 -1.000000 +147374 -1.000000 +147375 -1.000000 +147376 -1.000000 +147377 -1.000000 +147378 -1.000000 +147379 -1.000000 +147380 -1.000000 +147381 -1.000000 +147382 -1.000000 +147383 -1.000000 +147384 -1.000000 +147385 -1.000000 +147391 -1.000000 +147392 -1.000000 +147394 -1.000000 +147396 -1.000000 +147397 -1.000000 +147398 -1.000000 +147399 -1.000000 +147402 -1.000000 +147404 -1.000000 +147405 -1.000000 +147407 -1.000000 +147408 -1.000000 +147410 -1.000000 +147411 -1.000000 +147412 -1.000000 +147413 -1.000000 +147414 -1.000000 +147415 -1.000000 +147416 -1.000000 +147417 -1.000000 +147418 -1.000000 +147419 -1.000000 +147420 -1.000000 +147421 -1.000000 +147422 -1.000000 +147423 -1.000000 +147424 -1.000000 +147425 -1.000000 +147426 -1.000000 +147428 -1.000000 +147429 -1.000000 +147430 -1.000000 +147432 -1.000000 +147436 -1.000000 +147441 -1.000000 +147455 -1.000000 +147456 -1.000000 +147457 -1.000000 +147459 -1.000000 +147460 -1.000000 +147461 -1.000000 +147462 -1.000000 +147464 -1.000000 +147465 -1.000000 +147466 -1.000000 +147467 -1.000000 +147468 -1.000000 +147469 -1.000000 +147512 -1.000000 +147518 -1.000000 +147519 -1.000000 +147520 -1.000000 +147521 -1.000000 +147522 -1.000000 +147523 -1.000000 +147524 -1.000000 +147525 -1.000000 +147526 -1.000000 +147527 -1.000000 +147529 -1.000000 +147530 -1.000000 +147531 -1.000000 +147532 -1.000000 +147533 -1.000000 +147534 -1.000000 +147535 -1.000000 +147582 -1.000000 +147587 -1.000000 +147588 -1.000000 +147589 -1.000000 +147592 -1.000000 +147594 -1.000000 +147596 -1.000000 +147597 -1.000000 +147598 -1.000000 +147599 -1.000000 +147600 -1.000000 +147603 -1.000000 +147607 -1.000000 +147608 -1.000000 +147609 -1.000000 +147610 -1.000000 +147615 -1.000000 +147616 -1.000000 +147617 -1.000000 +147618 -1.000000 +147619 -1.000000 +147620 -1.000000 +147621 -1.000000 +147622 -1.000000 +147623 -1.000000 +147624 -1.000000 +147625 -1.000000 +147626 -1.000000 +147627 -1.000000 +147628 -1.000000 +147629 -1.000000 +147630 -1.000000 +147631 -1.000000 +147632 -1.000000 +147633 -1.000000 +147634 -1.000000 +147639 -1.000000 +147640 -1.000000 +147642 -1.000000 +147645 -1.000000 +147646 -1.000000 +147647 -1.000000 +147648 -1.000000 +147649 -1.000000 +147650 -1.000000 +147651 -1.000000 +147652 -1.000000 +147653 -1.000000 +147656 -1.000000 +147657 -1.000000 +147658 -1.000000 +147659 -1.000000 +147660 -1.000000 +147661 -1.000000 +147662 -1.000000 +147663 -1.000000 +147664 -1.000000 +147665 -1.000000 +147667 -1.000000 +147670 -1.000000 +147671 -1.000000 +147673 -1.000000 +147675 -1.000000 +147676 -1.000000 +147677 -1.000000 +147678 -1.000000 +147680 -1.000000 +147681 -1.000000 +147682 -1.000000 +147684 -1.000000 +147685 -1.000000 +147686 -1.000000 +147689 -1.000000 +147690 -1.000000 +147691 -1.000000 +147692 -1.000000 +147693 -1.000000 +147694 -1.000000 +147695 -1.000000 +147696 -1.000000 +147697 -1.000000 +147699 -1.000000 +147700 -1.000000 +147701 -1.000000 +147703 -1.000000 +147704 -1.000000 +147705 -1.000000 +147707 -1.000000 +147708 -1.000000 +147709 -1.000000 +147714 -1.000000 +147715 -1.000000 +147717 -1.000000 +147720 -1.000000 +147721 -1.000000 +147722 -1.000000 +147723 -1.000000 +147724 -1.000000 +147725 -1.000000 +147726 -1.000000 +147727 -1.000000 +147728 -1.000000 +147729 -1.000000 +147730 -1.000000 +147731 -1.000000 +147732 -1.000000 +147733 -1.000000 +147734 -1.000000 +147736 -1.000000 +147737 -1.000000 +147739 -1.000000 +147740 -1.000000 +147742 -1.000000 +148158 -1.000000 +148159 -1.000000 +148160 -1.000000 +148161 -1.000000 +148164 -1.000000 +148165 -1.000000 +148166 -1.000000 +148167 -1.000000 +148169 -1.000000 +148170 -1.000000 +148172 -1.000000 +148173 -1.000000 +148174 -1.000000 +148175 -1.000000 +148176 -1.000000 +148177 -1.000000 +148179 -1.000000 +148180 -1.000000 +148208 -1.000000 +148209 -1.000000 +148210 -1.000000 +148211 -1.000000 +148212 -1.000000 +148214 -1.000000 +148215 -1.000000 +148218 -1.000000 +148219 -1.000000 +148220 -1.000000 +148221 -1.000000 +148222 -1.000000 +148223 -1.000000 +148224 -1.000000 +148225 -1.000000 +148226 -1.000000 +148227 -1.000000 +148228 -1.000000 +148229 -1.000000 +148230 -1.000000 +148231 -1.000000 +148232 -1.000000 +148233 -1.000000 +148234 -1.000000 +148235 -1.000000 +148236 -1.000000 +148237 -1.000000 +148238 -1.000000 +148239 -1.000000 +148250 -1.000000 +148255 -1.000000 +148258 -1.000000 +148261 -1.000000 +148262 -1.000000 +148263 -1.000000 +148264 -1.000000 +148265 -1.000000 +148266 -1.000000 +148267 -1.000000 +148268 -1.000000 +148270 -1.000000 +148271 -1.000000 +148272 -1.000000 +148273 -1.000000 +148274 -1.000000 +148275 -1.000000 +148284 -1.000000 +148285 -1.000000 +148288 -1.000000 +148289 -1.000000 +148290 -1.000000 +148291 -1.000000 +148292 -1.000000 +148293 -1.000000 +148294 -1.000000 +148295 -1.000000 +148296 -1.000000 +148297 -1.000000 +148307 -1.000000 +148308 -1.000000 +148309 -1.000000 +148311 -1.000000 +148312 -1.000000 +148313 -1.000000 +148314 -1.000000 +148318 -1.000000 +148319 -1.000000 +148320 -1.000000 +148321 -1.000000 +148323 -1.000000 +148324 -1.000000 +148325 -1.000000 +148327 -1.000000 +148335 -1.000000 +148336 -1.000000 +148337 -1.000000 +148341 -1.000000 +148344 -1.000000 +148346 -1.000000 +148347 -1.000000 +148348 -1.000000 +148349 -1.000000 +148350 -1.000000 +148351 -1.000000 +148352 -1.000000 +148353 -1.000000 +148354 -1.000000 +148355 -1.000000 +148356 -1.000000 +148357 -1.000000 +148359 -1.000000 +148360 -1.000000 +148361 -1.000000 +148362 -1.000000 +148363 -1.000000 +148364 -1.000000 +148365 -1.000000 +148368 -1.000000 +148369 -1.000000 +148370 -1.000000 +148376 -1.000000 +148377 -1.000000 +148378 -1.000000 +148379 -1.000000 +148381 -1.000000 +148382 -1.000000 +148384 -1.000000 +148385 -1.000000 +148386 -1.000000 +148387 -1.000000 +148388 -1.000000 +148450 -1.000000 +148451 -1.000000 +148452 -1.000000 +148453 -1.000000 +148455 -1.000000 +148456 -1.000000 +148457 -1.000000 +148458 -1.000000 +148459 -1.000000 +148460 -1.000000 +148462 -1.000000 +148463 -1.000000 +148464 -1.000000 +148465 -1.000000 +148466 -1.000000 +148467 -1.000000 +148472 -1.000000 +148473 -1.000000 +148474 -1.000000 +148475 -1.000000 +148476 -1.000000 +148477 -1.000000 +148478 -1.000000 +148479 -1.000000 +148490 -1.000000 +148491 -1.000000 +148493 -1.000000 +148495 -1.000000 +148496 -1.000000 +148497 -1.000000 +148500 -1.000000 +148501 -1.000000 +148511 -1.000000 +148512 -1.000000 +148513 -1.000000 +148514 -1.000000 +148515 -1.000000 +148516 -1.000000 +148517 -1.000000 +148527 -1.000000 +148528 -1.000000 +148529 -1.000000 +148530 -1.000000 +148532 -1.000000 +148533 -1.000000 +148534 -1.000000 +148535 -1.000000 +148536 -1.000000 +148537 -1.000000 +148538 -1.000000 +148539 -1.000000 +148540 -1.000000 +148541 -1.000000 +148542 -1.000000 +148546 -1.000000 +148547 -1.000000 +148548 -1.000000 +148549 -1.000000 +148550 -1.000000 +148551 -1.000000 +148552 -1.000000 +148553 -1.000000 +148555 -1.000000 +148557 -1.000000 +148558 -1.000000 +148559 -1.000000 +148560 -1.000000 +148561 -1.000000 +148562 -1.000000 +148563 -1.000000 +148564 -1.000000 +148565 -1.000000 +148566 -1.000000 +148567 -1.000000 +148568 -1.000000 +148569 -1.000000 +148570 -1.000000 +148571 -1.000000 +148572 -1.000000 +148573 -1.000000 +148574 -1.000000 +148575 -1.000000 +148576 -1.000000 +148579 -1.000000 +148583 -1.000000 +148584 -1.000000 +148585 -1.000000 +148586 -1.000000 +148587 -1.000000 +148588 -1.000000 +148589 -1.000000 +148590 -1.000000 +148591 -1.000000 +148592 -1.000000 +148594 -1.000000 +148595 -1.000000 +148596 -1.000000 +148597 -1.000000 +148598 -1.000000 +148599 -1.000000 +148600 -1.000000 +148601 -1.000000 +148602 -1.000000 +148603 -1.000000 +148604 -1.000000 +148605 -1.000000 +148606 -1.000000 +148614 -1.000000 +148615 -1.000000 +148616 -1.000000 +148619 -1.000000 +148622 -1.000000 +148624 -1.000000 +148626 -1.000000 +148627 -1.000000 +148629 -1.000000 +148630 -1.000000 +148631 -1.000000 +148632 -1.000000 +148633 -1.000000 +148634 -1.000000 +148635 -1.000000 +148636 -1.000000 +148637 -1.000000 +148638 -1.000000 +148639 -1.000000 +148640 -1.000000 +148641 -1.000000 +148642 -1.000000 +148653 -1.000000 +148654 -1.000000 +148656 -1.000000 +148658 -1.000000 +148659 -1.000000 +148661 -1.000000 +148662 -1.000000 +148664 -1.000000 +148665 -1.000000 +148671 -1.000000 +148672 -1.000000 +148673 -1.000000 +148674 -1.000000 +148675 -1.000000 +148679 -1.000000 +148680 -1.000000 +148681 -1.000000 +148682 -1.000000 +148683 -1.000000 +148684 -1.000000 +148687 -1.000000 +148688 -1.000000 +148689 -1.000000 +148690 -1.000000 +148691 -1.000000 +148692 -1.000000 +148693 -1.000000 +148694 -1.000000 +148695 -1.000000 +148696 -1.000000 +148697 -1.000000 +148698 -1.000000 +148704 -1.000000 +148705 -1.000000 +148706 -1.000000 +148709 -1.000000 +148712 -1.000000 +148715 -1.000000 +148717 -1.000000 +148718 -1.000000 +148730 -1.000000 +148734 -1.000000 +148738 -1.000000 +148742 -1.000000 +148745 -1.000000 +148746 -1.000000 +148747 -1.000000 +148749 -1.000000 +148750 -1.000000 +148756 -1.000000 +148764 -1.000000 +148766 -1.000000 +148768 -1.000000 +148772 -1.000000 +148773 -1.000000 +148774 -1.000000 +148775 -1.000000 +148776 -1.000000 +148777 -1.000000 +148778 -1.000000 +148779 -1.000000 +148780 -1.000000 +148781 -1.000000 +148783 -1.000000 +148784 -1.000000 +148785 -1.000000 +148786 -1.000000 +148787 -1.000000 +148788 -1.000000 +148790 -1.000000 +148791 -1.000000 +148792 -1.000000 +148793 -1.000000 +148794 -1.000000 +148796 -1.000000 +148797 -1.000000 +148798 -1.000000 +148799 -1.000000 +148800 -1.000000 +148801 -1.000000 +148802 -1.000000 +148803 -1.000000 +148804 -1.000000 +148805 -1.000000 +148806 -1.000000 +148807 -1.000000 +148835 -1.000000 +148840 -1.000000 +148842 -1.000000 +148844 -1.000000 +148846 -1.000000 +148850 -1.000000 +148851 -1.000000 +148852 -1.000000 +148853 -1.000000 +148854 -1.000000 +148855 -1.000000 +148864 -1.000000 +148865 -1.000000 +148866 -1.000000 +148867 -1.000000 +148868 -1.000000 +148869 -1.000000 +148870 -1.000000 +148873 -1.000000 +148874 -1.000000 +148876 -1.000000 +148877 -1.000000 +148878 -1.000000 +148879 -1.000000 +148880 -1.000000 +148882 -1.000000 +148883 -1.000000 +148884 -1.000000 +148885 -1.000000 +148886 -1.000000 +148887 -1.000000 +148888 -1.000000 +148889 -1.000000 +148890 -1.000000 +148891 -1.000000 +148892 -1.000000 +148893 -1.000000 +148894 -1.000000 +148895 -1.000000 +148896 -1.000000 +148897 -1.000000 +148901 -1.000000 +148902 -1.000000 +148903 -1.000000 +148904 -1.000000 +148905 -1.000000 +148906 -1.000000 +148907 -1.000000 +148908 -1.000000 +148909 -1.000000 +148910 -1.000000 +148912 -1.000000 +148913 -1.000000 +148914 -1.000000 +148915 -1.000000 +148916 -1.000000 +148917 -1.000000 +148918 -1.000000 +148919 -1.000000 +148920 -1.000000 +148922 -1.000000 +148923 -1.000000 +148924 -1.000000 +148925 -1.000000 +148926 -1.000000 +148927 -1.000000 +148929 -1.000000 +148930 -1.000000 +148931 -1.000000 +148939 -1.000000 +148940 -1.000000 +148941 -1.000000 +148942 -1.000000 +148943 -1.000000 +148944 -1.000000 +148945 -1.000000 +148946 -1.000000 +148947 -1.000000 +148948 -1.000000 +148949 -1.000000 +148951 -1.000000 +148952 -1.000000 +148953 -1.000000 +148954 -1.000000 +148955 -1.000000 +148956 -1.000000 +148959 -1.000000 +148961 -1.000000 +148966 -1.000000 +148973 -1.000000 +148976 -1.000000 +148977 -1.000000 +148978 -1.000000 +148979 -1.000000 +148980 -1.000000 +148981 -1.000000 +148982 -1.000000 +148983 -1.000000 +148984 -1.000000 +148985 -1.000000 +148986 -1.000000 +148987 -1.000000 +148988 -1.000000 +148989 -1.000000 +148990 -1.000000 +148991 -1.000000 +148994 -1.000000 +148995 -1.000000 +148996 -1.000000 +148997 -1.000000 +148998 -1.000000 +148999 -1.000000 +149000 -1.000000 +149010 -1.000000 +149011 -1.000000 +149015 -1.000000 +149020 -1.000000 +149026 -1.000000 +149027 -1.000000 +149038 -1.000000 +149039 -1.000000 +149040 -1.000000 +149041 -1.000000 +149042 -1.000000 +149043 -1.000000 +149046 -1.000000 +149047 -1.000000 +149048 -1.000000 +149049 -1.000000 +149052 -1.000000 +149054 -1.000000 +149055 -1.000000 +149056 -1.000000 +149057 -1.000000 +149058 -1.000000 +149059 -1.000000 +149060 -1.000000 +149061 -1.000000 +149063 -1.000000 +149064 -1.000000 +149080 -1.000000 +149081 -1.000000 +149082 -1.000000 +149083 -1.000000 +149084 -1.000000 +149085 -1.000000 +149086 -1.000000 +149096 -1.000000 +149101 -1.000000 +149109 -1.000000 +149110 -1.000000 +149111 -1.000000 +149113 -1.000000 +149114 -1.000000 +149115 -1.000000 +149116 -1.000000 +149117 -1.000000 +149120 -1.000000 +149121 -1.000000 +149122 -1.000000 +149123 -1.000000 +149124 -1.000000 +149132 -1.000000 +149133 -1.000000 +149136 -1.000000 +149137 -1.000000 +149138 -1.000000 +149139 -1.000000 +149142 -1.000000 +149144 -1.000000 +149145 -1.000000 +149146 -1.000000 +149147 -1.000000 +149148 -1.000000 +149149 -1.000000 +149150 -1.000000 +149151 -1.000000 +149152 -1.000000 +149154 -1.000000 +149155 -1.000000 +149156 -1.000000 +149157 -1.000000 +149158 -1.000000 +149159 -1.000000 +149164 -1.000000 +149195 -1.000000 +149196 -1.000000 +149197 -1.000000 +149198 -1.000000 +149200 -1.000000 +149201 -1.000000 +149203 -1.000000 +149204 -1.000000 +149209 -1.000000 +149210 -1.000000 +149217 -1.000000 +149218 -1.000000 +149223 -1.000000 +149228 -1.000000 +149229 -1.000000 +149230 -1.000000 +149231 -1.000000 +149242 -1.000000 +149249 -1.000000 +149250 -1.000000 +149252 -1.000000 +149253 -1.000000 +149260 -1.000000 +149261 -1.000000 +149262 -1.000000 +149263 -1.000000 +149265 -1.000000 +149267 -1.000000 +149268 -1.000000 +149284 -1.000000 +149285 -1.000000 +149286 -1.000000 +149287 -1.000000 +149288 -1.000000 +149289 -1.000000 +149290 -1.000000 +149291 -1.000000 +149292 -1.000000 +149293 -1.000000 +149299 -1.000000 +149300 -1.000000 +149301 -1.000000 +149303 -1.000000 +149304 -1.000000 +149308 -1.000000 +149310 -1.000000 +149318 -1.000000 +149322 -1.000000 +149323 -1.000000 +149325 -1.000000 +149328 -1.000000 +149330 -1.000000 +149332 -1.000000 +149333 -1.000000 +149334 -1.000000 +149335 -1.000000 +149336 -1.000000 +149337 -1.000000 +149339 -1.000000 +149344 -1.000000 +149345 -1.000000 +149346 -1.000000 +149347 -1.000000 +149348 -1.000000 +149350 -1.000000 +149357 -1.000000 +149358 -1.000000 +149359 -1.000000 +149360 -1.000000 +149361 -1.000000 +149362 -1.000000 +149364 -1.000000 +149367 -1.000000 +149370 -1.000000 +149371 -1.000000 +149372 -1.000000 +149373 -1.000000 +149375 -1.000000 +149376 -1.000000 +149377 -1.000000 +149378 -1.000000 +149380 -1.000000 +149383 -1.000000 +149384 -1.000000 +149385 -1.000000 +149386 -1.000000 +149387 -1.000000 +149388 -1.000000 +149393 -1.000000 +149394 -1.000000 +149395 -1.000000 +149396 -1.000000 +149397 -1.000000 +149398 -1.000000 +149399 -1.000000 +149400 -1.000000 +149401 -1.000000 +149403 -1.000000 +149404 -1.000000 +149405 -1.000000 +149406 -1.000000 +149407 -1.000000 +149408 -1.000000 +149409 -1.000000 +149410 -1.000000 +149411 -1.000000 +149412 -1.000000 +149413 -1.000000 +149414 -1.000000 +149415 -1.000000 +149416 -1.000000 +149431 -1.000000 +149437 -1.000000 +149460 -1.000000 +149461 -1.000000 +149465 -1.000000 +149466 -1.000000 +149467 -1.000000 +149468 -1.000000 +149469 -1.000000 +149476 -1.000000 +149485 -1.000000 +149487 -1.000000 +149492 -1.000000 +149493 -1.000000 +149494 -1.000000 +149495 -1.000000 +149496 -1.000000 +149497 -1.000000 +149498 -1.000000 +149509 -1.000000 +149510 -1.000000 +149511 -1.000000 +149512 -1.000000 +149513 -1.000000 +149514 -1.000000 +149515 -1.000000 +149516 -1.000000 +149517 -1.000000 +149518 -1.000000 +149519 -1.000000 +149520 -1.000000 +149521 -1.000000 +149522 -1.000000 +149526 -1.000000 +149527 -1.000000 +149528 -1.000000 +149529 -1.000000 +149533 -1.000000 +149534 -1.000000 +149535 -1.000000 +149536 -1.000000 +149537 -1.000000 +149538 -1.000000 +149539 -1.000000 +149541 -1.000000 +149542 -1.000000 +149543 -1.000000 +149581 -1.000000 +149582 -1.000000 +149583 -1.000000 +149584 -1.000000 +149585 -1.000000 +149587 -1.000000 +149588 -1.000000 +149589 -1.000000 +149590 -1.000000 +149595 -1.000000 +149596 -1.000000 +149598 -1.000000 +149599 -1.000000 +149600 -1.000000 +149601 -1.000000 +149604 -1.000000 +149605 -1.000000 +149606 -1.000000 +149607 -1.000000 +149608 -1.000000 +149609 -1.000000 +149610 -1.000000 +149611 -1.000000 +149613 -1.000000 +149614 -1.000000 +149615 -1.000000 +149617 -1.000000 +149618 -1.000000 +149619 -1.000000 +149620 -1.000000 +149621 -1.000000 +149622 -1.000000 +149623 -1.000000 +149624 -1.000000 +149625 -1.000000 +149651 -1.000000 +149652 -1.000000 +149653 -1.000000 +149654 -1.000000 +149655 -1.000000 +149656 -1.000000 +149658 -1.000000 +149661 -1.000000 +149680 -1.000000 +149681 -1.000000 +149682 -1.000000 +149689 -1.000000 +149690 -1.000000 +149691 -1.000000 +149693 -1.000000 +149697 -1.000000 +149699 -1.000000 +149704 -1.000000 +149705 -1.000000 +149706 -1.000000 +149707 -1.000000 +149708 -1.000000 +149709 -1.000000 +149710 -1.000000 +149711 -1.000000 +149712 -1.000000 +149713 -1.000000 +149714 -1.000000 +149715 -1.000000 +149716 -1.000000 +149717 -1.000000 +149718 -1.000000 +149719 -1.000000 +149722 -1.000000 +149727 -1.000000 +149728 -1.000000 +149729 -1.000000 +149730 -1.000000 +149731 -1.000000 +149732 -1.000000 +149733 -1.000000 +149734 -1.000000 +149735 -1.000000 +149736 -1.000000 +149737 -1.000000 +149738 -1.000000 +149739 -1.000000 +149740 -1.000000 +149741 -1.000000 +149743 -1.000000 +149747 -1.000000 +149754 -1.000000 +149755 -1.000000 +149756 -1.000000 +149757 -1.000000 +149758 -1.000000 +149759 -1.000000 +149760 -1.000000 +149765 -1.000000 +149766 -1.000000 +149767 -1.000000 +149770 -1.000000 +149773 -1.000000 +149774 -1.000000 +149776 -1.000000 +149777 -1.000000 +149779 -1.000000 +149780 -1.000000 +149781 -1.000000 +149782 -1.000000 +149783 -1.000000 +149784 -1.000000 +149785 -1.000000 +149786 -1.000000 +149787 -1.000000 +149789 -1.000000 +149790 -1.000000 +149791 -1.000000 +149792 -1.000000 +149793 -1.000000 +149794 -1.000000 +149795 -1.000000 +149796 -1.000000 +149800 -1.000000 +149801 -1.000000 +149803 -1.000000 +149804 -1.000000 +149805 -1.000000 +149806 -1.000000 +149807 -1.000000 +149808 -1.000000 +149810 -1.000000 +149811 -1.000000 +149813 -1.000000 +149815 -1.000000 +149816 -1.000000 +149818 -1.000000 +149820 -1.000000 +149821 -1.000000 +149822 -1.000000 +149824 -1.000000 +149827 -1.000000 +149828 -1.000000 +149829 -1.000000 +149830 -1.000000 +149834 -1.000000 +149835 -1.000000 +149836 -1.000000 +149837 -1.000000 +149838 -1.000000 +149839 -1.000000 +149840 -1.000000 +149842 -1.000000 +149843 -1.000000 +149845 -1.000000 +149847 -1.000000 +149848 -1.000000 +149849 -1.000000 +149850 -1.000000 +149852 -1.000000 +149853 -1.000000 +149854 -1.000000 +149855 -1.000000 +149856 -1.000000 +149857 -1.000000 +149862 -1.000000 +149863 -1.000000 +149864 -1.000000 +149866 -1.000000 +149867 -1.000000 +149868 -1.000000 +149869 -1.000000 +149870 -1.000000 +149871 -1.000000 +149872 -1.000000 +149878 -1.000000 +149896 -1.000000 +149901 -1.000000 +149902 -1.000000 +149903 -1.000000 +149907 -1.000000 +149922 -1.000000 +149923 -1.000000 +149924 -1.000000 +149925 -1.000000 +149926 -1.000000 +149927 -1.000000 +149928 -1.000000 +149929 -1.000000 +149930 -1.000000 +149931 -1.000000 +149932 -1.000000 +149933 -1.000000 +149934 -1.000000 +149935 -1.000000 +149937 -1.000000 +149938 -1.000000 +149940 -1.000000 +149941 -1.000000 +149942 -1.000000 +149943 -1.000000 +149944 -1.000000 +149945 -1.000000 +149946 -1.000000 +149947 -1.000000 +149948 -1.000000 +149949 -1.000000 +149950 -1.000000 +149951 -1.000000 +149952 -1.000000 +149953 -1.000000 +149954 -1.000000 +149955 -1.000000 +149956 -1.000000 +149957 -1.000000 +149961 -1.000000 +149962 -1.000000 +149967 -1.000000 +149970 -1.000000 +149971 -1.000000 +149973 -1.000000 +149976 -1.000000 +149979 -1.000000 +149983 -1.000000 +149984 -1.000000 +149985 -1.000000 +149986 -1.000000 +149987 -1.000000 +149988 -1.000000 +149989 -1.000000 +149990 -1.000000 +150005 -1.000000 +150015 -1.000000 +150017 -1.000000 +150018 -1.000000 +150019 -1.000000 +150020 -1.000000 +150022 -1.000000 +150023 -1.000000 +150024 -1.000000 +150025 -1.000000 +150026 -1.000000 +150027 -1.000000 +150028 -1.000000 +150029 -1.000000 +150030 -1.000000 +150031 -1.000000 +150032 -1.000000 +150034 -1.000000 +150035 -1.000000 +150036 -1.000000 +150037 -1.000000 +150038 -1.000000 +150039 -1.000000 +150040 -1.000000 +150044 -1.000000 +150045 -1.000000 +150046 -1.000000 +150047 -1.000000 +150048 -1.000000 +150049 -1.000000 +150050 -1.000000 +150052 -1.000000 +150053 -1.000000 +150054 -1.000000 +150055 -1.000000 +150056 -1.000000 +150057 -1.000000 +150058 -1.000000 +150059 -1.000000 +150060 -1.000000 +150061 -1.000000 +150062 -1.000000 +150063 -1.000000 +150064 -1.000000 +150065 -1.000000 +150066 -1.000000 +150068 -1.000000 +150069 -1.000000 +150070 -1.000000 +150071 -1.000000 +150072 -1.000000 +150073 -1.000000 +150074 -1.000000 +150075 -1.000000 +150076 -1.000000 +150077 -1.000000 +150078 -1.000000 +150079 -1.000000 +150080 -1.000000 +150083 -1.000000 +150086 -1.000000 +150092 -1.000000 +150093 -1.000000 +150094 -1.000000 +150095 -1.000000 +150096 -1.000000 +150097 -1.000000 +150098 -1.000000 +150099 -1.000000 +150100 -1.000000 +150101 -1.000000 +150102 -1.000000 +150103 -1.000000 +150104 -1.000000 +150105 -1.000000 +150106 -1.000000 +150107 -1.000000 +150108 -1.000000 +150109 -1.000000 +150111 -1.000000 +150113 -1.000000 +150114 -1.000000 +150115 -1.000000 +150116 -1.000000 +150122 -1.000000 +150124 -1.000000 +150125 -1.000000 +150126 -1.000000 +150132 -1.000000 +150133 -1.000000 +150137 -1.000000 +150139 -1.000000 +150140 -1.000000 +150141 -1.000000 +150142 -1.000000 +150143 -1.000000 +150144 -1.000000 +150145 -1.000000 +150147 -1.000000 +150148 -1.000000 +150149 -1.000000 +150150 -1.000000 +150151 -1.000000 +150152 -1.000000 +150153 -1.000000 +150154 -1.000000 +150155 -1.000000 +150156 -1.000000 +150157 -1.000000 +150158 -1.000000 +150159 -1.000000 +150160 -1.000000 +150161 -1.000000 +150162 -1.000000 +150163 -1.000000 +150164 -1.000000 +150168 -1.000000 +150169 -1.000000 +150170 -1.000000 +150174 -1.000000 +150176 -1.000000 +150179 -1.000000 +150181 -1.000000 +150183 -1.000000 +150184 -1.000000 +150186 -1.000000 +150219 -1.000000 +150220 -1.000000 +150222 -1.000000 +150223 -1.000000 +150225 -1.000000 +150226 -1.000000 +150228 -1.000000 +150247 -1.000000 +150264 -1.000000 +150266 -1.000000 +150269 -1.000000 +150270 -1.000000 +150281 -1.000000 +150282 -1.000000 +150284 -1.000000 +150285 -1.000000 +150287 -1.000000 +150294 -1.000000 +150299 -1.000000 +150300 -1.000000 +150301 -1.000000 +150302 -1.000000 +150306 -1.000000 +150307 -1.000000 +150308 -1.000000 +150309 -1.000000 +150310 -1.000000 +150311 -1.000000 +150312 -1.000000 +150313 -1.000000 +150314 -1.000000 +150315 -1.000000 +150316 -1.000000 +150317 -1.000000 +150318 -1.000000 +150319 -1.000000 +150320 -1.000000 +150321 -1.000000 +150326 -1.000000 +150327 -1.000000 +150328 -1.000000 +150329 -1.000000 +150330 -1.000000 +150331 -1.000000 +150332 -1.000000 +150333 -1.000000 +150334 -1.000000 +150335 -1.000000 +150336 -1.000000 +150337 -1.000000 +150363 -1.000000 +150374 -1.000000 +150401 -1.000000 +150406 -1.000000 +150409 -1.000000 +150411 -1.000000 +150412 -1.000000 +150414 -1.000000 +150415 -1.000000 +150416 -1.000000 +150417 -1.000000 +150418 -1.000000 +150419 -1.000000 +150420 -1.000000 +150422 -1.000000 +150423 -1.000000 +150424 -1.000000 +150426 -1.000000 +150427 -1.000000 +150428 -1.000000 +150430 -1.000000 +150431 -1.000000 +150432 -1.000000 +150433 -1.000000 +150434 -1.000000 +150435 -1.000000 +150436 -1.000000 +150441 -1.000000 +150442 -1.000000 +150443 -1.000000 +150444 -1.000000 +150445 -1.000000 +150446 -1.000000 +150454 -1.000000 +150455 -1.000000 +150456 -1.000000 +150457 -1.000000 +150458 -1.000000 +150459 -1.000000 +150460 -1.000000 +150472 -1.000000 +150473 -1.000000 +150512 -1.000000 +150518 -1.000000 +150519 -1.000000 +150520 -1.000000 +150521 -1.000000 +150523 -1.000000 +150526 -1.000000 +150530 -1.000000 +150549 -1.000000 +150550 -1.000000 +150552 -1.000000 +150554 -1.000000 +150559 -1.000000 +150602 -1.000000 +150603 -1.000000 +150604 -1.000000 +150605 -1.000000 +150606 -1.000000 +150607 -1.000000 +150608 -1.000000 +150609 -1.000000 +150610 -1.000000 +150611 -1.000000 +150612 -1.000000 +150614 -1.000000 +150615 -1.000000 +150616 -1.000000 +150618 -1.000000 +150620 -1.000000 +150622 -1.000000 +150623 -1.000000 +150624 -1.000000 +150633 -1.000000 +150637 -1.000000 +150640 -1.000000 +150645 -1.000000 +150652 -1.000000 +150653 -1.000000 +150655 -1.000000 +150657 -1.000000 +150658 -1.000000 +150660 -1.000000 +150662 -1.000000 +150663 -1.000000 +150664 -1.000000 +150665 -1.000000 +150666 -1.000000 +150667 -1.000000 +150672 -1.000000 +150673 -1.000000 +150674 -1.000000 +150675 -1.000000 +150676 -1.000000 +150677 -1.000000 +150678 -1.000000 +150679 -1.000000 +150680 -1.000000 +150681 -1.000000 +150682 -1.000000 +150683 -1.000000 +150684 -1.000000 +150685 -1.000000 +150686 -1.000000 +150687 -1.000000 +150697 -1.000000 +150699 -1.000000 +150700 -1.000000 +150701 -1.000000 +150702 -1.000000 +150703 -1.000000 +150704 -1.000000 +150713 -1.000000 +150717 -1.000000 +150718 -1.000000 +150719 -1.000000 +150720 -1.000000 +150721 -1.000000 +150724 -1.000000 +150726 -1.000000 +150727 -1.000000 +150729 -1.000000 +150731 -1.000000 +150734 -1.000000 +150735 -1.000000 +150739 -1.000000 +150743 -1.000000 +150747 -1.000000 +150748 -1.000000 +150749 -1.000000 +150750 -1.000000 +150751 -1.000000 +150752 -1.000000 +150753 -1.000000 +150754 -1.000000 +150757 -1.000000 +150758 -1.000000 +150759 -1.000000 +150760 -1.000000 +150761 -1.000000 +150762 -1.000000 +150763 -1.000000 +150764 -1.000000 +150765 -1.000000 +150766 -1.000000 +150767 -1.000000 +150768 -1.000000 +150769 -1.000000 +150770 -1.000000 +150771 -1.000000 +150772 -1.000000 +150773 -1.000000 +150774 -1.000000 +150778 -1.000000 +150779 -1.000000 +150780 -1.000000 +150782 -1.000000 +150783 -1.000000 +150785 -1.000000 +150786 -1.000000 +150787 -1.000000 +150789 -1.000000 +150790 -1.000000 +150792 -1.000000 +150795 -1.000000 +150796 -1.000000 +150797 -1.000000 +150798 -1.000000 +150799 -1.000000 +150800 -1.000000 +150801 -1.000000 +150802 -1.000000 +150803 -1.000000 +150804 -1.000000 +150805 -1.000000 +150806 -1.000000 +150807 -1.000000 +150808 -1.000000 +150809 -1.000000 +150810 -1.000000 +150811 -1.000000 +150812 -1.000000 +150814 -1.000000 +150815 -1.000000 +150816 -1.000000 +150817 -1.000000 +150821 -1.000000 +150822 -1.000000 +150823 -1.000000 +150825 -1.000000 +150826 -1.000000 +150828 -1.000000 +150833 -1.000000 +150836 -1.000000 +150837 -1.000000 +150839 -1.000000 +150840 -1.000000 +150842 -1.000000 +150843 -1.000000 +150844 -1.000000 +150846 -1.000000 +150847 -1.000000 +150849 -1.000000 +150862 -1.000000 +150863 -1.000000 +150865 -1.000000 +150867 -1.000000 +150869 -1.000000 +150870 -1.000000 +150872 -1.000000 +150877 -1.000000 +150878 -1.000000 +150879 -1.000000 +150881 -1.000000 +150882 -1.000000 +150883 -1.000000 +150885 -1.000000 +150886 -1.000000 +150887 -1.000000 +150888 -1.000000 +150890 -1.000000 +150891 -1.000000 +150900 -1.000000 +150901 -1.000000 +150902 -1.000000 +150903 -1.000000 +150907 -1.000000 +150908 -1.000000 +150909 -1.000000 +150910 -1.000000 +152129 -1.000000 +152130 -1.000000 +152132 -1.000000 +152133 -1.000000 +152134 -1.000000 +152135 -1.000000 +152137 -1.000000 +152138 -1.000000 +152139 -1.000000 +152140 -1.000000 +152141 -1.000000 +152142 -1.000000 +152143 -1.000000 +152144 -1.000000 +152145 -1.000000 +152146 -1.000000 +152147 -1.000000 +152148 -1.000000 +152149 -1.000000 +152150 -1.000000 +152151 -1.000000 +152152 -1.000000 +152153 -1.000000 +152154 -1.000000 +152165 -1.000000 +152166 -1.000000 +152167 -1.000000 +152168 -1.000000 +152169 -1.000000 +152170 -1.000000 +152171 -1.000000 +152173 -1.000000 +152175 -1.000000 +152177 -1.000000 +152178 -1.000000 +152179 -1.000000 +152180 -1.000000 +152181 -1.000000 +152182 -1.000000 +152183 -1.000000 +152192 -1.000000 +152193 -1.000000 +152194 -1.000000 +152195 -1.000000 +152196 -1.000000 +152197 -1.000000 +152201 -1.000000 +152202 -1.000000 +152203 -1.000000 +152204 -1.000000 +152207 -1.000000 +152208 -1.000000 +152209 -1.000000 +152210 -1.000000 +152211 -1.000000 +152228 -1.000000 +152230 -1.000000 +152232 -1.000000 +152233 -1.000000 +152235 -1.000000 +152236 -1.000000 +152237 -1.000000 +152238 -1.000000 +152239 -1.000000 +152240 -1.000000 +152244 -1.000000 +152245 -1.000000 +152246 -1.000000 +152248 -1.000000 +152249 -1.000000 +152250 -1.000000 +152251 -1.000000 +152252 -1.000000 +152253 -1.000000 +152254 -1.000000 +152255 -1.000000 +152256 -1.000000 +152257 -1.000000 +152269 -1.000000 +152270 -1.000000 +152271 -1.000000 +152272 -1.000000 +152273 -1.000000 +152274 -1.000000 +152275 -1.000000 +152276 -1.000000 +152277 -1.000000 +152278 -1.000000 +152279 -1.000000 +152280 -1.000000 +152281 -1.000000 +152282 -1.000000 +152286 -1.000000 +152287 -1.000000 +152288 -1.000000 +152289 -1.000000 +152290 -1.000000 +152291 -1.000000 +152292 -1.000000 +152293 -1.000000 +152294 -1.000000 +152295 -1.000000 +152296 -1.000000 +152305 -1.000000 +152306 -1.000000 +152314 -1.000000 +152316 -1.000000 +152318 -1.000000 +152319 -1.000000 +152320 -1.000000 +152321 -1.000000 +152322 -1.000000 +152323 -1.000000 +152325 -1.000000 +152326 -1.000000 +152327 -1.000000 +152328 -1.000000 +152329 -1.000000 +152330 -1.000000 +152331 -1.000000 +152332 -1.000000 +152333 -1.000000 +152339 -1.000000 +152340 -1.000000 +152341 -1.000000 +152342 -1.000000 +152343 -1.000000 +152344 -1.000000 +152345 -1.000000 +152346 -1.000000 +152347 -1.000000 +152348 -1.000000 +152349 -1.000000 +152350 -1.000000 +152351 -1.000000 +152352 -1.000000 +152353 -1.000000 +152354 -1.000000 +152355 -1.000000 +152356 -1.000000 +152358 -1.000000 +152359 -1.000000 +152364 -1.000000 +152365 -1.000000 +152366 -1.000000 +152372 -1.000000 +152373 -1.000000 +152374 -1.000000 +152375 -1.000000 +152425 -1.000000 +152426 -1.000000 +152427 -1.000000 +152428 -1.000000 +152429 -1.000000 +152430 -1.000000 +152431 -1.000000 +152432 -1.000000 +152433 -1.000000 +152434 -1.000000 +152435 -1.000000 +152436 -1.000000 +152437 -1.000000 +152438 -1.000000 +152440 -1.000000 +152441 -1.000000 +152442 -1.000000 +152443 -1.000000 +152444 -1.000000 +152445 -1.000000 +152446 -1.000000 +152483 -1.000000 +152484 -1.000000 +152485 -1.000000 +152486 -1.000000 +152487 -1.000000 +152488 -1.000000 +152489 -1.000000 +152490 -1.000000 +152491 -1.000000 +152492 -1.000000 +152493 -1.000000 +152494 -1.000000 +152495 -1.000000 +152496 -1.000000 +152497 -1.000000 +152498 -1.000000 +152504 -1.000000 +152505 -1.000000 +152506 -1.000000 +152507 -1.000000 +152508 -1.000000 +152509 -1.000000 +152510 -1.000000 +152511 -1.000000 +152512 -1.000000 +152513 -1.000000 +152548 -1.000000 +152549 -1.000000 +152550 -1.000000 +152551 -1.000000 +152552 -1.000000 +152554 -1.000000 +152555 -1.000000 +152556 -1.000000 +152557 -1.000000 +152563 -1.000000 +152564 -1.000000 +152565 -1.000000 +152566 -1.000000 +152567 -1.000000 +152568 -1.000000 +152570 -1.000000 +152583 -1.000000 +152584 -1.000000 +152597 -1.000000 +152598 -1.000000 +152599 -1.000000 +152601 -1.000000 +152603 -1.000000 +152604 -1.000000 +152605 -1.000000 +152606 -1.000000 +152616 -1.000000 +152617 -1.000000 +152618 -1.000000 +152619 -1.000000 +152620 -1.000000 +152621 -1.000000 +152622 -1.000000 +152624 -1.000000 +152625 -1.000000 +152630 -1.000000 +152631 -1.000000 +152632 -1.000000 +152633 -1.000000 +152634 -1.000000 +152635 -1.000000 +152636 -1.000000 +152637 -1.000000 +152638 -1.000000 +152639 -1.000000 +152640 -1.000000 +152642 -1.000000 +152643 -1.000000 +152697 -1.000000 +152699 -1.000000 +152700 -1.000000 +152703 -1.000000 +152704 -1.000000 +152705 -1.000000 +152706 -1.000000 +152719 -1.000000 +152720 -1.000000 +152721 -1.000000 +152722 -1.000000 +152723 -1.000000 +152725 -1.000000 +152726 -1.000000 +152727 -1.000000 +152728 -1.000000 +152729 -1.000000 +152730 -1.000000 +152731 -1.000000 +152733 -1.000000 +152734 -1.000000 +152735 -1.000000 +152736 -1.000000 +152737 -1.000000 +152738 -1.000000 +152741 -1.000000 +152742 -1.000000 +152743 -1.000000 +152744 -1.000000 +152745 -1.000000 +152758 -1.000000 +152759 -1.000000 +152760 -1.000000 +152761 -1.000000 +152762 -1.000000 +152763 -1.000000 +152764 -1.000000 +152765 -1.000000 +152766 -1.000000 +152767 -1.000000 +152768 -1.000000 +152769 -1.000000 +152773 -1.000000 +152774 -1.000000 +152775 -1.000000 +152776 -1.000000 +152781 -1.000000 +152789 -1.000000 +152790 -1.000000 +152791 -1.000000 +152796 -1.000000 +152814 -1.000000 +152815 -1.000000 +152816 -1.000000 +152817 -1.000000 +152818 -1.000000 +152821 -1.000000 +152822 -1.000000 +152823 -1.000000 +152824 -1.000000 +152825 -1.000000 +152826 -1.000000 +152827 -1.000000 +152828 -1.000000 +152833 -1.000000 +152834 -1.000000 +152835 -1.000000 +152836 -1.000000 +152837 -1.000000 +152838 -1.000000 +152839 -1.000000 +152840 -1.000000 +152841 -1.000000 +152842 -1.000000 +152843 -1.000000 +152844 -1.000000 +152851 -1.000000 +152855 -1.000000 +152857 -1.000000 +152862 -1.000000 +152863 -1.000000 +152864 -1.000000 +152865 -1.000000 +152866 -1.000000 +152867 -1.000000 +152868 -1.000000 +152869 -1.000000 +152870 -1.000000 +152871 -1.000000 +152872 -1.000000 +152873 -1.000000 +152874 -1.000000 +152875 -1.000000 +152876 -1.000000 +152877 -1.000000 +152878 -1.000000 +152880 -1.000000 +152886 -1.000000 +152891 -1.000000 +152898 -1.000000 +152911 -1.000000 +152912 -1.000000 +152915 -1.000000 +152919 -1.000000 +152921 -1.000000 +152922 -1.000000 +152923 -1.000000 +152924 -1.000000 +152926 -1.000000 +152927 -1.000000 +152928 -1.000000 +152929 -1.000000 +152930 -1.000000 +152932 -1.000000 +152933 -1.000000 +152934 -1.000000 +152935 -1.000000 +152936 -1.000000 +152937 -1.000000 +152965 -1.000000 +152975 -1.000000 +152976 -1.000000 +152977 -1.000000 +152978 -1.000000 +152979 -1.000000 +152982 -1.000000 +152985 -1.000000 +152987 -1.000000 +152988 -1.000000 +152989 -1.000000 +152990 -1.000000 +152991 -1.000000 +152992 -1.000000 +152993 -1.000000 +152994 -1.000000 +152995 -1.000000 +152996 -1.000000 +152997 -1.000000 +152998 -1.000000 +152999 -1.000000 +153000 -1.000000 +153001 -1.000000 +153002 -1.000000 +153003 -1.000000 +153004 -1.000000 +153005 -1.000000 +153006 -1.000000 +153007 -1.000000 +153008 -1.000000 +153009 -1.000000 +153010 -1.000000 +153011 -1.000000 +153012 -1.000000 +153022 -1.000000 +153023 -1.000000 +153024 -1.000000 +153025 -1.000000 +153026 -1.000000 +153027 -1.000000 +153028 -1.000000 +153029 -1.000000 +153030 -1.000000 +153031 -1.000000 +153032 -1.000000 +153033 -1.000000 +153034 -1.000000 +153035 -1.000000 +153036 -1.000000 +153037 -1.000000 +153038 -1.000000 +153039 -1.000000 +153040 -1.000000 +153041 -1.000000 +153042 -1.000000 +153043 -1.000000 +153044 -1.000000 +153045 -1.000000 +153046 -1.000000 +153047 -1.000000 +153048 -1.000000 +153049 -1.000000 +153050 -1.000000 +153054 -1.000000 +153060 -1.000000 +153061 -1.000000 +153062 -1.000000 +153063 -1.000000 +153064 -1.000000 +153065 -1.000000 +153066 -1.000000 +153067 -1.000000 +153068 -1.000000 +153070 -1.000000 +153071 -1.000000 +153072 -1.000000 +153073 -1.000000 +153074 -1.000000 +153075 -1.000000 +153076 -1.000000 +153077 -1.000000 +153078 -1.000000 +153079 -1.000000 +153080 -1.000000 +153081 -1.000000 +153082 -1.000000 +153083 -1.000000 +153084 -1.000000 +153085 -1.000000 +153093 -1.000000 +153094 -1.000000 +153095 -1.000000 +153096 -1.000000 +153098 -1.000000 +153099 -1.000000 +153100 -1.000000 +153101 -1.000000 +153102 -1.000000 +153103 -1.000000 +153104 -1.000000 +153105 -1.000000 +153106 -1.000000 +153108 -1.000000 +153109 -1.000000 +153110 -1.000000 +153111 -1.000000 +153112 -1.000000 +153114 -1.000000 +153115 -1.000000 +153116 -1.000000 +153117 -1.000000 +153118 -1.000000 +153119 -1.000000 +153151 -1.000000 +153152 -1.000000 +153153 -1.000000 +153154 -1.000000 +153156 -1.000000 +153158 -1.000000 +153252 -1.000000 +153253 -1.000000 +153254 -1.000000 +153255 -1.000000 +153256 -1.000000 +153260 -1.000000 +153261 -1.000000 +153269 -1.000000 +153277 -1.000000 +153283 -1.000000 +153284 -1.000000 +153286 -1.000000 +153287 -1.000000 +153289 -1.000000 +153290 -1.000000 +153291 -1.000000 +153292 -1.000000 +153293 -1.000000 +153295 -1.000000 +153296 -1.000000 +153297 -1.000000 +153298 -1.000000 +153299 -1.000000 +153301 -1.000000 +153304 -1.000000 +153306 -1.000000 +153308 -1.000000 +153309 -1.000000 +153314 -1.000000 +153318 -1.000000 +153322 -1.000000 +153326 -1.000000 +153328 -1.000000 +153333 -1.000000 +153341 -1.000000 +153342 -1.000000 +153348 -1.000000 +153349 -1.000000 +153350 -1.000000 +153357 -1.000000 +153359 -1.000000 +153368 -1.000000 +153370 -1.000000 +153375 -1.000000 +153377 -1.000000 +153378 -1.000000 +153382 -1.000000 +153396 -1.000000 +153398 -1.000000 +153399 -1.000000 +153402 -1.000000 +153403 -1.000000 +153404 -1.000000 +153405 -1.000000 +153406 -1.000000 +153407 -1.000000 +153408 -1.000000 +153412 -1.000000 +153418 -1.000000 +153419 -1.000000 +153421 -1.000000 +153422 -1.000000 +153424 -1.000000 +153425 -1.000000 +153427 -1.000000 +153428 -1.000000 +153429 -1.000000 +153430 -1.000000 +153431 -1.000000 +153432 -1.000000 +153433 -1.000000 +153434 -1.000000 +153435 -1.000000 +153436 -1.000000 +153437 -1.000000 +153439 -1.000000 +153441 -1.000000 +153442 -1.000000 +153457 -1.000000 +153458 -1.000000 +153463 -1.000000 +153464 -1.000000 +153465 -1.000000 +153466 -1.000000 +153467 -1.000000 +153470 -1.000000 +153471 -1.000000 +153472 -1.000000 +153473 -1.000000 +153474 -1.000000 +153475 -1.000000 +153476 -1.000000 +153481 -1.000000 +153482 -1.000000 +153485 -1.000000 +153486 -1.000000 +153487 -1.000000 +153488 -1.000000 +153489 -1.000000 +153491 -1.000000 +153492 -1.000000 +153493 -1.000000 +153495 -1.000000 +153496 -1.000000 +153497 -1.000000 +153498 -1.000000 +153499 -1.000000 +153500 -1.000000 +153501 -1.000000 +153502 -1.000000 +153503 -1.000000 +153504 -1.000000 +153505 -1.000000 +153506 -1.000000 +153509 -1.000000 +153510 -1.000000 +153511 -1.000000 +153512 -1.000000 +153513 -1.000000 +153514 -1.000000 +153515 -1.000000 +153516 -1.000000 +153517 -1.000000 +153518 -1.000000 +153519 -1.000000 +153520 -1.000000 +153533 -1.000000 +153537 -1.000000 +153541 -1.000000 +153542 -1.000000 +153543 -1.000000 +153544 -1.000000 +153550 -1.000000 +153551 -1.000000 +153561 -1.000000 +153562 -1.000000 +153564 -1.000000 +153576 -1.000000 +153577 -1.000000 +153578 -1.000000 +153580 -1.000000 +153581 -1.000000 +153582 -1.000000 +153589 -1.000000 +153590 -1.000000 +153591 -1.000000 +153592 -1.000000 +153595 -1.000000 +153596 -1.000000 +153597 -1.000000 +153598 -1.000000 +153599 -1.000000 +153600 -1.000000 +153606 -1.000000 +153609 -1.000000 +153611 -1.000000 +153612 -1.000000 +153614 -1.000000 +153615 -1.000000 +153616 -1.000000 +153617 -1.000000 +153618 -1.000000 +153619 -1.000000 +153620 -1.000000 +153622 -1.000000 +153623 -1.000000 +153624 -1.000000 +153625 -1.000000 +153626 -1.000000 +153627 -1.000000 +153628 -1.000000 +153629 -1.000000 +153630 -1.000000 +153631 -1.000000 +153638 -1.000000 +153639 -1.000000 +153640 -1.000000 +153641 -1.000000 +153642 -1.000000 +153643 -1.000000 +153644 -1.000000 +153645 -1.000000 +153646 -1.000000 +153647 -1.000000 +153648 -1.000000 +153649 -1.000000 +153650 -1.000000 +153651 -1.000000 +153653 -1.000000 +153654 -1.000000 +153655 -1.000000 +153656 -1.000000 +153657 -1.000000 +153658 -1.000000 +153659 -1.000000 +153661 -1.000000 +153662 -1.000000 +153663 -1.000000 +153669 -1.000000 +153670 -1.000000 +153671 -1.000000 +153672 -1.000000 +153673 -1.000000 +153677 -1.000000 +153678 -1.000000 +153679 -1.000000 +153680 -1.000000 +153682 -1.000000 +153683 -1.000000 +153684 -1.000000 +153685 -1.000000 +153686 -1.000000 +153694 -1.000000 +153695 -1.000000 +153696 -1.000000 +153697 -1.000000 +153700 -1.000000 +153701 -1.000000 +153702 -1.000000 +153703 -1.000000 +153704 -1.000000 +153705 -1.000000 +153707 -1.000000 +153708 -1.000000 +153709 -1.000000 +153710 -1.000000 +153711 -1.000000 +153712 -1.000000 +153721 -1.000000 +153722 -1.000000 +153726 -1.000000 +153727 -1.000000 +153734 -1.000000 +153735 -1.000000 +153737 -1.000000 +153740 -1.000000 +153754 -1.000000 +153757 -1.000000 +153759 -1.000000 +153760 -1.000000 +153761 -1.000000 +153762 -1.000000 +153763 -1.000000 +153764 -1.000000 +153765 -1.000000 +153766 -1.000000 +153767 -1.000000 +153768 -1.000000 +153769 -1.000000 +153771 -1.000000 +153774 -1.000000 +153801 -1.000000 +153802 -1.000000 +153803 -1.000000 +153804 -1.000000 +153805 -1.000000 +153806 -1.000000 +153813 -1.000000 +153816 -1.000000 +153818 -1.000000 +153819 -1.000000 +153820 -1.000000 +153821 -1.000000 +153822 -1.000000 +153823 -1.000000 +153824 -1.000000 +153825 -1.000000 +153826 -1.000000 +153827 -1.000000 +153828 -1.000000 +153829 -1.000000 +153830 -1.000000 +153831 -1.000000 +153832 -1.000000 +153833 -1.000000 +153834 -1.000000 +153835 -1.000000 +153836 -1.000000 +153837 -1.000000 +153838 -1.000000 +153839 -1.000000 +153840 -1.000000 +153841 -1.000000 +153852 -1.000000 +153853 -1.000000 +153854 -1.000000 +153855 -1.000000 +153856 -1.000000 +153857 -1.000000 +153858 -1.000000 +153859 -1.000000 +153860 -1.000000 +153861 -1.000000 +153862 -1.000000 +153863 -1.000000 +153864 -1.000000 +153867 -1.000000 +153869 -1.000000 +153871 -1.000000 +153872 -1.000000 +153888 -1.000000 +153891 -1.000000 +153893 -1.000000 +153902 -1.000000 +153903 -1.000000 +153904 -1.000000 +153905 -1.000000 +153906 -1.000000 +153909 -1.000000 +153911 -1.000000 +153919 -1.000000 +153920 -1.000000 +153921 -1.000000 +153922 -1.000000 +153923 -1.000000 +153924 -1.000000 +153925 -1.000000 +153926 -1.000000 +153927 -1.000000 +153928 -1.000000 +153929 -1.000000 +153931 -1.000000 +153932 -1.000000 +153933 -1.000000 +153934 -1.000000 +153935 -1.000000 +153936 -1.000000 +153937 -1.000000 +153938 -1.000000 +153939 -1.000000 +153940 -1.000000 +153941 -1.000000 +153942 -1.000000 +153943 -1.000000 +153944 -1.000000 +153949 -1.000000 +153950 -1.000000 +153951 -1.000000 +153952 -1.000000 +153955 -1.000000 +153957 -1.000000 +153958 -1.000000 +153962 -1.000000 +153963 -1.000000 +153966 -1.000000 +153988 -1.000000 +153989 -1.000000 +153990 -1.000000 +153991 -1.000000 +153992 -1.000000 +153993 -1.000000 +153994 -1.000000 +153995 -1.000000 +153996 -1.000000 +153997 -1.000000 +153998 -1.000000 +153999 -1.000000 +154000 -1.000000 +154003 -1.000000 +154033 -1.000000 +154035 -1.000000 +154037 -1.000000 +154038 -1.000000 +154044 -1.000000 +154045 -1.000000 +154046 -1.000000 +154047 -1.000000 +154048 -1.000000 +154049 -1.000000 +154050 -1.000000 +154051 -1.000000 +154052 -1.000000 +154053 -1.000000 +154054 -1.000000 +154055 -1.000000 +154057 -1.000000 +154058 -1.000000 +154059 -1.000000 +154060 -1.000000 +154061 -1.000000 +154062 -1.000000 +154063 -1.000000 +154064 -1.000000 +154065 -1.000000 +154066 -1.000000 +154067 -1.000000 +154068 -1.000000 +154079 -1.000000 +154081 -1.000000 +154082 -1.000000 +154083 -1.000000 +154092 -1.000000 +154105 -1.000000 +154117 -1.000000 +154118 -1.000000 +154119 -1.000000 +154122 -1.000000 +154123 -1.000000 +154124 -1.000000 +154125 -1.000000 +154126 -1.000000 +154128 -1.000000 +154165 -1.000000 +154247 -1.000000 +154248 -1.000000 +154249 -1.000000 +154250 -1.000000 +154251 -1.000000 +154252 -1.000000 +154253 -1.000000 +154254 -1.000000 +154256 -1.000000 +154257 -1.000000 +154258 -1.000000 +154259 -1.000000 +154260 -1.000000 +154267 -1.000000 +154268 -1.000000 +154284 -1.000000 +154285 -1.000000 +154286 -1.000000 +154287 -1.000000 +154288 -1.000000 +154289 -1.000000 +154290 -1.000000 +154291 -1.000000 +154292 -1.000000 +154293 -1.000000 +154294 -1.000000 +154295 -1.000000 +154296 -1.000000 +154297 -1.000000 +154298 -1.000000 +154310 -1.000000 +154317 -1.000000 +154318 -1.000000 +154319 -1.000000 +154320 -1.000000 +154321 -1.000000 +154322 -1.000000 +154323 -1.000000 +154324 -1.000000 +154325 -1.000000 +154326 -1.000000 +154327 -1.000000 +154328 -1.000000 +154329 -1.000000 +154330 -1.000000 +154331 -1.000000 +154332 -1.000000 +154333 -1.000000 +154334 -1.000000 +154335 -1.000000 +154336 -1.000000 +154337 -1.000000 +154338 -1.000000 +154339 -1.000000 +154340 -1.000000 +154341 -1.000000 +154342 -1.000000 +154343 -1.000000 +154344 -1.000000 +154345 -1.000000 +154346 -1.000000 +154347 -1.000000 +154348 -1.000000 +154349 -1.000000 +154357 -1.000000 +154358 -1.000000 +154359 -1.000000 +154360 -1.000000 +154362 -1.000000 +154363 -1.000000 +154364 -1.000000 +154365 -1.000000 +154366 -1.000000 +154368 -1.000000 +154369 -1.000000 +154370 -1.000000 +154371 -1.000000 +154372 -1.000000 +154373 -1.000000 +154374 -1.000000 +154375 -1.000000 +154376 -1.000000 +154377 -1.000000 +154378 -1.000000 +154380 -1.000000 +154381 -1.000000 +154383 -1.000000 +154384 -1.000000 +154385 -1.000000 +154387 -1.000000 +154388 -1.000000 +154389 -1.000000 +154390 -1.000000 +154391 -1.000000 +154392 -1.000000 +154396 -1.000000 +154397 -1.000000 +154398 -1.000000 +154399 -1.000000 +154400 -1.000000 +154401 -1.000000 +154402 -1.000000 +154403 -1.000000 +154404 -1.000000 +154405 -1.000000 +154406 -1.000000 +154407 -1.000000 +154408 -1.000000 +154410 -1.000000 +154411 -1.000000 +154412 -1.000000 +154414 -1.000000 +154415 -1.000000 +154416 -1.000000 +154417 -1.000000 +154418 -1.000000 +154419 -1.000000 +154421 -1.000000 +154427 -1.000000 +154428 -1.000000 +154429 -1.000000 +154430 -1.000000 +154431 -1.000000 +154432 -1.000000 +154433 -1.000000 +154434 -1.000000 +154435 -1.000000 +154436 -1.000000 +154437 -1.000000 +154438 -1.000000 +154440 -1.000000 +154441 -1.000000 +154442 -1.000000 +154443 -1.000000 +154445 -1.000000 +154446 -1.000000 +154447 -1.000000 +154448 -1.000000 +154449 -1.000000 +154450 -1.000000 +154451 -1.000000 +154464 -1.000000 +154466 -1.000000 +154477 -1.000000 +154481 -1.000000 +154486 -1.000000 +154497 -1.000000 +154503 -1.000000 +154504 -1.000000 +154505 -1.000000 +154506 -1.000000 +154507 -1.000000 +154508 -1.000000 +154509 -1.000000 +154510 -1.000000 +154511 -1.000000 +154516 -1.000000 +154518 -1.000000 +154523 -1.000000 +154525 -1.000000 +154527 -1.000000 +154531 -1.000000 +154532 -1.000000 +154535 -1.000000 +154536 -1.000000 +154537 -1.000000 +154538 -1.000000 +154540 -1.000000 +154541 -1.000000 +154544 -1.000000 +154547 -1.000000 +154548 -1.000000 +154550 -1.000000 +154554 -1.000000 +154556 -1.000000 +154557 -1.000000 +154562 -1.000000 +154564 -1.000000 +154565 -1.000000 +154566 -1.000000 +154567 -1.000000 +154569 -1.000000 +154570 -1.000000 +154572 -1.000000 +154573 -1.000000 +154574 -1.000000 +154578 -1.000000 +154579 -1.000000 +154583 -1.000000 +154584 -1.000000 +154585 -1.000000 +154586 -1.000000 +154587 -1.000000 +154588 -1.000000 +154589 -1.000000 +154591 -1.000000 +154592 -1.000000 +154593 -1.000000 +154595 -1.000000 +154606 -1.000000 +154613 -1.000000 +154647 -1.000000 +154648 -1.000000 +154649 -1.000000 +154650 -1.000000 +154652 -1.000000 +154655 -1.000000 +154656 -1.000000 +154657 -1.000000 +154658 -1.000000 +154659 -1.000000 +154660 -1.000000 +154663 -1.000000 +154665 -1.000000 +154666 -1.000000 +154667 -1.000000 +154668 -1.000000 +154670 -1.000000 +154671 -1.000000 +154672 -1.000000 +154674 -1.000000 +154675 -1.000000 +154677 -1.000000 +154678 -1.000000 +154679 -1.000000 +154680 -1.000000 +154681 -1.000000 +154684 -1.000000 +154685 -1.000000 +154686 -1.000000 +154687 -1.000000 +154688 -1.000000 +154689 -1.000000 +154690 -1.000000 +154691 -1.000000 +154692 -1.000000 +154693 -1.000000 +154694 -1.000000 +154695 -1.000000 +154696 -1.000000 +154723 -1.000000 +154724 -1.000000 +154725 -1.000000 +154726 -1.000000 +154727 -1.000000 +154728 -1.000000 +154729 -1.000000 +154730 -1.000000 +154731 -1.000000 +154732 -1.000000 +154733 -1.000000 +154734 -1.000000 +154735 -1.000000 +154736 -1.000000 +154737 -1.000000 +154738 -1.000000 +154739 -1.000000 +154740 -1.000000 +154741 -1.000000 +154742 -1.000000 +154743 -1.000000 +154744 -1.000000 +154747 -1.000000 +154748 -1.000000 +154749 -1.000000 +154750 -1.000000 +154751 -1.000000 +154752 -1.000000 +154753 -1.000000 +154754 -1.000000 +154755 -1.000000 +154759 -1.000000 +154760 -1.000000 +154761 -1.000000 +154763 -1.000000 +154764 -1.000000 +154765 -1.000000 +154767 -1.000000 +154774 -1.000000 +154776 -1.000000 +154777 -1.000000 +154779 -1.000000 +154780 -1.000000 +154781 -1.000000 +154785 -1.000000 +154786 -1.000000 +154787 -1.000000 +154788 -1.000000 +154789 -1.000000 +154797 -1.000000 +154830 -1.000000 +154831 -1.000000 +154833 -1.000000 +154834 -1.000000 +154835 -1.000000 +154836 -1.000000 +154837 -1.000000 +154842 -1.000000 +154849 -1.000000 +154858 -1.000000 +154859 -1.000000 +154860 -1.000000 +154861 -1.000000 +154862 -1.000000 +154863 -1.000000 +154864 -1.000000 +154865 -1.000000 +154866 -1.000000 +154867 -1.000000 +154868 -1.000000 +154869 -1.000000 +154870 -1.000000 +154871 -1.000000 +154872 -1.000000 +154873 -1.000000 +154879 -1.000000 +154893 -1.000000 +154894 -1.000000 +154919 -1.000000 +154922 -1.000000 +154926 -1.000000 +154927 -1.000000 +154928 -1.000000 +154929 -1.000000 +154930 -1.000000 +154931 -1.000000 +154932 -1.000000 +154933 -1.000000 +154934 -1.000000 +154935 -1.000000 +154937 -1.000000 +154939 -1.000000 +154971 -1.000000 +154976 -1.000000 +154980 -1.000000 +154982 -1.000000 +154984 -1.000000 +154993 -1.000000 +155003 -1.000000 +155004 -1.000000 +155005 -1.000000 +155008 -1.000000 +155011 -1.000000 +155013 -1.000000 +155023 -1.000000 +155024 -1.000000 +155025 -1.000000 +155026 -1.000000 +155027 -1.000000 +155028 -1.000000 +155029 -1.000000 +155030 -1.000000 +155038 -1.000000 +155039 -1.000000 +155068 -1.000000 +155103 -1.000000 +155105 -1.000000 +155106 -1.000000 +155107 -1.000000 +155113 -1.000000 +155114 -1.000000 +155115 -1.000000 +155117 -1.000000 +155118 -1.000000 +155119 -1.000000 +155120 -1.000000 +155121 -1.000000 +155122 -1.000000 +155123 -1.000000 +155125 -1.000000 +155126 -1.000000 +155127 -1.000000 +155128 -1.000000 +155129 -1.000000 +155130 -1.000000 +155131 -1.000000 +155132 -1.000000 +155133 -1.000000 +155134 -1.000000 +155135 -1.000000 +155136 -1.000000 +155137 -1.000000 +155138 -1.000000 +155139 -1.000000 +155140 -1.000000 +155141 -1.000000 +155142 -1.000000 +155143 -1.000000 +155147 -1.000000 +155148 -1.000000 +155149 -1.000000 +155150 -1.000000 +155151 -1.000000 +155152 -1.000000 +155153 -1.000000 +155154 -1.000000 +155156 -1.000000 +155157 -1.000000 +155158 -1.000000 +155159 -1.000000 +155160 -1.000000 +155161 -1.000000 +155162 -1.000000 +155163 -1.000000 +155164 -1.000000 +155165 -1.000000 +155166 -1.000000 +155167 -1.000000 +155168 -1.000000 +155170 -1.000000 +155171 -1.000000 +155172 -1.000000 +155173 -1.000000 +155174 -1.000000 +155175 -1.000000 +155182 -1.000000 +155183 -1.000000 +155194 -1.000000 +155195 -1.000000 +155199 -1.000000 +155209 -1.000000 +155212 -1.000000 +155213 -1.000000 +155225 -1.000000 +155227 -1.000000 +155228 -1.000000 +155229 -1.000000 +155230 -1.000000 +155231 -1.000000 +155232 -1.000000 +155233 -1.000000 +155234 -1.000000 +155235 -1.000000 +155236 -1.000000 +155237 -1.000000 +155238 -1.000000 +155239 -1.000000 +155240 -1.000000 +155241 -1.000000 +155242 -1.000000 +155243 -1.000000 +155244 -1.000000 +155245 -1.000000 +155247 -1.000000 +155248 -1.000000 +155249 -1.000000 +155250 -1.000000 +155251 -1.000000 +155252 -1.000000 +155253 -1.000000 +155254 -1.000000 +155256 -1.000000 +155258 -1.000000 +155259 -1.000000 +155270 -1.000000 +155272 -1.000000 +155273 -1.000000 +155279 -1.000000 +155281 -1.000000 +155282 -1.000000 +155283 -1.000000 +155284 -1.000000 +155285 -1.000000 +155288 -1.000000 +155290 -1.000000 +155291 -1.000000 +155292 -1.000000 +155293 -1.000000 +155295 -1.000000 +155296 -1.000000 +155297 -1.000000 +155298 -1.000000 +155299 -1.000000 +155320 -1.000000 +155321 -1.000000 +155322 -1.000000 +155323 -1.000000 +155324 -1.000000 +155326 -1.000000 +155328 -1.000000 +155330 -1.000000 +155335 -1.000000 +155337 -1.000000 +155342 -1.000000 +155343 -1.000000 +155344 -1.000000 +155345 -1.000000 +155346 -1.000000 +155347 -1.000000 +155348 -1.000000 +155352 -1.000000 +155355 -1.000000 +155365 -1.000000 +155366 -1.000000 +155367 -1.000000 +155368 -1.000000 +155369 -1.000000 +155370 -1.000000 +155371 -1.000000 +155372 -1.000000 +155373 -1.000000 +155374 -1.000000 +155375 -1.000000 +155377 -1.000000 +155378 -1.000000 +155379 -1.000000 +155381 -1.000000 +155382 -1.000000 +155383 -1.000000 +155384 -1.000000 +155385 -1.000000 +155386 -1.000000 +155390 -1.000000 +155391 -1.000000 +155392 -1.000000 +155393 -1.000000 +155394 -1.000000 +155407 -1.000000 +155408 -1.000000 +155409 -1.000000 +155411 -1.000000 +155412 -1.000000 +155413 -1.000000 +155414 -1.000000 +155417 -1.000000 +155418 -1.000000 +155419 -1.000000 +155420 -1.000000 +155421 -1.000000 +155422 -1.000000 +155423 -1.000000 +155425 -1.000000 +155426 -1.000000 +155427 -1.000000 +155428 -1.000000 +155429 -1.000000 +155430 -1.000000 +155431 -1.000000 +155432 -1.000000 +155433 -1.000000 +155434 -1.000000 +155435 -1.000000 +155436 -1.000000 +155437 -1.000000 +155439 -1.000000 +155440 -1.000000 +155442 -1.000000 +155446 -1.000000 +155447 -1.000000 +155448 -1.000000 +155449 -1.000000 +155451 -1.000000 +155463 -1.000000 +155466 -1.000000 +155467 -1.000000 +155474 -1.000000 +155475 -1.000000 +155476 -1.000000 +155477 -1.000000 +155478 -1.000000 +155479 -1.000000 +155480 -1.000000 +155481 -1.000000 +155483 -1.000000 +155484 -1.000000 +155485 -1.000000 +155486 -1.000000 +155487 -1.000000 +155499 -1.000000 +155500 -1.000000 +155501 -1.000000 +155502 -1.000000 +155503 -1.000000 +155504 -1.000000 +155505 -1.000000 +155506 -1.000000 +155507 -1.000000 +155508 -1.000000 +155509 -1.000000 +155510 -1.000000 +155511 -1.000000 +155512 -1.000000 +155513 -1.000000 +155514 -1.000000 +155515 -1.000000 +155516 -1.000000 +155517 -1.000000 +155518 -1.000000 +155519 -1.000000 +155520 -1.000000 +155521 -1.000000 +155522 -1.000000 +155523 -1.000000 +155524 -1.000000 +155526 -1.000000 +155527 -1.000000 +155528 -1.000000 +155529 -1.000000 +155530 -1.000000 +155535 -1.000000 +155536 -1.000000 +155537 -1.000000 +155538 -1.000000 +155539 -1.000000 +155540 -1.000000 +155541 -1.000000 +155542 -1.000000 +155543 -1.000000 +155545 -1.000000 +155546 -1.000000 +155548 -1.000000 +155551 -1.000000 +155552 -1.000000 +155553 -1.000000 +155558 -1.000000 +155559 -1.000000 +155564 -1.000000 +155565 -1.000000 +155566 -1.000000 +155567 -1.000000 +155568 -1.000000 +155569 -1.000000 +155570 -1.000000 +155571 -1.000000 +155572 -1.000000 +155573 -1.000000 +155574 -1.000000 +155575 -1.000000 +155576 -1.000000 +155577 -1.000000 +155578 -1.000000 +155579 -1.000000 +155580 -1.000000 +155581 -1.000000 +155582 -1.000000 +155583 -1.000000 +155584 -1.000000 +155585 -1.000000 +155586 -1.000000 +155589 -1.000000 +155590 -1.000000 +155592 -1.000000 +155593 -1.000000 +155595 -1.000000 +155596 -1.000000 +155599 -1.000000 +155600 -1.000000 +155601 -1.000000 +155602 -1.000000 +155611 -1.000000 +155612 -1.000000 +155613 -1.000000 +155614 -1.000000 +155615 -1.000000 +155616 -1.000000 +155617 -1.000000 +155618 -1.000000 +155619 -1.000000 +155620 -1.000000 +155621 -1.000000 +155622 -1.000000 +155623 -1.000000 +155624 -1.000000 +155625 -1.000000 +155626 -1.000000 +155627 -1.000000 +155628 -1.000000 +155629 -1.000000 +155630 -1.000000 +155631 -1.000000 +155632 -1.000000 +155633 -1.000000 +155641 -1.000000 +155644 -1.000000 +155645 -1.000000 +155646 -1.000000 +155648 -1.000000 +155649 -1.000000 +155650 -1.000000 +155651 -1.000000 +155654 -1.000000 +155655 -1.000000 +155656 -1.000000 +155657 -1.000000 +155658 -1.000000 +155660 -1.000000 +155674 -1.000000 +155681 -1.000000 +156197 -1.000000 +156201 -1.000000 +156202 -1.000000 +156203 -1.000000 +156204 -1.000000 +156206 -1.000000 +156207 -1.000000 +156225 -1.000000 +156226 -1.000000 +156227 -1.000000 +156228 -1.000000 +156229 -1.000000 +156230 -1.000000 +156231 -1.000000 +156232 -1.000000 +156233 -1.000000 +156234 -1.000000 +156235 -1.000000 +156236 -1.000000 +156242 -1.000000 +156243 -1.000000 +156245 -1.000000 +156246 -1.000000 +156247 -1.000000 +156248 -1.000000 +156249 -1.000000 +156250 -1.000000 +156251 -1.000000 +156252 -1.000000 +156253 -1.000000 +156256 -1.000000 +156257 -1.000000 +156258 -1.000000 +156259 -1.000000 +156260 -1.000000 +156261 -1.000000 +156262 -1.000000 +156263 -1.000000 +156264 -1.000000 +156265 -1.000000 +156266 -1.000000 +156274 -1.000000 +156275 -1.000000 +156276 -1.000000 +156277 -1.000000 +156278 -1.000000 +156279 -1.000000 +156280 -1.000000 +156281 -1.000000 +156282 -1.000000 +156283 -1.000000 +156284 -1.000000 +156285 -1.000000 +156286 -1.000000 +156287 -1.000000 +156288 -1.000000 +156292 -1.000000 +156294 -1.000000 +156297 -1.000000 +156298 -1.000000 +156299 -1.000000 +156300 -1.000000 +156301 -1.000000 +156302 -1.000000 +156307 -1.000000 +156308 -1.000000 +156309 -1.000000 +156310 -1.000000 +156311 -1.000000 +156312 -1.000000 +156313 -1.000000 +156314 -1.000000 +156315 -1.000000 +156317 -1.000000 +156318 -1.000000 +156320 -1.000000 +156327 -1.000000 +156332 -1.000000 +156337 -1.000000 +156339 -1.000000 +156340 -1.000000 +156341 -1.000000 +156342 -1.000000 +156349 -1.000000 +156351 -1.000000 +156352 -1.000000 +156353 -1.000000 +156354 -1.000000 +156355 -1.000000 +156356 -1.000000 +156357 -1.000000 +156358 -1.000000 +156359 -1.000000 +156360 -1.000000 +156361 -1.000000 +156362 -1.000000 +156363 -1.000000 +156364 -1.000000 +156365 -1.000000 +156366 -1.000000 +156367 -1.000000 +156368 -1.000000 +156369 -1.000000 +156370 -1.000000 +156371 -1.000000 +156372 -1.000000 +156373 -1.000000 +156374 -1.000000 +156375 -1.000000 +156376 -1.000000 +156384 -1.000000 +156386 -1.000000 +156387 -1.000000 +156388 -1.000000 +156389 -1.000000 +156393 -1.000000 +156394 -1.000000 +156395 -1.000000 +156396 -1.000000 +156397 -1.000000 +156398 -1.000000 +156400 -1.000000 +156401 -1.000000 +156402 -1.000000 +156403 -1.000000 +156413 -1.000000 +156414 -1.000000 +156415 -1.000000 +156416 -1.000000 +156417 -1.000000 +156418 -1.000000 +156419 -1.000000 +156420 -1.000000 +156421 -1.000000 +156422 -1.000000 +156423 -1.000000 +156425 -1.000000 +156426 -1.000000 +156429 -1.000000 +156464 -1.000000 +156465 -1.000000 +156466 -1.000000 +156467 -1.000000 +156468 -1.000000 +156473 -1.000000 +156478 -1.000000 +156481 -1.000000 +156484 -1.000000 +156485 -1.000000 +156502 -1.000000 +156503 -1.000000 +156504 -1.000000 +156505 -1.000000 +156507 -1.000000 +156508 -1.000000 +156509 -1.000000 +156510 -1.000000 +156513 -1.000000 +156516 -1.000000 +156530 -1.000000 +156531 -1.000000 +156532 -1.000000 +156544 -1.000000 +156547 -1.000000 +156548 -1.000000 +156549 -1.000000 +156550 -1.000000 +156554 -1.000000 +156555 -1.000000 +156556 -1.000000 +156557 -1.000000 +156558 -1.000000 +156559 -1.000000 +156562 -1.000000 +156564 -1.000000 +156606 -1.000000 +156607 -1.000000 +156608 -1.000000 +156609 -1.000000 +156610 -1.000000 +156611 -1.000000 +156612 -1.000000 +156613 -1.000000 +156614 -1.000000 +156615 -1.000000 +156616 -1.000000 +156617 -1.000000 +156619 -1.000000 +156620 -1.000000 +156621 -1.000000 +156625 -1.000000 +156636 -1.000000 +156638 -1.000000 +156640 -1.000000 +156642 -1.000000 +156643 -1.000000 +156644 -1.000000 +156645 -1.000000 +156646 -1.000000 +156647 -1.000000 +156648 -1.000000 +156649 -1.000000 +156650 -1.000000 +156651 -1.000000 +156653 -1.000000 +156654 -1.000000 +156655 -1.000000 +156656 -1.000000 +156657 -1.000000 +156659 -1.000000 +156660 -1.000000 +156661 -1.000000 +156662 -1.000000 +156663 -1.000000 +156666 -1.000000 +156668 -1.000000 +156669 -1.000000 +156678 -1.000000 +156679 -1.000000 +156680 -1.000000 +156687 -1.000000 +156692 -1.000000 +156697 -1.000000 +156699 -1.000000 +156700 -1.000000 +156701 -1.000000 +156702 -1.000000 +156703 -1.000000 +156704 -1.000000 +156705 -1.000000 +156706 -1.000000 +156707 -1.000000 +156708 -1.000000 +156709 -1.000000 +156710 -1.000000 +156712 -1.000000 +156713 -1.000000 +156714 -1.000000 +156716 -1.000000 +156722 -1.000000 +156725 -1.000000 +156730 -1.000000 +156731 -1.000000 +156732 -1.000000 +156735 -1.000000 +156737 -1.000000 +156740 -1.000000 +156743 -1.000000 +156744 -1.000000 +156753 -1.000000 +156762 -1.000000 +156763 -1.000000 +156771 -1.000000 +156772 -1.000000 +156773 -1.000000 +156774 -1.000000 +156775 -1.000000 +156776 -1.000000 +156777 -1.000000 +156779 -1.000000 +156780 -1.000000 +156781 -1.000000 +156785 -1.000000 +156786 -1.000000 +156789 -1.000000 +156793 -1.000000 +156797 -1.000000 +156799 -1.000000 +156800 -1.000000 +156801 -1.000000 +156802 -1.000000 +156803 -1.000000 +156805 -1.000000 +156807 -1.000000 +156808 -1.000000 +156809 -1.000000 +156810 -1.000000 +156811 -1.000000 +156814 -1.000000 +156815 -1.000000 +156817 -1.000000 +156820 -1.000000 +156822 -1.000000 +156831 -1.000000 +156832 -1.000000 +156833 -1.000000 +156834 -1.000000 +156835 -1.000000 +156836 -1.000000 +156837 -1.000000 +156838 -1.000000 +156842 -1.000000 +156843 -1.000000 +156844 -1.000000 +156845 -1.000000 +156846 -1.000000 +156847 -1.000000 +156848 -1.000000 +156849 -1.000000 +156850 -1.000000 +156851 -1.000000 +156852 -1.000000 +156853 -1.000000 +156854 -1.000000 +156855 -1.000000 +156856 -1.000000 +156857 -1.000000 +156858 -1.000000 +156859 -1.000000 +156860 -1.000000 +156861 -1.000000 +156862 -1.000000 +156863 -1.000000 +156864 -1.000000 +156865 -1.000000 +156866 -1.000000 +156867 -1.000000 +156868 -1.000000 +156869 -1.000000 +156870 -1.000000 +156871 -1.000000 +156872 -1.000000 +156873 -1.000000 +156874 -1.000000 +156875 -1.000000 +156879 -1.000000 +156882 -1.000000 +156883 -1.000000 +156884 -1.000000 +156885 -1.000000 +156886 -1.000000 +156888 -1.000000 +156889 -1.000000 +156891 -1.000000 +156892 -1.000000 +156893 -1.000000 +156894 -1.000000 +156896 -1.000000 +156897 -1.000000 +156898 -1.000000 +156911 -1.000000 +156912 -1.000000 +156913 -1.000000 +156914 -1.000000 +156915 -1.000000 +156916 -1.000000 +156917 -1.000000 +156921 -1.000000 +156925 -1.000000 +157037 -1.000000 +157038 -1.000000 +157039 -1.000000 +157041 -1.000000 +157042 -1.000000 +157043 -1.000000 +157044 -1.000000 +157046 -1.000000 +157047 -1.000000 +157048 -1.000000 +157049 -1.000000 +157050 -1.000000 +157051 -1.000000 +157052 -1.000000 +157053 -1.000000 +157058 -1.000000 +157059 -1.000000 +157060 -1.000000 +157061 -1.000000 +157062 -1.000000 +157063 -1.000000 +157064 -1.000000 +157065 -1.000000 +157066 -1.000000 +157067 -1.000000 +157068 -1.000000 +157069 -1.000000 +157070 -1.000000 +157071 -1.000000 +157072 -1.000000 +157073 -1.000000 +157074 -1.000000 +157075 -1.000000 +157081 -1.000000 +157082 -1.000000 +157083 -1.000000 +157084 -1.000000 +157087 -1.000000 +157088 -1.000000 +157089 -1.000000 +157090 -1.000000 +157091 -1.000000 +157096 -1.000000 +157097 -1.000000 +157098 -1.000000 +157099 -1.000000 +157100 -1.000000 +157101 -1.000000 +157102 -1.000000 +157103 -1.000000 +157104 -1.000000 +157105 -1.000000 +157106 -1.000000 +157108 -1.000000 +157109 -1.000000 +157116 -1.000000 +157117 -1.000000 +157118 -1.000000 +157119 -1.000000 +157120 -1.000000 +157121 -1.000000 +157122 -1.000000 +157123 -1.000000 +157124 -1.000000 +157125 -1.000000 +157126 -1.000000 +157127 -1.000000 +157128 -1.000000 +157129 -1.000000 +157130 -1.000000 +157131 -1.000000 +157132 -1.000000 +157133 -1.000000 +157134 -1.000000 +157135 -1.000000 +157136 -1.000000 +157137 -1.000000 +157138 -1.000000 +157140 -1.000000 +157143 -1.000000 +157150 -1.000000 +157151 -1.000000 +157152 -1.000000 +157153 -1.000000 +157154 -1.000000 +157155 -1.000000 +157156 -1.000000 +157157 -1.000000 +157158 -1.000000 +157169 -1.000000 +157186 -1.000000 +157188 -1.000000 +157189 -1.000000 +157192 -1.000000 +157193 -1.000000 +157194 -1.000000 +157195 -1.000000 +157196 -1.000000 +157197 -1.000000 +157198 -1.000000 +157202 -1.000000 +157203 -1.000000 +157216 -1.000000 +157218 -1.000000 +157230 -1.000000 +157231 -1.000000 +157232 -1.000000 +157233 -1.000000 +157234 -1.000000 +157235 -1.000000 +157236 -1.000000 +157237 -1.000000 +157238 -1.000000 +157239 -1.000000 +157241 -1.000000 +157243 -1.000000 +157248 -1.000000 +157250 -1.000000 +157255 -1.000000 +157256 -1.000000 +157258 -1.000000 +157259 -1.000000 +157260 -1.000000 +157261 -1.000000 +157262 -1.000000 +157263 -1.000000 +157264 -1.000000 +157265 -1.000000 +157266 -1.000000 +157267 -1.000000 +157268 -1.000000 +157269 -1.000000 +157270 -1.000000 +157271 -1.000000 +157272 -1.000000 +157273 -1.000000 +157274 -1.000000 +157275 -1.000000 +157276 -1.000000 +157277 -1.000000 +157278 -1.000000 +157279 -1.000000 +157281 -1.000000 +157284 -1.000000 +157295 -1.000000 +157296 -1.000000 +157298 -1.000000 +157303 -1.000000 +157304 -1.000000 +157308 -1.000000 +157313 -1.000000 +157318 -1.000000 +157321 -1.000000 +157323 -1.000000 +157369 -1.000000 +157370 -1.000000 +157372 -1.000000 +157373 -1.000000 +157374 -1.000000 +157376 -1.000000 +157377 -1.000000 +157378 -1.000000 +157379 -1.000000 +157381 -1.000000 +157387 -1.000000 +157391 -1.000000 +157399 -1.000000 +157400 -1.000000 +157401 -1.000000 +157402 -1.000000 +157404 -1.000000 +157407 -1.000000 +157408 -1.000000 +157409 -1.000000 +157410 -1.000000 +157411 -1.000000 +157412 -1.000000 +157413 -1.000000 +157414 -1.000000 +157415 -1.000000 +157416 -1.000000 +157417 -1.000000 +157418 -1.000000 +157420 -1.000000 +157424 -1.000000 +157428 -1.000000 +157431 -1.000000 +157432 -1.000000 +157433 -1.000000 +157435 -1.000000 +157458 -1.000000 +157464 -1.000000 +157471 -1.000000 +157482 -1.000000 +157483 -1.000000 +157484 -1.000000 +157485 -1.000000 +157486 -1.000000 +157487 -1.000000 +157488 -1.000000 +157489 -1.000000 +157494 -1.000000 +157495 -1.000000 +157496 -1.000000 +157498 -1.000000 +157499 -1.000000 +157500 -1.000000 +157501 -1.000000 +157502 -1.000000 +157503 -1.000000 +157504 -1.000000 +157505 -1.000000 +157506 -1.000000 +157507 -1.000000 +157508 -1.000000 +157509 -1.000000 +157518 -1.000000 +157519 -1.000000 +157520 -1.000000 +157521 -1.000000 +157523 -1.000000 +157524 -1.000000 +157525 -1.000000 +157527 -1.000000 +157528 -1.000000 +157529 -1.000000 +157530 -1.000000 +157534 -1.000000 +157535 -1.000000 +157536 -1.000000 +157537 -1.000000 +157542 -1.000000 +157545 -1.000000 +157551 -1.000000 +157552 -1.000000 +157553 -1.000000 +157554 -1.000000 +157555 -1.000000 +157556 -1.000000 +157557 -1.000000 +157558 -1.000000 +157559 -1.000000 +157560 -1.000000 +157562 -1.000000 +157564 -1.000000 +157565 -1.000000 +157566 -1.000000 +157567 -1.000000 +157571 -1.000000 +157572 -1.000000 +157573 -1.000000 +157574 -1.000000 +157575 -1.000000 +157576 -1.000000 +157577 -1.000000 +157578 -1.000000 +157579 -1.000000 +157580 -1.000000 +157654 -1.000000 +157655 -1.000000 +157656 -1.000000 +157657 -1.000000 +157658 -1.000000 +157661 -1.000000 +157664 -1.000000 +157665 -1.000000 +157666 -1.000000 +157667 -1.000000 +157668 -1.000000 +157669 -1.000000 +157671 -1.000000 +157672 -1.000000 +157673 -1.000000 +157674 -1.000000 +157675 -1.000000 +157676 -1.000000 +157677 -1.000000 +157678 -1.000000 +157679 -1.000000 +157685 -1.000000 +157686 -1.000000 +157687 -1.000000 +157694 -1.000000 +157699 -1.000000 +157700 -1.000000 +157704 -1.000000 +157705 -1.000000 +157706 -1.000000 +157707 -1.000000 +157708 -1.000000 +157709 -1.000000 +157710 -1.000000 +157713 -1.000000 +157714 -1.000000 +157715 -1.000000 +157723 -1.000000 +157724 -1.000000 +157725 -1.000000 +157726 -1.000000 +157727 -1.000000 +157728 -1.000000 +157729 -1.000000 +157730 -1.000000 +157731 -1.000000 +157732 -1.000000 +157733 -1.000000 +157734 -1.000000 +157735 -1.000000 +157736 -1.000000 +157737 -1.000000 +157738 -1.000000 +157739 -1.000000 +157740 -1.000000 +157741 -1.000000 +157742 -1.000000 +157743 -1.000000 +157744 -1.000000 +157745 -1.000000 +157746 -1.000000 +157747 -1.000000 +157748 -1.000000 +157749 -1.000000 +157750 -1.000000 +157751 -1.000000 +157752 -1.000000 +157753 -1.000000 +157754 -1.000000 +157755 -1.000000 +157756 -1.000000 +157757 -1.000000 +157758 -1.000000 +157759 -1.000000 +157777 -1.000000 +157782 -1.000000 +157783 -1.000000 +157784 -1.000000 +157787 -1.000000 +157793 -1.000000 +157804 -1.000000 +157805 -1.000000 +157806 -1.000000 +157814 -1.000000 +157817 -1.000000 +157819 -1.000000 +157850 -1.000000 +157851 -1.000000 +157858 -1.000000 +157864 -1.000000 +157868 -1.000000 +157880 -1.000000 +157896 -1.000000 +157898 -1.000000 +157899 -1.000000 +157900 -1.000000 +157901 -1.000000 +157902 -1.000000 +157903 -1.000000 +157904 -1.000000 +157905 -1.000000 +157906 -1.000000 +157907 -1.000000 +157908 -1.000000 +157910 -1.000000 +157911 -1.000000 +157912 -1.000000 +157913 -1.000000 +157914 -1.000000 +157915 -1.000000 +157916 -1.000000 +157917 -1.000000 +157918 -1.000000 +157919 -1.000000 +157920 -1.000000 +157930 -1.000000 +157931 -1.000000 +157932 -1.000000 +157933 -1.000000 +157934 -1.000000 +157935 -1.000000 +157947 -1.000000 +157948 -1.000000 +157949 -1.000000 +157950 -1.000000 +157951 -1.000000 +157952 -1.000000 +157953 -1.000000 +157954 -1.000000 +157955 -1.000000 +157956 -1.000000 +157957 -1.000000 +157958 -1.000000 +157959 -1.000000 +157960 -1.000000 +157961 -1.000000 +157962 -1.000000 +157963 -1.000000 +157964 -1.000000 +157965 -1.000000 +157966 -1.000000 +157967 -1.000000 +157968 -1.000000 +157970 -1.000000 +157971 -1.000000 +157972 -1.000000 +157974 -1.000000 +157975 -1.000000 +157976 -1.000000 +157978 -1.000000 +157983 -1.000000 +157985 -1.000000 +157987 -1.000000 +157988 -1.000000 +157989 -1.000000 +157993 -1.000000 +157994 -1.000000 +157996 -1.000000 +157997 -1.000000 +158002 -1.000000 +158006 -1.000000 +158008 -1.000000 +158011 -1.000000 +158012 -1.000000 +158013 -1.000000 +158016 -1.000000 +158017 -1.000000 +158019 -1.000000 +158021 -1.000000 +158030 -1.000000 +158031 -1.000000 +158032 -1.000000 +158033 -1.000000 +158035 -1.000000 +158036 -1.000000 +158037 -1.000000 +158038 -1.000000 +158039 -1.000000 +158040 -1.000000 +158041 -1.000000 +158042 -1.000000 +158043 -1.000000 +158051 -1.000000 +158052 -1.000000 +158053 -1.000000 +158054 -1.000000 +158055 -1.000000 +158056 -1.000000 +158057 -1.000000 +158058 -1.000000 +158072 -1.000000 +158076 -1.000000 +158087 -1.000000 +158088 -1.000000 +158104 -1.000000 +158106 -1.000000 +158108 -1.000000 +158109 -1.000000 +158110 -1.000000 +158111 -1.000000 +158115 -1.000000 +158121 -1.000000 +158126 -1.000000 +158131 -1.000000 +158132 -1.000000 +158133 -1.000000 +158134 -1.000000 +158135 -1.000000 +158138 -1.000000 +158140 -1.000000 +158141 -1.000000 +158142 -1.000000 +158143 -1.000000 +158144 -1.000000 +158145 -1.000000 +158146 -1.000000 +158147 -1.000000 +158148 -1.000000 +158149 -1.000000 +158150 -1.000000 +158151 -1.000000 +158152 -1.000000 +158153 -1.000000 +158154 -1.000000 +158155 -1.000000 +158156 -1.000000 +158157 -1.000000 +158158 -1.000000 +158160 -1.000000 +158161 -1.000000 +158163 -1.000000 +158164 -1.000000 +158165 -1.000000 +158166 -1.000000 +158167 -1.000000 +158168 -1.000000 +158169 -1.000000 +158289 -1.000000 +158290 -1.000000 +158293 -1.000000 +158294 -1.000000 +158295 -1.000000 +158298 -1.000000 +158304 -1.000000 +158305 -1.000000 +158306 -1.000000 +158307 -1.000000 +158308 -1.000000 +158309 -1.000000 +158310 -1.000000 +158311 -1.000000 +158312 -1.000000 +158313 -1.000000 +158314 -1.000000 +158315 -1.000000 +158316 -1.000000 +158317 -1.000000 +158318 -1.000000 +158319 -1.000000 +158327 -1.000000 +158329 -1.000000 +158330 -1.000000 +158331 -1.000000 +158332 -1.000000 +158333 -1.000000 +158337 -1.000000 +158345 -1.000000 +158346 -1.000000 +158347 -1.000000 +158349 -1.000000 +158355 -1.000000 +158356 -1.000000 +158364 -1.000000 +158370 -1.000000 +158371 -1.000000 +158372 -1.000000 +158374 -1.000000 +158375 -1.000000 +158376 -1.000000 +158380 -1.000000 +158381 -1.000000 +158385 -1.000000 +158386 -1.000000 +158388 -1.000000 +158391 -1.000000 +158392 -1.000000 +158393 -1.000000 +158400 -1.000000 +158403 -1.000000 +158404 -1.000000 +158405 -1.000000 +158406 -1.000000 +158411 -1.000000 +158412 -1.000000 +158413 -1.000000 +158414 -1.000000 +158415 -1.000000 +158416 -1.000000 +158417 -1.000000 +158421 -1.000000 +158423 -1.000000 +158426 -1.000000 +158428 -1.000000 +158438 -1.000000 +158444 -1.000000 +158445 -1.000000 +158446 -1.000000 +158449 -1.000000 +158450 -1.000000 +158454 -1.000000 +158455 -1.000000 +158457 -1.000000 +158458 -1.000000 +158459 -1.000000 +158499 -1.000000 +158500 -1.000000 +158501 -1.000000 +158502 -1.000000 +158512 -1.000000 +158513 -1.000000 +158514 -1.000000 +158515 -1.000000 +158517 -1.000000 +158518 -1.000000 +158519 -1.000000 +158520 -1.000000 +158521 -1.000000 +158522 -1.000000 +158525 -1.000000 +158526 -1.000000 +158527 -1.000000 +158529 -1.000000 +158530 -1.000000 +158531 -1.000000 +158532 -1.000000 +158533 -1.000000 +158534 -1.000000 +158535 -1.000000 +158537 -1.000000 +158538 -1.000000 +158539 -1.000000 +158540 -1.000000 +158541 -1.000000 +158542 -1.000000 +158543 -1.000000 +158544 -1.000000 +158545 -1.000000 +158546 -1.000000 +158553 -1.000000 +158554 -1.000000 +158555 -1.000000 +158556 -1.000000 +158557 -1.000000 +158558 -1.000000 +158559 -1.000000 +158560 -1.000000 +158561 -1.000000 +158562 -1.000000 +158563 -1.000000 +158564 -1.000000 +158565 -1.000000 +158566 -1.000000 +158567 -1.000000 +158568 -1.000000 +158569 -1.000000 +158570 -1.000000 +158571 -1.000000 +158572 -1.000000 +158573 -1.000000 +158574 -1.000000 +158576 -1.000000 +158577 -1.000000 +158578 -1.000000 +158579 -1.000000 +158580 -1.000000 +158582 -1.000000 +158589 -1.000000 +158590 -1.000000 +158591 -1.000000 +158592 -1.000000 +158593 -1.000000 +158594 -1.000000 +158595 -1.000000 +158596 -1.000000 +158597 -1.000000 +158598 -1.000000 +158599 -1.000000 +158600 -1.000000 +158601 -1.000000 +158602 -1.000000 +158603 -1.000000 +158604 -1.000000 +158605 -1.000000 +158606 -1.000000 +158607 -1.000000 +158608 -1.000000 +158609 -1.000000 +158610 -1.000000 +158611 -1.000000 +158612 -1.000000 +158613 -1.000000 +158615 -1.000000 +158616 -1.000000 +158617 -1.000000 +158619 -1.000000 +158620 -1.000000 +158621 -1.000000 +158624 -1.000000 +158629 -1.000000 +158631 -1.000000 +158633 -1.000000 +158634 -1.000000 +158635 -1.000000 +158636 -1.000000 +158637 -1.000000 +158638 -1.000000 +158640 -1.000000 +158641 -1.000000 +158642 -1.000000 +158643 -1.000000 +158644 -1.000000 +158645 -1.000000 +158646 -1.000000 +158647 -1.000000 +158648 -1.000000 +158649 -1.000000 +158651 -1.000000 +158654 -1.000000 +158655 -1.000000 +158656 -1.000000 +158657 -1.000000 +158658 -1.000000 +158659 -1.000000 +158660 -1.000000 +158661 -1.000000 +158662 -1.000000 +158663 -1.000000 +158664 -1.000000 +158672 -1.000000 +158673 -1.000000 +158674 -1.000000 +158675 -1.000000 +158676 -1.000000 +158677 -1.000000 +158678 -1.000000 +158679 -1.000000 +158680 -1.000000 +158681 -1.000000 +158682 -1.000000 +158683 -1.000000 +158684 -1.000000 +158685 -1.000000 +158686 -1.000000 +158687 -1.000000 +158688 -1.000000 +158689 -1.000000 +158690 -1.000000 +158691 -1.000000 +158692 -1.000000 +158693 -1.000000 +158694 -1.000000 +158695 -1.000000 +158696 -1.000000 +158697 -1.000000 +158698 -1.000000 +158699 -1.000000 +158700 -1.000000 +158701 -1.000000 +158702 -1.000000 +158703 -1.000000 +158704 -1.000000 +158705 -1.000000 +158706 -1.000000 +158739 -1.000000 +158741 -1.000000 +158742 -1.000000 +158743 -1.000000 +158744 -1.000000 +158745 -1.000000 +158746 -1.000000 +158747 -1.000000 +158748 -1.000000 +158749 -1.000000 +158750 -1.000000 +158751 -1.000000 +158752 -1.000000 +158754 -1.000000 +158755 -1.000000 +158756 -1.000000 +158760 -1.000000 +158761 -1.000000 +158762 -1.000000 +158763 -1.000000 +158764 -1.000000 +158766 -1.000000 +158767 -1.000000 +158768 -1.000000 +158769 -1.000000 +158770 -1.000000 +158771 -1.000000 +158772 -1.000000 +158774 -1.000000 +158775 -1.000000 +158776 -1.000000 +158777 -1.000000 +158778 -1.000000 +158779 -1.000000 +158780 -1.000000 +158781 -1.000000 +158782 -1.000000 +158783 -1.000000 +158784 -1.000000 +158787 -1.000000 +158789 -1.000000 +158790 -1.000000 +158791 -1.000000 +158792 -1.000000 +158793 -1.000000 +158800 -1.000000 +158803 -1.000000 +158804 -1.000000 +158805 -1.000000 +158806 -1.000000 +158811 -1.000000 +158816 -1.000000 +158817 -1.000000 +158818 -1.000000 +158819 -1.000000 +158821 -1.000000 +158822 -1.000000 +158823 -1.000000 +158824 -1.000000 +158825 -1.000000 +158827 -1.000000 +158828 -1.000000 +158829 -1.000000 +158830 -1.000000 +158831 -1.000000 +158832 -1.000000 +158833 -1.000000 +158834 -1.000000 +158835 -1.000000 +158852 -1.000000 +158854 -1.000000 +158855 -1.000000 +158856 -1.000000 +158858 -1.000000 +158859 -1.000000 +158860 -1.000000 +158861 -1.000000 +158862 -1.000000 +158864 -1.000000 +158865 -1.000000 +158866 -1.000000 +158867 -1.000000 +158868 -1.000000 +158869 -1.000000 +158871 -1.000000 +158872 -1.000000 +158873 -1.000000 +158874 -1.000000 +158875 -1.000000 +158876 -1.000000 +158877 -1.000000 +158878 -1.000000 +158883 -1.000000 +158885 -1.000000 +158886 -1.000000 +158888 -1.000000 +158895 -1.000000 +158896 -1.000000 +158897 -1.000000 +158898 -1.000000 +158899 -1.000000 +158900 -1.000000 +158901 -1.000000 +158902 -1.000000 +158903 -1.000000 +158904 -1.000000 +158905 -1.000000 +158906 -1.000000 +158911 -1.000000 +158912 -1.000000 +158913 -1.000000 +158914 -1.000000 +158915 -1.000000 +158916 -1.000000 +158917 -1.000000 +158918 -1.000000 +158919 -1.000000 +158920 -1.000000 +158921 -1.000000 +158922 -1.000000 +158923 -1.000000 +158924 -1.000000 +158925 -1.000000 +158926 -1.000000 +158929 -1.000000 +158933 -1.000000 +158934 -1.000000 +158936 -1.000000 +158939 -1.000000 +158940 -1.000000 +158942 -1.000000 +158949 -1.000000 +158950 -1.000000 +158951 -1.000000 +158952 -1.000000 +158953 -1.000000 +158954 -1.000000 +158955 -1.000000 +158956 -1.000000 +158957 -1.000000 +158958 -1.000000 +158959 -1.000000 +158960 -1.000000 +158961 -1.000000 +158962 -1.000000 +158963 -1.000000 +158964 -1.000000 +158965 -1.000000 +158967 -1.000000 +158968 -1.000000 +158969 -1.000000 +158970 -1.000000 +158971 -1.000000 +158972 -1.000000 +158973 -1.000000 +158974 -1.000000 +158975 -1.000000 +158976 -1.000000 +158977 -1.000000 +158978 -1.000000 +158979 -1.000000 +158980 -1.000000 +158981 -1.000000 +158986 -1.000000 +158987 -1.000000 +158988 -1.000000 +158989 -1.000000 +158991 -1.000000 +158992 -1.000000 +158993 -1.000000 +158994 -1.000000 +158995 -1.000000 +158996 -1.000000 +158997 -1.000000 +159001 -1.000000 +159002 -1.000000 +159003 -1.000000 +159004 -1.000000 +159006 -1.000000 +159007 -1.000000 +159008 -1.000000 +159009 -1.000000 +159010 -1.000000 +159011 -1.000000 +159012 -1.000000 +159013 -1.000000 +159014 -1.000000 +159015 -1.000000 +159016 -1.000000 +159017 -1.000000 +159018 -1.000000 +159019 -1.000000 +159020 -1.000000 +159021 -1.000000 +159024 -1.000000 +159033 -1.000000 +159034 -1.000000 +159111 -1.000000 +159113 -1.000000 +159114 -1.000000 +159115 -1.000000 +159116 -1.000000 +159117 -1.000000 +159118 -1.000000 +159119 -1.000000 +159120 -1.000000 +159121 -1.000000 +159122 -1.000000 +159123 -1.000000 +159124 -1.000000 +159125 -1.000000 +159126 -1.000000 +159127 -1.000000 +159128 -1.000000 +159129 -1.000000 +159130 -1.000000 +159131 -1.000000 +159132 -1.000000 +159133 -1.000000 +159141 -1.000000 +159147 -1.000000 +159149 -1.000000 +159150 -1.000000 +159161 -1.000000 +159168 -1.000000 +159170 -1.000000 +159172 -1.000000 +159173 -1.000000 +159174 -1.000000 +159175 -1.000000 +159176 -1.000000 +159177 -1.000000 +159178 -1.000000 +159179 -1.000000 +159180 -1.000000 +159181 -1.000000 +159182 -1.000000 +159183 -1.000000 +159184 -1.000000 +159189 -1.000000 +159190 -1.000000 +159191 -1.000000 +159192 -1.000000 +159193 -1.000000 +159194 -1.000000 +159201 -1.000000 +159202 -1.000000 +159207 -1.000000 +159210 -1.000000 +159211 -1.000000 +159219 -1.000000 +159222 -1.000000 +159229 -1.000000 +159231 -1.000000 +159242 -1.000000 +159243 -1.000000 +159244 -1.000000 +159245 -1.000000 +159248 -1.000000 +159249 -1.000000 +159250 -1.000000 +159251 -1.000000 +159253 -1.000000 +159254 -1.000000 +159255 -1.000000 +159256 -1.000000 +159257 -1.000000 +159258 -1.000000 +159262 -1.000000 +159263 -1.000000 +159264 -1.000000 +159265 -1.000000 +159267 -1.000000 +159268 -1.000000 +159269 -1.000000 +159270 -1.000000 +159271 -1.000000 +159272 -1.000000 +159273 -1.000000 +159274 -1.000000 +159275 -1.000000 +159276 -1.000000 +159277 -1.000000 +159282 -1.000000 +159283 -1.000000 +159284 -1.000000 +159286 -1.000000 +159287 -1.000000 +159288 -1.000000 +159289 -1.000000 +159290 -1.000000 +159291 -1.000000 +159292 -1.000000 +159293 -1.000000 +159294 -1.000000 +159295 -1.000000 +159296 -1.000000 +159297 -1.000000 +159298 -1.000000 +159299 -1.000000 +159300 -1.000000 +159301 -1.000000 +159302 -1.000000 +159303 -1.000000 +159304 -1.000000 +159305 -1.000000 +159306 -1.000000 +159307 -1.000000 +159308 -1.000000 +159309 -1.000000 +159310 -1.000000 +159311 -1.000000 +159312 -1.000000 +159313 -1.000000 +159314 -1.000000 +159315 -1.000000 +159316 -1.000000 +159318 -1.000000 +159319 -1.000000 +159320 -1.000000 +159321 -1.000000 +159339 -1.000000 +159351 -1.000000 +159352 -1.000000 +159353 -1.000000 +159354 -1.000000 +159355 -1.000000 +159357 -1.000000 +159358 -1.000000 +159359 -1.000000 +159365 -1.000000 +159366 -1.000000 +159367 -1.000000 +159371 -1.000000 +159375 -1.000000 +159376 -1.000000 +159377 -1.000000 +159379 -1.000000 +159386 -1.000000 +159387 -1.000000 +159388 -1.000000 +159389 -1.000000 +159390 -1.000000 +159391 -1.000000 +159392 -1.000000 +159393 -1.000000 +159394 -1.000000 +159395 -1.000000 +159398 -1.000000 +159416 -1.000000 +159423 -1.000000 +159432 -1.000000 +159438 -1.000000 +159442 -1.000000 +159443 -1.000000 +159448 -1.000000 +159449 -1.000000 +159450 -1.000000 +159451 -1.000000 +159452 -1.000000 +159453 -1.000000 +159454 -1.000000 +159455 -1.000000 +159456 -1.000000 +159457 -1.000000 +159458 -1.000000 +159460 -1.000000 +159461 -1.000000 +159462 -1.000000 +159463 -1.000000 +159464 -1.000000 +159465 -1.000000 +159467 -1.000000 +159468 -1.000000 +159469 -1.000000 +159470 -1.000000 +159471 -1.000000 +159472 -1.000000 +159473 -1.000000 +159474 -1.000000 +159475 -1.000000 +159476 -1.000000 +159482 -1.000000 +159530 -1.000000 +159531 -1.000000 +159532 -1.000000 +159533 -1.000000 +159534 -1.000000 +159535 -1.000000 +159536 -1.000000 +159537 -1.000000 +159539 -1.000000 +159540 -1.000000 +159541 -1.000000 +159543 -1.000000 +159552 -1.000000 +159554 -1.000000 +159555 -1.000000 +159556 -1.000000 +159557 -1.000000 +159558 -1.000000 +159559 -1.000000 +159560 -1.000000 +159561 -1.000000 +159563 -1.000000 +159564 -1.000000 +159565 -1.000000 +159566 -1.000000 +159569 -1.000000 +159580 -1.000000 +159581 -1.000000 +159582 -1.000000 +159583 -1.000000 +159584 -1.000000 +159585 -1.000000 +159588 -1.000000 +159589 -1.000000 +159591 -1.000000 +159592 -1.000000 +159596 -1.000000 +159597 -1.000000 +159598 -1.000000 +159599 -1.000000 +159600 -1.000000 +159601 -1.000000 +159602 -1.000000 +159603 -1.000000 +159605 -1.000000 +159607 -1.000000 +159608 -1.000000 +159609 -1.000000 +159611 -1.000000 +159613 -1.000000 +159614 -1.000000 +159621 -1.000000 +159631 -1.000000 +159632 -1.000000 +159634 -1.000000 +159636 -1.000000 +159637 -1.000000 +159638 -1.000000 +159639 -1.000000 +159640 -1.000000 +159641 -1.000000 +159642 -1.000000 +159643 -1.000000 +159644 -1.000000 +159645 -1.000000 +159646 -1.000000 +159647 -1.000000 +159648 -1.000000 +159649 -1.000000 +159650 -1.000000 +159651 -1.000000 +159652 -1.000000 +159653 -1.000000 +159654 -1.000000 +159655 -1.000000 +159656 -1.000000 +159657 -1.000000 +159658 -1.000000 +159659 -1.000000 +159661 -1.000000 +159662 -1.000000 +159663 -1.000000 +159664 -1.000000 +159665 -1.000000 +159666 -1.000000 +159667 -1.000000 +159680 -1.000000 +159682 -1.000000 +159684 -1.000000 +159685 -1.000000 +159686 -1.000000 +159688 -1.000000 +159690 -1.000000 +159691 -1.000000 +159694 -1.000000 +159700 -1.000000 +159701 -1.000000 +159703 -1.000000 +159704 -1.000000 +159710 -1.000000 +159711 -1.000000 +159712 -1.000000 +159713 -1.000000 +159714 -1.000000 +159715 -1.000000 +159716 -1.000000 +159717 -1.000000 +159718 -1.000000 +159719 -1.000000 +159720 -1.000000 +159721 -1.000000 +159722 -1.000000 +159723 -1.000000 +159724 -1.000000 +159725 -1.000000 +159726 -1.000000 +159727 -1.000000 +159728 -1.000000 +159729 -1.000000 +159730 -1.000000 +159731 -1.000000 +159732 -1.000000 +159733 -1.000000 +159735 -1.000000 +159736 -1.000000 +159737 -1.000000 +159740 -1.000000 +159741 -1.000000 +159742 -1.000000 +159754 -1.000000 +159760 -1.000000 +159807 -1.000000 +159808 -1.000000 +159810 -1.000000 +159811 -1.000000 +159823 -1.000000 +159824 -1.000000 +159827 -1.000000 +159828 -1.000000 +159829 -1.000000 +159831 -1.000000 +159832 -1.000000 +159983 -1.000000 +159984 -1.000000 +159986 -1.000000 +159987 -1.000000 +159989 -1.000000 +159990 -1.000000 +159991 -1.000000 +159992 -1.000000 +159993 -1.000000 +159994 -1.000000 +159995 -1.000000 +159997 -1.000000 +159998 -1.000000 +159999 -1.000000 +160000 -1.000000 +160001 -1.000000 +160002 -1.000000 +160005 -1.000000 +160006 -1.000000 +160007 -1.000000 +160008 -1.000000 +160013 -1.000000 +160014 -1.000000 +160015 -1.000000 +160016 -1.000000 +160017 -1.000000 +160019 -1.000000 +160020 -1.000000 +160021 -1.000000 +160022 -1.000000 +160023 -1.000000 +160027 -1.000000 +160028 -1.000000 +160029 -1.000000 +160030 -1.000000 +160031 -1.000000 +160032 -1.000000 +160033 -1.000000 +160034 -1.000000 +160035 -1.000000 +160037 -1.000000 +160038 -1.000000 +160040 -1.000000 +160042 -1.000000 +160043 -1.000000 +160047 -1.000000 +160054 -1.000000 +160055 -1.000000 +160058 -1.000000 +160059 -1.000000 +160060 -1.000000 +160061 -1.000000 +160062 -1.000000 +160063 -1.000000 +160064 -1.000000 +160065 -1.000000 +160066 -1.000000 +160067 -1.000000 +160068 -1.000000 +160069 -1.000000 +160070 -1.000000 +160072 -1.000000 +160073 -1.000000 +160074 -1.000000 +160075 -1.000000 +160077 -1.000000 +160078 -1.000000 +160079 -1.000000 +160080 -1.000000 +160081 -1.000000 +160082 -1.000000 +160083 -1.000000 +160084 -1.000000 +160086 -1.000000 +160087 -1.000000 +160092 -1.000000 +160097 -1.000000 +160099 -1.000000 +160102 -1.000000 +160103 -1.000000 +160104 -1.000000 +160109 -1.000000 +160110 -1.000000 +160111 -1.000000 +160112 -1.000000 +160113 -1.000000 +160114 -1.000000 +160115 -1.000000 +160116 -1.000000 +160118 -1.000000 +160119 -1.000000 +160120 -1.000000 +160122 -1.000000 +160123 -1.000000 +160124 -1.000000 +160125 -1.000000 +160126 -1.000000 +160127 -1.000000 +160136 -1.000000 +160138 -1.000000 +160139 -1.000000 +160141 -1.000000 +160145 -1.000000 +160147 -1.000000 +160150 -1.000000 +160154 -1.000000 +160155 -1.000000 +160156 -1.000000 +160157 -1.000000 +160159 -1.000000 +160161 -1.000000 +160162 -1.000000 +160163 -1.000000 +160169 -1.000000 +160171 -1.000000 +160173 -1.000000 +160177 -1.000000 +160178 -1.000000 +160179 -1.000000 +160180 -1.000000 +160225 -1.000000 +160238 -1.000000 +160239 -1.000000 +160240 -1.000000 +160241 -1.000000 +160242 -1.000000 +160243 -1.000000 +160244 -1.000000 +160245 -1.000000 +160246 -1.000000 +160247 -1.000000 +160248 -1.000000 +160249 -1.000000 +160250 -1.000000 +160251 -1.000000 +160252 -1.000000 +160253 -1.000000 +160254 -1.000000 +160255 -1.000000 +160256 -1.000000 +160257 -1.000000 +160258 -1.000000 +160259 -1.000000 +160260 -1.000000 +160262 -1.000000 +160268 -1.000000 +160269 -1.000000 +160270 -1.000000 +160271 -1.000000 +160282 -1.000000 +160283 -1.000000 +160285 -1.000000 +160286 -1.000000 +160287 -1.000000 +160288 -1.000000 +160290 -1.000000 +160291 -1.000000 +160294 -1.000000 +160295 -1.000000 +160296 -1.000000 +160297 -1.000000 +160298 -1.000000 +160301 -1.000000 +160303 -1.000000 +160304 -1.000000 +160306 -1.000000 +160308 -1.000000 +160309 -1.000000 +160311 -1.000000 +160312 -1.000000 +160313 -1.000000 +160314 -1.000000 +160323 -1.000000 +160324 -1.000000 +160326 -1.000000 +160327 -1.000000 +160329 -1.000000 +160330 -1.000000 +160331 -1.000000 +160332 -1.000000 +160333 -1.000000 +160334 -1.000000 +160335 -1.000000 +160336 -1.000000 +160339 -1.000000 +160340 -1.000000 +160341 -1.000000 +160354 -1.000000 +160355 -1.000000 +160356 -1.000000 +160357 -1.000000 +160358 -1.000000 +160362 -1.000000 +160365 -1.000000 +160367 -1.000000 +160369 -1.000000 +160371 -1.000000 +160372 -1.000000 +160374 -1.000000 +160395 -1.000000 +160396 -1.000000 +160397 -1.000000 +160398 -1.000000 +160399 -1.000000 +160400 -1.000000 +160401 -1.000000 +160404 -1.000000 +160405 -1.000000 +160406 -1.000000 +160407 -1.000000 +160408 -1.000000 +160409 -1.000000 +160410 -1.000000 +160411 -1.000000 +160412 -1.000000 +160413 -1.000000 +160414 -1.000000 +160415 -1.000000 +160416 -1.000000 +160417 -1.000000 +160418 -1.000000 +160419 -1.000000 +160420 -1.000000 +160421 -1.000000 +160422 -1.000000 +160423 -1.000000 +160441 -1.000000 +160442 -1.000000 +160443 -1.000000 +160444 -1.000000 +160445 -1.000000 +160446 -1.000000 +160447 -1.000000 +160449 -1.000000 +160450 -1.000000 +160451 -1.000000 +160452 -1.000000 +160453 -1.000000 +160454 -1.000000 +160455 -1.000000 +160456 -1.000000 +160457 -1.000000 +160458 -1.000000 +160459 -1.000000 +160460 -1.000000 +160461 -1.000000 +160463 -1.000000 +160464 -1.000000 +160466 -1.000000 +160467 -1.000000 +160468 -1.000000 +160469 -1.000000 +160470 -1.000000 +160471 -1.000000 +160472 -1.000000 +160473 -1.000000 +160474 -1.000000 +160475 -1.000000 +160476 -1.000000 +160477 -1.000000 +160478 -1.000000 +160484 -1.000000 +160485 -1.000000 +160486 -1.000000 +160487 -1.000000 +160488 -1.000000 +160489 -1.000000 +160490 -1.000000 +160491 -1.000000 +160492 -1.000000 +160493 -1.000000 +160494 -1.000000 +160497 -1.000000 +160498 -1.000000 +160499 -1.000000 +160500 -1.000000 +160502 -1.000000 +160503 -1.000000 +160504 -1.000000 +160505 -1.000000 +160508 -1.000000 +160509 -1.000000 +160510 -1.000000 +160511 -1.000000 +160518 -1.000000 +160520 -1.000000 +160521 -1.000000 +160522 -1.000000 +160523 -1.000000 +160524 -1.000000 +160525 -1.000000 +160526 -1.000000 +160527 -1.000000 +160528 -1.000000 +160529 -1.000000 +160534 -1.000000 +160538 -1.000000 +160542 -1.000000 +160544 -1.000000 +160545 -1.000000 +160546 -1.000000 +160552 -1.000000 +160553 -1.000000 +160554 -1.000000 +160555 -1.000000 +160556 -1.000000 +160557 -1.000000 +160558 -1.000000 +160562 -1.000000 +160563 -1.000000 +160564 -1.000000 +160565 -1.000000 +160566 -1.000000 +160567 -1.000000 +160568 -1.000000 +160569 -1.000000 +160570 -1.000000 +160571 -1.000000 +160572 -1.000000 +160573 -1.000000 +160574 -1.000000 +160575 -1.000000 +160576 -1.000000 +160578 -1.000000 +160579 -1.000000 +160580 -1.000000 +160581 -1.000000 +160583 -1.000000 +160584 -1.000000 +160585 -1.000000 +160586 -1.000000 +160590 -1.000000 +160593 -1.000000 +160602 -1.000000 +160612 -1.000000 +160632 -1.000000 +160633 -1.000000 +160635 -1.000000 +160638 -1.000000 +160640 -1.000000 +160645 -1.000000 +160646 -1.000000 +160647 -1.000000 +160652 -1.000000 +160657 -1.000000 +160660 -1.000000 +160665 -1.000000 +160666 -1.000000 +160667 -1.000000 +160669 -1.000000 +160670 -1.000000 +160672 -1.000000 +160673 -1.000000 +160674 -1.000000 +160675 -1.000000 +160677 -1.000000 +160680 -1.000000 +160681 -1.000000 +160682 -1.000000 +160683 -1.000000 +160684 -1.000000 +160685 -1.000000 +160686 -1.000000 +160687 -1.000000 +160688 -1.000000 +160689 -1.000000 +160690 -1.000000 +160691 -1.000000 +160692 -1.000000 +160693 -1.000000 +160694 -1.000000 +160695 -1.000000 +160700 -1.000000 +160702 -1.000000 +160703 -1.000000 +160704 -1.000000 +160705 -1.000000 +160706 -1.000000 +160707 -1.000000 +160708 -1.000000 +160710 -1.000000 +160711 -1.000000 +160712 -1.000000 +160713 -1.000000 +160714 -1.000000 +160715 -1.000000 +160716 -1.000000 +160717 -1.000000 +160718 -1.000000 +160719 -1.000000 +160720 -1.000000 +160721 -1.000000 +160774 -1.000000 +160776 -1.000000 +160777 -1.000000 +160784 -1.000000 +160785 -1.000000 +160786 -1.000000 +160787 -1.000000 +160788 -1.000000 +160789 -1.000000 +160790 -1.000000 +160791 -1.000000 +160792 -1.000000 +160793 -1.000000 +160794 -1.000000 +160795 -1.000000 +160796 -1.000000 +160797 -1.000000 +160798 -1.000000 +160799 -1.000000 +160800 -1.000000 +160801 -1.000000 +160802 -1.000000 +160810 -1.000000 +160811 -1.000000 +160812 -1.000000 +160813 -1.000000 +160814 -1.000000 +160815 -1.000000 +160817 -1.000000 +160819 -1.000000 +160829 -1.000000 +160836 -1.000000 +160837 -1.000000 +160840 -1.000000 +160841 -1.000000 +160842 -1.000000 +160843 -1.000000 +160844 -1.000000 +160845 -1.000000 +160850 -1.000000 +160852 -1.000000 +160854 -1.000000 +160862 -1.000000 +160863 -1.000000 +160867 -1.000000 +160869 -1.000000 +160872 -1.000000 +160876 -1.000000 +160881 -1.000000 +160884 -1.000000 +160889 -1.000000 +160894 -1.000000 +160895 -1.000000 +160899 -1.000000 +160900 -1.000000 +160901 -1.000000 +160902 -1.000000 +160903 -1.000000 +160904 -1.000000 +160905 -1.000000 +160906 -1.000000 +160907 -1.000000 +160908 -1.000000 +160910 -1.000000 +160911 -1.000000 +160912 -1.000000 +160913 -1.000000 +160914 -1.000000 +160915 -1.000000 +160917 -1.000000 +160918 -1.000000 +160919 -1.000000 +160920 -1.000000 +160921 -1.000000 +160938 -1.000000 +160939 -1.000000 +160940 -1.000000 +160942 -1.000000 +160943 -1.000000 +160944 -1.000000 +160945 -1.000000 +160947 -1.000000 +160948 -1.000000 +160949 -1.000000 +160950 -1.000000 +160951 -1.000000 +160964 -1.000000 +160965 -1.000000 +160966 -1.000000 +160968 -1.000000 +160969 -1.000000 +160970 -1.000000 +160971 -1.000000 +160972 -1.000000 +160973 -1.000000 +160974 -1.000000 +160975 -1.000000 +160980 -1.000000 +160981 -1.000000 +160982 -1.000000 +160984 -1.000000 +160985 -1.000000 +160986 -1.000000 +160987 -1.000000 +160988 -1.000000 +160994 -1.000000 +160995 -1.000000 +160996 -1.000000 +160997 -1.000000 +160999 -1.000000 +161002 -1.000000 +161003 -1.000000 +161004 -1.000000 +161005 -1.000000 +161006 -1.000000 +161007 -1.000000 +161008 -1.000000 +161009 -1.000000 +161011 -1.000000 +161012 -1.000000 +161013 -1.000000 +161015 -1.000000 +161016 -1.000000 +161017 -1.000000 +161018 -1.000000 +161019 -1.000000 +161027 -1.000000 +161028 -1.000000 +161030 -1.000000 +161032 -1.000000 +161033 -1.000000 +161034 -1.000000 +161035 -1.000000 +161036 -1.000000 +161037 -1.000000 +161038 -1.000000 +161039 -1.000000 +161040 -1.000000 +161041 -1.000000 +161042 -1.000000 +161043 -1.000000 +161044 -1.000000 +161049 -1.000000 +161050 -1.000000 +161051 -1.000000 +161052 -1.000000 +161053 -1.000000 +161054 -1.000000 +161055 -1.000000 +161056 -1.000000 +161057 -1.000000 +161058 -1.000000 +161064 -1.000000 +161065 -1.000000 +161066 -1.000000 +161067 -1.000000 +161078 -1.000000 +161080 -1.000000 +161081 -1.000000 +161083 -1.000000 +161084 -1.000000 +161085 -1.000000 +161086 -1.000000 +161087 -1.000000 +161088 -1.000000 +161089 -1.000000 +161090 -1.000000 +161091 -1.000000 +161092 -1.000000 +161093 -1.000000 +161094 -1.000000 +161095 -1.000000 +161096 -1.000000 +161102 -1.000000 +161103 -1.000000 +161104 -1.000000 +161105 -1.000000 +161106 -1.000000 +161107 -1.000000 +161108 -1.000000 +161109 -1.000000 +161110 -1.000000 +161111 -1.000000 +161115 -1.000000 +161116 -1.000000 +161117 -1.000000 +161118 -1.000000 +161119 -1.000000 +161121 -1.000000 +161122 -1.000000 +161123 -1.000000 +161124 -1.000000 +161125 -1.000000 +161127 -1.000000 +161129 -1.000000 +161136 -1.000000 +161137 -1.000000 +161138 -1.000000 +161139 -1.000000 +161140 -1.000000 +161141 -1.000000 +161142 -1.000000 +161143 -1.000000 +161144 -1.000000 +161145 -1.000000 +161146 -1.000000 +161147 -1.000000 +161148 -1.000000 +161149 -1.000000 +161150 -1.000000 +161151 -1.000000 +161152 -1.000000 +161153 -1.000000 +161154 -1.000000 +161155 -1.000000 +161156 -1.000000 +161157 -1.000000 +161158 -1.000000 +161159 -1.000000 +161160 -1.000000 +161162 -1.000000 +161163 -1.000000 +161164 -1.000000 +161165 -1.000000 +161166 -1.000000 +161167 -1.000000 +161168 -1.000000 +161169 -1.000000 +161170 -1.000000 +161171 -1.000000 +161172 -1.000000 +161173 -1.000000 +161174 -1.000000 +161179 -1.000000 +161188 -1.000000 +161196 -1.000000 +161197 -1.000000 +161198 -1.000000 +161199 -1.000000 +161202 -1.000000 +161203 -1.000000 +161212 -1.000000 +161215 -1.000000 +161216 -1.000000 +161218 -1.000000 +161219 -1.000000 +161220 -1.000000 +161221 -1.000000 +161222 -1.000000 +161223 -1.000000 +161233 -1.000000 +161252 -1.000000 +161253 -1.000000 +161254 -1.000000 +161255 -1.000000 +161256 -1.000000 +161257 -1.000000 +161258 -1.000000 +161259 -1.000000 +161260 -1.000000 +161261 -1.000000 +161262 -1.000000 +161263 -1.000000 +161264 -1.000000 +161265 -1.000000 +161266 -1.000000 +161272 -1.000000 +161273 -1.000000 +161274 -1.000000 +161275 -1.000000 +161276 -1.000000 +161277 -1.000000 +161280 -1.000000 +161283 -1.000000 +161284 -1.000000 +161285 -1.000000 +161286 -1.000000 +161287 -1.000000 +161291 -1.000000 +161292 -1.000000 +161294 -1.000000 +161295 -1.000000 +161300 -1.000000 +161304 -1.000000 +161306 -1.000000 +161307 -1.000000 +161308 -1.000000 +161309 -1.000000 +161310 -1.000000 +161314 -1.000000 +161317 -1.000000 +161319 -1.000000 +161320 -1.000000 +161321 -1.000000 +161322 -1.000000 +161329 -1.000000 +161331 -1.000000 +161333 -1.000000 +161335 -1.000000 +161336 -1.000000 +161345 -1.000000 +161346 -1.000000 +161347 -1.000000 +161348 -1.000000 +161349 -1.000000 +161350 -1.000000 +161351 -1.000000 +161352 -1.000000 +161353 -1.000000 +161354 -1.000000 +161356 -1.000000 +161357 -1.000000 +161358 -1.000000 +161359 -1.000000 +161361 -1.000000 +161364 -1.000000 +161367 -1.000000 +161370 -1.000000 +161371 -1.000000 +161372 -1.000000 +161373 -1.000000 +161374 -1.000000 +161376 -1.000000 +161381 -1.000000 +161382 -1.000000 +161383 -1.000000 +161384 -1.000000 +161385 -1.000000 +161386 -1.000000 +161388 -1.000000 +161389 -1.000000 +161390 -1.000000 +161391 -1.000000 +161392 -1.000000 +161393 -1.000000 +161394 -1.000000 +161395 -1.000000 +161397 -1.000000 +161398 -1.000000 +161399 -1.000000 +161400 -1.000000 +161401 -1.000000 +161402 -1.000000 +161403 -1.000000 +161404 -1.000000 +161405 -1.000000 +161406 -1.000000 +161407 -1.000000 +161408 -1.000000 +161409 -1.000000 +161410 -1.000000 +161411 -1.000000 +161412 -1.000000 +161413 -1.000000 +161414 -1.000000 +161415 -1.000000 +161416 -1.000000 +161417 -1.000000 +161418 -1.000000 +161420 -1.000000 +161424 -1.000000 +161425 -1.000000 +161426 -1.000000 +161437 -1.000000 +161438 -1.000000 +161444 -1.000000 +161446 -1.000000 +161447 -1.000000 +161448 -1.000000 +161449 -1.000000 +161450 -1.000000 +161452 -1.000000 +161453 -1.000000 +161454 -1.000000 +161455 -1.000000 +161456 -1.000000 +161458 -1.000000 +161459 -1.000000 +161460 -1.000000 +161461 -1.000000 +161465 -1.000000 +161466 -1.000000 +161467 -1.000000 +161468 -1.000000 +161469 -1.000000 +161470 -1.000000 +161471 -1.000000 +161472 -1.000000 +161473 -1.000000 +161474 -1.000000 +161475 -1.000000 +161476 -1.000000 +161477 -1.000000 +161478 -1.000000 +161479 -1.000000 +161480 -1.000000 +161481 -1.000000 +161482 -1.000000 +161483 -1.000000 +161484 -1.000000 +161485 -1.000000 +161491 -1.000000 +161492 -1.000000 +161493 -1.000000 +161494 -1.000000 +161495 -1.000000 +161496 -1.000000 +161497 -1.000000 +161498 -1.000000 +161499 -1.000000 +161500 -1.000000 +161501 -1.000000 +161502 -1.000000 +161503 -1.000000 +161505 -1.000000 +161506 -1.000000 +161507 -1.000000 +161508 -1.000000 +161509 -1.000000 +161510 -1.000000 +161511 -1.000000 +161512 -1.000000 +161513 -1.000000 +161514 -1.000000 +161515 -1.000000 +161516 -1.000000 +161517 -1.000000 +161518 -1.000000 +161519 -1.000000 +161520 -1.000000 +161521 -1.000000 +161522 -1.000000 +161524 -1.000000 +161525 -1.000000 +161526 -1.000000 +161527 -1.000000 +161528 -1.000000 +161529 -1.000000 +161530 -1.000000 +161535 -1.000000 +161536 -1.000000 +161537 -1.000000 +161538 -1.000000 +161539 -1.000000 +161540 -1.000000 +161541 -1.000000 +161545 -1.000000 +161546 -1.000000 +161548 -1.000000 +161549 -1.000000 +161550 -1.000000 +161552 -1.000000 +161553 -1.000000 +161554 -1.000000 +161555 -1.000000 +161556 -1.000000 +161557 -1.000000 +161558 -1.000000 +161559 -1.000000 +161560 -1.000000 +161561 -1.000000 +161562 -1.000000 +161564 -1.000000 +161565 -1.000000 +161566 -1.000000 +161567 -1.000000 +161582 -1.000000 +161583 -1.000000 +161584 -1.000000 +161586 -1.000000 +161587 -1.000000 +161588 -1.000000 +161590 -1.000000 +161591 -1.000000 +161592 -1.000000 +161593 -1.000000 +161595 -1.000000 +161596 -1.000000 +161597 -1.000000 +161598 -1.000000 +161599 -1.000000 +161600 -1.000000 +161601 -1.000000 +161602 -1.000000 +161603 -1.000000 +161604 -1.000000 +161605 -1.000000 +161607 -1.000000 +161608 -1.000000 +161609 -1.000000 +161610 -1.000000 +161611 -1.000000 +161612 -1.000000 +161613 -1.000000 +161614 -1.000000 +161615 -1.000000 +161623 -1.000000 +161624 -1.000000 +161625 -1.000000 +161626 -1.000000 +161627 -1.000000 +161628 -1.000000 +161629 -1.000000 +161630 -1.000000 +161631 -1.000000 +161633 -1.000000 +161635 -1.000000 +161636 -1.000000 +161637 -1.000000 +161638 -1.000000 +161639 -1.000000 +161640 -1.000000 +161641 -1.000000 +161642 -1.000000 +161643 -1.000000 +161644 -1.000000 +161645 -1.000000 +161646 -1.000000 +161647 -1.000000 +161648 -1.000000 +161649 -1.000000 +161650 -1.000000 +162164 -1.000000 +162165 -1.000000 +162166 -1.000000 +162167 -1.000000 +162168 -1.000000 +162169 -1.000000 +162170 -1.000000 +162171 -1.000000 +162172 -1.000000 +162173 -1.000000 +162174 -1.000000 +162175 -1.000000 +162176 -1.000000 +162177 -1.000000 +162178 -1.000000 +162179 -1.000000 +162180 -1.000000 +162181 -1.000000 +162182 -1.000000 +162208 -1.000000 +162209 -1.000000 +162212 -1.000000 +162213 -1.000000 +162214 -1.000000 +162215 -1.000000 +162216 -1.000000 +162217 -1.000000 +162219 -1.000000 +162220 -1.000000 +162237 -1.000000 +162238 -1.000000 +162240 -1.000000 +162241 -1.000000 +162242 -1.000000 +162243 -1.000000 +162244 -1.000000 +162245 -1.000000 +162246 -1.000000 +162247 -1.000000 +162248 -1.000000 +162249 -1.000000 +162250 -1.000000 +162251 -1.000000 +162252 -1.000000 +162253 -1.000000 +162254 -1.000000 +162255 -1.000000 +162256 -1.000000 +162257 -1.000000 +162258 -1.000000 +162260 -1.000000 +162261 -1.000000 +162262 -1.000000 +162263 -1.000000 +162264 -1.000000 +162276 -1.000000 +162278 -1.000000 +162279 -1.000000 +162280 -1.000000 +162281 -1.000000 +162282 -1.000000 +162283 -1.000000 +162284 -1.000000 +162285 -1.000000 +162287 -1.000000 +162298 -1.000000 +162299 -1.000000 +162300 -1.000000 +162301 -1.000000 +162302 -1.000000 +162303 -1.000000 +162304 -1.000000 +162305 -1.000000 +162306 -1.000000 +162307 -1.000000 +162309 -1.000000 +162312 -1.000000 +162313 -1.000000 +162314 -1.000000 +162316 -1.000000 +162317 -1.000000 +162318 -1.000000 +162319 -1.000000 +162320 -1.000000 +162333 -1.000000 +162335 -1.000000 +162336 -1.000000 +162337 -1.000000 +162343 -1.000000 +162344 -1.000000 +162346 -1.000000 +162347 -1.000000 +162348 -1.000000 +162349 -1.000000 +162350 -1.000000 +162352 -1.000000 +162399 -1.000000 +162400 -1.000000 +162402 -1.000000 +162403 -1.000000 +162404 -1.000000 +162405 -1.000000 +162406 -1.000000 +162407 -1.000000 +162408 -1.000000 +162409 -1.000000 +162410 -1.000000 +162411 -1.000000 +162412 -1.000000 +162413 -1.000000 +162414 -1.000000 +162415 -1.000000 +162416 -1.000000 +162419 -1.000000 +162422 -1.000000 +162431 -1.000000 +162439 -1.000000 +162441 -1.000000 +162442 -1.000000 +162443 -1.000000 +162444 -1.000000 +162445 -1.000000 +162446 -1.000000 +162447 -1.000000 +162448 -1.000000 +162449 -1.000000 +162450 -1.000000 +162451 -1.000000 +162452 -1.000000 +162453 -1.000000 +162454 -1.000000 +162489 -1.000000 +162494 -1.000000 +162495 -1.000000 +162499 -1.000000 +162500 -1.000000 +162501 -1.000000 +162502 -1.000000 +162503 -1.000000 +162504 -1.000000 +162505 -1.000000 +162506 -1.000000 +162507 -1.000000 +162508 -1.000000 +162509 -1.000000 +162510 -1.000000 +162511 -1.000000 +162512 -1.000000 +162520 -1.000000 +162521 -1.000000 +162522 -1.000000 +162523 -1.000000 +162524 -1.000000 +162525 -1.000000 +162526 -1.000000 +162527 -1.000000 +162528 -1.000000 +162529 -1.000000 +162530 -1.000000 +162531 -1.000000 +162532 -1.000000 +162533 -1.000000 +162534 -1.000000 +162535 -1.000000 +162536 -1.000000 +162537 -1.000000 +162540 -1.000000 +162543 -1.000000 +162556 -1.000000 +162557 -1.000000 +162558 -1.000000 +162559 -1.000000 +162691 -1.000000 +162693 -1.000000 +162695 -1.000000 +162696 -1.000000 +162697 -1.000000 +162706 -1.000000 +162707 -1.000000 +162708 -1.000000 +162709 -1.000000 +162710 -1.000000 +162711 -1.000000 +162712 -1.000000 +162713 -1.000000 +162715 -1.000000 +162716 -1.000000 +162717 -1.000000 +162718 -1.000000 +162719 -1.000000 +162722 -1.000000 +162723 -1.000000 +162724 -1.000000 +162725 -1.000000 +162727 -1.000000 +162728 -1.000000 +162729 -1.000000 +162730 -1.000000 +162731 -1.000000 +162732 -1.000000 +162733 -1.000000 +162734 -1.000000 +162742 -1.000000 +162743 -1.000000 +162744 -1.000000 +162745 -1.000000 +162746 -1.000000 +162747 -1.000000 +162748 -1.000000 +162749 -1.000000 +162750 -1.000000 +162751 -1.000000 +162752 -1.000000 +162753 -1.000000 +162754 -1.000000 +162760 -1.000000 +162761 -1.000000 +162762 -1.000000 +162763 -1.000000 +162764 -1.000000 +162765 -1.000000 +162766 -1.000000 +162767 -1.000000 +162768 -1.000000 +162769 -1.000000 +162770 -1.000000 +162771 -1.000000 +162777 -1.000000 +162778 -1.000000 +162779 -1.000000 +162780 -1.000000 +162781 -1.000000 +162782 -1.000000 +162783 -1.000000 +162784 -1.000000 +162785 -1.000000 +162786 -1.000000 +162787 -1.000000 +162788 -1.000000 +162789 -1.000000 +162790 -1.000000 +162793 -1.000000 +162795 -1.000000 +162796 -1.000000 +162797 -1.000000 +162798 -1.000000 +162799 -1.000000 +162800 -1.000000 +162801 -1.000000 +162802 -1.000000 +162803 -1.000000 +162804 -1.000000 +162807 -1.000000 +162815 -1.000000 +162865 -1.000000 +162866 -1.000000 +162867 -1.000000 +162868 -1.000000 +162869 -1.000000 +162870 -1.000000 +162871 -1.000000 +162872 -1.000000 +162873 -1.000000 +162874 -1.000000 +162875 -1.000000 +162876 -1.000000 +162877 -1.000000 +162887 -1.000000 +162888 -1.000000 +162889 -1.000000 +162890 -1.000000 +162891 -1.000000 +162892 -1.000000 +162893 -1.000000 +162894 -1.000000 +162895 -1.000000 +162896 -1.000000 +162897 -1.000000 +162898 -1.000000 +162899 -1.000000 +162900 -1.000000 +162905 -1.000000 +162906 -1.000000 +162907 -1.000000 +162908 -1.000000 +162910 -1.000000 +162911 -1.000000 +162912 -1.000000 +162913 -1.000000 +162914 -1.000000 +162915 -1.000000 +162916 -1.000000 +162917 -1.000000 +162918 -1.000000 +162919 -1.000000 +162920 -1.000000 +162921 -1.000000 +162922 -1.000000 +162926 -1.000000 +162927 -1.000000 +162928 -1.000000 +162929 -1.000000 +162930 -1.000000 +162931 -1.000000 +162932 -1.000000 +162933 -1.000000 +162934 -1.000000 +162938 -1.000000 +162939 -1.000000 +162940 -1.000000 +162941 -1.000000 +162942 -1.000000 +162943 -1.000000 +162944 -1.000000 +162946 -1.000000 +162947 -1.000000 +162948 -1.000000 +162949 -1.000000 +162950 -1.000000 +162953 -1.000000 +162954 -1.000000 +162955 -1.000000 +162959 -1.000000 +162960 -1.000000 +162963 -1.000000 +162964 -1.000000 +162965 -1.000000 +162966 -1.000000 +162967 -1.000000 +162968 -1.000000 +162973 -1.000000 +162977 -1.000000 +162989 -1.000000 +162996 -1.000000 +162997 -1.000000 +163000 -1.000000 +163001 -1.000000 +163002 -1.000000 +163003 -1.000000 +163004 -1.000000 +163005 -1.000000 +163019 -1.000000 +163021 -1.000000 +163032 -1.000000 +163067 -1.000000 +163068 -1.000000 +163069 -1.000000 +163070 -1.000000 +163071 -1.000000 +163072 -1.000000 +163073 -1.000000 +163074 -1.000000 +163077 -1.000000 +163078 -1.000000 +163079 -1.000000 +163080 -1.000000 +163081 -1.000000 +163082 -1.000000 +163083 -1.000000 +163084 -1.000000 +163085 -1.000000 +163086 -1.000000 +163087 -1.000000 +163088 -1.000000 +163089 -1.000000 +163090 -1.000000 +163091 -1.000000 +163092 -1.000000 +163093 -1.000000 +163094 -1.000000 +163095 -1.000000 +163100 -1.000000 +163101 -1.000000 +163102 -1.000000 +163103 -1.000000 +163104 -1.000000 +163105 -1.000000 +163106 -1.000000 +163107 -1.000000 +163108 -1.000000 +163109 -1.000000 +163110 -1.000000 +163111 -1.000000 +163112 -1.000000 +163113 -1.000000 +163114 -1.000000 +163115 -1.000000 +163116 -1.000000 +163117 -1.000000 +163118 -1.000000 +163119 -1.000000 +163120 -1.000000 +163121 -1.000000 +163122 -1.000000 +163123 -1.000000 +163124 -1.000000 +163125 -1.000000 +163126 -1.000000 +163127 -1.000000 +163128 -1.000000 +163129 -1.000000 +163130 -1.000000 +163136 -1.000000 +163144 -1.000000 +163145 -1.000000 +163146 -1.000000 +163147 -1.000000 +163148 -1.000000 +163149 -1.000000 +163150 -1.000000 +163151 -1.000000 +163152 -1.000000 +163153 -1.000000 +163155 -1.000000 +163156 -1.000000 +163157 -1.000000 +163158 -1.000000 +163160 -1.000000 +163161 -1.000000 +163162 -1.000000 +163163 -1.000000 +163164 -1.000000 +163165 -1.000000 +163166 -1.000000 +163167 -1.000000 +163168 -1.000000 +163169 -1.000000 +163170 -1.000000 +163171 -1.000000 +163172 -1.000000 +163173 -1.000000 +163174 -1.000000 +163175 -1.000000 +163176 -1.000000 +163177 -1.000000 +163178 -1.000000 +163179 -1.000000 +163180 -1.000000 +163181 -1.000000 +163182 -1.000000 +163183 -1.000000 +163184 -1.000000 +163201 -1.000000 +163202 -1.000000 +163204 -1.000000 +163205 -1.000000 +163206 -1.000000 +163208 -1.000000 +163214 -1.000000 +163215 -1.000000 +163216 -1.000000 +163217 -1.000000 +163218 -1.000000 +163219 -1.000000 +163220 -1.000000 +163222 -1.000000 +163223 -1.000000 +163225 -1.000000 +163228 -1.000000 +163229 -1.000000 +163230 -1.000000 +163236 -1.000000 +163237 -1.000000 +163238 -1.000000 +163240 -1.000000 +163244 -1.000000 +163249 -1.000000 +163250 -1.000000 +163251 -1.000000 +163252 -1.000000 +163253 -1.000000 +163256 -1.000000 +163260 -1.000000 +163261 -1.000000 +163262 -1.000000 +163263 -1.000000 +163264 -1.000000 +163265 -1.000000 +163273 -1.000000 +163274 -1.000000 +163285 -1.000000 +163288 -1.000000 +163290 -1.000000 +163291 -1.000000 +163292 -1.000000 +163293 -1.000000 +163294 -1.000000 +163295 -1.000000 +163296 -1.000000 +163297 -1.000000 +163304 -1.000000 +163305 -1.000000 +163310 -1.000000 +163313 -1.000000 +163315 -1.000000 +163316 -1.000000 +163317 -1.000000 +163318 -1.000000 +163328 -1.000000 +163330 -1.000000 +163331 -1.000000 +163332 -1.000000 +163333 -1.000000 +163334 -1.000000 +163335 -1.000000 +163336 -1.000000 +163427 -1.000000 +163428 -1.000000 +163429 -1.000000 +163430 -1.000000 +163431 -1.000000 +163432 -1.000000 +163435 -1.000000 +163436 -1.000000 +163437 -1.000000 +163438 -1.000000 +163439 -1.000000 +163440 -1.000000 +163441 -1.000000 +163442 -1.000000 +163443 -1.000000 +163444 -1.000000 +163445 -1.000000 +163446 -1.000000 +163447 -1.000000 +163448 -1.000000 +163449 -1.000000 +163450 -1.000000 +163451 -1.000000 +163455 -1.000000 +163456 -1.000000 +163457 -1.000000 +163458 -1.000000 +163459 -1.000000 +163463 -1.000000 +163464 -1.000000 +163465 -1.000000 +163466 -1.000000 +163467 -1.000000 +163468 -1.000000 +163469 -1.000000 +163470 -1.000000 +163471 -1.000000 +163472 -1.000000 +163473 -1.000000 +163475 -1.000000 +163476 -1.000000 +163477 -1.000000 +163478 -1.000000 +163479 -1.000000 +163480 -1.000000 +163481 -1.000000 +163482 -1.000000 +163483 -1.000000 +163484 -1.000000 +163485 -1.000000 +163486 -1.000000 +163487 -1.000000 +163488 -1.000000 +163489 -1.000000 +163490 -1.000000 +163491 -1.000000 +163492 -1.000000 +163497 -1.000000 +163498 -1.000000 +163499 -1.000000 +163500 -1.000000 +163501 -1.000000 +163502 -1.000000 +163503 -1.000000 +163504 -1.000000 +163505 -1.000000 +163506 -1.000000 +163507 -1.000000 +163508 -1.000000 +163509 -1.000000 +163510 -1.000000 +163511 -1.000000 +163512 -1.000000 +163513 -1.000000 +163514 -1.000000 +163515 -1.000000 +163517 -1.000000 +163518 -1.000000 +163519 -1.000000 +163520 -1.000000 +163521 -1.000000 +163524 -1.000000 +163525 -1.000000 +163526 -1.000000 +163531 -1.000000 +163532 -1.000000 +163533 -1.000000 +163534 -1.000000 +163535 -1.000000 +163536 -1.000000 +163537 -1.000000 +163538 -1.000000 +163539 -1.000000 +163540 -1.000000 +163541 -1.000000 +163542 -1.000000 +163543 -1.000000 +163544 -1.000000 +163545 -1.000000 +163546 -1.000000 +163547 -1.000000 +163548 -1.000000 +163549 -1.000000 +163550 -1.000000 +163551 -1.000000 +163552 -1.000000 +163553 -1.000000 +163590 -1.000000 +163591 -1.000000 +163600 -1.000000 +163606 -1.000000 +163607 -1.000000 +163608 -1.000000 +163609 -1.000000 +163610 -1.000000 +163650 -1.000000 +163651 -1.000000 +163652 -1.000000 +163653 -1.000000 +163655 -1.000000 +163656 -1.000000 +163657 -1.000000 +163658 -1.000000 +163659 -1.000000 +163660 -1.000000 +163661 -1.000000 +163662 -1.000000 +163663 -1.000000 +163664 -1.000000 +163665 -1.000000 +163666 -1.000000 +163698 -1.000000 +163703 -1.000000 +163706 -1.000000 +163707 -1.000000 +163708 -1.000000 +163710 -1.000000 +163711 -1.000000 +163712 -1.000000 +163713 -1.000000 +163715 -1.000000 +163716 -1.000000 +163717 -1.000000 +163718 -1.000000 +163719 -1.000000 +163721 -1.000000 +163722 -1.000000 +163723 -1.000000 +163724 -1.000000 +163725 -1.000000 +163726 -1.000000 +163727 -1.000000 +163734 -1.000000 +163736 -1.000000 +163737 -1.000000 +163738 -1.000000 +163739 -1.000000 +163740 -1.000000 +163742 -1.000000 +163750 -1.000000 +163752 -1.000000 +163753 -1.000000 +163754 -1.000000 +163755 -1.000000 +163756 -1.000000 +163757 -1.000000 +163758 -1.000000 +163759 -1.000000 +163782 -1.000000 +163786 -1.000000 +163787 -1.000000 +163788 -1.000000 +163789 -1.000000 +163790 -1.000000 +163791 -1.000000 +163792 -1.000000 +163793 -1.000000 +163794 -1.000000 +163795 -1.000000 +163796 -1.000000 +163797 -1.000000 +163799 -1.000000 +163800 -1.000000 +163802 -1.000000 +163804 -1.000000 +163808 -1.000000 +163811 -1.000000 +163818 -1.000000 +163819 -1.000000 +163821 -1.000000 +163823 -1.000000 +163825 -1.000000 +163826 -1.000000 +163828 -1.000000 +163829 -1.000000 +163830 -1.000000 +163831 -1.000000 +163832 -1.000000 +163833 -1.000000 +163834 -1.000000 +163835 -1.000000 +164030 -1.000000 +164031 -1.000000 +164032 -1.000000 +164033 -1.000000 +164034 -1.000000 +164035 -1.000000 +164036 -1.000000 +164038 -1.000000 +164039 -1.000000 +164040 -1.000000 +164041 -1.000000 +164042 -1.000000 +164043 -1.000000 +164044 -1.000000 +164045 -1.000000 +164046 -1.000000 +164047 -1.000000 +164048 -1.000000 +164049 -1.000000 +164050 -1.000000 +164062 -1.000000 +164063 -1.000000 +164064 -1.000000 +164065 -1.000000 +164066 -1.000000 +164067 -1.000000 +164068 -1.000000 +164069 -1.000000 +164070 -1.000000 +164071 -1.000000 +164073 -1.000000 +164075 -1.000000 +164076 -1.000000 +164077 -1.000000 +164078 -1.000000 +164079 -1.000000 +164084 -1.000000 +164085 -1.000000 +164086 -1.000000 +164087 -1.000000 +164088 -1.000000 +164089 -1.000000 +164090 -1.000000 +164091 -1.000000 +164092 -1.000000 +164093 -1.000000 +164094 -1.000000 +164095 -1.000000 +164096 -1.000000 +164097 -1.000000 +164098 -1.000000 +164099 -1.000000 +164100 -1.000000 +164101 -1.000000 +164102 -1.000000 +164103 -1.000000 +164104 -1.000000 +164105 -1.000000 +164106 -1.000000 +164107 -1.000000 +164108 -1.000000 +164109 -1.000000 +164110 -1.000000 +164111 -1.000000 +164112 -1.000000 +164113 -1.000000 +164114 -1.000000 +164123 -1.000000 +164124 -1.000000 +164125 -1.000000 +164127 -1.000000 +164134 -1.000000 +164135 -1.000000 +164136 -1.000000 +164137 -1.000000 +164138 -1.000000 +164139 -1.000000 +164140 -1.000000 +164141 -1.000000 +164142 -1.000000 +164143 -1.000000 +164144 -1.000000 +164145 -1.000000 +164146 -1.000000 +164169 -1.000000 +164170 -1.000000 +164171 -1.000000 +164172 -1.000000 +164173 -1.000000 +164174 -1.000000 +164176 -1.000000 +164178 -1.000000 +164179 -1.000000 +164186 -1.000000 +164187 -1.000000 +164188 -1.000000 +164189 -1.000000 +164190 -1.000000 +164191 -1.000000 +164192 -1.000000 +164193 -1.000000 +164194 -1.000000 +164195 -1.000000 +164205 -1.000000 +164206 -1.000000 +164207 -1.000000 +164208 -1.000000 +164209 -1.000000 +164210 -1.000000 +164211 -1.000000 +164212 -1.000000 +164213 -1.000000 +164214 -1.000000 +164215 -1.000000 +164216 -1.000000 +164218 -1.000000 +164220 -1.000000 +164221 -1.000000 +164222 -1.000000 +164228 -1.000000 +164229 -1.000000 +164237 -1.000000 +164239 -1.000000 +164240 -1.000000 +164241 -1.000000 +164242 -1.000000 +164244 -1.000000 +164245 -1.000000 +164246 -1.000000 +164248 -1.000000 +164249 -1.000000 +164250 -1.000000 +164251 -1.000000 +164252 -1.000000 +164253 -1.000000 +164254 -1.000000 +164260 -1.000000 +164261 -1.000000 +164262 -1.000000 +164263 -1.000000 +164264 -1.000000 +164265 -1.000000 +164266 -1.000000 +164267 -1.000000 +164268 -1.000000 +164269 -1.000000 +164270 -1.000000 +164271 -1.000000 +164275 -1.000000 +164282 -1.000000 +164283 -1.000000 +164284 -1.000000 +164285 -1.000000 +164287 -1.000000 +164288 -1.000000 +164289 -1.000000 +164298 -1.000000 +164304 -1.000000 +164309 -1.000000 +164310 -1.000000 +164311 -1.000000 +164312 -1.000000 +164315 -1.000000 +164316 -1.000000 +164318 -1.000000 +164320 -1.000000 +164322 -1.000000 +164325 -1.000000 +164326 -1.000000 +164327 -1.000000 +164328 -1.000000 +164329 -1.000000 +164336 -1.000000 +164337 -1.000000 +164345 -1.000000 +164346 -1.000000 +164348 -1.000000 +164349 -1.000000 +164353 -1.000000 +164354 -1.000000 +164356 -1.000000 +164357 -1.000000 +164358 -1.000000 +164359 -1.000000 +164362 -1.000000 +164371 -1.000000 +164374 -1.000000 +164376 -1.000000 +164377 -1.000000 +164385 -1.000000 +164386 -1.000000 +164387 -1.000000 +164388 -1.000000 +164389 -1.000000 +164390 -1.000000 +164392 -1.000000 +164393 -1.000000 +164394 -1.000000 +164395 -1.000000 +164396 -1.000000 +164397 -1.000000 +164399 -1.000000 +164402 -1.000000 +164404 -1.000000 +164405 -1.000000 +164406 -1.000000 +164407 -1.000000 +164408 -1.000000 +164409 -1.000000 +164410 -1.000000 +164411 -1.000000 +164412 -1.000000 +164413 -1.000000 +164426 -1.000000 +164427 -1.000000 +164428 -1.000000 +164429 -1.000000 +164430 -1.000000 +164431 -1.000000 +164432 -1.000000 +164433 -1.000000 +164434 -1.000000 +164435 -1.000000 +164436 -1.000000 +164440 -1.000000 +164441 -1.000000 +164442 -1.000000 +164443 -1.000000 +164447 -1.000000 +164449 -1.000000 +164452 -1.000000 +164454 -1.000000 +164455 -1.000000 +164456 -1.000000 +164463 -1.000000 +164464 -1.000000 +164465 -1.000000 +164466 -1.000000 +164467 -1.000000 +164468 -1.000000 +164470 -1.000000 +164473 -1.000000 +164476 -1.000000 +164477 -1.000000 +164478 -1.000000 +164479 -1.000000 +164480 -1.000000 +164481 -1.000000 +164482 -1.000000 +164483 -1.000000 +164484 -1.000000 +164485 -1.000000 +164486 -1.000000 +164492 -1.000000 +164493 -1.000000 +164494 -1.000000 +164495 -1.000000 +164496 -1.000000 +164497 -1.000000 +164498 -1.000000 +164499 -1.000000 +164500 -1.000000 +164501 -1.000000 +164502 -1.000000 +164503 -1.000000 +164504 -1.000000 +164505 -1.000000 +164506 -1.000000 +164507 -1.000000 +164508 -1.000000 +164509 -1.000000 +164510 -1.000000 +164511 -1.000000 +164512 -1.000000 +164513 -1.000000 +164515 -1.000000 +164517 -1.000000 +164518 -1.000000 +164519 -1.000000 +164520 -1.000000 +164521 -1.000000 +164522 -1.000000 +164523 -1.000000 +164527 -1.000000 +164529 -1.000000 +164530 -1.000000 +164531 -1.000000 +164532 -1.000000 +164533 -1.000000 +164534 -1.000000 +164535 -1.000000 +164536 -1.000000 +164537 -1.000000 +164539 -1.000000 +164540 -1.000000 +164541 -1.000000 +164542 -1.000000 +164549 -1.000000 +164552 -1.000000 +164556 -1.000000 +164559 -1.000000 +164565 -1.000000 +164567 -1.000000 +164568 -1.000000 +164569 -1.000000 +164570 -1.000000 +164572 -1.000000 +164573 -1.000000 +164575 -1.000000 +164576 -1.000000 +164577 -1.000000 +164578 -1.000000 +164585 -1.000000 +164593 -1.000000 +164594 -1.000000 +164595 -1.000000 +164596 -1.000000 +164597 -1.000000 +164598 -1.000000 +164599 -1.000000 +164600 -1.000000 +164601 -1.000000 +164602 -1.000000 +164603 -1.000000 +164604 -1.000000 +164605 -1.000000 +164606 -1.000000 +164607 -1.000000 +164608 -1.000000 +164609 -1.000000 +164610 -1.000000 +164611 -1.000000 +164612 -1.000000 +164613 -1.000000 +164614 -1.000000 +164618 -1.000000 +164619 -1.000000 +164620 -1.000000 +164621 -1.000000 +164622 -1.000000 +164623 -1.000000 +164624 -1.000000 +164625 -1.000000 +164626 -1.000000 +164627 -1.000000 +164628 -1.000000 +164629 -1.000000 +164642 -1.000000 +164647 -1.000000 +164648 -1.000000 +164649 -1.000000 +164650 -1.000000 +164651 -1.000000 +164652 -1.000000 +164653 -1.000000 +164654 -1.000000 +164655 -1.000000 +164656 -1.000000 +164657 -1.000000 +164658 -1.000000 +164659 -1.000000 +164660 -1.000000 +164661 -1.000000 +164662 -1.000000 +164663 -1.000000 +164664 -1.000000 +164666 -1.000000 +164675 -1.000000 +164681 -1.000000 +164684 -1.000000 +164685 -1.000000 +164687 -1.000000 +164688 -1.000000 +164689 -1.000000 +164693 -1.000000 +164704 -1.000000 +164705 -1.000000 +164706 -1.000000 +164714 -1.000000 +164715 -1.000000 +164718 -1.000000 +164719 -1.000000 +164720 -1.000000 +164721 -1.000000 +164722 -1.000000 +164724 -1.000000 +164725 -1.000000 +164775 -1.000000 +164776 -1.000000 +164778 -1.000000 +164780 -1.000000 +164787 -1.000000 +164788 -1.000000 +164789 -1.000000 +164790 -1.000000 +164791 -1.000000 +164792 -1.000000 +164793 -1.000000 +164795 -1.000000 +164797 -1.000000 +164798 -1.000000 +164799 -1.000000 +164800 -1.000000 +164801 -1.000000 +164806 -1.000000 +164814 -1.000000 +164817 -1.000000 +164818 -1.000000 +164819 -1.000000 +164820 -1.000000 +164824 -1.000000 +164825 -1.000000 +164826 -1.000000 +164827 -1.000000 +164828 -1.000000 +164829 -1.000000 +164830 -1.000000 +164831 -1.000000 +164832 -1.000000 +164834 -1.000000 +164835 -1.000000 +164836 -1.000000 +164837 -1.000000 +164839 -1.000000 +164840 -1.000000 +164841 -1.000000 +164843 -1.000000 +164844 -1.000000 +164845 -1.000000 +164846 -1.000000 +164847 -1.000000 +164848 -1.000000 +164851 -1.000000 +164852 -1.000000 +164853 -1.000000 +164854 -1.000000 +164866 -1.000000 +164870 -1.000000 +164873 -1.000000 +164874 -1.000000 +164875 -1.000000 +164877 -1.000000 +164878 -1.000000 +164879 -1.000000 +164880 -1.000000 +164883 -1.000000 +164884 -1.000000 +164886 -1.000000 +164892 -1.000000 +164893 -1.000000 +164895 -1.000000 +164896 -1.000000 +164897 -1.000000 +164898 -1.000000 +164899 -1.000000 +164900 -1.000000 +164901 -1.000000 +164902 -1.000000 +164903 -1.000000 +164907 -1.000000 +164910 -1.000000 +164911 -1.000000 +164912 -1.000000 +164913 -1.000000 +164931 -1.000000 +164936 -1.000000 +164940 -1.000000 +164941 -1.000000 +164954 -1.000000 +164955 -1.000000 +164956 -1.000000 +164957 -1.000000 +164958 -1.000000 +164960 -1.000000 +164965 -1.000000 +164966 -1.000000 +164967 -1.000000 +164973 -1.000000 +164974 -1.000000 +164975 -1.000000 +164977 -1.000000 +164978 -1.000000 +164979 -1.000000 +164980 -1.000000 +164981 -1.000000 +164982 -1.000000 +164985 -1.000000 +164986 -1.000000 +164987 -1.000000 +164988 -1.000000 +164991 -1.000000 +164993 -1.000000 +164998 -1.000000 +164999 -1.000000 +165010 -1.000000 +165012 -1.000000 +165013 -1.000000 +165014 -1.000000 +165015 -1.000000 +165016 -1.000000 +165017 -1.000000 +165018 -1.000000 +165019 -1.000000 +165020 -1.000000 +165021 -1.000000 +165022 -1.000000 +165023 -1.000000 +165024 -1.000000 +165025 -1.000000 +165026 -1.000000 +165027 -1.000000 +165028 -1.000000 +165029 -1.000000 +165030 -1.000000 +165031 -1.000000 +165032 -1.000000 +165033 -1.000000 +165034 -1.000000 +165035 -1.000000 +165036 -1.000000 +165037 -1.000000 +165038 -1.000000 +165039 -1.000000 +165040 -1.000000 +165041 -1.000000 +165042 -1.000000 +165043 -1.000000 +165044 -1.000000 +165051 -1.000000 +165052 -1.000000 +165053 -1.000000 +165054 -1.000000 +165055 -1.000000 +165056 -1.000000 +165057 -1.000000 +165058 -1.000000 +165059 -1.000000 +165060 -1.000000 +165061 -1.000000 +165062 -1.000000 +165063 -1.000000 +165064 -1.000000 +165065 -1.000000 +165066 -1.000000 +165067 -1.000000 +165068 -1.000000 +165069 -1.000000 +165070 -1.000000 +165071 -1.000000 +165072 -1.000000 +165073 -1.000000 +165074 -1.000000 +165075 -1.000000 +165076 -1.000000 +165077 -1.000000 +165078 -1.000000 +165079 -1.000000 +165080 -1.000000 +165086 -1.000000 +165087 -1.000000 +165088 -1.000000 +165089 -1.000000 +165090 -1.000000 +165091 -1.000000 +165094 -1.000000 +165095 -1.000000 +165096 -1.000000 +165097 -1.000000 +165098 -1.000000 +165099 -1.000000 +165100 -1.000000 +165102 -1.000000 +165113 -1.000000 +165114 -1.000000 +165115 -1.000000 +165116 -1.000000 +165120 -1.000000 +165122 -1.000000 +165124 -1.000000 +165125 -1.000000 +165129 -1.000000 +165130 -1.000000 +165131 -1.000000 +165134 -1.000000 +165135 -1.000000 +165137 -1.000000 +165138 -1.000000 +165141 -1.000000 +165142 -1.000000 +165143 -1.000000 +165145 -1.000000 +165146 -1.000000 +165147 -1.000000 +165148 -1.000000 +165149 -1.000000 +165151 -1.000000 +165153 -1.000000 +165156 -1.000000 +165157 -1.000000 +165158 -1.000000 +165159 -1.000000 +165160 -1.000000 +165167 -1.000000 +165168 -1.000000 +165169 -1.000000 +165170 -1.000000 +165171 -1.000000 +165172 -1.000000 +165173 -1.000000 +165175 -1.000000 +165176 -1.000000 +165177 -1.000000 +165178 -1.000000 +165179 -1.000000 +165180 -1.000000 +165181 -1.000000 +165182 -1.000000 +165183 -1.000000 +165184 -1.000000 +165185 -1.000000 +165186 -1.000000 +165188 -1.000000 +165190 -1.000000 +165195 -1.000000 +165196 -1.000000 +165202 -1.000000 +165203 -1.000000 +165204 -1.000000 +165205 -1.000000 +165209 -1.000000 +165210 -1.000000 +165211 -1.000000 +165212 -1.000000 +165213 -1.000000 +165214 -1.000000 +165215 -1.000000 +165216 -1.000000 +165217 -1.000000 +165218 -1.000000 +165219 -1.000000 +165220 -1.000000 +165221 -1.000000 +165222 -1.000000 +165223 -1.000000 +165225 -1.000000 +165240 -1.000000 +165241 -1.000000 +165252 -1.000000 +165260 -1.000000 +165262 -1.000000 +165264 -1.000000 +165266 -1.000000 +165267 -1.000000 +165268 -1.000000 +165269 -1.000000 +165270 -1.000000 +165275 -1.000000 +165276 -1.000000 +165277 -1.000000 +165278 -1.000000 +165280 -1.000000 +165281 -1.000000 +165284 -1.000000 +165285 -1.000000 +165286 -1.000000 +165287 -1.000000 +165288 -1.000000 +165289 -1.000000 +165295 -1.000000 +165296 -1.000000 +165297 -1.000000 +165298 -1.000000 +165299 -1.000000 +165300 -1.000000 +165301 -1.000000 +165302 -1.000000 +165303 -1.000000 +165304 -1.000000 +165305 -1.000000 +165306 -1.000000 +165307 -1.000000 +165308 -1.000000 +165309 -1.000000 +165310 -1.000000 +165311 -1.000000 +165312 -1.000000 +165313 -1.000000 +165314 -1.000000 +165315 -1.000000 +165316 -1.000000 +165317 -1.000000 +165318 -1.000000 +165319 -1.000000 +165320 -1.000000 +165321 -1.000000 +165322 -1.000000 +165323 -1.000000 +165324 -1.000000 +165325 -1.000000 +165334 -1.000000 +165335 -1.000000 +165338 -1.000000 +165339 -1.000000 +165340 -1.000000 +165341 -1.000000 +165342 -1.000000 +165343 -1.000000 +165345 -1.000000 +165346 -1.000000 +165349 -1.000000 +165350 -1.000000 +165351 -1.000000 +165352 -1.000000 +165353 -1.000000 +165354 -1.000000 +165365 -1.000000 +165366 -1.000000 +165367 -1.000000 +165368 -1.000000 +165369 -1.000000 +165370 -1.000000 +165372 -1.000000 +165373 -1.000000 +165375 -1.000000 +165376 -1.000000 +165377 -1.000000 +165378 -1.000000 +165379 -1.000000 +165380 -1.000000 +165381 -1.000000 +165382 -1.000000 +165383 -1.000000 +165386 -1.000000 +165387 -1.000000 +165388 -1.000000 +165389 -1.000000 +165396 -1.000000 +165397 -1.000000 +165398 -1.000000 +165400 -1.000000 +165402 -1.000000 +165403 -1.000000 +165405 -1.000000 +165406 -1.000000 +165407 -1.000000 +165408 -1.000000 +165410 -1.000000 +165413 -1.000000 +165415 -1.000000 +165419 -1.000000 +165420 -1.000000 +165427 -1.000000 +165428 -1.000000 +165429 -1.000000 +165430 -1.000000 +165431 -1.000000 +165432 -1.000000 +165433 -1.000000 +165434 -1.000000 +165435 -1.000000 +165436 -1.000000 +165437 -1.000000 +165438 -1.000000 +165439 -1.000000 +165440 -1.000000 +165441 -1.000000 +165442 -1.000000 +165443 -1.000000 +165444 -1.000000 +165445 -1.000000 +165446 -1.000000 +165447 -1.000000 +165448 -1.000000 +165449 -1.000000 +165450 -1.000000 +165451 -1.000000 +165452 -1.000000 +165454 -1.000000 +165455 -1.000000 +165460 -1.000000 +165461 -1.000000 +165462 -1.000000 +165463 -1.000000 +165464 -1.000000 +165465 -1.000000 +165466 -1.000000 +165467 -1.000000 +165468 -1.000000 +165469 -1.000000 +165470 -1.000000 +165472 -1.000000 +165473 -1.000000 +165474 -1.000000 +165475 -1.000000 +165476 -1.000000 +165477 -1.000000 +165478 -1.000000 +165479 -1.000000 +165480 -1.000000 +165481 -1.000000 +165482 -1.000000 +165483 -1.000000 +165484 -1.000000 +165488 -1.000000 +165489 -1.000000 +165491 -1.000000 +165492 -1.000000 +165494 -1.000000 +165495 -1.000000 +165497 -1.000000 +165498 -1.000000 +165499 -1.000000 +165500 -1.000000 +165501 -1.000000 +165502 -1.000000 +165504 -1.000000 +165505 -1.000000 +165506 -1.000000 +165507 -1.000000 +165508 -1.000000 +165509 -1.000000 +165510 -1.000000 +165512 -1.000000 +165513 -1.000000 +165514 -1.000000 +165515 -1.000000 +165516 -1.000000 +165518 -1.000000 +165520 -1.000000 +165530 -1.000000 +165537 -1.000000 +165538 -1.000000 +165541 -1.000000 +165545 -1.000000 +165546 -1.000000 +165547 -1.000000 +165548 -1.000000 +165549 -1.000000 +165550 -1.000000 +165551 -1.000000 +165552 -1.000000 +165554 -1.000000 +165555 -1.000000 +165556 -1.000000 +165557 -1.000000 +165558 -1.000000 +165559 -1.000000 +165674 -1.000000 +165675 -1.000000 +165679 -1.000000 +165683 -1.000000 +165684 -1.000000 +165685 -1.000000 +165687 -1.000000 +165689 -1.000000 +165690 -1.000000 +165692 -1.000000 +165707 -1.000000 +165708 -1.000000 +165710 -1.000000 +165713 -1.000000 +165714 -1.000000 +165719 -1.000000 +165720 -1.000000 +165721 -1.000000 +165723 -1.000000 +165725 -1.000000 +165730 -1.000000 +165732 -1.000000 +165733 -1.000000 +165742 -1.000000 +165743 -1.000000 +165744 -1.000000 +165745 -1.000000 +165746 -1.000000 +165747 -1.000000 +165748 -1.000000 +165749 -1.000000 +165750 -1.000000 +165751 -1.000000 +165752 -1.000000 +165753 -1.000000 +165754 -1.000000 +165756 -1.000000 +165757 -1.000000 +165758 -1.000000 +165759 -1.000000 +165760 -1.000000 +165761 -1.000000 +165762 -1.000000 +165763 -1.000000 +165764 -1.000000 +165765 -1.000000 +165766 -1.000000 +165767 -1.000000 +165768 -1.000000 +165769 -1.000000 +165770 -1.000000 +165771 -1.000000 +165772 -1.000000 +165773 -1.000000 +165774 -1.000000 +165776 -1.000000 +165777 -1.000000 +165778 -1.000000 +165779 -1.000000 +165810 -1.000000 +165813 -1.000000 +165818 -1.000000 +165820 -1.000000 +165829 -1.000000 +165842 -1.000000 +165843 -1.000000 +165844 -1.000000 +165846 -1.000000 +165847 -1.000000 +165849 -1.000000 +165852 -1.000000 +165853 -1.000000 +165854 -1.000000 +165857 -1.000000 +165859 -1.000000 +165860 -1.000000 +165861 -1.000000 +165862 -1.000000 +165863 -1.000000 +165864 -1.000000 +165865 -1.000000 +165866 -1.000000 +165867 -1.000000 +165868 -1.000000 +165869 -1.000000 +165870 -1.000000 +165871 -1.000000 +165872 -1.000000 +165873 -1.000000 +165874 -1.000000 +165875 -1.000000 +165876 -1.000000 +165877 -1.000000 +165878 -1.000000 +165885 -1.000000 +165887 -1.000000 +165888 -1.000000 +165889 -1.000000 +165890 -1.000000 +165891 -1.000000 +165892 -1.000000 +165893 -1.000000 +165894 -1.000000 +165895 -1.000000 +165896 -1.000000 +165897 -1.000000 +165898 -1.000000 +165904 -1.000000 +165905 -1.000000 +165906 -1.000000 +165910 -1.000000 +165917 -1.000000 +165918 -1.000000 +165919 -1.000000 +165920 -1.000000 +165921 -1.000000 +165922 -1.000000 +165923 -1.000000 +165924 -1.000000 +165925 -1.000000 +165926 -1.000000 +165927 -1.000000 +165928 -1.000000 +165929 -1.000000 +165930 -1.000000 +165931 -1.000000 +165932 -1.000000 +165933 -1.000000 +165934 -1.000000 +165935 -1.000000 +165936 -1.000000 +165937 -1.000000 +165938 -1.000000 +165939 -1.000000 +165940 -1.000000 +165941 -1.000000 +165942 -1.000000 +165943 -1.000000 +165944 -1.000000 +165948 -1.000000 +165949 -1.000000 +165950 -1.000000 +165951 -1.000000 +165952 -1.000000 +165953 -1.000000 +165954 -1.000000 +165955 -1.000000 +165956 -1.000000 +165957 -1.000000 +165958 -1.000000 +165959 -1.000000 +165960 -1.000000 +165961 -1.000000 +165962 -1.000000 +165963 -1.000000 +165964 -1.000000 +165965 -1.000000 +165971 -1.000000 +165972 -1.000000 +165973 -1.000000 +165974 -1.000000 +165975 -1.000000 +165976 -1.000000 +165977 -1.000000 +165980 -1.000000 +166009 -1.000000 +166010 -1.000000 +166013 -1.000000 +166021 -1.000000 +166023 -1.000000 +166025 -1.000000 +166026 -1.000000 +166027 -1.000000 +166029 -1.000000 +166030 -1.000000 +166031 -1.000000 +166032 -1.000000 +166033 -1.000000 +166034 -1.000000 +166035 -1.000000 +166036 -1.000000 +166037 -1.000000 +166040 -1.000000 +166041 -1.000000 +166042 -1.000000 +166043 -1.000000 +166044 -1.000000 +166045 -1.000000 +166046 -1.000000 +166048 -1.000000 +166050 -1.000000 +166051 -1.000000 +166052 -1.000000 +166054 -1.000000 +166055 -1.000000 +166060 -1.000000 +166061 -1.000000 +166062 -1.000000 +166063 -1.000000 +166064 -1.000000 +166065 -1.000000 +166066 -1.000000 +166067 -1.000000 +166068 -1.000000 +166069 -1.000000 +166070 -1.000000 +166071 -1.000000 +166073 -1.000000 +166074 -1.000000 +166075 -1.000000 +166077 -1.000000 +166078 -1.000000 +166080 -1.000000 +166081 -1.000000 +166083 -1.000000 +166084 -1.000000 +166085 -1.000000 +166086 -1.000000 +166087 -1.000000 +166089 -1.000000 +166091 -1.000000 +166092 -1.000000 +166093 -1.000000 +166094 -1.000000 +166102 -1.000000 +166103 -1.000000 +166104 -1.000000 +166105 -1.000000 +166106 -1.000000 +166107 -1.000000 +166108 -1.000000 +166109 -1.000000 +166110 -1.000000 +166111 -1.000000 +166112 -1.000000 +166113 -1.000000 +166114 -1.000000 +166115 -1.000000 +166117 -1.000000 +166120 -1.000000 +166122 -1.000000 +166123 -1.000000 +166124 -1.000000 +166126 -1.000000 +166127 -1.000000 +166129 -1.000000 +166130 -1.000000 +166131 -1.000000 +166135 -1.000000 +166136 -1.000000 +166137 -1.000000 +166138 -1.000000 +166140 -1.000000 +166141 -1.000000 +166142 -1.000000 +166143 -1.000000 +166144 -1.000000 +166145 -1.000000 +166146 -1.000000 +166147 -1.000000 +166149 -1.000000 +166150 -1.000000 +166151 -1.000000 +166156 -1.000000 +166158 -1.000000 +166162 -1.000000 +166163 -1.000000 +166168 -1.000000 +166169 -1.000000 +166171 -1.000000 +166172 -1.000000 +166173 -1.000000 +166174 -1.000000 +166175 -1.000000 +166176 -1.000000 +166177 -1.000000 +166181 -1.000000 +166182 -1.000000 +166183 -1.000000 +166189 -1.000000 +166253 -1.000000 +166256 -1.000000 +166259 -1.000000 +166263 -1.000000 +166264 -1.000000 +166265 -1.000000 +166266 -1.000000 +166267 -1.000000 +166283 -1.000000 +166286 -1.000000 +166303 -1.000000 +166308 -1.000000 +166309 -1.000000 +166310 -1.000000 +166313 -1.000000 +166316 -1.000000 +166317 -1.000000 +166326 -1.000000 +166327 -1.000000 +166335 -1.000000 +166336 -1.000000 +166337 -1.000000 +166338 -1.000000 +166339 -1.000000 +166340 -1.000000 +166343 -1.000000 +166345 -1.000000 +166346 -1.000000 +166347 -1.000000 +166348 -1.000000 +166349 -1.000000 +166350 -1.000000 +166351 -1.000000 +166352 -1.000000 +166353 -1.000000 +166354 -1.000000 +166355 -1.000000 +166356 -1.000000 +166357 -1.000000 +166358 -1.000000 +166359 -1.000000 +166360 -1.000000 +166361 -1.000000 +166362 -1.000000 +166386 -1.000000 +166387 -1.000000 +166388 -1.000000 +166389 -1.000000 +166390 -1.000000 +166391 -1.000000 +166392 -1.000000 +166393 -1.000000 +166394 -1.000000 +166396 -1.000000 +166397 -1.000000 +166398 -1.000000 +166399 -1.000000 +166400 -1.000000 +166401 -1.000000 +166402 -1.000000 +166403 -1.000000 +166407 -1.000000 +166408 -1.000000 +166409 -1.000000 +166410 -1.000000 +166411 -1.000000 +166412 -1.000000 +166415 -1.000000 +166416 -1.000000 +166417 -1.000000 +166419 -1.000000 +166420 -1.000000 +166421 -1.000000 +166428 -1.000000 +166429 -1.000000 +166430 -1.000000 +166431 -1.000000 +166432 -1.000000 +166433 -1.000000 +166434 -1.000000 +166442 -1.000000 +166444 -1.000000 +166455 -1.000000 +166480 -1.000000 +166481 -1.000000 +166482 -1.000000 +166483 -1.000000 +166484 -1.000000 +166485 -1.000000 +166486 -1.000000 +166487 -1.000000 +166488 -1.000000 +166489 -1.000000 +166490 -1.000000 +166491 -1.000000 +166492 -1.000000 +166494 -1.000000 +166495 -1.000000 +166496 -1.000000 +166497 -1.000000 +166498 -1.000000 +166499 -1.000000 +166501 -1.000000 +166504 -1.000000 +166505 -1.000000 +166506 -1.000000 +166507 -1.000000 +166508 -1.000000 +166509 -1.000000 +166515 -1.000000 +166516 -1.000000 +166517 -1.000000 +166518 -1.000000 +166519 -1.000000 +166520 -1.000000 +166521 -1.000000 +166522 -1.000000 +166523 -1.000000 +166524 -1.000000 +166525 -1.000000 +166526 -1.000000 +166528 -1.000000 +166529 -1.000000 +166530 -1.000000 +166531 -1.000000 +166532 -1.000000 +166533 -1.000000 +166534 -1.000000 +166535 -1.000000 +166536 -1.000000 +166537 -1.000000 +166538 -1.000000 +166539 -1.000000 +166540 -1.000000 +166541 -1.000000 +166542 -1.000000 +166543 -1.000000 +166548 -1.000000 +166549 -1.000000 +166556 -1.000000 +166557 -1.000000 +166558 -1.000000 +166561 -1.000000 +166566 -1.000000 +166567 -1.000000 +166568 -1.000000 +166569 -1.000000 +166572 -1.000000 +166573 -1.000000 +166574 -1.000000 +166577 -1.000000 +166578 -1.000000 +166579 -1.000000 +166580 -1.000000 +166581 -1.000000 +166582 -1.000000 +166583 -1.000000 +166584 -1.000000 +166585 -1.000000 +166593 -1.000000 +166595 -1.000000 +166596 -1.000000 +166597 -1.000000 +166598 -1.000000 +166600 -1.000000 +166602 -1.000000 +166603 -1.000000 +166604 -1.000000 +166606 -1.000000 +166608 -1.000000 +166609 -1.000000 +166612 -1.000000 +166613 -1.000000 +166614 -1.000000 +166615 -1.000000 +166617 -1.000000 +166618 -1.000000 +166619 -1.000000 +166620 -1.000000 +166621 -1.000000 +166626 -1.000000 +166628 -1.000000 +166634 -1.000000 +166647 -1.000000 +166661 -1.000000 +166662 -1.000000 +166668 -1.000000 +166669 -1.000000 +166670 -1.000000 +166676 -1.000000 +166678 -1.000000 +166679 -1.000000 +166680 -1.000000 +166683 -1.000000 +166685 -1.000000 +166690 -1.000000 +166695 -1.000000 +166696 -1.000000 +166697 -1.000000 +166698 -1.000000 +166699 -1.000000 +166700 -1.000000 +166701 -1.000000 +166702 -1.000000 +166703 -1.000000 +166704 -1.000000 +166705 -1.000000 +166710 -1.000000 +166711 -1.000000 +166717 -1.000000 +166718 -1.000000 +166720 -1.000000 +166721 -1.000000 +166722 -1.000000 +166723 -1.000000 +166724 -1.000000 +166725 -1.000000 +166726 -1.000000 +166727 -1.000000 +166728 -1.000000 +166730 -1.000000 +166731 -1.000000 +166732 -1.000000 +166733 -1.000000 +166734 -1.000000 +166736 -1.000000 +166737 -1.000000 +166739 -1.000000 +166740 -1.000000 +166777 -1.000000 +166782 -1.000000 +166785 -1.000000 +166786 -1.000000 +166787 -1.000000 +166788 -1.000000 +166789 -1.000000 +166790 -1.000000 +166791 -1.000000 +166793 -1.000000 +166794 -1.000000 +166795 -1.000000 +166797 -1.000000 +166798 -1.000000 +166812 -1.000000 +166813 -1.000000 +166814 -1.000000 +166833 -1.000000 +166838 -1.000000 +166839 -1.000000 +166841 -1.000000 +166842 -1.000000 +166843 -1.000000 +166844 -1.000000 +166845 -1.000000 +166846 -1.000000 +166847 -1.000000 +166848 -1.000000 +166849 -1.000000 +166850 -1.000000 +166851 -1.000000 +166852 -1.000000 +166853 -1.000000 +166854 -1.000000 +166857 -1.000000 +166858 -1.000000 +166868 -1.000000 +166883 -1.000000 +166889 -1.000000 +166899 -1.000000 +166900 -1.000000 +166901 -1.000000 +166902 -1.000000 +166903 -1.000000 +166904 -1.000000 +166905 -1.000000 +166906 -1.000000 +166907 -1.000000 +166908 -1.000000 +166909 -1.000000 +166911 -1.000000 +166912 -1.000000 +166916 -1.000000 +166917 -1.000000 +166920 -1.000000 +166921 -1.000000 +166922 -1.000000 +166923 -1.000000 +166946 -1.000000 +166947 -1.000000 +166948 -1.000000 +166949 -1.000000 +166951 -1.000000 +167060 -1.000000 +167061 -1.000000 +167062 -1.000000 +167064 -1.000000 +167069 -1.000000 +167070 -1.000000 +167071 -1.000000 +167072 -1.000000 +167073 -1.000000 +167074 -1.000000 +167075 -1.000000 +167076 -1.000000 +167077 -1.000000 +167078 -1.000000 +167079 -1.000000 +167080 -1.000000 +167081 -1.000000 +167082 -1.000000 +167083 -1.000000 +167084 -1.000000 +167087 -1.000000 +167088 -1.000000 +167089 -1.000000 +167090 -1.000000 +167091 -1.000000 +167092 -1.000000 +167093 -1.000000 +167095 -1.000000 +167097 -1.000000 +167104 -1.000000 +167109 -1.000000 +167110 -1.000000 +167111 -1.000000 +167112 -1.000000 +167113 -1.000000 +167114 -1.000000 +167115 -1.000000 +167116 -1.000000 +167117 -1.000000 +167119 -1.000000 +167120 -1.000000 +167129 -1.000000 +167130 -1.000000 +167131 -1.000000 +167132 -1.000000 +167134 -1.000000 +167135 -1.000000 +167136 -1.000000 +167138 -1.000000 +167139 -1.000000 +167140 -1.000000 +167141 -1.000000 +167142 -1.000000 +167143 -1.000000 +167144 -1.000000 +167145 -1.000000 +167147 -1.000000 +167148 -1.000000 +167149 -1.000000 +167151 -1.000000 +167152 -1.000000 +167153 -1.000000 +167160 -1.000000 +167161 -1.000000 +167162 -1.000000 +167164 -1.000000 +167165 -1.000000 +167166 -1.000000 +167167 -1.000000 +167168 -1.000000 +167169 -1.000000 +167170 -1.000000 +167171 -1.000000 +167172 -1.000000 +167173 -1.000000 +167174 -1.000000 +167175 -1.000000 +167176 -1.000000 +167177 -1.000000 +167179 -1.000000 +167180 -1.000000 +167181 -1.000000 +167182 -1.000000 +167183 -1.000000 +167184 -1.000000 +167185 -1.000000 +167190 -1.000000 +167191 -1.000000 +167192 -1.000000 +167193 -1.000000 +167194 -1.000000 +167195 -1.000000 +167196 -1.000000 +167197 -1.000000 +167198 -1.000000 +167199 -1.000000 +167200 -1.000000 +167201 -1.000000 +167202 -1.000000 +167203 -1.000000 +167204 -1.000000 +167205 -1.000000 +167206 -1.000000 +167207 -1.000000 +167208 -1.000000 +167209 -1.000000 +167210 -1.000000 +167211 -1.000000 +167212 -1.000000 +167213 -1.000000 +167214 -1.000000 +167215 -1.000000 +167216 -1.000000 +167217 -1.000000 +167218 -1.000000 +167219 -1.000000 +167220 -1.000000 +167223 -1.000000 +167225 -1.000000 +167226 -1.000000 +167227 -1.000000 +167228 -1.000000 +167229 -1.000000 +167230 -1.000000 +167231 -1.000000 +167232 -1.000000 +167233 -1.000000 +167234 -1.000000 +167235 -1.000000 +167236 -1.000000 +167237 -1.000000 +167238 -1.000000 +167239 -1.000000 +167240 -1.000000 +167241 -1.000000 +167242 -1.000000 +167243 -1.000000 +167244 -1.000000 +167246 -1.000000 +167247 -1.000000 +167251 -1.000000 +167252 -1.000000 +167253 -1.000000 +167254 -1.000000 +167255 -1.000000 +167256 -1.000000 +167257 -1.000000 +167258 -1.000000 +167259 -1.000000 +167260 -1.000000 +167261 -1.000000 +167262 -1.000000 +167263 -1.000000 +167264 -1.000000 +167265 -1.000000 +167266 -1.000000 +167267 -1.000000 +167268 -1.000000 +167270 -1.000000 +167271 -1.000000 +167272 -1.000000 +167273 -1.000000 +167274 -1.000000 +167275 -1.000000 +167276 -1.000000 +167277 -1.000000 +167279 -1.000000 +167280 -1.000000 +167281 -1.000000 +167284 -1.000000 +167285 -1.000000 +167286 -1.000000 +167287 -1.000000 +167291 -1.000000 +167292 -1.000000 +167293 -1.000000 +167294 -1.000000 +167295 -1.000000 +167296 -1.000000 +167297 -1.000000 +167298 -1.000000 +167299 -1.000000 +167300 -1.000000 +167301 -1.000000 +167302 -1.000000 +167303 -1.000000 +167305 -1.000000 +167306 -1.000000 +167307 -1.000000 +167308 -1.000000 +167309 -1.000000 +167310 -1.000000 +167311 -1.000000 +167313 -1.000000 +167314 -1.000000 +167315 -1.000000 +167317 -1.000000 +167318 -1.000000 +167319 -1.000000 +167320 -1.000000 +167321 -1.000000 +167322 -1.000000 +167328 -1.000000 +167329 -1.000000 +167330 -1.000000 +167331 -1.000000 +167332 -1.000000 +167348 -1.000000 +167349 -1.000000 +167350 -1.000000 +167351 -1.000000 +167353 -1.000000 +167354 -1.000000 +167355 -1.000000 +167356 -1.000000 +167357 -1.000000 +167358 -1.000000 +167364 -1.000000 +167365 -1.000000 +167366 -1.000000 +167367 -1.000000 +167368 -1.000000 +167369 -1.000000 +167370 -1.000000 +167371 -1.000000 +167372 -1.000000 +167373 -1.000000 +167374 -1.000000 +167375 -1.000000 +167376 -1.000000 +167377 -1.000000 +167378 -1.000000 +167379 -1.000000 +167380 -1.000000 +167381 -1.000000 +167382 -1.000000 +167383 -1.000000 +167384 -1.000000 +167385 -1.000000 +167386 -1.000000 +167387 -1.000000 +167388 -1.000000 +167389 -1.000000 +167390 -1.000000 +167391 -1.000000 +167392 -1.000000 +167393 -1.000000 +167399 -1.000000 +167400 -1.000000 +167401 -1.000000 +167402 -1.000000 +167403 -1.000000 +167404 -1.000000 +167405 -1.000000 +167406 -1.000000 +167408 -1.000000 +167409 -1.000000 +167410 -1.000000 +167411 -1.000000 +167412 -1.000000 +167413 -1.000000 +167414 -1.000000 +167416 -1.000000 +167417 -1.000000 +167418 -1.000000 +167419 -1.000000 +167420 -1.000000 +167421 -1.000000 +167422 -1.000000 +167423 -1.000000 +167424 -1.000000 +167425 -1.000000 +167430 -1.000000 +167431 -1.000000 +167432 -1.000000 +167433 -1.000000 +167434 -1.000000 +167435 -1.000000 +167437 -1.000000 +167439 -1.000000 +167440 -1.000000 +167441 -1.000000 +167443 -1.000000 +167444 -1.000000 +167449 -1.000000 +167451 -1.000000 +167453 -1.000000 +167455 -1.000000 +167457 -1.000000 +167460 -1.000000 +167463 -1.000000 +167473 -1.000000 +167474 -1.000000 +167475 -1.000000 +167481 -1.000000 +167482 -1.000000 +167483 -1.000000 +167484 -1.000000 +167485 -1.000000 +167486 -1.000000 +167489 -1.000000 +167490 -1.000000 +167491 -1.000000 +167493 -1.000000 +167495 -1.000000 +167499 -1.000000 +167502 -1.000000 +167504 -1.000000 +167506 -1.000000 +167515 -1.000000 +167516 -1.000000 +167517 -1.000000 +167518 -1.000000 +167519 -1.000000 +167520 -1.000000 +167521 -1.000000 +167522 -1.000000 +167523 -1.000000 +167524 -1.000000 +167525 -1.000000 +167526 -1.000000 +167527 -1.000000 +167528 -1.000000 +167529 -1.000000 +167530 -1.000000 +167531 -1.000000 +167532 -1.000000 +167533 -1.000000 +167534 -1.000000 +167535 -1.000000 +167536 -1.000000 +167537 -1.000000 +167538 -1.000000 +167539 -1.000000 +167540 -1.000000 +167541 -1.000000 +167542 -1.000000 +167547 -1.000000 +167548 -1.000000 +167549 -1.000000 +167551 -1.000000 +167552 -1.000000 +167553 -1.000000 +167554 -1.000000 +167555 -1.000000 +167563 -1.000000 +167567 -1.000000 +167568 -1.000000 +167569 -1.000000 +167570 -1.000000 +167571 -1.000000 +167572 -1.000000 +167574 -1.000000 +167575 -1.000000 +167576 -1.000000 +167577 -1.000000 +167578 -1.000000 +167579 -1.000000 +167580 -1.000000 +167589 -1.000000 +167600 -1.000000 +167601 -1.000000 +167602 -1.000000 +167603 -1.000000 +167605 -1.000000 +167606 -1.000000 +167607 -1.000000 +167608 -1.000000 +167618 -1.000000 +168439 -1.000000 +168440 -1.000000 +168441 -1.000000 +168444 -1.000000 +168450 -1.000000 +168451 -1.000000 +168484 -1.000000 +168487 -1.000000 +168488 -1.000000 +168490 -1.000000 +168491 -1.000000 +168500 -1.000000 +168504 -1.000000 +168516 -1.000000 +168519 -1.000000 +168529 -1.000000 +168530 -1.000000 +168534 -1.000000 +168536 -1.000000 +168537 -1.000000 +168544 -1.000000 +168548 -1.000000 +168551 -1.000000 +168554 -1.000000 diff --git a/data/shot_lists/d3d/d3d_disrupt_100.txt b/data/shot_lists/d3d/d3d_disrupt_100.txt new file mode 100644 index 00000000..273cb7d2 --- /dev/null +++ b/data/shot_lists/d3d/d3d_disrupt_100.txt @@ -0,0 +1,100 @@ +167480 5.073500 +167487 2.159000 +167488 5.269000 +167492 7.088000 +167494 3.478500 +167496 6.479500 +167497 6.663000 +167498 6.497500 +167500 5.281500 +167501 6.870000 +167503 4.615500 +167505 5.835500 +167550 2.418500 +167556 5.325500 +167557 5.263000 +167558 5.222000 +167559 4.382500 +167560 0.883000 +167561 3.428500 +167562 3.831500 +167564 2.640000 +167565 2.804500 +167566 2.733000 +167586 2.967000 +167587 5.072500 +167588 5.124500 +167590 5.076000 +167591 5.206000 +167592 1.541500 +167593 5.521000 +167594 1.891000 +167595 3.250500 +167596 2.214000 +167597 2.118000 +167598 1.967500 +167599 2.018000 +167610 1.717000 +167611 2.536500 +167612 4.774500 +167613 0.619500 +167614 4.767000 +167615 4.079500 +167616 1.237000 +167617 4.100000 +167619 4.916000 +167621 4.590000 +167622 2.778000 +168442 0.847500 +168443 0.626500 +168445 2.576500 +168446 1.405500 +168447 1.776500 +168448 2.082500 +168449 1.831000 +168483 0.672000 +168485 0.662500 +168486 0.820500 +168489 0.714500 +168492 2.338000 +168493 2.316000 +168494 2.341000 +168495 4.422000 +168501 4.676500 +168502 6.203500 +168503 5.755500 +168505 4.525000 +168506 5.711000 +168507 6.390500 +168508 6.281000 +168509 6.097000 +168510 3.070000 +168511 6.675500 +168512 2.955000 +168513 6.267000 +168514 0.940500 +168515 7.020000 +168517 2.807000 +168518 7.039500 +168520 6.258000 +168521 6.160500 +168522 6.134000 +168527 7.124000 +168528 6.484500 +168531 6.278000 +168532 6.127500 +168533 7.128000 +168538 6.271000 +168539 7.039000 +168540 6.139500 +168541 6.132000 +168542 6.280500 +168543 7.031000 +168545 6.141500 +168546 6.151500 +168547 6.142000 +168549 7.032000 +168550 6.307500 +168552 7.019500 +168553 6.141500 +168555 6.704000 diff --git a/data/shot_lists/d3d/d3d_disrupt_1000.txt b/data/shot_lists/d3d/d3d_disrupt_1000.txt new file mode 100644 index 00000000..fcadf832 --- /dev/null +++ b/data/shot_lists/d3d/d3d_disrupt_1000.txt @@ -0,0 +1,1000 @@ +163530 4.519000 +163595 1.164500 +163601 6.631000 +163602 6.513000 +163603 6.519000 +163604 6.544500 +163605 1.665000 +163611 6.108000 +163648 4.259000 +163649 4.174000 +163654 5.901500 +163699 5.333000 +163700 6.054000 +163701 6.060500 +163702 1.857000 +163704 5.971500 +163705 0.992000 +163709 0.952000 +163714 7.040500 +163720 5.167000 +163735 6.103500 +163741 5.547000 +163743 7.020000 +163749 6.878000 +163751 5.739500 +163760 5.521500 +163761 5.499000 +163762 5.462000 +163773 5.476000 +163781 5.151500 +163783 4.856000 +163784 2.335000 +163785 1.764500 +163801 5.670500 +163803 5.655500 +163805 5.647000 +163806 5.777000 +163807 5.645500 +163809 5.652500 +163810 5.649500 +163812 5.242500 +163817 6.897500 +163820 5.961500 +163822 7.022500 +163824 7.022000 +163827 5.946500 +163836 7.020000 +164029 0.705000 +164037 4.956000 +164074 6.820500 +164083 7.133000 +164115 5.265000 +164126 7.089500 +164128 5.904500 +164129 6.013500 +164130 6.033500 +164131 6.042000 +164132 0.935000 +164133 5.414500 +164150 7.094500 +164168 5.355000 +164175 6.126500 +164185 7.135000 +164204 7.068500 +164219 5.969500 +164223 7.237500 +164224 4.082500 +164225 0.507000 +164226 4.827000 +164227 6.800000 +164238 4.235500 +164243 5.399000 +164247 5.004500 +164273 1.866500 +164274 5.456000 +164276 5.701500 +164277 5.030000 +164278 5.160500 +164279 6.109000 +164280 4.175500 +164281 5.646000 +164286 2.441000 +164290 6.393000 +164291 3.336000 +164292 5.688000 +164293 6.082500 +164294 5.329000 +164299 7.119500 +164300 4.873000 +164301 4.157000 +164302 6.034000 +164303 2.234500 +164305 3.460500 +164306 2.650500 +164307 3.972500 +164308 2.425000 +164313 2.428500 +164314 2.940500 +164317 2.989500 +164319 7.091000 +164321 5.542500 +164323 1.835500 +164324 2.415000 +164330 6.149500 +164331 4.768500 +164332 6.197000 +164333 4.571000 +164334 6.206000 +164335 6.229500 +164338 4.828000 +164347 1.199500 +164350 0.891000 +164351 3.069500 +164352 4.792000 +164355 3.292500 +164360 5.414500 +164361 4.194000 +164363 2.162500 +164364 1.865500 +164365 3.876500 +164367 2.340500 +164368 2.996500 +164369 3.570500 +164370 2.696000 +164372 5.018000 +164373 4.814000 +164375 3.798500 +164384 1.284500 +164391 1.309000 +164398 1.198000 +164400 1.197500 +164401 1.315500 +164403 1.198000 +164424 7.365000 +164438 5.362000 +164439 3.107000 +164444 2.427500 +164445 2.428000 +164446 4.209000 +164448 4.228000 +164450 3.401000 +164451 4.642500 +164453 4.479500 +164462 6.944500 +164469 3.866000 +164471 3.865500 +164472 3.315000 +164474 3.217500 +164491 4.812000 +164514 4.133000 +164516 4.199000 +164528 3.989500 +164538 4.035500 +164546 7.374500 +164547 6.380500 +164548 2.308500 +164550 5.724000 +164551 3.615000 +164553 3.807000 +164554 2.161000 +164555 3.660500 +164557 3.769500 +164558 3.870000 +164560 4.546000 +164561 5.051000 +164562 3.644500 +164563 3.725000 +164564 4.484500 +164566 5.585500 +164571 5.018500 +164574 4.823000 +164579 4.579500 +164580 3.763500 +164581 4.939500 +164582 4.342500 +164583 4.304500 +164584 4.860000 +164630 6.561500 +164631 6.566500 +164632 6.564500 +164633 6.563000 +164634 6.563500 +164635 6.553500 +164636 6.549000 +164637 6.565000 +164638 6.560500 +164639 6.562500 +164640 6.566000 +164641 6.561500 +164643 6.563500 +164646 4.531500 +164667 2.741000 +164668 4.419000 +164669 3.984000 +164670 3.567000 +164671 3.528000 +164672 3.584000 +164673 3.180000 +164674 4.377000 +164676 3.690000 +164677 4.875500 +164678 3.868500 +164679 3.655500 +164680 4.567500 +164682 4.668000 +164686 1.676500 +164694 6.557500 +164695 6.562000 +164696 6.561500 +164697 6.565500 +164698 6.535000 +164699 6.552500 +164700 6.540000 +164701 6.541500 +164702 6.551500 +164703 6.552000 +164707 6.551500 +164708 6.548500 +164709 6.552000 +164710 6.550000 +164711 6.544000 +164713 1.557000 +164716 2.470500 +164717 3.601000 +164723 6.406000 +164773 7.375500 +164777 7.379000 +164786 6.873500 +164794 6.724000 +164796 6.831500 +164802 6.358000 +164803 5.856000 +164804 6.286500 +164805 6.139000 +164807 6.498500 +164808 6.876000 +164809 6.871500 +164810 6.869500 +164811 4.803500 +164812 4.064000 +164815 7.040500 +164816 7.052000 +164833 7.036500 +164838 7.037000 +164842 7.039000 +164849 4.576000 +164850 7.032500 +164863 2.160500 +164869 5.294000 +164871 4.356000 +164872 4.624000 +164876 5.534500 +164881 5.271000 +164882 5.209500 +164885 0.655500 +164894 5.211500 +164904 5.062000 +164905 5.311500 +164906 5.156000 +164914 7.035500 +164915 7.035500 +164916 7.033000 +164917 7.032500 +164918 7.032500 +164919 7.030500 +164920 7.036000 +164921 7.036000 +164922 7.037500 +164923 7.039500 +164924 7.039000 +164925 7.034000 +164932 5.853500 +164933 3.359000 +164934 3.189500 +164935 5.359000 +164937 5.831500 +164938 5.376500 +164939 5.706500 +164942 3.588500 +164943 3.093000 +164944 2.283500 +164945 2.168000 +164946 2.140000 +164947 4.128500 +164948 4.135000 +164949 4.306500 +164950 5.551500 +164959 3.721500 +164961 3.172000 +164962 2.961500 +164963 3.134000 +164964 2.931000 +164971 7.354500 +164972 3.860000 +164976 3.424000 +164983 2.791000 +164984 3.487000 +164989 3.408000 +164990 3.747500 +164992 3.107500 +164994 1.744000 +164995 1.725500 +165000 2.307500 +165001 2.701500 +165002 2.949000 +165003 2.043500 +165004 4.216500 +165011 6.454500 +165050 6.391000 +165092 4.538500 +165093 4.920500 +165103 6.180000 +165104 6.378000 +165105 6.207000 +165106 6.872500 +165107 6.875500 +165108 5.901500 +165109 3.856500 +165110 4.365000 +165111 3.900500 +165112 1.231000 +165121 1.053500 +165123 7.040000 +165126 8.916000 +165127 8.972000 +165128 8.984000 +165132 8.950000 +165133 8.396000 +165136 8.339000 +165139 7.276500 +165140 6.272500 +165144 4.433000 +165150 5.239000 +165152 4.884500 +165154 4.885000 +165174 5.856500 +165187 3.380500 +165189 2.951000 +165191 4.084000 +165197 5.426500 +165198 3.287500 +165199 3.300500 +165200 3.792500 +165201 3.688500 +165206 6.123000 +165207 5.733500 +165208 5.257000 +165224 2.531500 +165226 6.163500 +165227 6.786000 +165233 7.371000 +165235 2.986500 +165236 4.640000 +165237 3.310000 +165238 2.744000 +165239 2.481000 +165242 2.804000 +165243 2.974000 +165244 2.743000 +165246 5.050500 +165247 3.581500 +165248 4.692000 +165249 3.925000 +165250 2.879000 +165251 6.871500 +165253 3.742500 +165257 5.182500 +165259 4.922000 +165261 4.965000 +165263 4.330000 +165265 5.007000 +165271 5.787000 +165272 5.678000 +165273 5.653500 +165274 5.649500 +165279 6.363000 +165282 6.835500 +165294 5.336500 +165348 4.656000 +165355 4.547000 +165363 1.081000 +165364 1.197500 +165371 1.198000 +165374 1.200000 +165384 1.199500 +165385 1.198000 +165399 3.424000 +165401 5.448000 +165404 5.337500 +165409 3.687500 +165411 5.443000 +165412 5.618500 +165414 5.594000 +165416 5.617500 +165417 5.523000 +165418 4.084000 +165421 3.356500 +165453 1.280500 +165459 7.364000 +165490 4.580000 +165493 3.722000 +165496 3.489000 +165503 5.512500 +165511 3.082500 +165524 7.367000 +165525 0.944000 +165526 2.261000 +165527 2.494000 +165528 2.425000 +165529 2.392500 +165531 2.319000 +165532 2.696000 +165533 2.266500 +165534 3.569000 +165535 1.770000 +165536 1.952500 +165539 2.699000 +165540 4.215000 +165542 3.246000 +165543 2.529500 +165544 2.959000 +165669 5.548500 +165670 6.205000 +165671 4.875000 +165672 4.755000 +165673 5.222000 +165676 4.819000 +165677 7.097500 +165678 7.077500 +165680 3.824500 +165682 3.008000 +165686 5.157500 +165688 6.094000 +165691 0.557500 +165693 1.280000 +165694 1.305000 +165703 0.749000 +165709 1.670000 +165711 2.224000 +165712 1.755000 +165715 4.545500 +165716 2.814000 +165717 1.084000 +165718 1.398000 +165722 2.276000 +165724 3.409500 +165726 5.542500 +165727 2.317000 +165728 3.328000 +165729 1.471500 +165731 2.415500 +165811 0.701500 +165812 0.709000 +165814 8.524500 +165815 8.773500 +165816 8.364000 +165817 3.328000 +165819 8.182500 +165821 6.182000 +165822 8.939000 +165823 3.673500 +165824 8.283500 +165825 8.637000 +165826 8.103500 +165827 7.650000 +165828 0.850500 +165830 0.728500 +165831 1.035000 +165832 1.229500 +165833 8.264000 +165834 5.796500 +165835 6.416000 +165836 5.846000 +165837 5.023000 +165838 8.247500 +165845 0.824000 +165848 0.794500 +165850 0.804000 +165851 5.665000 +165855 7.023000 +165856 7.021000 +165858 7.061500 +165883 1.541000 +165884 3.719500 +165886 1.993500 +165899 3.652500 +165900 1.141500 +165901 3.660500 +165902 0.577000 +165903 1.003000 +165907 3.622000 +165908 3.657000 +165909 4.088500 +165968 6.133500 +165969 5.141500 +165970 6.136500 +165978 3.706500 +165979 4.392000 +165981 6.874500 +165985 7.376000 +165986 6.873500 +165987 4.666000 +165988 6.130000 +165989 5.341500 +165990 4.721000 +165991 6.128500 +165992 4.528500 +165993 4.597000 +165994 4.504000 +165995 4.066000 +165996 4.524000 +165997 5.130000 +165998 3.553500 +165999 5.178000 +166000 6.137000 +166001 6.136000 +166002 3.245000 +166003 3.091500 +166004 6.140500 +166005 6.594000 +166006 3.079500 +166007 6.813000 +166011 1.464500 +166012 3.739500 +166017 7.375500 +166018 3.170500 +166019 3.104000 +166020 3.202000 +166022 5.481500 +166024 5.252000 +166028 4.048500 +166038 5.532000 +166039 5.195000 +166047 3.737500 +166053 5.434000 +166072 5.713000 +166076 1.704000 +166079 5.437500 +166082 5.560000 +166088 5.480500 +166095 3.881000 +166096 5.476500 +166097 5.689000 +166098 5.769000 +166116 6.058000 +166119 5.500000 +166121 5.339000 +166125 5.386500 +166128 3.336500 +166139 7.070000 +166152 5.840000 +166153 7.009000 +166154 7.013500 +166155 7.009500 +166157 7.010000 +166159 5.882000 +166160 5.853000 +166161 5.843000 +166164 5.887000 +166170 4.815500 +166178 3.918500 +166179 5.433500 +166184 3.407000 +166185 5.114500 +166186 5.107000 +166187 2.835500 +166188 5.043500 +166190 5.060000 +166191 5.076000 +166192 5.114000 +166254 5.385000 +166255 5.945500 +166257 2.609500 +166258 2.743500 +166260 3.786500 +166261 6.075000 +166262 4.591500 +166281 0.872000 +166282 1.856000 +166284 1.852500 +166287 1.040500 +166288 1.258500 +166289 1.092000 +166290 1.300500 +166291 0.908000 +166292 1.206000 +166293 1.034500 +166294 0.791000 +166295 1.102500 +166299 1.181500 +166300 5.736000 +166301 2.237000 +166302 2.138500 +166304 2.433500 +166305 5.557000 +166306 2.899000 +166307 5.523000 +166311 1.607000 +166312 1.560500 +166314 2.694500 +166315 1.480500 +166318 0.977500 +166319 1.014000 +166320 1.962000 +166321 2.454000 +166322 1.771000 +166323 2.741500 +166324 2.657000 +166325 1.983500 +166328 4.104500 +166329 1.742500 +166330 1.990000 +166334 6.963500 +166342 5.222000 +166344 4.802500 +166363 4.637000 +166364 3.482000 +166365 5.297500 +166395 1.394500 +166413 4.430000 +166414 4.922500 +166418 4.658000 +166422 2.659500 +166435 5.569500 +166436 5.445000 +166437 2.427500 +166438 5.051500 +166439 4.867500 +166440 5.329000 +166441 3.928000 +166443 4.451000 +166445 3.787000 +166446 4.699000 +166447 4.701000 +166448 5.217000 +166449 4.478000 +166450 4.461000 +166451 2.443500 +166452 4.280000 +166453 2.278500 +166454 4.837500 +166456 4.992500 +166457 4.171000 +166458 5.322500 +166459 5.606500 +166460 4.747500 +166461 5.549000 +166462 3.526000 +166463 3.614000 +166464 3.506500 +166465 3.790000 +166466 3.688500 +166467 4.269500 +166468 3.757000 +166469 3.656000 +166470 3.508500 +166493 4.079000 +166500 4.080500 +166502 4.956000 +166503 4.033000 +166527 2.580500 +166550 5.122000 +166551 4.000500 +166552 3.457500 +166553 4.474000 +166554 3.895000 +166555 5.035500 +166559 3.257000 +166560 3.396500 +166562 4.293000 +166563 4.003000 +166564 5.055500 +166565 4.187500 +166571 3.029000 +166575 5.315500 +166576 6.179000 +166594 0.553000 +166599 5.618500 +166601 2.505000 +166605 5.589500 +166607 5.651500 +166610 5.418000 +166611 5.363500 +166616 5.621000 +166622 5.638500 +166627 4.192500 +166629 2.826500 +166630 4.170000 +166631 4.205500 +166632 4.198000 +166633 4.170000 +166635 4.146000 +166636 4.151000 +166637 4.147500 +166638 4.153500 +166639 4.152000 +166640 4.159000 +166641 3.278500 +166642 4.150500 +166643 4.151500 +166644 5.156500 +166645 2.218500 +166646 5.202000 +166648 5.156500 +166649 5.168500 +166650 5.163000 +166651 5.172500 +166652 5.170000 +166653 5.174000 +166654 5.160500 +166655 5.161000 +166656 5.165500 +166657 5.162500 +166658 5.166500 +166659 5.166000 +166660 5.174000 +166671 1.659500 +166672 1.727500 +166673 1.632500 +166674 1.788000 +166675 1.692000 +166677 1.915000 +166681 4.836500 +166682 4.692000 +166684 5.514000 +166686 3.270500 +166687 4.721000 +166688 5.213000 +166689 5.935500 +166691 4.508000 +166692 5.251000 +166712 1.034000 +166713 1.150000 +166714 1.040000 +166715 5.345000 +166719 1.923500 +166729 5.508500 +166738 3.744000 +166741 1.511500 +166742 3.308000 +166776 1.074000 +166778 1.088500 +166779 0.894500 +166780 0.912500 +166781 0.966500 +166783 1.571500 +166784 2.023500 +166792 3.830500 +166796 1.505500 +166799 1.393000 +166800 2.193000 +166801 3.007500 +166802 3.758000 +166811 5.160000 +166815 5.113500 +166816 4.729000 +166817 2.436500 +166818 3.124000 +166819 4.611000 +166820 4.022000 +166821 4.340500 +166822 4.279500 +166823 4.161500 +166824 4.267000 +166825 4.304000 +166826 4.482500 +166827 2.559500 +166828 4.965000 +166829 3.224000 +166830 4.550500 +166831 4.716500 +166832 5.033000 +166840 4.949000 +166855 4.367000 +166856 5.820500 +166859 5.542500 +166860 5.404500 +166861 4.097500 +166862 4.806500 +166863 4.617000 +166867 3.153000 +166869 4.392000 +166870 4.478500 +166871 1.504500 +166872 4.060000 +166873 5.047000 +166874 4.759000 +166875 4.478000 +166876 5.145500 +166877 2.637000 +166878 4.153000 +166879 3.578000 +166880 5.237000 +166881 5.431500 +166882 4.975000 +166884 5.129500 +166885 5.227000 +166886 5.299000 +166887 5.671500 +166888 5.345500 +166890 6.104500 +166891 5.377500 +166892 4.732500 +166913 5.838500 +166914 4.631500 +166915 5.392000 +166918 5.389500 +166919 5.366500 +166927 1.065500 +166928 1.742500 +166929 4.976000 +166930 5.046000 +166931 4.051500 +166932 4.228500 +166933 4.225500 +166934 4.400500 +166935 4.478000 +166936 4.230500 +166937 4.190500 +166938 3.778000 +166939 4.098500 +166942 2.899000 +166943 4.016000 +166944 5.286500 +166945 5.955000 +166950 6.116500 +166952 5.292500 +166953 5.259000 +167063 0.673000 +167085 2.085500 +167086 5.535500 +167094 0.660000 +167096 0.741500 +167103 0.736500 +167105 0.789500 +167106 0.783500 +167107 0.787500 +167108 0.723000 +167118 2.798000 +167133 1.693000 +167146 4.320500 +167150 5.478500 +167163 4.934000 +167189 2.112500 +167224 0.789500 +167245 5.410000 +167269 2.186000 +167278 5.405000 +167282 5.119000 +167283 5.136500 +167304 5.651000 +167312 5.370500 +167316 5.685000 +167323 2.984500 +167333 3.190000 +167334 1.819500 +167335 2.169500 +167336 1.749000 +167337 5.923500 +167338 6.031500 +167339 2.289000 +167340 3.335500 +167341 3.055500 +167342 5.238500 +167343 2.486000 +167344 2.552500 +167345 1.991500 +167346 2.029500 +167347 5.761500 +167352 5.717500 +167359 5.725000 +167363 1.167000 +167407 5.777500 +167415 4.738000 +167429 4.494000 +167436 0.886500 +167438 3.657500 +167442 0.734500 +167445 4.861000 +167446 0.689500 +167447 1.046000 +167448 1.219000 +167450 4.776000 +167452 5.180500 +167454 0.991500 +167456 1.013000 +167458 3.967500 +167459 1.044500 +167461 1.095500 +167462 1.143500 +167464 4.364000 +167465 4.265000 +167469 2.654500 +167470 1.177000 +167471 1.076500 +167472 4.538500 +167476 4.870000 +167477 1.109000 +167478 1.092000 +167479 1.026500 +167480 5.073500 +167487 2.159000 +167488 5.269000 +167492 7.088000 +167494 3.478500 +167496 6.479500 +167497 6.663000 +167498 6.497500 +167500 5.281500 +167501 6.870000 +167503 4.615500 +167505 5.835500 +167550 2.418500 +167556 5.325500 +167557 5.263000 +167558 5.222000 +167559 4.382500 +167560 0.883000 +167561 3.428500 +167562 3.831500 +167564 2.640000 +167565 2.804500 +167566 2.733000 +167586 2.967000 +167587 5.072500 +167588 5.124500 +167590 5.076000 +167591 5.206000 +167592 1.541500 +167593 5.521000 +167594 1.891000 +167595 3.250500 +167596 2.214000 +167597 2.118000 +167598 1.967500 +167599 2.018000 +167610 1.717000 +167611 2.536500 +167612 4.774500 +167613 0.619500 +167614 4.767000 +167615 4.079500 +167616 1.237000 +167617 4.100000 +167619 4.916000 +167621 4.590000 +167622 2.778000 +168442 0.847500 +168443 0.626500 +168445 2.576500 +168446 1.405500 +168447 1.776500 +168448 2.082500 +168449 1.831000 +168483 0.672000 +168485 0.662500 +168486 0.820500 +168489 0.714500 +168492 2.338000 +168493 2.316000 +168494 2.341000 +168495 4.422000 +168501 4.676500 +168502 6.203500 +168503 5.755500 +168505 4.525000 +168506 5.711000 +168507 6.390500 +168508 6.281000 +168509 6.097000 +168510 3.070000 +168511 6.675500 +168512 2.955000 +168513 6.267000 +168514 0.940500 +168515 7.020000 +168517 2.807000 +168518 7.039500 +168520 6.258000 +168521 6.160500 +168522 6.134000 +168527 7.124000 +168528 6.484500 +168531 6.278000 +168532 6.127500 +168533 7.128000 +168538 6.271000 +168539 7.039000 +168540 6.139500 +168541 6.132000 +168542 6.280500 +168543 7.031000 +168545 6.141500 +168546 6.151500 +168547 6.142000 +168549 7.032000 +168550 6.307500 +168552 7.019500 +168553 6.141500 +168555 6.704000 diff --git a/data/shot_lists/d3d/d3d_disrupt_10000.txt b/data/shot_lists/d3d/d3d_disrupt_10000.txt new file mode 100644 index 00000000..a5d85a68 --- /dev/null +++ b/data/shot_lists/d3d/d3d_disrupt_10000.txt @@ -0,0 +1,10000 @@ +126886 6.090000 +126887 3.956000 +126888 6.095000 +126892 6.285000 +126893 6.350000 +126895 6.345000 +126900 3.908000 +126901 4.104000 +126902 4.620000 +126903 4.526000 +126904 3.886000 +126909 4.678000 +126910 4.714000 +126911 4.702000 +126913 4.614000 +126926 4.500000 +126928 3.303000 +126931 4.738000 +126932 3.001800 +126933 3.000600 +126934 2.001000 +126935 2.000400 +126936 1.680000 +127330 2.771000 +127331 3.120000 +127332 3.440000 +127342 4.866000 +127350 0.652000 +127351 0.616000 +127352 0.662000 +127362 0.568000 +127366 0.666000 +127367 0.522000 +127372 4.356000 +127375 1.431000 +127376 5.075000 +127377 1.196000 +127384 1.693000 +127387 3.604000 +127388 3.656000 +127396 2.574000 +127400 4.320000 +127444 6.415000 +127450 4.124000 +127456 5.465000 +127458 5.560000 +127538 5.770000 +127539 4.292000 +127540 6.105000 +127543 5.565000 +127545 1.826000 +127546 1.648000 +127547 2.348000 +127548 3.442000 +127549 3.444000 +127550 3.674000 +127551 1.053000 +127552 3.820000 +127553 3.824000 +127554 4.112000 +127555 3.352000 +127556 3.284000 +127580 3.604000 +127581 4.460000 +127582 3.940000 +127583 3.980000 +127584 3.926000 +127585 2.784000 +127586 2.196000 +127588 4.870000 +127589 4.116000 +127590 4.024000 +127591 4.458000 +127592 2.198000 +127593 4.438000 +127594 4.310000 +127611 2.691000 +127613 3.532000 +127634 4.462000 +127635 4.900000 +127652 5.710000 +127653 6.280000 +127666 5.690000 +127668 2.928000 +127676 1.437000 +127677 3.412000 +127678 3.508000 +127679 3.272000 +127680 3.410000 +127681 4.210000 +127682 4.166000 +127683 3.960000 +127684 3.798000 +127685 3.620000 +127686 4.346000 +127687 4.920000 +127688 5.040000 +127689 4.846000 +127690 4.510000 +127691 4.612000 +127692 2.860000 +127694 3.334000 +127703 4.354000 +127704 4.628000 +127705 4.488000 +127706 4.286000 +127707 4.498000 +127708 5.750000 +127709 5.745000 +127710 5.195000 +127711 6.265000 +127712 6.255000 +127713 5.780000 +127714 6.335000 +127715 5.705000 +127716 6.290000 +127725 3.194000 +127726 3.488000 +127727 3.538000 +127729 4.756000 +127738 2.932000 +127750 1.185000 +127754 3.216000 +127755 4.416000 +127756 3.380000 +127757 3.252000 +127762 3.924000 +127764 4.326000 +127766 3.660000 +127767 5.365000 +127768 3.490000 +127770 3.680000 +127771 3.956000 +127772 6.085000 +127773 4.604000 +127774 4.354000 +127776 6.170000 +127777 4.050000 +127778 3.886000 +127780 4.356000 +127785 5.025000 +127786 5.500000 +127787 5.790000 +127788 5.405000 +127789 2.546000 +127790 4.572000 +127791 5.215000 +127792 4.720000 +127793 3.282000 +127794 3.770000 +127795 5.395000 +127797 5.545000 +127799 3.438000 +127800 4.980000 +127801 3.040000 +127803 2.972000 +127804 3.340000 +127809 4.846000 +127810 4.810000 +127819 2.996000 +127820 3.484000 +127821 2.992000 +127822 3.464000 +127823 3.442000 +127824 3.490000 +127825 3.440000 +127826 3.380000 +127827 3.486000 +127828 3.498000 +127830 3.152000 +127831 4.096000 +127833 4.216000 +127834 0.938000 +127836 4.484000 +127837 4.242000 +127838 4.170000 +127853 3.758000 +127855 4.310000 +127858 4.336000 +127860 4.530000 +127861 4.260000 +127862 4.410000 +127863 4.408000 +127864 4.338000 +127866 4.262000 +127867 3.376000 +127868 3.710000 +127870 3.798000 +127871 0.700000 +127872 3.754000 +127875 3.786000 +127876 4.102000 +127892 5.195000 +127913 0.660000 +127921 5.085000 +127924 4.782000 +127939 4.768000 +127941 3.766000 +127947 5.325000 +127948 2.644000 +127950 5.350000 +127977 1.220000 +127978 0.730000 +127979 0.672000 +127980 0.660000 +127981 1.156000 +127982 0.994000 +127983 0.994000 +127984 0.950000 +127985 1.010000 +127986 1.022000 +127999 6.760000 +128001 7.070000 +128002 7.370000 +128006 3.472000 +128009 4.134000 +128012 3.054000 +128013 4.970000 +128014 3.020000 +128015 3.132000 +128016 5.295000 +128017 3.304000 +128160 2.132000 +128161 1.753000 +128162 2.326000 +128163 5.710000 +128164 5.480000 +128165 5.470000 +128166 5.475000 +128167 5.525000 +128168 1.127000 +128169 5.505000 +128170 5.500000 +128171 5.965000 +128172 5.860000 +128180 0.676000 +128185 0.670000 +128187 5.510000 +128188 5.505000 +128189 5.530000 +128190 5.535000 +128191 5.485000 +128192 5.510000 +128193 5.510000 +128195 5.575000 +128196 5.590000 +128197 5.710000 +128203 5.540000 +128206 5.700000 +128207 5.710000 +128212 5.615000 +128213 5.560000 +128218 1.742000 +128219 3.235000 +128222 3.510000 +128223 4.580000 +128224 3.024000 +128225 0.818000 +128226 3.003400 +128227 3.013000 +128229 3.006600 +128230 3.004400 +128231 3.008400 +128232 3.004600 +128233 0.828000 +128247 4.732000 +128256 5.005000 +128257 4.882000 +128258 1.810000 +128261 4.106000 +128267 4.398000 +128274 1.610000 +128275 1.624000 +128277 3.378000 +128281 3.472000 +128282 3.718000 +128284 3.602000 +128287 2.881000 +128288 4.690000 +128289 3.248000 +128290 2.847000 +128293 4.566000 +128295 3.132000 +128296 3.024000 +128297 4.634000 +128298 4.538000 +128299 4.754000 +128300 4.756000 +128301 4.694000 +128308 3.578000 +128309 4.576000 +128310 4.506000 +128311 3.324000 +128317 1.055000 +128318 0.708000 +128319 1.101000 +128320 1.050000 +128321 1.034000 +128322 1.032000 +128323 1.013000 +128324 1.019000 +128327 1.050000 +128328 1.039000 +128329 0.570000 +128340 3.194000 +128341 3.466000 +128357 3.316000 +128358 2.745000 +128360 4.348000 +128361 4.324000 +128362 3.966000 +128364 4.684000 +128365 3.578000 +128367 5.065000 +128368 2.520000 +128369 3.670000 +128374 4.854000 +128378 4.672000 +128398 5.972000 +128400 6.280000 +128402 6.248000 +128404 5.578000 +128406 6.830000 +128409 5.846000 +128410 6.995000 +128413 7.205000 +128414 7.130000 +128415 7.140000 +128416 7.200000 +128422 3.260000 +128423 3.370000 +128424 3.424000 +128425 3.218000 +128426 4.034000 +128427 3.288000 +128429 3.966000 +128431 2.992000 +128433 2.958000 +128437 2.950000 +128438 3.572000 +128440 4.414000 +128441 2.988000 +128443 3.860000 +128449 0.544000 +128450 5.000000 +128451 3.618000 +128452 2.970000 +128453 2.944000 +128454 2.788000 +128467 5.845000 +128468 5.875000 +128471 5.870000 +128472 5.935000 +128473 5.645000 +128474 4.868000 +128475 5.420000 +128476 4.532000 +128477 4.950000 +128478 4.520000 +128479 4.678000 +128482 4.975000 +128483 5.340000 +128488 2.010000 +128496 5.515000 +128499 5.325000 +128500 5.520000 +128502 5.330000 +128503 5.490000 +128504 3.632000 +128505 5.510000 +128506 4.318000 +128507 5.085000 +128510 5.215000 +128511 3.592000 +128512 5.375000 +128519 4.084000 +128520 5.165000 +128521 3.140000 +128527 5.160000 +128528 3.248000 +128529 1.015000 +128530 5.155000 +128531 1.222000 +128533 4.042000 +128534 5.125000 +128537 5.295000 +128538 5.210000 +128541 5.165000 +128542 5.155000 +128543 3.048000 +128544 5.310000 +128545 3.604000 +128547 3.762000 +128548 3.418000 +128549 5.415000 +128568 5.405000 +128575 6.095000 +128576 6.355000 +128577 6.335000 +128588 4.955000 +128596 4.736000 +128611 2.855000 +128616 2.066500 +128618 2.093500 +128628 1.602000 +128637 4.368000 +128638 4.480000 +128639 4.640000 +128640 3.027000 +128641 3.004200 +128642 3.006200 +128643 3.006400 +128644 3.009400 +128645 1.922000 +128646 3.002600 +128855 2.673000 +128857 2.593000 +128860 1.777000 +128861 2.670000 +128862 2.660000 +128865 4.514000 +128866 4.548000 +128867 3.236000 +128879 0.550000 +128881 0.568000 +128882 0.576000 +128886 0.512000 +128889 0.506000 +128890 2.470000 +128891 3.154000 +128892 2.439000 +128893 2.633000 +128894 2.798000 +128895 4.915000 +128896 4.935000 +128897 6.225000 +128898 5.095000 +128899 5.970000 +128900 2.880000 +128901 6.220000 +128902 2.607000 +128903 5.390000 +128909 3.712000 +128920 0.968000 +128937 4.346000 +128938 4.308000 +128939 4.130000 +128940 3.606000 +128941 3.174000 +128942 6.030000 +128943 6.145000 +128946 4.888000 +128947 3.374000 +128948 3.360000 +128949 3.438000 +128950 3.092000 +128951 6.035000 +128952 2.715000 +128954 6.180000 +128961 6.175000 +128963 6.265000 +128966 4.292000 +128967 3.408000 +128968 4.566000 +128969 5.935000 +128970 5.870000 +128971 4.458000 +128972 4.550000 +128975 1.824000 +128976 3.598000 +128977 5.520000 +128979 3.104000 +128986 4.640000 +128988 5.435000 +128989 5.460000 +128990 5.455000 +128991 5.475000 +128992 5.420000 +128993 5.430000 +128995 5.045000 +128996 5.425000 +128997 5.420000 +128998 5.420000 +128999 5.435000 +129041 5.540000 +129045 5.550000 +129053 1.807000 +129055 5.155000 +129056 2.447000 +129057 5.295000 +129063 4.955000 +129064 4.930000 +129092 0.500000 +129093 0.502000 +129096 2.960000 +129097 6.640000 +129104 3.322000 +129121 0.718000 +129123 5.140000 +129138 5.670000 +129149 4.816000 +129154 3.431000 +129158 0.850000 +129159 0.635000 +129162 4.268000 +129163 5.965000 +129164 3.834000 +129165 4.142000 +129166 3.762000 +129171 5.145000 +129172 5.075000 +129173 5.190000 +129174 0.522000 +129175 5.280000 +129177 5.400000 +129179 5.170000 +129181 5.300000 +129182 6.325000 +129187 2.444000 +129188 2.416000 +129189 5.970000 +129190 5.765000 +129191 4.414000 +129192 4.576000 +129193 5.215000 +129196 5.620000 +129197 3.906000 +129198 5.500000 +129200 5.810000 +129201 5.940000 +129203 4.048000 +129204 5.485000 +129205 4.014000 +129206 5.605000 +129207 2.936000 +129208 3.674000 +129218 5.245000 +129219 0.630000 +129222 0.910000 +129227 3.062000 +129231 3.976000 +129243 3.060000 +129259 2.882000 +129270 2.635000 +129271 6.405000 +129280 3.606000 +129281 2.592000 +129288 4.436000 +129289 3.416000 +129290 4.662000 +129291 3.512000 +129295 1.848000 +129297 4.686000 +129298 1.738000 +129301 1.719000 +129305 2.992000 +129306 1.835000 +129308 3.120000 +129309 2.723000 +129312 2.738000 +129322 5.645000 +129323 5.800000 +129326 5.880000 +129327 5.605000 +129328 5.550000 +129329 5.645000 +129330 5.780000 +129331 5.775000 +129395 5.915000 +129397 5.620000 +129407 5.970000 +129408 6.300000 +129415 4.408000 +129416 4.554000 +129417 3.652000 +129424 3.580000 +129428 2.845000 +129429 6.390000 +129433 2.889000 +129439 3.606000 +129443 0.640000 +129446 4.554000 +129447 5.415000 +129452 2.539000 +129467 0.936000 +129471 0.674000 +129472 0.642000 +129484 2.605000 +129485 2.542000 +129486 2.643000 +129489 3.336000 +129490 3.220000 +129491 3.448000 +129492 5.170000 +129493 5.660000 +129494 4.985000 +129495 4.590000 +129496 5.535000 +129501 2.663000 +129502 6.030000 +129516 6.260000 +129517 5.990000 +129518 5.885000 +129526 6.245000 +129539 3.496000 +129540 4.070000 +129551 2.239500 +129552 2.241500 +129553 2.264500 +129554 2.187000 +129559 5.305000 +129561 5.785000 +129562 4.250000 +129563 5.090000 +129564 3.558000 +129566 2.850000 +129567 4.164000 +129568 4.580000 +129569 5.330000 +129570 5.510000 +129582 4.782000 +129584 5.080000 +129595 0.568000 +129598 0.554000 +129600 0.552000 +129602 2.889000 +129603 2.298000 +129605 1.615000 +129612 2.119000 +129614 1.898000 +129618 2.200000 +129619 2.012000 +129620 2.016000 +129637 6.355000 +129643 5.185000 +129647 5.615000 +129662 3.844000 +129663 3.948000 +129664 3.628000 +129683 3.648000 +129694 4.775000 +129696 3.180000 +129697 3.535000 +129698 3.755000 +129699 3.725000 +129700 2.009000 +129701 2.005000 +129702 2.003800 +129703 2.004800 +129704 2.008400 +129705 2.003800 +129706 2.004800 +129707 2.005800 +129708 3.725000 +129709 2.006200 +129723 3.060000 +129724 4.796000 +129727 5.545000 +129731 5.535000 +129732 5.525000 +129737 0.864000 +129739 3.186000 +129740 5.185000 +129741 4.814000 +129742 4.654000 +129743 2.507000 +129744 3.336000 +129745 5.765000 +129746 2.837000 +129747 3.628000 +129748 3.794000 +129749 3.880000 +129750 4.808000 +129751 1.535000 +129752 5.120000 +129753 1.917000 +129754 4.854000 +129755 3.266000 +129756 1.679000 +129757 2.645000 +129758 2.942000 +129759 1.853000 +129760 5.350000 +129761 5.890000 +129762 2.395000 +129763 2.277000 +129764 4.854000 +129765 5.625000 +129766 5.395000 +129767 4.426000 +129768 2.864000 +129775 0.506000 +129776 0.754000 +129777 3.608000 +129779 1.037000 +129780 2.623000 +129781 2.303000 +129782 3.434000 +129783 2.599000 +129784 3.214000 +129787 3.654000 +129789 3.718000 +129790 1.979000 +129792 1.881000 +129794 1.061000 +129795 1.068000 +129797 3.634000 +129798 3.740000 +129799 1.916000 +129804 5.360000 +129821 3.378000 +129848 1.032000 +129853 0.916000 +129854 0.980000 +129855 0.653000 +129856 0.892000 +129857 0.637000 +129858 0.646000 +129859 0.645000 +129860 1.015000 +129861 0.689000 +129862 1.017000 +129863 0.949000 +129867 2.686000 +129868 2.261000 +129869 3.004500 +129870 2.823500 +129871 3.151000 +129888 3.110000 +129889 3.996000 +129890 4.488000 +129891 5.050000 +129893 5.015000 +129894 5.500000 +129895 5.475000 +129900 4.124000 +129922 4.206000 +129923 4.170000 +129925 1.530000 +129939 3.952000 +129940 4.762000 +129944 4.510000 +129946 1.967000 +129947 3.968000 +129948 3.220000 +129949 3.988000 +129950 3.270000 +129951 3.346000 +129952 3.452000 +129953 2.823000 +129955 3.510000 +129956 3.438000 +129957 3.136000 +129959 3.632000 +129960 2.319000 +129961 2.674000 +129962 2.645000 +129963 4.336000 +129964 1.685000 +129965 2.388000 +129966 3.166000 +129967 2.701000 +129968 2.719000 +129969 3.118000 +129970 4.784000 +129971 3.356000 +129973 3.302000 +129974 3.258000 +129979 2.938000 +129980 2.289000 +129989 5.025000 +129990 5.915000 +129996 3.540000 +129998 4.694000 +129999 3.678000 +130000 5.810000 +130001 5.565000 +130002 5.815000 +130004 5.600000 +130005 5.820000 +130007 5.845000 +130011 4.826000 +130053 2.848000 +130054 3.552000 +130055 3.420000 +130056 3.194000 +130058 2.892000 +130059 2.934000 +130060 2.994000 +130061 4.314000 +130062 4.294000 +130092 5.070000 +130095 4.940000 +130096 2.850000 +130097 4.716000 +130098 4.510000 +130099 4.510000 +130100 4.979000 +130101 4.937000 +130102 4.556000 +130103 4.852000 +130104 4.876000 +130105 4.962000 +130106 4.939000 +130107 4.944500 +130112 4.424000 +130113 4.146000 +130114 4.194000 +130115 4.694000 +130116 4.668000 +130117 4.164000 +130118 4.122000 +130119 4.088000 +130120 4.096000 +130121 4.136000 +130122 4.124000 +130123 4.112000 +130124 4.088000 +130125 4.314000 +130126 4.290000 +130127 4.284000 +130128 4.296000 +130129 4.226000 +130130 4.268000 +130131 4.096000 +130132 4.094000 +130133 4.528000 +130134 4.872000 +130135 4.208000 +130138 6.265000 +130139 3.224000 +130140 3.596000 +130144 5.705000 +130145 5.700000 +130146 3.742000 +130147 5.495000 +130148 5.490000 +130149 4.696000 +130152 5.450000 +130153 5.345000 +130154 5.935000 +130157 3.008800 +130158 2.162000 +130160 1.506200 +130161 1.505200 +130163 1.504000 +130164 1.503400 +130165 1.504800 +130169 1.724000 +130172 2.962000 +130173 2.816000 +130174 3.040000 +130175 2.966000 +130177 4.796000 +130178 4.602000 +130179 4.925000 +130180 4.905000 +130181 4.884000 +130182 4.756000 +130239 0.948000 +130240 0.948000 +130241 0.948000 +130242 0.948000 +130243 0.948000 +130244 0.948000 +130245 0.948000 +130246 0.948000 +130247 0.948000 +130248 0.948000 +130249 0.948000 +130250 0.948000 +130251 0.948000 +130253 0.948000 +130254 0.948000 +130255 0.948000 +130256 0.948000 +130257 0.948000 +130258 0.948000 +130259 0.948000 +130260 0.948000 +130261 0.948000 +130262 0.948000 +130263 0.948000 +130264 0.948000 +130265 0.948000 +130266 0.948000 +130267 0.948000 +130268 0.946000 +130269 0.948000 +130270 0.948000 +130271 0.948000 +130272 0.948000 +130274 0.948000 +130275 0.948000 +130276 0.948000 +130278 0.948000 +130279 0.948000 +130280 0.948000 +130281 0.948000 +130282 0.946000 +130283 0.948000 +130639 0.528000 +130640 0.532000 +130662 2.638000 +130663 3.432000 +130664 3.416000 +130665 3.152000 +130666 0.900000 +130667 1.873000 +130668 1.696000 +130669 2.399000 +130672 2.509000 +130673 4.222000 +130675 4.364000 +130679 5.120000 +130685 3.294000 +130698 4.256000 +130699 3.578000 +130704 5.510000 +130705 0.684000 +130706 5.545000 +130707 5.380000 +130708 5.315000 +130709 5.360000 +130710 5.335000 +130711 4.520000 +130712 5.410000 +130713 5.400000 +130714 5.445000 +130715 5.250000 +130716 3.504000 +130717 3.150000 +130732 0.596000 +130738 3.928000 +130739 2.123000 +130744 5.015000 +130760 1.724000 +130761 6.025000 +130763 5.110000 +130862 0.514000 +130863 0.548000 +130864 1.791000 +130865 4.576000 +130866 5.255000 +130867 1.246000 +130883 1.836000 +130889 4.840000 +130892 5.105000 +130893 5.095000 +130894 5.070000 +130896 5.110000 +130897 5.115000 +130898 2.906000 +130899 3.414000 +130900 3.738000 +130901 3.758000 +130902 3.780000 +130903 0.918000 +130904 1.405000 +130905 3.708000 +130906 3.456000 +130920 2.896000 +130930 3.240000 +130933 3.430000 +130935 4.104000 +131001 4.046000 +131005 3.826000 +131006 3.598000 +131010 0.876000 +131058 5.095000 +131059 5.105000 +131071 4.768000 +131073 4.268000 +131074 0.892000 +131075 0.614000 +131076 0.860000 +131077 4.646000 +131078 4.124000 +131088 4.138000 +131089 4.084000 +131092 4.300000 +131093 4.228000 +131094 3.368000 +131095 0.734000 +131096 3.062000 +131097 3.028000 +131098 3.034000 +131099 5.085000 +131100 3.662000 +131101 1.500000 +131102 4.106000 +131103 4.646000 +131104 3.204000 +131105 3.234000 +131108 1.817000 +131109 3.396000 +131110 1.737000 +131111 1.148000 +131112 5.825000 +131113 3.702000 +131134 4.644000 +131143 4.072000 +131144 4.322000 +131145 2.529000 +131146 2.604000 +131147 2.535000 +131148 5.595000 +131149 6.020000 +131153 3.374000 +131154 1.938000 +131156 1.756000 +131164 2.591000 +131165 0.568000 +131166 0.622000 +131172 4.360000 +131173 4.316000 +131174 4.326000 +131175 4.400000 +131176 4.326000 +131177 4.334000 +131188 2.051000 +131191 4.012000 +131193 3.618000 +131195 2.875000 +131197 3.424000 +131200 2.689000 +131202 3.354000 +131207 4.242000 +131210 3.556000 +131213 5.565000 +131214 4.410000 +131216 4.604000 +131217 4.546000 +131218 4.442000 +131219 0.986000 +131220 4.438000 +131221 4.104000 +131222 4.058000 +131223 4.502000 +131224 3.814000 +131225 3.826000 +131226 3.742000 +131227 5.660000 +131228 3.764000 +131229 5.475000 +131230 5.800000 +131231 5.775000 +131248 1.211000 +131249 1.170000 +131250 2.075000 +131251 3.180000 +131252 3.514000 +131253 3.454000 +131254 3.515000 +131255 3.526500 +131256 3.388000 +131257 2.802500 +131258 2.920500 +131259 2.826000 +131260 2.924000 +131263 4.188000 +131264 4.222000 +131269 3.844000 +131270 3.200000 +131311 3.272000 +131340 4.494000 +131342 2.520000 +131343 2.025000 +131344 4.420000 +131348 4.260000 +131349 3.980000 +131350 4.266000 +131352 4.748000 +131354 4.965000 +131355 1.424000 +131356 3.116000 +131357 2.750000 +131358 2.754000 +131359 3.334000 +131360 4.214000 +131361 4.424000 +131364 5.035000 +131366 3.224000 +131367 5.155000 +131370 3.186000 +131371 5.175000 +131372 5.020000 +131375 1.137000 +131376 5.085000 +131381 5.475000 +131382 5.390000 +131387 5.215000 +131388 5.135000 +131390 5.195000 +131391 5.230000 +131393 5.525000 +131413 5.675000 +131414 4.648000 +131421 5.070000 +131433 4.408000 +131434 1.625000 +131435 4.985000 +131443 2.045000 +131449 5.570000 +131450 5.570000 +131464 2.287000 +131465 3.726000 +131469 1.647000 +131470 5.500000 +131471 3.444000 +131474 2.142000 +131476 5.545000 +131478 3.554000 +131479 3.128000 +131480 3.730000 +131481 5.720000 +131483 1.550000 +131484 5.590000 +131494 4.888000 +131495 2.998000 +131496 4.288000 +131498 5.015000 +131501 5.370000 +131502 4.632000 +131503 4.930000 +131504 5.150000 +131505 3.188000 +131506 2.757000 +131507 4.642000 +131508 5.085000 +131509 4.244000 +131510 4.925000 +131511 3.168000 +131512 4.066000 +131513 4.686000 +131514 5.015000 +131515 4.284000 +131516 4.104000 +131517 4.146000 +131518 4.306000 +131519 5.650000 +131522 5.525000 +131523 3.924000 +131524 3.604000 +131525 4.630000 +131527 3.004000 +131528 4.234000 +131529 2.768000 +131530 3.082000 +131531 4.070000 +131533 1.033000 +131534 1.608000 +131535 3.026400 +131536 3.015000 +131537 3.008000 +131538 3.006200 +131539 3.002800 +131540 3.002400 +131541 3.005200 +131542 1.140000 +131543 3.002400 +131544 3.004200 +131546 3.010600 +131547 0.510000 +131548 0.594000 +131549 3.960000 +131675 0.824000 +131680 0.726000 +131684 0.752000 +131685 0.728000 +131686 0.828000 +131687 0.784000 +131688 0.824000 +131700 1.178000 +131705 2.838000 +131720 2.956000 +131730 4.296000 +131743 3.224000 +131744 3.176000 +131772 5.135000 +131786 2.906000 +131787 2.468000 +131788 4.492000 +131789 1.840000 +131790 2.336000 +131791 2.278000 +131792 2.094000 +131793 2.182000 +131794 1.166000 +131795 1.964000 +131796 2.182000 +131797 2.434000 +131798 2.164000 +131799 2.864000 +131808 0.564000 +131809 3.734000 +131810 5.145000 +131811 3.596000 +131812 3.430000 +131813 2.047000 +131814 2.188000 +131823 5.085000 +131844 6.290000 +131847 5.095000 +131870 4.396000 +131871 3.966000 +131872 4.652000 +131873 4.852000 +131903 1.123000 +131904 5.410000 +131905 5.360000 +131908 5.255000 +131909 5.265000 +131911 5.340000 +131912 4.608000 +131914 4.718000 +131916 4.518000 +131936 4.214000 +131937 3.332000 +131941 3.494000 +131943 4.216000 +131944 5.520000 +131956 3.056000 +131970 4.874000 +131972 4.864000 +131973 4.858000 +131974 4.890000 +131995 5.690000 +131997 4.844000 +131998 0.980000 +131999 5.640000 +132001 5.715000 +132002 5.720000 +132004 4.846000 +132005 5.400000 +132007 2.443000 +132008 3.544000 +132009 5.735000 +132020 3.322000 +132021 3.084000 +132048 4.598000 +132049 6.090000 +132050 6.160000 +132054 5.220000 +132080 2.976000 +132086 2.170000 +132088 2.852000 +132089 3.711000 +132090 2.802000 +132091 2.599000 +132092 2.420000 +132100 5.405000 +132101 5.090000 +132102 4.418000 +132103 5.580000 +132104 4.536000 +132105 3.740000 +132106 3.420000 +132107 3.578000 +132109 3.692000 +132110 3.862000 +132111 3.562000 +132112 5.590000 +132113 3.942000 +132114 3.394000 +132115 4.058000 +132116 4.316000 +132117 4.082000 +132118 4.406000 +132119 3.822000 +132120 3.612000 +132121 3.888000 +132208 5.760000 +132209 6.275000 +132230 3.272000 +132231 3.148000 +132232 3.944000 +132233 6.050000 +132234 5.650000 +132235 5.750000 +132254 4.386000 +132277 2.777000 +132278 4.688000 +132283 1.888000 +132289 2.029000 +132291 1.917000 +132298 4.880000 +132314 5.325000 +132316 3.742000 +132322 1.244000 +132323 1.211000 +132324 0.844000 +132325 4.754000 +132326 1.487000 +132327 5.595000 +132328 5.570000 +132329 4.746000 +132330 3.746000 +132331 3.548000 +132332 3.752000 +132333 3.698000 +132337 4.504000 +132339 0.552000 +132342 0.548000 +132347 1.056000 +132351 5.675000 +132353 0.512000 +132365 1.881000 +132366 2.310000 +132369 2.660000 +132372 5.260000 +132375 4.955000 +132376 1.170000 +132378 1.076000 +132379 3.342000 +132383 3.012000 +132385 5.565000 +132386 1.130000 +132387 1.700000 +132393 2.161000 +132395 4.076000 +132396 4.024000 +132397 4.004000 +132404 1.932000 +132405 4.404000 +132408 2.671000 +132409 2.496000 +132410 4.430000 +132412 0.918000 +132413 0.914000 +132434 5.115000 +132437 6.265000 +132442 0.536000 +132458 2.744000 +132460 2.980000 +132462 5.655000 +132463 5.525000 +132464 5.495000 +132466 3.628000 +132469 5.025000 +132470 4.686000 +132472 3.278000 +132473 4.178000 +132474 4.424000 +132475 3.816000 +132476 4.930000 +132477 2.560000 +132479 3.648000 +132480 3.184000 +132488 3.995000 +132490 1.960000 +132495 1.899000 +132496 2.267000 +132497 2.814000 +132498 3.820000 +132499 3.796000 +132500 4.008000 +132501 1.695000 +132502 1.768000 +132510 5.700000 +132515 5.280000 +132529 0.508000 +132531 0.502000 +132541 4.330000 +132559 5.845000 +132560 5.965000 +132561 4.416000 +132562 5.855000 +132563 5.855000 +132564 5.870000 +132565 3.100000 +132566 5.815000 +132567 5.895000 +132568 5.830000 +132569 5.860000 +132570 5.840000 +132571 5.840000 +132572 5.925000 +132573 5.920000 +132574 5.840000 +132576 5.760000 +132577 5.860000 +132578 5.920000 +132579 5.860000 +132581 3.688000 +132582 5.885000 +132583 5.825000 +132584 5.860000 +132585 5.845000 +132586 2.386000 +132587 2.251000 +132591 5.670000 +132608 3.276000 +132616 5.325000 +132635 1.510000 +132636 1.191000 +132637 1.297000 +132638 1.183000 +132639 1.928000 +132640 3.548000 +132641 1.994000 +132642 2.165000 +132643 0.904000 +132644 1.129000 +132648 4.920000 +132649 2.884000 +132656 1.096000 +132657 2.443000 +132660 4.400000 +132661 4.394000 +132662 4.112000 +132663 4.052000 +132664 4.072000 +132665 4.040000 +132670 2.597000 +132671 2.425000 +132675 1.653000 +132677 4.332000 +132680 4.338000 +132682 3.048000 +132698 4.650000 +132706 1.690000 +132723 5.460000 +132724 3.594000 +132725 5.435000 +132726 5.190000 +132727 3.358000 +132728 5.915000 +132729 5.615000 +132730 5.790000 +132731 5.300000 +132732 5.320000 +132733 5.095000 +132734 5.200000 +132735 2.889000 +132736 1.914000 +132739 5.935000 +132741 5.950000 +132742 5.975000 +132743 6.015000 +132744 3.138000 +132745 3.688000 +132749 5.235000 +132750 3.552000 +132755 6.075000 +132757 6.110000 +132759 6.075000 +132762 6.105000 +132767 5.400000 +132768 5.265000 +132769 5.090000 +132770 5.135000 +132771 5.020000 +132772 5.010000 +132773 5.110000 +132774 5.125000 +132775 5.090000 +132776 4.930000 +132777 5.055000 +132778 4.935000 +132787 4.586000 +132788 5.745000 +132790 5.855000 +132795 2.219000 +132806 2.416000 +132807 3.188000 +132808 3.378000 +132809 2.445000 +132810 2.035000 +132811 3.577000 +132812 2.542000 +132817 2.340000 +132818 2.249800 +132819 2.009000 +132820 2.007000 +132821 1.018000 +132822 1.060000 +132823 2.007400 +132824 2.004800 +132825 2.004800 +132826 2.005600 +132827 2.005400 +132828 2.005200 +132829 2.009400 +132830 2.006400 +132831 2.008000 +132832 2.004400 +132833 1.006000 +132834 2.005200 +132835 2.005800 +132836 2.009600 +132837 2.004800 +132838 2.005600 +132839 1.046000 +132840 2.005600 +132841 2.005400 +132842 2.008800 +132909 5.920000 +132911 2.756000 +132912 4.965000 +132913 1.908000 +132914 3.874000 +132915 4.950000 +132916 4.598000 +132918 4.868000 +132924 3.220000 +132925 4.864000 +132928 4.970000 +132959 6.215000 +132975 3.914000 +132999 5.760000 +133000 0.816000 +133001 0.778000 +133002 0.800000 +133003 0.629500 +133004 0.606500 +133005 0.583500 +133006 0.828500 +133007 0.825500 +133008 0.585000 +133009 0.842500 +133010 0.824000 +133011 0.833500 +133012 0.836000 +133013 0.838000 +133014 0.795500 +133015 0.855500 +133017 0.774500 +133018 1.091000 +133019 1.078000 +133020 0.656000 +133021 0.992500 +133022 1.080000 +133023 1.087000 +133024 1.098000 +133025 0.686000 +133026 1.110000 +133027 0.635500 +133028 0.962500 +133035 6.210000 +133036 6.210000 +133037 6.260000 +133038 5.565000 +133040 6.120000 +133041 6.295000 +133042 3.254000 +133043 6.240000 +133044 6.295000 +133045 6.270000 +133046 6.220000 +133048 6.230000 +133049 6.230000 +133050 3.114000 +133053 6.180000 +133054 6.310000 +133056 6.335000 +133057 6.245000 +133058 5.780000 +133059 3.710000 +133060 5.360000 +133061 6.235000 +133062 6.215000 +133064 5.715000 +133065 5.625000 +133066 5.465000 +133067 5.605000 +133068 5.430000 +133077 5.660000 +133084 1.981000 +133085 1.836000 +133087 6.140000 +133099 0.596000 +133111 6.275000 +133112 1.334000 +133113 2.122000 +133114 1.797000 +133115 2.521000 +133116 2.732000 +133117 2.942000 +133122 2.368000 +133123 2.532000 +133124 2.862000 +133128 2.312000 +133129 2.268000 +133130 3.028000 +133131 1.908000 +133132 2.378000 +133133 2.603000 +133134 2.420000 +133137 5.680000 +133138 4.524000 +133139 2.853000 +133140 2.954000 +133141 2.286000 +133147 2.026000 +133148 2.632000 +133150 2.426000 +133151 2.467500 +133152 2.455000 +133153 2.225500 +133154 2.448000 +133155 2.350500 +133156 2.446000 +133157 2.061500 +133158 2.229000 +133159 2.859000 +133160 2.672000 +133161 3.335000 +133163 4.510000 +133164 4.036000 +133166 4.026000 +133195 4.888000 +133196 3.064000 +133205 5.505000 +133209 6.015000 +133224 1.358000 +133228 3.079000 +133231 3.146000 +133232 5.338000 +133233 4.009000 +133274 2.126000 +133275 2.280000 +133276 3.616000 +133308 3.150000 +133309 3.032000 +133313 3.052000 +133322 2.130000 +133323 2.606000 +133324 3.400000 +133325 2.982000 +133330 2.994000 +133337 5.065000 +133346 1.561000 +133347 1.420000 +133348 1.692000 +133349 1.747000 +133350 1.910000 +133356 5.120000 +133364 5.380000 +133370 2.980000 +133371 1.852000 +133372 1.905000 +133373 1.986000 +133375 4.965000 +133428 3.498000 +133431 0.502000 +133432 3.500000 +133433 4.076000 +133434 4.472000 +133435 4.786000 +133436 4.114000 +133437 4.872000 +133438 5.710000 +133444 1.799000 +133445 4.042000 +133446 5.465000 +133447 5.230000 +133448 5.840000 +133449 3.820000 +133450 4.072000 +133451 4.568000 +133453 4.454000 +133455 4.714000 +133456 4.248000 +133457 3.412000 +133458 2.382000 +133459 3.272000 +133460 3.400000 +133461 4.280000 +133462 6.065000 +133463 2.732000 +133464 3.536000 +133465 3.200000 +133467 4.370000 +133468 3.846000 +133469 3.928000 +133471 4.072000 +133472 3.858000 +133473 3.730000 +133477 4.530000 +133478 4.188000 +133479 3.814000 +133500 4.144000 +133509 4.364000 +133510 4.250000 +133511 2.745000 +133512 6.295000 +133513 3.866000 +133514 6.415000 +133515 3.776000 +133516 3.284000 +133517 3.670000 +133518 2.685000 +133519 3.068000 +133521 3.622000 +133522 3.158000 +133523 3.608000 +133524 4.546000 +133539 4.870000 +133540 4.788000 +133546 5.215000 +133551 5.120000 +133553 3.544000 +133555 2.986000 +133557 5.030000 +133559 2.498000 +133560 2.822000 +133562 4.925000 +133573 5.235000 +133574 4.985000 +133575 4.560000 +133576 4.624000 +133577 4.500000 +133578 4.392000 +133579 4.686000 +133580 4.754000 +133581 5.245000 +133582 4.852000 +133583 3.728000 +133584 5.105000 +133586 1.218000 +133587 5.465000 +133589 5.470000 +133593 5.450000 +133605 5.500000 +133611 5.495000 +133616 5.500000 +133641 5.170000 +133642 3.094000 +133644 3.774000 +133645 3.636000 +133647 6.070000 +133648 2.618000 +133649 2.738000 +133650 6.005000 +133651 2.116000 +133652 6.140000 +133653 4.915000 +133654 6.375000 +133655 6.065000 +133657 6.175000 +133658 4.602000 +133659 5.475000 +133661 2.141000 +133698 2.050000 +133703 2.103000 +133708 3.964000 +133709 3.136000 +133711 5.050000 +133712 5.125000 +133713 5.470000 +133715 5.490000 +133716 5.485000 +133717 5.480000 +133718 5.495000 +133719 5.495000 +133720 5.535000 +133743 3.902000 +133744 4.128000 +133745 4.578000 +133746 4.748000 +133758 1.179000 +133759 4.012000 +133760 5.140000 +133761 5.395000 +133762 5.345000 +133763 5.340000 +133768 4.166000 +133777 4.548000 +133780 5.035000 +133782 3.308000 +133783 3.314000 +133784 4.935000 +133787 5.085000 +133792 3.974000 +133794 1.165000 +133795 3.336000 +133812 3.862000 +133817 4.410000 +133818 4.044000 +133819 4.730000 +133820 3.624000 +133823 3.576000 +133824 4.380000 +133825 4.404000 +133826 4.840000 +133827 3.244000 +133828 5.180000 +133831 5.030000 +133835 4.790000 +133837 2.673000 +133842 5.580000 +133855 5.715000 +133856 5.700000 +133857 5.780000 +133859 5.290000 +133860 5.220000 +133864 5.280000 +133865 3.566000 +133867 5.755000 +133869 2.287000 +133876 5.695000 +133878 4.108000 +133885 4.418000 +133886 4.038000 +133890 0.518000 +133893 4.140000 +133899 5.740000 +133902 2.566000 +133906 4.360000 +133909 7.165000 +133911 3.756000 +133912 4.416000 +133913 2.620000 +133914 4.370000 +133915 5.108000 +133916 5.260000 +133917 4.334000 +133918 4.482000 +133925 4.694000 +133927 5.360000 +133928 5.360000 +133929 5.395000 +133930 5.395000 +133938 5.395000 +133941 5.340000 +133945 5.320000 +133946 5.395000 +133947 5.385000 +133951 4.905000 +133952 5.400000 +133959 3.292000 +133974 0.894000 +133975 0.606000 +133976 0.622000 +133977 0.624000 +133978 1.134000 +133979 1.550000 +133983 5.335000 +133984 2.695000 +133997 1.792000 +133998 2.069000 +133999 2.543000 +134001 5.845000 +134006 2.986000 +134010 6.315000 +134014 5.845000 +134017 6.255000 +134022 1.071000 +134023 6.135000 +134044 0.586000 +134056 4.764000 +134061 4.940000 +134065 5.385000 +134067 5.390000 +134068 5.390000 +134084 5.855000 +134086 4.580000 +134088 5.470000 +134089 3.804000 +134092 3.658000 +134093 5.870000 +134096 5.175000 +134103 5.500000 +134120 4.128000 +134121 3.598000 +134125 2.675000 +134126 4.738000 +134127 4.382000 +134128 4.168000 +134130 4.544000 +134136 3.060000 +134154 5.605000 +134158 2.625000 +134159 6.215000 +134160 6.190000 +134161 1.151000 +134162 5.540000 +134163 1.419000 +134164 6.240000 +134165 6.210000 +134166 6.220000 +134167 6.220000 +134177 4.198000 +134184 1.561000 +134187 2.109000 +134190 4.470000 +134191 4.696000 +134192 4.438000 +134193 4.328000 +134194 4.196000 +134195 4.080000 +134214 6.005000 +134282 2.007400 +134283 2.008400 +134285 2.025600 +134286 2.007400 +134288 2.039400 +134290 2.024600 +134291 2.022000 +134292 2.019400 +134293 2.018600 +134294 2.019600 +134295 2.019400 +134296 2.019000 +134297 2.021000 +134298 2.022800 +134299 2.019000 +134300 2.021000 +134301 2.020200 +134302 2.019000 +134303 2.018600 +134304 2.021200 +134305 4.250000 +134306 5.645000 +134307 5.670000 +134308 5.710000 +134309 5.625000 +134320 3.008000 +134321 3.008400 +134322 3.506000 +134323 3.504000 +134324 3.230000 +134325 3.507400 +134326 2.004600 +134327 2.005200 +134328 0.502000 +134329 2.005400 +134330 2.006400 +134331 0.702000 +134332 1.504000 +134333 1.507200 +134334 1.504800 +134335 1.504800 +134336 1.505200 +134337 2.004000 +134338 1.916600 +134339 2.005200 +134340 2.005200 +134341 2.006200 +134342 1.995800 +134346 6.300000 +134370 3.546000 +134374 3.610000 +134383 1.627000 +134384 4.452000 +134392 0.804000 +134419 5.320000 +134420 5.315000 +134421 5.315000 +134422 5.320000 +134423 5.355000 +134424 5.380000 +134425 5.335000 +134426 5.530000 +134427 5.345000 +134429 5.305000 +134430 5.355000 +134431 5.395000 +134435 1.059000 +134449 4.094000 +134450 2.573000 +134451 5.765000 +134458 3.086000 +134459 5.000000 +134460 5.030000 +134461 3.652000 +134464 5.495000 +134465 5.500000 +134466 5.445000 +134467 5.430000 +134493 4.176000 +134494 4.708000 +134496 5.595000 +134499 4.454000 +134504 3.438000 +134525 0.522000 +134529 0.895000 +134532 4.626000 +134544 5.495000 +134547 4.616000 +134548 4.856000 +134549 5.480000 +134550 5.850000 +134553 5.560000 +134554 6.040000 +134555 5.055000 +134556 4.910000 +134558 4.856000 +134559 2.338000 +135121 2.654000 +135172 5.535000 +135185 1.133000 +135192 3.432000 +135193 3.094000 +135200 0.650000 +135201 0.616000 +135202 0.516000 +135217 5.200000 +135218 3.772000 +135219 0.644000 +135221 3.900000 +135223 4.754000 +135224 5.250000 +135231 1.774000 +135238 2.094000 +135239 3.314000 +135254 3.320000 +135255 1.314000 +135256 1.071000 +135257 0.872000 +135262 1.146000 +135265 1.151000 +135414 4.212000 +135415 5.265000 +135428 5.070000 +135430 4.935000 +135431 4.878000 +135432 4.895000 +135433 4.822000 +135436 1.539000 +135438 3.002000 +135439 2.671000 +135440 4.226000 +135451 5.185000 +135452 3.016000 +135453 3.552000 +135454 4.146000 +135455 5.105000 +135456 5.095000 +135457 5.170000 +135458 5.150000 +135460 1.253000 +135461 1.969000 +135462 1.662000 +135463 2.417000 +135464 3.030000 +135465 2.034000 +135466 4.082000 +135468 5.085000 +135469 3.258000 +135488 5.410000 +135496 3.876000 +135497 3.068000 +135498 5.105000 +135499 4.356000 +135500 4.354000 +135501 1.075000 +135502 0.592000 +135503 0.854000 +135504 0.596000 +135505 0.510000 +135506 0.616000 +135507 0.884000 +135508 3.894000 +135509 3.146000 +135520 4.330000 +135523 4.002000 +135527 3.590000 +135528 3.546000 +135530 4.082000 +135533 3.464000 +135535 3.292000 +135536 3.342000 +135537 3.068000 +135538 3.014000 +135541 5.950000 +135542 0.606000 +135544 5.015000 +135545 0.808000 +135546 4.788000 +135547 1.735000 +135548 1.715000 +135549 1.666000 +135550 1.637000 +135551 3.022000 +135552 3.428000 +135555 2.252000 +135559 5.275000 +135565 4.324000 +135579 2.173000 +135580 3.810000 +135581 2.646000 +135582 3.912000 +135583 4.078000 +135584 4.162000 +135585 3.652000 +135586 0.670000 +135587 0.796000 +135588 0.636000 +135589 2.154000 +135590 0.850000 +135591 1.796000 +135599 4.058000 +135600 4.536000 +135602 4.430000 +135651 0.690000 +135655 0.710000 +135656 0.720000 +135657 0.662000 +135659 0.548000 +135660 0.602000 +135661 1.067000 +135662 1.084000 +135663 1.171000 +135664 3.848000 +135665 0.582000 +135690 1.243000 +135707 4.806000 +135708 4.676000 +135709 4.404000 +135710 4.210000 +135721 5.100000 +135723 4.250000 +135724 5.220000 +135732 5.475000 +135734 3.024000 +135735 2.125000 +135736 1.908000 +135738 2.833000 +135742 5.450000 +135748 4.844000 +135749 4.496000 +135750 2.798000 +135754 2.719000 +135755 2.507000 +135757 2.495000 +135766 4.490000 +135772 2.712000 +135773 3.230000 +135775 2.487000 +135781 3.011600 +135783 2.606000 +135784 3.007000 +135785 2.467000 +135787 3.009600 +135788 2.134000 +135789 1.909000 +135790 3.007200 +135791 3.006800 +135792 3.006000 +135793 3.006000 +135794 2.008200 +135795 3.006600 +135796 3.007600 +135801 3.008000 +135814 4.945000 +135815 4.332000 +135819 1.106000 +135820 0.894500 +135821 0.503000 +135824 0.698000 +135825 0.692500 +135826 0.966500 +135843 3.769000 +135844 2.620000 +135845 2.571000 +135846 2.588000 +135847 2.946000 +135848 2.814000 +135849 3.117000 +135850 3.151000 +135851 4.277000 +135852 5.058000 +135856 0.524000 +135857 0.670000 +135861 5.005000 +135866 4.558000 +135868 3.684000 +135869 4.638000 +135871 1.038000 +135872 0.667500 +135873 0.681000 +135877 0.688500 +135878 0.702000 +135880 0.568000 +135881 0.541000 +135886 3.306000 +135887 3.506000 +135888 3.956000 +135889 3.632000 +135890 3.506000 +135894 1.910000 +135895 4.428000 +135899 3.798000 +135903 4.108000 +135906 5.284000 +135913 5.360000 +135914 4.612000 +135916 4.136000 +135917 5.580000 +135918 3.456000 +135919 4.276000 +135920 3.546000 +135922 4.012000 +135923 3.390000 +135924 4.332000 +135926 4.768000 +135927 2.414000 +135928 4.548000 +135929 5.120000 +135995 3.064000 +135996 3.460000 +135997 3.386000 +135999 3.296000 +136001 5.795000 +136009 5.045000 +136012 4.180000 +136014 3.626000 +136015 3.094000 +136019 5.290000 +136023 2.964000 +136024 1.218000 +136025 1.182000 +136026 2.639000 +136027 2.512000 +136028 2.234000 +136029 2.411000 +136030 1.384000 +136031 2.158000 +136032 1.170000 +136033 1.170000 +136036 2.514000 +136037 5.790000 +136038 3.602000 +136039 3.090000 +136040 2.625000 +136041 2.668000 +136042 2.442000 +136043 2.460000 +136047 5.775000 +136055 5.770000 +136058 1.443000 +136060 5.795000 +136063 1.437000 +136064 1.135000 +136065 1.081000 +136066 1.000000 +136067 5.830000 +136083 0.760000 +136086 5.305000 +136090 1.984000 +136094 4.384000 +136095 0.796000 +136096 2.821000 +136097 5.440000 +136109 0.689500 +136110 0.794000 +136111 0.702000 +136112 0.623000 +136113 0.569000 +136114 0.632000 +136115 1.220000 +136116 0.666500 +136117 0.669500 +136118 0.614000 +136120 0.917500 +136121 0.511000 +136123 0.687000 +136124 0.521000 +136125 0.601500 +136127 0.497500 +136129 0.507000 +136130 0.619000 +136131 0.554000 +136132 0.590000 +136133 0.638000 +136157 3.199800 +136158 4.368000 +136159 3.700000 +136160 3.748000 +136162 3.014800 +136163 3.015400 +136164 3.014600 +136165 3.010400 +136166 0.534000 +136167 0.592000 +136168 0.732000 +136169 2.104000 +136170 3.009800 +136172 1.620000 +136173 3.009600 +136174 3.010600 +136180 3.010000 +136181 3.015200 +136185 6.285000 +136191 3.390000 +136217 4.878000 +136218 5.565000 +136219 5.600000 +136220 5.375000 +136221 5.385000 +136223 5.280000 +136225 5.295000 +136226 4.250000 +136227 3.658000 +136228 4.098000 +136229 3.970000 +136230 4.004000 +136231 3.344000 +136232 2.681000 +136233 5.350000 +136234 5.555000 +136235 3.756000 +136236 3.728000 +136237 3.954000 +136238 3.540000 +136239 4.764000 +136240 3.524000 +136241 2.704000 +136242 2.859000 +136243 3.320000 +136244 3.576000 +136245 5.115000 +136251 2.275000 +136252 3.412000 +136253 3.896000 +136254 4.240000 +136255 4.440000 +136256 4.274000 +136257 4.202000 +136258 4.252000 +136259 4.400000 +136260 4.664000 +136261 4.682000 +136262 4.618000 +136263 4.864000 +136264 4.356000 +136265 4.614000 +136266 4.636000 +136267 4.584000 +136268 4.866000 +136269 4.880000 +136270 4.960000 +136271 4.866000 +136272 4.390000 +136273 4.740000 +136274 3.602000 +136275 3.530000 +136276 3.648000 +136277 4.474000 +136278 5.480000 +136281 1.451000 +136282 1.700000 +136283 5.206000 +136284 5.394000 +136285 5.206000 +136286 5.292000 +136287 4.802000 +136289 3.108000 +136290 2.185000 +136291 3.990000 +136292 3.158000 +136293 2.932000 +136294 3.144000 +136295 2.255000 +136296 4.372000 +136297 3.500000 +136304 6.170000 +136308 4.048000 +136309 4.352000 +136319 1.878000 +136324 3.966000 +136325 4.214000 +136328 1.720000 +136329 5.216000 +136330 0.604000 +136331 5.040000 +136335 6.100000 +136336 5.905000 +136337 6.110000 +136339 2.742000 +136340 3.068000 +136341 2.219000 +136342 2.665000 +136344 4.598000 +136346 2.508000 +136347 6.120000 +136348 6.055000 +136451 4.328000 +136453 2.277000 +136454 1.314000 +136457 2.517000 +136458 3.360000 +136460 4.048000 +136462 1.775000 +136463 3.134000 +136477 3.288000 +136478 3.060000 +136481 5.240000 +136482 3.300000 +136483 5.265000 +136484 5.265000 +136485 5.285000 +136486 1.570000 +136487 4.832000 +136488 5.320000 +136489 5.335000 +136492 5.430000 +136493 5.115000 +136494 5.425000 +136495 5.430000 +136496 5.115000 +136497 3.062000 +136498 5.160000 +136499 3.154000 +136500 3.154000 +136502 3.118000 +136509 5.010000 +136527 5.220000 +136529 5.435000 +136542 5.415000 +136543 1.246000 +136545 1.634000 +136547 1.493000 +136548 4.310000 +136549 5.135000 +136552 3.900000 +136554 3.566000 +136559 4.674000 +136560 4.134000 +136561 5.420000 +136562 4.446000 +136564 4.985000 +136579 5.090000 +136582 5.290000 +136583 5.230000 +136584 5.005000 +136585 5.335000 +136586 5.310000 +136588 5.270000 +136589 5.320000 +136590 2.863000 +136591 5.120000 +136592 1.766000 +136596 1.101000 +136598 2.482000 +136599 2.948000 +136613 1.719800 +136614 1.750000 +136615 1.759400 +136616 1.744400 +136617 1.761800 +136618 0.819000 +136619 1.380000 +136620 1.759200 +136621 0.963000 +136622 1.749000 +136623 1.765200 +136624 1.728600 +136625 1.760400 +136626 1.761000 +136627 1.757600 +136628 1.755600 +136629 1.731200 +136630 1.727600 +136631 1.778000 +136632 1.733200 +136633 1.731200 +136634 1.735400 +136635 1.733400 +136636 1.730800 +136637 1.725000 +136638 1.724800 +136639 1.724400 +136640 1.729600 +136641 1.719400 +136642 1.731000 +136643 1.732600 +136644 1.726200 +136645 1.719000 +136646 1.717600 +136647 1.717200 +136666 5.455000 +136667 5.505000 +136668 5.485000 +136674 5.535000 +136681 5.535000 +136682 5.540000 +136684 5.535000 +136685 5.480000 +136687 3.674000 +136695 4.888000 +136696 4.980000 +136699 0.750000 +136712 0.546000 +136716 4.390000 +136718 3.904000 +136719 4.722000 +136720 4.664000 +136721 4.658000 +136725 5.345000 +136727 5.365000 +136734 3.722000 +136737 1.504000 +136738 3.880000 +136747 2.940000 +136748 4.988000 +136750 2.462000 +136751 4.350000 +136752 4.332000 +136753 4.338000 +136754 4.642000 +136756 4.118000 +136760 4.456000 +136763 4.108000 +136765 4.436000 +136767 4.244000 +136772 4.014000 +136773 4.462000 +136776 4.624000 +136777 4.622000 +136778 5.780000 +136779 4.570000 +136780 3.536000 +136814 4.876000 +136816 5.945000 +136817 6.055000 +136819 5.940000 +136820 5.865000 +136821 4.628000 +136822 4.718000 +136828 5.360000 +136837 3.408000 +136841 4.320000 +136863 0.924000 +136864 1.003000 +136865 1.123000 +136866 1.400000 +136867 1.413000 +136868 1.415000 +136873 4.744000 +136876 3.250000 +136878 5.400000 +136880 5.410000 +136881 5.785000 +136882 1.511000 +136883 1.421000 +136884 2.200000 +136885 4.704000 +136886 5.400000 +136897 4.842000 +136906 5.305000 +136911 5.930000 +136912 6.000000 +136913 5.900000 +136914 5.905000 +136915 6.025000 +136916 5.885000 +136917 5.875000 +136918 5.880000 +136919 5.360000 +136920 5.950000 +136922 4.394000 +136945 5.235000 +136946 5.255000 +136947 5.255000 +136950 5.295000 +136951 5.295000 +136952 5.300000 +136953 5.305000 +136954 5.300000 +136955 5.285000 +136956 5.310000 +136957 5.300000 +136998 5.045000 +136999 5.005000 +137111 5.460000 +137113 2.910000 +137114 2.976000 +137115 3.370000 +137116 3.602000 +137120 3.608000 +137121 3.734000 +137123 3.224000 +137124 3.464000 +137125 0.844000 +137127 5.470000 +137128 0.852000 +137129 4.018000 +137132 1.074000 +137173 2.928000 +137175 5.455000 +137178 5.120000 +137182 4.062000 +137183 5.125000 +137184 4.724000 +137186 2.436000 +137187 5.105000 +137188 5.115000 +137195 1.965000 +137196 5.425000 +137198 5.100000 +137203 3.354000 +137204 4.554000 +137205 4.044000 +137206 4.800000 +137208 3.112000 +137209 3.444000 +137210 4.568000 +137211 4.398000 +137212 3.276000 +137213 3.372000 +137214 2.874000 +137215 4.618000 +137216 4.554000 +137217 2.876000 +137218 3.658000 +137219 3.626000 +137220 4.458000 +137222 4.030000 +137223 2.604000 +137230 4.336000 +137232 4.274000 +137233 4.636000 +137234 4.244000 +137257 5.245000 +137258 3.942000 +137259 2.607000 +137260 4.965000 +137263 4.106000 +137264 3.526000 +137265 5.145000 +137267 5.115000 +137282 5.400000 +137284 3.646000 +137287 5.400000 +137297 3.928000 +137298 4.038000 +137305 4.688000 +137363 4.334000 +137367 3.908000 +137368 2.072000 +137379 4.428000 +137399 4.552000 +137438 3.884000 +137448 0.599800 +137449 0.982000 +137479 6.060000 +137507 4.822000 +137508 4.822000 +137517 1.665000 +137523 1.165000 +137525 1.414000 +137526 1.460000 +137527 1.171000 +137528 1.121000 +137540 5.315000 +137569 3.222000 +137580 2.607000 +137582 0.636000 +137584 0.934000 +137585 3.308000 +137586 2.037000 +137600 2.003000 +137601 2.002800 +137602 2.004200 +137603 2.003000 +137604 2.004600 +137605 2.004000 +137606 2.002800 +137607 2.003600 +137608 2.004200 +137609 2.003200 +137610 2.004000 +137611 2.003000 +137612 2.004200 +137613 2.004200 +137614 2.004000 +137615 2.004200 +137616 2.004200 +137617 2.004600 +137618 2.003000 +137619 2.004200 +137620 2.003800 +137621 2.003800 +137622 0.649000 +137623 2.004000 +137624 2.003600 +137625 2.004200 +137865 4.890000 +137866 5.115000 +137869 4.888000 +137870 4.832000 +137871 4.844000 +137872 4.910000 +137873 4.930000 +137874 4.910000 +137875 4.945000 +137876 4.930000 +137877 4.945000 +137879 6.020000 +137882 5.205000 +137883 0.996000 +137884 4.774000 +137885 4.792000 +137886 4.174000 +137887 5.010000 +137888 4.985000 +137898 5.210000 +137900 5.390000 +137901 5.360000 +137912 5.310000 +137919 5.390000 +137920 5.315000 +137921 5.375000 +137922 5.370000 +137923 5.355000 +137924 5.360000 +137944 3.758000 +137946 3.902000 +137947 5.395000 +137948 5.385000 +137949 5.395000 +137952 5.290000 +137958 0.528000 +137960 4.820000 +137964 0.910000 +137966 2.026000 +137967 2.002000 +137968 2.002000 +137969 2.004000 +137970 2.001000 +137974 3.242000 +137975 2.984000 +137977 2.612000 +137978 2.908000 +137979 4.174000 +137980 5.840000 +137981 3.902000 +137982 2.998000 +137983 5.505000 +137984 3.304000 +137985 3.162000 +137986 5.360000 +137987 2.159000 +137988 2.924000 +137989 2.865000 +137990 1.800000 +137991 2.393000 +137992 1.798000 +137993 2.896000 +138000 5.995000 +138001 3.280000 +138002 6.195000 +138003 6.240000 +138004 5.375000 +138005 1.966000 +138006 4.950000 +138007 4.380000 +138008 6.200000 +138009 1.759000 +138010 5.660000 +138012 2.046000 +138013 2.946000 +138017 2.663000 +138019 2.589000 +138024 4.935000 +138027 4.812000 +138028 5.140000 +138029 5.015000 +138032 4.864000 +138033 4.736000 +138048 5.140000 +138106 4.418000 +138107 4.486000 +138108 4.086000 +138109 4.112000 +138110 5.065000 +138111 1.006000 +138112 4.220000 +138113 1.684000 +138114 5.020000 +138115 2.178000 +138116 2.778000 +138117 3.780000 +138118 3.506000 +138119 2.786000 +138120 5.180000 +138121 2.714000 +138122 2.581000 +138123 3.350000 +138124 4.570000 +138125 1.945000 +138126 2.061000 +138134 5.156000 +138139 4.280000 +138145 1.944000 +138148 5.074000 +138149 2.468000 +138150 2.060000 +138155 1.706000 +138156 0.622000 +138157 1.872000 +138158 0.696000 +138163 0.622000 +138164 2.003000 +138165 2.002600 +138166 2.004200 +138167 0.772000 +138168 0.744000 +138169 2.004200 +138170 2.003800 +138171 2.003800 +138172 2.004000 +138173 0.744000 +138174 2.002800 +138175 2.004000 +138176 2.002800 +138177 2.003400 +138178 2.004000 +138179 2.002800 +138180 2.003200 +138181 2.003000 +138182 2.003200 +138183 2.003200 +138195 3.014800 +138196 3.031600 +138197 3.006600 +138198 0.760000 +138202 0.764000 +138204 3.004200 +138205 3.220000 +138206 3.009800 +138207 3.003200 +138208 3.003800 +138209 3.189800 +138210 3.036600 +138212 2.998600 +138213 3.000200 +138217 4.360000 +138218 3.196000 +138224 3.832000 +138231 4.742000 +138232 4.562000 +138233 4.534000 +138238 4.010000 +138248 0.958000 +138249 3.400000 +138250 1.907000 +138251 1.824000 +138252 1.745000 +138253 1.579000 +138254 2.684000 +138255 1.969000 +138256 4.636000 +138259 4.326000 +138260 3.586000 +138261 2.928000 +138262 3.074000 +138263 3.114000 +138264 3.472000 +138265 2.922000 +138266 4.086000 +138267 4.420000 +138268 3.222000 +138269 2.567000 +138304 0.572000 +138306 3.746000 +138316 3.242000 +138331 4.000000 +138339 5.485000 +138346 4.486000 +138347 5.215000 +138348 3.706000 +138349 5.215000 +138350 4.634000 +138351 5.205000 +138352 5.970000 +138353 3.814000 +138354 4.690000 +138355 2.731000 +138356 4.486000 +138357 4.622000 +138361 4.200000 +138365 4.352000 +138373 2.696000 +138375 2.335000 +138376 2.116000 +138377 3.554000 +138378 5.090000 +138379 1.882000 +138388 3.820000 +138393 1.394000 +138398 3.742000 +138399 3.728000 +138401 4.772000 +138410 2.826000 +138412 0.534000 +138413 0.624000 +138414 0.626000 +138415 0.514000 +138416 0.508000 +138417 0.546000 +138418 0.556000 +138420 0.560000 +138421 0.528000 +138422 0.520000 +138423 0.594000 +138424 0.594000 +138425 0.534000 +138430 5.265000 +138433 5.790000 +138435 5.565000 +138436 2.787000 +138437 5.585000 +138438 1.188000 +138439 5.510000 +138440 2.970000 +138441 5.515000 +138442 3.186000 +138443 5.495000 +138444 2.061000 +138445 3.410000 +138446 5.655000 +138447 4.332000 +138448 5.685000 +138449 5.655000 +138450 5.695000 +138451 4.810000 +138452 2.801000 +138453 5.575000 +138465 5.785000 +138466 5.225000 +138467 5.525000 +138468 5.165000 +138469 5.165000 +138470 4.734000 +138471 5.425000 +138472 5.805000 +138473 5.820000 +138474 5.875000 +138478 5.840000 +138479 5.845000 +138483 1.916000 +138486 1.642000 +138501 3.021800 +138505 3.025000 +138506 1.092000 +138508 1.801000 +138509 3.215000 +138510 0.600000 +138511 0.714000 +138514 1.115000 +138517 2.002000 +138518 2.004000 +138519 2.004600 +138520 2.580000 +138521 2.004000 +138522 2.003000 +138523 1.503800 +138524 1.503600 +138525 1.503000 +138530 4.810000 +138534 2.361000 +138537 5.380000 +138540 6.255000 +138541 6.045000 +138544 6.300000 +138545 5.915000 +138546 6.320000 +138547 2.301000 +138549 1.350000 +138550 2.450000 +138552 3.966000 +138553 4.610000 +138554 5.405000 +138555 2.509000 +138556 4.146000 +138557 6.275000 +138558 4.456000 +138559 3.100000 +138560 5.405000 +138564 3.244000 +138566 5.370000 +138568 5.370000 +138571 5.400000 +138574 5.395000 +138576 5.390000 +138577 5.380000 +138586 4.462000 +138591 5.040000 +138593 4.516000 +138597 0.798000 +138598 4.538000 +138599 3.896000 +138600 3.468000 +138602 3.576000 +138603 3.924000 +138604 4.802000 +138605 3.674000 +138607 4.048000 +138608 3.540000 +138610 3.442000 +138612 4.038000 +138617 4.286000 +138619 5.325000 +138640 1.192000 +138643 3.030000 +138644 2.037000 +138646 2.025600 +138647 2.747000 +138649 2.014600 +138650 4.312000 +138652 3.350000 +138653 3.128000 +138654 3.798000 +138655 3.854000 +138659 4.562000 +138660 1.128000 +138666 1.683000 +138667 1.816000 +138668 2.864000 +138669 2.259000 +138670 1.796000 +138671 4.614000 +138672 4.522000 +138674 4.542000 +138679 4.810000 +138680 4.816000 +138683 4.704000 +138684 4.838000 +138685 5.218000 +138686 4.816000 +138687 4.930000 +138695 3.982000 +138696 0.554000 +138697 5.635000 +138700 1.597000 +138701 1.856000 +138702 4.935000 +138704 5.475000 +138710 4.094000 +138711 2.040000 +138715 4.222000 +138722 4.200000 +138723 4.114000 +138724 4.895000 +138727 1.578000 +138728 1.173000 +138729 1.190000 +138731 1.407000 +138733 0.598000 +138743 0.648000 +138744 0.960000 +138747 2.889000 +138748 2.555000 +138749 3.248000 +138750 3.090000 +138752 4.204000 +138755 5.085000 +138762 5.360000 +138764 3.702000 +138765 2.970000 +138766 2.922000 +138770 5.570000 +138775 3.558000 +138776 3.150000 +138777 2.840000 +138782 5.485000 +138785 1.689000 +138787 5.580000 +138788 5.090000 +138790 4.504000 +138791 3.104000 +138793 1.934000 +138794 1.854000 +138800 4.224000 +138801 4.712000 +138802 4.740000 +138803 4.672000 +138804 2.033000 +138805 2.118000 +138806 2.756000 +138807 2.377000 +138808 2.704000 +138810 2.978000 +138811 5.142000 +138814 1.140000 +138815 5.774000 +138816 2.812000 +138817 2.256000 +138818 2.022000 +138822 4.728000 +138824 2.474000 +138825 5.266000 +138826 2.360000 +139296 4.804000 +139297 4.106000 +139298 4.524000 +139299 5.690000 +139300 5.455000 +139302 5.485000 +139307 5.465000 +139308 0.510000 +139309 5.565000 +139310 5.555000 +139311 5.530000 +139317 3.918000 +139318 3.684000 +139319 2.234000 +139320 5.695000 +139353 5.035000 +139354 5.005000 +139355 5.065000 +139378 5.215000 +139382 1.991000 +139385 4.188000 +139386 5.275000 +139388 5.295000 +139389 2.223000 +139401 5.160000 +139402 4.434000 +139405 5.300000 +139408 2.604000 +139410 5.285000 +139411 5.285000 +139413 2.274000 +139436 1.939000 +139438 5.145000 +139439 4.544000 +139442 3.230000 +139443 4.392000 +139444 3.480000 +139445 3.968000 +139448 5.140000 +139449 3.676000 +139450 5.095000 +139451 5.175000 +139453 4.995000 +139459 4.622000 +139463 1.983000 +139470 0.544000 +139471 4.786000 +139497 5.540000 +139512 1.979000 +139513 3.308000 +139514 3.688000 +139515 5.035000 +139516 3.940000 +139517 3.342000 +139518 3.556000 +139519 4.542000 +139520 3.612000 +139521 2.638000 +139522 4.840000 +139523 3.582000 +139524 2.626000 +139525 3.500000 +139526 2.253000 +139527 2.055000 +139528 2.231000 +139530 3.990000 +139531 4.124000 +139532 4.658000 +139533 2.819000 +139534 4.106000 +139535 5.030000 +139536 4.670000 +139537 5.240000 +139538 5.005000 +139545 3.908000 +139546 4.356000 +139547 4.046000 +139548 3.548000 +139550 0.916000 +139551 4.234000 +139552 1.891000 +139553 3.332000 +139554 3.808000 +139555 2.904000 +139556 1.927000 +139557 3.710000 +139558 3.570000 +139559 3.594000 +139560 5.205000 +139563 3.690000 +139566 1.907000 +139567 1.660000 +139568 3.746000 +139571 3.500000 +139572 3.114000 +139573 2.789000 +139584 4.930000 +139585 5.130000 +139586 5.320000 +139587 4.006000 +139590 6.170000 +139591 5.205000 +139592 3.968000 +139593 6.405000 +139594 5.750000 +139595 5.975000 +139596 5.505000 +139597 5.945000 +139598 4.068000 +139599 4.566000 +139608 5.130000 +139610 2.559000 +139612 0.908000 +139613 2.371000 +139623 3.730000 +139624 2.017600 +139627 3.464000 +139628 3.370000 +139629 2.005400 +139630 3.476000 +139631 2.011200 +139632 3.944000 +139633 1.812000 +139634 3.944000 +139637 4.020000 +139638 2.008000 +139639 2.010400 +139660 5.460000 +139672 2.823000 +139681 5.580000 +139687 0.912000 +139694 2.541000 +139696 5.975000 +139697 5.840000 +139698 5.855000 +139699 5.840000 +139700 5.850000 +139701 5.850000 +139704 1.897000 +139705 2.116000 +139706 5.945000 +139709 5.810000 +139710 6.195000 +139712 5.940000 +139713 5.945000 +139717 6.195000 +139726 2.556000 +139727 2.570000 +139729 1.768000 +139730 5.310000 +139731 5.580000 +139732 5.585000 +139733 2.151000 +139734 5.640000 +139736 5.825000 +139737 5.885000 +139739 5.810000 +139741 5.735000 +139742 5.695000 +139743 4.026000 +139746 5.580000 +139759 3.112000 +139762 5.915000 +139763 1.643000 +139765 2.636000 +139766 3.600000 +139767 3.316000 +139770 5.655000 +139771 3.878000 +139774 4.756000 +139775 5.825000 +139776 4.980000 +139778 5.825000 +139779 3.966000 +139780 5.870000 +139781 5.580000 +139782 2.488000 +139786 5.835000 +139787 5.525000 +139803 1.537000 +139805 3.070000 +139806 5.100000 +139807 1.515000 +139808 1.898000 +139809 1.580000 +139810 1.896000 +139811 3.914000 +139812 3.008000 +139813 1.795000 +139814 1.699000 +139815 1.684000 +139818 4.652000 +139819 2.077000 +139820 5.105000 +139821 5.505000 +139822 6.110000 +139823 4.524000 +139824 2.410000 +139825 1.426000 +139826 1.576000 +139827 3.268000 +139828 2.730000 +139829 2.289000 +139830 2.603000 +139831 2.324000 +139832 1.024000 +139870 0.524000 +139871 5.180000 +139873 4.390000 +139874 3.988000 +139875 2.450000 +139886 5.200000 +139888 3.816000 +139889 3.764000 +139892 1.723000 +139903 0.666000 +139913 5.425000 +139914 4.666000 +139927 5.650000 +139932 5.455000 +139933 5.490000 +139934 5.540000 +139935 5.590000 +139936 5.495000 +139937 5.585000 +139941 5.525000 +139942 5.565000 +139946 5.475000 +139947 5.375000 +139948 5.510000 +139949 5.470000 +139951 2.407000 +139952 1.568000 +139954 5.125000 +139956 5.465000 +139959 5.620000 +139960 5.470000 +139961 6.090000 +139962 6.060000 +139963 5.630000 +139964 6.035000 +139965 5.540000 +139966 5.145000 +139967 5.415000 +139969 6.045000 +139975 1.834000 +139976 3.500000 +139977 4.930000 +139978 5.155000 +139979 4.880000 +139980 5.155000 +139981 4.882000 +139982 5.265000 +139986 4.706000 +139987 4.860000 +139988 4.935000 +139989 4.985000 +139990 4.562000 +139992 4.995000 +139993 3.308000 +139994 4.520000 +139996 2.459000 +140004 4.442000 +140005 4.810000 +140006 4.560000 +140007 4.476000 +140008 4.030000 +140009 5.230000 +140010 3.480000 +140011 2.779000 +140021 2.972000 +140022 3.872000 +140023 5.025000 +140024 3.918000 +140025 3.578000 +140026 3.012000 +140027 2.875000 +140028 3.998000 +140042 4.818000 +140043 3.822000 +140044 4.682000 +140046 4.410000 +140047 4.874000 +140051 5.750000 +140054 1.048000 +140055 5.655000 +140057 5.420000 +140058 3.590000 +140062 2.426000 +140079 4.074000 +140080 0.924000 +140081 0.966000 +140085 8.050000 +140088 8.045000 +140091 8.030000 +140098 3.862000 +140100 4.100000 +140101 4.014000 +140103 5.290000 +140104 5.070000 +140106 7.045000 +140107 7.050000 +140108 7.045000 +140109 7.090000 +140110 7.060000 +140115 7.035000 +140118 3.558000 +140119 3.892000 +140121 3.474000 +140123 1.476000 +140124 5.665000 +140125 1.446000 +140126 2.871000 +140127 2.926000 +140128 5.685000 +140130 5.765000 +140131 5.715000 +140132 4.228000 +140133 5.550000 +140139 4.402000 +140140 3.376000 +140143 4.660000 +140147 6.130000 +140148 6.170000 +140149 5.390000 +140152 5.205000 +140155 6.220000 +140157 6.170000 +140158 5.390000 +140159 3.910000 +140160 0.956000 +140161 5.695000 +140164 1.355000 +140167 4.874000 +140168 3.740000 +140171 5.185000 +140172 5.195000 +140173 5.695000 +140174 5.515000 +140176 5.535000 +140177 3.298000 +140186 4.368000 +140190 6.070000 +140194 4.300000 +140197 6.020000 +140201 5.375000 +140206 4.388000 +140207 4.540000 +140208 4.458000 +140212 5.365000 +140213 5.400000 +140217 4.114000 +140218 3.102000 +140231 5.550000 +140232 4.148000 +140233 2.303000 +140234 2.353000 +140237 3.970000 +140238 3.384000 +140239 3.068000 +140240 6.330000 +140243 3.910000 +140244 4.292000 +140245 2.841000 +140246 2.095000 +140247 1.660000 +140248 1.548000 +140249 1.227000 +140250 1.697000 +140251 4.698000 +140252 4.496000 +140253 2.968000 +140254 3.098000 +140255 2.436000 +140256 2.024000 +140257 1.815000 +140258 2.348000 +140259 3.060000 +140260 3.132000 +140261 3.424000 +140262 4.300000 +140263 4.326000 +140266 4.740000 +140267 4.002000 +140268 3.916000 +140269 4.614000 +140270 4.530000 +140271 3.868000 +140272 4.784000 +140275 2.405000 +140276 4.276000 +140277 3.548000 +140278 3.414000 +140279 3.762000 +140280 3.496000 +140282 2.581000 +140283 3.658000 +140284 4.472000 +140285 2.821000 +140286 2.572000 +140287 2.583000 +140288 2.972000 +140289 2.622000 +140290 1.678000 +140291 2.019000 +140292 2.575000 +140293 2.333000 +140294 4.792000 +140295 5.515000 +140296 5.360000 +140297 5.440000 +140298 5.400000 +140299 5.260000 +140330 2.990000 +140332 3.794000 +140333 5.456000 +140334 1.712000 +140335 1.700000 +140336 1.690000 +140341 2.768000 +140370 6.490000 +140371 6.484000 +140373 6.244000 +140380 1.088000 +140382 2.376000 +140385 3.138000 +140387 4.540000 +140395 4.230000 +140397 5.176000 +140399 5.210000 +140402 5.062000 +140403 4.478000 +140410 3.504000 +140425 6.055000 +140426 5.385000 +140439 5.990000 +140440 4.392000 +140444 5.955000 +140447 5.395000 +140459 5.295000 +140460 2.821000 +140461 1.469000 +140462 2.773000 +140463 1.507000 +140464 0.964000 +140466 3.256000 +140467 3.446000 +140468 3.672000 +140470 6.265000 +140472 6.390000 +140473 0.734000 +140474 0.924000 +140476 3.864000 +140505 5.755000 +140516 5.265000 +140517 5.255000 +140533 5.155000 +140546 0.589500 +140547 0.780500 +140548 0.777000 +140549 0.576000 +140550 0.587500 +140551 0.690500 +140552 0.785500 +140553 0.755000 +140554 0.785000 +140555 0.586000 +140556 0.628500 +140557 0.790500 +140558 0.849000 +140564 2.006600 +140565 2.006200 +140566 2.006600 +140567 2.005400 +140568 2.006200 +140569 1.726000 +140570 1.662000 +140571 2.004400 +140572 2.060200 +140573 2.004800 +140574 2.004800 +140575 2.004200 +140576 2.004600 +140577 2.065600 +140578 2.003600 +140579 2.004800 +140580 2.005200 +140581 2.005000 +140582 2.004400 +140583 2.004600 +140584 2.004800 +140586 2.005600 +140587 2.004600 +140588 2.004600 +140589 2.004800 +140595 4.836000 +140620 5.405000 +140621 5.405000 +140622 5.410000 +140623 5.405000 +140624 5.405000 +140625 5.410000 +140626 5.405000 +140640 4.744000 +140642 3.414000 +140644 4.214000 +140645 3.554000 +140646 3.760000 +140647 1.380000 +140649 4.812000 +140650 1.388000 +140652 4.000000 +140653 1.909000 +140658 5.220000 +140660 4.844000 +140664 5.640000 +140666 1.910000 +140670 5.385000 +140671 5.385000 +140672 5.385000 +140681 3.406000 +140694 3.416000 +140706 1.599000 +140711 3.032000 +140716 3.428000 +140728 0.696000 +140732 4.384000 +140733 3.458000 +140734 6.435000 +140735 3.200000 +140737 3.464000 +140739 6.325000 +140740 5.250000 +140741 5.105000 +140742 0.662000 +140748 6.065000 +140755 6.055000 +140762 4.022000 +140763 6.195000 +140764 2.543000 +140765 1.427000 +140766 3.190000 +140767 4.814000 +140768 4.802000 +140769 3.670000 +140770 2.459000 +140771 3.286000 +140772 4.434000 +140773 6.170000 +140774 4.604000 +140775 4.112000 +140776 2.644000 +140777 5.435000 +140778 2.790000 +140779 4.354000 +140780 4.362000 +140781 4.478000 +140782 2.389000 +140783 2.608000 +140784 2.958000 +140785 3.472000 +140786 3.768000 +140787 3.436000 +140788 3.922000 +140789 2.222000 +140790 4.340000 +140791 1.334000 +140792 4.860000 +140793 2.702000 +140794 5.310000 +140795 3.302000 +140796 2.752000 +140797 2.804000 +140798 3.084000 +140799 2.898000 +140800 2.040000 +140861 5.454000 +140863 5.170000 +140865 5.484000 +140867 5.296000 +140896 4.700000 +140898 4.152000 +140919 5.945000 +140921 5.085000 +140922 4.360000 +140923 4.438000 +140925 3.952000 +140926 6.390000 +140928 5.740000 +140930 5.295000 +140942 3.790000 +140943 3.250000 +140945 4.076000 +140947 4.146000 +140948 4.624000 +140949 3.040000 +140950 3.770000 +140951 2.306000 +140953 5.315000 +140955 4.314000 +140956 3.916000 +140957 3.082000 +140958 3.868000 +140959 4.482000 +140960 4.028000 +140961 3.572000 +140962 4.042000 +140963 2.074000 +140964 3.404000 +140965 3.524000 +140966 4.975000 +140967 3.394000 +140968 4.414000 +140969 3.332000 +140975 0.846000 +140976 1.172000 +140977 1.419000 +140978 2.906000 +140979 3.944000 +140980 4.428000 +140981 0.802000 +140982 2.605000 +140983 2.550000 +140984 1.946000 +140985 2.958000 +140986 2.012000 +140988 2.883000 +140989 3.940000 +140990 0.526000 +140991 0.588000 +140992 0.692000 +140993 0.760000 +140994 4.448000 +140995 3.144000 +140996 4.496000 +140997 3.300000 +140998 3.372000 +140999 2.026000 +141000 3.460000 +141001 2.630000 +141002 3.000000 +141003 2.342000 +141006 0.568000 +141010 3.714000 +141012 4.734000 +141025 4.192000 +141028 4.794000 +141030 4.134000 +141031 2.118000 +141032 2.354000 +141033 3.050000 +141034 2.988000 +141035 3.312000 +141036 2.942000 +141037 2.252000 +141038 2.460000 +141039 2.976000 +141040 2.902000 +141044 2.686000 +141047 3.256000 +141048 4.634000 +141049 3.432000 +141050 4.980000 +141051 5.020000 +141052 4.112000 +141053 4.732000 +141054 4.662000 +141055 5.135000 +141056 4.930000 +141057 2.513000 +141058 4.790000 +141059 4.965000 +141060 6.340000 +141061 5.280000 +141062 5.080000 +141063 5.120000 +141064 4.530000 +141065 5.440000 +141066 4.700000 +141078 4.890000 +141079 2.324000 +141082 4.004000 +141085 4.460000 +141086 4.956000 +141087 4.916000 +141088 4.932000 +141093 4.256000 +141097 1.862000 +141098 1.566000 +141099 1.606000 +141100 1.582000 +141101 1.918000 +141102 3.840000 +141103 3.146000 +141107 4.310000 +141108 4.750000 +141109 4.754000 +141110 4.486000 +141111 4.524000 +141112 4.376000 +141113 4.428000 +141114 4.282000 +141115 3.756000 +141116 3.868000 +141117 3.900000 +141119 4.480000 +141120 4.524000 +141121 4.296000 +141122 1.983000 +141123 4.870000 +141124 4.800000 +141125 4.224000 +141126 4.930000 +141127 5.540000 +141128 4.138000 +141129 5.815000 +141130 3.642000 +141131 3.146000 +141133 5.785000 +141151 4.012000 +141168 2.689000 +141172 4.492000 +141173 4.098000 +141174 3.902000 +141175 3.896000 +141176 4.048000 +141177 1.536000 +141178 1.650000 +141181 5.795000 +141186 6.120000 +141192 5.725000 +141193 6.130000 +141194 6.130000 +141235 0.679500 +141236 0.657500 +141237 0.651000 +141238 0.623000 +141239 0.648500 +141240 0.653500 +141242 0.644500 +141243 0.622000 +141265 4.645000 +141269 0.736500 +141299 2.063000 +141300 2.407000 +141301 2.094000 +141302 2.136000 +141303 2.127000 +141304 1.733000 +141305 1.757000 +141306 1.375000 +141307 1.690000 +141308 2.439000 +141309 1.732000 +141310 1.827000 +141311 1.691000 +141312 2.525000 +141314 2.582000 +141315 2.938000 +141316 1.935000 +141317 1.656000 +141318 1.716000 +141319 1.656000 +141324 4.636000 +141325 3.460000 +141326 4.042000 +141327 3.558000 +141329 4.344000 +141330 3.764000 +141331 3.468000 +141332 3.482000 +141333 3.350000 +141334 3.454000 +141335 4.332000 +141336 4.030000 +141337 3.402000 +141341 5.290000 +141343 5.275000 +141345 3.128000 +141346 3.150000 +141347 3.212000 +141348 2.781000 +141349 3.918000 +141350 3.336000 +141353 4.268000 +141355 5.270000 +141356 5.385000 +141358 4.494000 +141359 3.912000 +141360 3.676000 +141361 3.668000 +141362 4.590000 +141364 4.470000 +141367 4.414000 +141368 2.615000 +141369 4.314000 +141371 4.096000 +141372 4.818000 +141373 3.418000 +141374 3.806000 +141375 3.922000 +141376 2.750000 +141379 2.865000 +141382 0.524000 +141389 4.716000 +141390 5.120000 +141391 5.135000 +141393 1.289000 +141394 5.150000 +141396 2.492000 +141421 4.860000 +141434 4.940000 +141435 4.586000 +141436 4.306000 +141437 5.030000 +141439 4.850000 +141441 3.670000 +141442 4.070000 +141443 3.272000 +141447 4.710000 +141448 4.320000 +141450 4.858000 +141454 5.185000 +141456 4.796000 +141457 4.262000 +141459 5.680000 +141463 5.740000 +141465 4.102000 +141473 0.626000 +141491 5.575000 +141492 5.430000 +141493 2.452000 +141494 4.580000 +141495 3.804000 +141496 2.460000 +141497 2.397000 +141498 2.896000 +141500 2.340000 +141512 6.090000 +141521 1.527000 +141522 5.780000 +141524 6.400000 +141525 6.375000 +141526 6.420000 +141527 6.355000 +141536 5.575000 +141537 1.300000 +141539 1.298000 +141541 0.956000 +141543 0.948000 +141544 2.060000 +141549 4.995000 +141551 4.014000 +141567 4.614000 +141574 4.995000 +141579 1.848000 +141592 3.600000 +141610 1.008000 +141611 4.178000 +141613 5.380000 +141615 4.198000 +141616 4.940000 +141619 3.390000 +141621 4.558000 +141625 5.265000 +141626 5.025000 +141632 4.640000 +141633 4.598000 +141637 2.401000 +141639 4.556000 +141680 2.009000 +141710 3.444000 +141713 4.500000 +141715 5.195000 +141716 5.135000 +141717 5.370000 +141718 3.658000 +141732 2.984000 +141733 2.004000 +141734 2.004000 +141735 2.004200 +141736 2.004000 +141737 2.003800 +141738 2.004200 +141739 2.003600 +141740 2.004200 +141741 2.003600 +141742 2.003800 +141743 2.003400 +141744 2.003800 +141745 2.004000 +141746 2.004000 +141747 2.003800 +141748 2.003800 +141749 2.003800 +141751 2.003000 +141752 2.002800 +141753 2.003800 +141754 2.003200 +141755 2.003600 +141756 2.003600 +141757 2.003400 +141758 2.003600 +141759 2.004000 +141760 2.004000 +141821 4.380000 +141831 4.520000 +141836 3.172000 +141838 3.862000 +141843 5.720000 +141845 2.482000 +141846 3.062000 +141847 4.542000 +141848 3.858000 +141849 1.867000 +141850 3.810000 +141851 3.848000 +141852 5.100000 +141853 4.410000 +141855 4.404000 +141857 4.436000 +141876 6.060000 +141880 5.578000 +141882 5.712000 +141883 4.552000 +141885 5.428000 +141898 5.210000 +141899 5.270000 +141900 1.280000 +141901 1.069000 +141902 0.950000 +141903 0.644000 +141907 4.658000 +141908 4.560000 +141909 4.674000 +141910 4.672000 +141912 3.910000 +141914 3.848000 +141915 3.794000 +141916 4.074000 +141917 4.154000 +141918 4.196000 +141924 4.274000 +141957 2.008000 +141960 2.009000 +141963 2.011000 +141970 5.365000 +141971 5.445000 +141979 5.595000 +141980 5.310000 +141982 5.255000 +141983 5.360000 +141984 5.395000 +141988 5.900000 +141989 5.095000 +141990 5.115000 +141991 5.120000 +141992 5.355000 +141993 5.115000 +141995 5.160000 +141996 5.525000 +142001 2.343000 +142003 5.460000 +142004 5.680000 +142036 4.846000 +142037 4.610000 +142039 6.525000 +142040 6.045000 +142041 4.052000 +142042 4.356000 +142043 4.798000 +142044 3.786000 +142048 2.902000 +142050 3.452000 +142058 5.900000 +142059 5.980000 +142060 5.920000 +142061 5.910000 +142067 5.550000 +142068 4.864000 +142069 3.392000 +142072 3.378000 +142076 5.255000 +142086 3.554000 +142089 3.424000 +142090 3.592000 +142100 5.228000 +142101 5.254000 +142102 5.520000 +142113 2.634000 +142116 3.108000 +142138 2.006000 +142139 2.535000 +142140 2.005600 +142141 2.920000 +142142 2.005600 +142143 4.315000 +142144 2.007200 +142147 2.005400 +142149 2.006200 +142151 2.007000 +142153 2.015600 +142155 2.014200 +142157 2.008400 +142159 2.010400 +142161 2.010200 +142163 2.011600 +142165 2.009600 +142170 5.110000 +142205 1.725000 +142210 5.405000 +142219 4.468000 +142220 5.350000 +142221 4.925000 +142222 4.060000 +142225 3.828000 +142226 4.016000 +142227 3.274000 +142228 1.096000 +142229 1.027000 +142232 2.683000 +142233 4.248000 +142234 4.024000 +142235 4.372000 +142237 4.098000 +142238 6.010000 +142239 2.546000 +142241 5.345000 +142242 5.685000 +142243 5.250000 +142244 5.730000 +142250 5.270000 +142251 5.125000 +142252 4.668000 +142253 2.279000 +142255 2.735000 +142257 5.355000 +142271 0.746000 +142277 2.478000 +142278 2.763000 +142279 4.374000 +142280 1.289000 +142291 1.396000 +142296 5.695000 +142297 5.870000 +142298 5.875000 +142299 5.605000 +142300 5.610000 +142352 0.800000 +142353 0.780000 +142354 0.740000 +142407 5.215000 +142408 5.900000 +142410 4.418000 +142412 3.904000 +142415 4.132000 +142417 2.211000 +142420 3.936000 +142424 5.210000 +142458 7.805000 +142459 4.812000 +142461 5.002000 +142465 1.302000 +142466 1.298000 +142468 4.842000 +142469 4.876000 +142470 4.936000 +142471 4.934000 +142474 6.255000 +142482 1.315000 +142488 5.510000 +142490 5.680000 +142491 5.455000 +142587 5.685000 +142588 4.200000 +142589 4.856000 +142595 4.646000 +142597 3.044000 +142607 3.964000 +142609 5.190000 +142610 4.638000 +142611 4.126000 +142612 4.750000 +142613 5.485000 +142614 5.235000 +142617 5.520000 +142618 5.510000 +142620 5.235000 +142630 4.318000 +142633 3.682000 +142635 4.578000 +142646 3.598000 +142647 3.594000 +142648 5.250000 +142649 5.875000 +142653 3.968000 +142656 4.550000 +142657 5.280000 +142661 2.004000 +142662 2.005200 +142664 2.003400 +142667 2.003800 +142669 2.004200 +142673 2.059600 +142674 2.004000 +142675 2.003200 +142678 2.003200 +142687 2.003600 +142689 2.004000 +142690 2.003800 +142691 2.003400 +142692 2.004000 +142694 4.662000 +142695 3.994000 +142696 4.406000 +142699 5.155000 +142700 5.190000 +142701 5.260000 +142706 3.120000 +142707 2.003800 +142708 2.003600 +142711 2.003400 +142716 2.056200 +142719 2.157200 +142721 2.253400 +142727 2.004000 +142729 2.003400 +142730 2.003800 +142731 2.005800 +142733 2.003800 +142758 4.320000 +142760 5.550000 +142764 1.229000 +142765 1.274000 +142770 5.610000 +142771 5.350000 +142772 1.493000 +142775 6.310000 +142780 2.188000 +142781 2.394000 +142784 1.434000 +142785 5.915000 +142793 5.595000 +142877 4.738000 +143706 0.606000 +143707 1.506000 +143710 0.708000 +143711 1.032000 +143712 2.324000 +143722 3.156000 +143723 2.154000 +143734 5.056000 +143735 1.590000 +143738 5.472000 +143740 2.722000 +143744 5.488000 +143749 2.200000 +143766 1.649000 +143782 1.782000 +143835 5.015000 +143836 0.842000 +143838 0.918000 +143874 1.831000 +143878 1.371000 +143879 1.878000 +143882 1.767000 +143883 1.791000 +143886 1.820000 +143888 4.336000 +143895 0.542000 +143896 5.545000 +143969 4.700000 +143970 4.866000 +143971 4.676000 +143974 4.888000 +143975 4.810000 +143999 3.500000 +144002 3.420000 +144003 4.392000 +144023 5.610000 +144024 4.228000 +144025 3.200000 +144032 5.925000 +144060 2.492000 +144063 4.930000 +144064 4.402000 +144066 4.614000 +144067 4.666000 +144068 4.482000 +144069 4.656000 +144070 4.488000 +144089 4.718000 +144090 4.618000 +144091 5.305000 +144092 5.695000 +144096 2.656000 +144103 5.360000 +144138 3.060000 +144139 1.899000 +144140 2.780000 +144148 5.140000 +144164 3.336000 +144165 3.666000 +144168 2.299000 +144170 4.294000 +144172 2.495000 +144173 2.842000 +144175 3.326000 +144176 2.958000 +144177 1.904000 +144178 2.255000 +144179 2.824000 +144180 2.348000 +144181 1.980000 +144182 3.878000 +144187 0.778000 +144189 3.816000 +144190 1.589000 +144191 1.646000 +144193 1.649000 +144200 4.338000 +144204 4.198000 +144207 4.292000 +144209 4.596000 +144210 4.198000 +144212 1.570000 +144215 2.830000 +144217 3.486000 +144218 2.261000 +144219 4.242000 +144220 3.892000 +144235 3.836000 +144257 5.795000 +144262 5.130000 +144292 5.090000 +144293 5.065000 +144294 5.040000 +144312 0.764000 +144339 1.135000 +144369 0.604000 +144370 0.616000 +144371 0.656000 +144375 1.732000 +144379 1.449000 +144381 5.415000 +144382 5.545000 +144384 5.670000 +144385 5.710000 +144386 5.585000 +144387 5.655000 +144388 5.095000 +144390 5.365000 +144391 4.068000 +144394 4.812000 +144395 4.410000 +144396 5.470000 +144397 5.665000 +144407 4.780000 +144411 5.355000 +144425 2.922000 +144427 1.452000 +144428 2.812000 +144429 4.332000 +144430 3.240000 +144432 4.076000 +144433 1.340000 +144434 1.505000 +144435 3.070000 +144436 3.340000 +144437 3.560000 +144438 3.874000 +144439 2.988000 +144440 4.456000 +144441 3.518000 +144442 2.720000 +144447 1.158000 +144509 4.874000 +144515 5.660000 +144517 0.524000 +144520 1.307000 +144521 1.039000 +144524 5.475000 +144525 5.390000 +144526 5.365000 +144527 0.936000 +144530 1.399000 +144531 4.768000 +144532 1.347000 +144534 0.746000 +144535 0.712000 +144539 2.238000 +144540 2.241000 +144541 0.544000 +144542 0.638000 +144543 2.238000 +144548 5.805000 +144551 1.400000 +144553 5.325000 +144555 1.228000 +144559 1.635000 +144560 3.442000 +144561 1.857000 +144562 2.662000 +144563 2.962000 +144564 3.220000 +144685 0.620000 +144686 0.618000 +144687 2.130000 +144689 0.526000 +144690 1.914000 +144691 2.090000 +144692 5.908000 +144694 4.508000 +144695 1.212000 +144696 1.040000 +144697 1.158000 +144698 1.208000 +144699 6.030000 +144700 5.592000 +144701 6.200000 +144710 4.512000 +144711 5.470000 +144713 5.520000 +144722 5.490000 +144725 5.420000 +144726 5.500000 +144728 5.450000 +144731 5.495000 +144732 0.810000 +144733 5.500000 +144734 5.510000 +144736 5.030000 +144741 3.996000 +144755 4.594000 +144756 5.070000 +144758 1.603000 +144759 5.525000 +144760 2.778000 +144761 5.085000 +144763 2.970000 +144764 4.066000 +144766 4.202000 +144767 2.722000 +144769 1.453000 +144772 5.300000 +144775 5.390000 +144783 1.589000 +144785 1.653000 +144792 5.205000 +144793 3.430000 +144794 3.738000 +144795 3.432000 +144796 5.095000 +144797 3.830000 +144798 3.434000 +144799 4.496000 +144803 3.432000 +144805 2.641000 +144806 3.006000 +144808 2.599000 +144809 2.488000 +144811 4.132000 +144812 5.070000 +144813 4.696000 +144814 3.918000 +144817 6.160000 +144819 3.016000 +144820 3.018000 +144821 2.697000 +144822 2.559000 +144823 2.365000 +144824 2.525000 +144825 2.263000 +144826 2.167000 +144827 2.123000 +144828 2.127000 +144829 2.566000 +144831 2.314000 +144832 2.110000 +144833 2.170000 +144834 2.168000 +144835 2.659000 +144836 3.024000 +144837 3.024000 +144838 3.020000 +144839 1.847000 +144840 3.022000 +144841 3.018000 +144842 3.038000 +144843 3.028000 +144844 4.580000 +144845 3.630000 +144846 3.286000 +144847 4.354000 +144848 3.996000 +144849 2.884000 +144850 3.686000 +144851 1.660000 +144852 2.116000 +144874 5.525000 +144875 5.470000 +144876 5.500000 +144877 5.495000 +144878 5.525000 +144879 5.475000 +144880 5.495000 +144881 5.450000 +144882 5.530000 +144894 5.970000 +144896 5.065000 +144897 1.415000 +144898 5.800000 +144900 4.658000 +144901 5.100000 +144909 2.944000 +144910 3.234000 +144911 3.484000 +144924 3.284000 +144955 1.926000 +144957 1.122000 +144962 1.797000 +144982 4.910000 +144994 3.842000 +144995 4.480000 +144996 3.952000 +144997 6.205000 +144998 6.190000 +144999 6.235000 +145003 1.455000 +145009 5.160000 +145010 3.982000 +145011 3.278000 +145013 4.324000 +145014 3.814000 +145015 3.998000 +145016 5.150000 +145017 3.552000 +145018 3.480000 +145019 4.344000 +145020 5.060000 +145021 3.754000 +145022 3.172000 +145023 3.838000 +145026 5.875000 +145027 5.530000 +145029 4.448000 +145031 3.958000 +145032 2.034000 +145033 4.382000 +145034 4.172000 +145037 0.776000 +145050 1.701000 +145062 4.840000 +145064 3.782000 +145068 4.965000 +145070 4.888000 +145075 3.830000 +145078 5.395000 +145080 3.694000 +145081 5.305000 +145084 4.208000 +145087 3.568000 +145089 3.598000 +145090 2.926000 +145092 4.320000 +145095 5.305000 +145096 1.811000 +145097 3.750000 +145108 3.872000 +145109 5.395000 +145112 4.622000 +145113 5.365000 +145114 4.032000 +145115 4.975000 +145116 5.015000 +145118 2.740000 +145119 2.120000 +145120 5.275000 +145121 4.380000 +145122 1.730000 +145124 2.376000 +145126 2.238000 +145127 2.958000 +145128 3.436000 +145129 2.721000 +145130 2.652000 +145131 3.408000 +145139 4.258000 +145141 4.360000 +145144 3.692000 +145150 2.078000 +145163 6.025000 +145164 0.588000 +145165 0.592000 +145210 6.025000 +145211 6.015000 +145235 4.466000 +145237 4.816000 +145238 4.636000 +145239 4.528000 +145240 4.264000 +145244 0.776000 +145301 5.055000 +145304 4.352000 +145321 3.068000 +145325 1.148000 +145326 0.536000 +145335 0.516000 +145336 0.570000 +145337 1.369000 +145338 5.125000 +145340 1.229000 +145341 1.237000 +145342 3.414000 +145343 5.135000 +145345 2.433000 +145347 3.206000 +145348 5.420000 +145351 5.150000 +145353 1.728000 +145363 2.934000 +145365 2.594000 +145366 2.274000 +145367 2.669000 +145373 3.434000 +145374 2.294000 +145375 2.262000 +145378 5.310000 +145379 4.512000 +145380 4.598000 +145381 5.975000 +145382 5.740000 +145383 5.845000 +145384 5.310000 +145385 4.558000 +145386 2.590000 +145387 5.880000 +145388 5.975000 +145390 3.514000 +145391 4.758000 +145392 4.402000 +145407 6.020000 +145408 4.690000 +145409 4.890000 +145410 3.734000 +145411 4.236000 +145412 6.150000 +145413 6.100000 +145415 6.060000 +145416 6.045000 +145417 4.140000 +145419 6.045000 +145420 4.895000 +145421 5.185000 +145422 6.060000 +145425 5.985000 +145426 5.070000 +145427 5.645000 +145443 2.034000 +145450 5.440000 +145454 0.518000 +145464 5.715000 +145467 5.485000 +145469 5.385000 +145476 1.198000 +145479 4.344000 +145483 2.004000 +145484 2.006000 +145486 2.003000 +145490 2.003800 +145491 2.004800 +145493 2.003800 +145495 2.004000 +145496 2.003800 +145497 2.003800 +145498 2.004800 +145500 2.003800 +145501 2.007000 +145502 2.004000 +145503 2.003600 +145504 2.006000 +145505 2.003800 +145506 2.003800 +145507 2.004000 +145508 2.003600 +145509 2.003600 +145510 2.003800 +145511 2.003800 +145514 2.004000 +145515 2.004000 +145516 2.004600 +145517 2.004200 +145518 2.003600 +145519 2.004000 +145522 2.004200 +145525 2.003000 +145526 2.003800 +145527 2.003800 +145544 1.430000 +145547 4.008000 +145548 3.918000 +145549 4.038000 +145550 4.528000 +145554 1.822000 +145559 1.867000 +145576 4.784000 +145578 4.458000 +145581 2.073000 +145584 5.100000 +145585 4.895000 +145588 4.696000 +145589 2.849000 +145590 4.780000 +145591 3.992000 +145592 4.758000 +145593 2.869000 +145594 3.826000 +145595 2.760000 +145596 5.155000 +145597 3.420000 +145634 2.256000 +145638 2.321000 +145639 2.434000 +145640 2.109000 +145641 2.300000 +145642 2.671000 +145644 3.266000 +145645 2.452000 +145646 2.577000 +145647 2.212000 +145648 4.616000 +145649 3.510000 +145650 3.234000 +145651 5.630000 +145652 3.780000 +145653 3.858000 +145654 3.788000 +145655 3.068000 +145656 2.330000 +145657 3.992000 +145658 3.126000 +145659 5.135000 +145660 3.794000 +145661 3.140000 +145665 1.372000 +145666 1.989000 +145681 4.995000 +145682 3.818000 +145688 5.435000 +145689 4.174000 +145691 4.636000 +145704 6.095000 +145716 2.740000 +145721 6.040000 +145748 1.368000 +145763 1.526000 +145766 1.706000 +145816 2.004600 +145818 2.004000 +145821 2.003600 +145822 2.004400 +145823 2.003800 +145824 2.003600 +145825 2.003600 +145827 2.003600 +145829 2.003600 +145833 2.003600 +145834 2.003600 +145836 2.003600 +145845 2.003200 +145847 2.008400 +145848 2.003600 +145857 4.945000 +145858 4.500000 +145860 3.530000 +145862 3.824000 +145866 3.840000 +145881 4.830000 +145887 5.000000 +145889 1.866000 +145890 4.250000 +145891 5.160000 +145906 3.452000 +145912 4.432000 +145913 3.840000 +145916 3.360000 +145917 3.998000 +145926 5.725000 +145929 5.730000 +145934 5.735000 +145941 5.375000 +145950 5.495000 +145995 5.155000 +146014 1.282000 +146015 5.645000 +146024 2.003600 +146025 2.003600 +146026 2.003200 +146030 2.006200 +146033 2.049800 +146036 1.973600 +146042 2.251000 +146046 3.522000 +146049 3.520000 +146052 2.444000 +146061 1.622000 +146062 2.331000 +146063 2.308000 +146064 3.092000 +146066 1.629000 +146067 2.553000 +146068 1.653000 +146069 1.660000 +146070 3.008000 +146071 3.118000 +146081 4.286000 +146087 4.408000 +146092 2.190000 +146100 1.888000 +146103 1.387000 +146124 1.052000 +146125 1.432000 +146131 2.004200 +146132 2.004400 +146136 2.003600 +146137 0.804000 +146139 1.654000 +146140 2.005400 +146141 2.215000 +146142 2.007000 +146144 2.003600 +146145 2.003800 +146147 1.294000 +146190 4.534000 +146192 1.143000 +146193 1.161000 +146194 4.650000 +146195 2.894000 +146196 4.172000 +146200 4.340000 +146201 1.821000 +146202 4.352000 +146203 4.310000 +146204 2.746000 +146205 4.122000 +146206 4.478000 +146207 4.750000 +146208 3.398000 +146209 2.886000 +146210 2.889000 +146211 1.665000 +146271 2.845000 +146282 3.176000 +146283 2.581000 +146293 3.570000 +146314 5.610000 +146337 4.868000 +146380 3.226000 +146382 5.825000 +146383 0.702000 +146386 4.960000 +146387 3.678000 +146388 5.138000 +146389 3.410000 +146390 1.912000 +146391 3.406000 +146392 4.754000 +146393 5.695000 +146394 6.055000 +146395 4.104000 +146396 4.344000 +146397 4.788000 +146398 4.376000 +146399 4.444000 +146400 4.280000 +146401 4.018000 +146402 3.608000 +146403 3.121000 +146404 0.880000 +146405 5.146000 +146414 5.445000 +146421 5.090000 +146426 0.602000 +146431 5.515000 +146432 1.726000 +146433 5.550000 +146434 6.540000 +146435 1.355000 +146437 6.545000 +146438 6.575000 +146442 2.742000 +146445 5.625000 +146460 6.110000 +146464 2.358000 +146468 4.618000 +146475 5.260000 +146477 5.395000 +146478 5.400000 +146479 4.834000 +146482 4.980000 +146484 5.350000 +146487 5.335000 +146494 5.035000 +146495 4.258000 +146496 3.560000 +146497 3.278000 +146498 4.320000 +146499 2.525000 +146516 0.574000 +146517 5.955000 +146518 5.660000 +146519 5.850000 +146532 4.990000 +146543 4.635000 +146546 4.940000 +146547 4.955000 +146550 2.020000 +146572 5.445000 +146583 5.205000 +146584 5.155000 +146585 5.115000 +146586 3.950000 +146587 5.465000 +146594 4.712000 +146598 5.675000 +146599 5.605000 +146614 3.908000 +146620 6.200000 +146621 6.170000 +146623 6.045000 +146626 4.776000 +146627 4.500000 +146628 5.815000 +146630 4.002000 +146633 2.535000 +146634 3.576000 +146635 3.758000 +146642 6.035000 +146644 3.848000 +146645 2.858000 +146646 3.910000 +146647 6.010000 +146648 5.618000 +146649 4.948000 +146650 5.174000 +146651 5.574000 +146654 6.145000 +146655 6.205000 +146657 6.695000 +146663 4.708000 +146667 3.808000 +146668 3.002000 +146669 3.442000 +146670 3.236000 +146672 3.160000 +146676 3.402000 +146683 1.466000 +146684 3.402000 +146685 3.032000 +146686 3.031800 +146687 3.031800 +146688 3.032000 +146689 3.025000 +146690 3.032400 +146691 3.027800 +146692 3.033600 +146693 3.034600 +146694 3.030000 +146695 3.034600 +146696 3.013200 +146697 3.020800 +146698 3.026400 +146699 3.008000 +146700 3.008600 +146701 3.009000 +146703 2.048000 +146705 2.005400 +146706 2.004800 +146707 2.005600 +146708 2.004400 +146709 2.003800 +146714 0.602000 +146715 4.196000 +146760 1.161000 +146771 1.479000 +146783 3.228000 +146786 6.155000 +146787 5.440000 +146790 6.145000 +146791 6.115000 +146792 1.724000 +146793 2.708000 +146794 3.351000 +146795 6.070000 +146796 6.045000 +146797 4.910000 +146798 4.712000 +146799 5.278000 +146800 3.990000 +146801 3.446000 +146802 4.788000 +146804 4.116000 +146805 4.078000 +146806 4.472000 +146808 3.212000 +146810 2.921000 +146811 5.560000 +146813 6.125000 +146819 5.580000 +146837 1.795000 +146843 5.675000 +146844 5.475000 +146845 5.340000 +146847 4.606000 +146849 4.674000 +146851 4.742000 +146852 4.676000 +146853 5.420000 +146854 4.788000 +146855 5.530000 +146856 5.335000 +146866 5.310000 +146867 5.250000 +146872 5.205000 +146873 4.176000 +146874 4.320000 +146909 0.674000 +146911 1.450000 +146912 1.705000 +146913 3.570000 +146914 3.012000 +146916 6.365000 +146918 9.315000 +146919 1.810000 +146920 2.285000 +146921 3.504000 +146922 3.572000 +146923 3.956000 +146924 2.612000 +146925 2.325000 +146926 2.000000 +146927 2.250000 +146929 7.555000 +146930 7.625000 +146931 0.540000 +146932 8.710000 +146933 6.420000 +146937 4.730000 +146938 8.520000 +146940 9.325000 +146941 7.050000 +146943 9.315000 +146947 9.355000 +146949 9.750000 +146953 5.264000 +146958 5.614000 +146959 5.668000 +146961 5.206000 +146962 6.735000 +146966 5.846000 +146976 4.290000 +146978 1.833000 +146979 6.245000 +146985 5.305000 +146986 5.600000 +146987 4.564000 +146988 4.530000 +146989 3.452000 +146991 4.030000 +146992 3.882000 +146995 5.785000 +146996 5.735000 +147002 3.192000 +147006 0.654000 +147008 4.258000 +147009 2.782000 +147010 3.634000 +147011 7.070000 +147013 3.244000 +147014 2.962000 +147015 7.760000 +147016 8.300000 +147017 4.048000 +147018 5.796000 +147019 4.406000 +147022 4.684000 +147024 6.650000 +147025 8.210000 +147026 8.420000 +147027 8.700000 +147028 3.496000 +147029 2.840000 +147030 3.178000 +147031 2.410000 +147032 3.264000 +147033 5.702000 +147034 9.085000 +147035 8.715000 +147036 3.722000 +147037 2.270000 +147044 8.490000 +147045 4.122000 +147046 3.714000 +147047 3.612000 +147048 2.594000 +147049 9.155000 +147050 9.050000 +147052 5.140000 +147053 9.785000 +147060 9.695000 +147062 9.710000 +147067 9.840000 +147068 3.306000 +147069 3.360000 +147070 9.880000 +147072 9.110000 +147079 3.176000 +147080 3.078000 +147081 4.280000 +147082 3.046000 +147084 9.660000 +147085 7.915000 +147088 1.035000 +147090 5.760000 +147091 10.640000 +147092 7.845000 +147095 3.506000 +147096 3.646000 +147099 5.985000 +147100 6.425000 +147101 7.675000 +147102 7.420000 +147103 5.795000 +147104 8.200000 +147105 7.770000 +147107 5.225000 +147114 2.656000 +147117 5.805000 +147118 5.780000 +147123 5.775000 +147124 5.760000 +147125 4.336000 +147132 5.820000 +147136 5.785000 +147142 5.830000 +147143 5.685000 +147161 3.898000 +147164 5.805000 +147167 6.240000 +147168 6.245000 +147169 4.766000 +147170 5.085000 +147171 4.608000 +147172 3.844000 +147173 4.034000 +147174 3.730000 +147175 5.995000 +147176 5.950000 +147178 5.955000 +147179 4.905000 +147189 2.567000 +147190 2.614000 +147191 3.702000 +147192 1.736000 +147194 5.175000 +147199 4.130000 +147200 2.642000 +147201 4.040000 +147202 4.856000 +147203 4.262000 +147204 1.404000 +147205 2.063000 +147206 2.044000 +147207 4.450000 +147208 3.714000 +147209 3.284000 +147210 3.144000 +147211 3.520000 +147212 3.702000 +147213 4.472000 +147263 2.429000 +147266 1.546000 +147268 5.180000 +147278 5.170000 +147279 5.185000 +147280 5.170000 +147284 4.090000 +147286 3.118000 +147287 3.358000 +147289 1.812000 +147291 4.364000 +147292 1.942000 +147328 1.795000 +147329 3.684000 +147333 1.560000 +147335 1.701000 +147336 3.172000 +147337 2.651000 +147338 1.277000 +147339 2.740000 +147340 1.234000 +147341 1.409000 +147342 1.841000 +147344 2.888000 +147345 2.059000 +147347 3.438000 +147348 2.256000 +147350 3.456000 +147351 3.946000 +147352 3.484000 +147353 1.615000 +147355 1.602000 +147356 1.732000 +147357 3.330000 +147358 1.628000 +147359 2.474000 +147360 2.838000 +147361 1.601000 +147362 2.240000 +147363 3.472000 +147386 4.354000 +147387 3.606000 +147388 3.998000 +147389 4.980000 +147390 4.338000 +147393 4.608000 +147395 4.022000 +147403 2.630000 +147406 5.130000 +147409 5.075000 +147427 1.188000 +147431 1.945000 +147433 1.630000 +147434 1.657000 +147435 2.806000 +147437 2.520000 +147442 1.910000 +147445 2.009400 +147447 2.019200 +147448 2.034000 +147449 2.026600 +147450 2.010000 +147451 2.008800 +147452 2.021800 +147453 2.483000 +147458 3.918000 +147463 4.878000 +147513 5.060000 +147514 5.310000 +147515 4.132000 +147516 4.062000 +147517 4.330000 +147590 5.605000 +147591 5.925000 +147593 5.470000 +147595 3.716000 +147602 5.670000 +147611 5.805000 +147612 4.532000 +147613 4.406000 +147614 4.308000 +147641 0.614000 +147643 4.888000 +147644 3.884000 +147654 5.205000 +147655 5.185000 +147666 4.720000 +147672 5.095000 +147674 4.080000 +147679 3.928000 +147683 3.944000 +147687 3.804000 +147688 3.714000 +147698 5.235000 +147702 4.194000 +147706 2.936000 +147710 2.024000 +147716 0.764000 +147738 0.542000 +147741 1.655000 +147743 7.760000 +148162 5.115000 +148163 5.530000 +148168 5.385000 +148171 1.051000 +148178 1.111000 +148207 5.305000 +148213 0.874000 +148248 4.096000 +148249 3.398000 +148251 5.290000 +148252 5.275000 +148253 5.570000 +148254 3.812000 +148256 5.575000 +148257 5.580000 +148259 4.888000 +148260 3.682000 +148283 5.645000 +148286 5.230000 +148287 5.340000 +148304 4.340000 +148305 5.105000 +148306 4.550000 +148310 4.812000 +148315 2.603000 +148316 2.799000 +148317 4.234000 +148322 4.965000 +148326 4.544000 +148328 5.130000 +148329 4.550000 +148330 4.554000 +148331 4.548000 +148332 4.558000 +148333 4.534000 +148334 5.350000 +148342 2.591000 +148343 4.146000 +148345 4.166000 +148358 0.984000 +148371 4.334000 +148372 4.128000 +148373 3.142000 +148374 3.950000 +148375 3.654000 +148380 3.672000 +148383 5.555000 +148389 0.574000 +148390 0.530000 +148391 4.316000 +148392 4.010000 +148454 5.325000 +148461 5.215000 +148468 3.736000 +148469 1.603000 +148470 2.341000 +148471 5.455000 +148480 4.774000 +148481 5.005000 +148484 2.119000 +148488 3.946000 +148489 4.052000 +148492 1.026000 +148494 4.486000 +148498 0.860000 +148505 6.050000 +148506 5.865000 +148507 5.800000 +148508 4.624000 +148509 5.820000 +148510 5.880000 +148531 0.526000 +148556 1.670000 +148582 4.002000 +148593 5.290000 +148611 4.106000 +148612 5.225000 +148613 5.345000 +148617 2.741000 +148618 3.028000 +148620 4.198000 +148621 3.154000 +148623 3.600000 +148625 5.430000 +148628 5.620000 +148650 4.516000 +148651 3.548000 +148652 4.526000 +148655 5.615000 +148657 4.530000 +148660 4.544000 +148663 6.065000 +148670 2.313000 +148676 0.706000 +148677 5.325000 +148678 1.821000 +148685 6.185000 +148686 6.175000 +148707 6.085000 +148708 3.828000 +148710 1.180000 +148711 1.690000 +148713 3.974000 +148714 2.089000 +148716 4.878000 +148719 4.732000 +148720 4.905000 +148721 5.005000 +148722 5.300000 +148723 5.205000 +148724 6.285000 +148725 6.065000 +148726 6.305000 +148727 6.035000 +148728 4.144000 +148729 3.936000 +148731 6.240000 +148732 4.660000 +148733 3.378000 +148737 5.905000 +148739 4.082000 +148740 6.150000 +148741 5.670000 +148743 3.898000 +148744 5.370000 +148748 3.102000 +148751 4.950000 +148752 5.340000 +148753 4.352000 +148754 3.042000 +148755 2.859000 +148757 2.109000 +148758 4.532000 +148759 4.380000 +148760 4.588000 +148761 6.175000 +148762 5.315000 +148763 5.110000 +148765 5.955000 +148767 4.184000 +148771 5.520000 +148782 4.940000 +148789 5.360000 +148795 1.514000 +148836 0.520000 +148837 0.962000 +148838 3.888000 +148839 2.324000 +148841 5.515000 +148843 5.385000 +148845 5.190000 +148847 5.270000 +148848 5.265000 +148849 5.445000 +148856 5.295000 +148871 5.195000 +148872 1.379000 +148875 3.894000 +148900 0.550000 +148921 1.486000 +148928 1.768000 +148960 4.925000 +148962 3.636000 +148963 3.958000 +148964 4.940000 +148965 5.785000 +148967 4.314000 +148968 2.529000 +148969 2.485000 +148970 2.964000 +148971 3.862000 +148972 5.765000 +148974 3.350000 +149001 1.733000 +149002 1.744000 +149003 2.373000 +149004 1.804000 +149005 1.854000 +149006 3.388000 +149007 1.716000 +149008 2.278000 +149009 2.996000 +149012 4.846000 +149013 1.586000 +149014 3.370000 +149016 3.552000 +149017 3.924000 +149018 1.798000 +149019 4.206000 +149021 3.288000 +149024 4.212000 +149025 1.310000 +149028 4.272000 +149029 4.186000 +149030 2.325000 +149031 1.624000 +149032 1.811000 +149033 2.005000 +149034 1.864000 +149035 2.226000 +149036 1.970000 +149037 2.461000 +149044 1.455000 +149045 3.984000 +149053 1.349000 +149062 1.307000 +149065 3.522000 +149066 3.380000 +149067 3.418000 +149068 4.850000 +149069 1.145000 +149070 0.980000 +149071 1.986000 +149072 0.874000 +149073 1.820000 +149074 3.434000 +149075 1.066000 +149076 3.538000 +149077 2.784000 +149078 3.170000 +149079 2.670000 +149090 1.114000 +149091 5.985000 +149092 5.255000 +149093 1.132000 +149094 4.510000 +149095 5.570000 +149097 1.365000 +149098 6.100000 +149099 3.468000 +149100 4.476000 +149102 1.112000 +149103 6.120000 +149104 6.130000 +149105 3.660000 +149106 6.090000 +149107 5.400000 +149108 5.530000 +149112 1.215000 +149118 6.120000 +149119 2.709000 +149125 1.635000 +149131 4.576000 +149134 1.101000 +149135 5.520000 +149140 4.492000 +149141 4.965000 +149143 4.542000 +149153 4.686000 +149163 2.336000 +149165 3.438000 +149166 3.716000 +149167 4.604000 +149168 4.608000 +149169 4.532000 +149170 2.452000 +149171 4.562000 +149172 4.422000 +149173 4.860000 +149174 4.940000 +149175 2.413000 +149176 4.474000 +149177 4.674000 +149178 2.769000 +149179 4.558000 +149180 3.896000 +149181 3.528000 +149182 4.030000 +149183 3.442000 +149184 2.593000 +149185 1.935000 +149186 4.696000 +149187 3.530000 +149188 3.930000 +149189 4.462000 +149190 3.518000 +149191 3.660000 +149199 5.020000 +149202 5.410000 +149205 5.360000 +149206 5.400000 +149207 2.389000 +149208 4.396000 +149211 5.400000 +149212 2.524000 +149213 4.126000 +149214 3.724000 +149215 3.630000 +149216 4.736000 +149219 4.406000 +149220 5.390000 +149221 4.364000 +149222 5.370000 +149224 5.405000 +149225 5.400000 +149226 5.360000 +149227 4.662000 +149243 3.968000 +149244 6.205000 +149248 6.215000 +149251 4.140000 +149254 5.860000 +149255 5.865000 +149256 5.860000 +149257 4.410000 +149258 5.855000 +149259 5.870000 +149264 5.865000 +149266 6.200000 +149294 2.263000 +149295 2.278000 +149296 1.058000 +149297 2.936000 +149298 3.238000 +149302 5.230000 +149306 1.251000 +149307 6.120000 +149309 4.704000 +149311 5.470000 +149312 4.232000 +149313 4.080000 +149314 3.678000 +149315 4.915000 +149320 5.875000 +149321 5.880000 +149324 3.384000 +149326 5.880000 +149327 5.885000 +149329 5.885000 +149331 5.850000 +149338 4.148000 +149340 5.880000 +149341 5.910000 +149342 4.402000 +149343 5.265000 +149349 6.425000 +149355 5.360000 +149356 5.370000 +149363 6.210000 +149365 4.876000 +149366 2.194000 +149368 2.430000 +149369 5.230000 +149374 3.180000 +149379 5.720000 +149381 5.805000 +149382 4.250000 +149392 2.517000 +149402 3.946000 +149432 3.436000 +149433 1.664000 +149434 2.300000 +149435 2.422000 +149436 1.377000 +149438 2.466000 +149439 1.558000 +149440 1.911000 +149441 1.949000 +149442 1.998000 +149443 2.032000 +149444 2.139000 +149446 1.969000 +149447 3.398000 +149448 6.045000 +149449 6.015000 +149450 5.570000 +149451 5.750000 +149452 3.856000 +149453 5.530000 +149454 5.170000 +149455 6.125000 +149456 5.755000 +149457 6.040000 +149458 6.095000 +149459 5.070000 +149462 5.575000 +149470 1.771000 +149471 1.427000 +149472 2.015000 +149473 3.014000 +149474 3.866000 +149475 2.706000 +149477 1.594000 +149478 3.448000 +149479 3.788000 +149480 2.328000 +149481 2.347000 +149482 2.515000 +149483 3.324000 +149484 1.945000 +149486 1.845000 +149488 5.435000 +149489 1.045000 +149490 1.106000 +149491 4.670000 +149499 2.226000 +149500 1.493000 +149501 2.998000 +149502 2.416000 +149503 1.720000 +149504 1.931000 +149505 1.744000 +149508 0.552000 +149530 6.070000 +149531 5.355000 +149532 5.820000 +149540 3.508000 +149544 4.798000 +149586 3.906000 +149597 0.564000 +149602 3.518000 +149603 5.705000 +149612 5.725000 +149626 6.350000 +149632 0.528000 +149633 5.680000 +149634 5.690000 +149635 5.690000 +149636 5.685000 +149637 5.695000 +149638 5.690000 +149639 5.095000 +149640 5.595000 +149641 5.595000 +149642 5.590000 +149643 5.595000 +149644 4.274000 +149645 3.758000 +149646 3.610000 +149647 3.458000 +149648 3.314000 +149649 3.782000 +149657 1.685000 +149659 1.913000 +149660 4.548000 +149662 2.914000 +149683 2.889000 +149684 2.287000 +149685 3.594000 +149686 5.915000 +149687 3.158000 +149688 2.616000 +149692 3.750000 +149694 3.962000 +149695 3.136000 +149696 3.266000 +149698 3.118000 +149720 2.029000 +149721 2.012000 +149723 2.010000 +149742 5.325000 +149745 5.575000 +149746 4.850000 +149748 5.400000 +149749 1.884000 +149750 3.472000 +149751 4.398000 +149752 1.730000 +149753 3.310000 +149771 4.730000 +149772 4.842000 +149775 2.166000 +149778 3.966000 +149802 3.826000 +149809 4.422000 +149812 4.820000 +149814 3.066000 +149817 4.334000 +149819 3.486000 +149823 5.795000 +149825 5.795000 +149826 5.970000 +149841 5.280000 +149844 4.314000 +149846 4.100000 +149851 4.606000 +149858 4.318000 +149859 4.616000 +149865 1.963000 +149873 5.340000 +149875 5.295000 +149876 1.301000 +149877 6.035000 +149879 6.045000 +149880 6.045000 +149881 6.030000 +149882 6.025000 +149883 6.020000 +149884 6.020000 +149885 6.020000 +149886 6.015000 +149887 6.010000 +149888 6.025000 +149889 6.015000 +149890 6.020000 +149891 6.010000 +149892 6.015000 +149893 6.035000 +149897 4.334000 +149898 5.415000 +149899 3.478000 +149900 5.375000 +149904 0.694000 +149905 3.162000 +149908 5.920000 +149909 5.915000 +149910 5.910000 +149911 5.920000 +149912 5.920000 +149913 5.915000 +149914 5.915000 +149915 5.915000 +149916 5.920000 +149917 5.920000 +149936 5.770000 +149939 3.220000 +149963 1.996000 +149964 6.045000 +149965 3.918000 +149966 2.078000 +149968 4.202000 +149969 2.549000 +149972 3.098000 +149974 5.620000 +149975 4.190000 +149977 4.230000 +149978 4.985000 +149980 2.057000 +149981 2.188000 +149992 5.605000 +149993 5.595000 +149994 5.585000 +149995 5.585000 +149996 5.595000 +149997 5.585000 +149998 5.590000 +149999 5.640000 +150000 5.640000 +150006 5.115000 +150007 5.125000 +150008 5.190000 +150009 5.195000 +150010 5.065000 +150011 5.060000 +150012 5.190000 +150013 0.698000 +150014 5.190000 +150016 3.192000 +150021 1.143000 +150033 4.670000 +150043 5.830000 +150051 4.248000 +150067 2.665000 +150082 5.065000 +150084 3.526000 +150085 5.695000 +150087 3.218000 +150110 5.270000 +150112 5.945000 +150117 3.018000 +150118 3.022000 +150119 3.052000 +150120 1.695000 +150121 3.444000 +150123 6.190000 +150130 5.395000 +150131 5.380000 +150134 5.120000 +150135 5.425000 +150136 5.335000 +150138 5.490000 +150146 5.270000 +150171 2.008000 +150172 3.160000 +150173 2.019000 +150175 2.013600 +150177 2.009000 +150178 2.005600 +150180 1.175000 +150182 2.007000 +150185 2.005000 +150187 2.008000 +150218 4.148000 +150221 5.240000 +150224 3.372000 +150227 0.878000 +150229 1.771000 +150230 0.612000 +150231 4.905000 +150238 3.158000 +150239 3.092600 +150240 3.029400 +150241 3.032400 +150242 3.032600 +150243 3.034000 +150244 3.343500 +150245 3.032000 +150246 3.033800 +150248 2.237000 +150249 2.238600 +150250 2.239600 +150265 3.090000 +150267 2.064200 +150271 3.149800 +150272 3.516000 +150273 3.024000 +150274 3.017400 +150275 2.233800 +150276 2.234000 +150277 2.235000 +150278 2.234400 +150279 2.237800 +150283 2.024000 +150286 2.020400 +150295 5.750000 +150298 5.735000 +150303 3.554000 +150304 3.340000 +150305 3.276000 +150322 6.205000 +150361 5.610000 +150362 5.525000 +150364 5.545000 +150365 5.420000 +150366 5.330000 +150367 5.090000 +150368 5.300000 +150369 5.230000 +150370 5.310000 +150371 5.300000 +150372 3.952000 +150373 5.060000 +150375 5.280000 +150402 5.240000 +150403 6.110000 +150404 4.166000 +150405 5.330000 +150407 4.925000 +150408 5.130000 +150410 4.142000 +150413 5.705000 +150421 4.708000 +150425 2.454000 +150429 2.611000 +150437 6.200000 +150438 6.235000 +150439 4.466000 +150440 6.215000 +150447 5.630000 +150461 1.214000 +150462 1.218000 +150463 1.078000 +150464 1.072000 +150465 1.215500 +150466 1.219000 +150467 1.209600 +150468 1.274200 +150469 1.210000 +150470 1.210400 +150471 1.210000 +150501 4.660000 +150502 2.793000 +150503 2.121000 +150504 2.378000 +150505 2.427000 +150506 2.528000 +150507 2.480000 +150508 2.514000 +150509 3.040000 +150510 1.769000 +150511 2.736000 +150513 2.370000 +150514 2.487000 +150515 2.448000 +150522 0.938000 +150524 3.568000 +150525 3.306000 +150527 2.871000 +150528 3.770000 +150529 3.180000 +150531 3.398000 +150532 2.850000 +150533 4.762000 +150534 2.459000 +150535 2.934000 +150536 3.588000 +150537 4.094000 +150555 1.164000 +150556 1.128000 +150557 3.740000 +150558 1.201000 +150578 5.415000 +150579 3.586000 +150580 3.108000 +150581 2.982000 +150582 2.649000 +150583 2.731000 +150584 5.555000 +150585 2.621000 +150586 2.660000 +150587 2.660000 +150588 2.648000 +150589 2.201000 +150590 2.772000 +150591 2.787000 +150592 2.521000 +150593 2.980000 +150594 2.906000 +150595 2.886000 +150596 2.898000 +150597 2.898000 +150598 2.936000 +150599 2.325000 +150601 5.020000 +150613 4.850000 +150617 3.206000 +150619 2.610000 +150621 4.438000 +150634 4.274000 +150635 3.930000 +150636 5.865000 +150638 5.870000 +150639 3.620000 +150641 4.078000 +150642 5.135000 +150643 4.666000 +150644 4.030000 +150646 3.638000 +150647 4.888000 +150648 3.842000 +150649 3.512000 +150650 5.870000 +150651 3.290000 +150654 5.540000 +150656 5.225000 +150659 6.200000 +150661 5.525000 +150689 1.212200 +150690 1.213000 +150691 1.213000 +150692 1.213200 +150693 1.215400 +150694 1.215000 +150695 1.209400 +150696 1.215800 +150698 1.216200 +150714 5.970000 +150715 2.553000 +150716 5.290000 +150722 3.220000 +150723 3.220000 +150725 4.432000 +150728 5.050000 +150730 4.320000 +150732 4.028000 +150733 3.926000 +150736 5.150000 +150737 4.118000 +150738 5.225000 +150740 2.058000 +150741 3.652000 +150742 4.046000 +150744 2.745000 +150745 3.170000 +150746 3.044000 +150776 3.158000 +150777 4.614000 +150781 3.120000 +150784 3.948000 +150788 6.230000 +150791 5.275000 +150818 5.010000 +150819 5.855000 +150820 5.875000 +150824 5.885000 +150827 5.890000 +150829 5.090000 +150830 5.550000 +150834 5.520000 +150835 4.568000 +150838 3.518000 +150841 3.550000 +150845 3.094000 +150848 3.194000 +150860 6.000000 +150861 5.965000 +150868 4.186000 +150871 4.342000 +150873 6.366000 +150874 4.368000 +150875 4.480000 +150880 2.006000 +150884 2.005000 +150889 2.003400 +150892 2.008000 +152131 1.550500 +152136 1.486500 +152172 4.754500 +152174 4.982500 +152199 1.405000 +152200 5.539500 +152205 5.469000 +152206 5.350000 +152213 0.782500 +152214 1.347500 +152215 1.318500 +152216 1.346000 +152217 2.935000 +152227 3.824000 +152231 6.578500 +152247 0.805500 +152267 7.119000 +152268 7.092500 +152283 5.060500 +152304 2.990000 +152313 3.803500 +152317 4.493500 +152324 2.704500 +152338 6.245500 +152357 3.694500 +152360 4.607000 +152361 4.770500 +152362 2.695500 +152363 4.550500 +152367 6.600500 +152368 7.166500 +152369 6.620000 +152370 6.644000 +152371 6.314500 +152439 5.498000 +152481 7.089000 +152482 7.082000 +152514 3.046500 +152515 6.257000 +152546 5.179500 +152547 6.606000 +152553 0.864000 +152558 0.886500 +152559 2.041000 +152560 2.042000 +152561 5.571500 +152562 5.725000 +152571 6.327500 +152572 5.118000 +152573 4.942500 +152574 6.380000 +152575 6.358000 +152576 6.376000 +152579 7.069500 +152580 7.086000 +152581 7.077000 +152582 7.515000 +152585 7.423000 +152586 7.426500 +152587 7.423500 +152588 7.418000 +152589 7.421000 +152590 7.447500 +152591 7.418500 +152593 2.544500 +152594 6.563500 +152595 6.608500 +152596 1.946500 +152600 5.926500 +152602 5.166500 +152614 7.398000 +152615 3.556500 +152623 1.652000 +152626 4.392500 +152627 4.111000 +152628 4.131500 +152629 4.090500 +152641 5.210500 +152701 0.716500 +152702 4.264500 +152717 6.390500 +152724 5.609000 +152732 4.510500 +152739 5.897500 +152740 6.024000 +152777 5.902000 +152778 5.806500 +152779 6.472000 +152780 6.449500 +152782 6.471500 +152783 6.579000 +152784 7.162500 +152785 6.621500 +152786 7.109500 +152787 7.094500 +152788 5.350500 +152792 6.944500 +152793 7.095500 +152794 7.094500 +152795 5.864000 +152797 5.206000 +152798 6.374500 +152799 5.362000 +152800 4.403500 +152801 3.377500 +152802 3.909000 +152803 5.728000 +152804 5.418000 +152805 5.408500 +152806 3.486500 +152807 3.712000 +152808 4.140000 +152812 5.658500 +152813 7.369500 +152819 4.514500 +152820 5.044500 +152829 3.464500 +152831 4.974500 +152832 5.384000 +152845 4.594000 +152846 4.138000 +152850 7.354000 +152852 3.500500 +152853 4.947000 +152854 4.582000 +152856 6.404500 +152858 6.663000 +152859 5.697500 +152860 2.590000 +152861 4.265000 +152881 4.801500 +152882 0.883000 +152883 4.428000 +152884 4.141000 +152885 4.241500 +152892 7.545500 +152893 7.544500 +152894 7.546000 +152895 7.217500 +152896 7.112500 +152897 7.542500 +152899 7.753000 +152900 5.540000 +152908 2.007500 +152909 2.017500 +152910 2.014500 +152913 1.210500 +152914 1.209500 +152925 7.040000 +152931 2.233000 +152938 7.035500 +152959 5.845000 +152960 5.816500 +152961 5.859500 +152962 5.849500 +152963 5.842000 +152964 5.840500 +152966 5.858500 +152967 5.842000 +152968 5.847000 +152969 2.185500 +152970 5.843500 +152971 5.848000 +152972 5.867500 +152973 5.867000 +152980 3.111500 +152981 3.788500 +152986 6.569000 +153016 6.535000 +153017 5.812000 +153018 5.851000 +153019 5.849500 +153020 5.841500 +153021 5.839000 +153052 5.424000 +153053 6.605500 +153069 3.834000 +153090 0.518500 +153091 5.540000 +153092 5.536000 +153097 5.867500 +153107 4.620500 +153113 5.672500 +153122 2.301500 +153123 2.169500 +153124 2.180500 +153125 2.323500 +153126 2.535000 +153127 3.412000 +153128 2.862500 +153129 1.595000 +153130 2.537000 +153131 1.692500 +153132 4.913500 +153133 4.499500 +153134 2.577500 +153135 3.953000 +153136 2.753500 +153137 3.151000 +153138 2.219500 +153139 3.687000 +153140 6.416000 +153141 5.427000 +153142 4.392000 +153143 5.944500 +153144 2.828500 +153145 3.674000 +153146 3.896500 +153147 7.037000 +153148 1.793500 +153149 7.042000 +153150 7.039000 +153155 5.221500 +153157 1.495000 +153262 5.297500 +153263 3.981000 +153264 4.095500 +153265 3.705500 +153266 4.736000 +153267 5.278500 +153268 3.500500 +153270 3.559500 +153271 3.277500 +153272 3.365000 +153273 3.397000 +153274 3.439000 +153275 3.313000 +153276 3.525500 +153278 5.309000 +153279 3.612000 +153282 3.384500 +153285 5.389500 +153288 1.558500 +153294 3.232000 +153300 3.949000 +153302 5.495500 +153303 5.498500 +153305 5.339500 +153307 5.070000 +153313 2.350000 +153315 2.201000 +153316 2.390500 +153317 4.721000 +153319 2.387000 +153320 5.032500 +153321 4.632000 +153323 4.657000 +153324 5.038500 +153325 4.333000 +153327 2.929000 +153329 5.060000 +153330 5.015000 +153331 1.646000 +153332 3.189000 +153334 4.445500 +153335 2.342500 +153336 2.337000 +153337 2.750500 +153338 4.319000 +153339 1.473500 +153340 4.801000 +153343 3.820000 +153344 5.098500 +153345 4.095500 +153351 5.076500 +153352 3.238500 +153353 3.689000 +153354 4.457500 +153355 4.581000 +153356 4.221000 +153358 5.520000 +153360 1.233000 +153361 1.074000 +153362 4.440500 +153363 3.539000 +153364 3.362000 +153365 4.361500 +153366 4.579000 +153367 4.516000 +153369 2.711500 +153371 5.086500 +153372 4.678000 +153373 4.542000 +153374 5.069500 +153376 3.193000 +153381 5.355500 +153383 3.763500 +153384 3.740000 +153385 3.583500 +153386 3.140500 +153387 3.634500 +153388 3.115000 +153389 3.055500 +153390 3.287000 +153391 3.524000 +153392 1.679000 +153393 3.416000 +153394 4.077500 +153395 2.879500 +153397 4.111500 +153400 4.204500 +153401 3.808500 +153413 5.045000 +153414 1.442500 +153415 1.562000 +153416 1.733500 +153417 1.479000 +153420 1.636500 +153423 1.633500 +153438 5.302500 +153440 4.958500 +153449 5.731500 +153450 1.180500 +153451 0.859500 +153452 1.973500 +153453 2.387500 +153454 3.333000 +153455 2.372000 +153456 3.762000 +153459 2.986500 +153460 2.897000 +153461 2.891500 +153468 4.148000 +153469 4.040500 +153479 5.822500 +153480 7.121000 +153483 4.968500 +153484 6.673500 +153490 5.345500 +153522 3.715500 +153523 4.636000 +153524 3.448500 +153525 3.482500 +153526 2.286000 +153527 2.534500 +153528 2.484000 +153529 1.720000 +153530 1.585000 +153531 3.280500 +153532 2.386000 +153536 2.968500 +153538 6.558000 +153539 7.002000 +153540 7.868500 +153545 7.100000 +153546 5.190500 +153548 1.352000 +153549 1.200000 +153552 0.804000 +153554 4.999500 +153556 1.201000 +153557 1.203000 +153558 1.202500 +153559 1.200500 +153560 1.200500 +153563 1.201500 +153575 6.013000 +153583 4.354500 +153584 6.985000 +153585 6.598000 +153586 6.291000 +153587 3.777500 +153593 2.911000 +153594 2.911000 +153602 6.096000 +153603 2.839000 +153604 3.024500 +153605 3.545500 +153610 5.667000 +153613 0.819500 +153621 5.812000 +153632 2.849000 +153633 5.629500 +153634 4.373500 +153637 5.937500 +153652 7.046500 +153660 3.459500 +153674 5.726500 +153675 5.425500 +153676 6.071500 +153687 6.823500 +153688 6.480500 +153689 6.429000 +153690 4.582500 +153693 5.866500 +153698 3.973000 +153699 4.131500 +153713 7.028000 +153714 7.062000 +153715 4.628500 +153723 4.107500 +153724 2.486000 +153725 3.173000 +153728 4.669000 +153729 5.070500 +153730 3.264000 +153731 5.122000 +153732 3.722500 +153733 2.205500 +153736 2.922500 +153738 5.268500 +153739 5.504000 +153741 5.134000 +153742 2.705000 +153743 5.491500 +153744 3.058000 +153753 4.827000 +153755 4.008000 +153756 4.207500 +153770 5.552000 +153775 0.592000 +153776 0.653500 +153777 2.353500 +153778 3.514500 +153779 2.830000 +153780 3.489500 +153781 1.742000 +153782 2.129500 +153783 4.668500 +153784 3.437000 +153785 3.161500 +153786 2.407000 +153787 3.789000 +153788 2.146500 +153789 2.554000 +153790 2.213500 +153792 2.109500 +153793 3.975000 +153794 3.069000 +153795 1.222500 +153796 2.431500 +153797 2.456500 +153798 2.112000 +153799 3.424000 +153814 4.768500 +153815 4.753000 +153817 4.747000 +153868 3.060000 +153870 3.665500 +153873 3.641500 +153874 3.876500 +153875 4.938000 +153876 3.079500 +153877 4.729000 +153878 5.497000 +153889 1.579500 +153890 2.948500 +153892 5.739000 +153894 2.895000 +153895 3.340500 +153896 3.362500 +153897 4.146500 +153898 4.314500 +153899 5.870500 +153907 4.053000 +153908 4.342500 +153910 4.287000 +153912 4.288500 +153913 4.366500 +153914 4.021000 +153930 7.057000 +153953 4.305500 +153954 3.823500 +153956 4.116500 +153959 5.059000 +153960 5.052000 +153961 4.056500 +153967 3.872000 +153968 2.716500 +153969 2.819000 +153970 2.575000 +153971 3.787000 +153972 2.916000 +153973 5.461500 +153974 3.499500 +153975 3.275500 +153976 2.151000 +153983 1.320000 +153984 1.200000 +153985 1.199500 +153986 1.202500 +153987 1.200000 +154001 1.203500 +154002 1.203500 +154004 1.208000 +154005 1.203000 +154006 1.209500 +154007 1.284000 +154010 0.507000 +154011 5.968000 +154012 3.893500 +154013 2.012000 +154014 2.012000 +154015 2.011500 +154016 2.012500 +154017 2.012000 +154018 2.010000 +154019 2.011000 +154020 2.013500 +154021 2.013000 +154022 2.012000 +154023 2.012500 +154024 2.013000 +154025 2.012000 +154026 2.013000 +154027 2.012500 +154028 2.012000 +154029 2.012500 +154030 2.013000 +154031 2.012500 +154036 7.794000 +154043 6.090500 +154056 4.185500 +154071 5.904500 +154072 2.967000 +154073 2.567000 +154074 2.759500 +154075 5.845000 +154076 5.359500 +154077 2.688500 +154078 2.344000 +154080 4.784000 +154084 2.861500 +154085 2.781500 +154086 2.089000 +154087 2.077000 +154088 2.486000 +154089 2.147500 +154090 2.417500 +154091 2.260500 +154093 2.181000 +154094 2.752000 +154095 2.574500 +154096 3.965500 +154097 2.529500 +154098 2.519000 +154106 2.844000 +154107 2.850500 +154108 2.432000 +154109 2.446500 +154110 4.653000 +154111 3.567500 +154112 6.247500 +154113 3.360000 +154114 2.241500 +154115 2.108000 +154120 5.083000 +154121 5.091500 +154129 2.647000 +154130 2.769500 +154134 6.101500 +154135 3.074500 +154136 3.058000 +154137 3.056500 +154138 2.097000 +154139 1.820000 +154140 1.796000 +154141 1.808500 +154142 3.022000 +154143 2.033500 +154144 2.035000 +154145 2.030500 +154146 2.032500 +154147 2.029000 +154148 2.026000 +154149 2.019500 +154150 2.032500 +154151 2.028000 +154152 2.023000 +154153 2.018000 +154154 2.017000 +154155 2.031000 +154156 2.028500 +154157 2.028000 +154158 2.021500 +154159 2.026500 +154160 2.018000 +154164 5.616000 +154166 2.011000 +154167 2.012000 +154168 2.009000 +154169 2.008500 +154170 2.007000 +154171 2.009500 +154172 2.009000 +154173 2.007500 +154174 2.008000 +154175 2.007500 +154176 2.008000 +154177 2.008500 +154178 2.010000 +154179 2.009000 +154180 2.009000 +154181 2.007500 +154182 2.008500 +154183 2.006500 +154184 2.008500 +154185 2.007500 +154186 2.007500 +154187 2.007000 +154188 2.007000 +154189 2.007000 +154190 2.011500 +154191 2.011500 +154192 2.010000 +154246 5.211500 +154255 5.179000 +154261 5.985500 +154262 5.045500 +154263 5.119000 +154264 5.761000 +154265 5.804500 +154266 1.226500 +154281 1.110000 +154282 6.361500 +154283 6.153000 +154299 5.183500 +154300 4.107500 +154301 4.827000 +154302 4.912000 +154303 4.781500 +154304 2.056500 +154305 2.920500 +154306 5.648500 +154307 5.353500 +154308 4.864000 +154309 4.926000 +154311 1.072500 +154312 4.999000 +154313 4.966500 +154316 1.912500 +154361 7.343500 +154367 5.759000 +154379 5.564000 +154382 6.039000 +154386 7.059000 +154395 7.142000 +154409 6.964000 +154413 5.091000 +154420 4.861000 +154426 7.317500 +154444 6.615500 +154454 1.319500 +154455 6.898500 +154456 6.636000 +154457 6.615000 +154458 6.880500 +154459 6.325000 +154462 6.847500 +154463 1.651500 +154465 2.842500 +154467 3.017000 +154468 1.686000 +154469 1.906000 +154470 1.792000 +154471 2.011500 +154472 1.736000 +154473 1.939500 +154474 1.916500 +154475 1.935000 +154476 1.930000 +154478 2.537000 +154479 1.467500 +154480 1.984500 +154482 2.989500 +154483 1.231000 +154484 1.474000 +154485 2.821000 +154487 1.929500 +154488 1.350500 +154489 1.621000 +154490 1.909000 +154491 1.587000 +154492 1.920000 +154493 1.274000 +154494 1.766000 +154495 1.663000 +154496 1.898500 +154498 2.850500 +154499 1.268000 +154502 7.317000 +154512 6.459500 +154513 6.180500 +154514 6.192000 +154515 6.440500 +154517 1.790000 +154519 4.440500 +154520 6.219500 +154521 6.513500 +154522 6.236500 +154524 6.116000 +154526 5.888000 +154528 5.605500 +154529 2.325000 +154530 3.455000 +154534 3.136500 +154539 0.754000 +154545 7.312000 +154546 3.365000 +154549 5.373000 +154551 4.133000 +154552 5.328000 +154553 0.909000 +154555 5.364500 +154558 5.026000 +154559 4.013000 +154560 2.261500 +154561 4.238000 +154563 5.358000 +154571 5.386000 +154575 3.447000 +154576 3.327500 +154577 2.139000 +154580 5.036500 +154590 4.493500 +154594 0.861500 +154605 2.003000 +154607 2.002000 +154608 2.003000 +154609 2.005500 +154610 2.005000 +154611 2.005000 +154612 2.006000 +154614 2.006000 +154615 1.996500 +154616 2.012500 +154617 2.008000 +154618 2.012500 +154619 2.009000 +154620 2.012500 +154621 2.011500 +154622 2.014000 +154623 2.008500 +154624 2.007500 +154625 2.008000 +154651 7.037500 +154653 7.044500 +154654 5.107000 +154664 7.043000 +154669 7.047500 +154673 7.037500 +154676 7.040000 +154716 4.736000 +154717 7.095000 +154718 7.055500 +154719 7.045500 +154720 7.055000 +154721 7.073500 +154722 7.046000 +154756 5.862000 +154757 5.833500 +154758 5.844500 +154762 4.209500 +154766 5.861500 +154768 5.803500 +154769 5.780500 +154770 5.834500 +154771 5.721000 +154772 5.723000 +154773 5.856000 +154775 0.617000 +154778 5.517000 +154783 5.698000 +154784 4.684500 +154792 4.376500 +154793 3.827000 +154794 3.335500 +154795 3.238500 +154796 5.575500 +154798 4.404500 +154799 3.756000 +154800 5.138500 +154801 4.755500 +154802 2.698000 +154803 2.735500 +154804 2.889000 +154805 2.449500 +154806 2.320000 +154807 1.967000 +154808 3.404000 +154809 3.835000 +154810 4.565000 +154811 3.997000 +154812 3.835500 +154813 3.696500 +154814 4.206000 +154815 4.190000 +154816 4.197500 +154817 4.053000 +154818 4.171500 +154819 4.306500 +154820 3.674000 +154821 4.178000 +154822 3.891000 +154823 4.243000 +154824 3.656000 +154825 2.781000 +154826 4.331000 +154832 6.200000 +154838 4.940000 +154839 5.995000 +154840 5.328000 +154841 3.745000 +154843 4.365000 +154844 4.599000 +154845 5.955500 +154846 5.811000 +154847 4.446500 +154848 3.868500 +154850 5.556000 +154851 2.854500 +154852 4.636000 +154853 4.755000 +154854 4.303500 +154855 3.194000 +154856 4.750000 +154857 5.696000 +154876 3.032500 +154877 2.579500 +154878 2.793500 +154880 3.206000 +154881 2.707000 +154882 3.037000 +154883 3.303500 +154884 4.239500 +154885 3.177500 +154886 3.195000 +154887 3.259500 +154888 2.994000 +154889 3.315500 +154890 0.579000 +154891 3.528000 +154892 3.375000 +154895 3.213000 +154896 4.334000 +154897 3.703500 +154898 3.397500 +154899 5.721500 +154900 5.632000 +154901 4.636000 +154902 5.737000 +154903 4.051000 +154904 3.860000 +154905 2.623500 +154906 3.381000 +154907 2.760000 +154908 3.284000 +154909 4.961500 +154910 4.048000 +154911 4.151000 +154912 4.184000 +154913 4.173000 +154914 3.575500 +154920 6.456000 +154921 5.884000 +154923 3.139500 +154924 2.524000 +154925 2.963500 +154936 5.846500 +154938 6.073500 +154941 2.729000 +154942 2.484000 +154943 3.467000 +154944 2.496500 +154945 2.404500 +154946 2.470000 +154947 3.770500 +154948 3.058000 +154949 3.560500 +154950 3.641000 +154951 3.840500 +154952 3.176000 +154953 2.856000 +154954 3.089500 +154955 2.923500 +154956 2.959500 +154957 4.781000 +154958 2.797000 +154959 3.113500 +154962 7.351000 +154963 2.850000 +154964 4.459500 +154965 4.286000 +154966 5.558000 +154967 4.748500 +154968 3.996500 +154969 1.445000 +154970 1.678000 +154972 3.166000 +154973 2.845500 +154974 1.782000 +154975 3.200500 +154977 3.140000 +154978 2.763000 +154979 5.781000 +154981 5.678000 +154983 4.538000 +154985 5.362500 +154986 4.441000 +154987 4.374000 +154988 5.230500 +154989 6.008000 +154990 4.089500 +154991 6.075000 +154992 6.074500 +154994 6.086000 +154995 6.084500 +154996 3.726500 +154997 4.225500 +155001 2.161000 +155002 7.052000 +155006 4.304000 +155007 2.529000 +155010 1.408000 +155012 4.077500 +155014 2.992500 +155015 2.821500 +155016 4.284500 +155017 4.194500 +155018 4.254500 +155019 4.440500 +155020 4.210000 +155021 3.768500 +155036 1.201000 +155037 1.201500 +155040 1.296000 +155041 1.222500 +155042 1.198500 +155043 1.230000 +155044 1.211000 +155045 1.212500 +155046 1.168500 +155047 1.206000 +155048 1.211500 +155104 1.168500 +155111 4.819500 +155112 6.531500 +155124 5.205000 +155146 5.814500 +155155 5.665000 +155169 1.969500 +155181 7.321000 +155184 3.112500 +155185 2.612500 +155186 2.904000 +155187 2.747500 +155188 2.712000 +155189 3.400000 +155190 3.498500 +155191 2.920000 +155192 2.717000 +155193 4.136500 +155196 4.334500 +155197 3.776000 +155198 3.920500 +155200 5.317000 +155201 5.305000 +155202 3.392000 +155203 3.433000 +155204 4.421000 +155205 3.413500 +155206 5.590000 +155207 4.811000 +155208 5.376000 +155210 5.668500 +155211 5.559000 +155214 5.684000 +155215 5.099500 +155216 5.689500 +155224 6.879000 +155226 4.133000 +155246 6.701500 +155255 6.731500 +155257 6.750000 +155265 5.084000 +155266 5.063000 +155267 3.419500 +155268 4.065000 +155269 5.445500 +155271 6.259000 +155274 5.122500 +155275 5.329000 +155276 4.002000 +155277 4.005500 +155278 4.160000 +155280 5.996500 +155286 5.631500 +155287 3.378000 +155289 5.513500 +155294 5.374000 +155300 4.939000 +155301 5.413000 +155302 5.269500 +155325 5.581000 +155327 6.652500 +155329 6.718000 +155331 6.558500 +155332 6.647500 +155333 6.608500 +155334 6.539500 +155336 6.740000 +155338 6.354500 +155339 6.458500 +155340 6.165000 +155341 6.277500 +155349 6.470500 +155350 6.595000 +155351 6.616500 +155353 6.565500 +155354 6.632500 +155364 3.388500 +155376 6.499500 +155380 5.735000 +155387 5.703500 +155388 5.678000 +155389 6.472500 +155410 6.129000 +155415 6.228000 +155416 6.231000 +155424 4.278500 +155438 1.770000 +155441 3.326500 +155450 3.260000 +155454 4.183000 +155455 4.173000 +155456 4.155000 +155457 4.131000 +155458 4.132000 +155459 4.137500 +155460 4.143500 +155461 5.130500 +155462 5.086500 +155464 5.144500 +155465 5.136500 +155468 5.725500 +155469 5.708000 +155470 4.766500 +155471 5.684500 +155472 5.597500 +155482 5.427000 +155498 7.344500 +155525 6.394500 +155533 7.346000 +155544 4.527500 +155547 4.669000 +155549 5.245000 +155550 4.789000 +155554 3.884000 +155555 3.691500 +155556 4.292000 +155557 5.467500 +155563 7.352000 +155587 4.125500 +155588 5.538500 +155591 5.834500 +155594 5.571500 +155598 7.150000 +155603 4.197000 +155604 7.631500 +155610 7.347500 +155634 4.780000 +155635 5.379500 +155636 4.621000 +155637 4.618500 +155638 5.031500 +155639 4.759000 +155640 5.021500 +155642 5.089500 +155643 4.320500 +155647 4.378500 +155659 2.008500 +155661 2.010000 +155662 2.010500 +155663 2.010500 +155664 2.008000 +155665 2.011000 +155666 2.011000 +155667 2.011000 +155668 2.011000 +155669 2.009500 +155670 2.011500 +155671 2.009500 +155672 2.010000 +155673 2.008500 +155675 2.009500 +155676 2.010500 +155677 2.009000 +155678 2.010000 +155679 2.009000 +155680 2.010500 +155682 2.008500 +155683 2.009000 +155684 2.007500 +155685 2.008500 +155686 2.010500 +155687 2.009500 +155688 2.007500 +155689 2.007500 +155690 2.009000 +155691 2.010500 +155692 2.008000 +155693 2.008500 +155694 2.009000 +155695 2.010000 +155696 2.010500 +156199 4.208000 +156200 4.741500 +156205 3.996500 +156244 6.603000 +156255 1.517000 +156272 1.428000 +156273 1.487000 +156291 3.088000 +156293 3.979000 +156295 5.679500 +156296 6.285500 +156305 7.340500 +156306 1.148500 +156316 4.374000 +156336 4.435500 +156338 4.236500 +156350 7.347000 +156381 7.349000 +156382 7.343000 +156383 7.346000 +156385 7.314000 +156390 5.345000 +156391 3.460500 +156392 3.004500 +156404 2.538000 +156405 4.400500 +156406 4.426000 +156411 7.346000 +156412 7.347000 +156424 5.073500 +156427 4.549500 +156428 4.111000 +156430 4.539500 +156431 4.520500 +156432 4.557500 +156433 4.544500 +156461 2.433000 +156462 7.337500 +156463 3.335500 +156474 1.389000 +156475 3.912000 +156476 3.051000 +156477 6.522500 +156479 3.284000 +156480 3.376500 +156482 3.602500 +156483 6.864000 +156486 6.751000 +156487 6.751500 +156488 6.741000 +156489 6.384000 +156490 6.736000 +156491 4.511000 +156492 5.137500 +156493 6.535000 +156494 6.873500 +156495 6.867500 +156501 7.347500 +156506 4.384500 +156511 3.298000 +156512 3.033500 +156514 5.458000 +156515 5.087500 +156517 5.170500 +156518 5.173500 +156519 2.081500 +156520 3.849500 +156521 5.058000 +156522 4.150500 +156523 5.507500 +156524 6.578000 +156525 6.570500 +156526 6.556000 +156527 5.199500 +156528 2.429000 +156529 3.396000 +156533 5.177500 +156541 7.355000 +156542 4.840500 +156543 4.909500 +156545 3.360000 +156546 4.062500 +156552 0.661500 +156553 0.841000 +156560 2.045500 +156563 6.421500 +156565 6.440000 +156566 6.430500 +156567 6.441500 +156605 7.354500 +156618 2.686000 +156623 2.466500 +156624 1.656500 +156633 1.514000 +156634 5.345000 +156635 1.053500 +156637 5.329000 +156639 1.045000 +156641 5.404500 +156652 5.082000 +156658 2.896000 +156667 4.055500 +156670 3.082500 +156671 4.330500 +156672 5.225500 +156673 1.799000 +156674 2.103000 +156675 3.347500 +156676 4.865000 +156677 4.897500 +156681 2.993000 +156682 3.382000 +156683 3.389500 +156684 3.619500 +156685 1.695500 +156686 4.207000 +156688 4.502500 +156693 5.421000 +156694 5.208500 +156695 6.197000 +156696 4.718000 +156698 5.595000 +156715 6.769500 +156721 7.319000 +156723 8.074500 +156724 8.064000 +156726 8.066000 +156727 8.173000 +156728 7.480500 +156729 8.050500 +156733 7.575000 +156734 5.822000 +156736 7.598500 +156738 6.861500 +156739 5.673000 +156741 3.378000 +156742 7.611000 +156745 6.623500 +156746 7.102500 +156747 5.351000 +156748 6.988000 +156752 4.246000 +156754 5.514000 +156755 5.499500 +156756 6.375000 +156757 6.503500 +156758 6.585500 +156759 6.419000 +156760 6.742500 +156761 6.453000 +156764 6.585000 +156765 6.651000 +156766 7.248000 +156767 0.922000 +156768 7.239000 +156769 7.135000 +156770 7.072500 +156778 7.283500 +156784 4.625500 +156787 1.648000 +156788 1.924500 +156790 5.034500 +156791 3.793000 +156792 3.253500 +156794 3.954500 +156795 4.693000 +156796 3.383000 +156798 5.177000 +156804 2.535500 +156806 2.951000 +156816 3.562000 +156818 2.984500 +156819 6.266000 +156821 2.533500 +156823 6.265000 +156824 2.280000 +156825 3.262500 +156826 6.090500 +156827 5.070000 +156828 2.932000 +156829 3.272500 +156880 7.341000 +156881 7.060000 +156887 6.843000 +156890 6.400000 +156895 3.336000 +156899 6.789500 +156900 3.718500 +156901 6.034000 +156902 3.267000 +156903 5.378500 +156904 4.111000 +156905 7.402000 +156906 6.309000 +156907 7.489000 +156908 7.317500 +156909 7.024500 +156910 5.676500 +156922 2.023600 +156923 2.018600 +156924 2.222200 +156926 3.496800 +156927 2.788000 +156928 2.768600 +156929 2.772600 +156930 2.756000 +156931 2.768200 +156932 2.748600 +156933 2.756800 +156934 2.840600 +156935 3.055600 +156936 2.676800 +156937 2.935000 +156938 2.958200 +156939 3.140400 +156940 2.688400 +156941 2.951200 +156942 2.882600 +156943 3.899400 +156944 2.369400 +156945 2.369600 +156946 2.396200 +156947 2.399000 +156948 2.481600 +156949 2.374200 +156950 2.423400 +156951 2.466800 +157031 1.042500 +157032 1.001000 +157033 0.998500 +157034 0.989000 +157035 0.981500 +157036 0.753000 +157040 4.848000 +157045 4.618500 +157085 5.211500 +157086 5.138500 +157092 5.211500 +157107 4.508000 +157139 3.391000 +157141 5.218000 +157142 5.516000 +157165 1.566500 +157166 1.583500 +157167 1.612500 +157168 5.740500 +157170 3.230000 +157171 3.042500 +157172 1.125000 +157173 1.129500 +157174 2.615500 +157175 3.633500 +157176 2.849000 +157177 3.062500 +157178 3.214500 +157179 2.680500 +157180 3.317000 +157187 2.136500 +157190 4.720500 +157191 4.451500 +157200 8.159000 +157201 8.730500 +157204 7.727500 +157205 6.960000 +157206 9.015500 +157207 7.867000 +157208 8.078000 +157209 7.899500 +157210 7.966500 +157211 7.733000 +157212 7.536500 +157213 7.648500 +157214 8.038000 +157215 9.007500 +157217 6.639000 +157228 7.310000 +157240 4.316500 +157242 5.478000 +157244 3.942500 +157245 1.795500 +157246 5.003500 +157247 3.730500 +157249 3.455500 +157257 7.341000 +157282 7.324500 +157283 0.687000 +157297 5.938000 +157299 4.719500 +157300 4.273500 +157301 4.510500 +157302 4.458500 +157305 5.375000 +157306 6.379000 +157307 6.012500 +157309 4.045000 +157310 5.583000 +157311 5.440500 +157312 5.735500 +157315 5.536500 +157316 6.004000 +157317 5.817000 +157319 6.669000 +157320 6.357500 +157322 5.617500 +157368 5.070000 +157371 6.053500 +157375 6.016000 +157380 3.132000 +157383 2.710000 +157384 3.183500 +157385 3.136500 +157386 3.334500 +157388 1.781500 +157389 3.170000 +157390 2.355000 +157392 2.832500 +157393 2.924000 +157394 2.205000 +157395 3.473000 +157398 5.826500 +157403 5.330000 +157405 4.617500 +157406 1.704500 +157419 5.875500 +157421 5.679500 +157422 5.419000 +157423 6.044000 +157425 4.726500 +157426 4.925500 +157427 4.937000 +157430 5.324500 +157434 6.543500 +157441 0.503500 +157442 0.628500 +157443 0.624000 +157444 3.600000 +157445 3.064500 +157446 3.010000 +157447 2.817000 +157448 4.095000 +157449 3.906000 +157450 2.480000 +157451 2.944000 +157452 2.374000 +157453 3.098000 +157454 3.264500 +157455 3.256000 +157456 2.901000 +157457 3.646000 +157459 3.071000 +157460 3.836500 +157461 7.057500 +157462 4.664500 +157463 2.606500 +157465 2.590500 +157466 2.499000 +157467 2.776500 +157468 2.772500 +157469 2.487000 +157470 3.137500 +157472 2.692500 +157473 4.051500 +157480 7.318000 +157481 3.867500 +157491 3.426500 +157492 5.290500 +157493 4.373000 +157497 5.499000 +157517 7.311500 +157522 5.470500 +157526 2.063500 +157531 2.526500 +157532 5.508000 +157533 5.845500 +157538 6.062500 +157539 5.426000 +157540 6.329000 +157541 5.742500 +157543 5.704500 +157544 2.627000 +157546 5.319000 +157561 4.913500 +157563 1.078500 +157569 1.200000 +157570 1.202500 +157581 0.740500 +157582 0.699500 +157583 1.282000 +157653 5.113000 +157659 5.161000 +157660 7.350000 +157662 4.769500 +157663 7.184500 +157670 4.656000 +157688 2.962000 +157689 4.342500 +157690 2.899500 +157691 2.963000 +157692 4.576500 +157693 3.481500 +157695 3.390500 +157696 4.721500 +157697 4.718500 +157698 4.700000 +157701 2.168000 +157702 4.474000 +157703 3.043500 +157711 4.551500 +157712 4.583500 +157721 7.311500 +157722 0.779500 +157775 7.341500 +157776 1.672500 +157778 1.342500 +157779 1.931000 +157780 6.586500 +157781 6.578000 +157786 3.900000 +157788 6.030000 +157789 6.746500 +157790 4.587500 +157791 6.685500 +157792 6.760500 +157794 7.085500 +157795 6.763500 +157796 6.782000 +157797 7.102500 +157798 7.104500 +157799 5.941000 +157800 7.079000 +157803 5.314000 +157810 6.036500 +157812 1.303000 +157813 7.056500 +157815 3.662000 +157816 4.782500 +157818 6.613500 +157820 4.703000 +157821 5.028000 +157822 2.807000 +157823 5.836500 +157824 4.367500 +157825 3.807000 +157826 2.365000 +157827 7.048000 +157828 3.314500 +157829 2.987000 +157830 3.083000 +157831 2.591500 +157832 2.874000 +157833 2.376000 +157834 2.919500 +157835 5.736000 +157836 7.062500 +157837 4.708000 +157838 5.490500 +157839 5.575500 +157840 3.800000 +157841 7.054500 +157842 4.218000 +157843 2.770000 +157844 3.123500 +157845 2.730500 +157846 0.616500 +157847 0.585000 +157848 0.587000 +157849 0.592000 +157852 0.583000 +157856 7.369000 +157857 5.106000 +157859 6.054000 +157860 5.508000 +157861 3.534500 +157862 7.053000 +157863 4.131500 +157865 4.343000 +157866 2.636500 +157867 4.471000 +157869 5.535000 +157870 3.546500 +157871 3.840500 +157873 3.640500 +157874 3.587500 +157875 6.759500 +157876 6.834500 +157877 6.761500 +157878 5.906500 +157879 7.094000 +157881 6.331500 +157882 5.390000 +157883 5.499500 +157884 5.411000 +157885 6.749500 +157886 5.234000 +157887 7.183500 +157888 6.537000 +157889 6.763000 +157890 7.338500 +157897 6.128500 +157929 0.729000 +157946 5.387500 +157969 7.025500 +157973 7.031500 +157977 7.033000 +157979 7.034500 +157980 7.032500 +157981 7.034000 +157982 7.032500 +157984 7.028500 +157986 7.027500 +157995 7.054000 +157998 7.056500 +157999 7.053000 +158000 7.070000 +158001 7.073500 +158003 7.054000 +158004 7.067000 +158005 5.513500 +158007 4.085000 +158009 5.813500 +158010 5.879000 +158014 3.506500 +158015 4.184000 +158018 5.646500 +158020 5.574000 +158022 3.909000 +158023 5.187500 +158029 6.959500 +158034 4.369500 +158071 6.670500 +158073 6.496500 +158074 6.633000 +158075 6.621500 +158077 6.574000 +158078 4.977500 +158079 5.678000 +158080 6.597000 +158081 6.374000 +158082 6.580500 +158083 6.571000 +158084 6.364000 +158089 6.266500 +158090 6.297500 +158091 6.271000 +158096 6.567500 +158097 5.571000 +158098 5.802000 +158099 6.439000 +158100 6.488000 +158101 6.252500 +158102 5.633500 +158103 6.309500 +158105 6.546000 +158107 6.331500 +158112 6.442000 +158113 5.380500 +158114 6.457500 +158116 6.464000 +158117 4.959000 +158118 4.965500 +158119 4.283000 +158120 6.429000 +158122 6.644000 +158123 6.403500 +158124 5.760500 +158125 6.452500 +158130 7.302000 +158136 4.644000 +158137 4.954000 +158139 4.513500 +158159 4.891000 +158174 7.335000 +158175 2.018500 +158176 2.030500 +158177 2.032000 +158178 2.024500 +158179 2.030500 +158180 2.032000 +158181 2.027500 +158182 2.027500 +158183 2.032000 +158184 2.029000 +158185 2.022000 +158186 2.025500 +158187 2.028500 +158188 2.030000 +158189 2.030500 +158190 2.033000 +158191 2.034000 +158192 2.035500 +158193 2.028000 +158194 2.029500 +158195 2.028000 +158196 2.029000 +158197 2.031500 +158198 2.021000 +158199 2.031500 +158200 2.032000 +158201 2.032000 +158202 2.021000 +158203 2.028000 +158204 2.030000 +158205 2.030500 +158206 2.031000 +158207 2.026500 +158208 2.027000 +158291 6.024000 +158292 2.035500 +158296 4.296000 +158297 5.667000 +158299 3.444000 +158300 3.134500 +158301 3.664500 +158302 4.536500 +158303 5.910000 +158328 5.703000 +158334 5.895000 +158335 6.656500 +158336 6.663500 +158338 0.998500 +158339 0.993000 +158340 0.998000 +158341 0.982000 +158342 1.014500 +158344 4.259500 +158348 6.355500 +158350 6.071000 +158351 6.355500 +158352 6.650500 +158353 6.638500 +158354 6.646500 +158357 6.655000 +158358 6.670500 +158365 4.258000 +158367 4.464500 +158368 3.262500 +158369 4.375500 +158373 3.021000 +158378 2.444500 +158379 5.014000 +158382 2.997000 +158383 4.141500 +158384 2.793500 +158387 2.686500 +158389 4.410000 +158390 4.658500 +158398 5.186000 +158399 5.187000 +158401 4.093500 +158402 1.840500 +158407 5.224000 +158408 5.229000 +158409 5.281000 +158410 1.883000 +158418 5.189500 +158419 4.901500 +158420 5.273500 +158422 3.366000 +158424 2.804000 +158425 1.519500 +158427 4.349500 +158429 5.349000 +158430 4.992500 +158431 3.175000 +158432 4.161500 +158433 4.979000 +158434 5.015500 +158439 4.757000 +158443 5.546000 +158447 5.002500 +158448 4.999000 +158451 4.936000 +158452 4.937500 +158453 4.937000 +158456 5.162000 +158460 5.101500 +158461 5.064500 +158462 5.098500 +158463 5.093000 +158464 1.881500 +158465 4.510000 +158466 4.247000 +158472 5.016500 +158473 4.406000 +158474 4.951500 +158475 5.009000 +158476 5.002500 +158477 5.006000 +158478 4.981500 +158479 4.998500 +158480 5.020500 +158481 5.016500 +158482 5.019000 +158483 5.014000 +158484 4.995500 +158485 4.985500 +158486 5.009000 +158487 5.036500 +158488 5.002000 +158489 5.039500 +158490 4.988500 +158491 5.026500 +158492 4.960000 +158493 5.034000 +158494 4.968500 +158495 5.031000 +158497 4.420500 +158498 4.463000 +158503 3.610500 +158510 5.885500 +158511 5.997500 +158516 1.084000 +158523 7.025000 +158524 7.020500 +158528 7.021500 +158536 7.026500 +158552 6.929000 +158575 7.795500 +158581 5.896500 +158588 7.339500 +158614 5.489500 +158622 5.262500 +158623 5.252500 +158625 5.264000 +158630 7.343500 +158632 4.658500 +158639 3.825000 +158650 2.793500 +158652 6.941000 +158653 7.347500 +158671 7.310500 +158740 0.861000 +158753 5.127500 +158759 7.343000 +158765 1.092000 +158773 0.905500 +158785 5.459000 +158786 5.454000 +158788 5.843500 +158798 7.347000 +158799 5.428500 +158801 6.248000 +158802 6.358000 +158807 6.197500 +158808 6.299000 +158809 6.355000 +158810 6.269500 +158812 5.337500 +158813 6.125000 +158814 6.137000 +158815 5.501000 +158820 3.327500 +158826 3.473000 +158840 0.909500 +158841 1.484000 +158842 3.819500 +158843 2.011500 +158844 2.010000 +158853 1.204000 +158857 1.201000 +158863 1.201500 +158870 1.208500 +158884 1.860000 +158887 1.335000 +158889 0.752500 +158890 1.316500 +158891 1.218000 +158892 2.228500 +158893 1.870500 +158910 7.350500 +158928 3.785000 +158930 4.145500 +158931 4.026000 +158932 4.575000 +158935 4.366000 +158937 4.131000 +158938 4.614500 +158941 4.033500 +158990 5.259500 +158998 5.286500 +158999 4.403500 +159000 5.284500 +159022 7.013500 +159023 7.015500 +159025 6.021500 +159029 3.414500 +159030 3.512000 +159031 4.094000 +159032 3.785000 +159035 2.350000 +159036 2.212500 +159037 2.730000 +159038 2.864500 +159039 2.007500 +159040 2.007500 +159041 2.008500 +159042 2.006500 +159043 2.007500 +159044 2.008500 +159045 2.008500 +159046 2.008000 +159047 2.006500 +159048 2.008000 +159049 2.007000 +159050 2.008000 +159051 2.006500 +159052 2.006500 +159053 2.006000 +159054 2.006500 +159055 2.007500 +159056 2.006000 +159057 2.006000 +159058 2.008500 +159059 2.007000 +159060 2.006000 +159061 2.007000 +159112 4.897000 +159143 1.686000 +159144 4.027000 +159145 2.551500 +159146 2.677000 +159148 4.599500 +159151 5.619500 +159152 3.019500 +159153 3.181000 +159154 1.620000 +159155 3.289500 +159156 3.643500 +159157 3.112000 +159158 4.457500 +159159 4.368500 +159160 1.454000 +159162 1.350500 +159169 1.741000 +159171 3.269500 +159185 5.455000 +159186 3.887000 +159195 5.880500 +159196 6.048500 +159203 5.935500 +159204 6.658500 +159205 5.978000 +159206 4.884000 +159208 6.659000 +159209 5.712500 +159212 5.776500 +159213 5.088500 +159214 7.037500 +159215 4.572500 +159216 5.414500 +159217 5.733000 +159218 5.766500 +159220 5.682000 +159221 5.684500 +159223 5.736500 +159224 5.750000 +159225 5.790000 +159226 5.736500 +159227 5.956000 +159228 7.042000 +159230 7.036000 +159241 7.347500 +159246 4.377500 +159247 4.356000 +159252 4.364500 +159259 4.385000 +159260 4.379500 +159266 6.477000 +159285 5.616000 +159317 1.474500 +159326 6.488000 +159327 6.428000 +159328 6.442000 +159329 6.201000 +159330 4.125500 +159331 4.798000 +159332 6.414500 +159333 5.344500 +159334 4.402500 +159335 4.214500 +159336 2.464500 +159337 6.671000 +159338 6.567500 +159340 0.806500 +159341 1.242000 +159342 0.878000 +159343 6.346500 +159344 5.046500 +159345 6.542000 +159346 6.525000 +159347 6.534500 +159348 6.518000 +159350 5.350000 +159356 4.326500 +159364 4.018500 +159368 5.794500 +159369 1.625500 +159370 5.708500 +159372 5.959500 +159373 3.833000 +159374 1.137000 +159378 3.876500 +159380 3.755000 +159381 4.294000 +159382 3.983000 +159383 3.869500 +159384 3.498500 +159396 5.545000 +159397 5.534500 +159399 3.225500 +159403 4.577000 +159404 7.368000 +159405 3.649500 +159406 7.248500 +159407 7.267500 +159408 7.238500 +159409 3.139500 +159410 3.123500 +159411 2.723000 +159412 2.581500 +159413 7.253500 +159414 7.107000 +159415 7.058000 +159417 7.123000 +159418 6.107500 +159419 6.289500 +159420 2.808000 +159421 7.075000 +159422 7.276000 +159424 5.254500 +159425 2.692000 +159426 6.070500 +159427 2.553000 +159428 2.402500 +159429 6.540000 +159430 2.645500 +159431 2.638500 +159433 2.711500 +159434 6.005000 +159435 6.495000 +159436 6.559500 +159439 6.002500 +159440 5.063000 +159441 6.157500 +159459 3.958000 +159466 4.555000 +159481 2.624000 +159483 2.010500 +159484 2.011000 +159485 2.007500 +159486 2.007500 +159487 2.009500 +159488 2.008000 +159489 2.009000 +159490 2.010000 +159491 2.010000 +159492 2.007500 +159493 2.010000 +159494 2.010500 +159495 2.010000 +159496 2.558000 +159497 2.011500 +159498 2.011500 +159499 2.009500 +159500 2.009500 +159501 2.010500 +159502 2.010500 +159503 2.011000 +159504 2.008000 +159505 1.507500 +159506 1.507500 +159507 1.509000 +159508 1.507500 +159509 1.511500 +159510 1.507500 +159511 1.510500 +159512 1.508000 +159513 1.506500 +159514 1.508500 +159515 1.508000 +159516 1.511500 +159517 1.509000 +159518 1.511000 +159519 1.508500 +159520 1.508000 +159521 1.509000 +159522 1.507500 +159523 1.508000 +159524 1.507500 +159538 5.562500 +159542 5.418500 +159544 5.454000 +159545 5.283000 +159546 5.087000 +159550 2.722000 +159551 5.410000 +159553 4.960000 +159562 5.394500 +159567 1.530500 +159568 2.449000 +159570 1.458500 +159579 2.232500 +159586 4.318500 +159587 3.809500 +159590 5.473000 +159593 4.268000 +159595 4.970000 +159604 5.095000 +159606 5.075500 +159610 2.734500 +159612 3.495500 +159615 2.796000 +159616 3.312500 +159617 3.409000 +159618 3.439500 +159619 3.000000 +159620 1.789500 +159622 3.011500 +159633 6.333500 +159635 6.232000 +159677 1.206000 +159678 1.250500 +159679 1.196000 +159681 1.197000 +159683 1.199000 +159687 1.200000 +159689 1.198000 +159692 1.197000 +159693 1.198000 +159695 1.198500 +159696 1.197500 +159697 1.197500 +159698 1.198000 +159699 1.198000 +159702 1.199500 +159705 1.197500 +159709 7.341000 +159734 6.576000 +159739 5.597500 +159743 6.064500 +159744 6.535000 +159745 1.688500 +159746 1.088500 +159747 2.654000 +159755 5.345000 +159756 2.509000 +159757 3.778500 +159758 6.158000 +159759 5.078000 +159761 4.380000 +159762 7.051000 +159763 3.548500 +159764 3.712000 +159765 4.078500 +159766 5.226000 +159767 4.567000 +159768 3.859500 +159769 5.622000 +159778 7.328000 +159779 4.374500 +159780 3.329500 +159781 3.315500 +159782 3.539000 +159783 1.978000 +159784 7.051000 +159785 4.409500 +159786 2.515000 +159787 2.308000 +159788 2.433000 +159789 5.509500 +159797 5.049000 +159798 2.599000 +159799 5.630000 +159800 5.838500 +159801 4.436500 +159802 4.630000 +159803 4.506500 +159804 2.254000 +159805 7.043500 +159806 7.043000 +159809 7.048500 +159812 4.179500 +159818 7.314000 +159819 5.454000 +159820 5.259000 +159821 4.170000 +159822 5.086500 +159825 3.901500 +159826 7.071500 +159830 5.966500 +159833 4.393000 +159834 5.175500 +159982 4.927500 +159985 6.492500 +159988 5.088000 +159996 5.149500 +160003 2.408000 +160004 3.594500 +160012 5.972500 +160018 3.802000 +160024 3.962000 +160025 3.298500 +160026 3.739500 +160036 5.383000 +160039 2.215000 +160041 3.450500 +160044 1.968500 +160045 4.365500 +160046 1.604500 +160056 2.846500 +160057 4.165500 +160071 1.154500 +160076 3.961000 +160085 1.717500 +160093 7.050000 +160094 3.656000 +160095 4.062500 +160096 7.049500 +160098 4.478000 +160100 5.432000 +160101 3.526500 +160105 5.141500 +160106 2.738500 +160107 5.586500 +160108 2.803500 +160117 6.246500 +160121 3.163000 +160128 5.496000 +160129 2.394000 +160130 6.142000 +160137 6.193500 +160140 2.972500 +160142 2.087500 +160143 2.504500 +160144 2.062000 +160146 2.994500 +160148 4.706500 +160149 5.124000 +160151 7.059000 +160152 6.527000 +160153 5.030000 +160158 4.466000 +160160 3.735500 +160164 3.739000 +160165 3.186000 +160166 4.486000 +160167 3.877500 +160168 6.107500 +160170 4.810000 +160172 3.705500 +160175 0.674000 +160176 0.609500 +160181 4.127500 +160185 7.356000 +160186 4.110500 +160187 4.590500 +160189 4.811500 +160190 4.341500 +160191 4.273500 +160192 4.439500 +160193 4.063000 +160194 3.305000 +160195 2.857500 +160196 3.362000 +160197 4.238000 +160198 4.539500 +160199 4.072000 +160200 3.974500 +160201 3.918000 +160202 3.649500 +160203 3.864000 +160204 4.122500 +160205 3.820500 +160206 4.084000 +160207 3.491000 +160208 4.191000 +160209 4.222000 +160210 3.908000 +160211 3.011000 +160212 3.011000 +160213 3.012000 +160214 3.707000 +160215 3.539500 +160216 3.806500 +160217 3.877000 +160218 4.222000 +160219 3.774500 +160220 4.428500 +160221 3.363500 +160222 4.049000 +160223 4.099000 +160224 2.511000 +160226 3.742000 +160237 7.312500 +160261 1.568000 +160263 1.838000 +160264 1.772000 +160265 1.764500 +160281 7.309000 +160284 5.418000 +160289 4.879500 +160293 2.130000 +160299 5.250000 +160300 5.404500 +160302 4.197000 +160305 4.424500 +160307 5.033500 +160320 3.862500 +160321 4.611500 +160322 5.229000 +160325 4.444000 +160337 3.958500 +160338 2.825500 +160352 3.644000 +160353 5.527500 +160359 6.040500 +160360 5.989000 +160361 3.112000 +160363 5.889000 +160364 3.120000 +160366 3.139500 +160368 6.037000 +160373 5.630500 +160375 5.106000 +160376 4.613000 +160377 4.609000 +160378 0.821000 +160379 4.630500 +160380 4.604000 +160381 4.618000 +160382 4.600000 +160402 6.625500 +160403 6.412500 +160440 5.251000 +160448 4.923000 +160462 5.571000 +160483 7.352500 +160495 5.933500 +160496 5.851000 +160501 3.254000 +160506 5.983000 +160507 5.839000 +160512 6.052000 +160517 7.343000 +160519 5.094000 +160530 5.737500 +160531 5.865500 +160532 5.520000 +160535 1.321000 +160536 5.320500 +160537 5.381500 +160539 2.923000 +160540 5.319500 +160541 5.353500 +160543 5.453500 +160559 5.488500 +160560 5.330000 +160561 5.143000 +160587 6.266000 +160588 6.346000 +160589 6.964500 +160591 6.890000 +160592 6.532000 +160594 6.078500 +160599 7.353500 +160600 5.578500 +160601 4.099500 +160603 3.016500 +160604 3.022000 +160605 3.193500 +160606 3.011000 +160607 3.010000 +160608 3.007500 +160609 3.006000 +160610 3.018500 +160613 3.006500 +160614 3.005000 +160615 3.007000 +160616 3.006000 +160617 0.522000 +160618 3.007000 +160619 3.006500 +160620 3.007000 +160621 3.012500 +160622 3.014000 +160623 0.536500 +160624 3.009000 +160625 3.009000 +160626 3.007000 +160627 3.009000 +160631 7.347000 +160634 7.011000 +160636 5.856000 +160637 5.836500 +160639 5.841000 +160641 5.872500 +160642 5.884000 +160643 5.876500 +160644 5.842500 +160648 5.815000 +160649 5.822500 +160650 5.836000 +160651 5.788500 +160653 5.867000 +160654 6.095000 +160655 6.080000 +160656 5.947000 +160658 6.053000 +160659 6.095500 +160664 6.862000 +160668 7.028000 +160671 7.027000 +160676 4.834000 +160678 7.028500 +160679 7.028000 +160699 5.103500 +160701 5.903000 +160709 5.184000 +160722 5.731000 +160775 6.080000 +160778 5.494500 +160779 5.501500 +160780 5.485500 +160781 5.478000 +160782 5.508000 +160783 5.513000 +160816 3.418000 +160818 2.882500 +160820 5.337500 +160821 4.846000 +160822 5.771000 +160824 5.571500 +160825 5.577500 +160826 5.774500 +160827 3.767500 +160828 0.704000 +160830 4.287000 +160831 4.559500 +160832 5.920000 +160833 3.085000 +160834 5.772000 +160835 5.959500 +160838 4.363500 +160839 3.828500 +160849 7.322000 +160851 6.285000 +160853 5.825500 +160855 4.298500 +160857 2.026000 +160858 4.824000 +160859 2.014000 +160860 6.174500 +160861 6.254500 +160864 6.228000 +160865 6.396500 +160866 6.114000 +160868 6.074000 +160870 6.188500 +160871 6.093500 +160873 6.066500 +160874 6.014500 +160875 6.253500 +160877 6.111000 +160878 4.564500 +160879 5.881000 +160880 6.136000 +160882 4.169000 +160883 4.144000 +160885 4.515000 +160890 6.730500 +160891 5.187500 +160892 4.303000 +160893 6.149500 +160896 6.173500 +160898 3.414500 +160909 3.592000 +160916 5.431500 +160922 1.860000 +160946 6.456500 +160960 7.314500 +160978 1.412500 +160979 4.810000 +160993 7.345000 +160998 5.053000 +161000 5.519500 +161001 4.880500 +161010 5.089500 +161014 4.759000 +161025 7.346000 +161026 4.231500 +161029 2.746500 +161031 2.597500 +161045 0.947000 +161046 0.664000 +161047 1.945000 +161048 1.459000 +161063 7.347000 +161068 7.556500 +161069 7.558000 +161070 7.551000 +161071 7.535000 +161072 7.550000 +161073 7.549500 +161074 7.549000 +161075 7.546500 +161076 7.550000 +161077 7.552000 +161082 4.514500 +161101 7.364000 +161112 7.425500 +161113 7.425000 +161120 0.615500 +161126 1.693500 +161128 2.307500 +161130 1.079500 +161131 0.846500 +161135 7.346000 +161180 1.015000 +161181 1.049000 +161182 1.000500 +161183 0.933500 +161184 0.941500 +161185 0.956000 +161186 0.962000 +161187 0.980500 +161189 0.924500 +161190 1.089000 +161191 1.134500 +161192 0.705000 +161193 0.666500 +161194 0.880500 +161195 0.915500 +161200 6.159000 +161201 6.208000 +161204 5.519000 +161205 5.523500 +161206 5.516500 +161207 6.404500 +161213 6.877000 +161214 6.873500 +161217 6.948000 +161224 6.426000 +161225 6.154500 +161226 4.424000 +161227 4.093000 +161228 5.093500 +161229 6.576000 +161230 6.581000 +161231 6.369500 +161232 6.347500 +161234 5.824000 +161235 6.752500 +161236 6.759500 +161237 4.150000 +161238 5.120500 +161239 6.739500 +161240 2.416000 +161241 3.320500 +161242 2.480500 +161243 3.922500 +161244 3.432000 +161245 2.801500 +161246 3.659000 +161247 2.230000 +161278 1.612500 +161279 2.095000 +161281 1.867000 +161282 1.812500 +161288 3.351500 +161289 3.703000 +161290 2.996000 +161293 3.793500 +161296 3.673500 +161297 4.343500 +161298 4.947000 +161299 4.783000 +161301 3.238000 +161302 3.318500 +161303 0.742000 +161315 3.925000 +161316 1.724500 +161318 2.189500 +161323 3.730000 +161324 5.036000 +161325 4.676500 +161326 4.466000 +161327 1.402000 +161328 3.183500 +161330 2.550000 +161332 2.558500 +161334 1.440000 +161337 3.329500 +161338 3.007500 +161339 1.661500 +161340 1.699000 +161341 2.141000 +161355 5.066000 +161362 2.476000 +161363 0.995000 +161365 1.991500 +161366 1.458500 +161368 2.189000 +161369 1.511000 +161375 2.591500 +161396 4.154000 +161419 2.649000 +161427 4.784500 +161428 3.578500 +161429 3.703000 +161430 3.599000 +161431 3.822500 +161432 3.137500 +161433 4.113500 +161434 4.133000 +161435 3.824000 +161436 5.145000 +161439 4.232500 +161440 5.085000 +161441 4.385500 +161442 3.885500 +161443 3.646500 +161445 4.224000 +161451 3.729500 +161457 3.587000 +161490 7.335500 +161534 7.337500 +161542 6.190000 +161543 6.191000 +161544 6.670500 +161547 6.690000 +161563 4.329000 +161569 3.466500 +161570 3.384000 +161571 2.606000 +161572 2.358500 +161573 2.753500 +161574 2.377000 +161575 3.294000 +161585 5.259000 +161589 4.469500 +161594 3.126000 +161606 3.428000 +161616 5.235000 +161617 4.955000 +161632 0.544000 +161634 3.065000 +161715 5.089500 +162163 3.803500 +162207 6.852500 +162210 6.454500 +162211 1.811000 +162218 6.847000 +162223 4.340500 +162239 5.985000 +162259 5.907000 +162270 7.032500 +162271 3.704500 +162272 5.885500 +162273 4.920500 +162274 2.494500 +162275 3.556500 +162277 2.724000 +162286 5.509000 +162288 5.658000 +162289 0.500000 +162290 4.042500 +162295 6.190500 +162310 2.130000 +162311 4.893000 +162315 3.630000 +162332 7.079500 +162334 6.824000 +162338 0.639500 +162339 0.598500 +162340 4.311000 +162341 7.221500 +162342 4.369500 +162345 5.817500 +162353 0.580500 +162354 4.899000 +162398 6.832000 +162401 2.818500 +162417 3.907000 +162418 1.654000 +162420 5.535000 +162421 4.187000 +162423 2.235500 +162427 4.824000 +162428 3.952500 +162429 4.004500 +162430 4.028000 +162432 4.229000 +162433 4.088000 +162438 7.077500 +162440 7.060500 +162456 4.227500 +162457 0.944500 +162458 4.905500 +162459 5.249500 +162460 4.875500 +162461 3.842500 +162462 1.456000 +162463 4.722000 +162465 5.057000 +162466 5.172500 +162467 5.353000 +162468 5.305500 +162469 5.184000 +162470 5.251500 +162482 7.098500 +162483 3.872500 +162484 4.057000 +162485 4.227500 +162486 3.942500 +162487 4.224500 +162488 4.115500 +162490 4.353000 +162491 4.046000 +162492 7.045500 +162493 7.702500 +162496 7.036500 +162497 8.017000 +162498 7.488000 +162519 7.136000 +162538 4.283500 +162539 4.516500 +162541 4.184500 +162542 4.789500 +162544 4.868500 +162545 5.614500 +162547 3.295000 +162553 6.429500 +162554 6.459000 +162555 6.443500 +162692 3.395000 +162694 3.518500 +162705 6.948500 +162714 1.483000 +162720 6.087000 +162721 6.161000 +162726 5.552000 +162741 6.961500 +162776 7.079000 +162791 4.969000 +162792 4.509000 +162794 4.138500 +162806 2.216500 +162808 2.995000 +162809 1.811500 +162810 5.950000 +162816 4.587500 +162817 4.062500 +162818 4.742000 +162819 2.504500 +162820 4.420000 +162821 5.628500 +162822 3.282500 +162823 4.473500 +162824 2.506500 +162825 4.911000 +162826 5.418500 +162827 3.974500 +162828 5.847500 +162829 3.968000 +162830 5.418500 +162831 4.335000 +162832 4.499000 +162833 1.481000 +162834 4.371500 +162835 4.704500 +162836 4.371500 +162837 4.997000 +162838 3.747000 +162839 5.981500 +162840 3.006000 +162841 3.006500 +162842 3.007500 +162843 4.414500 +162844 3.005000 +162845 3.007500 +162901 7.105000 +162902 7.093500 +162903 7.077500 +162909 1.194500 +162935 4.299500 +162936 3.121500 +162937 1.503000 +162945 5.776500 +162951 5.635000 +162952 5.232500 +162956 5.158000 +162957 5.413000 +162958 5.504000 +162961 5.444500 +162974 2.651000 +162975 2.148500 +162976 3.473500 +162978 3.404000 +162979 4.324000 +162980 3.277500 +162981 3.821000 +162982 2.557000 +162983 3.307000 +162984 3.102000 +162985 3.208000 +162986 3.078000 +162987 3.242500 +162988 2.530500 +162990 4.987500 +162991 3.614000 +162992 3.717000 +162993 3.593500 +162994 3.497000 +162995 4.440500 +162998 5.423500 +162999 7.052000 +163006 2.630500 +163020 3.576500 +163022 3.630000 +163023 4.083500 +163024 3.434500 +163025 4.670000 +163026 4.136500 +163027 3.861500 +163028 5.264000 +163029 4.081000 +163030 3.987500 +163031 3.238000 +163033 4.076000 +163034 3.251000 +163035 4.413000 +163036 5.108000 +163037 6.149500 +163038 4.063500 +163039 4.816000 +163040 4.884000 +163041 5.094500 +163042 4.593000 +163043 4.724500 +163044 4.558500 +163045 5.070500 +163046 6.004500 +163047 4.823500 +163048 6.235500 +163049 6.048000 +163050 6.372500 +163051 6.276500 +163052 3.168000 +163053 2.436000 +163054 4.591000 +163055 5.146500 +163056 2.929500 +163057 3.003000 +163058 5.014500 +163059 4.276000 +163060 3.051500 +163061 5.011000 +163062 5.219000 +163075 2.888500 +163076 3.210500 +163099 7.375500 +163132 5.142500 +163133 4.976000 +163134 5.204500 +163135 5.208500 +163137 2.694500 +163143 7.371500 +163154 4.339000 +163159 0.695500 +163199 1.905500 +163200 5.804500 +163203 5.783000 +163207 5.723500 +163209 5.676500 +163210 5.453500 +163211 2.899000 +163212 5.638500 +163224 7.724500 +163226 7.723500 +163227 7.723500 +163235 7.366500 +163239 5.099500 +163241 5.081500 +163242 5.160500 +163243 5.156500 +163245 5.165500 +163246 5.183000 +163247 5.150000 +163248 5.163500 +163254 5.131000 +163255 5.525500 +163257 5.337000 +163258 5.379000 +163259 5.387500 +163275 6.209500 +163276 5.613000 +163277 2.571500 +163278 2.578000 +163279 2.506500 +163280 2.550000 +163281 2.490000 +163282 2.507000 +163283 2.506500 +163284 7.049500 +163286 7.052000 +163287 4.836000 +163303 7.370000 +163306 5.439000 +163307 2.322500 +163308 2.311500 +163309 4.628500 +163311 3.011500 +163312 3.649000 +163314 4.675500 +163319 2.566500 +163320 2.955000 +163321 2.988500 +163322 3.898500 +163323 2.626000 +163324 2.804500 +163325 3.322500 +163326 3.090000 +163327 4.209500 +163433 5.495000 +163434 5.477000 +163460 5.146500 +163461 5.100000 +163462 0.899500 +163474 5.405500 +163516 5.468000 +163522 3.972000 +163523 5.182000 +163530 4.519000 +163595 1.164500 +163601 6.631000 +163602 6.513000 +163603 6.519000 +163604 6.544500 +163605 1.665000 +163611 6.108000 +163648 4.259000 +163649 4.174000 +163654 5.901500 +163699 5.333000 +163700 6.054000 +163701 6.060500 +163702 1.857000 +163704 5.971500 +163705 0.992000 +163709 0.952000 +163714 7.040500 +163720 5.167000 +163735 6.103500 +163741 5.547000 +163743 7.020000 +163749 6.878000 +163751 5.739500 +163760 5.521500 +163761 5.499000 +163762 5.462000 +163773 5.476000 +163781 5.151500 +163783 4.856000 +163784 2.335000 +163785 1.764500 +163801 5.670500 +163803 5.655500 +163805 5.647000 +163806 5.777000 +163807 5.645500 +163809 5.652500 +163810 5.649500 +163812 5.242500 +163817 6.897500 +163820 5.961500 +163822 7.022500 +163824 7.022000 +163827 5.946500 +163836 7.020000 +164029 0.705000 +164037 4.956000 +164074 6.820500 +164083 7.133000 +164115 5.265000 +164126 7.089500 +164128 5.904500 +164129 6.013500 +164130 6.033500 +164131 6.042000 +164132 0.935000 +164133 5.414500 +164150 7.094500 +164168 5.355000 +164175 6.126500 +164185 7.135000 +164204 7.068500 +164219 5.969500 +164223 7.237500 +164224 4.082500 +164225 0.507000 +164226 4.827000 +164227 6.800000 +164238 4.235500 +164243 5.399000 +164247 5.004500 +164273 1.866500 +164274 5.456000 +164276 5.701500 +164277 5.030000 +164278 5.160500 +164279 6.109000 +164280 4.175500 +164281 5.646000 +164286 2.441000 +164290 6.393000 +164291 3.336000 +164292 5.688000 +164293 6.082500 +164294 5.329000 +164299 7.119500 +164300 4.873000 +164301 4.157000 +164302 6.034000 +164303 2.234500 +164305 3.460500 +164306 2.650500 +164307 3.972500 +164308 2.425000 +164313 2.428500 +164314 2.940500 +164317 2.989500 +164319 7.091000 +164321 5.542500 +164323 1.835500 +164324 2.415000 +164330 6.149500 +164331 4.768500 +164332 6.197000 +164333 4.571000 +164334 6.206000 +164335 6.229500 +164338 4.828000 +164347 1.199500 +164350 0.891000 +164351 3.069500 +164352 4.792000 +164355 3.292500 +164360 5.414500 +164361 4.194000 +164363 2.162500 +164364 1.865500 +164365 3.876500 +164367 2.340500 +164368 2.996500 +164369 3.570500 +164370 2.696000 +164372 5.018000 +164373 4.814000 +164375 3.798500 +164384 1.284500 +164391 1.309000 +164398 1.198000 +164400 1.197500 +164401 1.315500 +164403 1.198000 +164424 7.365000 +164438 5.362000 +164439 3.107000 +164444 2.427500 +164445 2.428000 +164446 4.209000 +164448 4.228000 +164450 3.401000 +164451 4.642500 +164453 4.479500 +164462 6.944500 +164469 3.866000 +164471 3.865500 +164472 3.315000 +164474 3.217500 +164491 4.812000 +164514 4.133000 +164516 4.199000 +164528 3.989500 +164538 4.035500 +164546 7.374500 +164547 6.380500 +164548 2.308500 +164550 5.724000 +164551 3.615000 +164553 3.807000 +164554 2.161000 +164555 3.660500 +164557 3.769500 +164558 3.870000 +164560 4.546000 +164561 5.051000 +164562 3.644500 +164563 3.725000 +164564 4.484500 +164566 5.585500 +164571 5.018500 +164574 4.823000 +164579 4.579500 +164580 3.763500 +164581 4.939500 +164582 4.342500 +164583 4.304500 +164584 4.860000 +164630 6.561500 +164631 6.566500 +164632 6.564500 +164633 6.563000 +164634 6.563500 +164635 6.553500 +164636 6.549000 +164637 6.565000 +164638 6.560500 +164639 6.562500 +164640 6.566000 +164641 6.561500 +164643 6.563500 +164646 4.531500 +164667 2.741000 +164668 4.419000 +164669 3.984000 +164670 3.567000 +164671 3.528000 +164672 3.584000 +164673 3.180000 +164674 4.377000 +164676 3.690000 +164677 4.875500 +164678 3.868500 +164679 3.655500 +164680 4.567500 +164682 4.668000 +164686 1.676500 +164694 6.557500 +164695 6.562000 +164696 6.561500 +164697 6.565500 +164698 6.535000 +164699 6.552500 +164700 6.540000 +164701 6.541500 +164702 6.551500 +164703 6.552000 +164707 6.551500 +164708 6.548500 +164709 6.552000 +164710 6.550000 +164711 6.544000 +164713 1.557000 +164716 2.470500 +164717 3.601000 +164723 6.406000 +164773 7.375500 +164777 7.379000 +164786 6.873500 +164794 6.724000 +164796 6.831500 +164802 6.358000 +164803 5.856000 +164804 6.286500 +164805 6.139000 +164807 6.498500 +164808 6.876000 +164809 6.871500 +164810 6.869500 +164811 4.803500 +164812 4.064000 +164815 7.040500 +164816 7.052000 +164833 7.036500 +164838 7.037000 +164842 7.039000 +164849 4.576000 +164850 7.032500 +164863 2.160500 +164869 5.294000 +164871 4.356000 +164872 4.624000 +164876 5.534500 +164881 5.271000 +164882 5.209500 +164885 0.655500 +164894 5.211500 +164904 5.062000 +164905 5.311500 +164906 5.156000 +164914 7.035500 +164915 7.035500 +164916 7.033000 +164917 7.032500 +164918 7.032500 +164919 7.030500 +164920 7.036000 +164921 7.036000 +164922 7.037500 +164923 7.039500 +164924 7.039000 +164925 7.034000 +164932 5.853500 +164933 3.359000 +164934 3.189500 +164935 5.359000 +164937 5.831500 +164938 5.376500 +164939 5.706500 +164942 3.588500 +164943 3.093000 +164944 2.283500 +164945 2.168000 +164946 2.140000 +164947 4.128500 +164948 4.135000 +164949 4.306500 +164950 5.551500 +164959 3.721500 +164961 3.172000 +164962 2.961500 +164963 3.134000 +164964 2.931000 +164971 7.354500 +164972 3.860000 +164976 3.424000 +164983 2.791000 +164984 3.487000 +164989 3.408000 +164990 3.747500 +164992 3.107500 +164994 1.744000 +164995 1.725500 +165000 2.307500 +165001 2.701500 +165002 2.949000 +165003 2.043500 +165004 4.216500 +165011 6.454500 +165050 6.391000 +165092 4.538500 +165093 4.920500 +165103 6.180000 +165104 6.378000 +165105 6.207000 +165106 6.872500 +165107 6.875500 +165108 5.901500 +165109 3.856500 +165110 4.365000 +165111 3.900500 +165112 1.231000 +165121 1.053500 +165123 7.040000 +165126 8.916000 +165127 8.972000 +165128 8.984000 +165132 8.950000 +165133 8.396000 +165136 8.339000 +165139 7.276500 +165140 6.272500 +165144 4.433000 +165150 5.239000 +165152 4.884500 +165154 4.885000 +165174 5.856500 +165187 3.380500 +165189 2.951000 +165191 4.084000 +165197 5.426500 +165198 3.287500 +165199 3.300500 +165200 3.792500 +165201 3.688500 +165206 6.123000 +165207 5.733500 +165208 5.257000 +165224 2.531500 +165226 6.163500 +165227 6.786000 +165233 7.371000 +165235 2.986500 +165236 4.640000 +165237 3.310000 +165238 2.744000 +165239 2.481000 +165242 2.804000 +165243 2.974000 +165244 2.743000 +165246 5.050500 +165247 3.581500 +165248 4.692000 +165249 3.925000 +165250 2.879000 +165251 6.871500 +165253 3.742500 +165257 5.182500 +165259 4.922000 +165261 4.965000 +165263 4.330000 +165265 5.007000 +165271 5.787000 +165272 5.678000 +165273 5.653500 +165274 5.649500 +165279 6.363000 +165282 6.835500 +165294 5.336500 +165348 4.656000 +165355 4.547000 +165363 1.081000 +165364 1.197500 +165371 1.198000 +165374 1.200000 +165384 1.199500 +165385 1.198000 +165399 3.424000 +165401 5.448000 +165404 5.337500 +165409 3.687500 +165411 5.443000 +165412 5.618500 +165414 5.594000 +165416 5.617500 +165417 5.523000 +165418 4.084000 +165421 3.356500 +165453 1.280500 +165459 7.364000 +165490 4.580000 +165493 3.722000 +165496 3.489000 +165503 5.512500 +165511 3.082500 +165524 7.367000 +165525 0.944000 +165526 2.261000 +165527 2.494000 +165528 2.425000 +165529 2.392500 +165531 2.319000 +165532 2.696000 +165533 2.266500 +165534 3.569000 +165535 1.770000 +165536 1.952500 +165539 2.699000 +165540 4.215000 +165542 3.246000 +165543 2.529500 +165544 2.959000 +165669 5.548500 +165670 6.205000 +165671 4.875000 +165672 4.755000 +165673 5.222000 +165676 4.819000 +165677 7.097500 +165678 7.077500 +165680 3.824500 +165682 3.008000 +165686 5.157500 +165688 6.094000 +165691 0.557500 +165693 1.280000 +165694 1.305000 +165703 0.749000 +165709 1.670000 +165711 2.224000 +165712 1.755000 +165715 4.545500 +165716 2.814000 +165717 1.084000 +165718 1.398000 +165722 2.276000 +165724 3.409500 +165726 5.542500 +165727 2.317000 +165728 3.328000 +165729 1.471500 +165731 2.415500 +165811 0.701500 +165812 0.709000 +165814 8.524500 +165815 8.773500 +165816 8.364000 +165817 3.328000 +165819 8.182500 +165821 6.182000 +165822 8.939000 +165823 3.673500 +165824 8.283500 +165825 8.637000 +165826 8.103500 +165827 7.650000 +165828 0.850500 +165830 0.728500 +165831 1.035000 +165832 1.229500 +165833 8.264000 +165834 5.796500 +165835 6.416000 +165836 5.846000 +165837 5.023000 +165838 8.247500 +165845 0.824000 +165848 0.794500 +165850 0.804000 +165851 5.665000 +165855 7.023000 +165856 7.021000 +165858 7.061500 +165883 1.541000 +165884 3.719500 +165886 1.993500 +165899 3.652500 +165900 1.141500 +165901 3.660500 +165902 0.577000 +165903 1.003000 +165907 3.622000 +165908 3.657000 +165909 4.088500 +165968 6.133500 +165969 5.141500 +165970 6.136500 +165978 3.706500 +165979 4.392000 +165981 6.874500 +165985 7.376000 +165986 6.873500 +165987 4.666000 +165988 6.130000 +165989 5.341500 +165990 4.721000 +165991 6.128500 +165992 4.528500 +165993 4.597000 +165994 4.504000 +165995 4.066000 +165996 4.524000 +165997 5.130000 +165998 3.553500 +165999 5.178000 +166000 6.137000 +166001 6.136000 +166002 3.245000 +166003 3.091500 +166004 6.140500 +166005 6.594000 +166006 3.079500 +166007 6.813000 +166011 1.464500 +166012 3.739500 +166017 7.375500 +166018 3.170500 +166019 3.104000 +166020 3.202000 +166022 5.481500 +166024 5.252000 +166028 4.048500 +166038 5.532000 +166039 5.195000 +166047 3.737500 +166053 5.434000 +166072 5.713000 +166076 1.704000 +166079 5.437500 +166082 5.560000 +166088 5.480500 +166095 3.881000 +166096 5.476500 +166097 5.689000 +166098 5.769000 +166116 6.058000 +166119 5.500000 +166121 5.339000 +166125 5.386500 +166128 3.336500 +166139 7.070000 +166152 5.840000 +166153 7.009000 +166154 7.013500 +166155 7.009500 +166157 7.010000 +166159 5.882000 +166160 5.853000 +166161 5.843000 +166164 5.887000 +166170 4.815500 +166178 3.918500 +166179 5.433500 +166184 3.407000 +166185 5.114500 +166186 5.107000 +166187 2.835500 +166188 5.043500 +166190 5.060000 +166191 5.076000 +166192 5.114000 +166254 5.385000 +166255 5.945500 +166257 2.609500 +166258 2.743500 +166260 3.786500 +166261 6.075000 +166262 4.591500 +166281 0.872000 +166282 1.856000 +166284 1.852500 +166287 1.040500 +166288 1.258500 +166289 1.092000 +166290 1.300500 +166291 0.908000 +166292 1.206000 +166293 1.034500 +166294 0.791000 +166295 1.102500 +166299 1.181500 +166300 5.736000 +166301 2.237000 +166302 2.138500 +166304 2.433500 +166305 5.557000 +166306 2.899000 +166307 5.523000 +166311 1.607000 +166312 1.560500 +166314 2.694500 +166315 1.480500 +166318 0.977500 +166319 1.014000 +166320 1.962000 +166321 2.454000 +166322 1.771000 +166323 2.741500 +166324 2.657000 +166325 1.983500 +166328 4.104500 +166329 1.742500 +166330 1.990000 +166334 6.963500 +166342 5.222000 +166344 4.802500 +166363 4.637000 +166364 3.482000 +166365 5.297500 +166395 1.394500 +166413 4.430000 +166414 4.922500 +166418 4.658000 +166422 2.659500 +166435 5.569500 +166436 5.445000 +166437 2.427500 +166438 5.051500 +166439 4.867500 +166440 5.329000 +166441 3.928000 +166443 4.451000 +166445 3.787000 +166446 4.699000 +166447 4.701000 +166448 5.217000 +166449 4.478000 +166450 4.461000 +166451 2.443500 +166452 4.280000 +166453 2.278500 +166454 4.837500 +166456 4.992500 +166457 4.171000 +166458 5.322500 +166459 5.606500 +166460 4.747500 +166461 5.549000 +166462 3.526000 +166463 3.614000 +166464 3.506500 +166465 3.790000 +166466 3.688500 +166467 4.269500 +166468 3.757000 +166469 3.656000 +166470 3.508500 +166493 4.079000 +166500 4.080500 +166502 4.956000 +166503 4.033000 +166527 2.580500 +166550 5.122000 +166551 4.000500 +166552 3.457500 +166553 4.474000 +166554 3.895000 +166555 5.035500 +166559 3.257000 +166560 3.396500 +166562 4.293000 +166563 4.003000 +166564 5.055500 +166565 4.187500 +166571 3.029000 +166575 5.315500 +166576 6.179000 +166594 0.553000 +166599 5.618500 +166601 2.505000 +166605 5.589500 +166607 5.651500 +166610 5.418000 +166611 5.363500 +166616 5.621000 +166622 5.638500 +166627 4.192500 +166629 2.826500 +166630 4.170000 +166631 4.205500 +166632 4.198000 +166633 4.170000 +166635 4.146000 +166636 4.151000 +166637 4.147500 +166638 4.153500 +166639 4.152000 +166640 4.159000 +166641 3.278500 +166642 4.150500 +166643 4.151500 +166644 5.156500 +166645 2.218500 +166646 5.202000 +166648 5.156500 +166649 5.168500 +166650 5.163000 +166651 5.172500 +166652 5.170000 +166653 5.174000 +166654 5.160500 +166655 5.161000 +166656 5.165500 +166657 5.162500 +166658 5.166500 +166659 5.166000 +166660 5.174000 +166671 1.659500 +166672 1.727500 +166673 1.632500 +166674 1.788000 +166675 1.692000 +166677 1.915000 +166681 4.836500 +166682 4.692000 +166684 5.514000 +166686 3.270500 +166687 4.721000 +166688 5.213000 +166689 5.935500 +166691 4.508000 +166692 5.251000 +166712 1.034000 +166713 1.150000 +166714 1.040000 +166715 5.345000 +166719 1.923500 +166729 5.508500 +166738 3.744000 +166741 1.511500 +166742 3.308000 +166776 1.074000 +166778 1.088500 +166779 0.894500 +166780 0.912500 +166781 0.966500 +166783 1.571500 +166784 2.023500 +166792 3.830500 +166796 1.505500 +166799 1.393000 +166800 2.193000 +166801 3.007500 +166802 3.758000 +166811 5.160000 +166815 5.113500 +166816 4.729000 +166817 2.436500 +166818 3.124000 +166819 4.611000 +166820 4.022000 +166821 4.340500 +166822 4.279500 +166823 4.161500 +166824 4.267000 +166825 4.304000 +166826 4.482500 +166827 2.559500 +166828 4.965000 +166829 3.224000 +166830 4.550500 +166831 4.716500 +166832 5.033000 +166840 4.949000 +166855 4.367000 +166856 5.820500 +166859 5.542500 +166860 5.404500 +166861 4.097500 +166862 4.806500 +166863 4.617000 +166867 3.153000 +166869 4.392000 +166870 4.478500 +166871 1.504500 +166872 4.060000 +166873 5.047000 +166874 4.759000 +166875 4.478000 +166876 5.145500 +166877 2.637000 +166878 4.153000 +166879 3.578000 +166880 5.237000 +166881 5.431500 +166882 4.975000 +166884 5.129500 +166885 5.227000 +166886 5.299000 +166887 5.671500 +166888 5.345500 +166890 6.104500 +166891 5.377500 +166892 4.732500 +166913 5.838500 +166914 4.631500 +166915 5.392000 +166918 5.389500 +166919 5.366500 +166927 1.065500 +166928 1.742500 +166929 4.976000 +166930 5.046000 +166931 4.051500 +166932 4.228500 +166933 4.225500 +166934 4.400500 +166935 4.478000 +166936 4.230500 +166937 4.190500 +166938 3.778000 +166939 4.098500 +166942 2.899000 +166943 4.016000 +166944 5.286500 +166945 5.955000 +166950 6.116500 +166952 5.292500 +166953 5.259000 +167063 0.673000 +167085 2.085500 +167086 5.535500 +167094 0.660000 +167096 0.741500 +167103 0.736500 +167105 0.789500 +167106 0.783500 +167107 0.787500 +167108 0.723000 +167118 2.798000 +167133 1.693000 +167146 4.320500 +167150 5.478500 +167163 4.934000 +167189 2.112500 +167224 0.789500 +167245 5.410000 +167269 2.186000 +167278 5.405000 +167282 5.119000 +167283 5.136500 +167304 5.651000 +167312 5.370500 +167316 5.685000 +167323 2.984500 +167333 3.190000 +167334 1.819500 +167335 2.169500 +167336 1.749000 +167337 5.923500 +167338 6.031500 +167339 2.289000 +167340 3.335500 +167341 3.055500 +167342 5.238500 +167343 2.486000 +167344 2.552500 +167345 1.991500 +167346 2.029500 +167347 5.761500 +167352 5.717500 +167359 5.725000 +167363 1.167000 +167407 5.777500 +167415 4.738000 +167429 4.494000 +167436 0.886500 +167438 3.657500 +167442 0.734500 +167445 4.861000 +167446 0.689500 +167447 1.046000 +167448 1.219000 +167450 4.776000 +167452 5.180500 +167454 0.991500 +167456 1.013000 +167458 3.967500 +167459 1.044500 +167461 1.095500 +167462 1.143500 +167464 4.364000 +167465 4.265000 +167469 2.654500 +167470 1.177000 +167471 1.076500 +167472 4.538500 +167476 4.870000 +167477 1.109000 +167478 1.092000 +167479 1.026500 +167480 5.073500 +167487 2.159000 +167488 5.269000 +167492 7.088000 +167494 3.478500 +167496 6.479500 +167497 6.663000 +167498 6.497500 +167500 5.281500 +167501 6.870000 +167503 4.615500 +167505 5.835500 +167550 2.418500 +167556 5.325500 +167557 5.263000 +167558 5.222000 +167559 4.382500 +167560 0.883000 +167561 3.428500 +167562 3.831500 +167564 2.640000 +167565 2.804500 +167566 2.733000 +167586 2.967000 +167587 5.072500 +167588 5.124500 +167590 5.076000 +167591 5.206000 +167592 1.541500 +167593 5.521000 +167594 1.891000 +167595 3.250500 +167596 2.214000 +167597 2.118000 +167598 1.967500 +167599 2.018000 +167610 1.717000 +167611 2.536500 +167612 4.774500 +167613 0.619500 +167614 4.767000 +167615 4.079500 +167616 1.237000 +167617 4.100000 +167619 4.916000 +167621 4.590000 +167622 2.778000 +168442 0.847500 +168443 0.626500 +168445 2.576500 +168446 1.405500 +168447 1.776500 +168448 2.082500 +168449 1.831000 +168483 0.672000 +168485 0.662500 +168486 0.820500 +168489 0.714500 +168492 2.338000 +168493 2.316000 +168494 2.341000 +168495 4.422000 +168501 4.676500 +168502 6.203500 +168503 5.755500 +168505 4.525000 +168506 5.711000 +168507 6.390500 +168508 6.281000 +168509 6.097000 +168510 3.070000 +168511 6.675500 +168512 2.955000 +168513 6.267000 +168514 0.940500 +168515 7.020000 +168517 2.807000 +168518 7.039500 +168520 6.258000 +168521 6.160500 +168522 6.134000 +168527 7.124000 +168528 6.484500 +168531 6.278000 +168532 6.127500 +168533 7.128000 +168538 6.271000 +168539 7.039000 +168540 6.139500 +168541 6.132000 +168542 6.280500 +168543 7.031000 +168545 6.141500 +168546 6.151500 +168547 6.142000 +168549 7.032000 +168550 6.307500 +168552 7.019500 +168553 6.141500 +168555 6.704000 From 5c7e7213effca14c36a2fa981de5ff2f5856ac71 Mon Sep 17 00:00:00 2001 From: +Julian Kates-Harbeck Date: Thu, 4 May 2017 19:40:59 -0700 Subject: [PATCH 018/744] debugged preprocessing and normalization. Had to deal with occasional nan data values, only a single profile being returned for a shot (at a single time) (which transposes the data and looks like a time series vs. rho as the new t). Other issues also fixed --- data/get_mdsplus_data.py | 3 ++- data/signals.py | 12 ++++++------ plasma/conf.py | 5 ++++- plasma/models/data.py | 16 ++++++++++++++-- plasma/preprocessor/normalize.py | 11 +++++++++-- plasma/preprocessor/preprocess.py | 1 + plasma/primitives/shots.py | 7 ++----- plasma/utils/processing.py | 2 -- 8 files changed, 38 insertions(+), 19 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index d043b291..54e0d982 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -12,7 +12,8 @@ print(signals) # shot_list_files = plasma.conf.jet_full -shot_list_files = plasma.conf.d3d_full +#shot_list_files = plasma.conf.d3d_full +shot_list_files = plasma.conf.d3d_1000 download_all_shot_numbers(prepath,save_path,shot_list_files,signals) diff --git a/data/signals.py b/data/signals.py index d76918ab..9c158b4d 100644 --- a/data/signals.py +++ b/data/signals.py @@ -37,9 +37,9 @@ def fetch_d3d_data(signal_path,shot,c=None): # ## Retrieve Data t0 = time.time() found = False - xdata = [0] + xdata = np.array([0]) ydata = None - data = [0] + data = np.array([0]) # Retrieve data from MDSplus (thin) #first try, retrieve directly from tree andsignal @@ -76,17 +76,17 @@ def get_units(str): # Retrieve data from PTDATA if node not found if not found: #print("not in full path {}".format(signal)) - data = c.get('_s = ptdata2("'+signal+'",'+str(shot)+')') + data = c.get('_s = ptdata2("'+signal+'",'+str(shot)+')').data() if len(data) != 1: - xdata = c.get('dim_of(_s)') + xdata = c.get('dim_of(_s)').data() rank = 1 found = True # Retrieve data from Pseudo-pointname if not in ptdata if not found: #print("not in PTDATA {}".format(signal)) - data = c.get('_s = pseudo("'+signal+'",'+str(shot)+')') + data = c.get('_s = pseudo("'+signal+'",'+str(shot)+')').data() if len(data) != 1: - xdata = c.get('dim_of(_s)') + xdata = c.get('dim_of(_s)').data() rank = 1 found = True #this means the signal wasn't found diff --git a/plasma/conf.py b/plasma/conf.py index 96e302f2..22f40ece 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -30,12 +30,15 @@ jet_iterlike_wall = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') jet_full = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') +d3d_10000 = ShotListFiles(d3d,shot_list_dir,['d3d_clear_10000.txt','d3d_disrupt_10000.txt'],'d3d data 10000 ND and D shots') +d3d_1000 = ShotListFiles(d3d,shot_list_dir,['d3d_clear_1000.txt','d3d_disrupt_1000.txt'],'d3d data 1000 ND and D shots') +d3d_100 = ShotListFiles(d3d,shot_list_dir,['d3d_clear_100.txt','d3d_disrupt_100.txt'],'d3d data 100 ND and D shots') d3d_full = ShotListFiles(d3d,shot_list_dir,['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') d3d_jb_full = ShotListFiles(d3d,shot_list_dir,['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files'] = [d3d_1000]#[jet_carbon_wall] conf['paths']['shot_files_test'] = []#[jet_iterlike_wall] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] diff --git a/plasma/models/data.py b/plasma/models/data.py index c1d7c4c6..e805b7af 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -60,12 +60,17 @@ def load_data(self,prepath,shot): sig = sig[region,:] #make sure shot is not garbage data - if (np.max(sig) == 0.0 and np.min(sig) == 0.0) or len(t) <= 1: + if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): if self.is_ip: print('shot {} has no current'.format(shot.number)) else: print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) return None,None,False + + #make sure data doesn't contain nan + if np.any(np.isnan(t)) or np.any(np.isnan(sig)): + print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) + return None,None,False return t,sig,True @@ -124,10 +129,17 @@ def load_data(self,prepath,shot): remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) t = data[1:,0] sig = data[1:,1:] + if sig.shape[1] < 2: + print('Signal {}, shot {} should be profile but has only one channel. Possibly only one profile fit was run for the duration of the shot and was transposed during downloading. Need at least 2.'.format(self.description,shot.number)) + return None,None,False if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) return None,None,False + if np.any(np.isnan(t)) or np.any(np.isnan(sig)): + print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) + return None,None,False + timesteps = len(t) sig_interp = np.zeros((timesteps,self.num_channels)) for i in range(timesteps): @@ -158,7 +170,7 @@ def fetch_data(self,signal,shot_num,c): time,data = create_missing_value_filler() print(e) sys.stdout.flush() - time = np.array(time) + signal.get_causal_shift(self) + time = np.array(time) + 1e-3*signal.get_causal_shift(self) return time,np.array(data),mapping,success def __eq__(self,other): diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 50b99508..1d2494a4 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -66,7 +66,7 @@ def train(self): shot_files = conf['paths']['shot_files']# + conf['paths']['shot_files_test'] # shot_list_dir = conf['paths']['shot_list_dir'] use_shots = max(400,conf['data']['use_shots']) - return self.train_on_files(shot_list_dir,shot_files,use_shots) + return self.train_on_files(shot_files,use_shots) def train_on_files(self,shot_files,use_shots): @@ -85,6 +85,7 @@ def train_on_files(self,shot_files,use_shots): start_time = time.time() for (i,stats) in enumerate(pool.imap_unordered(self.train_on_single_shot,shot_list_picked)): + #for (i,stats) in enumerate(map(self.train_on_single_shot,shot_list_picked)): self.incorporate_stats(stats) sys.stdout.write('\r' + '{}/{}'.format(i,len(shot_list_picked))) @@ -120,7 +121,11 @@ def train_on_single_shot(self,shot): stats = self.extract_stats(shot) shot.make_light() return stats - + + def ensure_save_directory(self): + prepath = os.path.dirname(self.path) + if not os.path.exists(prepath): + os.makedirs(prepath) def previously_saved_stats(self): return os.path.isfile(self.path) @@ -187,6 +192,7 @@ def save_stats(self): # standard_deviations = dat['standard_deviations'] # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] + self.ensure_save_directory() np.savez(self.path,means = self.means,stds = self.stds, num_processed=self.num_processed,num_disruptive=self.num_disruptive) print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) @@ -287,6 +293,7 @@ def save_stats(self): # standard_deviations = dat['standard_deviations'] # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] + self.ensure_save_directory() np.savez(self.path,minimums = self.minimums,maximums = self.maximums, num_processed=self.num_processed,num_disruptive=self.num_disruptive) print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index e8acb247..51bdf895 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -85,6 +85,7 @@ def preprocess_from_files(self,shot_files,use_shots): sys.stdout.write('\r{}/{}'.format(i,len(shot_list_picked))) used_shots.append_if_valid(shot) + pool.close() pool.join() print('Finished Preprocessing {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index af1cf248..9468d3f2 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -315,6 +315,7 @@ def get_signals_and_times_from_file(self,conf): signal_arrays.append(sig) time_arrays.append(t) assert(t_max > t_min or not valid) + if self.is_disruptive: t_max = self.t_disrupt assert(self.t_disrupt <= t_max or not valid) @@ -330,11 +331,7 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) tr = 0 for (i,signal) in enumerate(self.signals): - sys.stdout.write(time_arrays[i].shape.__str__()) - sys.stdout.write(signal_arrays[i].shape.__str__()) tr,sigr = cut_and_resample_signal(time_arrays[i],signal_arrays[i],t_min,t_max,dt) - sys.stdout.write('success') - sys.stdout.flush() signals_dict[signal] = sigr ttd = self.convert_to_ttd(tr,conf) @@ -375,7 +372,7 @@ def restore(self,prepath,light=False): self.signals_dict = None self.ttd = None else: - self.signals_dict = dat['signals_dict'] + self.signals_dict = dat['signals_dict'][()] self.ttd = dat['ttd'] def previously_saved(self,prepath): diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index 5904e1fb..d63ae185 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -40,8 +40,6 @@ def resample_signal(t,sig,tmin,tmax,dt): def cut_signal(t,sig,tmin,tmax): mask = np.logical_and(t >= tmin, t <= tmax) - sys.stdout.write((tmin,tmax).__str__()) - sys.stdout.flush() return t[mask],sig[mask,:] def cut_and_resample_signal(t,sig,tmin,tmax,dt): From e8effbbabbfc1d51db85a9e8a337936474120649 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 5 May 2017 06:53:58 -0400 Subject: [PATCH 019/744] implemented convolutional layers. Only works in Tensorflow. Theano has a bug with the Conv1D layers. Tensorflow only supports basic indexing so this imposes restrictions on where in the signal list the 1D signals are. --- examples/conf.yaml | 9 +-- examples/learn.py | 1 + plasma/conf.py | 6 +- plasma/models/builder.py | 108 +++++++++++++++++++++++++++--------- plasma/models/runner.py | 3 +- plasma/primitives/shots.py | 6 +- plasma/utils/downloading.py | 5 +- 7 files changed, 101 insertions(+), 37 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e1d1bec3..395b225d 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,7 +3,7 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. # for example tigress/alexeys -fs_path: '/cscratch/share/frnn' #'/tigress' +fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' target: 'hinge' paths: @@ -79,19 +79,20 @@ model: size_conv_filters: 3 num_conv_layers: 2 pool_size: 2 + dense_size: 16 #have not found a difference yet optimizer: 'adam' clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00005 + lr: 0.001 #0.00005 lr_decay: 0.9 stateful: True return_sequences: True dropout_prob: 0.3 #only relevant if we want to do mpi training. The number of steps with a single replica warmup_steps: 0 - backend: 'theano' + backend: 'tensorflow' #'theano' #'tensorflow' #theano training: as_array_of_shots: True @@ -103,7 +104,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 3 + num_epochs: 5 use_mock_data: False data_parallel: False callbacks: diff --git a/examples/learn.py b/examples/learn.py index 4278ecf8..3b604641 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -89,6 +89,7 @@ ##################################################### ######################TRAINING####################### ##################################################### +#train(conf,shot_list_train,loader) p = old_mp.Process(target = train,args=(conf,shot_list_train,loader)) p.start() p.join() diff --git a/plasma/conf.py b/plasma/conf.py index 22f40ece..0ff0e557 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -17,14 +17,16 @@ from data.signals import *#d3d,jet,d3d_signals,jet_signals,all_signals #signals conf['paths']['all_signals'] = d3d_signals -conf['paths']['use_signals'] = [ip,lm,etemp_profile] +#make sure all 1D signals appear last! +conf['paths']['use_signals'] = [ip,lm,edens_profile,etemp_profile] #machines conf['paths']['all_machines'] = all_machines #shot lists #shot_list_dir = conf['paths']['shot_list_dir'] -shot_list_dir = '/cscratch/share/frnn/shot_lists/' +#shot_list_dir = '/cscratch/share/frnn/shot_lists/' +shot_list_dir = '/tigress/jk7/shot_lists/' jet_carbon_wall = ShotListFiles(jet,shot_list_dir,['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') jet_iterlike_wall = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 41cc0dc7..5cbdd0ce 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -1,7 +1,9 @@ -from keras.models import Sequential -from keras.layers.core import Dense, Activation, Dropout +import keras +from keras.models import Sequential, Model +from keras.layers import Input +from keras.layers.core import Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute from keras.layers.recurrent import LSTM, SimpleRNN -from keras.layers.convolutional import Conv1D +from keras.layers.convolutional import Convolution1D from keras.layers.pooling import MaxPooling1D from keras.utils.data_utils import get_file from keras.layers.wrappers import TimeDistributed @@ -9,10 +11,12 @@ from keras.callbacks import Callback from keras.optimizers import * from keras.regularizers import l1,l2,l1_l2 +import keras.backend as K import dill import re import os +import numpy as np from copy import deepcopy class LossHistory(Callback): @@ -36,23 +40,29 @@ def get_unique_id(self): return unique_id def get_0D_1D_indices(self): + #make sure all 1D indices are contiguous in the end! use_signals = self.conf['paths']['use_signals'] indices_0d = [] indices_1d = [] num_0D = 0 num_1D = 0 curr_idx = 0 + is_1D_region = use_signals[0].num_channels > 1#do we have any 1D indices? for sig in use_signals: num_channels = sig.num_channels indices = range(curr_idx,curr_idx+num_channels) if num_channels > 1: indices_1d += indices num_1D += 1 + is_1D_region = True else: + assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" assert(num_channels == 1) indices_0d += indices num_0D += 1 - return np.array(indices_0d), np.array(indices_1d),num_0D,num_1D + is_1D_region = False + curr_idx += num_channels + return np.array(indices_0d).astype(np.int32), np.array(indices_1d).astype(np.int32),num_0D,num_1D def build_model(self,predict,custom_batch_size=None): @@ -93,6 +103,7 @@ def build_model(self,predict,custom_batch_size=None): num_conv_layers = model_conf['num_conv_layers'] size_conv_filters = model_conf['size_conv_filters'] pool_size = model_conf['pool_size'] + dense_size = model_conf['dense_size'] # num_signals = conf['data']['num_signals'] @@ -117,37 +128,71 @@ def build_model(self,predict,custom_batch_size=None): exit(1) batch_input_shape=(batch_size,length, num_signals) + batch_shape_non_temporal=(batch_size,num_signals) indices_0d,indices_1d,num_0D,num_1D = self.get_0D_1D_indices() def slicer(x,indices): - return x[:,:,indices] + return x[:,indices] def slicer_output_shape(input_shape,indices): - shape = list(input_shape) - assert len(shape) == 3 # only valid for 3D tensors - shape[-1] = len(indices) - return tuple(shape) - - x_input = Input(batch_shape=batch_input_shape) - if num_1D > 0: - x_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d)) (x_input) - x_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d)) (x_input) - - x_1D = TimeDistributed(Reshape(num_1D,len(indices_1d)/num_1D)) (x_1D) + shape_curr = list(input_shape) + assert len(shape_curr) == 2 # only valid for 3D tensors + shape_curr[-1] = len(indices) + return tuple(shape_curr) + + pre_rnn_input = Input(shape=(num_signals,)) + print(batch_shape_non_temporal) + print(batch_input_shape) + print(indices_0d) + print(indices_1d) + print(num_0D) + print(num_1D) + + if num_1D > 0: + #pre_rnn_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) + #pre_rnn_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d))(pre_rnn_input) + #idx0D_tensor = K.variable(indices_0d) + #idx1D_tensor = K.variable(indices_1d) + pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) + pre_rnn_0D = Lambda(lambda x: x[:,:len(indices_0d)],output_shape=(len(indices_0d),))(pre_rnn_input)# slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) + pre_rnn_1D = Reshape((num_1D,len(indices_1d)/num_1D)) (pre_rnn_1D) + pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) + + #pre_rnn_1D = Conv1D(num_conv_filters,size_conv_filters,padding='same',activation='relu',dilation_rate=1) (pre_rnn_1D) for i in range(model_conf['num_conv_layers']): - x_1D = TimeDistributed(Conv1D(num_conv_filters,size_conv_filters,activation='relu')) (x_1D) - x_1D = TimeDistributed(MaxPooling1D(pool_size)) (x_1D) - x_1D = TimeDistributed(Flatten()) (x_1D) - x_in = TimeDistributed(Concatenate) ([x_0D,x_1D]) - - else: - x_in = x_input - x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) - x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) + pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='same',activation='relu') (pre_rnn_1D) + pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) + pre_rnn_1D = Flatten() (pre_rnn_1D) + pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) + else: + pre_rnn = pre_rnn_input + pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + + pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) + x_input = Input(batch_shape = batch_input_shape) + x_in = TimeDistributed(pre_rnn_model) (x_input) + +# x_input = Input(batch_shape=batch_input_shape) +# if num_1D > 0: +# x_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d)) (x_input) +# x_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d)) (x_input) +# +# x_1D = TimeDistributed(Reshape((num_1D,len(indices_1d)/num_1D))) (x_1D) +# for i in range(model_conf['num_conv_layers']): +# x_1D = TimeDistributed(Conv1D(num_conv_filters,size_conv_filters,activation='relu')) (x_1D) +# x_1D = TimeDistributed(MaxPooling1D(pool_size)) (x_1D) +# x_1D = TimeDistributed(Flatten()) (x_1D) +# x_in = TimeDistributed(Concatenate) ([x_0D,x_1D]) +# +# else: +# x_in = x_input + #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) + #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) # x = TimeDistributed(Dense(2*(num_0D+num_1D))) # model.add(TimeDistributed(Dense(num_density_channels,bias=True),batch_input_shape=batch_input_shape)) for _ in range(model_conf['rnn_layers']): - x_in = rnn_model(rnn_size, return_sequences=return_sequences,batch_input_shape=batch_input_shape, + x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) x_in = Dropout(dropout_prob) (x_in) @@ -156,7 +201,13 @@ def slicer_output_shape(input_shape,indices): else: x_out = Dense(1,activation=output_activation) (x_in) model = Model(inputs=x_input,outputs=x_out) + #model.summary() model.compile(loss=loss_fn, optimizer=optimizer) + #bug with tensorflow/Keras + if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': + import tensorflow as tf + K.get_session().run(tf.global_variables_initializer()) + model.reset_states() #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output return model @@ -172,6 +223,10 @@ def get_save_path(self,epoch): unique_id = self.get_unique_id() return self.conf['paths']['model_save_path'] + 'model.{}._epoch_.{}.h5'.format(unique_id,epoch) + def ensure_save_directory(self): + prepath = self.conf['paths']['model_save_path'] + if not os.path.exists(prepath): + os.makedirs(prepath) def load_model_weights(self,model): epochs = self.get_all_saved_files() @@ -204,6 +259,7 @@ def extract_id_and_epoch_from_filename(self,filename): def get_all_saved_files(self): + self.ensure_save_directory() unique_id = self.get_unique_id() filenames = os.listdir(self.conf['paths']['model_save_path']) epochs = [] diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 966524c5..d58fe155 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -6,7 +6,8 @@ import numpy as np from itertools import imap -from hyperopt import hp, STATUS_OK +#leading to import errors: +#from hyperopt import hp, STATUS_OK #from hyperas.distributions import conditional import time diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 9468d3f2..abe5097d 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -208,7 +208,7 @@ def append_if_valid(self,shot): self.append(shot) return True else: - print('Warning: shot {} not valid, omitting'.format(shot.number)) + #print('Warning: shot {} not valid, omitting'.format(shot.number)) return False @@ -270,10 +270,10 @@ def is_disruptive_shot(self): def get_data_arrays(self,use_signals): t_array = self.ttd - signal_array = np.zeros((len(ttd),sum([sig.num_channels for sig in use_signals]))) + signal_array = np.zeros((len(t_array),sum([sig.num_channels for sig in use_signals]))) curr_idx = 0 for sig in use_signals: - signal_array[curr_idx:curr_idx+sig.num_channels] = self.signals_dict[sig] + signal_array[:,curr_idx:curr_idx+sig.num_channels] = self.signals_dict[sig] curr_idx += sig.num_channels return t_array,signal_array diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index a43d6d09..da2c8e8f 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -13,7 +13,10 @@ - handling of missing data in shots? - TEST ''' -from MDSplus import * +try: + from MDSplus import * +except ImportError: + pass #from pylab import * import numpy as np import sys From e069b3c2e3ffec65122a59900b3b71d82a3fb6c7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 5 May 2017 11:19:32 -0400 Subject: [PATCH 020/744] filtering out shots that are too short --- plasma/models/builder.py | 2 +- plasma/models/loader.py | 6 ++++++ plasma/primitives/shots.py | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 5cbdd0ce..eacf1fc7 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -160,7 +160,7 @@ def slicer_output_shape(input_shape,indices): #pre_rnn_1D = Conv1D(num_conv_filters,size_conv_filters,padding='same',activation='relu',dilation_rate=1) (pre_rnn_1D) for i in range(model_conf['num_conv_layers']): - pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='same',activation='relu') (pre_rnn_1D) + pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 9e0ff92b..6b163544 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -147,6 +147,10 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() ttd,signal = shot.get_data_arrays(use_signals) + if len(ttd) == 9: + print(ttd) + print(shot) + print(shot.number) total_length += len(ttd) signals.append(signal) @@ -195,6 +199,8 @@ def make_deterministic_patches(self,signals,results): def make_deterministic_patches_from_single_array(self,sig,res,min_len): sig_patches = [] res_patches = [] + if len(sig) <= min_len: + print('signal length: {}'.format(len(sig))) assert(min_len <= len(sig)) for start in range(0,len(sig)-min_len,min_len): sig_patches.append(sig[start:start+min_len]) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index abe5097d..bda6661c 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -315,6 +315,12 @@ def get_signals_and_times_from_file(self,conf): signal_arrays.append(sig) time_arrays.append(t) assert(t_max > t_min or not valid) + #make sure the shot is long enough. + dt = conf['data']['dt'] + if (t_max - t_min)/dt < conf['model']['length']: + print('Shot {} contains insufficient data'.format(self.number)) + valid = False + if self.is_disruptive: t_max = self.t_disrupt From 86c40c65afcbff4b54110d1ccf9c2fe05cbe89fd Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 5 May 2017 11:42:53 -0400 Subject: [PATCH 021/744] filtering out shots that are too short --- plasma/models/loader.py | 2 +- plasma/primitives/shots.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 6b163544..3d568a8b 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -147,7 +147,7 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() ttd,signal = shot.get_data_arrays(use_signals) - if len(ttd) == 9: + if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) print(shot.number) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index bda6661c..60f3f068 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -317,7 +317,7 @@ def get_signals_and_times_from_file(self,conf): assert(t_max > t_min or not valid) #make sure the shot is long enough. dt = conf['data']['dt'] - if (t_max - t_min)/dt < conf['model']['length']: + if (t_max - t_min)/dt <= (conf['model']['length']+conf['data']['T_min_warn']): print('Shot {} contains insufficient data'.format(self.number)) valid = False From e376e83d3ffd840128c15989c002cee3f28b2e57 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 5 May 2017 15:39:26 -0400 Subject: [PATCH 022/744] added better evaluation scripting, convenience script for learning without processing, and small bug fixes in preprocessing of jet data --- examples/learn.py | 10 ++- examples/learn_processed.py | 151 ++++++++++++++++++++++++++++++++++++ examples/mpi_learn.py | 12 ++- plasma/models/builder.py | 4 +- plasma/models/mpi_runner.py | 4 +- plasma/models/runner.py | 6 +- plasma/primitives/shots.py | 15 ++-- 7 files changed, 186 insertions(+), 16 deletions(-) create mode 100644 examples/learn_processed.py diff --git a/examples/learn.py b/examples/learn.py index 3b604641..d8e2c7de 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -116,8 +116,14 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) -y_prime_train,y_gold_train,disruptive_train = make_predictions_gpu(conf,shot_list_train,loader) -y_prime_test,y_gold_test,disruptive_test = make_predictions_gpu(conf,shot_list_test,loader) +y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) +y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = make_predictions_and_evaluate_gpu(conf,shot_list_test,loader) +print('=========Summary========') +print('Train Loss: {:.3e}'.format(loss_train)) +print('Train ROC: {:.4f}'.format(roc_train)) +print('Test Loss: {:.3e}'.format(loss_test)) +print('Test Loss: {:.4f}'.format(roc_test)) + disruptive_train = np.array(disruptive_train) diff --git a/examples/learn_processed.py b/examples/learn_processed.py new file mode 100644 index 00000000..f3825ac7 --- /dev/null +++ b/examples/learn_processed.py @@ -0,0 +1,151 @@ +''' +######################################################### +This file trains a deep learning model to predict +disruptions on time series data from plasma discharges. + +Dependencies: +conf.py: configuration of model,training,paths, and data +builder.py: logic to construct the ML architecture +data_processing.py: classes to handle data processing + +Author: Julian Kates-Harbeck, jkatesharbeck@g.harvard.edu + +This work was supported by the DOE CSGF program. +######################################################### +''' + +from __future__ import print_function +import datetime,time +import sys +import dill +from functools import partial + +import matplotlib +matplotlib.use('Agg') +import numpy as np +import multiprocessing as old_mp + +from plasma.conf import conf +from pprint import pprint +pprint(conf) +from plasma.primitives.shots import Shot, ShotList +from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.preprocess import Preprocessor +from plasma.models.loader import Loader +from plasma.models.runner import train, make_predictions,make_predictions_gpu + +if conf['data']['normalizer'] == 'minmax': + from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer +elif conf['data']['normalizer'] == 'meanvar': + from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer +elif conf['data']['normalizer'] == 'var': + from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer +elif conf['data']['normalizer'] == 'averagevar': + from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer +else: + print('unkown normalizer. exiting') + exit(1) + +shot_list_dir = conf['paths']['shot_list_dir'] +shot_files = conf['paths']['shot_files'] +shot_files_test = conf['paths']['shot_files_test'] +train_frac = conf['training']['train_frac'] +stateful = conf['model']['stateful'] +# if stateful: +# batch_size = conf['model']['length'] +# else: +# batch_size = conf['training']['batch_size_large'] + +np.random.seed(1) +##################################################### +####################PREPROCESSING#################### +##################################################### + +#print("preprocessing all shots",end='') +#pp = Preprocessor(conf) +#pp.clean_shot_lists() +#shot_list = pp.preprocess_all() +#sorted(shot_list) +#shot_list_train,shot_list_test = shot_list.split_train_test(conf) +#num_shots = len(shot_list_train) + len(shot_list_test) +#print("...done") + + +##################################################### +####################Normalization#################### +##################################################### + + +print("normalization",end='') +nn = Normalizer(conf) +nn.train() +loader = Loader(conf,nn) +print("...done") + +shot_list_train,shot_list_validate,shot_list_test = loader.load_shotlists(conf) + +print('Training on {} shots, testing on {} shots'.format(len(shot_list_train),len(shot_list_test))) + + +##################################################### +######################TRAINING####################### +##################################################### +#train(conf,shot_list_train,loader) + + + + +p = old_mp.Process(target = train,args=(conf,shot_list_train,loader)) +p.start() +p.join() + + +##################################################### +####################PREDICTING####################### +##################################################### + +#load last model for testing +print('saving results') +y_prime = [] +y_prime_test = [] +y_prime_train = [] + +y_gold = [] +y_gold_test = [] +y_gold_train = [] + +disruptive= [] +disruptive_train= [] +disruptive_test= [] + +# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) +# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) + +y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) +y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = make_predictions_and_evaluate_gpu(conf,shot_list_test,loader) +print('=========Summary========') +print('Train Loss: {:.3e}'.format(loss_train)) +print('Train ROC: {:.4f}'.format(roc_train)) +print('Test Loss: {:.3e}'.format(loss_test)) +print('Test Loss: {:.4f}'.format(roc_test)) + +disruptive_train = np.array(disruptive_train) +disruptive_test = np.array(disruptive_test) + +y_gold = y_gold_train + y_gold_test +y_prime = y_prime_train + y_prime_test +disruptive = np.concatenate((disruptive_train,disruptive_test)) + +shot_list.make_light() +shot_list_test.make_light() +shot_list_train.make_light() + +save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") +np.savez(conf['paths']['results_prepath']+save_str, + y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, + y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, + disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, + shot_list=shot_list,shot_list_train=shot_list_train,shot_list_test=shot_list_test, + conf = conf) + +print('finished.') diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 866c5d38..3a1c1ba4 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -83,8 +83,16 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) -y_prime_train,y_gold_train,disruptive_train = mpi_make_predictions(conf,shot_list_train,loader) -y_prime_test,y_gold_test,disruptive_test = mpi_make_predictions(conf,shot_list_test,loader) +y_prime_train,y_gold_train,disruptive_train,loss_train,roc_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) +y_prime_test,y_gold_test,disruptive_test,loss_test,roc_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader) + +print('=========Summary========') +print('Train Loss: {:.3e}'.format(loss_train)) +print('Train ROC: {:.4f}'.format(roc_train)) +print('Test Loss: {:.3e}'.format(loss_test)) +print('Test Loss: {:.4f}'.format(roc_test)) + + if task_index == 0: diff --git a/plasma/models/builder.py b/plasma/models/builder.py index eacf1fc7..e44ce62d 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -166,8 +166,8 @@ def slicer_output_shape(input_shape,indices): pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) else: pre_rnn = pre_rnn_input - pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) - pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) x_input = Input(batch_shape = batch_input_shape) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 0ea6339e..67239007 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -550,7 +550,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader): analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) loss = get_loss_from_list(y_prime,y_gold,conf['data']['target'].loss) - return roc_area,loss + return y_prime,y_gold,disruptive,roc_area,loss def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None): @@ -598,7 +598,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non specific_builder.save_model_weights(train_model,int(round(e))) epoch_logs = {} - roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) + _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) #validation_losses.append(loss) #validation_roc.append(roc_area) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index d58fe155..8421eef5 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -97,7 +97,7 @@ def train(conf,shot_list_train,loader): specific_builder.save_model_weights(train_model,e) if conf['training']['validation_frac'] > 0.0: - roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) + _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) validation_losses.append(loss) validation_roc.append(roc_area) @@ -172,7 +172,7 @@ def keras_fmin_fnct(self,space): training_losses.append(np.mean(training_losses_tmp)) specific_builder.save_model_weights(train_model,e) - roc_area,loss = make_predictions_and_evaluate_gpu(self.conf,shot_list_validate,self.loader) + _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(self.conf,shot_list_validate,self.loader) print("Epoch: {}, loss: {}, validation_losses_size: {}".format(e,loss,len(validation_losses))) validation_losses.append(loss) validation_roc.append(roc_area) @@ -340,7 +340,7 @@ def make_predictions_and_evaluate_gpu(conf,shot_list,loader): analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) loss = get_loss_from_list(y_prime,y_gold,conf['data']['target'].loss) - return roc_area,loss + return y_prime,y_gold,disruptive,roc_area,loss def make_evaluations_gpu(conf,shot_list,loader): diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 60f3f068..8968bbea 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -119,20 +119,25 @@ def split_train_test(self,conf): train_frac = conf['training']['train_frac'] shuffle_training = conf['training']['shuffle_training'] use_shots = conf['data']['use_shots'] + all_signals = conf['paths']['all_signals'] #split randomly use_shots_train = int(round(train_frac*use_shots)) use_shots_test = int(round((1-train_frac)*use_shots)) if len(shot_files_test) == 0: shot_list_train,shot_list_test = train_test_split(self.shots,train_frac,shuffle_training) - shot_numbers_train = [shot.number for shot in shot_list_train] - shot_numbers_test = [shot.number for shot in shot_list_test] #train and test list given else: - shot_numbers_train,_ = ShotList.get_multiple_shots_and_disruption_times(shot_list_dir,shot_files) - shot_numbers_test,_ = ShotList.get_multiple_shots_and_disruption_times(shot_list_dir,shot_files_test) - + shot_list_train = ShotList() + shot_list_train.load_from_shot_list_files_objects(shot_files,all_signals) + + shot_list_test = ShotList() + shot_list_test.load_from_shot_list_files_objects(shot_files_test,all_signals) + + shot_numbers_train = [shot.number for shot in shot_list_train] + shot_numbers_test = [shot.number for shot in shot_list_test] print(len(shot_numbers_train),len(shot_numbers_test)) + #make sure we only use pre-filtered valid shots shots_train = self.filter_by_number(shot_numbers_train) shots_test = self.filter_by_number(shot_numbers_test) return shots_train.random_sublist(use_shots_train),shots_test.random_sublist(use_shots_test) From ba7c7bf21bf081581af5302d7311b91871d7f7fe Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 5 May 2017 16:09:19 -0400 Subject: [PATCH 023/744] small printing bug --- examples/learn.py | 2 +- examples/learn_processed.py | 2 +- examples/mpi_learn.py | 17 +++++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/learn.py b/examples/learn.py index d8e2c7de..91c4eb77 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -122,7 +122,7 @@ print('Train Loss: {:.3e}'.format(loss_train)) print('Train ROC: {:.4f}'.format(roc_train)) print('Test Loss: {:.3e}'.format(loss_test)) -print('Test Loss: {:.4f}'.format(roc_test)) +print('Test ROC: {:.4f}'.format(roc_test)) diff --git a/examples/learn_processed.py b/examples/learn_processed.py index f3825ac7..e3f3f28c 100644 --- a/examples/learn_processed.py +++ b/examples/learn_processed.py @@ -127,7 +127,7 @@ print('Train Loss: {:.3e}'.format(loss_train)) print('Train ROC: {:.4f}'.format(roc_train)) print('Test Loss: {:.3e}'.format(loss_test)) -print('Test Loss: {:.4f}'.format(roc_test)) +print('Test ROC: {:.4f}'.format(roc_test)) disruptive_train = np.array(disruptive_train) disruptive_test = np.array(disruptive_test) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 3a1c1ba4..7c1b2154 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -83,14 +83,15 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) -y_prime_train,y_gold_train,disruptive_train,loss_train,roc_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) -y_prime_test,y_gold_test,disruptive_test,loss_test,roc_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader) - -print('=========Summary========') -print('Train Loss: {:.3e}'.format(loss_train)) -print('Train ROC: {:.4f}'.format(roc_train)) -print('Test Loss: {:.3e}'.format(loss_test)) -print('Test Loss: {:.4f}'.format(roc_test)) +y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) +y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader) + +if task_index == 0: + print('=========Summary========') + print('Train Loss: {:.3e}'.format(loss_train)) + print('Train ROC: {:.4f}'.format(roc_train)) + print('Test Loss: {:.3e}'.format(loss_test)) + print('Test ROC: {:.4f}'.format(roc_test)) From 17ad6a153a037f249dd1b9aea624ec7a661f4bc6 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 May 2017 15:08:23 -0400 Subject: [PATCH 024/744] Add tensorboard graph visualization for tensorflow backend --- plasma/models/mpi_runner.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 0ea6339e..5f18f32c 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -306,15 +306,18 @@ def build_callbacks(self,conf,callbacks_list): mode = conf['callbacks']['mode'] monitor = conf['callbacks']['monitor'] patience = conf['callbacks']['patience'] - callback_save_path = conf['paths']['callback_save_path'] + csvlog_save_path = conf['paths']['csvlog_save_path'] + tensorboard_save_path = conf['paths']['tensorboard_save_path'] callbacks_list = conf['callbacks']['list'] callbacks = [cbks.BaseLogger()] callbacks += [self.history] - callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(callback_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] + callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(csvlog_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] if "earlystop" in callbacks_list: callbacks += [cbks.EarlyStopping(patience=patience, monitor=monitor, mode=mode)] + if "tensorboard" in callbacks_list and not backend == "theano": + callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True)] if "lr_scheduler" in callbacks_list: pass From d1a024172af5164d15269253678d033510d54033 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 May 2017 15:08:48 -0400 Subject: [PATCH 025/744] Add tensorboard callbacks --- examples/conf.yaml | 1 + plasma/conf_parser.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index b3ab3a0c..a0064608 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -105,6 +105,7 @@ callbacks: mode: 'max' monitor: 'val_loss' patience: 2 + tensorboard_save_path: 'Graph' plots: #LaTeX strings for performance analysis, sorted in lists by signal_group diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 479bea18..c792ed53 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -39,7 +39,8 @@ def parameters(input_file): params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' params['paths']['results_prepath'] = output_path + '/results/' params['paths']['model_save_path'] = output_path + '/model_checkpoints/' - params['paths']['callback_save_path'] = output_path + '/callback_logs/' + params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' + params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] params['data']['num_signals'] = sum([sum([1 for predicate in subl if predicate]) for subl in signals_masks]) if params['target'] == 'hinge': From e5463697743184524a991554d076848c0ebcfa3a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 May 2017 15:16:13 -0400 Subject: [PATCH 026/744] Move tensorboard save path to paths from callbacks section in yaml --- examples/conf.yaml | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index a0064608..aa6be2b6 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -6,22 +6,7 @@ target: 'hinge' paths: shot_files: ['CWall_clear.txt','CFC_unint.txt'] shot_files_test: ['BeWall_clear.txt','ILW_unint.txt'] - signals_dirs: [['jpf/da/c2-ipla'], # Plasma Current [A] - ['jpf/da/c2-loca'], # Mode Lock Amplitude [A] - ['jpf/db/b5r-ptot>out'], #Radiated Power [W] - ['jpf/gs/bl-li Date: Fri, 12 May 2017 16:48:27 -0400 Subject: [PATCH 027/744] Add tensorboad to callback list --- examples/conf.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index aa6be2b6..a0f856eb 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -17,7 +17,7 @@ paths: 'jpf/df/g1r-lid:008']] positivity_mask: [['jpf/da/c2-ipla'], ['jpf/gs/bl-fdwdt Date: Fri, 12 May 2017 16:49:11 -0400 Subject: [PATCH 028/744] Create if not exists logic for tensorboard folder --- plasma/models/mpi_runner.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 5f18f32c..1c0fe002 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -307,6 +307,10 @@ def build_callbacks(self,conf,callbacks_list): monitor = conf['callbacks']['monitor'] patience = conf['callbacks']['patience'] csvlog_save_path = conf['paths']['csvlog_save_path'] + #CSV callback is on by default + if not os.path.exists(csvlog_save_path): + os.makedirs(csvlog_save_path) + tensorboard_save_path = conf['paths']['tensorboard_save_path'] callbacks_list = conf['callbacks']['list'] From 2be701c6bf2e171406a06fb38995a98943f654ec Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 May 2017 18:06:26 -0400 Subject: [PATCH 029/744] Add scalar summaries for the list of quantities monitored --- plasma/models/mpi_runner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 1c0fe002..d49a220b 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -320,7 +320,7 @@ def build_callbacks(self,conf,callbacks_list): if "earlystop" in callbacks_list: callbacks += [cbks.EarlyStopping(patience=patience, monitor=monitor, mode=mode)] - if "tensorboard" in callbacks_list and not backend == "theano": + if "tensorboard" in callbacks_list and backend != "theano": callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True)] if "lr_scheduler" in callbacks_list: pass @@ -579,6 +579,9 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) + if backend != "theano": + mpi_model.model.summary() + mpi_model.compile(loss=conf['data']['target'].loss) callbacks = mpi_model.build_callbacks(conf,callbacks_list) From d13d32884f5d4ad7f8802fbf04517eac23efb64e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 13 May 2017 23:59:46 -0400 Subject: [PATCH 030/744] fixed bugs in normalization and preprocessing. More robust to partially saved .npz files. Robust to signals with std = 0. Added several normalizers (one for each machine). --- data/signals.py | 8 +- examples/learn.py | 2 +- examples/learn_processed.py | 2 +- plasma/conf.py | 8 +- plasma/models/data.py | 5 +- plasma/preprocessor/normalize.py | 125 ++++++++++++++++++++---------- plasma/preprocessor/preprocess.py | 10 ++- plasma/primitives/shots.py | 7 +- 8 files changed, 108 insertions(+), 59 deletions(-) diff --git a/data/signals.py b/data/signals.py index 9c158b4d..85ae1e56 100644 --- a/data/signals.py +++ b/data/signals.py @@ -154,14 +154,14 @@ def fetch_nstx_data(signal_path,shot_num,c): ipdirect = Signal("plasma current direction",["d3d/iptdirect"],[d3d]) #for downloading -all_signals = [etemp_profile,edens_profile,q95,li,ip, +all_signals = [q95,li,ip, betan,energy,lm,dens,pradcore,pradedge,pradtot,pin, -torquein,tmamp1,tmamp2,tmfreq1,tmfreq2,pechin,energydt,ipdirect +torquein,tmamp1,tmamp2,tmfreq1,tmfreq2,pechin,energydt,ipdirect,etemp_profile,edens_profile, ] #for actual data analysis -all_signals_restricted = [etemp_profile,edens_profile, -q95,li,ip,energy,lm,dens,pradcore,pradtot,pin] +all_signals_restricted = [ +q95,li,ip,energy,lm,dens,pradcore,pradtot,pin,etemp_profile,edens_profile] print('all signals:') print(all_signals) diff --git a/examples/learn.py b/examples/learn.py index 91c4eb77..235bd49c 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -32,7 +32,7 @@ from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.preprocess import Preprocessor from plasma.models.loader import Loader -from plasma.models.runner import train, make_predictions,make_predictions_gpu +from plasma.models.runner import train, make_predictions,make_predictions_gpu,make_predictions_and_evaluate_gpu if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer diff --git a/examples/learn_processed.py b/examples/learn_processed.py index e3f3f28c..06220eb1 100644 --- a/examples/learn_processed.py +++ b/examples/learn_processed.py @@ -32,7 +32,7 @@ from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.preprocess import Preprocessor from plasma.models.loader import Loader -from plasma.models.runner import train, make_predictions,make_predictions_gpu +from plasma.models.runner import train, make_predictions,make_predictions_gpu,make_predictions_and_evaluate_gpu if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer diff --git a/plasma/conf.py b/plasma/conf.py index 0ff0e557..5859d551 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -16,9 +16,9 @@ from data.signals import *#d3d,jet,d3d_signals,jet_signals,all_signals #signals -conf['paths']['all_signals'] = d3d_signals +conf['paths']['all_signals'] = all_signals#jet_signals#d3d_signals#all_signals #make sure all 1D signals appear last! -conf['paths']['use_signals'] = [ip,lm,edens_profile,etemp_profile] +conf['paths']['use_signals'] = d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# #machines conf['paths']['all_machines'] = all_machines @@ -40,8 +40,8 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [d3d_1000]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = []#[jet_iterlike_wall] +conf['paths']['shot_files'] = [d3d_1000]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files_test'] = [] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] #shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] diff --git a/plasma/models/data.py b/plasma/models/data.py index e805b7af..4da50399 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -47,7 +47,10 @@ def load_data(self,prepath,shot): return None,None,False file_path = self.get_file_path(prepath,shot.machine,shot.number) - data = np.loadtxt(file_path) + try: + data = np.loadtxt(file_path) + except: + print('Couldnt load signal {} shot {}'.format(file_path,shot.number)) if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 1d2494a4..d1596bea 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -27,8 +27,8 @@ class Stats(object): class Normalizer(object): def __init__(self,conf): - self.num_processed = 0 - self.num_disruptive = 0 + self.num_processed = dict() + self.num_disruptive = dict() self.conf = conf self.path = conf['paths']['normalizer_path'] self.remapper = conf['data']['target'].remapper @@ -58,6 +58,10 @@ def save_stats(self): def load_stats(self): pass + def ensure_machine(self,machine): + if machine not in self.means: + self.num_processed[machine] = 0 + self.num_disruptive[machine] = 0 ######Modify the above to change the specifics of the normalization scheme####### def train(self): @@ -118,6 +122,7 @@ def train_on_single_shot(self,shot): assert isinstance(shot,Shot), 'should be instance of shot' processed_prepath = self.conf['paths']['processed_prepath'] shot.restore(processed_prepath) + #print(shot) stats = self.extract_stats(shot) shot.make_light() return stats @@ -140,13 +145,16 @@ def previously_saved_stats(self): class MeanVarNormalizer(Normalizer): def __init__(self,conf): Normalizer.__init__(self,conf) - self.means = None - self.stds = None + self.means = dict() + self.stds = dict() def __str__(self): - means = np.median(self.means,axis=0) - stds = np.median(self.stds,axis=0) - return('Mean Var Normalizer.\nmeans: {}\nstds: {}'.format(means,stds)) + s = '' + for machine in self.means: + means = np.median(self.means[machine],axis=0) + stds = np.median(self.stds[machine],axis=0) + s += 'Machine: {}:\nMean Var Normalizer.\nmeans: {}\nstds: {}'.format(machine,means,stds) + return s def extract_stats(self,shot): stats = Stats() @@ -159,29 +167,37 @@ def extract_stats(self,shot): else: print('Warning: shot {} not valid, omitting'.format(shot.number)) stats.valid = shot.valid + stats.machine = shot.machine return stats + def incorporate_stats(self,stats): + machine = stats.machine + self.ensure_machine(stats.machine) if stats.valid: means = stats.means stds = stats.stds - if self.num_processed == 0: - self.means = means - self.stds = stds + if self.num_processed[machine] == 0: + self.means[machine] = means + self.stds[machine] = stds else: - self.means = np.concatenate((self.means,means),axis=0) - self.stds = np.concatenate((self.stds,stds),axis=0) - self.num_processed = self.num_processed + 1 - self.num_disruptive = self.num_disruptive + (1 if stats.is_disruptive else 0) + self.means[machine] = np.concatenate((self.means[machine],means),axis=0) + self.stds[machine] = np.concatenate((self.stds[machine],stds),axis=0) + self.num_processed[machine] = self.num_processed[machine] + 1 + self.num_disruptive[machine] = self.num_disruptive[machine] + (1 if stats.is_disruptive else 0) def apply(self,shot): - assert self.means is not None and self.stds is not None, "self.means or self.stds not initialized" - means = np.median(self.means,axis=0) - stds = np.median(self.stds,axis=0) + m = shot.machine + assert self.means[m] is not None and self.stds[m] is not None, "self.means or self.stds not initialized" + means = np.median(self.means[m],axis=0) + stds = np.median(self.stds[m],axis=0) for (i,sig) in enumerate(shot.signals): - shot.signals_dict[sig] = (shot.signals_dict[sig] - means[i])/stds[i] + stds_curr = stds[i] + if stds_curr == 0.0: + stds_curr = 1.0 + shot.signals_dict[sig] = (shot.signals_dict[sig] - means[i])/stds_curr shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) # self.apply_positivity_mask(shot) @@ -200,26 +216,36 @@ def save_stats(self): def load_stats(self): assert self.previously_saved_stats(), "stats not saved before" dat = np.load(self.path) - self.means = dat['means'] - self.stds = dat['stds'] - self.num_processed = dat['num_processed'] - self.num_disruptive = dat['num_disruptive'] - print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) + self.means = dat['means'][()] + self.stds = dat['stds'][()] + self.num_processed = dat['num_processed'][()] + self.num_disruptive = dat['num_disruptive'][()] + for machine in self.means: + print('Machine {}:'.format(machine)) + print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) #print('loading normalization data from {} shots, {} disruptive'.format(num_processed,num_disruptive)) class VarNormalizer(MeanVarNormalizer): def apply(self,shot): assert self.means is not None and self.stds is not None, "self.means or self.stds not initialized" - stds = np.median(self.stds,axis=0) + m = shot.machine + stds = np.median(self.stds[m],axis=0) for (i,sig) in enumerate(shot.signals): - shot.signals_dict[sig] = (shot.signals_dict[sig])/stds[i] + stds_curr = stds[i] + if stds_curr == 0.0: + stds_curr = 1.0 + shot.signals_dict[sig] = (shot.signals_dict[sig])/stds_curr shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) def __str__(self): - stds = np.median(self.stds,axis=0) - return('Var Normalizer.\nstds: {}'.format(stds)) + s = '' + for m in self.stds: + stds = np.median(self.stds[m],axis=0) + s += 'Machine: {}:\n'.format(m) + s += 'Var Normalizer.\nstds: {}\n'.format(stds) + return s class AveragingVarNormalizer(VarNormalizer): @@ -237,8 +263,12 @@ def apply(self,shot): def __str__(self): window_decay = self.conf['data']['window_decay'] window_size = self.conf['data']['window_size'] - stds = np.median(self.stds,axis=0) - return('Averaging Var Normalizer.\nstds: {}\nWindow size: {}, Window decay: {}'.format(stds,window_size,window_decay)) + s = '' + for m in self.stds: + stds = np.median(self.stds[m],axis=0) + s += 'Machine: {}:\n'.format(m) + s += 'Averaging Var Normalizer.\nstds: {}\nWindow size: {}, Window decay: {}'.format(stds,window_size,window_decay) + return s class MinMaxNormalizer(Normalizer): @@ -248,9 +278,11 @@ def __init__(self,conf): self.maximums = None - def __str__(self): - return('Normalizer.\nminimums: {}\nmaximums: {}'.format(self.minimums,self.maximums)) + s = '' + for m in self.minimums: + s += 'Machine {}:\n.Min Max Normalizer.\nminimums: {}\nmaximums: {}'.format(m,self.minimums[m],self.maximums[m]) + return s def extract_stats(self,shot): stats = Stats() @@ -262,28 +294,35 @@ def extract_stats(self,shot): else: print('Warning: shot {} not valid, omitting'.format(shot.number)) stats.valid = shot.valid + stats.machine = shot.machine return stats def incorporate_stats(self,stats): + self.ensure_machine(stats.machine) if stats.valid: + m = stats.machine minimums = stats.minimums maximums = stats.maximums if self.num_processed == 0: - self.minimums = minimums - self.maximums = maximums + self.minimums[m] = minimums + self.maximums[m] = maximums else: - self.minimums = (self.num_processed*self.minimums + minimums)/(self.num_processed + 1.0)#snp.min(vstack((self.minimums,minimums)),0) - self.maximums = (self.num_processed*self.maximums + maximums)/(self.num_processed + 1.0)#snp.max(vstack((self.maximums,maximums)),0) - self.num_processed = self.num_processed + 1 - self.num_disruptive = self.num_disruptive + (1 if stats.is_disruptive else 0) + self.minimums[m] = (self.num_processed[m]*self.minimums + minimums)/(self.num_processed[m] + 1.0)#snp.min(vstack((self.minimums,minimums)),0) + self.maximums[m] = (self.num_processed[m]*self.maximums + maximums)/(self.num_processed[m] + 1.0)#snp.max(vstack((self.maximums,maximums)),0) + self.num_processed[m] = self.num_processed[m] + 1 + self.num_disruptive[m] = self.num_disruptive[m] + (1 if stats.is_disruptive else 0) def apply(self,shot): assert(self.minimums is not None and self.maximums is not None) - shot.signals = (shot.signals - self.minimums)/(self.maximums - self.minimums) + m = shot.machine + curr_range = (self.maximums[m] - self.minimums[m]) + if curr_range == 0.0: + curr_range = 1.0 + shot.signals = (shot.signals - self.minimums[m])/curr_range for (i,sig) in enumerate(shot.signals): - shot.signals_dict[sig] = (shot.signals_dict[sig] - self.minimums)/(self.maximums - self.minimums) + shot.signals_dict[sig] = (shot.signals_dict[sig] - self.minimums[m])/(self.maximums[m] - self.minimums[m]) shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) # self.apply_positivity_mask(shot) @@ -301,10 +340,10 @@ def save_stats(self): def load_stats(self): assert(self.previously_saved_stats()) dat = np.load(self.path) - self.minimums = dat['minimums'] - self.maximums = dat['maximums'] - self.num_processed = dat['num_processed'] - self.num_disruptive = dat['num_disruptive'] + self.minimums = dat['minimums'][()] + self.maximums = dat['maximums'][()] + self.num_processed = dat['num_processed'][()] + self.num_disruptive = dat['num_disruptive'][()] print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) #print('loading normalization data from {} shots, {} disruptive'.format(num_processed,num_disruptive)) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 51bdf895..9b3f6732 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -101,8 +101,14 @@ def preprocess_single_file(self,shot): shot.save(processed_prepath) else: - shot.restore(processed_prepath,light=True) - sys.stdout.write('\r{} exists.'.format(shot.number)) + try: + shot.restore(processed_prepath,light=True) + sys.stdout.write('\r{} exists.'.format(shot.number)) + except: + shot.preprocess(self.conf) + shot.save(processed_prepath) + sys.stdout.write('\r{} exists but corrupted, resaved.'.format(shot.number)) + shot.make_light() return shot diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 8968bbea..ff7125e2 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -79,7 +79,7 @@ def load_from_shot_list_files_object(self,shot_list_files_object,signals): machine = shot_list_files_object.machine shot_numbers,disruption_times = shot_list_files_object.get_shot_numbers_and_disruption_times() for number,t in list(zip(shot_numbers,disruption_times)): - self.append(Shot(number=number,t_disrupt=t,machine=machine,signals=signals)) + self.append(Shot(number=number,t_disrupt=t,machine=machine,signals=[s for s in signals if s.is_defined_on_machine(machine)])) @@ -315,8 +315,9 @@ def get_signals_and_times_from_file(self,conf): assert(len(sig.shape) == 2) assert(len(t.shape) == 1) assert(len(t) > 1) - t_min = max(t_min,t[0]) - t_max = min(t_max,t[-1]) + t_min = max(t_min,np.min(t)) + t_max = min(t_max,np.max(t)) + signal_arrays.append(sig) time_arrays.append(t) assert(t_max > t_min or not valid) From ad890f45ca9f7b518ca31175ee9ce95b7e874c12 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 15 May 2017 15:54:27 -0700 Subject: [PATCH 031/744] added faster performance analysis --- plasma/utils/performance.py | 71 +++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 53f6a32e..0b8f2768 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -51,15 +51,37 @@ def get_p_thresh_range(self): def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): + return get_metrics_vs_p_thresh_fast(all_reds,all_truths,all_disruptive) + # P_thresh_range = self.get_p_thresh_range() + # correct_range = np.zeros_like(P_thresh_range) + # accuracy_range = np.zeros_like(P_thresh_range) + # fp_range = np.zeros_like(P_thresh_range) + # missed_range = np.zeros_like(P_thresh_range) + # early_alarm_range = np.zeros_like(P_thresh_range) + + # for i,P_thresh in enumerate(P_thresh_range): + # correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) + # correct_range[i] = correct + # accuracy_range[i] = accuracy + # fp_range[i] = fp_rate + # missed_range[i] = missed + # early_alarm_range[i] = early_alarm_rate + + # return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range + + def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): P_thresh_range = self.get_p_thresh_range() correct_range = np.zeros_like(P_thresh_range) accuracy_range = np.zeros_like(P_thresh_range) fp_range = np.zeros_like(P_thresh_range) missed_range = np.zeros_like(P_thresh_range) early_alarm_range = np.zeros_like(P_thresh_range) - - for i,P_thresh in enumerate(P_thresh_range): - correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) + + early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) + all_thresholds = np.concatenate((early_th,correct_th,late_th,nd_th)) + for i,thresh in enumerate(all_thresholds): + #correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) + correct,accuracy,fp_rate,missed,early_alarm_rate = self.get_shot_prediction_stats_from_threshold_arrays(early_th,correct_th,late_th,nd_th,thresh) correct_range[i] = correct accuracy_range[i] = accuracy fp_range[i] = fp_rate @@ -68,6 +90,49 @@ def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range + def get_shot_prediction_stats_from_threshold_arrays(self,early_th,correct_th,late_th,nd_th,thresh): + FPs = np.sum(nd_th > thresh) + TNs = len(nd_th) - FPs + + earlies = np.sum(early_th > thresh) + TPs = np.sum(np.logical_and(early_th <= thresh,correct_th > thresh)) + lates = np.sum(np.logical_and(np.logical_and(early_th <= thresh,correct_th <= thresh),late_th > thresh)) + FNs = np.sum(np.logical_and(np.logical_and(early_th <= thresh,correct_th <= thresh),late_th <= thresh)) + + return self.get_accuracy_and_fp_rate_from_stats(TPs,FPs,FNs,TNs,earlies,lates,verbose) + + + + def get_threshold_arrays(self,preds,truths,disruptives): + num_d = np.sum(disruptives) + num_nd = np.sum(~disruptives) + nd_thresholds = [] + d_early_thresholds = [] + d_correct_thresholds = [] + d_late_thresholds = [] + for i in range(len(all_preds)): + pred = preds[i] + truth = truths[i] + is_disruptive = disruptives[i] + if is_disruptive: + max_acceptable = self.create_acceptable_region(truth,'max') + min_acceptable = self.create_acceptable_region(truth,'min') + correct_indices = np.logical_and(max_acceptable[first_pred_idx], ~min_acceptable[first_pred_idx]) + early_indices = ~min_acceptable + late_indices = min_acceptable + d_early_thresholds.append(np.max(preds[early_indices])) + d_late_thresholds.append(np.max(preds[late_indices])) + d_correct_thresholds.append(np.max(preds[correct_indices])) + else: + nd_thresholds.append(np.max(preds)) + return np.array(d_early_thresholds), np.array(d_correct_thresholds), + np.array(d_late_thresholds), np.array(nd_thresholds) + + + + + + def summarize_shot_prediction_stats_by_mode(self,P_thresh,mode,verbose=False): if mode == 'train': From 0a7ed3fe61d79d5b4afe74b996c621902cb8347a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 16 May 2017 20:58:39 -0400 Subject: [PATCH 032/744] added todo for normalization --- plasma/preprocessor/normalize.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 1d2494a4..beb38cb7 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -20,6 +20,15 @@ from plasma.primitives.shots import ShotList, Shot from plasma.utils.processing import get_signal_slices +'''TODO +- incorporate stats, pass machine (perhaps save machine in stats object!) +- incorporate stats, have a dictionary of aggregate stats for every machine. +- check "is_previously_saved" by making sure there is a normalizer for every machine +''' + + + + #######NORMALIZATION########## class Stats(object): pass From 1d4335a4579722bfe2d81fc750b638c4f0e2ef7d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 16 May 2017 21:22:19 -0400 Subject: [PATCH 033/744] plotting on machines without display --- plasma/utils/performance.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 0b8f2768..aee555f7 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -1,3 +1,5 @@ +import matplotlib +matplotlib.use('Agg')#for machines that don't have a display import matplotlib.pyplot as plt import os from pprint import pprint From e4e93c014c40a6c3e520ef5d2309cb3222651371 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 16 May 2017 22:23:10 -0400 Subject: [PATCH 034/744] accelerated shot by shot evaluation by using only the maximum threshold value throughout the shot --- examples/performance_analysis.py | 24 +++++------ plasma/utils/performance.py | 73 ++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 35 deletions(-) diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 5e7da034..d17f0cea 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -29,16 +29,16 @@ analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') #analyzer.example_plots(P_thresh_opt,'test','any') -analyzer.example_plots(P_thresh_opt,'test','FP') -analyzer.example_plots(P_thresh_opt,'test','FN') -analyzer.example_plots(P_thresh_opt,'test','TP') -analyzer.example_plots(P_thresh_opt,'test','late') - - -alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') -analyzer.hist_alarms(disr_alarms,'disruptive alarms, P_thresh = {}'.format(P_thresh_opt),save_figure=save_figure) -print('{} disruptive alarms'.format(len(disr_alarms))) -print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) -analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P_thresh = {}'.format(P_thresh_opt)) -print('{} nondisruptive alarms'.format(len(nondisr_alarms))) +analyzer.example_plots(P_thresh_opt,'test',['FP']) +analyzer.example_plots(P_thresh_opt,'test',['FN']) +analyzer.example_plots(P_thresh_opt,'test',['TP']) +analyzer.example_plots(P_thresh_opt,'test',['late']) + + +#alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') +#analyzer.hist_alarms(disr_alarms,'disruptive alarms, P_thresh = {}'.format(P_thresh_opt),save_figure=save_figure) +#print('{} disruptive alarms'.format(len(disr_alarms))) +#print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) +#analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P_thresh = {}'.format(P_thresh_opt)) +#print('{} nondisruptive alarms'.format(len(nondisr_alarms))) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index aee555f7..691366c0 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -1,3 +1,4 @@ +from __future__ import print_function import matplotlib matplotlib.use('Agg')#for machines that don't have a display import matplotlib.pyplot as plt @@ -29,6 +30,8 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = 0,T_max_war self.disruptive_test = None self.shot_list_test = None + self.p_thresh_range = None + self.normalizer = None @@ -48,12 +51,12 @@ def get_metrics_vs_p_thresh(self,mode): return self.get_metrics_vs_p_thresh_custom(all_preds,all_truths,all_disruptive) - def get_p_thresh_range(self): - return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) + #def get_p_thresh_range(self): + # return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): - return get_metrics_vs_p_thresh_fast(all_reds,all_truths,all_disruptive) + return self.get_metrics_vs_p_thresh_fast(all_preds,all_truths,all_disruptive) # P_thresh_range = self.get_p_thresh_range() # correct_range = np.zeros_like(P_thresh_range) # accuracy_range = np.zeros_like(P_thresh_range) @@ -71,17 +74,35 @@ def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): # return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range + + def get_p_thresh_range(self): + if self.p_thresh_range == None: + all_preds_tr = self.pred_train + all_truths_tr = self.truth_train + all_disruptive_tr = self.disruptive_train + all_preds_te = self.pred_test + all_truths_te = self.truth_test + all_disruptive_te = self.disruptive_test + + early_th_tr,correct_th_tr,late_th_tr,nd_th_tr = self.get_threshold_arrays(all_preds_tr,all_truths_tr,all_disruptive_tr) + early_th_te,correct_th_te,late_th_te,nd_th_te = self.get_threshold_arrays(all_preds_te,all_truths_te,all_disruptive_te) + + all_thresholds = np.sort(np.concatenate((early_th_tr,correct_th_tr,late_th_tr,nd_th_tr,early_th_te,correct_th_te,late_th_te,nd_th_te))) + self.p_thresh_range = all_thresholds + return self.p_thresh_range + + def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): - P_thresh_range = self.get_p_thresh_range() - correct_range = np.zeros_like(P_thresh_range) - accuracy_range = np.zeros_like(P_thresh_range) - fp_range = np.zeros_like(P_thresh_range) - missed_range = np.zeros_like(P_thresh_range) - early_alarm_range = np.zeros_like(P_thresh_range) - - early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) - all_thresholds = np.concatenate((early_th,correct_th,late_th,nd_th)) - for i,thresh in enumerate(all_thresholds): + p_thresh_range = self.get_p_thresh_range() + correct_range = np.zeros_like(p_thresh_range) + accuracy_range = np.zeros_like(p_thresh_range) + fp_range = np.zeros_like(p_thresh_range) + missed_range = np.zeros_like(p_thresh_range) + early_alarm_range = np.zeros_like(p_thresh_range) + + early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) + + for i,thresh in enumerate(p_thresh_range): #correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) correct,accuracy,fp_rate,missed,early_alarm_rate = self.get_shot_prediction_stats_from_threshold_arrays(early_th,correct_th,late_th,nd_th,thresh) correct_range[i] = correct @@ -101,7 +122,7 @@ def get_shot_prediction_stats_from_threshold_arrays(self,early_th,correct_th,lat lates = np.sum(np.logical_and(np.logical_and(early_th <= thresh,correct_th <= thresh),late_th > thresh)) FNs = np.sum(np.logical_and(np.logical_and(early_th <= thresh,correct_th <= thresh),late_th <= thresh)) - return self.get_accuracy_and_fp_rate_from_stats(TPs,FPs,FNs,TNs,earlies,lates,verbose) + return self.get_accuracy_and_fp_rate_from_stats(TPs,FPs,FNs,TNs,earlies,lates) @@ -112,23 +133,29 @@ def get_threshold_arrays(self,preds,truths,disruptives): d_early_thresholds = [] d_correct_thresholds = [] d_late_thresholds = [] - for i in range(len(all_preds)): + for i in range(len(preds)): pred = preds[i] truth = truths[i] is_disruptive = disruptives[i] if is_disruptive: max_acceptable = self.create_acceptable_region(truth,'max') min_acceptable = self.create_acceptable_region(truth,'min') - correct_indices = np.logical_and(max_acceptable[first_pred_idx], ~min_acceptable[first_pred_idx]) - early_indices = ~min_acceptable + correct_indices = np.logical_and(max_acceptable, ~min_acceptable) + early_indices = ~max_acceptable late_indices = min_acceptable - d_early_thresholds.append(np.max(preds[early_indices])) - d_late_thresholds.append(np.max(preds[late_indices])) - d_correct_thresholds.append(np.max(preds[correct_indices])) + if np.sum(late_indices) == 0: + d_late_thresholds.append(np.min(pred)) + else: + d_late_thresholds.append(np.max(pred[late_indices])) + if np.sum(early_indices) == 0: + d_early_thresholds.append(np.min(pred)) + else: + d_early_thresholds.append(np.max(pred[early_indices])) + + d_correct_thresholds.append(np.max(pred[correct_indices])) else: - nd_thresholds.append(np.max(preds)) - return np.array(d_early_thresholds), np.array(d_correct_thresholds), - np.array(d_late_thresholds), np.array(nd_thresholds) + nd_thresholds.append(np.max(pred)) + return np.array(d_early_thresholds), np.array(d_correct_thresholds),np.array(d_late_thresholds), np.array(nd_thresholds) From 62e5a002deb380144b6a06079a2c821072611f6a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 16 May 2017 22:34:13 -0400 Subject: [PATCH 035/744] improved plotting --- plasma/utils/performance.py | 66 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 691366c0..0d5206f8 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -563,37 +563,55 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, is_disruptive = shot.is_disruptive if normalize: self.normalizer.apply(shot) - #shot.signals is a 2D numpy array with the rows containing the unlabeled timeseries data - signals = np.empty((len(shot.signals),0)) #None - - labels = [] - signals_index = 0 - signals_masks = conf['paths']['signals_masks'] - plot_masks = conf['plots']['plot_masks'] - group_labels = conf['plots']['group_labels'] - for i, group in enumerate(conf['paths']['signals_dirs']): - for j,signal_name in enumerate(group): - if signals_masks[i][j]: #signal was used in training/testing - if plot_masks[i][j]: #subset of signals to be plotted - labels += group_labels[i] #original object was 2D by PPFvs.JPF x signal group - signals = np.column_stack((signals,shot.signals.T[signals_index])) - signals_index += 1 - - if is_disruptive: - print('disruptive') - else: - print('non disruptive') - f,axarr = subplots(len(signals.T)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) + use_signals = self.conf['paths']['use_signals'] + f,axarr = subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) title(prediction_type) - for (i,sig) in enumerate(signals.T): + assert(shot.ttd == truth) + for sig in use_signals: + num_channels = sig.num_channels ax = axarr[i] - ax.plot(sig[::-1],label = labels[i]) + sig_arr = shot.signals_dict[sig] + if num_channels == 1 + ax.plot(sig_arr[::-1,0],label = sig.description) + else: + ax.imshow(sig_arr[::-1,:],label = sig.description) ax.legend(loc='best',fontsize=8) setp(ax.get_xticklabels(),visible=False) setp(ax.get_yticklabels(),fontsize=7) f.subplots_adjust(hspace=0) - print('min: {}, max: {}'.format(min(sig), max(sig))) + print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) + #shot.signals is a 2D numpy array with the rows containing the unlabeled timeseries data + # signals = np.empty((len(shot.signals),0)) #None + + # labels = [] + # signals_index = 0 + # signals_masks = conf['paths']['signals_masks'] + # plot_masks = conf['plots']['plot_masks'] + # group_labels = conf['plots']['group_labels'] + # for i, group in enumerate(conf['paths']['signals_dirs']): + # for j,signal_name in enumerate(group): + # if signals_masks[i][j]: #signal was used in training/testing + # if plot_masks[i][j]: #subset of signals to be plotted + # labels += group_labels[i] #original object was 2D by PPFvs.JPF x signal group + # signals = np.column_stack((signals,shot.signals.T[signals_index])) + # signals_index += 1 + + # if is_disruptive: + # print('disruptive') + # else: + # print('non disruptive') + + # f,axarr = subplots(len(signals.T)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) + # title(prediction_type) + # for (i,sig) in enumerate(signals.T): + # ax = axarr[i] + # ax.plot(sig[::-1],label = labels[i]) + # ax.legend(loc='best',fontsize=8) + # setp(ax.get_xticklabels(),visible=False) + # setp(ax.get_yticklabels(),fontsize=7) + # f.subplots_adjust(hspace=0) + # print('min: {}, max: {}'.format(min(sig), max(sig))) ax = axarr[-1] if self.pred_ttd: ax.semilogy((-truth+0.0001)[::-1],label='ground truth') From a301d8ce0b1b0b56e2b50f36ac31910c7a0f7d57 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 16 May 2017 23:29:14 -0400 Subject: [PATCH 036/744] fixed bug with mpi epoch reset --- plasma/models/mpi_runner.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 67239007..65613a15 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -352,6 +352,7 @@ def train_epoch(self): batch_iterator_func = self.batch_iterator_func num_so_far = 0 + num_so_far_accum = 0 num_total = 1 ave_loss = -1 curr_loss = -1 @@ -365,10 +366,12 @@ def train_epoch(self): while (num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: try: - batch_xs,batch_ys,reset_states_now,num_so_far,num_total = next(batch_iterator_func) + batch_xs,batch_ys,reset_states_now,num_so_far_curr,num_total = next(batch_iterator_func) except StopIteration: + num_so_far_accum = num_so_far batch_iterator_func = self.batch_iterator() - batch_xs,batch_ys,reset_states_now,num_so_far,num_total = next(batch_iterator_func) + batch_xs,batch_ys,reset_states_now,num_so_far_curr,num_total = next(batch_iterator_func) + num_so_far = num_so_far_accum+num_so_far_curr num_batches_current +=1 From 972c3d2bab73941ff22a1d63dc090773465d0373 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 00:29:34 -0400 Subject: [PATCH 037/744] normalizer checks whether there is a file for every machine --- plasma/preprocessor/normalize.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 3efd1dec..d8075e0a 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -41,7 +41,7 @@ def __init__(self,conf): self.conf = conf self.path = conf['paths']['normalizer_path'] self.remapper = conf['data']['target'].remapper - + self.machines = set() @abc.abstractmethod def __str__(self): @@ -131,6 +131,7 @@ def train_on_single_shot(self,shot): assert isinstance(shot,Shot), 'should be instance of shot' processed_prepath = self.conf['paths']['processed_prepath'] shot.restore(processed_prepath) + self.machines.add(shot.machine) #print(shot) stats = self.extract_stats(shot) shot.make_light() @@ -142,7 +143,15 @@ def ensure_save_directory(self): os.makedirs(prepath) def previously_saved_stats(self): - return os.path.isfile(self.path) + if not os.path.isfile(self.path): + return False + else: + dat = np.load(self.path) + machines = dat['machines'][()] + ret = all([m in machines for m in self.conf['paths']['all_machines']]) + if not ret: + print('Not all machines present. Recomputing normalizer.') + return ret # def get_indices_list(self): # return get_signal_slices(self.conf['paths']['signals_dirs']) @@ -219,7 +228,7 @@ def save_stats(self): # num_disruptive = dat['num_disruptive'] self.ensure_save_directory() np.savez(self.path,means = self.means,stds = self.stds, - num_processed=self.num_processed,num_disruptive=self.num_disruptive) + num_processed=self.num_processed,num_disruptive=self.num_disruptive,machines=self.machines) print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) def load_stats(self): @@ -229,6 +238,7 @@ def load_stats(self): self.stds = dat['stds'][()] self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] + self.machines = dat['machines'][()] for machine in self.means: print('Machine {}:'.format(machine)) print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) @@ -343,7 +353,7 @@ def save_stats(self): # num_disruptive = dat['num_disruptive'] self.ensure_save_directory() np.savez(self.path,minimums = self.minimums,maximums = self.maximums, - num_processed=self.num_processed,num_disruptive=self.num_disruptive) + num_processed=self.num_processed,num_disruptive=self.num_disruptive,machines=self.machines) print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) def load_stats(self): @@ -353,6 +363,7 @@ def load_stats(self): self.maximums = dat['maximums'][()] self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] + self.machines = dat['machines'][()] print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) #print('loading normalization data from {} shots, {} disruptive'.format(num_processed,num_disruptive)) From 70c9b549a953d007e503340ef49bac388d4532a3 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 04:14:56 -0400 Subject: [PATCH 038/744] tensorflow initialize variables bug --- plasma/models/builder.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index e44ce62d..5ed5bed8 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -15,7 +15,7 @@ import dill import re -import os +import os,sys import numpy as np from copy import deepcopy @@ -205,8 +205,10 @@ def slicer_output_shape(input_shape,indices): model.compile(loss=loss_fn, optimizer=optimizer) #bug with tensorflow/Keras if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': + first_time = "tensorflow" not in sys.modules import tensorflow as tf - K.get_session().run(tf.global_variables_initializer()) + if first_time: + K.get_session().run(tf.global_variables_initializer()) model.reset_states() #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output From eb7ecd7441eb3da2a2d6ffa97cdda2a24afd2ba2 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 04:15:42 -0400 Subject: [PATCH 039/744] removing prints --- plasma/models/builder.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index e44ce62d..7447f47c 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -141,12 +141,12 @@ def slicer_output_shape(input_shape,indices): return tuple(shape_curr) pre_rnn_input = Input(shape=(num_signals,)) - print(batch_shape_non_temporal) - print(batch_input_shape) - print(indices_0d) - print(indices_1d) - print(num_0D) - print(num_1D) + #print(batch_shape_non_temporal) + #print(batch_input_shape) + #print(indices_0d) + #print(indices_1d) + #print(num_0D) + #print(num_1D) if num_1D > 0: #pre_rnn_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) From 049095b014182683fc81a5a09a93b2084e09f5f0 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 06:02:40 -0400 Subject: [PATCH 040/744] fixed tensorflow bugs, added support for performance analysis and plotting for d3d signals and higher dimensional signals. Made performance analysis compatible with the new Signal and Machine classes. --- plasma/conf.py | 8 +++--- plasma/conf_parser.py | 2 ++ plasma/models/builder.py | 6 ++--- plasma/models/data.py | 6 ++++- plasma/models/loader.py | 4 +-- plasma/models/mpi_runner.py | 24 ++++++++++------- plasma/preprocessor/normalize.py | 4 ++- plasma/utils/performance.py | 46 +++++++++++++++++++------------- 8 files changed, 59 insertions(+), 41 deletions(-) diff --git a/plasma/conf.py b/plasma/conf.py index 5859d551..be484809 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -18,10 +18,7 @@ #signals conf['paths']['all_signals'] = all_signals#jet_signals#d3d_signals#all_signals #make sure all 1D signals appear last! -conf['paths']['use_signals'] = d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# - -#machines -conf['paths']['all_machines'] = all_machines +conf['paths']['use_signals'] = d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# #shot lists #shot_list_dir = conf['paths']['shot_list_dir'] @@ -40,9 +37,10 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [d3d_1000]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files'] = [d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] conf['paths']['shot_files_test'] = [] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] +conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) #shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] #shot_numbers_files = ['d3d_clear.txt', 'd3d_disrupt.txt']#['d3d_short_clear.txt']# ] diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 479bea18..9c5c1cf3 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -9,6 +9,8 @@ def parameters(input_file): params = yaml.load(yaml_file) signals_dirs = params['paths']['signals_dirs'] + + #signal masks to_mask = params['paths']['signals_masks'] diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 777c93dc..a45b0ef3 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -205,10 +205,10 @@ def slicer_output_shape(input_shape,indices): model.compile(loss=loss_fn, optimizer=optimizer) #bug with tensorflow/Keras if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': - first_time = "tensorflow" not in sys.modules + first_time = "tensorflow" not in sys.modules import tensorflow as tf - if first_time: - K.get_session().run(tf.global_variables_initializer()) + if first_time: + K.get_session().run(tf.global_variables_initializer()) model.reset_states() #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output diff --git a/plasma/models/data.py b/plasma/models/data.py index 4da50399..d2179f7d 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -50,7 +50,11 @@ def load_data(self,prepath,shot): try: data = np.loadtxt(file_path) except: - print('Couldnt load signal {} shot {}'.format(file_path,shot.number)) + print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) + os.remove(file_path) + return None, None, False + + if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 3d568a8b..5dbdc55c 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -51,8 +51,8 @@ def training_batch_generator(self,shot_list): batch_size = self.conf['training']['batch_size'] num_at_once = self.conf['training']['num_shots_at_once'] epoch = 0 + num_so_far = 0 while True: - num_so_far = 0 # the list of all shots shot_list.shuffle() # split the list into equal-length sublists (random shots will be reused to make them equal length). @@ -78,8 +78,8 @@ def training_batch_generator(self,shot_list): reset_states_now = (k == 0) start = k*batch_size end = (k + 1)*batch_size - yield X[start:end],y[start:end],reset_states_now,num_so_far,num_total num_so_far += 1.0*len(shot_sublist)/(len(X_list)*num_chunks) + yield X[start:end],y[start:end],reset_states_now,num_so_far,num_total epoch += 1 diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 65613a15..6f4b1681 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -148,6 +148,9 @@ class MPIModel(): def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01): # random.seed(task_index) self.epoch = 0 + self.num_so_far = 0 + self.num_so_far_accum = 0 + self.num_so_far_indiv = 0 self.model = model self.optimizer = optimizer self.max_lr = 0.1 @@ -351,8 +354,6 @@ def train_epoch(self): t_start = time.time() batch_iterator_func = self.batch_iterator_func - num_so_far = 0 - num_so_far_accum = 0 num_total = 1 ave_loss = -1 curr_loss = -1 @@ -363,15 +364,16 @@ def train_epoch(self): num_batches_minimum = 50 num_batches_current = 0 - while (num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: + while (self.num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: try: batch_xs,batch_ys,reset_states_now,num_so_far_curr,num_total = next(batch_iterator_func) except StopIteration: - num_so_far_accum = num_so_far + print("Resetting batch iterator.") + self.num_so_far_accum = self.num_so_far_indiv batch_iterator_func = self.batch_iterator() batch_xs,batch_ys,reset_states_now,num_so_far_curr,num_total = next(batch_iterator_func) - num_so_far = num_so_far_accum+num_so_far_curr + self.num_so_far_indiv = self.num_so_far_accum+num_so_far_curr num_batches_current +=1 @@ -381,7 +383,7 @@ def train_epoch(self): warmup_phase = (step < self.warmup_steps and self.epoch == 0) num_replicas = 1 if warmup_phase else self.num_replicas - num_so_far = self.mpi_sum_scalars(num_so_far,num_replicas) + self.num_so_far = self.mpi_sum_scalars(self.num_so_far_indiv,num_replicas) #run the model once to force compilation. Don't actually use these values. if step == 0 and self.epoch == 0: @@ -401,18 +403,20 @@ def train_epoch(self): write_str_0 = self.calculate_speed(t0,t1,t2,num_replicas) curr_loss = self.mpi_average_scalars(1.0*loss,num_replicas) + #if self.task_index == 0: + #print(self.model.get_weights()[0][0][:4]) loss_averager.add_val(curr_loss) ave_loss = loss_averager.get_val() - eta = self.estimate_remaining_time(t0 - t_start,num_so_far-self.epoch*num_total,num_total) - write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | '.format(self.task_index,step,eta,1.0*num_so_far,num_total,ave_loss,curr_loss) + eta = self.estimate_remaining_time(t0 - t_start,self.num_so_far-self.epoch*num_total,num_total) + write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | '.format(self.task_index,step,eta,1.0*self.num_so_far,num_total,ave_loss,curr_loss) print_unique(write_str + write_str_0) step += 1 - effective_epochs = 1.0*num_so_far/num_total + effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch self.epoch = effective_epochs print_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed) in {:.2f} seconds.\n'.format(1.0*self.epoch,self.epoch-epoch_previous,t2 - t_start)) - return (step,ave_loss,curr_loss,num_so_far,effective_epochs) + return (step,ave_loss,curr_loss,self.num_so_far,effective_epochs) def estimate_remaining_time(self,time_so_far,work_so_far,work_total): diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index d8075e0a..c892b68b 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -100,6 +100,7 @@ def train_on_files(self,shot_files,use_shots): for (i,stats) in enumerate(pool.imap_unordered(self.train_on_single_shot,shot_list_picked)): #for (i,stats) in enumerate(map(self.train_on_single_shot,shot_list_picked)): self.incorporate_stats(stats) + self.machines.add(stats.machine) sys.stdout.write('\r' + '{}/{}'.format(i,len(shot_list_picked))) pool.close() @@ -131,7 +132,6 @@ def train_on_single_shot(self,shot): assert isinstance(shot,Shot), 'should be instance of shot' processed_prepath = self.conf['paths']['processed_prepath'] shot.restore(processed_prepath) - self.machines.add(shot.machine) #print(shot) stats = self.extract_stats(shot) shot.make_light() @@ -150,6 +150,8 @@ def previously_saved_stats(self): machines = dat['machines'][()] ret = all([m in machines for m in self.conf['paths']['all_machines']]) if not ret: + print(machines) + print(self.conf['paths']['all_machines']) print('Not all machines present. Recomputing normalizer.') return ret diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 0d5206f8..77e9c79f 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -86,14 +86,18 @@ def get_p_thresh_range(self): early_th_tr,correct_th_tr,late_th_tr,nd_th_tr = self.get_threshold_arrays(all_preds_tr,all_truths_tr,all_disruptive_tr) early_th_te,correct_th_te,late_th_te,nd_th_te = self.get_threshold_arrays(all_preds_te,all_truths_te,all_disruptive_te) - all_thresholds = np.sort(np.concatenate((early_th_tr,correct_th_tr,late_th_tr,nd_th_tr,early_th_te,correct_th_te,late_th_te,nd_th_te))) self.p_thresh_range = all_thresholds return self.p_thresh_range def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): - p_thresh_range = self.get_p_thresh_range() + all_disruptive = np.array(all_disruptive) + if self.pred_train is not None: + p_thresh_range = self.get_p_thresh_range() + else: + early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) + p_thresh_range = np.sort(np.concatenate((early_th,correct_th,late_th,nd_th))) correct_range = np.zeros_like(p_thresh_range) accuracy_range = np.zeros_like(p_thresh_range) fp_range = np.zeros_like(p_thresh_range) @@ -565,22 +569,26 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, self.normalizer.apply(shot) use_signals = self.conf['paths']['use_signals'] - f,axarr = subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) - title(prediction_type) - assert(shot.ttd == truth) - for sig in use_signals: + f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) + plt.title(prediction_type) + print(shot.ttd.flatten()) + print(truth.flatten()) + assert(np.all(shot.ttd.flatten() == truth.flatten())) + for i,sig in enumerate(use_signals): num_channels = sig.num_channels ax = axarr[i] sig_arr = shot.signals_dict[sig] - if num_channels == 1 - ax.plot(sig_arr[::-1,0],label = sig.description) + if num_channels == 1: + ax.plot(sig_arr[:,0],label = sig.description) else: - ax.imshow(sig_arr[::-1,:],label = sig.description) - ax.legend(loc='best',fontsize=8) - setp(ax.get_xticklabels(),visible=False) - setp(ax.get_yticklabels(),fontsize=7) + ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description + " (profile)") + ax.set_ylim([0,num_channels]) + ax.legend(loc='upper center',fontsize=8) + plt.setp(ax.get_xticklabels(),visible=False) + plt.setp(ax.get_yticklabels(),fontsize=7) f.subplots_adjust(hspace=0) - print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) + #print(sig) + #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) #shot.signals is a 2D numpy array with the rows containing the unlabeled timeseries data # signals = np.empty((len(shot.signals),0)) #None @@ -614,17 +622,17 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, # print('min: {}, max: {}'.format(min(sig), max(sig))) ax = axarr[-1] if self.pred_ttd: - ax.semilogy((-truth+0.0001)[::-1],label='ground truth') - ax.plot(-prediction[::-1]+0.0001,'g',label='neural net prediction') + ax.semilogy((-truth+0.0001),label='ground truth') + ax.plot(-prediction+0.0001,'g',label='neural net prediction') ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') else: - ax.plot((truth+0.001)[::-1],label='ground truth') - ax.plot(prediction[::-1],'g',label='neural net prediction') + ax.plot((truth+0.001),label='ground truth') + ax.plot(prediction,'g',label='neural net prediction') ax.axhline(P_thresh_opt,color='k',label='trigger threshold') #ax.set_ylim([1e-5,1.1e0]) ax.set_ylim([-2,2]) - ax.axvline(self.T_min_warn,color='r',label='max warning time') - ax.axvline(self.T_max_warn,color='r',label='min warning time') + ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') + ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') ax.set_xlabel('TTD [ms]') ax.legend(loc = 'best',fontsize=10) plt.setp(ax.get_yticklabels(),fontsize=7) From da795f743693bd8841971964c1fd67cafa51af32 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 19:38:51 -0400 Subject: [PATCH 041/744] fixed bug where testing set requires normalization for a machine that is not in the training set --- plasma/preprocessor/normalize.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index d8075e0a..66abdba0 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -77,9 +77,19 @@ def train(self): conf = self.conf #only use training shots here!! "Don't touch testing shots" shot_files = conf['paths']['shot_files']# + conf['paths']['shot_files_test'] + shot_files_all = conf['paths']['shot_files_all'] + all_machines = set([file.machine for file in shot_files_all]) + train_machines = set([file.machine for file in shot_files]) + + if train_machines >= all_machines: + shot_files_use = shot_files + else: + print('Testing set contains new machine, using testing set to train normalizer for that machine.') + shot_files_use = shot_files_all + # shot_list_dir = conf['paths']['shot_list_dir'] use_shots = max(400,conf['data']['use_shots']) - return self.train_on_files(shot_files,use_shots) + return self.train_on_files(shot_files_use,use_shots) def train_on_files(self,shot_files,use_shots): From 73272c3e949b864aa49b0f780c2b90028b4df4b8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 19:39:53 -0400 Subject: [PATCH 042/744] plotting roc curve improvement --- plasma/utils/performance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 0d5206f8..f46e01b1 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -654,7 +654,7 @@ def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,sa if save_figure: plt.savefig(title_str + '.png',bbox_inches='tight') plt.close('all') - plt.plot(fp_range,1-missed_range,'o-b') + plt.plot(fp_range,1-missed_range,'-b') ax = plt.gca() plt.xlabel('FP rate') plt.ylabel('TP rate') From 99a2eb3e75c185fe88cddfdd3030d7331f9a7208 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 17 May 2017 19:51:40 -0400 Subject: [PATCH 043/744] removed printout --- plasma/utils/performance.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index cd6d4ca3..54c656ee 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -571,8 +571,6 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, use_signals = self.conf['paths']['use_signals'] f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) plt.title(prediction_type) - print(shot.ttd.flatten()) - print(truth.flatten()) assert(np.all(shot.ttd.flatten() == truth.flatten())) for i,sig in enumerate(use_signals): num_channels = sig.num_channels From d8cc8ea4c88bbb9df8cb8a4c074ef0056786bc5a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 17 May 2017 21:11:17 -0400 Subject: [PATCH 044/744] Add embeddings and gradients to the list of monitored summaries. Produce summary for the root process only --- plasma/models/mpi_runner.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index d49a220b..8f4fe861 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -320,8 +320,9 @@ def build_callbacks(self,conf,callbacks_list): if "earlystop" in callbacks_list: callbacks += [cbks.EarlyStopping(patience=patience, monitor=monitor, mode=mode)] - if "tensorboard" in callbacks_list and backend != "theano": - callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True)] + if "tensorboard" in callbacks_list and backend != "theano" and task_index == 0: + callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True, write_grads=True)] + #keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None) if "lr_scheduler" in callbacks_list: pass @@ -579,7 +580,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) - if backend != "theano": + if backend != "theano" and task_index == 0: mpi_model.model.summary() mpi_model.compile(loss=conf['data']['target'].loss) From a0847670768e5fa159d8b844072a5382fdc26738 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 17 May 2017 21:27:45 -0400 Subject: [PATCH 045/744] Add write_grads config parameter. Do write embeddings --- examples/conf.yaml | 3 ++- plasma/models/mpi_runner.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index a0f856eb..391f1563 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -82,7 +82,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 3 + num_epochs: 10 use_mock_data: False data_parallel: False callbacks: @@ -91,6 +91,7 @@ callbacks: mode: 'max' monitor: 'val_loss' patience: 2 + write_grads: False plots: #LaTeX strings for performance analysis, sorted in lists by signal_group diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 8f4fe861..ceb9fbc2 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -313,6 +313,7 @@ def build_callbacks(self,conf,callbacks_list): tensorboard_save_path = conf['paths']['tensorboard_save_path'] callbacks_list = conf['callbacks']['list'] + write_grads = conf['callbacks']['write_grads'] callbacks = [cbks.BaseLogger()] callbacks += [self.history] @@ -321,8 +322,7 @@ def build_callbacks(self,conf,callbacks_list): if "earlystop" in callbacks_list: callbacks += [cbks.EarlyStopping(patience=patience, monitor=monitor, mode=mode)] if "tensorboard" in callbacks_list and backend != "theano" and task_index == 0: - callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True, write_grads=True)] - #keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None) + callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True, write_grads=write_grads, embeddings_freq=1)] if "lr_scheduler" in callbacks_list: pass From 4b7a69c7673b860c7a06d2caf3f6b433e1d36fcb Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 18 May 2017 00:33:28 -0400 Subject: [PATCH 046/744] added yaml to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index cf96e808..c9f8d066 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ scipy mpi4py h5py pyparsing +yaml From 4a37b7eb445fd8a206c35983fedec30e90f1e44d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 18 May 2017 00:35:39 -0400 Subject: [PATCH 047/744] tidying up small changes. Changed minimum batch size to 100 in mpi --- data/signals.py | 5 +++-- examples/performance_analysis.py | 5 +++++ plasma/conf.py | 6 +++--- plasma/models/mpi_runner.py | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/data/signals.py b/data/signals.py index 85ae1e56..f85e8bc3 100644 --- a/data/signals.py +++ b/data/signals.py @@ -160,8 +160,9 @@ def fetch_nstx_data(signal_path,shot_num,c): ] #for actual data analysis -all_signals_restricted = [ -q95,li,ip,energy,lm,dens,pradcore,pradtot,pin,etemp_profile,edens_profile] +#all_signals_restricted = [q95,li,ip,energy,lm,dens,pradcore,pradtot,pin,etemp_profile,edens_profile] + +all_signals_restricted = all_signals print('all signals:') print(all_signals) diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index d17f0cea..cfe4e03f 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -34,6 +34,11 @@ analyzer.example_plots(P_thresh_opt,'test',['TP']) analyzer.example_plots(P_thresh_opt,'test',['late']) +analyzer.example_plots(P_thresh_opt,'train',['FP']) +analyzer.example_plots(P_thresh_opt,'train',['FN']) +analyzer.example_plots(P_thresh_opt,'train',['TP']) +analyzer.example_plots(P_thresh_opt,'train',['late']) + #alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') #analyzer.hist_alarms(disr_alarms,'disruptive alarms, P_thresh = {}'.format(P_thresh_opt),save_figure=save_figure) diff --git a/plasma/conf.py b/plasma/conf.py index be484809..28cef52d 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -18,7 +18,7 @@ #signals conf['paths']['all_signals'] = all_signals#jet_signals#d3d_signals#all_signals #make sure all 1D signals appear last! -conf['paths']['use_signals'] = d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# +conf['paths']['use_signals'] = fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# #shot lists #shot_list_dir = conf['paths']['shot_list_dir'] @@ -37,8 +37,8 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = [] +conf['paths']['shot_files'] = [jet_carbon_wall]#[d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files_test'] = [d3d_full]#[jet_iterlike_wall] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 6f4b1681..c07fa435 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -361,7 +361,7 @@ def train_epoch(self): t1 = 0 t2 = 0 - num_batches_minimum = 50 + num_batches_minimum = 100 num_batches_current = 0 while (self.num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: From a3a5353c3631cf7a3b4928615e364b95d0ea4745 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 18 May 2017 05:24:56 -0400 Subject: [PATCH 048/744] fixed bug in performance analysis. Formalized the number of timesteps (to let the recurrent internal state settle) to ignore during evaluation --- examples/conf.yaml | 23 +++++------ examples/performance_analysis.py | 2 +- plasma/utils/performance.py | 68 +++++++++++++++++++++----------- 3 files changed, 59 insertions(+), 34 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 395b225d..1f955956 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -4,7 +4,7 @@ # for example tigress/alexeys fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'hinge' +target: 'binary' #'ttd' #'hinge' paths: shot_files: ['CWall_clear.txt','CFC_unint.txt'] @@ -45,13 +45,13 @@ data: plotting: False #train/validate split #how many shots to use - use_shots: 200000 + use_shots: 200000 #1000 #200000 #normalization timescale dt: 0.001 #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 1.0 + T_warning: 50.0 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -70,11 +70,11 @@ model: skip: 1 #hidden layer size #TODO optimize - rnn_size: 300 + rnn_size: 200 #size 100 slight overfitting, size 20 no overfitting. 200 is not better than 100. Prediction much better with size 100, size 20 cannot capture the data. rnn_type: 'LSTM' #TODO optimize - rnn_layers: 3 + rnn_layers: 2 num_conv_filters: 10 size_conv_filters: 3 num_conv_layers: 2 @@ -85,26 +85,27 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.001 #0.00005 - lr_decay: 0.9 + lr: 0.0001 #0.00005 #0.00005 + lr_decay: 0.99 #0.9 stateful: True return_sequences: True - dropout_prob: 0.3 + dropout_prob: 0.2 #only relevant if we want to do mpi training. The number of steps with a single replica warmup_steps: 0 + ignore_timesteps: 100 #how many initial timesteps to ignore during evaluation (to let the internal state settle) backend: 'tensorflow' #'theano' #'tensorflow' #theano training: as_array_of_shots: True shuffle_training: True - train_frac: 0.5 - validation_frac: 0.05 + train_frac: 0.75 + validation_frac: 0.33 batch_size: 256 #THIS WAS THE CULPRIT FOR NO TRAINING! Lower than 1000 performs very poorly max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 5 + num_epochs: 3 use_mock_data: False data_parallel: False callbacks: diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index cfe4e03f..8cfbcc42 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -23,8 +23,8 @@ P_thresh_opt = analyzer.compute_tradeoffs_and_print_from_training() -analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train') analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test') +analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train') analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 54c656ee..25b7a923 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -51,31 +51,29 @@ def get_metrics_vs_p_thresh(self,mode): return self.get_metrics_vs_p_thresh_custom(all_preds,all_truths,all_disruptive) - #def get_p_thresh_range(self): - # return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) - def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): return self.get_metrics_vs_p_thresh_fast(all_preds,all_truths,all_disruptive) - # P_thresh_range = self.get_p_thresh_range() - # correct_range = np.zeros_like(P_thresh_range) - # accuracy_range = np.zeros_like(P_thresh_range) - # fp_range = np.zeros_like(P_thresh_range) - # missed_range = np.zeros_like(P_thresh_range) - # early_alarm_range = np.zeros_like(P_thresh_range) + P_thresh_range = self.get_p_thresh_range() + correct_range = np.zeros_like(P_thresh_range) + accuracy_range = np.zeros_like(P_thresh_range) + fp_range = np.zeros_like(P_thresh_range) + missed_range = np.zeros_like(P_thresh_range) + early_alarm_range = np.zeros_like(P_thresh_range) - # for i,P_thresh in enumerate(P_thresh_range): - # correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) - # correct_range[i] = correct - # accuracy_range[i] = accuracy - # fp_range[i] = fp_rate - # missed_range[i] = missed - # early_alarm_range[i] = early_alarm_rate + for i,P_thresh in enumerate(P_thresh_range): + correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) + correct_range[i] = correct + accuracy_range[i] = accuracy + fp_range[i] = fp_rate + missed_range[i] = missed + early_alarm_range[i] = early_alarm_rate - # return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range + return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range def get_p_thresh_range(self): + #return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) if self.p_thresh_range == None: all_preds_tr = self.pred_train all_truths_tr = self.truth_train @@ -107,7 +105,7 @@ def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) for i,thresh in enumerate(p_thresh_range): - #correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) + #correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(thresh,all_preds,all_truths,all_disruptive) correct,accuracy,fp_rate,missed,early_alarm_rate = self.get_shot_prediction_stats_from_threshold_arrays(early_th,correct_th,late_th,nd_th,thresh) correct_range[i] = correct accuracy_range[i] = accuracy @@ -118,6 +116,7 @@ def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range def get_shot_prediction_stats_from_threshold_arrays(self,early_th,correct_th,late_th,nd_th,thresh): + indices = np.where(np.logical_and(correct_th > thresh,early_th <= thresh))[0] FPs = np.sum(nd_th > thresh) TNs = len(nd_th) - FPs @@ -138,8 +137,9 @@ def get_threshold_arrays(self,preds,truths,disruptives): d_correct_thresholds = [] d_late_thresholds = [] for i in range(len(preds)): - pred = preds[i] + pred = 1.0*preds[i] truth = truths[i] + pred[:self.get_ignore_indices()] = -np.inf is_disruptive = disruptives[i] if is_disruptive: max_acceptable = self.create_acceptable_region(truth,'max') @@ -148,11 +148,11 @@ def get_threshold_arrays(self,preds,truths,disruptives): early_indices = ~max_acceptable late_indices = min_acceptable if np.sum(late_indices) == 0: - d_late_thresholds.append(np.min(pred)) + d_late_thresholds.append(-np.inf) else: d_late_thresholds.append(np.max(pred[late_indices])) if np.sum(early_indices) == 0: - d_early_thresholds.append(np.min(pred)) + d_early_thresholds.append(-np.inf) else: d_early_thresholds.append(np.max(pred[early_indices])) @@ -240,10 +240,13 @@ def get_shot_prediction_stats(self,P_thresh,pred,truth,is_disruptive): FP = 1 return TP,FP,FN,TN,early,late + def get_ignore_indices(self): + return conf['model']['ignore_timesteps'] + def get_positives(self,predictions): indices = np.arange(len(predictions)) - return np.where(np.logical_and(predictions,indices >= 100))[0] + return np.where(np.logical_and(predictions,indices >= self.get_ignore_indices()))[0] def create_acceptable_region(self,truth,mode): @@ -295,6 +298,10 @@ def load_ith_file(self): results_files = os.listdir(self.results_dir) print(results_files) dat = np.load(self.results_dir + results_files[self.i]) + print("Loading results file {}".format(self.results_dir + results_files[self.i])) + #self.assert_same_lists(dat['shot_list_test'][()],dat['y_gold_test']) + #self.assert_same_lists(dat['shot_list_train'][()],ypt) + #self.assert_same_lists(dat['shot_list_train'][()],dat['y_gold_train']) if self.verbose: print('configuration: {} '.format(dat['conf'])) @@ -311,6 +318,21 @@ def load_ith_file(self): for mode in ['test','train']: print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) self.print_conf() + #print("1") + #self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) + #self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) + + def assert_same_lists(self,shot_list,truth_arr,disr_arr): + assert(len(shot_list) == len(truth_arr)) + for i in range(len(shot_list)): + shot_list.shots[i].restore("/tigress/jk7/processed_shots/") + s = shot_list.shots[i].ttd + if not truth_arr[i].shape[0] == s.shape[0]-30: + print(i) + print(shot_list.shots[i].number) + print((s.shape,truth_arr[i].shape,disr_arr[i])) + assert(truth_arr[i].shape[0] == s.shape[0]-30) + print("Same Shape!") def print_conf(self): pprint(self.conf) @@ -531,6 +553,7 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot p = pred[i] is_disr = is_disruptive[i] shot = shot_list.shots[i] + TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh_opt,p,t,is_disr) prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) if not all(_ in set(['FP','TP','FN','TN','late','early','any']) for _ in types_to_plot): @@ -763,3 +786,4 @@ def roc_from_missed_fp(self,missed_range,fp_range): # ttd_by_shot,disr,length,T_min_warn,T_max_warn,verbose=verbose) # return fp_rate + From f82f36dd2403f27b41ac392b978e716aca38e359 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 18 May 2017 07:52:52 -0400 Subject: [PATCH 049/744] shuffling of shot lists differently on different mpi workers led to inference bugs. Fixed by sorting shot lists deterministically. --- plasma/models/mpi_runner.py | 2 +- plasma/primitives/shots.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 6f4b1681..188b349c 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -490,7 +490,7 @@ def load_shotlists(conf): #shot_list_train,shot_list_validate,shot_list_test = load_shotlists(conf) def mpi_make_predictions(conf,shot_list,loader): - + shot_list.sort()#make sure all replicas have the same list specific_builder = builder.ModelBuilder(conf) y_prime = [] diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index ff7125e2..1c28259c 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -197,6 +197,9 @@ def sublists(self,num,do_shuffle=True,equal_size=False): def shuffle(self): np.random.shuffle(self.shots) + def sort(self): + self.shots.sort() #will sort based on machine and number + def as_list(self): return self.shots @@ -249,6 +252,19 @@ def __init__(self,number=None,machine=None,signals=None,signals_dict=None,ttd=No else: print('Warning, disruption time (disruptivity) not set! Either set t_disrupt or is_disruptive') + def get_id_str(self): + return '{} : {}'.format(self.machine,self.number) + + def __lt__(self,other): + return self.get_id_str().__lt__(other.get_id_str()) + + def __eq__(self,other): + return self.get_id_str().__eq__(other.get_id_str()) + + def __hash__(self): + return self.get_id_str().__hash__() + + def __str__(self): string = 'number: {}\n'.format(self.number) string = 'machine: {}\n'.format(self.machine) From 85178c49f149ec3f609b4680820b60e64b4b1b74 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 18 May 2017 07:53:46 -0400 Subject: [PATCH 050/744] debug printouts --- plasma/models/mpi_runner.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index c07fa435..5c18fb98 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -516,12 +516,23 @@ def mpi_make_predictions(conf,shot_list,loader): if i % num_workers == task_index: X,y,shot_lengths,disr = loader.load_as_X_y_pred(shot_sublist) + + + #load data and fit on data y_p = model.predict(X, batch_size=conf['model']['pred_batch_size']) model.reset_states() y_p = loader.batch_output_to_array(y_p) y = loader.batch_output_to_array(y) + + for j in range(len(shot_sublist)): + if shot_sublist.shots[j].number == 74051: + sys.stdout.write("Length: {}".format(shot_lengths[j])) + sys.stdout.write("Pred Length: {}".format(len(y[j]))) + sys.stdout.flush() + + #cut arrays back y_p = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y_p)] y = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y)] @@ -549,6 +560,10 @@ def mpi_make_predictions(conf,shot_list,loader): y_prime_global = y_prime_global[:len(shot_list)] y_gold_global = y_gold_global[:len(shot_list)] disruptive_global = disruptive_global[:len(shot_list)] + + + + return y_prime_global,y_gold_global,disruptive_global From 5e7751a0d810a5e0d079f5696c2828efb0d862a9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 18 May 2017 08:15:00 -0400 Subject: [PATCH 051/744] mpi inference bug fixed via sorting and printout removed. Sorting not necessary in non-mpi version because there is only one version of the shot list --- examples/conf.yaml | 4 ++-- plasma/models/mpi_runner.py | 7 ------- plasma/utils/performance.py | 4 ---- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 1f955956..a2f98f90 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -51,7 +51,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 50.0 #1.0 #1.0 #warning time in seconds + T_warning: 0.1 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -85,7 +85,7 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.0001 #0.00005 #0.00005 + lr: 0.00001 #0.00005 #0.00005 lr_decay: 0.99 #0.9 stateful: True return_sequences: True diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 1fcc6c45..8a3ffa40 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -526,13 +526,6 @@ def mpi_make_predictions(conf,shot_list,loader): y_p = loader.batch_output_to_array(y_p) y = loader.batch_output_to_array(y) - for j in range(len(shot_sublist)): - if shot_sublist.shots[j].number == 74051: - sys.stdout.write("Length: {}".format(shot_lengths[j])) - sys.stdout.write("Pred Length: {}".format(len(y[j]))) - sys.stdout.flush() - - #cut arrays back y_p = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y_p)] y = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y)] diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 25b7a923..72e15407 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -299,9 +299,6 @@ def load_ith_file(self): print(results_files) dat = np.load(self.results_dir + results_files[self.i]) print("Loading results file {}".format(self.results_dir + results_files[self.i])) - #self.assert_same_lists(dat['shot_list_test'][()],dat['y_gold_test']) - #self.assert_same_lists(dat['shot_list_train'][()],ypt) - #self.assert_same_lists(dat['shot_list_train'][()],dat['y_gold_train']) if self.verbose: print('configuration: {} '.format(dat['conf'])) @@ -318,7 +315,6 @@ def load_ith_file(self): for mode in ['test','train']: print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) self.print_conf() - #print("1") #self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) #self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) From f6a32734946961e225aefcf8c88ef82b10e78b38 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 19 May 2017 04:14:09 -0400 Subject: [PATCH 052/744] Added maximum-based target. It uses a loss function that only penalizes the maximum value out of a temporal sequence, not the mean value. This is targeted for classification tasks in which only the classification of the sequence as a whole matters, not the individual time steps.? --- examples/conf.yaml | 12 +++--- plasma/conf.py | 2 +- plasma/conf_parser.py | 2 + plasma/models/builder.py | 5 ++- plasma/models/mpi_runner.py | 2 +- plasma/models/runner.py | 2 +- plasma/models/targets.py | 79 ++++++++++++++++++++++++++++++++++++- plasma/utils/evaluation.py | 40 +++++++++++-------- plasma/utils/performance.py | 2 +- 9 files changed, 117 insertions(+), 29 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index a2f98f90..b06d7c93 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -4,7 +4,7 @@ # for example tigress/alexeys fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'binary' #'ttd' #'hinge' +target: 'maxhinge' #'binary' #'ttd' #'hinge' paths: shot_files: ['CWall_clear.txt','CFC_unint.txt'] @@ -51,7 +51,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 0.1 #1.0 #1.0 #warning time in seconds + T_warning: 1.0 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -85,11 +85,11 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00001 #0.00005 #0.00005 - lr_decay: 0.99 #0.9 + lr: 0.00005 #0.00005 #0.00005 + lr_decay: 0.9 #0.9 stateful: True return_sequences: True - dropout_prob: 0.2 + dropout_prob: 0.3 #only relevant if we want to do mpi training. The number of steps with a single replica warmup_steps: 0 ignore_timesteps: 100 #how many initial timesteps to ignore during evaluation (to let the internal state settle) @@ -105,7 +105,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 3 + num_epochs: 2 use_mock_data: False data_parallel: False callbacks: diff --git a/plasma/conf.py b/plasma/conf.py index 28cef52d..1aefad05 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -38,7 +38,7 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') conf['paths']['shot_files'] = [jet_carbon_wall]#[d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = [d3d_full]#[jet_iterlike_wall] +conf['paths']['shot_files_test'] = [jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 9c5c1cf3..bc716406 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -46,6 +46,8 @@ def parameters(input_file): params['data']['num_signals'] = sum([sum([1 for predicate in subl if predicate]) for subl in signals_masks]) if params['target'] == 'hinge': params['data']['target'] = t.HingeTarget + elif params['target'] == 'maxhinge': + params['data']['target'] = t.MaxHingeTarget elif params['target'] == 'binary': params['data']['target'] = t.BinaryTarget elif params['target'] == 'ttd': diff --git a/plasma/models/builder.py b/plasma/models/builder.py index a45b0ef3..561fb19f 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -11,6 +11,8 @@ from keras.callbacks import Callback from keras.optimizers import * from keras.regularizers import l1,l2,l1_l2 + + import keras.backend as K import dill @@ -19,6 +21,7 @@ import numpy as np from copy import deepcopy + class LossHistory(Callback): def on_train_begin(self, logs=None): self.losses = [] @@ -201,7 +204,7 @@ def slicer_output_shape(input_shape,indices): else: x_out = Dense(1,activation=output_activation) (x_in) model = Model(inputs=x_input,outputs=x_out) - #model.summary() + print(loss_fn) model.compile(loss=loss_fn, optimizer=optimizer) #bug with tensorflow/Keras if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 8a3ffa40..0b467b97 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -564,7 +564,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader): y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target'].loss) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) return y_prime,y_gold,disruptive,roc_area,loss diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 8421eef5..43ee9799 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -339,7 +339,7 @@ def make_predictions_and_evaluate_gpu(conf,shot_list,loader): y_prime,y_gold,disruptive = make_predictions_gpu(conf,shot_list,loader) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target'].loss) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) return y_prime,y_gold,disruptive,roc_area,loss def make_evaluations_gpu(conf,shot_list,loader): diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 6bbfac26..3524f7a1 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -1,12 +1,19 @@ import numpy as np import abc +from keras.losses import hinge, squared_hinge, mean_absolute_percentage_error +from plasma.utils.evaluation import mae_np,mse_np,binary_crossentropy_np,hinge_np,squared_hinge_np +import keras.backend as K #Requirement: larger value must mean disruption more likely. class Target(object): activation = 'linear' loss = 'mse' + @abc.abstractmethod + def loss_np(y_true,y_pred): + return mse_np(y_true,y_pred) + @abc.abstractmethod def remapper(ttd,T_warning): return -ttd @@ -20,6 +27,9 @@ class BinaryTarget(Target): activation = 'sigmoid' loss = 'binary_crossentropy' + @staticmethod + def loss_np(y_true,y_pred): + return binary_crossentropy_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): @@ -38,6 +48,11 @@ class TTDTarget(Target): activation = 'linear' loss = 'mse' + + @staticmethod + def loss_np(y_true,y_pred): + return mse_np(y_true,y_pred) + @staticmethod def remapper(ttd,T_warning): mask = ttd < np.log10(T_warning) @@ -54,6 +69,11 @@ class TTDLinearTarget(Target): activation = 'linear' loss = 'mse' + @staticmethod + def loss_np(y_true,y_pred): + return mse_np(y_true,y_pred) + + @staticmethod def remapper(ttd,T_warning): ttd = 10**(ttd) @@ -67,10 +87,67 @@ def threshold_range(T_warning): return np.logspace(-6,np.log10(T_warning),100) +#implements a "maximum" driven loss function. Only the maximal value in the time sequence is punished. +#Also implements class weighting +class MaxHingeTarget(Target): + activation = 'linear' + + @staticmethod + def loss(y_true, y_pred): + fac = 100.0 + max_val = K.max(y_pred,axis=-2) #temporal axis! + max_val1 = K.repeat(max_val,K.shape(y_pred)[-2]) + mask = K.cast(K.equal(max_val1,y_pred),K.floatx()) + y_pred1 = mask * y_pred + (1-mask) * y_true + weight_mask = K.mean(y_true,axis=-1) + weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! + weight_mask = fac*weight_mask + (1 - weight_mask) + return weight_mask*squared_hinge(y_true,y_pred1) + + @staticmethod + def loss_np(y_true, y_pred): + fac = 100.0 + max_val = np.max(y_pred,axis=-2) #temporal axis! + max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) + max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) + mask = np.equal(max_val,y_pred) + mask = mask.astype(np.float32) + y_pred = mask * y_pred + (1-mask) * y_true + weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! + weight_mask = fac*weight_mask + (1 - weight_mask) + return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances + + + # def _loss_tensor_old(y_true, y_pred): + # max_val = K.max(y_pred) #temporal axis! + # mask = K.cast(K.equal(max_val,y_pred),K.floatx()) + # y_pred = mask * y_pred + (1-mask) * y_true + # return squared_hinge(y_true,y_pred) + + + @staticmethod + def remapper(ttd,T_warning,as_array_of_shots=True): + binary_ttd = 0*ttd + mask = ttd < np.log10(T_warning) + binary_ttd[mask] = 1.0 + binary_ttd[~mask] = -1.0 + return binary_ttd + + @staticmethod + def threshold_range(T_warning): + return np.concatenate((np.linspace(-2,-1.06,100),np.linspace(-1.06,-0.96,100),np.linspace(-0.96,2,50))) + + class HingeTarget(Target): activation = 'linear' - loss = 'squared_hinge' + loss = 'squared_hinge' #hinge + + @staticmethod + def loss_np(y_true, y_pred): + #return hinge_np(y_true,y_pred) + return squared_hinge_np(y_true,y_pred) + @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): binary_ttd = 0*ttd diff --git a/plasma/utils/evaluation.py b/plasma/utils/evaluation.py index 8a0986ed..42f4e35a 100644 --- a/plasma/utils/evaluation.py +++ b/plasma/utils/evaluation.py @@ -1,19 +1,25 @@ import numpy as np -def get_loss_from_list(y_pred_list,y_gold_list,mode): - return np.mean([get_loss(yp,yg,mode) for yp,yg in zip(y_pred_list,y_gold_list)]) - -def get_loss(y_pred,y_gold,mode): - if mode == 'mae': - return np.mean(np.abs(y_pred-y_gold)) - elif mode == 'binary_crossentropy': - return np.mean(- (y_gold*np.log(y_pred) + (1-y_gold)*np.log(1 - y_pred))) - elif mode == 'mse': - return np.mean((y_pred-y_gold)**2) - elif mode == 'hinge': - return np.mean(np.maximum(0.0,1 - y_pred*y_gold)) - elif mode == 'squared_hinge': - return np.mean(np.maximum(0.0,1 - y_pred*y_gold)**2) - else: - print('mode not recognized') - exit(1) +def get_loss_from_list(y_pred_list,y_gold_list,target): + return np.mean([get_loss(yg,yp,target) for yp,yg in zip(y_pred_list,y_gold_list)]) + +def get_loss(y_gold,y_pred,target): + return target.loss_np(y_gold,y_pred) + +def mae_np(y_true,y_pred): + return np.mean(np.abs(y_pred-y_gold)) + +def mse_np(y_true,y_pred): + return np.mean((y_pred-y_gold)**2) + +def binary_crossentropy_np(y_true,y_pred): + return np.mean(- (y_gold*np.log(y_pred) + (1-y_gold)*np.log(1 - y_pred))) + +def hinge_np(y_true,y_pred): + return np.mean(np.maximum(0.0,1 - y_pred*y_gold)) + +def squared_hinge_np(y_true,y_pred): + return np.mean(np.maximum(0.0,1 - y_pred*y_gold)**2) + + + diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 72e15407..7cdbfa30 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -651,7 +651,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') ax.set_xlabel('TTD [ms]') - ax.legend(loc = 'best',fontsize=10) + ax.legend(loc = 'upper center',fontsize=10) plt.setp(ax.get_yticklabels(),fontsize=7) # ax.grid() if save_fig: From 5dae443604c032d9afaa487bc440b7247411ced8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 21 May 2017 04:41:04 -0400 Subject: [PATCH 053/744] added max target, only the maximum value is penalized --- examples/conf.yaml | 8 ++++---- plasma/conf.py | 4 ++-- plasma/models/builder.py | 1 - plasma/models/targets.py | 10 ++++++++-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index b06d7c93..ffd26e6c 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -51,7 +51,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 1.0 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 0.25 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -85,8 +85,8 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00005 #0.00005 #0.00005 - lr_decay: 0.9 #0.9 + lr: 0.0002 #0.00005 #0.00005 + lr_decay: 0.97 #0.9 stateful: True return_sequences: True dropout_prob: 0.3 @@ -105,7 +105,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 2 + num_epochs: 100 use_mock_data: False data_parallel: False callbacks: diff --git a/plasma/conf.py b/plasma/conf.py index 1aefad05..f2d418ab 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -37,8 +37,8 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [jet_carbon_wall]#[d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = [jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] +conf['paths']['shot_files'] = [d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files_test'] = []#[jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 561fb19f..cd7a9474 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -204,7 +204,6 @@ def slicer_output_shape(input_shape,indices): else: x_out = Dense(1,activation=output_activation) (x_in) model = Model(inputs=x_input,outputs=x_out) - print(loss_fn) model.compile(loss=loss_fn, optimizer=optimizer) #bug with tensorflow/Keras if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 3524f7a1..42841a2b 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -95,6 +95,8 @@ class MaxHingeTarget(Target): @staticmethod def loss(y_true, y_pred): fac = 100.0 + #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) + overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) max_val = K.max(y_pred,axis=-2) #temporal axis! max_val1 = K.repeat(max_val,K.shape(y_pred)[-2]) mask = K.cast(K.equal(max_val1,y_pred),K.floatx()) @@ -102,11 +104,14 @@ def loss(y_true, y_pred): weight_mask = K.mean(y_true,axis=-1) weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) - return weight_mask*squared_hinge(y_true,y_pred1) + #return weight_mask*squared_hinge(y_true,y_pred1) + return overall_fac*weight_mask*hinge(y_true,y_pred1) @staticmethod def loss_np(y_true, y_pred): fac = 100.0 + #print(y_pred.shape) + overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) max_val = np.max(y_pred,axis=-2) #temporal axis! max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) @@ -115,7 +120,8 @@ def loss_np(y_true, y_pred): y_pred = mask * y_pred + (1-mask) * y_true weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) - return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances + #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances + return np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances # def _loss_tensor_old(y_true, y_pred): From fff3f76c9597ef8f81eebb8241fe4d48a1e2e143 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 21 May 2017 04:42:50 -0400 Subject: [PATCH 054/744] adding buffer based batch generator (with partial state reset and without chunks. Also adding option to cut end of shot (less than T_min_warn) for training --- examples/conf.yaml | 1 + examples/performance_analysis.py | 9 ++- plasma/models/loader.py | 112 +++++++++++++++++++++++++++++++ plasma/models/mpi_runner.py | 15 +++-- plasma/preprocessor/normalize.py | 10 +-- 5 files changed, 136 insertions(+), 11 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 1f955956..514dd01a 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -37,6 +37,7 @@ paths: ['jpf/gs/bl-fdwdt 0) + batch_idx = np.where(end_indices == 0)[0][0] + if sig_len > Xbuff.shape[1]: + self.resize_buffer(Xbuff,new_length+length) + self.resize_buffer(Ybuff,new_length+length) + Xbuff[batch_idx,:sig_len,:] = sig[-sig_len:] + Ybuff[batch_idx,:sig_len,:] = res[-sig_len:] + end_indices[batch_idx] += sig_len + print("Filling buffer at index {}".format(batch_idx)) + return batch_idx + + def return_from_training_buffer(self,Xbuff,Ybuff,end_indices): + length = self.conf['model']['length'] + end_indices -= length + assert(np.all(end_indices >= 0)) + X = Xbuff[:,:length,:] + Y = Ybuff[:,:length,:] + self.shift_buffer(Xbuff,length) + self.shift_buffer(Ybuff,length) + return X,Y + + def shift_buffer(self,buff,length): + Xbuff[:,:-length,:] = Xbuff[:,length:,:] + + + def resize_buffer(self,buff,new_length): + old_length = buff.shape[1] + new_buff = np.empty((batch_size,new_length,num_signals)) + new_buff[:,:old_length,:] = buff + print("Resizing buffer to new length {}".format(new_length)) + return new_buff + + + + + def training_batch_generator_partial_reset(self,shot_list): + """ + The method implements a training batch generator as a Python generator with a while-loop. + It iterates indefinitely over the data set and returns one mini-batch of data at a time. + NOTE: Can be inefficient during distributed training because one process loading data will + cause all other processes to stall. + + Argument list: + - shot_list: + + Returns: + - One mini-batch of data and label as a Numpy array: X[start:end],y[start:end] + - reset_states_now: boolean flag indicating when to reset state during stateful RNN training + - num_so_far,num_total: number of samples generated so far and the total dataset size as per shot_list + """ + batch_size = self.conf['training']['batch_size'] + length = self.conf['model']['length'] + num_signals = sum([sig.num_channels for sig in use_signals]) + sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) + Xbuff = np.empty((batch_size,) + sig.shape) + Ybuff = np.empty((batch_size,) + res.shape) + end_indices = np.zeros(batch_size,dtype=np.int) + batches_to_reset = np.ones(batch_size,dtype=np.bool) + num_at_once = self.conf['training']['num_shots_at_once'] + # epoch = 0 + num_total = len(shot_list) + num_so_far = 0 + returned = False + while True: + # the list of all shots + shot_list.shuffle() + for shot in shot_list: + while not np.any(end_indices == 0): + X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) + reset_states_now,num_so_far,num_total + yield X,Y,batches_to_reset,num_so_far,num_total + returned = True + batches_to_reset[:] = False + + batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot) + batches_to_reset[batch_idx] = True + if returned: + num_so_far += 1 + # epoch += 1 @@ -166,6 +250,34 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): else: return signals,results,shot_lengths,disruptive + def get_signal_result_from_shot(self,shot,prediction_mode=False): + prepath = self.conf['paths']['processed_prepath'] + use_signals = self.conf['paths']['use_signals'] + assert(isinstance(shot,Shot)) + assert(shot.valid) + shot.restore(prepath) + if self.normalizer is not None: + self.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + + if self.conf['training']['use_mock_data']: + signal,ttd = self.get_mock_data() + ttd,signal = shot.get_data_arrays(use_signals) + if len(ttd) < self.conf['model']['length']: + print(ttd) + print(shot) + print(shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + + if len(ttd.shape) == 1: + ttd = np.expand_dims(ttd,axis=1) + shot.make_light() + if not prediction_mode: + return signal,ttd + else: + return signal,ttd,shot.is_disruptive def batch_output_to_array(self,output,batch_size = None): diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index aa0dc001..076c0253 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -37,6 +37,7 @@ from pprint import pprint from plasma.conf import conf +from plasma.utils.state_reset import reset_states backend = conf['model']['backend'] @@ -367,18 +368,21 @@ def train_epoch(self): while (self.num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: try: - batch_xs,batch_ys,reset_states_now,num_so_far_curr,num_total = next(batch_iterator_func) + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) except StopIteration: print("Resetting batch iterator.") self.num_so_far_accum = self.num_so_far_indiv batch_iterator_func = self.batch_iterator() - batch_xs,batch_ys,reset_states_now,num_so_far_curr,num_total = next(batch_iterator_func) + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) self.num_so_far_indiv = self.num_so_far_accum+num_so_far_curr num_batches_current +=1 - if reset_states_now: - self.model.reset_states() + # if batches_to_reset: + # self.model.reset_states(batches_to_reset) + if np.any(batches_to_reset): + print("Resetting batch {}".format(np.where(batches_to_reset))) + reset_states(model,batches_to_reset) warmup_phase = (step < self.warmup_steps and self.epoch == 0) num_replicas = 1 if warmup_phase else self.num_replicas @@ -576,7 +580,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non optimizer = MPIAdam(lr=lr) print('{} epochs left to go'.format(num_epochs - 1 - e)) - batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) + # batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) + batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) mpi_model.compile(loss=conf['data']['target'].loss) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index d4fbccf5..18b26101 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -123,10 +123,12 @@ def train_on_files(self,shot_files,use_shots): def cut_end_of_shot(self,shot): - T_min_warn = self.conf['data']['T_min_warn'] - for key in shot.signals_dict: - shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] - shot.ttd = shot.ttd[:-T_min_warn] + cut_shot_ends = self.conf['data']['cut_shot_ends'] + if cut_shot_ends: + T_min_warn = self.conf['data']['T_min_warn'] + for key in shot.signals_dict: + shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] + shot.ttd = shot.ttd[:-T_min_warn] # def apply_mask(self,shot): # use_signals = self.conf['paths']['use_signals'] From 23a48fa431328e54c6b1a0a9c38ab2600ed4a9a8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 21 May 2017 04:44:54 -0400 Subject: [PATCH 055/744] adding functions to reset states partially (within a batch) --- plasma/utils/state_reset.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 plasma/utils/state_reset.py diff --git a/plasma/utils/state_reset.py b/plasma/utils/state_reset.py new file mode 100644 index 00000000..d9681d6d --- /dev/null +++ b/plasma/utils/state_reset.py @@ -0,0 +1,33 @@ +from __future__ import print_function +import keras.backend as K +import numpy as np + +def get_states(model): + all_states = [] + for layer in model.layers: + if hasattr(layer,"states"): + layer_states = [] + for state in layer.states: + layer_states.append(K.get_value(state)) + # print('hi') + # print(K.get_value(state)) + all_states.append(layer_states) + # print(all_states) + return all_states + +def set_states(model, all_states): + i = 0 + for layer in model.layers: + if hasattr(layer,"states"): + layer.reset_states(all_states[i]) + i += 1 + +def reset_states(model, batches_to_reset): + old_states = get_states(model) + model.reset_states() + new_states = get_states(model) + for i,layer_states in enumerate(new_states): + for j,within_layer_state in enumerate(layer_states): + assert(len(batches_to_reset) == within_layer_state.shape[0]) + within_layer_state[~batches_to_reset,:] = old_states[i][j][~batches_to_reset,:] + set_states(model,new_states) From 254ec6e2acef7e05018fc9dff7ddfe28a64d6b98 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 21 May 2017 05:39:41 -0400 Subject: [PATCH 056/744] debugging buffer based training --- examples/conf.yaml | 2 +- examples/performance_analysis.py | 2 +- plasma/models/loader.py | 19 ++++++++++--------- plasma/models/mpi_runner.py | 4 ++-- plasma/models/targets.py | 4 ++-- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index d1f075ce..99f10fc8 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -106,7 +106,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 100 + num_epochs: 30 use_mock_data: False data_parallel: False callbacks: diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index ef0d58d0..c5f138e0 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -12,7 +12,7 @@ cut_shot_ends = conf['data']['cut_shot_ends'] dt = conf['data']['dt'] T_max_warn = int(round(conf['data']['T_warning']/dt)) -T_min_warn = int(round(conf['data']['T_min_warn']/dt)) +T_min_warn = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) if cut_shot_ends: T_max_warn = T_max_warn-T_min_warn T_min_warn = 0 diff --git a/plasma/models/loader.py b/plasma/models/loader.py index d00ad261..e277cef5 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -90,13 +90,13 @@ def fill_training_buffer(self,Xbuff,Ybuff,end_indices,shot): assert(sig_len > 0) batch_idx = np.where(end_indices == 0)[0][0] if sig_len > Xbuff.shape[1]: - self.resize_buffer(Xbuff,new_length+length) - self.resize_buffer(Ybuff,new_length+length) + Xbuff = self.resize_buffer(Xbuff,sig_len+length) + Ybuff = self.resize_buffer(Ybuff,sig_len+length) Xbuff[batch_idx,:sig_len,:] = sig[-sig_len:] Ybuff[batch_idx,:sig_len,:] = res[-sig_len:] end_indices[batch_idx] += sig_len - print("Filling buffer at index {}".format(batch_idx)) - return batch_idx + #print("Filling buffer at index {}".format(batch_idx)) + return Xbuff,Ybuff,batch_idx def return_from_training_buffer(self,Xbuff,Ybuff,end_indices): length = self.conf['model']['length'] @@ -109,14 +109,16 @@ def return_from_training_buffer(self,Xbuff,Ybuff,end_indices): return X,Y def shift_buffer(self,buff,length): - Xbuff[:,:-length,:] = Xbuff[:,length:,:] + buff[:,:-length,:] = buff[:,length:,:] def resize_buffer(self,buff,new_length): old_length = buff.shape[1] + batch_size = buff.shape[0] + num_signals = buff.shape[2] new_buff = np.empty((batch_size,new_length,num_signals)) new_buff[:,:old_length,:] = buff - print("Resizing buffer to new length {}".format(new_length)) + #print("Resizing buffer to new length {}".format(new_length)) return new_buff @@ -140,7 +142,6 @@ def training_batch_generator_partial_reset(self,shot_list): """ batch_size = self.conf['training']['batch_size'] length = self.conf['model']['length'] - num_signals = sum([sig.num_channels for sig in use_signals]) sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) Xbuff = np.empty((batch_size,) + sig.shape) Ybuff = np.empty((batch_size,) + res.shape) @@ -157,12 +158,12 @@ def training_batch_generator_partial_reset(self,shot_list): for shot in shot_list: while not np.any(end_indices == 0): X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) - reset_states_now,num_so_far,num_total + #print(end_indices) yield X,Y,batches_to_reset,num_so_far,num_total returned = True batches_to_reset[:] = False - batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot) + Xbuff,Ybuff,batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot) batches_to_reset[batch_idx] = True if returned: num_so_far += 1 diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 765396ee..5e0e5f25 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -381,8 +381,8 @@ def train_epoch(self): # if batches_to_reset: # self.model.reset_states(batches_to_reset) if np.any(batches_to_reset): - print("Resetting batch {}".format(np.where(batches_to_reset))) - reset_states(model,batches_to_reset) + #print("Resetting batch {}".format(np.where(batches_to_reset))) + reset_states(self.model,batches_to_reset) warmup_phase = (step < self.warmup_steps and self.epoch == 0) num_replicas = 1 if warmup_phase else self.num_replicas diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 42841a2b..659e0dd5 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -94,7 +94,7 @@ class MaxHingeTarget(Target): @staticmethod def loss(y_true, y_pred): - fac = 100.0 + fac = 10.0 #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) max_val = K.max(y_pred,axis=-2) #temporal axis! @@ -109,7 +109,7 @@ def loss(y_true, y_pred): @staticmethod def loss_np(y_true, y_pred): - fac = 100.0 + fac = 10.0 #print(y_pred.shape) overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) max_val = np.max(y_pred,axis=-2) #temporal axis! From 3907ffbcf6c00e824085501a32649014a2ee960a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 21 May 2017 07:05:02 -0400 Subject: [PATCH 057/744] added data prefetching process for training generator (via buffer) in the loader. This runs in parallel to the GPU training and outsources prefetching. Shortens training time and avoids problems with unsynchronized and irregular prefetching which would slow down distributed training. --- plasma/models/loader.py | 20 ++++++++++++++++++-- plasma/models/mpi_runner.py | 3 ++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index e277cef5..1874e1f4 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -12,6 +12,7 @@ import numpy as np from plasma.primitives.shots import Shot +import multiprocessing as mp class Loader(object): ''' @@ -169,8 +170,23 @@ def training_batch_generator_partial_reset(self,shot_list): num_so_far += 1 # epoch += 1 - - + def fill_batch_queue(self,shot_list,queue): + print("Starting thread to fill queue") + gen = self.training_batch_generator_partial_reset(shot_list) + while True: + ret = next(gen) + queue.put(ret,block=True,timeout=-1) + + + def training_batch_generator_process(self,shot_list): + queue = mp.Queue() + proc = mp.Process(target = self.fill_batch_queue,args=(shot_list,queue)) + proc.start() + while True: + yield queue.get(True) + proc.join() + queue.close() + def load_as_X_y_list(self,shot_list,verbose=False,prediction_mode=False): """ diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 5e0e5f25..6a26d2ac 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -589,7 +589,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('{} epochs left to go'.format(num_epochs - 1 - e)) # batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) - batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + #batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) mpi_model.compile(loss=conf['data']['target'].loss) From 7684509200d683c2209436822065b0bfbe7a8254 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 21 May 2017 18:48:34 -0400 Subject: [PATCH 058/744] adding buffer based training to non mpi version --- plasma/models/runner.py | 146 ++++++++++++++++++++++++++++++++++------ 1 file changed, 125 insertions(+), 21 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 43ee9799..6f65abde 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -23,6 +23,97 @@ backend = conf['model']['backend'] +# def train(conf,shot_list_train,loader): + +# np.random.seed(1) + +# validation_losses = [] +# validation_roc = [] +# training_losses = [] +# if conf['training']['validation_frac'] > 0.0: +# shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-conf['training']['validation_frac'],do_shuffle=True) +# print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) +# print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + +# if backend == 'tf' or backend == 'tensorflow': +# import tensorflow as tf +# os.environ['KERAS_BACKEND'] = 'tensorflow' +# from keras.backend.tensorflow_backend import set_session +# config = tf.ConfigProto(device_count={"GPU":1}) +# set_session(tf.Session(config=config)) +# else: +# os.environ['KERAS_BACKEND'] = 'theano' +# os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' +# import theano + +# from keras.utils.generic_utils import Progbar +# from keras import backend as K +# from plasma.models import builder + +# print('Build model...',end='') +# specific_builder = builder.ModelBuilder(conf) +# train_model = specific_builder.build_model(False) +# print('...done') + +# #load the latest epoch we did. Returns -1 if none exist yet +# e = specific_builder.load_model_weights(train_model) + +# num_epochs = conf['training']['num_epochs'] +# num_at_once = conf['training']['num_shots_at_once'] +# lr_decay = conf['model']['lr_decay'] +# lr = conf['model']['lr'] +# print('{} epochs left to go'.format(num_epochs - 1 - e)) +# while e < num_epochs-1: +# e += 1 +# print('\nEpoch {}/{}'.format(e+1,num_epochs)) +# pbar = Progbar(len(shot_list_train)) + +# #shuffle during every iteration +# shot_list_train.shuffle() +# shot_sublists = shot_list_train.sublists(num_at_once) +# training_losses_tmp = [] + +# #decay learning rate each epoch: +# K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) + +# #print('Learning rate: {}'.format(train_model.optimizer.lr.get_value())) +# for (i,shot_sublist) in enumerate(shot_sublists): +# X_list,y_list = loader.load_as_X_y_list(shot_sublist) +# for j,(X,y) in enumerate(zip(X_list,y_list)): +# history = builder.LossHistory() +# #load data and fit on data +# train_model.fit(X,y, +# batch_size=Loader.get_batch_size(conf['training']['batch_size'],prediction_mode=False), +# epochs=1,shuffle=False,verbose=0, +# validation_split=0.0,callbacks=[history]) +# train_model.reset_states() +# train_loss = np.mean(history.losses) +# training_losses_tmp.append(train_loss) + +# pbar.add(1.0*len(shot_sublist)/len(X_list), values=[("train loss", train_loss)]) +# loader.verbose=False#True during the first iteration +# sys.stdout.flush() +# training_losses.append(np.mean(training_losses_tmp)) +# specific_builder.save_model_weights(train_model,e) + +# if conf['training']['validation_frac'] > 0.0: +# _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) +# validation_losses.append(loss) +# validation_roc.append(roc_area) + +# print('=========Summary========') +# print('Training Loss: {:.3e}'.format(training_losses[-1])) +# if conf['training']['validation_frac'] > 0.0: +# print('Validation Loss: {:.3e}'.format(validation_losses[-1])) +# print('Validation ROC: {:.4f}'.format(validation_roc[-1])) + + +# # plot_losses(conf,[training_losses],specific_builder,name='training') +# if conf['training']['validation_frac'] > 0.0: +# plot_losses(conf,[training_losses,validation_losses,validation_roc],specific_builder,name='training_validation_roc') +# print('...done') + + def train(conf,shot_list_train,loader): np.random.seed(1) @@ -57,41 +148,54 @@ def train(conf,shot_list_train,loader): #load the latest epoch we did. Returns -1 if none exist yet e = specific_builder.load_model_weights(train_model) + batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) + batch_iterator = batch_generator() num_epochs = conf['training']['num_epochs'] num_at_once = conf['training']['num_shots_at_once'] lr_decay = conf['model']['lr_decay'] lr = conf['model']['lr'] print('{} epochs left to go'.format(num_epochs - 1 - e)) + num_so_far_accum = 0 + num_so_far = 0 while e < num_epochs-1: - e += 1 + # e += 1 print('\nEpoch {}/{}'.format(e+1,num_epochs)) pbar = Progbar(len(shot_list_train)) - #shuffle during every iteration - shot_list_train.shuffle() - shot_sublists = shot_list_train.sublists(num_at_once) - training_losses_tmp = [] - #decay learning rate each epoch: K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) #print('Learning rate: {}'.format(train_model.optimizer.lr.get_value())) - for (i,shot_sublist) in enumerate(shot_sublists): - X_list,y_list = loader.load_as_X_y_list(shot_sublist) - for j,(X,y) in enumerate(zip(X_list,y_list)): - history = builder.LossHistory() - #load data and fit on data - train_model.fit(X,y, - batch_size=Loader.get_batch_size(conf['training']['batch_size'],prediction_mode=False), - epochs=1,shuffle=False,verbose=0, - validation_split=0.0,callbacks=[history]) - train_model.reset_states() - train_loss = np.mean(history.losses) - training_losses_tmp.append(train_loss) - - pbar.add(1.0*len(shot_sublist)/len(X_list), values=[("train loss", train_loss)]) - loader.verbose=False#True during the first iteration + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) + num_batches_minimum = 100 + num_batches_current = 0 + training_losses_tmp = [] + + while (num_so_far-e*num_total) < num_total or num_batches_current < num_batches_minimum: + num_so_far_old = num_so_far + try: + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator) + except StopIteration: + print("Resetting batch iterator.") + num_so_far_accum = num_so_far + batch_iterator = batch_generator() + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator) + num_so_far = num_so_far_accum+num_so_far_curr + + num_batches_current +=1 + + if np.any(batches_to_reset): + #print("Resetting batch {}".format(np.where(batches_to_reset))) + reset_states(self.model,batches_to_reset) + + loss = train_model.train_on_batch(batch_xs,batch_ys) + training_losses_tmp.append(loss) + pbar.add(num_so_far - num_so_far_old, values=[("train loss", np.mean(training_losses_tmp))]) + loader.verbose=False#True during the first iteration + + + e = 1.0*self.num_so_far/num_total sys.stdout.flush() training_losses.append(np.mean(training_losses_tmp)) specific_builder.save_model_weights(train_model,e) From e81c826ac52d8bac91267e6fcb3f49543be04915 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 22 May 2017 04:51:17 -0400 Subject: [PATCH 059/744] added data pre-fetching generator with separate process for prefetching. Also cleanup for this new process. This works in conjuction with buffer based data loading --- examples/conf.yaml | 8 ++++---- examples/learn_processed.py | 2 +- plasma/conf.py | 4 ++-- plasma/models/builder.py | 4 +++- plasma/models/loader.py | 29 +++++++++++++++++++++++++++++ plasma/models/mpi_runner.py | 17 ++++++++++++----- plasma/models/runner.py | 28 ++++++++++++++++------------ 7 files changed, 67 insertions(+), 25 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 99f10fc8..a90c5feb 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -52,7 +52,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 0.25 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 1.0 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -86,8 +86,8 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.0002 #0.00005 #0.00005 - lr_decay: 0.97 #0.9 + lr: 0.0001 #0.00005 #0.00005 + lr_decay: 0.9 #0.9 stateful: True return_sequences: True dropout_prob: 0.3 @@ -106,7 +106,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 30 + num_epochs: 7 use_mock_data: False data_parallel: False callbacks: diff --git a/examples/learn_processed.py b/examples/learn_processed.py index 06220eb1..3a5639c0 100644 --- a/examples/learn_processed.py +++ b/examples/learn_processed.py @@ -136,7 +136,7 @@ y_prime = y_prime_train + y_prime_test disruptive = np.concatenate((disruptive_train,disruptive_test)) -shot_list.make_light() +shot_list_validate.make_light() shot_list_test.make_light() shot_list_train.make_light() diff --git a/plasma/conf.py b/plasma/conf.py index f2d418ab..a0764b54 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -37,8 +37,8 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = []#[jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] +conf['paths']['shot_files'] = [jet_carbon_wall]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files_test'] = [jet_iterlike_wall]#[jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index cd7a9474..bb3cc240 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -190,7 +190,7 @@ def slicer_output_shape(input_shape,indices): # # else: # x_in = x_input - #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) + x_in = TimeDistributed(Dense(100,activation='tanh')) (x_in) #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) # x = TimeDistributed(Dense(2*(num_0D+num_1D))) # model.add(TimeDistributed(Dense(num_density_channels,bias=True),batch_input_shape=batch_input_shape)) @@ -200,6 +200,7 @@ def slicer_output_shape(input_shape,indices): bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) x_in = Dropout(dropout_prob) (x_in) if return_sequences: + x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) else: x_out = Dense(1,activation=output_activation) (x_in) @@ -213,6 +214,7 @@ def slicer_output_shape(input_shape,indices): K.get_session().run(tf.global_variables_initializer()) model.reset_states() + #model.summary() #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output return model diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 1874e1f4..c376d37f 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -596,3 +596,32 @@ def load_shotlists(self,conf): shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] return shot_list_train,shot_list_validate,shot_list_test + + + + + + + +class ProcessGenerator(object): + def __init__(self,generator): + self.generator = generator + self.proc = mp.Process(target=self.fill_batch_queue) + self.queue = mp.Queue() + self.proc.start() + + def fill_batch_queue(self): + print("Starting process to fetch data") + while True: + self.queue.put(next(self.generator),True,-1) + + def __next__(self): + return self.queue.get(True) + + def next(self): + return self.__next__() + + def __exit__(self): + self.proc.terminate() + self.queue.close() + diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 6a26d2ac..a8ba8a72 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -38,6 +38,7 @@ from pprint import pprint from plasma.conf import conf from plasma.utils.state_reset import reset_states +from plasma.models.loader import ProcessGenerator backend = conf['model']['backend'] @@ -159,7 +160,7 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No self.DUMMY_LR = 0.1 self.comm = comm self.batch_size = batch_size - self.batch_iterator_func = batch_iterator() + self.batch_iterator_func = ProcessGenerator(batch_iterator()) self.batch_iterator = batch_iterator self.warmup_steps=warmup_steps self.num_workers = comm.Get_size() @@ -170,6 +171,9 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No else: self.num_replicas = num_replicas + def close(self): + self.batch_iterator_func.__exit__() + def set_lr(self,lr): self.lr = lr @@ -372,7 +376,8 @@ def train_epoch(self): except StopIteration: print("Resetting batch iterator.") self.num_so_far_accum = self.num_so_far_indiv - batch_iterator_func = self.batch_iterator() + self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + batch_iterator_func = self.batch_iterator_func batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) self.num_so_far_indiv = self.num_so_far_accum+num_so_far_curr @@ -579,6 +584,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non #load the latest epoch we did. Returns -1 if none exist yet e = specific_builder.load_model_weights(train_model) + e_old = e num_epochs = conf['training']['num_epochs'] lr_decay = conf['model']['lr_decay'] @@ -589,8 +595,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('{} epochs left to go'.format(num_epochs - 1 - e)) # batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) - #batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) - batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) + batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + #batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) mpi_model.compile(loss=conf['data']['target'].loss) @@ -612,7 +618,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print_unique('\nEpoch {}/{}'.format(e,num_epochs)) (step,ave_loss,curr_loss,num_so_far,effective_epochs) = mpi_model.train_epoch() - e = effective_epochs + e = e_old + effective_epochs loader.verbose=False #True during the first iteration if task_index == 0: @@ -638,3 +644,4 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.on_epoch_end(int(round(e)), epoch_logs) callbacks.on_train_end() + mpi_model.close() diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 6f65abde..8fa2e206 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -17,9 +17,10 @@ import pathos.multiprocessing as mp from plasma.conf import conf -from plasma.models.loader import Loader +from plasma.models.loader import Loader, ProcessGenerator from plasma.utils.performance import PerformanceAnalyzer from plasma.utils.evaluation import * +from plasma.utils.state_reset import reset_states backend = conf['model']['backend'] @@ -148,8 +149,9 @@ def train(conf,shot_list_train,loader): #load the latest epoch we did. Returns -1 if none exist yet e = specific_builder.load_model_weights(train_model) - batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) - batch_iterator = batch_generator() + e_start = e + batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + batch_iterator = ProcessGenerator(batch_generator()) num_epochs = conf['training']['num_epochs'] num_at_once = conf['training']['num_shots_at_once'] @@ -158,8 +160,9 @@ def train(conf,shot_list_train,loader): print('{} epochs left to go'.format(num_epochs - 1 - e)) num_so_far_accum = 0 num_so_far = 0 + num_total = np.inf while e < num_epochs-1: - # e += 1 + e += 1 print('\nEpoch {}/{}'.format(e+1,num_epochs)) pbar = Progbar(len(shot_list_train)) @@ -167,40 +170,40 @@ def train(conf,shot_list_train,loader): K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) #print('Learning rate: {}'.format(train_model.optimizer.lr.get_value())) - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) num_batches_minimum = 100 num_batches_current = 0 training_losses_tmp = [] - while (num_so_far-e*num_total) < num_total or num_batches_current < num_batches_minimum: + while num_so_far < (e - e_start)*num_total or num_batches_current < num_batches_minimum: num_so_far_old = num_so_far try: batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator) except StopIteration: print("Resetting batch iterator.") num_so_far_accum = num_so_far - batch_iterator = batch_generator() + batch_iterator = ProcessGenerator(batch_generator()) batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator) - num_so_far = num_so_far_accum+num_so_far_curr + num_so_far = num_so_far_accum+num_so_far_curr num_batches_current +=1 if np.any(batches_to_reset): #print("Resetting batch {}".format(np.where(batches_to_reset))) - reset_states(self.model,batches_to_reset) + reset_states(train_model,batches_to_reset) loss = train_model.train_on_batch(batch_xs,batch_ys) training_losses_tmp.append(loss) - pbar.add(num_so_far - num_so_far_old, values=[("train loss", np.mean(training_losses_tmp))]) + pbar.add(num_so_far - num_so_far_old, values=[("train loss", loss)]) loader.verbose=False#True during the first iteration - e = 1.0*self.num_so_far/num_total + e = e_start+1.0*num_so_far/num_total sys.stdout.flush() training_losses.append(np.mean(training_losses_tmp)) - specific_builder.save_model_weights(train_model,e) + specific_builder.save_model_weights(train_model,int(round(e))) if conf['training']['validation_frac'] > 0.0: + print("prediction on GPU...") _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) validation_losses.append(loss) validation_roc.append(roc_area) @@ -215,6 +218,7 @@ def train(conf,shot_list_train,loader): # plot_losses(conf,[training_losses],specific_builder,name='training') if conf['training']['validation_frac'] > 0.0: plot_losses(conf,[training_losses,validation_losses,validation_roc],specific_builder,name='training_validation_roc') + batch_iterator.__exit__() print('...done') class HyperRunner(object): From 8c7ce1bdbd961458642c2febe298dc7def72bda5 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 22 May 2017 12:35:24 -0400 Subject: [PATCH 060/744] Implement Tensorboard callback as a separate class (not using Keras at this time, due to issue with validation generator) --- plasma/models/mpi_runner.py | 107 ++++++++++++++++++++++++++++++++---- 1 file changed, 97 insertions(+), 10 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index ceb9fbc2..0d9efb85 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -26,6 +26,8 @@ sys.setrecursionlimit(10000) import getpass +import pdb + #import keras sequentially because it otherwise reads from ~/.keras/keras.json with too many threads. #from mpi_launch_tensorflow import get_mpi_task_index from mpi4py import MPI @@ -311,9 +313,7 @@ def build_callbacks(self,conf,callbacks_list): if not os.path.exists(csvlog_save_path): os.makedirs(csvlog_save_path) - tensorboard_save_path = conf['paths']['tensorboard_save_path'] callbacks_list = conf['callbacks']['list'] - write_grads = conf['callbacks']['write_grads'] callbacks = [cbks.BaseLogger()] callbacks += [self.history] @@ -321,14 +321,11 @@ def build_callbacks(self,conf,callbacks_list): if "earlystop" in callbacks_list: callbacks += [cbks.EarlyStopping(patience=patience, monitor=monitor, mode=mode)] - if "tensorboard" in callbacks_list and backend != "theano" and task_index == 0: - callbacks += [cbks.TensorBoard(log_dir=tensorboard_save_path, histogram_freq=1, write_graph=True, write_grads=write_grads, embeddings_freq=1)] if "lr_scheduler" in callbacks_list: pass return cbks.CallbackList(callbacks) - def train_epoch(self): ''' The purpose of the method is to perform distributed mini-batch SGD for one epoch. @@ -512,7 +509,6 @@ def mpi_make_predictions(conf,shot_list,loader): if task_index != 0: loader.verbose = False - for (i,shot_sublist) in enumerate(shot_sublists): if i % num_workers == task_index: @@ -580,7 +576,13 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) + + tensorboard = None if backend != "theano" and task_index == 0: + tensorboard_save_path = conf['paths']['tensorboard_save_path'] + write_grads = conf['callbacks']['write_grads'] + tensorboard = TensorBoard(log_dir=tensorboard_save_path,histogram_freq=1,write_graph=True,write_grads=write_grads) + tensorboard.set_model(mpi_model.model) mpi_model.model.summary() mpi_model.compile(loss=conf['data']['target'].loss) @@ -593,6 +595,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.set_params({ 'epochs': num_epochs, 'metrics': callback_metrics, + 'batch_size': batch_size, }) callbacks.on_train_begin() @@ -611,10 +614,6 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non epoch_logs = {} roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) - #validation_losses.append(loss) - #validation_roc.append(roc_area) - #training_losses.append(ave_loss) - epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss @@ -627,4 +626,92 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.on_epoch_end(int(round(e)), epoch_logs) + #tensorboard + val_generator = partial(loader.validation_batch_generator,shot_list=shot_list_validate)() + val_steps = 20 + tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) + callbacks.on_train_end() + if task_index == 0: + tensorboard.on_train_end() + + +class TensorBoard(object): + def __init__(self, log_dir='./logs', + histogram_freq=0, + validation_steps=0, + write_graph=True, + write_grads=False): + if K.backend() != 'tensorflow': + raise RuntimeError('TensorBoard callback only works ' + 'with the TensorFlow backend.') + self.log_dir = log_dir + self.histogram_freq = histogram_freq + self.merged = None + self.writer = None + self.write_graph = write_graph + self.write_grads = write_grads + self.validation_steps = validation_steps + self.sess = None + self.model = None + + def set_model(self, model): + self.model = model + self.sess = K.get_session() + + if self.histogram_freq and self.merged is None: + for layer in self.model.layers: + + for weight in layer.weights: + tf.summary.histogram(weight.name, weight) + if self.write_grads: + grads = model.optimizer.get_gradients(model.total_loss, + weight) + tf.summary.histogram('{}_grad'.format(weight.name), grads) + + if hasattr(layer, 'output'): + tf.summary.histogram('{}_out'.format(layer.name), + layer.output) + self.merged = tf.summary.merge_all() + + if self.write_graph: + self.writer = tf.summary.FileWriter(self.log_dir, + self.sess.graph) + else: + self.writer = tf.summary.FileWriter(self.log_dir) + + + def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): + logs = logs or {} + + for name, value in logs.items(): + tf.summary.scalar(name,value) + + tensors = (self.model.inputs + + self.model.targets + + self.model.sample_weights) + + if self.model.uses_learning_phase: + tensors += [K.learning_phase()] + + self.sess = K.get_session() + + for val_data in val_generator: + batch_val = [] + sh = val_data[0].shape[0] + batch_val.append(val_data[0]) + batch_val.append(val_data[1]) + batch_val.append(np.ones(sh)) + if self.model.uses_learning_phase: + batch_val.append(1) + + feed_dict = dict(zip(tensors, batch_val)) + result = self.sess.run([self.merged], feed_dict=feed_dict) + summary_str = result[0] + self.writer.add_summary(summary_str, int(round(epoch))) + val_steps -= 1 + if val_steps <= 0: break + + + def on_train_end(self, _): + self.writer.close() From f1682367409cc4ee48c2d332d49007f54c6a8eab Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 22 May 2017 12:47:20 -0400 Subject: [PATCH 061/744] Restore default signal_dirs --- examples/conf.yaml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 391f1563..c2fdf4f9 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -6,7 +6,22 @@ target: 'hinge' paths: shot_files: ['CWall_clear.txt','CFC_unint.txt'] shot_files_test: ['BeWall_clear.txt','ILW_unint.txt'] - signals_dirs: [['jpf/da/c2-ipla']] + signals_dirs: [['jpf/da/c2-ipla'], # Plasma Current [A] + ['jpf/da/c2-loca'], # Mode Lock Amplitude [A] + ['jpf/db/b5r-ptot>out'], #Radiated Power [W] + ['jpf/gs/bl-li Date: Mon, 22 May 2017 12:52:35 -0400 Subject: [PATCH 062/744] Remove debugging setup --- plasma/models/mpi_runner.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 0d9efb85..6a32d6d9 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -26,8 +26,6 @@ sys.setrecursionlimit(10000) import getpass -import pdb - #import keras sequentially because it otherwise reads from ~/.keras/keras.json with too many threads. #from mpi_launch_tensorflow import get_mpi_task_index from mpi4py import MPI From b393aeee91b4305babb4966d97ee7857267ee2ee Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 23 May 2017 00:35:10 -0400 Subject: [PATCH 063/744] fixed tensorflow re-import issue --- plasma/conf.py | 6 ++--- plasma/models/builder.py | 3 ++- plasma/models/runner.py | 52 ++++++++++++++++++++++--------------- plasma/models/targets.py | 6 ++--- plasma/utils/evaluation.py | 18 ++++++------- plasma/utils/performance.py | 1 + plasma/utils/state_reset.py | 3 +-- 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/plasma/conf.py b/plasma/conf.py index a0764b54..c5755bcb 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -18,7 +18,7 @@ #signals conf['paths']['all_signals'] = all_signals#jet_signals#d3d_signals#all_signals #make sure all 1D signals appear last! -conf['paths']['use_signals'] = fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# +conf['paths']['use_signals'] = d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# #shot lists #shot_list_dir = conf['paths']['shot_list_dir'] @@ -37,8 +37,8 @@ nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') -conf['paths']['shot_files'] = [jet_carbon_wall]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = [jet_iterlike_wall]#[jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] +conf['paths']['shot_files'] = [d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] +conf['paths']['shot_files_test'] = []#[jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index bb3cc240..f4339f1a 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -191,6 +191,7 @@ def slicer_output_shape(input_shape,indices): # else: # x_in = x_input x_in = TimeDistributed(Dense(100,activation='tanh')) (x_in) + x_in = TimeDistributed(Dense(30,activation='tanh')) (x_in) #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) # x = TimeDistributed(Dense(2*(num_0D+num_1D))) # model.add(TimeDistributed(Dense(num_density_channels,bias=True),batch_input_shape=batch_input_shape)) @@ -200,7 +201,7 @@ def slicer_output_shape(input_shape,indices): bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) x_in = Dropout(dropout_prob) (x_in) if return_sequences: - x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) + #x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) else: x_out = Dense(1,activation=output_activation) (x_in) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 8fa2e206..c86d325c 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -128,11 +128,13 @@ def train(conf,shot_list_train,loader): print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) if backend == 'tf' or backend == 'tensorflow': - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + first_time = "tensorflow" not in sys.modules + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU":1}) + set_session(tf.Session(config=config)) else: os.environ['KERAS_BACKEND'] = 'theano' os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' @@ -188,7 +190,6 @@ def train(conf,shot_list_train,loader): num_batches_current +=1 if np.any(batches_to_reset): - #print("Resetting batch {}".format(np.where(batches_to_reset))) reset_states(train_model,batches_to_reset) loss = train_model.train_on_batch(batch_xs,batch_ys) @@ -213,6 +214,9 @@ def train(conf,shot_list_train,loader): if conf['training']['validation_frac'] > 0.0: print('Validation Loss: {:.3e}'.format(validation_losses[-1])) print('Validation ROC: {:.4f}'.format(validation_roc[-1])) + + print("end epoch. {} / {}".format(num_so_far,(e-e_start)*num_total)) + print("e: {}".format(e)) # plot_losses(conf,[training_losses],specific_builder,name='training') @@ -337,11 +341,13 @@ def make_predictions(conf,shot_list,loader): use_cores = max(1,mp.cpu_count()-2) if backend == 'tf' or backend == 'tensorflow': - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"CPU":use_cores}) - set_session(tf.Session(config=config)) + first_time = "tensorflow" not in sys.modules + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"CPU":use_cores}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=cpu' import theano @@ -396,11 +402,13 @@ def make_single_prediction(shot,specific_builder,loader,model_save_path): def make_predictions_gpu(conf,shot_list,loader): if backend == 'tf' or backend == 'tensorflow': - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + first_time = "tensorflow" not in sys.modules + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU":1}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' import theano @@ -453,11 +461,13 @@ def make_predictions_and_evaluate_gpu(conf,shot_list,loader): def make_evaluations_gpu(conf,shot_list,loader): if backend == 'tf' or backend == 'tensorflow': - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + first_time = "tensorflow" not in sys.modules + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU":1}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' import theano diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 659e0dd5..c6265d7b 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -147,12 +147,12 @@ def threshold_range(T_warning): class HingeTarget(Target): activation = 'linear' - loss = 'squared_hinge' #hinge + loss = 'hinge' #hinge @staticmethod def loss_np(y_true, y_pred): - #return hinge_np(y_true,y_pred) - return squared_hinge_np(y_true,y_pred) + return hinge_np(y_true,y_pred) + #return squared_hinge_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): diff --git a/plasma/utils/evaluation.py b/plasma/utils/evaluation.py index 42f4e35a..8c2b13eb 100644 --- a/plasma/utils/evaluation.py +++ b/plasma/utils/evaluation.py @@ -1,25 +1,25 @@ import numpy as np -def get_loss_from_list(y_pred_list,y_gold_list,target): - return np.mean([get_loss(yg,yp,target) for yp,yg in zip(y_pred_list,y_gold_list)]) +def get_loss_from_list(y_pred_list,y_true_list,target): + return np.mean([get_loss(yg,yp,target) for yp,yg in zip(y_pred_list,y_true_list)]) -def get_loss(y_gold,y_pred,target): - return target.loss_np(y_gold,y_pred) +def get_loss(y_true,y_pred,target): + return target.loss_np(y_true,y_pred) def mae_np(y_true,y_pred): - return np.mean(np.abs(y_pred-y_gold)) + return np.mean(np.abs(y_pred-y_true)) def mse_np(y_true,y_pred): - return np.mean((y_pred-y_gold)**2) + return np.mean((y_pred-y_true)**2) def binary_crossentropy_np(y_true,y_pred): - return np.mean(- (y_gold*np.log(y_pred) + (1-y_gold)*np.log(1 - y_pred))) + return np.mean(- (y_true*np.log(y_pred) + (1-y_true)*np.log(1 - y_pred))) def hinge_np(y_true,y_pred): - return np.mean(np.maximum(0.0,1 - y_pred*y_gold)) + return np.mean(np.maximum(0.0,1 - y_pred*y_true)) def squared_hinge_np(y_true,y_pred): - return np.mean(np.maximum(0.0,1 - y_pred*y_gold)**2) + return np.mean(np.maximum(0.0,1 - y_pred*y_true)**2) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 7cdbfa30..333990c5 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -656,6 +656,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, # ax.grid() if save_fig: plt.savefig('sig_fig_{}.png'.format(shot.number),bbox_inches='tight') + plt.close() else: print("Shot hasn't been processed") diff --git a/plasma/utils/state_reset.py b/plasma/utils/state_reset.py index d9681d6d..3d872447 100644 --- a/plasma/utils/state_reset.py +++ b/plasma/utils/state_reset.py @@ -8,9 +8,8 @@ def get_states(model): if hasattr(layer,"states"): layer_states = [] for state in layer.states: + #print(K.get_value(state)[0][0:3]) layer_states.append(K.get_value(state)) - # print('hi') - # print(K.get_value(state)) all_states.append(layer_states) # print(all_states) return all_states From bb40e6acf9467f5a790650948485783a0d90ef95 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 23 May 2017 02:30:11 -0400 Subject: [PATCH 064/744] removed intermediate dense layers --- plasma/models/builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index f4339f1a..73c8a49e 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -190,8 +190,8 @@ def slicer_output_shape(input_shape,indices): # # else: # x_in = x_input - x_in = TimeDistributed(Dense(100,activation='tanh')) (x_in) - x_in = TimeDistributed(Dense(30,activation='tanh')) (x_in) + #x_in = TimeDistributed(Dense(100,activation='tanh')) (x_in) + #x_in = TimeDistributed(Dense(30,activation='tanh')) (x_in) #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) # x = TimeDistributed(Dense(2*(num_0D+num_1D))) # model.add(TimeDistributed(Dense(num_density_channels,bias=True),batch_input_shape=batch_input_shape)) From 3160bb9c188628159975cc012e06ba2722d18f0e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 23 May 2017 02:55:38 -0400 Subject: [PATCH 065/744] version bump to 0.2. Added multiple dimensional signals, multiple machines, and signal versatility. --- plasma/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/version.py b/plasma/version.py index fe8c88cb..6c8c65e9 100644 --- a/plasma/version.py +++ b/plasma/version.py @@ -1,6 +1,6 @@ import re -__version__ = "0.1.0" +__version__ = "0.2.0" version = __version__ From bd61b2ab5cad89257422b4856dd42d270ad63bc3 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 23 May 2017 09:51:34 -0400 Subject: [PATCH 066/744] validation_batch_generator -> training_batch_generator. Use the same generator for validation, but with different shotlist --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 94c4b97e..7104bdbb 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -652,7 +652,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.on_epoch_end(int(round(e)), epoch_logs) #tensorboard - val_generator = partial(loader.validation_batch_generator,shot_list=shot_list_validate)() + val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() val_steps = 20 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) From bf4433a572fa662fd8f51a86584c089179529b4c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 23 May 2017 10:20:08 -0400 Subject: [PATCH 067/744] fixed nasty bug related to copy by view vs. copy by value of numpy arrays in the buffer based prefetching. Needed to copy the array, because the view was being changed behind the scenes. --- plasma/models/loader.py | 5 +++-- plasma/models/mpi_runner.py | 39 +++++++++++++++++++++++-------------- plasma/models/runner.py | 2 -- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index c376d37f..43470ee6 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -103,8 +103,8 @@ def return_from_training_buffer(self,Xbuff,Ybuff,end_indices): length = self.conf['model']['length'] end_indices -= length assert(np.all(end_indices >= 0)) - X = Xbuff[:,:length,:] - Y = Ybuff[:,:length,:] + X = 1.0*Xbuff[:,:length,:] + Y = 1.0*Ybuff[:,:length,:] self.shift_buffer(Xbuff,length) self.shift_buffer(Ybuff,length) return X,Y @@ -156,6 +156,7 @@ def training_batch_generator_partial_reset(self,shot_list): while True: # the list of all shots shot_list.shuffle() + #print("restarting shotlist") for shot in shot_list: while not np.any(end_indices == 0): X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 94c4b97e..30e3a13f 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -37,7 +37,7 @@ from pprint import pprint from plasma.conf import conf -from plasma.utils.state_reset import reset_states +from plasma.utils.state_reset import reset_states,get_states from plasma.models.loader import ProcessGenerator backend = conf['model']['backend'] @@ -157,7 +157,7 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No self.optimizer = optimizer self.max_lr = 0.1 self.lr = lr if (lr < self.max_lr) else self.max_lr - self.DUMMY_LR = 0.1 + self.DUMMY_LR = 0.001 self.comm = comm self.batch_size = batch_size self.batch_iterator_func = ProcessGenerator(batch_iterator()) @@ -371,6 +371,12 @@ def train_epoch(self): num_batches_minimum = 100 num_batches_current = 0 + + #if task_index == 2: + # sys.stdout.write("\ninternal states: {} ".format(get_states(self.model)[0][0][0][:4])) + # sys.stdout.write("\nweights: {} ".format(self.model.get_weights()[0][0][:4,0])) +# sys.stdout.flush() + #print(get_states(self.model)[0][0:3]) while (self.num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: @@ -389,7 +395,6 @@ def train_epoch(self): # if batches_to_reset: # self.model.reset_states(batches_to_reset) if np.any(batches_to_reset): - #print("Resetting batch {}".format(np.where(batches_to_reset))) reset_states(self.model,batches_to_reset) warmup_phase = (step < self.warmup_steps and self.epoch == 0) @@ -408,6 +413,9 @@ def train_epoch(self): sys.stdout.flush() t0 = time.time() + #positives_ = np.sum(np.max(batch_ys[:,:,0],axis=-1) > 0.0) + #sys.stdout.write("\n[{}] postives: {}".format(task_index,positives_)) + #sys.stdout.flush() deltas,loss = self.get_deltas(batch_xs,batch_ys,verbose) t1 = time.time() self.set_new_weights(deltas,num_replicas) @@ -424,6 +432,10 @@ def train_epoch(self): print_unique(write_str + write_str_0) step += 1 + #if task_index == 2: + # sys.stdout.write("\ninternal states: {} ".format(get_states(self.model)[0][0][0][:4])) + # sys.stdout.write("\nweights: {} ".format(self.model.get_weights()[0][0][:4,0])) + # sys.stdout.flush() effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch self.epoch = effective_epochs @@ -512,7 +524,6 @@ def mpi_make_predictions(conf,shot_list,loader): model = specific_builder.build_model(True) specific_builder.load_model_weights(model) model.reset_states() - if task_index == 0: pbar = Progbar(len(shot_list)) shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'],do_shuffle=False,equal_size=True) @@ -531,8 +542,7 @@ def mpi_make_predictions(conf,shot_list,loader): #load data and fit on data - y_p = model.predict(X, - batch_size=conf['model']['pred_batch_size']) + y_p = model.predict(X,batch_size=conf['model']['pred_batch_size']) model.reset_states() y_p = loader.batch_output_to_array(y_p) y = loader.batch_output_to_array(y) @@ -565,9 +575,6 @@ def mpi_make_predictions(conf,shot_list,loader): y_gold_global = y_gold_global[:len(shot_list)] disruptive_global = disruptive_global[:len(shot_list)] - - - return y_prime_global,y_gold_global,disruptive_global @@ -598,8 +605,9 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non # batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) - #batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) + #{}batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) + print("warmup {}".format(warmup_steps)) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) tensorboard = None @@ -637,8 +645,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non specific_builder.save_model_weights(train_model,int(round(e))) epoch_logs = {} + _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) - epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss @@ -652,15 +660,16 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.on_epoch_end(int(round(e)), epoch_logs) #tensorboard - val_generator = partial(loader.validation_batch_generator,shot_list=shot_list_validate)() - val_steps = 20 - tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) + #val_generator = partial(loader.validation_batch_generator,shot_list=shot_list_validate)() + #val_steps = 20 + #tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) callbacks.on_train_end() mpi_model.close() if task_index == 0: - tensorboard.on_train_end() + pass + #tensorboard.on_train_end() class TensorBoard(object): diff --git a/plasma/models/runner.py b/plasma/models/runner.py index c86d325c..24c04f16 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -215,8 +215,6 @@ def train(conf,shot_list_train,loader): print('Validation Loss: {:.3e}'.format(validation_losses[-1])) print('Validation ROC: {:.4f}'.format(validation_roc[-1])) - print("end epoch. {} / {}".format(num_so_far,(e-e_start)*num_total)) - print("e: {}".format(e)) # plot_losses(conf,[training_losses],specific_builder,name='training') From af207711968c71387128dd3d9a14220de43b310d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 May 2017 17:35:51 -0400 Subject: [PATCH 068/744] removed old signals paths, masks, and plotting strings from conf files. Moved NUM_GPUS to conf file --- examples/conf.yaml | 108 ++++++++++++++++++------------------ plasma/conf_parser.py | 28 +++++----- plasma/models/mpi_runner.py | 5 +- plasma/models/targets.py | 4 +- 4 files changed, 73 insertions(+), 72 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index c3c61abb..cfdcdd64 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -5,36 +5,37 @@ # for example tigress/alexeys fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' target: 'maxhinge' #'binary' #'ttd' #'hinge' +num_gpus: 4 paths: - shot_files: ['CWall_clear.txt','CFC_unint.txt'] - shot_files_test: ['BeWall_clear.txt','ILW_unint.txt'] - signals_dirs: [['jpf/da/c2-ipla'], # Plasma Current [A] - ['jpf/da/c2-loca'], # Mode Lock Amplitude [A] - ['jpf/db/b5r-ptot>out'], #Radiated Power [W] - ['jpf/gs/bl-liout'], #Radiated Power [W] + #['jpf/gs/bl-liout'], #Radiated Power [W] - ['jpf/gs/bl-liout'], #Radiated Power [W] + # ['jpf/gs/bl-li Date: Wed, 24 May 2017 17:40:39 -0400 Subject: [PATCH 069/744] removed old signals paths, masks, and plotting strings from conf files. Moved NUM_GPUS to conf file --- examples/conf.yaml | 55 ---------------------------------------------- 1 file changed, 55 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index cfdcdd64..4cd80a7d 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -8,34 +8,8 @@ target: 'maxhinge' #'binary' #'ttd' #'hinge' num_gpus: 4 paths: - #shot_files: ['CWall_clear.txt','CFC_unint.txt'] - #shot_files_test: ['BeWall_clear.txt','ILW_unint.txt'] - #signals_dirs: [['jpf/da/c2-ipla'], # Plasma Current [A] - #['jpf/da/c2-loca'], # Mode Lock Amplitude [A] - #['jpf/db/b5r-ptot>out'], #Radiated Power [W] - #['jpf/gs/bl-liout'], #Radiated Power [W] - # ['jpf/gs/bl-li Date: Wed, 24 May 2017 19:22:31 -0400 Subject: [PATCH 070/744] added positive example penalization for MaxHingeTarget to conf as tunable parameter. Added Classes for hyperaparameter search --- data/signals.py | 12 ++++- examples/conf.yaml | 1 + examples/tune_hyperparams.py | 27 ++++++++++++ plasma/conf_parser.py | 24 +--------- plasma/models/hyperparameters.py | 75 ++++++++++++++++++++++++++++++++ plasma/models/targets.py | 42 +++++++++--------- 6 files changed, 137 insertions(+), 44 deletions(-) create mode 100644 examples/tune_hyperparams.py create mode 100644 plasma/models/hyperparameters.py diff --git a/data/signals.py b/data/signals.py index f85e8bc3..596627d9 100644 --- a/data/signals.py +++ b/data/signals.py @@ -184,7 +184,17 @@ def fetch_nstx_data(signal_path,shot_num,c): #'AOT/EQU.dens_e'] #electron density profile vs rho (uniform mapping over time) - +# [[' $I_{plasma}$ [A]'], +#[' Mode L. A. [A]'], +#[' $P_{radiated}$ [W]'], +#[' $P_{radiated}$ [W]'], +#[' $\rho_{plasma}$ [m^-2]'], +#[' $L_{plasma,internal}$'], +#['$\frac{d}{dt} E_{D}$ [W]'], +#[' $P_{input}$ [W]'], +#['$E_{D}$'], +##ppf signal labels +#['ECE unit?']] diff --git a/examples/conf.yaml b/examples/conf.yaml index 4cd80a7d..0ca36931 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -23,6 +23,7 @@ data: #train/validate split #how many shots to use use_shots: 200000 #1000 #200000 + positive_example_penalty: 2.0 #by what factor to upweight positive examples? #normalization timescale dt: 0.001 #maximum TTD considered diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py new file mode 100644 index 00000000..aad283bc --- /dev/null +++ b/examples/tune_hyperparams.py @@ -0,0 +1,27 @@ +from plasma.models.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam +from pprint import pprint +import yaml + +tunables = [] + +lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-2) +# lr = CategoricalHyperparam(['model','lr'],[0.001,0.01,0.1]) +t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.512]) +target = CategoricalHyperparam(['target'],['lasso','hi']) + + +tunables = [lr,t_warn,target] + +def generate_conf_file(tunables,template_path = "./conf_template.yaml",save_path = "./conf.yaml"): + with open(template_path, 'r') as yaml_file: + conf = yaml.load(yaml_file) + for tunable in tunables: + tunable.assign_to_conf(conf) + with open(save_path, 'w') as outfile: + yaml.dump(conf, outfile, default_flow_style=False) + + + +generate_conf_file(tunables) + + diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 39ca7e14..4fcae7d9 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -8,24 +8,6 @@ def parameters(input_file): with open(input_file, 'r') as yaml_file: params = yaml.load(yaml_file) - #signals_dirs = params['paths']['signals_dirs'] - - - - #signal masks - #to_mask = params['paths']['signals_masks'] - #to_mask = [item for sublist in to_mask for item in sublist] - #signals_masks = [[True if sig not in to_mask else False for sig in group] for group in signals_dirs] - - #positivity masks - #to_positivity_mask = params['paths']['positivity_mask'] - #to_positivity_mask = [item for sublist in to_positivity_mask for item in sublist] - #positivity_mask = [[True if sig not in to_positivity_mask else False for sig in group] for group in signals_dirs] - - #plot masks - #to_plot_mask = params['plots']['plot_masks'] - #to_plot_mask = [item for sublist in to_plot_mask for item in sublist] - #plot_mask = [[True if sig not in to_plot_mask else False for sig in group] for group in signals_dirs] params['user_name'] = getpass.getuser() output_path = params['fs_path'] + "/" + params['user_name'] @@ -33,8 +15,6 @@ def parameters(input_file): params['paths']['base_path'] = base_path params['paths']['signal_prepath'] = base_path + params['paths']['signal_prepath'] - #params['paths']['signals_masks'] = signals_masks - #params['paths']['positivity_mask'] = positivity_mask params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path params['paths']['processed_prepath'] = output_path +'/processed_shots/' @@ -44,10 +24,10 @@ def parameters(input_file): params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] - #params['data']['num_signals'] = sum([sum([1 for predicate in subl if predicate]) for subl in signals_masks]) if params['target'] == 'hinge': params['data']['target'] = t.HingeTarget elif params['target'] == 'maxhinge': + t.MaxHingeTarget.fac = params['data']['positive_example_penalty'] params['data']['target'] = t.MaxHingeTarget elif params['target'] == 'binary': params['data']['target'] = t.BinaryTarget @@ -59,8 +39,6 @@ def parameters(input_file): print('Unkown type of target. Exiting') exit(1) - #params['plots']['plot_masks'] = plot_mask - #params['model']['output_activation'] = params['data']['target'].activation #binary crossentropy performs slightly better? #params['model']['loss'] = params['data']['target'].loss diff --git a/plasma/models/hyperparameters.py b/plasma/models/hyperparameters.py new file mode 100644 index 00000000..c9337f3f --- /dev/null +++ b/plasma/models/hyperparameters.py @@ -0,0 +1,75 @@ +import numpy as np +import random +import abc + +class Hyperparam(object): + + @abc.abstractmethod + def choice(self): + return 0 + + def get_conf_entry(self,conf): + el = conf + for sub_path in self.path: + el = el[sub_path] + return el + + def assign_to_conf(self,conf): + val = self.choice() + print(val) + el = conf + for sub_path in self.path[:-1]: + el = el[sub_path] + print(el[self.path[-1]]) + el[self.path[-1]] = val + + +class CategoricalHyperparam(Hyperparam): + + def __init__(self,path,values): + self.path = path + self.values = values + + def choice(self): + return random.choice(self.values) + + +class ContinuousHyperparam(Hyperparam): + def __init__(self,path,lo,hi): + self.path = path + self.lo =lo + self.hi =hi + + def choice(self): + return float(np.random.uniform(self.lo,self.hi)) + +class LogContinuousHyperparam(Hyperparam): + def __init__(self,path,lo,hi): + self.path = path + self.lo = self.to_log(lo) + self.hi = self.to_log(hi) + + def to_log(self,num_val): + return np.log10(num_val) + + def choice(self): + return float(np.power(10,np.random.uniform(self.lo,self.hi))) + + +class IntegerHyperparam(Hyperparam): + def __init__(self,path,lo,hi): + self.path = path + self.lo =lo + self.hi =hi + + def choice(self): + return int(np.random.random_integers(self.lo,self.hi)) + + +class GenericHyperparam(Hyperparam): + def __init__(self,path,choice_fn): + self.path = path + self.choice_fn = choice_fn + + def choice(self): + return self.choice_fn() \ No newline at end of file diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 130afb26..ea4b055d 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -91,38 +91,40 @@ def threshold_range(T_warning): #Also implements class weighting class MaxHingeTarget(Target): activation = 'linear' + fac = 1.0 @staticmethod def loss(y_true, y_pred): - fac = 2.0 - #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) - overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) + fac = MaxHingeTarget.fac + #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) + overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) max_val = K.max(y_pred,axis=-2) #temporal axis! max_val1 = K.repeat(max_val,K.shape(y_pred)[-2]) mask = K.cast(K.equal(max_val1,y_pred),K.floatx()) y_pred1 = mask * y_pred + (1-mask) * y_true - weight_mask = K.mean(y_true,axis=-1) + weight_mask = K.mean(y_true,axis=-1) weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! - weight_mask = fac*weight_mask + (1 - weight_mask) - #return weight_mask*squared_hinge(y_true,y_pred1) - return overall_fac*weight_mask*hinge(y_true,y_pred1) + weight_mask = fac*weight_mask + (1 - weight_mask) + #return weight_mask*squared_hinge(y_true,y_pred1) + return overall_fac*weight_mask*hinge(y_true,y_pred1) @staticmethod def loss_np(y_true, y_pred): - fac = 2.0 - #print(y_pred.shape) - overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) - max_val = np.max(y_pred,axis=-2) #temporal axis! - max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) - max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) - mask = np.equal(max_val,y_pred) - mask = mask.astype(np.float32) - y_pred = mask * y_pred + (1-mask) * y_true + fac = MaxHingeTarget.fac + print("fac: {}".format(fac)) + #print(y_pred.shape) + overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) + max_val = np.max(y_pred,axis=-2) #temporal axis! + max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) + max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) + mask = np.equal(max_val,y_pred) + mask = mask.astype(np.float32) + y_pred = mask * y_pred + (1-mask) * y_true weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! - weight_mask = fac*weight_mask + (1 - weight_mask) - #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances - return np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances - + weight_mask = fac*weight_mask + (1 - weight_mask) + #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances + return np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances + # def _loss_tensor_old(y_true, y_pred): # max_val = K.max(y_pred) #temporal axis! From 90a9c89f3f7bc57b4abf2f51f14ab7a3eea2a6c9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 May 2017 20:20:21 -0400 Subject: [PATCH 071/744] changing csv logs to local folder for hyperparameter tuning --- examples/mpi_learn.py | 1 + examples/tune_hyperparams.py | 69 +++++++++++++++++++++++++++++--- plasma/conf_parser.py | 2 +- plasma/models/hyperparameters.py | 8 +++- 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 7c1b2154..73ee1d79 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -115,4 +115,5 @@ shot_list_train=shot_list_train,shot_list_test=shot_list_test, conf = conf) + sys.stdout.flush() print('finished.') diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index aad283bc..af1315bc 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,6 +1,10 @@ from plasma.models.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam from pprint import pprint import yaml +import datetime +import uuid +import sys,os,getpass +import shutil tunables = [] @@ -12,16 +16,71 @@ tunables = [lr,t_warn,target] -def generate_conf_file(tunables,template_path = "./conf_template.yaml",save_path = "./conf.yaml"): - with open(template_path, 'r') as yaml_file: +run_directory = "/tigress/jk7/hyperparams/" +template_path = "./" +conf_name = "conf.yaml" +template_path += conf_name +num_machines = 2 + +def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): + assert(template_path != save_path) + with open(template_path+conf_name, 'r') as yaml_file: conf = yaml.load(yaml_file) for tunable in tunables: - tunable.assign_to_conf(conf) - with open(save_path, 'w') as outfile: + tunable.assign_to_conf(conf,save_path) + with open(save_path+conf_name, 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) +def generate_working_dirname(run_directory): + s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + s += str(uuid.uuid4()) + return run_directory + s + + +def start_slurm_job(subdir,num_machines): + shutil.copy2("mpi_learn.py",subdir) + script = create_slurm_script(subdir,num_machines) + Popen("sbatch "+script,shell=True) + +def create_slurm_script(subdir,num_machines): + filename = "run_{}_nodes.cmd".format(num_machines) + filepath = subdir+filename + user = getpass.getuser() + with open(filepath,"w") as f: + f.write('#!/bin/bash\n') + f.write('#SBATCH -t 01:00:00\n') + f.write('#SBATCH -N '+str(num_machines)+'\n') + f.write('#SBATCH --ntasks-per-node=4\n') + f.write('#SBATCH --ntasks-per-socket=2\n') + f.write('#SBATCH --gres=gpu:4\n') + f.write('#SBATCH -c 4\n') + f.write('\n\n') + f.write('module load anaconda\n') + f.write('source activate PPPL\n') + f.write('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi\n')#/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n') + f.write('rm /tigress/{}/model_checkpoints/*\n'.format(user)) + f.write('cd {}'.format(subdir)) + f.write('srun mpirun -npernode 4 python mpi_learn.py\n') + + return filepath + + +working_directory = generate_working_dirname(run_directory) +os.makedirs(working_directory) +shutil.copy2(template_path,working_directory) +os.chdir(working_directory) +print("Going into {}".format(working_directory)) + +for i in range(num_trials): + print("i") + subdir = working_directory + "/{}/".format(i) + os.makedirs(subdir) + print("Making modified conf") + generate_conf_file(tunables,working_directory,subdir,conf_name) + print("Starting job") + start_slurm_job(subdir,num_machines) -generate_conf_file(tunables) +print("submitted {} jobs.".format(num_trials)) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 4fcae7d9..3b3aeb9e 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -21,7 +21,7 @@ def parameters(input_file): params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' params['paths']['results_prepath'] = output_path + '/results/' params['paths']['model_save_path'] = output_path + '/model_checkpoints/' - params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' + params['paths']['csvlog_save_path'] = './csv_logs/' #output_path + '/csv_logs/' params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] if params['target'] == 'hinge': diff --git a/plasma/models/hyperparameters.py b/plasma/models/hyperparameters.py index c9337f3f..6b417da3 100644 --- a/plasma/models/hyperparameters.py +++ b/plasma/models/hyperparameters.py @@ -14,7 +14,7 @@ def get_conf_entry(self,conf): el = el[sub_path] return el - def assign_to_conf(self,conf): + def assign_to_conf(self,conf,save_path): val = self.choice() print(val) el = conf @@ -23,6 +23,12 @@ def assign_to_conf(self,conf): print(el[self.path[-1]]) el[self.path[-1]] = val + with open(save_path+"changed_params.out", 'w') as outfile: + for el in self.path: + outfile.write("{} : ".format(el)) + outfile.write("{}".format(val)) + + class CategoricalHyperparam(Hyperparam): From 022bf3a0b865b1d741d40ec9737dc437016ac781 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 May 2017 21:27:31 -0400 Subject: [PATCH 072/744] added early stopping via keras callback --- examples/tune_hyperparams.py | 41 ++++++++++++++++++-------------- plasma/models/hyperparameters.py | 6 ++--- plasma/models/mpi_runner.py | 41 +++++++++++++++++++++----------- plasma/models/targets.py | 1 - 4 files changed, 53 insertions(+), 36 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index af1315bc..93813c30 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -5,22 +5,24 @@ import uuid import sys,os,getpass import shutil +import subprocess as sp tunables = [] lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-2) # lr = CategoricalHyperparam(['model','lr'],[0.001,0.01,0.1]) -t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.512]) -target = CategoricalHyperparam(['target'],['lasso','hi']) +t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.256,0.512,1.024]) +#target = CategoricalHyperparam(['target'],['lasso','hi']) -tunables = [lr,t_warn,target] +tunables = [lr,t_warn] #target run_directory = "/tigress/jk7/hyperparams/" -template_path = "./" +template_path = "/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" -template_path += conf_name +executable_name = "mpi_learn.py" num_machines = 2 +num_trials = 2 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) @@ -34,16 +36,16 @@ def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name def generate_working_dirname(run_directory): s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - s += str(uuid.uuid4()) + s += "_{}/".format(uuid.uuid4()) return run_directory + s -def start_slurm_job(subdir,num_machines): - shutil.copy2("mpi_learn.py",subdir) - script = create_slurm_script(subdir,num_machines) - Popen("sbatch "+script,shell=True) +def start_slurm_job(subdir,executable,num_machines,i): + shutil.copy2(executable,subdir) + script = create_slurm_script(subdir,num_machines,i) + sp.Popen("sbatch "+script,shell=True) -def create_slurm_script(subdir,num_machines): +def create_slurm_script(subdir,num_machines,idx): filename = "run_{}_nodes.cmd".format(num_machines) filepath = subdir+filename user = getpass.getuser() @@ -55,20 +57,23 @@ def create_slurm_script(subdir,num_machines): f.write('#SBATCH --ntasks-per-socket=2\n') f.write('#SBATCH --gres=gpu:4\n') f.write('#SBATCH -c 4\n') + f.write('#SBATCH -o {}.out\n'.format(idx)) f.write('\n\n') f.write('module load anaconda\n') - f.write('source activate PPPL\n') - f.write('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi\n')#/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n') - f.write('rm /tigress/{}/model_checkpoints/*\n'.format(user)) - f.write('cd {}'.format(subdir)) - f.write('srun mpirun -npernode 4 python mpi_learn.py\n') + #f.write('source activate PPPL\n') + f.write('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n') + f.write('rm -f /tigress/{}/model_checkpoints/*\n'.format(user)) + f.write('cd {}\n'.format(subdir)) + f.write('srun python mpi_learn.py\n') + f.write('echo "done."') return filepath working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -shutil.copy2(template_path,working_directory) +shutil.copy2(template_path+conf_name,working_directory) +shutil.copy2(template_path+executable_name,working_directory) os.chdir(working_directory) print("Going into {}".format(working_directory)) @@ -79,7 +84,7 @@ def create_slurm_script(subdir,num_machines): print("Making modified conf") generate_conf_file(tunables,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,num_machines) + start_slurm_job(subdir,executable_name,num_machines,i) print("submitted {} jobs.".format(num_trials)) diff --git a/plasma/models/hyperparameters.py b/plasma/models/hyperparameters.py index 6b417da3..75db5c1a 100644 --- a/plasma/models/hyperparameters.py +++ b/plasma/models/hyperparameters.py @@ -23,10 +23,10 @@ def assign_to_conf(self,conf,save_path): print(el[self.path[-1]]) el[self.path[-1]] = val - with open(save_path+"changed_params.out", 'w') as outfile: + with open(save_path+"changed_params.out", 'a+') as outfile: for el in self.path: outfile.write("{} : ".format(el)) - outfile.write("{}".format(val)) + outfile.write("{}\n".format(val)) @@ -78,4 +78,4 @@ def __init__(self,path,choice_fn): self.choice_fn = choice_fn def choice(self): - return self.choice_fn() \ No newline at end of file + return self.choice_fn() diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 09e2a6e0..bb2efea5 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -286,7 +286,7 @@ def set_new_weights(self,deltas,num_replicas=None): self.optimizer.set_lr(effective_lr) global_deltas = self.optimizer.get_deltas(global_deltas) - if comm.rank == 0: + if self.comm.rank == 0: new_weights = self.get_new_weights(global_deltas) else: new_weights = None @@ -407,7 +407,7 @@ def train_epoch(self): if step == 0 and self.epoch == 0: t0_comp = time.time() _,_ = self.get_deltas(batch_xs,batch_ys,verbose) - comm.Barrier() + self.comm.Barrier() sys.stdout.flush() print_unique('Compilation finished in {:.2f}s'.format(time.time()-t0_comp)) t_start = time.time() @@ -621,20 +621,20 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.compile(loss=conf['data']['target'].loss) - callbacks = mpi_model.build_callbacks(conf,callbacks_list) - - callbacks.set_model(mpi_model.model) - callback_metrics = conf['callbacks']['metrics'] - - callbacks.set_params({ + if task_index == 0: + callbacks = mpi_model.build_callbacks(conf,callbacks_list) + callbacks.set_model(mpi_model.model) + callback_metrics = conf['callbacks']['metrics'] + callbacks.set_params({ 'epochs': num_epochs, 'metrics': callback_metrics, 'batch_size': batch_size, - }) - callbacks.on_train_begin() + }) + callbacks.on_train_begin() while e < num_epochs-1: - callbacks.on_epoch_begin(int(round(e))) + if task_index == 0: + callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) print_unique('\nEpoch {}/{}'.format(e,num_epochs)) @@ -659,19 +659,32 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('Validation ROC: {:.4f}'.format(roc_area)) callbacks.on_epoch_end(int(round(e)), epoch_logs) + stop_training = get_stop_training(callbacks) #tensorboard val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() val_steps = 20 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) - - callbacks.on_train_end() - mpi_model.close() + else: + stop_training = False + stop_training = comm.bcast(stop_training,root=0) + if stop_training: + print("Stopping training due to early stopping") + break if task_index == 0: + callbacks.on_train_end() pass #tensorboard.on_train_end() + mpi_model.close() + +def get_stop_training(callbacks): + for cb in callbacks: + if isinstance(cb,cbks.EarlyStopping): + print("Checking for early stopping") + return cb.model.stop_training + return False class TensorBoard(object): def __init__(self, log_dir='./logs', diff --git a/plasma/models/targets.py b/plasma/models/targets.py index ea4b055d..563f16f8 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -111,7 +111,6 @@ def loss(y_true, y_pred): @staticmethod def loss_np(y_true, y_pred): fac = MaxHingeTarget.fac - print("fac: {}".format(fac)) #print(y_pred.shape) overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) max_val = np.max(y_pred,axis=-2) #temporal axis! From a14a5c49951ecdce18fc1d3406775a6cd9550d42 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 May 2017 21:28:31 -0400 Subject: [PATCH 073/744] added early stopping via keras callback --- examples/conf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 0ca36931..046b802e 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -89,6 +89,6 @@ callbacks: list: ['earlystop'] metrics: ['val_loss','val_roc','train_loss'] mode: 'max' - monitor: 'val_loss' + monitor: 'val_roc' patience: 2 write_grads: False From 6ad6083f656cd1600f985fcf7e257d7386b54598 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 May 2017 21:40:00 -0400 Subject: [PATCH 074/744] added early stopping via keras callback --- plasma/models/mpi_runner.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index bb2efea5..cad4f527 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -680,10 +680,11 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.close() def get_stop_training(callbacks): - for cb in callbacks: + for cb in callbacks.callbacks: if isinstance(cb,cbks.EarlyStopping): print("Checking for early stopping") return cb.model.stop_training + print("No early stopping callback found.") return False class TensorBoard(object): From 6f0142cf73f49baacb64e7b1777355d2d674844f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 May 2017 22:34:26 -0400 Subject: [PATCH 075/744] early stopping works --- plasma/models/mpi_runner.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index cad4f527..67078577 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -370,7 +370,7 @@ def train_epoch(self): t1 = 0 t2 = 0 - num_batches_minimum = 100 + num_batches_minimum = 40 num_batches_current = 0 #if task_index == 2: @@ -652,6 +652,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss + stop_training = False if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) print('Training Loss: {:.3e}'.format(ave_loss)) @@ -659,14 +660,15 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('Validation ROC: {:.4f}'.format(roc_area)) callbacks.on_epoch_end(int(round(e)), epoch_logs) - stop_training = get_stop_training(callbacks) + if hasattr(mpi_model.model,'stop_training'): + stop_training = mpi_model.model.stop_training + else: + print("No stop training attribute found") #tensorboard val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() val_steps = 20 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) - else: - stop_training = False stop_training = comm.bcast(stop_training,root=0) if stop_training: print("Stopping training due to early stopping") @@ -679,6 +681,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.close() + def get_stop_training(callbacks): for cb in callbacks.callbacks: if isinstance(cb,cbks.EarlyStopping): From 5257294dd52c2f82757561540b54cbd60e39bcec Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 25 May 2017 01:19:04 -0400 Subject: [PATCH 076/744] several changes to enable hyperparameter tuning. Had to redirect some paths in the case of hyperparameter tuning to do things like copying the normalization files --- examples/check_tuning.py | 107 +++++++++++++++++++++++++++++++ examples/conf.yaml | 1 + examples/mpi_learn.py | 3 +- examples/tune_hyperparams.py | 22 +++++-- plasma/conf_parser.py | 13 +++- plasma/models/hyperparameters.py | 3 +- plasma/models/loader.py | 2 +- plasma/models/mpi_runner.py | 4 +- 8 files changed, 140 insertions(+), 15 deletions(-) create mode 100644 examples/check_tuning.py diff --git a/examples/check_tuning.py b/examples/check_tuning.py new file mode 100644 index 00000000..fbe11fa3 --- /dev/null +++ b/examples/check_tuning.py @@ -0,0 +1,107 @@ +from plasma.models.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam +from pprint import pprint +import yaml +import datetime +import uuid +import sys,os,getpass +import shutil +import subprocess as sp +import pandas +import numpy as np + +dir_path = "/tigress/jk7/hyperparams/" +if len(sys.argv) <= 1: + dir_path = dir_path + os.listdir(dir_path)[0] + '/' + print("using default dir {}".format(dir_path)) +else: + dir_path = sys.argv[1] + + +class HyperparamExperiment(): + def __init__(self,path,conf_name = "conf.yaml"): + if not path.endswith('/'): + path += '/' + self.path = path + self.logs_path = path + "csv_logs/" + self.raw_logs_path = path[:-1] + ".out" + self.changed_path = path + "changed_params.out" + with open(self.path + conf_name, 'r') as yaml_file: + conf = yaml.load(yaml_file) + self.name_to_monitor = conf['callbacks']['monitor'] + self.load_data() + self.get_changed() + self.get_maximum() + self.read_raw_logs() + + def __str__(self): + s = "Experiment:\n" + s += '-'*20+"\n" + s += self.changed + s += '-'*20+"\n" + s += "Maximum of {} at epoch {}\n".format(*self.get_maximum()) + s += '-'*20+"\n" + return s + + def load_data(self): + files = os.listdir(self.logs_path) + assert(len(files) == 1) + self.logs_path = self.logs_path + files[0] + if os.path.getsize(self.logs_path) > 0: + dat = pandas.read_csv(self.logs_path) + self.epochs = np.array(dat['epoch']) + self.values = np.array(dat[self.name_to_monitor]) + self.dat = dat + print("loaded logs") + print(self.epochs) + print(self.values) + else: + self.epochs = [] + print("no logs yet") + + def get_changed(self): + with open(self.changed_path, 'r') as file: + text = file.read() + print("changed values: {}".format(text)) + self.changed = text + return text + + def read_raw_logs(self): + self.success = False + self.finished = False + with open(self.raw_logs_path, 'r') as file: + lines = file.readlines() + if len(lines) > 1: + if lines[-1].strip() == 'done.': + self.finished = True + if lines[-2].strip() == 'finished.': + self.success = True + print('finished: {}, success: {}'.format(self.finished, self.success)) + + def get_maximum(self): + if len(self.epochs) > 0: + idx = np.argmax(self.values) + print("maximum of {} at epoch {}".format(self.values[idx],self.epochs[idx])) + return self.epochs[idx],self.values[idx] + else: + return -1,-1 + + +def get_experiments(path): + experiments = [] + num_tot = 0 + num_finished = 0 + num_success = 0 + for name in os.listdir(path): + if os.path.isdir(path + name): + print(path+name) + exp= HyperparamExperiment(path+name) + num_finished += 1 if exp.finished else 0 + num_success += 1 if exp.success else 0 + num_tot += 1 + experiments.append(exp) + print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) + return experiments + +experiments = get_experiments(dir_path) +best_experiment = np.argmax([e.get_maximum()[1] for e in experiments]) +print("Best experiment so far: {}".format(experiments[best_experiment])) diff --git a/examples/conf.yaml b/examples/conf.yaml index 046b802e..73f39597 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -85,6 +85,7 @@ training: num_epochs: 26 use_mock_data: False data_parallel: False + hyperparam_tuning: False callbacks: list: ['earlystop'] metrics: ['val_loss','val_roc','train_loss'] diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 73ee1d79..8c20b071 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -115,5 +115,6 @@ shot_list_train=shot_list_train,shot_list_test=shot_list_test, conf = conf) - sys.stdout.flush() +sys.stdout.flush() +if task_index == 0: print('finished.') diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 93813c30..f23f34f9 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -10,19 +10,20 @@ tunables = [] lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-2) -# lr = CategoricalHyperparam(['model','lr'],[0.001,0.01,0.1]) -t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.256,0.512,1.024]) +lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.7,0.9,0.97,1.0]) +t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.256,0.512,1.024,40.0]) +fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,10.0,40.0]) #target = CategoricalHyperparam(['target'],['lasso','hi']) -tunables = [lr,t_warn] #target +tunables = [lr,lr_decay,t_warn,fac] #target run_directory = "/tigress/jk7/hyperparams/" template_path = "/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" executable_name = "mpi_learn.py" num_machines = 2 -num_trials = 2 +num_trials = 10 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) @@ -30,6 +31,8 @@ def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name conf = yaml.load(yaml_file) for tunable in tunables: tunable.assign_to_conf(conf,save_path) + conf['training']['num_epochs'] = 1000 #rely on early stopping to terminate training + conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training with open(save_path+conf_name, 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) @@ -69,6 +72,14 @@ def create_slurm_script(subdir,num_machines,idx): return filepath +def copy_files_to_environment(subdir): + from plasma.conf import conf + normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) + if os.path.isdir(normalization_dir): + print("Copying normalization to") + shutil.copytree(normalization_dir,subdir+os.path.basename(normalization_dir)) + + working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) @@ -78,9 +89,10 @@ def create_slurm_script(subdir,num_machines,idx): print("Going into {}".format(working_directory)) for i in range(num_trials): - print("i") + print(i) subdir = working_directory + "/{}/".format(i) os.makedirs(subdir) + copy_files_to_environment(subdir) print("Making modified conf") generate_conf_file(tunables,working_directory,subdir,conf_name) print("Starting job") diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 3b3aeb9e..60dab1ee 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -18,10 +18,17 @@ def parameters(input_file): params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path params['paths']['processed_prepath'] = output_path +'/processed_shots/' - params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' params['paths']['results_prepath'] = output_path + '/results/' - params['paths']['model_save_path'] = output_path + '/model_checkpoints/' - params['paths']['csvlog_save_path'] = './csv_logs/' #output_path + '/csv_logs/' + if params['training']['hyperparam_tuning']: + params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' + params['paths']['normalizer_path'] = './normalization/normalization.npz' + params['paths']['model_save_path'] = './model_checkpoints/' + params['paths']['csvlog_save_path'] = './csv_logs/' + else: + params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' + params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' + params['paths']['model_save_path'] = output_path + '/model_checkpoints/' + params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] if params['target'] == 'hinge': diff --git a/plasma/models/hyperparameters.py b/plasma/models/hyperparameters.py index 75db5c1a..b84c5fd1 100644 --- a/plasma/models/hyperparameters.py +++ b/plasma/models/hyperparameters.py @@ -16,11 +16,10 @@ def get_conf_entry(self,conf): def assign_to_conf(self,conf,save_path): val = self.choice() - print(val) + print(" : ".join(self.path)+ ": {}".format(val)) el = conf for sub_path in self.path[:-1]: el = el[sub_path] - print(el[self.path[-1]]) el[self.path[-1]] = val with open(save_path+"changed_params.out", 'a+') as outfile: diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 43470ee6..103b699f 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -591,7 +591,7 @@ def get_num_skips(length,skip): return 1 + (length-1)//skip def load_shotlists(self,conf): - path = conf['paths']['base_path'] + '/normalization/shot_lists.npz' + path = conf['paths']['saved_shotlist_path'] data = np.load(path) shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 67078577..22677b85 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -642,7 +642,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non e = e_old + effective_epochs loader.verbose=False #True during the first iteration - if task_index == 0: + if task_index == 0: specific_builder.save_model_weights(train_model,int(round(e))) epoch_logs = {} @@ -662,8 +662,6 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.on_epoch_end(int(round(e)), epoch_logs) if hasattr(mpi_model.model,'stop_training'): stop_training = mpi_model.model.stop_training - else: - print("No stop training attribute found") #tensorboard val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() From 34cedd26eac539759760a25f5f019da8b09017f6 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 25 May 2017 01:29:14 -0400 Subject: [PATCH 077/744] hyperparameter tuning --- examples/check_tuning.py | 5 ++++- examples/tune_hyperparams.py | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index fbe11fa3..2751a783 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -22,6 +22,8 @@ def __init__(self,path,conf_name = "conf.yaml"): if not path.endswith('/'): path += '/' self.path = path + self.finished = False + self.success = False self.logs_path = path + "csv_logs/" self.raw_logs_path = path[:-1] + ".out" self.changed_path = path + "changed_params.out" @@ -80,7 +82,8 @@ def read_raw_logs(self): def get_maximum(self): if len(self.epochs) > 0: idx = np.argmax(self.values) - print("maximum of {} at epoch {}".format(self.values[idx],self.epochs[idx])) + s = "Finished" if self.finished else "Running" + print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) return self.epochs[idx],self.values[idx] else: return -1,-1 diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index f23f34f9..36e7dd88 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -9,8 +9,8 @@ tunables = [] -lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-2) -lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.7,0.9,0.97,1.0]) +lr = LogContinuousHyperparam(['model','lr'],1e-6,1e-3) +lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.9,0.97,1.0]) t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.256,0.512,1.024,40.0]) fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,10.0,40.0]) #target = CategoricalHyperparam(['target'],['lasso','hi']) @@ -23,7 +23,7 @@ conf_name = "conf.yaml" executable_name = "mpi_learn.py" num_machines = 2 -num_trials = 10 +num_trials = 20 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) From 75ab3d4becd1ae589cad879c01c2e64b24935656 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 25 May 2017 02:53:12 -0400 Subject: [PATCH 078/744] hyperparameter tuning more robust before files are written etc. --- examples/check_tuning.py | 71 ++++++++++++++++++++++++------------ examples/tune_hyperparams.py | 10 ++--- plasma/models/mpi_runner.py | 2 +- 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index 2751a783..18a2e943 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -35,30 +35,44 @@ def __init__(self,path,conf_name = "conf.yaml"): self.get_maximum() self.read_raw_logs() + def __lt__(self,other): + return self.path.__lt__(other.path) + + def get_number(self): + return int(os.path.basename(self.path[:-1])) + def __str__(self): s = "Experiment:\n" s += '-'*20+"\n" + s += '# {}\n'.format(self.get_number()) + s += '-'*20+"\n" s += self.changed s += '-'*20+"\n" - s += "Maximum of {} at epoch {}\n".format(*self.get_maximum()) + s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) s += '-'*20+"\n" return s + def summary(self): + s = "Finished" if self.finished else "Running" + print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) + + def load_data(self): - files = os.listdir(self.logs_path) - assert(len(files) == 1) - self.logs_path = self.logs_path + files[0] - if os.path.getsize(self.logs_path) > 0: - dat = pandas.read_csv(self.logs_path) - self.epochs = np.array(dat['epoch']) - self.values = np.array(dat[self.name_to_monitor]) - self.dat = dat - print("loaded logs") - print(self.epochs) - print(self.values) - else: - self.epochs = [] - print("no logs yet") + if os.path.exists(self.logs_path): + files = os.listdir(self.logs_path) + assert(len(files) == 1) + self.logs_path = self.logs_path + files[0] + if os.path.getsize(self.logs_path) > 0: + dat = pandas.read_csv(self.logs_path) + self.epochs = np.array(dat['epoch']) + self.values = np.array(dat[self.name_to_monitor]) + self.dat = dat + print("loaded logs") + print(self.epochs) + print(self.values) + return + self.epochs = [] + print("no logs yet") def get_changed(self): with open(self.changed_path, 'r') as file: @@ -70,8 +84,10 @@ def get_changed(self): def read_raw_logs(self): self.success = False self.finished = False - with open(self.raw_logs_path, 'r') as file: - lines = file.readlines() + lines = [] + if os.path.exists(self.raw_logs_path): + with open(self.raw_logs_path, 'r') as file: + lines = file.readlines() if len(lines) > 1: if lines[-1].strip() == 'done.': self.finished = True @@ -79,12 +95,14 @@ def read_raw_logs(self): self.success = True print('finished: {}, success: {}'.format(self.finished, self.success)) - def get_maximum(self): + def get_maximum(self,verbose=True): if len(self.epochs) > 0: idx = np.argmax(self.values) s = "Finished" if self.finished else "Running" - print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) - return self.epochs[idx],self.values[idx] + if verbose: + #print(self.path) + print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) + return self.values[idx],self.epochs[idx] else: return -1,-1 @@ -94,7 +112,7 @@ def get_experiments(path): num_tot = 0 num_finished = 0 num_success = 0 - for name in os.listdir(path): + for name in sorted(os.listdir(path)): if os.path.isdir(path + name): print(path+name) exp= HyperparamExperiment(path+name) @@ -105,6 +123,11 @@ def get_experiments(path): print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) return experiments -experiments = get_experiments(dir_path) -best_experiment = np.argmax([e.get_maximum()[1] for e in experiments]) -print("Best experiment so far: {}".format(experiments[best_experiment])) +experiments = sorted(get_experiments(dir_path)) +print(len(experiments)) +best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) +for e in experiments: + e.summary() +print("Best experiment so far: \n") +for e in np.array(experiments)[best_experiments][-3:]: + print(e) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 36e7dd88..3af24f5e 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -9,10 +9,10 @@ tunables = [] -lr = LogContinuousHyperparam(['model','lr'],1e-6,1e-3) -lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.9,0.97,1.0]) -t_warn = CategoricalHyperparam(['data','T_warning'],[0.128,0.256,0.512,1.024,40.0]) -fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,10.0,40.0]) +lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) +lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,1.0]) +t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,0.512,1.024,40.0]) +fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,10.0]) #target = CategoricalHyperparam(['target'],['lasso','hi']) @@ -23,7 +23,7 @@ conf_name = "conf.yaml" executable_name = "mpi_learn.py" num_machines = 2 -num_trials = 20 +num_trials = 40 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 22677b85..d4bbc6f8 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -370,7 +370,7 @@ def train_epoch(self): t1 = 0 t2 = 0 - num_batches_minimum = 40 + num_batches_minimum = 100 num_batches_current = 0 #if task_index == 2: From 9ec4d5771dc51952e6c4fe2f55030aa742955181 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 15:56:22 -0400 Subject: [PATCH 079/744] Parse parameters inside conf_parser.py, only import in conf.py --- plasma/conf.py | 34 ---------------------------------- plasma/conf_parser.py | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/plasma/conf.py b/plasma/conf.py index c5755bcb..26ed01b8 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -1,5 +1,4 @@ from plasma.conf_parser import parameters -from plasma.primitives.shots import ShotListFiles import os import errno @@ -13,36 +12,3 @@ conf = parameters('../examples/conf.yaml') else: raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'conf.yaml') - -from data.signals import *#d3d,jet,d3d_signals,jet_signals,all_signals -#signals -conf['paths']['all_signals'] = all_signals#jet_signals#d3d_signals#all_signals -#make sure all 1D signals appear last! -conf['paths']['use_signals'] = d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# - -#shot lists -#shot_list_dir = conf['paths']['shot_list_dir'] -#shot_list_dir = '/cscratch/share/frnn/shot_lists/' -shot_list_dir = '/tigress/jk7/shot_lists/' - -jet_carbon_wall = ShotListFiles(jet,shot_list_dir,['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') -jet_iterlike_wall = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') -jet_full = ShotListFiles(jet,shot_list_dir,['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') - -d3d_10000 = ShotListFiles(d3d,shot_list_dir,['d3d_clear_10000.txt','d3d_disrupt_10000.txt'],'d3d data 10000 ND and D shots') -d3d_1000 = ShotListFiles(d3d,shot_list_dir,['d3d_clear_1000.txt','d3d_disrupt_1000.txt'],'d3d data 1000 ND and D shots') -d3d_100 = ShotListFiles(d3d,shot_list_dir,['d3d_clear_100.txt','d3d_disrupt_100.txt'],'d3d data 100 ND and D shots') -d3d_full = ShotListFiles(d3d,shot_list_dir,['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') -d3d_jb_full = ShotListFiles(d3d,shot_list_dir,['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') - -nstx_full = ShotListFiles(nstx,shot_list_dir,['disrupt_nstx.txt'],'nstx shots (all are disruptive') - -conf['paths']['shot_files'] = [d3d_full]#d3d_full,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall,jet_carbon_wall]#,jet_iterlike_wall]#[d3d_full]#[jet_carbon_wall] -conf['paths']['shot_files_test'] = []#[jet_iterlike_wall]#[d3d_full]#[jet_iterlike_wall] -conf['paths']['shot_files_all'] = conf['paths']['shot_files']+conf['paths']['shot_files_test'] -conf['paths']['all_machines'] = list(set([file.machine for file in conf['paths']['shot_files_all']])) - -#shot_numbers_files = ['d3d_short_clear.txt']# ,'d3d_clear.txt', 'd3d_disrupt.txt'] -#shot_numbers_files = ['d3d_clear.txt', 'd3d_disrupt.txt']#['d3d_short_clear.txt']# ] - - diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 60dab1ee..fbeec8b0 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -1,4 +1,5 @@ import plasma.models.targets as t +from plasma.primitives.shots import ShotListFiles import getpass import yaml @@ -50,4 +51,28 @@ def parameters(input_file): #binary crossentropy performs slightly better? #params['model']['loss'] = params['data']['target'].loss + from data.signals import * + #signals + params['paths']['all_signals'] = all_signals + #make sure all 1D signals appear last! + params['paths']['use_signals'] = d3d_signals + + #shot lists + jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') + jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') + jet_full = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') + + d3d_10000 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_10000.txt','d3d_disrupt_10000.txt'],'d3d data 10000 ND and D shots') + d3d_1000 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_1000.txt','d3d_disrupt_1000.txt'],'d3d data 1000 ND and D shots') + d3d_100 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_100.txt','d3d_disrupt_100.txt'],'d3d data 100 ND and D shots') + d3d_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') + d3d_jb_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') + + nstx_full = ShotListFiles(nstx,params['paths']['shot_list_dir'],['disrupt_nstx.txt'],'nstx shots (all are disruptive') + + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] + params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) + return params From fba856f393cf689419debab6ac225655fae6dcb9 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 15:58:22 -0400 Subject: [PATCH 080/744] Add tensorflow-gpu to pip requirements for now, Keras will pull theano as part of its deps --- requirements.txt | 1 + setup.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c9f8d066..51dd17a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ mpi4py h5py pyparsing yaml +tensorflow-gpu diff --git a/setup.py b/setup.py index 5d8e50b7..19d230b3 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras','theano','pathos','matplotlib','hyperopt'], + install_requires = ['keras','pathos','matplotlib','hyperopt'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From 765130e1379f6c9cb7b7240e9bd409339f097b4d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 15:59:35 -0400 Subject: [PATCH 081/744] Put back hyperopt import. Cleanup --- plasma/models/runner.py | 95 +---------------------------------------- 1 file changed, 1 insertion(+), 94 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 24c04f16..27cb363d 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -6,9 +6,7 @@ import numpy as np from itertools import imap -#leading to import errors: -#from hyperopt import hp, STATUS_OK -#from hyperas.distributions import conditional +from hyperopt import hp, STATUS_OK import time import sys @@ -24,97 +22,6 @@ backend = conf['model']['backend'] -# def train(conf,shot_list_train,loader): - -# np.random.seed(1) - -# validation_losses = [] -# validation_roc = [] -# training_losses = [] -# if conf['training']['validation_frac'] > 0.0: -# shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-conf['training']['validation_frac'],do_shuffle=True) -# print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) -# print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - -# if backend == 'tf' or backend == 'tensorflow': -# import tensorflow as tf -# os.environ['KERAS_BACKEND'] = 'tensorflow' -# from keras.backend.tensorflow_backend import set_session -# config = tf.ConfigProto(device_count={"GPU":1}) -# set_session(tf.Session(config=config)) -# else: -# os.environ['KERAS_BACKEND'] = 'theano' -# os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' -# import theano - -# from keras.utils.generic_utils import Progbar -# from keras import backend as K -# from plasma.models import builder - -# print('Build model...',end='') -# specific_builder = builder.ModelBuilder(conf) -# train_model = specific_builder.build_model(False) -# print('...done') - -# #load the latest epoch we did. Returns -1 if none exist yet -# e = specific_builder.load_model_weights(train_model) - -# num_epochs = conf['training']['num_epochs'] -# num_at_once = conf['training']['num_shots_at_once'] -# lr_decay = conf['model']['lr_decay'] -# lr = conf['model']['lr'] -# print('{} epochs left to go'.format(num_epochs - 1 - e)) -# while e < num_epochs-1: -# e += 1 -# print('\nEpoch {}/{}'.format(e+1,num_epochs)) -# pbar = Progbar(len(shot_list_train)) - -# #shuffle during every iteration -# shot_list_train.shuffle() -# shot_sublists = shot_list_train.sublists(num_at_once) -# training_losses_tmp = [] - -# #decay learning rate each epoch: -# K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) - -# #print('Learning rate: {}'.format(train_model.optimizer.lr.get_value())) -# for (i,shot_sublist) in enumerate(shot_sublists): -# X_list,y_list = loader.load_as_X_y_list(shot_sublist) -# for j,(X,y) in enumerate(zip(X_list,y_list)): -# history = builder.LossHistory() -# #load data and fit on data -# train_model.fit(X,y, -# batch_size=Loader.get_batch_size(conf['training']['batch_size'],prediction_mode=False), -# epochs=1,shuffle=False,verbose=0, -# validation_split=0.0,callbacks=[history]) -# train_model.reset_states() -# train_loss = np.mean(history.losses) -# training_losses_tmp.append(train_loss) - -# pbar.add(1.0*len(shot_sublist)/len(X_list), values=[("train loss", train_loss)]) -# loader.verbose=False#True during the first iteration -# sys.stdout.flush() -# training_losses.append(np.mean(training_losses_tmp)) -# specific_builder.save_model_weights(train_model,e) - -# if conf['training']['validation_frac'] > 0.0: -# _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) -# validation_losses.append(loss) -# validation_roc.append(roc_area) - -# print('=========Summary========') -# print('Training Loss: {:.3e}'.format(training_losses[-1])) -# if conf['training']['validation_frac'] > 0.0: -# print('Validation Loss: {:.3e}'.format(validation_losses[-1])) -# print('Validation ROC: {:.4f}'.format(validation_roc[-1])) - - -# # plot_losses(conf,[training_losses],specific_builder,name='training') -# if conf['training']['validation_frac'] > 0.0: -# plot_losses(conf,[training_losses,validation_losses,validation_roc],specific_builder,name='training_validation_roc') -# print('...done') - - def train(conf,shot_list_train,loader): np.random.seed(1) From a7b06989291b5cc4425521b5ee680c8bed34e517 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 16:01:05 -0400 Subject: [PATCH 082/744] Custom float16 MPI datatype and reduction operation --- plasma/primitives/ops.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 plasma/primitives/ops.py diff --git a/plasma/primitives/ops.py b/plasma/primitives/ops.py new file mode 100644 index 00000000..d55023be --- /dev/null +++ b/plasma/primitives/ops.py @@ -0,0 +1,15 @@ +from mpi4py import MPI +comm = MPI.COMM_WORLD + +#define a float16 mpi datatype +mpi_float16 = MPI.BYTE.Create_contiguous(2).Commit() +MPI._typedict['e'] = mpi_float16 + +def sum_f16_cb(buffer_a, buffer_b, t): + assert t == mpi_float16 + array_a = np.frombuffer(buffer_a, dtype='float16') + array_b = np.frombuffer(buffer_b, dtype='float16') + array_b += array_a + +#create new OP +mpi_sum_f16 = MPI.Op.Create(sum_f16_cb, commute=True) From 6b6bf98bab8732812c80ce0a079682d6e20f027d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 16:02:14 -0400 Subject: [PATCH 083/744] float16 Allreduce switch based on the type --- plasma/models/mpi_runner.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index d4bbc6f8..40fa01bf 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -74,6 +74,7 @@ from plasma.utils.evaluation import get_loss_from_list from plasma.utils.processing import concatenate_sublists from plasma.utils.performance import PerformanceAnalyzer +from plasma.primitives.ops import mpi_sum_f16 if task_index == 0: pprint(conf) @@ -227,7 +228,10 @@ def mpi_average_gradients(self,arr,num_replicas=None): if self.task_index >= num_replicas: arr *= 0.0 arr_global = np.empty_like(arr) - self.comm.Allreduce(arr,arr_global,op=MPI.SUM) + if K.floatx() == 'float16': + self.comm.Allreduce(arr,arr_global,op=mpi_sum_f16) + else: + self.comm.Allreduce(arr,arr_global,op=MPI.SUM) arr_global /= num_replicas return arr_global From e6bc0a6cce1e3c41abf68452ea93e252aec8223d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 16:03:52 -0400 Subject: [PATCH 084/744] Ensure backend not theno for tensorboard --- plasma/models/mpi_runner.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 40fa01bf..ae16c1d6 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -668,9 +668,11 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non stop_training = mpi_model.model.stop_training #tensorboard - val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() - val_steps = 20 - tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) + if backend != 'theano': + val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() + val_steps = 20 + tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) + stop_training = comm.bcast(stop_training,root=0) if stop_training: print("Stopping training due to early stopping") From 5c3e09011070538422b033e0612260e6ba947db9 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 19:26:05 -0400 Subject: [PATCH 085/744] Import numpy --- plasma/primitives/ops.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/primitives/ops.py b/plasma/primitives/ops.py index d55023be..1152ad46 100644 --- a/plasma/primitives/ops.py +++ b/plasma/primitives/ops.py @@ -1,3 +1,4 @@ +import numpy as np from mpi4py import MPI comm = MPI.COMM_WORLD From 4f2b1955fba9588829782fce7d48d39bf35ce8a0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 21:57:43 -0400 Subject: [PATCH 086/744] Python3 compatibility: tab-space consistency, exception as e, printing, multiprocessing Queue --- data/gadata.py | 27 ++++---- data/signals.py | 9 +-- plasma/models/data.py | 2 +- plasma/models/loader.py | 68 +++++++++----------- plasma/models/runner.py | 52 +++++++-------- plasma/models/targets.py | 14 ++-- plasma/preprocessor/normalize.py | 102 +++++++++++++++--------------- plasma/preprocessor/preprocess.py | 21 +++--- plasma/utils/performance.py | 102 +++++++++++++++--------------- 9 files changed, 189 insertions(+), 208 deletions(-) diff --git a/data/gadata.py b/data/gadata.py index d7c66fd5..9494e87c 100644 --- a/data/gadata.py +++ b/data/gadata.py @@ -38,7 +38,7 @@ def __init__(self,signal,shot,tree=None,connection=None,nomds=False): fstree = tree else: tag = self.connection.get('findsig("'+self.signal+'",_fstree)').value - fstree = self.connection.get('_fstree').value + fstree = self.connection.get('_fstree').value self.connection.openTree(fstree,shot) self.zdata = self.connection.get('_s = '+tag).data() @@ -48,17 +48,17 @@ def __init__(self,signal,shot,tree=None,connection=None,nomds=False): self.xdata = self.connection.get('dim_of(_s,1)').data() self.xunits = self.connection.get('units_of(dim_of(_s,1))').data() if self.xunits == '' or self.xunits == ' ': - self.xunits = self.connection.get('units(dim_of(_s,1))').data() + self.xunits = self.connection.get('units(dim_of(_s,1))').data() self.ydata = self.connection.get('dim_of(_s)').data() - self.yunits = self.connection.get('units_of(dim_of(_s))').data() + self.yunits = self.connection.get('units_of(dim_of(_s))').data() if self.yunits == '' or self.yunits == ' ': self.yunits = self.connection.get('units(dim_of(_s))').data() else: self.xdata = self.connection.get('dim_of(_s)').data() self.xunits = self.connection.get('units_of(dim_of(_s))').data() if self.xunits == '' or self.xunits == ' ': - self.xunits = self.connection.get('units(dim_of(_s))').data() + self.xunits = self.connection.get('units(dim_of(_s))').data() #print 'zdata: ' + str(self.zdata) self.found = True @@ -67,19 +67,17 @@ def __init__(self,signal,shot,tree=None,connection=None,nomds=False): if numpy.ndim(self.ydata) == 2: self.ydata = numpy.transpose(self.ydata) if numpy.ndim(self.xdata) == 2: self.xdata = numpy.transpose(self.xdata) - except Exception,e: - #node not found -# print ' Signal not in MDSplus: %s' % (signal,) + except Exception as e: pass # Retrieve data from PTDATA if node not found - if not self.found: + if not self.found: #print 'Trying ptdata: %s' % (signal,) - self.zdata = self.connection.get('_s = ptdata2("'+signal+'",'+str(shot)+')') - if len(self.zdata) != 1: - self.xdata = self.connection.get('dim_of(_s)') - self.rank = 1 - self.found = True + self.zdata = self.connection.get('_s = ptdata2("'+signal+'",'+str(shot)+')') + if len(self.zdata) != 1: + self.xdata = self.connection.get('dim_of(_s)') + self.rank = 1 + self.found = True # Retrieve data from Pseudo-pointname if not in ptdata if not self.found: @@ -92,8 +90,5 @@ def __init__(self,signal,shot,tree=None,connection=None,nomds=False): if not self.found: #this means the signal wasn't found pass - # print ' Signal not in pseudo-pointname: %s' % (signal,) - #print " No such signal: %s" % (signal,) - #print ' GADATA Retrieval Time : ',time.time() - t0 return diff --git a/data/signals.py b/data/signals.py index 596627d9..435a008b 100644 --- a/data/signals.py +++ b/data/signals.py @@ -1,7 +1,4 @@ -# try: - # from MDSplus import * -# except ImportError: - # print("MDS+ not installed. Won't be able to download data") +from __future__ import print_function import numpy as np import time import sys @@ -68,7 +65,7 @@ def get_units(str): if np.ndim(ydata) == 2: ydata = np.transpose(ydata) if np.ndim(xdata) == 2: xdata = np.transpose(xdata) - except Exception,e: + except Exception as e: #print(e) #sys.stdout.flush() pass @@ -91,7 +88,7 @@ def get_units(str): found = True #this means the signal wasn't found if not found: - print " No such signal: %s" % (signal,) + print ("No such signal: {}".format(signal)) pass # print ' GADATA Retrieval Time : ',time.time() - t0 diff --git a/plasma/models/data.py b/plasma/models/data.py index d2179f7d..fac26133 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -173,7 +173,7 @@ def fetch_data(self,signal,shot_num,c): mapping = None try: time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) - except Exception,e: + except Exception as e: time,data = create_missing_value_filler() print(e) sys.stdout.flush() diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 103b699f..e5637c94 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -156,11 +156,9 @@ def training_batch_generator_partial_reset(self,shot_list): while True: # the list of all shots shot_list.shuffle() - #print("restarting shotlist") for shot in shot_list: while not np.any(end_indices == 0): X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) - #print(end_indices) yield X,Y,batches_to_reset,num_so_far,num_total returned = True batches_to_reset[:] = False @@ -172,22 +170,21 @@ def training_batch_generator_partial_reset(self,shot_list): # epoch += 1 def fill_batch_queue(self,shot_list,queue): - print("Starting thread to fill queue") + print("Starting thread to fill queue") gen = self.training_batch_generator_partial_reset(shot_list) - while True: - ret = next(gen) - queue.put(ret,block=True,timeout=-1) + while True: + ret = next(gen) + queue.put(ret,block=True,timeout=-1) def training_batch_generator_process(self,shot_list): - queue = mp.Queue() - proc = mp.Process(target = self.fill_batch_queue,args=(shot_list,queue)) - proc.start() - while True: - yield queue.get(True) - proc.join() - queue.close() - + queue = mp.Queue() + proc = mp.Process(target = self.fill_batch_queue,args=(shot_list,queue)) + proc.start() + while True: + yield queue.get(True) + proc.join() + queue.close() def load_as_X_y_list(self,shot_list,verbose=False,prediction_mode=False): """ @@ -249,10 +246,10 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() ttd,signal = shot.get_data_arrays(use_signals) - if len(ttd) < self.conf['model']['length']: - print(ttd) - print(shot) - print(shot.number) + if len(ttd) < self.conf['model']['length']: + print(ttd) + print(shot) + print(shot.number) total_length += len(ttd) signals.append(signal) @@ -329,8 +326,8 @@ def make_deterministic_patches(self,signals,results): def make_deterministic_patches_from_single_array(self,sig,res,min_len): sig_patches = [] res_patches = [] - if len(sig) <= min_len: - print('signal length: {}'.format(len(sig))) + if len(sig) <= min_len: + print('signal length: {}'.format(len(sig))) assert(min_len <= len(sig)) for start in range(0,len(sig)-min_len,min_len): sig_patches.append(sig[start:start+min_len]) @@ -598,31 +595,24 @@ def load_shotlists(self,conf): shot_list_test = data['shot_list_test'][()] return shot_list_train,shot_list_validate,shot_list_test - - - - - - class ProcessGenerator(object): def __init__(self,generator): - self.generator = generator - self.proc = mp.Process(target=self.fill_batch_queue) - self.queue = mp.Queue() - self.proc.start() - + self.generator = generator + self.proc = mp.Process(target=self.fill_batch_queue) + self.queue = mp.Queue() + self.proc.start() + def fill_batch_queue(self): - print("Starting process to fetch data") - while True: - self.queue.put(next(self.generator),True,-1) + print("Starting process to fetch data") + while True: + self.queue.put(next(self.generator),True,-1) def __next__(self): - return self.queue.get(True) + return self.queue.get(True) def next(self): - return self.__next__() + return self.__next__() def __exit__(self): - self.proc.terminate() - self.queue.close() - + self.proc.terminate() + self.queue.close() diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 27cb363d..4e858dfa 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -36,12 +36,12 @@ def train(conf,shot_list_train,loader): if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules - if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU":1}) + set_session(tf.Session(config=config)) else: os.environ['KERAS_BACKEND'] = 'theano' os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' @@ -111,7 +111,7 @@ def train(conf,shot_list_train,loader): specific_builder.save_model_weights(train_model,int(round(e))) if conf['training']['validation_frac'] > 0.0: - print("prediction on GPU...") + print("prediction on GPU...") _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) validation_losses.append(loss) validation_roc.append(roc_area) @@ -121,7 +121,7 @@ def train(conf,shot_list_train,loader): if conf['training']['validation_frac'] > 0.0: print('Validation Loss: {:.3e}'.format(validation_losses[-1])) print('Validation ROC: {:.4f}'.format(validation_roc[-1])) - + # plot_losses(conf,[training_losses],specific_builder,name='training') @@ -247,12 +247,12 @@ def make_predictions(conf,shot_list,loader): if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules - if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"CPU":use_cores}) - set_session(tf.Session(config=config)) + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"CPU":use_cores}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=cpu' import theano @@ -308,12 +308,12 @@ def make_predictions_gpu(conf,shot_list,loader): if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules - if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU":1}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' import theano @@ -367,12 +367,12 @@ def make_evaluations_gpu(conf,shot_list,loader): if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules - if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + if first_time: + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU":1}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' import theano diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 563f16f8..ed353d9f 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -12,7 +12,7 @@ class Target(object): @abc.abstractmethod def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + return mse_np(y_true,y_pred) @abc.abstractmethod def remapper(ttd,T_warning): @@ -29,7 +29,7 @@ class BinaryTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return binary_crossentropy_np(y_true,y_pred) + return binary_crossentropy_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): @@ -51,7 +51,7 @@ class TTDTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + return mse_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning): @@ -71,7 +71,7 @@ class TTDLinearTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + return mse_np(y_true,y_pred) @staticmethod @@ -152,9 +152,9 @@ class HingeTarget(Target): @staticmethod def loss_np(y_true, y_pred): - return hinge_np(y_true,y_pred) - #return squared_hinge_np(y_true,y_pred) - + return hinge_np(y_true,y_pred) + #return squared_hinge_np(y_true,y_pred) + @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): binary_ttd = 0*ttd diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 18b26101..09b10109 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -68,9 +68,9 @@ def load_stats(self): pass def ensure_machine(self,machine): - if machine not in self.means: - self.num_processed[machine] = 0 - self.num_disruptive[machine] = 0 + if machine not in self.means: + self.num_processed[machine] = 0 + self.num_disruptive[machine] = 0 ######Modify the above to change the specifics of the normalization scheme####### def train(self): @@ -95,7 +95,7 @@ def train(self): def train_on_files(self,shot_files,use_shots): conf = self.conf all_signals = conf['paths']['all_signals'] - shot_list = ShotList() + shot_list = ShotList() shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) @@ -110,7 +110,7 @@ def train_on_files(self,shot_files,use_shots): for (i,stats) in enumerate(pool.imap_unordered(self.train_on_single_shot,shot_list_picked)): #for (i,stats) in enumerate(map(self.train_on_single_shot,shot_list_picked)): self.incorporate_stats(stats) - self.machines.add(stats.machine) + self.machines.add(stats.machine) sys.stdout.write('\r' + '{}/{}'.format(i,len(shot_list_picked))) pool.close() @@ -144,7 +144,7 @@ def train_on_single_shot(self,shot): assert isinstance(shot,Shot), 'should be instance of shot' processed_prepath = self.conf['paths']['processed_prepath'] shot.restore(processed_prepath) - #print(shot) + #print(shot) stats = self.extract_stats(shot) shot.make_light() return stats @@ -162,8 +162,8 @@ def previously_saved_stats(self): machines = dat['machines'][()] ret = all([m in machines for m in self.conf['paths']['all_machines']]) if not ret: - print(machines) - print(self.conf['paths']['all_machines']) + print(machines) + print(self.conf['paths']['all_machines']) print('Not all machines present. Recomputing normalizer.') return ret @@ -181,12 +181,12 @@ def __init__(self,conf): self.stds = dict() def __str__(self): - s = '' - for machine in self.means: - means = np.median(self.means[machine],axis=0) - stds = np.median(self.stds[machine],axis=0) - s += 'Machine: {}:\nMean Var Normalizer.\nmeans: {}\nstds: {}'.format(machine,means,stds) - return s + s = '' + for machine in self.means: + means = np.median(self.means[machine],axis=0) + stds = np.median(self.stds[machine],axis=0) + s += 'Machine: {}:\nMean Var Normalizer.\nmeans: {}\nstds: {}'.format(machine,means,stds) + return s def extract_stats(self,shot): stats = Stats() @@ -199,14 +199,14 @@ def extract_stats(self,shot): else: print('Warning: shot {} not valid, omitting'.format(shot.number)) stats.valid = shot.valid - stats.machine = shot.machine + stats.machine = shot.machine return stats def incorporate_stats(self,stats): - machine = stats.machine - self.ensure_machine(stats.machine) + machine = stats.machine + self.ensure_machine(stats.machine) if stats.valid: means = stats.means stds = stats.stds @@ -221,14 +221,14 @@ def incorporate_stats(self,stats): def apply(self,shot): - m = shot.machine + m = shot.machine assert self.means[m] is not None and self.stds[m] is not None, "self.means or self.stds not initialized" means = np.median(self.means[m],axis=0) stds = np.median(self.stds[m],axis=0) for (i,sig) in enumerate(shot.signals): - stds_curr = stds[i] - if stds_curr == 0.0: - stds_curr = 1.0 + stds_curr = stds[i] + if stds_curr == 0.0: + stds_curr = 1.0 shot.signals_dict[sig] = (shot.signals_dict[sig] - means[i])/stds_curr shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) @@ -253,32 +253,32 @@ def load_stats(self): self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] - for machine in self.means: - print('Machine {}:'.format(machine)) - print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) + for machine in self.means: + print('Machine {}:'.format(machine)) + print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) #print('loading normalization data from {} shots, {} disruptive'.format(num_processed,num_disruptive)) class VarNormalizer(MeanVarNormalizer): def apply(self,shot): assert self.means is not None and self.stds is not None, "self.means or self.stds not initialized" - m = shot.machine + m = shot.machine stds = np.median(self.stds[m],axis=0) for (i,sig) in enumerate(shot.signals): - stds_curr = stds[i] - if stds_curr == 0.0: - stds_curr = 1.0 + stds_curr = stds[i] + if stds_curr == 0.0: + stds_curr = 1.0 shot.signals_dict[sig] = (shot.signals_dict[sig])/stds_curr shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) def __str__(self): - s = '' - for m in self.stds: - stds = np.median(self.stds[m],axis=0) - s += 'Machine: {}:\n'.format(m) - s += 'Var Normalizer.\nstds: {}\n'.format(stds) - return s + s = '' + for m in self.stds: + stds = np.median(self.stds[m],axis=0) + s += 'Machine: {}:\n'.format(m) + s += 'Var Normalizer.\nstds: {}\n'.format(stds) + return s class AveragingVarNormalizer(VarNormalizer): @@ -296,12 +296,12 @@ def apply(self,shot): def __str__(self): window_decay = self.conf['data']['window_decay'] window_size = self.conf['data']['window_size'] - s = '' - for m in self.stds: - stds = np.median(self.stds[m],axis=0) - s += 'Machine: {}:\n'.format(m) - s += 'Averaging Var Normalizer.\nstds: {}\nWindow size: {}, Window decay: {}'.format(stds,window_size,window_decay) - return s + s = '' + for m in self.stds: + stds = np.median(self.stds[m],axis=0) + s += 'Machine: {}:\n'.format(m) + s += 'Averaging Var Normalizer.\nstds: {}\nWindow size: {}, Window decay: {}'.format(stds,window_size,window_decay) + return s class MinMaxNormalizer(Normalizer): @@ -312,10 +312,10 @@ def __init__(self,conf): def __str__(self): - s = '' - for m in self.minimums: - s += 'Machine {}:\n.Min Max Normalizer.\nminimums: {}\nmaximums: {}'.format(m,self.minimums[m],self.maximums[m]) - return s + s = '' + for m in self.minimums: + s += 'Machine {}:\n.Min Max Normalizer.\nminimums: {}\nmaximums: {}'.format(m,self.minimums[m],self.maximums[m]) + return s def extract_stats(self,shot): stats = Stats() @@ -327,14 +327,14 @@ def extract_stats(self,shot): else: print('Warning: shot {} not valid, omitting'.format(shot.number)) stats.valid = shot.valid - stats.machine = shot.machine + stats.machine = shot.machine return stats def incorporate_stats(self,stats): - self.ensure_machine(stats.machine) + self.ensure_machine(stats.machine) if stats.valid: - m = stats.machine + m = stats.machine minimums = stats.minimums maximums = stats.maximums if self.num_processed == 0: @@ -349,10 +349,10 @@ def incorporate_stats(self,stats): def apply(self,shot): assert(self.minimums is not None and self.maximums is not None) - m = shot.machine - curr_range = (self.maximums[m] - self.minimums[m]) - if curr_range == 0.0: - curr_range = 1.0 + m = shot.machine + curr_range = (self.maximums[m] - self.minimums[m]) + if curr_range == 0.0: + curr_range = 1.0 shot.signals = (shot.signals - self.minimums[m])/curr_range for (i,sig) in enumerate(shot.signals): shot.signals_dict[sig] = (shot.signals_dict[sig] - self.minimums[m])/(self.maximums[m] - self.minimums[m]) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 9b3f6732..2afa2bc6 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -69,7 +69,7 @@ def preprocess_all(self): def preprocess_from_files(self,shot_files,use_shots): #all shots, including invalid ones all_signals = self.conf['paths']['all_signals'] - shot_list = ShotList() + shot_list = ShotList() shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) @@ -85,8 +85,8 @@ def preprocess_from_files(self,shot_files,use_shots): sys.stdout.write('\r{}/{}'.format(i,len(shot_list_picked))) used_shots.append_if_valid(shot) - pool.close() - pool.join() + pool.close() + pool.join() print('Finished Preprocessing {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) print('{}/{} disruptive shots'.format(used_shots.num_disruptive(),len(used_shots))) @@ -101,14 +101,13 @@ def preprocess_single_file(self,shot): shot.save(processed_prepath) else: - try: - shot.restore(processed_prepath,light=True) - sys.stdout.write('\r{} exists.'.format(shot.number)) - except: - shot.preprocess(self.conf) - shot.save(processed_prepath) - sys.stdout.write('\r{} exists but corrupted, resaved.'.format(shot.number)) - + try: + shot.restore(processed_prepath,light=True) + sys.stdout.write('\r{} exists.'.format(shot.number)) + except: + shot.preprocess(self.conf) + shot.save(processed_prepath) + sys.stdout.write('\r{} exists but corrupted, resaved.'.format(shot.number)) shot.make_light() return shot diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 333990c5..0fd4a7e4 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -30,7 +30,7 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = 0,T_max_war self.disruptive_test = None self.shot_list_test = None - self.p_thresh_range = None + self.p_thresh_range = None self.normalizer = None @@ -73,36 +73,36 @@ def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): def get_p_thresh_range(self): - #return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) - if self.p_thresh_range == None: - all_preds_tr = self.pred_train - all_truths_tr = self.truth_train - all_disruptive_tr = self.disruptive_train - all_preds_te = self.pred_test - all_truths_te = self.truth_test - all_disruptive_te = self.disruptive_test - - early_th_tr,correct_th_tr,late_th_tr,nd_th_tr = self.get_threshold_arrays(all_preds_tr,all_truths_tr,all_disruptive_tr) - early_th_te,correct_th_te,late_th_te,nd_th_te = self.get_threshold_arrays(all_preds_te,all_truths_te,all_disruptive_te) - all_thresholds = np.sort(np.concatenate((early_th_tr,correct_th_tr,late_th_tr,nd_th_tr,early_th_te,correct_th_te,late_th_te,nd_th_te))) - self.p_thresh_range = all_thresholds - return self.p_thresh_range - + #return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) + if self.p_thresh_range == None: + all_preds_tr = self.pred_train + all_truths_tr = self.truth_train + all_disruptive_tr = self.disruptive_train + all_preds_te = self.pred_test + all_truths_te = self.truth_test + all_disruptive_te = self.disruptive_test + + early_th_tr,correct_th_tr,late_th_tr,nd_th_tr = self.get_threshold_arrays(all_preds_tr,all_truths_tr,all_disruptive_tr) + early_th_te,correct_th_te,late_th_te,nd_th_te = self.get_threshold_arrays(all_preds_te,all_truths_te,all_disruptive_te) + all_thresholds = np.sort(np.concatenate((early_th_tr,correct_th_tr,late_th_tr,nd_th_tr,early_th_te,correct_th_te,late_th_te,nd_th_te))) + self.p_thresh_range = all_thresholds + return self.p_thresh_range + def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): - all_disruptive = np.array(all_disruptive) - if self.pred_train is not None: - p_thresh_range = self.get_p_thresh_range() - else: - early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) - p_thresh_range = np.sort(np.concatenate((early_th,correct_th,late_th,nd_th))) + all_disruptive = np.array(all_disruptive) + if self.pred_train is not None: + p_thresh_range = self.get_p_thresh_range() + else: + early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) + p_thresh_range = np.sort(np.concatenate((early_th,correct_th,late_th,nd_th))) correct_range = np.zeros_like(p_thresh_range) accuracy_range = np.zeros_like(p_thresh_range) fp_range = np.zeros_like(p_thresh_range) missed_range = np.zeros_like(p_thresh_range) early_alarm_range = np.zeros_like(p_thresh_range) - early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) + early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) for i,thresh in enumerate(p_thresh_range): #correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(thresh,all_preds,all_truths,all_disruptive) @@ -116,7 +116,7 @@ def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range def get_shot_prediction_stats_from_threshold_arrays(self,early_th,correct_th,late_th,nd_th,thresh): - indices = np.where(np.logical_and(correct_th > thresh,early_th <= thresh))[0] + indices = np.where(np.logical_and(correct_th > thresh,early_th <= thresh))[0] FPs = np.sum(nd_th > thresh) TNs = len(nd_th) - FPs @@ -139,7 +139,7 @@ def get_threshold_arrays(self,preds,truths,disruptives): for i in range(len(preds)): pred = 1.0*preds[i] truth = truths[i] - pred[:self.get_ignore_indices()] = -np.inf + pred[:self.get_ignore_indices()] = -np.inf is_disruptive = disruptives[i] if is_disruptive: max_acceptable = self.create_acceptable_region(truth,'max') @@ -147,15 +147,15 @@ def get_threshold_arrays(self,preds,truths,disruptives): correct_indices = np.logical_and(max_acceptable, ~min_acceptable) early_indices = ~max_acceptable late_indices = min_acceptable - if np.sum(late_indices) == 0: - d_late_thresholds.append(-np.inf) - else: - d_late_thresholds.append(np.max(pred[late_indices])) - if np.sum(early_indices) == 0: - d_early_thresholds.append(-np.inf) - else: - d_early_thresholds.append(np.max(pred[early_indices])) - + if np.sum(late_indices) == 0: + d_late_thresholds.append(-np.inf) + else: + d_late_thresholds.append(np.max(pred[late_indices])) + if np.sum(early_indices) == 0: + d_early_thresholds.append(-np.inf) + else: + d_early_thresholds.append(np.max(pred[early_indices])) + d_correct_thresholds.append(np.max(pred[correct_indices])) else: nd_thresholds.append(np.max(pred)) @@ -241,7 +241,7 @@ def get_shot_prediction_stats(self,P_thresh,pred,truth,is_disruptive): return TP,FP,FN,TN,early,late def get_ignore_indices(self): - return conf['model']['ignore_timesteps'] + return conf['model']['ignore_timesteps'] def get_positives(self,predictions): @@ -298,7 +298,7 @@ def load_ith_file(self): results_files = os.listdir(self.results_dir) print(results_files) dat = np.load(self.results_dir + results_files[self.i]) - print("Loading results file {}".format(self.results_dir + results_files[self.i])) + print("Loading results file {}".format(self.results_dir + results_files[self.i])) if self.verbose: print('configuration: {} '.format(dat['conf'])) @@ -315,20 +315,20 @@ def load_ith_file(self): for mode in ['test','train']: print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) self.print_conf() - #self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) - #self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) + #self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) + #self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) def assert_same_lists(self,shot_list,truth_arr,disr_arr): - assert(len(shot_list) == len(truth_arr)) - for i in range(len(shot_list)): - shot_list.shots[i].restore("/tigress/jk7/processed_shots/") - s = shot_list.shots[i].ttd - if not truth_arr[i].shape[0] == s.shape[0]-30: - print(i) - print(shot_list.shots[i].number) - print((s.shape,truth_arr[i].shape,disr_arr[i])) - assert(truth_arr[i].shape[0] == s.shape[0]-30) - print("Same Shape!") + assert(len(shot_list) == len(truth_arr)) + for i in range(len(shot_list)): + shot_list.shots[i].restore("/tigress/jk7/processed_shots/") + s = shot_list.shots[i].ttd + if not truth_arr[i].shape[0] == s.shape[0]-30: + print(i) + print(shot_list.shots[i].number) + print((s.shape,truth_arr[i].shape,disr_arr[i])) + assert(truth_arr[i].shape[0] == s.shape[0]-30) + print("Same Shape!") def print_conf(self): pprint(self.conf) @@ -599,12 +599,12 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, ax.plot(sig_arr[:,0],label = sig.description) else: ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description + " (profile)") - ax.set_ylim([0,num_channels]) + ax.set_ylim([0,num_channels]) ax.legend(loc='upper center',fontsize=8) plt.setp(ax.get_xticklabels(),visible=False) plt.setp(ax.get_yticklabels(),fontsize=7) f.subplots_adjust(hspace=0) - #print(sig) + #print(sig) #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) #shot.signals is a 2D numpy array with the rows containing the unlabeled timeseries data # signals = np.empty((len(shot.signals),0)) #None @@ -656,7 +656,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, # ax.grid() if save_fig: plt.savefig('sig_fig_{}.png'.format(shot.number),bbox_inches='tight') - plt.close() + plt.close() else: print("Shot hasn't been processed") From c063f22310693d9b514d7788ddd82623c9ce66dd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 25 May 2017 22:00:39 -0400 Subject: [PATCH 087/744] Python3 compatibility: import start only on module level, tab-space consistency --- plasma/conf_parser.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index fbeec8b0..6f4d91a8 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -1,5 +1,7 @@ import plasma.models.targets as t from plasma.primitives.shots import ShotListFiles +from data.signals import * + import getpass import yaml @@ -20,12 +22,12 @@ def parameters(input_file): params['paths']['output_path'] = output_path params['paths']['processed_prepath'] = output_path +'/processed_shots/' params['paths']['results_prepath'] = output_path + '/results/' - if params['training']['hyperparam_tuning']: + if params['training']['hyperparam_tuning']: params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' params['paths']['normalizer_path'] = './normalization/normalization.npz' params['paths']['model_save_path'] = './model_checkpoints/' params['paths']['csvlog_save_path'] = './csv_logs/' - else: + else: params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' params['paths']['model_save_path'] = output_path + '/model_checkpoints/' @@ -51,7 +53,6 @@ def parameters(input_file): #binary crossentropy performs slightly better? #params['model']['loss'] = params['data']['target'].loss - from data.signals import * #signals params['paths']['all_signals'] = all_signals #make sure all 1D signals appear last! From 04c3ac5e209f74751540bf4d3df5894cc9c06fcd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 26 May 2017 21:30:19 -0400 Subject: [PATCH 088/744] Cast back to float32 for Adam to avoid numerical instability --- plasma/models/mpi_runner.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index ae16c1d6..a7f1746c 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -81,9 +81,6 @@ -###TODO add optimizers other than SGD - - class MPIOptimizer(object): def __init__(self,lr): self.lr = lr @@ -116,6 +113,9 @@ def __init__(self,lr): def get_deltas(self,raw_deltas): + if K.floatx() == "float16": + raw_deltas = map(lambda w: w.astype(np.float32),raw_deltas) + if self.iterations == 0: self.m_list = [np.zeros_like(g) for g in raw_deltas] self.v_list = [np.zeros_like(g) for g in raw_deltas] @@ -132,6 +132,10 @@ def get_deltas(self,raw_deltas): self.v_list[i] = v_t self.iterations += 1 + + if K.floatx() == "float16": + deltas = map(lambda w: w.astype(np.float16),deltas) + return deltas From 0c2b544a78e32c463bf3d4bcfea59db4b7523df2 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 26 May 2017 21:35:39 -0400 Subject: [PATCH 089/744] Python3 compatibility: fix tab-space indentation inconsistencies, import Queue from multiprocessing --- plasma/models/builder.py | 69 +++++++++++++++++-------------------- plasma/models/mpi_runner.py | 61 +++++++++++++------------------- plasma/primitives/shots.py | 47 +++++++++++++------------ plasma/utils/downloading.py | 4 +-- 4 files changed, 80 insertions(+), 101 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 73c8a49e..822f3212 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -43,28 +43,28 @@ def get_unique_id(self): return unique_id def get_0D_1D_indices(self): - #make sure all 1D indices are contiguous in the end! + #make sure all 1D indices are contiguous in the end! use_signals = self.conf['paths']['use_signals'] indices_0d = [] indices_1d = [] num_0D = 0 num_1D = 0 curr_idx = 0 - is_1D_region = use_signals[0].num_channels > 1#do we have any 1D indices? + is_1D_region = use_signals[0].num_channels > 1#do we have any 1D indices? for sig in use_signals: num_channels = sig.num_channels indices = range(curr_idx,curr_idx+num_channels) if num_channels > 1: indices_1d += indices num_1D += 1 - is_1D_region = True + is_1D_region = True else: - assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" + assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" assert(num_channels == 1) indices_0d += indices num_0D += 1 - is_1D_region = False - curr_idx += num_channels + is_1D_region = False + curr_idx += num_channels return np.array(indices_0d).astype(np.int32), np.array(indices_1d).astype(np.int32),num_0D,num_1D @@ -131,7 +131,7 @@ def build_model(self,predict,custom_batch_size=None): exit(1) batch_input_shape=(batch_size,length, num_signals) - batch_shape_non_temporal=(batch_size,num_signals) + batch_shape_non_temporal=(batch_size,num_signals) indices_0d,indices_1d,num_0D,num_1D = self.get_0D_1D_indices() def slicer(x,indices): @@ -143,38 +143,32 @@ def slicer_output_shape(input_shape,indices): shape_curr[-1] = len(indices) return tuple(shape_curr) - pre_rnn_input = Input(shape=(num_signals,)) - #print(batch_shape_non_temporal) - #print(batch_input_shape) - #print(indices_0d) - #print(indices_1d) - #print(num_0D) - #print(num_1D) - - if num_1D > 0: + pre_rnn_input = Input(shape=(num_signals,)) + + if num_1D > 0: #pre_rnn_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) #pre_rnn_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d))(pre_rnn_input) - #idx0D_tensor = K.variable(indices_0d) - #idx1D_tensor = K.variable(indices_1d) - pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) + #idx0D_tensor = K.variable(indices_0d) + #idx1D_tensor = K.variable(indices_1d) + pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) pre_rnn_0D = Lambda(lambda x: x[:,:len(indices_0d)],output_shape=(len(indices_0d),))(pre_rnn_input)# slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) - pre_rnn_1D = Reshape((num_1D,len(indices_1d)/num_1D)) (pre_rnn_1D) - pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) + pre_rnn_1D = Reshape((num_1D,len(indices_1d)//num_1D)) (pre_rnn_1D) + pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) - #pre_rnn_1D = Conv1D(num_conv_filters,size_conv_filters,padding='same',activation='relu',dilation_rate=1) (pre_rnn_1D) + #pre_rnn_1D = Conv1D(num_conv_filters,size_conv_filters,padding='same',activation='relu',dilation_rate=1) (pre_rnn_1D) for i in range(model_conf['num_conv_layers']): pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) - else: - pre_rnn = pre_rnn_input - #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) - #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) - - pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) - x_input = Input(batch_shape = batch_input_shape) - x_in = TimeDistributed(pre_rnn_model) (x_input) + else: + pre_rnn = pre_rnn_input + #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + + pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) + x_input = Input(batch_shape = batch_input_shape) + x_in = TimeDistributed(pre_rnn_model) (x_input) # x_input = Input(batch_shape=batch_input_shape) # if num_1D > 0: @@ -207,15 +201,14 @@ def slicer_output_shape(input_shape,indices): x_out = Dense(1,activation=output_activation) (x_in) model = Model(inputs=x_input,outputs=x_out) model.compile(loss=loss_fn, optimizer=optimizer) - #bug with tensorflow/Keras - if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': - first_time = "tensorflow" not in sys.modules - import tensorflow as tf - if first_time: - K.get_session().run(tf.global_variables_initializer()) + #bug with tensorflow/Keras + if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': + first_time = "tensorflow" not in sys.modules + import tensorflow as tf + if first_time: + K.get_session().run(tf.global_variables_initializer()) model.reset_states() - #model.summary() #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output return model @@ -266,7 +259,7 @@ def extract_id_and_epoch_from_filename(self,filename): def get_all_saved_files(self): - self.ensure_save_directory() + self.ensure_save_directory() unique_id = self.get_unique_id() filenames = os.listdir(self.conf['paths']['model_save_path']) epochs = [] diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index a7f1746c..6788e87f 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -380,22 +380,16 @@ def train_epoch(self): num_batches_minimum = 100 num_batches_current = 0 - - #if task_index == 2: - # sys.stdout.write("\ninternal states: {} ".format(get_states(self.model)[0][0][0][:4])) - # sys.stdout.write("\nweights: {} ".format(self.model.get_weights()[0][0][:4,0])) -# sys.stdout.flush() - #print(get_states(self.model)[0][0:3]) while (self.num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: try: batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) except StopIteration: - print("Resetting batch iterator.") + print("Resetting batch iterator.") self.num_so_far_accum = self.num_so_far_indiv - self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) - batch_iterator_func = self.batch_iterator_func + self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + batch_iterator_func = self.batch_iterator_func batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) self.num_so_far_indiv = self.num_so_far_accum+num_so_far_curr @@ -422,9 +416,6 @@ def train_epoch(self): sys.stdout.flush() t0 = time.time() - #positives_ = np.sum(np.max(batch_ys[:,:,0],axis=-1) > 0.0) - #sys.stdout.write("\n[{}] postives: {}".format(task_index,positives_)) - #sys.stdout.flush() deltas,loss = self.get_deltas(batch_xs,batch_ys,verbose) t1 = time.time() self.set_new_weights(deltas,num_replicas) @@ -433,7 +424,7 @@ def train_epoch(self): curr_loss = self.mpi_average_scalars(1.0*loss,num_replicas) #if self.task_index == 0: - #print(self.model.get_weights()[0][0][:4]) + #print(self.model.get_weights()[0][0][:4]) loss_averager.add_val(curr_loss) ave_loss = loss_averager.get_val() eta = self.estimate_remaining_time(t0 - t_start,self.num_so_far-self.epoch*num_total,num_total) @@ -441,10 +432,6 @@ def train_epoch(self): print_unique(write_str + write_str_0) step += 1 - #if task_index == 2: - # sys.stdout.write("\ninternal states: {} ".format(get_states(self.model)[0][0][0][:4])) - # sys.stdout.write("\nweights: {} ".format(self.model.get_weights()[0][0][:4,0])) - # sys.stdout.flush() effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch self.epoch = effective_epochs @@ -549,7 +536,7 @@ def mpi_make_predictions(conf,shot_list,loader): X,y,shot_lengths,disr = loader.load_as_X_y_pred(shot_sublist) - + #load data and fit on data y_p = model.predict(X,batch_size=conf['model']['pred_batch_size']) model.reset_states() @@ -630,19 +617,19 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.compile(loss=conf['data']['target'].loss) if task_index == 0: - callbacks = mpi_model.build_callbacks(conf,callbacks_list) - callbacks.set_model(mpi_model.model) - callback_metrics = conf['callbacks']['metrics'] - callbacks.set_params({ + callbacks = mpi_model.build_callbacks(conf,callbacks_list) + callbacks.set_model(mpi_model.model) + callback_metrics = conf['callbacks']['metrics'] + callbacks.set_params({ 'epochs': num_epochs, 'metrics': callback_metrics, 'batch_size': batch_size, - }) - callbacks.on_train_begin() + }) + callbacks.on_train_begin() while e < num_epochs-1: if task_index == 0: - callbacks.on_epoch_begin(int(round(e))) + callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) print_unique('\nEpoch {}/{}'.format(e,num_epochs)) @@ -654,13 +641,13 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non specific_builder.save_model_weights(train_model,int(round(e))) epoch_logs = {} - + _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss - stop_training = False + stop_training = False if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) print('Training Loss: {:.3e}'.format(ave_loss)) @@ -668,8 +655,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('Validation ROC: {:.4f}'.format(roc_area)) callbacks.on_epoch_end(int(round(e)), epoch_logs) - if hasattr(mpi_model.model,'stop_training'): - stop_training = mpi_model.model.stop_training + if hasattr(mpi_model.model,'stop_training'): + stop_training = mpi_model.model.stop_training #tensorboard if backend != 'theano': @@ -677,14 +664,14 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non val_steps = 20 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) - stop_training = comm.bcast(stop_training,root=0) - if stop_training: - print("Stopping training due to early stopping") - break + stop_training = comm.bcast(stop_training,root=0) + if stop_training: + print("Stopping training due to early stopping") + break if task_index == 0: callbacks.on_train_end() - pass + pass #tensorboard.on_train_end() mpi_model.close() @@ -692,9 +679,9 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non def get_stop_training(callbacks): for cb in callbacks.callbacks: - if isinstance(cb,cbks.EarlyStopping): - print("Checking for early stopping") - return cb.model.stop_training + if isinstance(cb,cbks.EarlyStopping): + print("Checking for early stopping") + return cb.model.stop_training print("No early stopping callback found.") return False diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 1c28259c..9959cea0 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -119,7 +119,7 @@ def split_train_test(self,conf): train_frac = conf['training']['train_frac'] shuffle_training = conf['training']['shuffle_training'] use_shots = conf['data']['use_shots'] - all_signals = conf['paths']['all_signals'] + all_signals = conf['paths']['all_signals'] #split randomly use_shots_train = int(round(train_frac*use_shots)) use_shots_test = int(round((1-train_frac)*use_shots)) @@ -127,17 +127,17 @@ def split_train_test(self,conf): shot_list_train,shot_list_test = train_test_split(self.shots,train_frac,shuffle_training) #train and test list given else: - shot_list_train = ShotList() - shot_list_train.load_from_shot_list_files_objects(shot_files,all_signals) - - shot_list_test = ShotList() - shot_list_test.load_from_shot_list_files_objects(shot_files_test,all_signals) + shot_list_train = ShotList() + shot_list_train.load_from_shot_list_files_objects(shot_files,all_signals) + + shot_list_test = ShotList() + shot_list_test.load_from_shot_list_files_objects(shot_files_test,all_signals) + - shot_numbers_train = [shot.number for shot in shot_list_train] shot_numbers_test = [shot.number for shot in shot_list_test] print(len(shot_numbers_train),len(shot_numbers_test)) - #make sure we only use pre-filtered valid shots + #make sure we only use pre-filtered valid shots shots_train = self.filter_by_number(shot_numbers_train) shots_test = self.filter_by_number(shot_numbers_test) return shots_train.random_sublist(use_shots_train),shots_test.random_sublist(use_shots_test) @@ -304,13 +304,13 @@ def get_individual_signal_arrays(self): def preprocess(self,conf): sys.stdout.write('\rrecomputing {}'.format(self.number)) - sys.stdout.flush() + sys.stdout.flush() #get minmax times time_arrays,signal_arrays,t_min,t_max,valid = self.get_signals_and_times_from_file(conf) self.valid = valid #cut and resample - if self.valid: - self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) + if self.valid: + self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) def get_signals_and_times_from_file(self,conf): valid = True @@ -326,24 +326,23 @@ def get_signals_and_times_from_file(self,conf): for (i,signal) in enumerate(self.signals): t,sig,valid_signal = signal.load_data(signal_prepath,self) if not valid_signal: - return None,None,None,None,False + return None,None,None,None,False else: - assert(len(sig.shape) == 2) - assert(len(t.shape) == 1) - assert(len(t) > 1) + assert(len(sig.shape) == 2) + assert(len(t.shape) == 1) + assert(len(t) > 1) t_min = max(t_min,np.min(t)) t_max = min(t_max,np.max(t)) - signal_arrays.append(sig) time_arrays.append(t) assert(t_max > t_min or not valid) - #make sure the shot is long enough. - dt = conf['data']['dt'] - if (t_max - t_min)/dt <= (conf['model']['length']+conf['data']['T_min_warn']): - print('Shot {} contains insufficient data'.format(self.number)) - valid = False - - + #make sure the shot is long enough. + dt = conf['data']['dt'] + if (t_max - t_min)/dt <= (conf['model']['length']+conf['data']['T_min_warn']): + print('Shot {} contains insufficient data'.format(self.number)) + valid = False + + if self.is_disruptive: t_max = self.t_disrupt assert(self.t_disrupt <= t_max or not valid) @@ -368,7 +367,7 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): def convert_to_ttd(self,tr,conf): T_max = conf['data']['T_max'] - dt = conf['data']['dt'] + dt = conf['data']['dt'] if self.is_disruptive: ttd = max(tr) - tr ttd = np.clip(ttd,0,T_max) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index da2c8e8f..45ad87de 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -22,7 +22,7 @@ import sys import multiprocessing as mp from functools import partial -import Queue +from multiprocessing import Queue import os import errno @@ -82,7 +82,7 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): data_two_column = np.vstack((mapping_two_column,data_two_column)) try: #can lead to race condition mkdirdepth(save_path_full) - except OSError, e: + except OSError as e: if e.errno == errno.EEXIST: # File exists, and it's a directory, another process beat us to creating this dir, that's OK. pass From 06b9823b966b1b9ad9ac5b327a293eee9861a54f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 26 May 2017 21:37:02 -0400 Subject: [PATCH 090/744] Bump version to 0.3 as we know support float16 training (modulo, Adam) --- plasma/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/version.py b/plasma/version.py index 6c8c65e9..78235354 100644 --- a/plasma/version.py +++ b/plasma/version.py @@ -1,6 +1,6 @@ import re -__version__ = "0.2.0" +__version__ = "0.3.0" version = __version__ From 35c2cf8122763434c56383f02719fbc0a346a3be Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 26 May 2017 23:51:18 -0400 Subject: [PATCH 091/744] added support for prediction using on custom model checkpoint --- examples/mpi_learn.py | 13 ++++++++++--- plasma/models/builder.py | 24 +++++++++++++++--------- plasma/models/mpi_runner.py | 8 ++++---- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 73ee1d79..5cfa384b 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -60,6 +60,12 @@ if task_index == 0: pprint(conf) +only_predict = len(sys.argv) > 1 +custom_path = None +if only_predict: + custom_path = sys.argv[1] + print("predicting using path {}".format(custom_path)) + ##################################################### ####################Normalization#################### ##################################################### @@ -72,7 +78,8 @@ shot_list_train,shot_list_validate,shot_list_test = loader.load_shotlists(conf) -mpi_train(conf,shot_list_train,shot_list_validate,loader) +if not only_predict: + mpi_train(conf,shot_list_train,shot_list_validate,loader) #load last model for testing print('saving results') @@ -83,8 +90,8 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) -y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) -y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader) +y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader,custom_path) +y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) if task_index == 0: print('=========Summary========') diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 73c8a49e..5cd73e7a 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -235,16 +235,22 @@ def ensure_save_directory(self): if not os.path.exists(prepath): os.makedirs(prepath) - def load_model_weights(self,model): - epochs = self.get_all_saved_files() - if len(epochs) == 0: - print('no previous checkpoint found') - return -1 + def load_model_weights(self,model,custom_path=None): + if custom_path == None: + epochs = self.get_all_saved_files() + if len(epochs) == 0: + print('no previous checkpoint found') + return -1 + else: + max_epoch = max(epochs) + print('loading from epoch {}'.format(max_epoch)) + model.load_weights(self.get_save_path(max_epoch)) + return max_epoch else: - max_epoch = max(epochs) - print('loading from epoch {}'.format(max_epoch)) - model.load_weights(self.get_save_path(max_epoch)) - return max_epoch + epoch = self.extract_id_and_epoch_from_filename(sys.path.getbasename(custom_path)) + model.load_weights(custom_path) + print("Loading from custom epoch {}".format(epoch)) + return epoch def get_latest_save_path(self): epochs = self.get_all_saved_files() diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index bb2efea5..5cb40628 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -514,7 +514,7 @@ def load_shotlists(conf): #shot_list_train,shot_list_validate,shot_list_test = load_shotlists(conf) -def mpi_make_predictions(conf,shot_list,loader): +def mpi_make_predictions(conf,shot_list,loader,custom_path=None): shot_list.sort()#make sure all replicas have the same list specific_builder = builder.ModelBuilder(conf) @@ -523,7 +523,7 @@ def mpi_make_predictions(conf,shot_list,loader): disruptive = [] model = specific_builder.build_model(True) - specific_builder.load_model_weights(model) + specific_builder.load_model_weights(model,custom_path) model.reset_states() if task_index == 0: pbar = Progbar(len(shot_list)) @@ -579,8 +579,8 @@ def mpi_make_predictions(conf,shot_list,loader): return y_prime_global,y_gold_global,disruptive_global -def mpi_make_predictions_and_evaluate(conf,shot_list,loader): - y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader) +def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): + y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader,custom_path) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) From 5addefbdae235f51b7c5c8b8094325338ab41579 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sat, 27 May 2017 14:50:03 -0400 Subject: [PATCH 092/744] Make type cast an in-place operation --- plasma/models/mpi_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 6788e87f..b996fe8b 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -114,7 +114,7 @@ def __init__(self,lr): def get_deltas(self,raw_deltas): if K.floatx() == "float16": - raw_deltas = map(lambda w: w.astype(np.float32),raw_deltas) + raw_deltas[:] = map(lambda w: w.astype(np.float32),raw_deltas) if self.iterations == 0: self.m_list = [np.zeros_like(g) for g in raw_deltas] @@ -134,7 +134,7 @@ def get_deltas(self,raw_deltas): self.iterations += 1 if K.floatx() == "float16": - deltas = map(lambda w: w.astype(np.float16),deltas) + deltas[:] = map(lambda w: w.astype(np.float16),deltas) return deltas From 5bdb39f1fe6ce6487ac2f1427634396ce03fb222 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sat, 27 May 2017 14:51:02 -0400 Subject: [PATCH 093/744] For the purspose of getting weights, biases, and activations learned only need 1 step --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index b996fe8b..4e8caab9 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -661,7 +661,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non #tensorboard if backend != 'theano': val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() - val_steps = 20 + val_steps = 1 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) stop_training = comm.bcast(stop_training,root=0) From a9408178d35603345238bdc9b48ca33ee96aab19 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 27 May 2017 19:12:26 -0400 Subject: [PATCH 094/744] adding option to not normalize signals, when the exact numerical value is important but the range might be different across machines (such as q95) --- data/signals.py | 2 +- plasma/models/data.py | 3 ++- plasma/preprocessor/normalize.py | 26 +++++++++++++++----------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/data/signals.py b/data/signals.py index 596627d9..4a918900 100644 --- a/data/signals.py +++ b/data/signals.py @@ -128,7 +128,7 @@ def fetch_nstx_data(signal_path,shot_num,c): etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) -q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10]) +q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False) ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipsip"],[jet,d3d],is_ip=True) li = Signal("internal inductance",["jpf/gs/bl-li Date: Sun, 28 May 2017 13:53:51 -0400 Subject: [PATCH 095/744] Specify type of data through conf.yaml (jet or d3d) --- examples/conf.yaml | 10 +++++----- plasma/conf_parser.py | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 73f39597..5769d85a 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -2,15 +2,15 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. -# for example tigress/alexeys -fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'maxhinge' #'binary' #'ttd' #'hinge' +fs_path: '/tigress' +target: 'maxhinge' #'binary' #'ttd' num_gpus: 4 paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' + data: 'jet_data' data: cut_shot_ends: True @@ -63,7 +63,7 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.0001 #0.00005 #0.00005 #0.00005 + lr: 0.000001 #0.00005 #0.00005 #0.00005 lr_decay: 1.0 #0.98 #0.9 stateful: True return_sequences: True @@ -82,7 +82,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 26 + num_epochs: 100 use_mock_data: False data_parallel: False hyperparam_tuning: False diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 6f4d91a8..49c1b3b7 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -55,8 +55,6 @@ def parameters(input_file): #signals params['paths']['all_signals'] = all_signals - #make sure all 1D signals appear last! - params['paths']['use_signals'] = d3d_signals #shot lists jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') @@ -70,9 +68,19 @@ def parameters(input_file): d3d_jb_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') nstx_full = ShotListFiles(nstx,params['paths']['shot_list_dir'],['disrupt_nstx.txt'],'nstx shots (all are disruptive') + + if params['paths']['data'] == 'jet_data': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals'] = jet_signals + elif params['paths']['data'] == 'd3d_data': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + #make sure all 1D signals appear last! + params['paths']['use_signals'] = d3d_signals + else: pass + - params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) From c956b2e71a59caeb7d9d8d67a16315c8424c3442 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 28 May 2017 13:55:03 -0400 Subject: [PATCH 096/744] Restore default learning rate --- examples/conf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 5769d85a..3ea8f3bc 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -63,7 +63,7 @@ model: clipnorm: 10.0 regularization: 0.0 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.000001 #0.00005 #0.00005 #0.00005 + lr: 0.0001 #0.00005 #0.00005 #0.00005 lr_decay: 1.0 #0.98 #0.9 stateful: True return_sequences: True From 3e2a2d892ccbe026728bc385bcd641f1fb2e43b5 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 May 2017 19:21:48 -0400 Subject: [PATCH 097/744] added numerical stability to numpy based binary crossentropy --- plasma/utils/performance.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 333990c5..301872c4 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -650,8 +650,8 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, ax.set_ylim([-2,2]) ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') - ax.set_xlabel('TTD [ms]') - ax.legend(loc = 'upper center',fontsize=10) + ax.set_xlabel('T [ms]') + ax.legend(loc = 'lower left',fontsize=10) plt.setp(ax.get_yticklabels(),fontsize=7) # ax.grid() if save_fig: From 2f547361fd8d3f45cf9e7cfcfe375eb7e6ceaceb Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 May 2017 19:22:32 -0400 Subject: [PATCH 098/744] added numerical stability to numpy based binary crossentropy --- plasma/utils/evaluation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plasma/utils/evaluation.py b/plasma/utils/evaluation.py index 8c2b13eb..9993ee79 100644 --- a/plasma/utils/evaluation.py +++ b/plasma/utils/evaluation.py @@ -1,4 +1,5 @@ import numpy as np +epsilon = 1e-7 def get_loss_from_list(y_pred_list,y_true_list,target): return np.mean([get_loss(yg,yp,target) for yp,yg in zip(y_pred_list,y_true_list)]) @@ -13,6 +14,7 @@ def mse_np(y_true,y_pred): return np.mean((y_pred-y_true)**2) def binary_crossentropy_np(y_true,y_pred): + y_pred = np.clip(y_pred,epsilon,1-epsilon) return np.mean(- (y_true*np.log(y_pred) + (1-y_true)*np.log(1 - y_pred))) def hinge_np(y_true,y_pred): From 1b35d5d81d19b9a9544c779300f752bf9a3cf1aa Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 May 2017 19:23:56 -0400 Subject: [PATCH 099/744] added support for purely feedforward model (made of dense layers) if the number of RNN layers is set to 0 --- examples/conf.yaml | 11 ++++++----- plasma/models/builder.py | 11 +++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 73f39597..ed3d5b22 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -4,7 +4,7 @@ # for example tigress/alexeys fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'maxhinge' #'binary' #'ttd' #'hinge' +target: 'maxhinge' #'binary' #'hinge' #'maxhinge' #'binary' #'ttd' #'hinge' num_gpus: 4 paths: @@ -23,7 +23,7 @@ data: #train/validate split #how many shots to use use_shots: 200000 #1000 #200000 - positive_example_penalty: 2.0 #by what factor to upweight positive examples? + positive_example_penalty: 1.0 #by what factor to upweight positive examples? #normalization timescale dt: 0.001 #maximum TTD considered @@ -57,14 +57,15 @@ model: size_conv_filters: 3 num_conv_layers: 2 pool_size: 2 - dense_size: 16 + dense_size: 200 #have not found a difference yet optimizer: 'adam' clipnorm: 10.0 regularization: 0.0 + dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) lr: 0.0001 #0.00005 #0.00005 #0.00005 - lr_decay: 1.0 #0.98 #0.9 + lr_decay: 0.99 #0.98 #0.9 stateful: True return_sequences: True dropout_prob: 0.3 @@ -82,7 +83,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 26 + num_epochs: 100 use_mock_data: False data_parallel: False hyperparam_tuning: False diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 5cd73e7a..caa2c3f5 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -77,6 +77,7 @@ def build_model(self,predict,custom_batch_size=None): lr = model_conf['lr'] clipnorm = model_conf['clipnorm'] regularization = model_conf['regularization'] + dense_regularization = model_conf['dense_regularization'] if optimizer == 'sgd': optimizer_class = SGD @@ -161,7 +162,6 @@ def slicer_output_shape(input_shape,indices): pre_rnn_1D = Reshape((num_1D,len(indices_1d)/num_1D)) (pre_rnn_1D) pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) - #pre_rnn_1D = Conv1D(num_conv_filters,size_conv_filters,padding='same',activation='relu',dilation_rate=1) (pre_rnn_1D) for i in range(model_conf['num_conv_layers']): pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) @@ -169,8 +169,11 @@ def slicer_output_shape(input_shape,indices): pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) else: pre_rnn = pre_rnn_input - #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) - #pre_rnn = Dense(dense_size,activation='relu') (pre_rnn) + + if model_conf['rnn_layers'] == 0: + pre_rnn = Dense(dense_size,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size/2,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size/4,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) x_input = Input(batch_shape = batch_input_shape) @@ -247,7 +250,7 @@ def load_model_weights(self,model,custom_path=None): model.load_weights(self.get_save_path(max_epoch)) return max_epoch else: - epoch = self.extract_id_and_epoch_from_filename(sys.path.getbasename(custom_path)) + epoch = self.extract_id_and_epoch_from_filename(os.path.basename(custom_path))[1] model.load_weights(custom_path) print("Loading from custom epoch {}".format(epoch)) return epoch From 4603386c3c46026cdaaa2a7c77d3932d733a7543 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 May 2017 19:53:43 -0400 Subject: [PATCH 100/744] fixed validation set consistency with mpi runner --- examples/learn.py | 6 +++++- examples/learn_processed.py | 2 +- plasma/models/runner.py | 6 ++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/learn.py b/examples/learn.py index 235bd49c..3adda37d 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -68,6 +68,10 @@ sorted(shot_list) shot_list_train,shot_list_test = shot_list.split_train_test(conf) num_shots = len(shot_list_train) + len(shot_list_test) +if validation_frac <= 0.0: + print('Setting validation to a minimum of 0.05') + validation_frac = 0.05 +shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) print("...done") @@ -90,7 +94,7 @@ ######################TRAINING####################### ##################################################### #train(conf,shot_list_train,loader) -p = old_mp.Process(target = train,args=(conf,shot_list_train,loader)) +p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) p.start() p.join() diff --git a/examples/learn_processed.py b/examples/learn_processed.py index 3a5639c0..6fef3959 100644 --- a/examples/learn_processed.py +++ b/examples/learn_processed.py @@ -95,7 +95,7 @@ -p = old_mp.Process(target = train,args=(conf,shot_list_train,loader)) +p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) p.start() p.join() diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 24c04f16..51ef80c7 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -115,16 +115,14 @@ # print('...done') -def train(conf,shot_list_train,loader): +def train(conf,shot_list_train,shot_list_validate,loader): np.random.seed(1) validation_losses = [] validation_roc = [] training_losses = [] - if conf['training']['validation_frac'] > 0.0: - shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-conf['training']['validation_frac'],do_shuffle=True) - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) if backend == 'tf' or backend == 'tensorflow': From e889381603fdc36e9e7eb0d27dd72f2364a676fb Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 28 May 2017 21:11:09 -0400 Subject: [PATCH 101/744] Add cross machine training data paths --- plasma/conf_parser.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 49c1b3b7..b3eb215c 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -78,8 +78,16 @@ def parameters(input_file): params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! params['paths']['use_signals'] = d3d_signals - else: pass - + elif params['paths']['data'] == 'jet_to_d3d_data': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [d3d_full] + params['paths']['use_signals'] = fully_defined_signals + elif params['paths']['data'] == 'd3d_to_jet_data': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals'] = fully_defined_signals + else: + pass params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) From 14717f40e9696f70921245d49f3e31357ab91a22 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 May 2017 21:33:09 -0400 Subject: [PATCH 102/744] adding support for shallow learning --- plasma/models/shallow_runner.py | 183 ++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 plasma/models/shallow_runner.py diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py new file mode 100644 index 00000000..b435cf46 --- /dev/null +++ b/plasma/models/shallow_runner.py @@ -0,0 +1,183 @@ +from __future__ import print_function +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt + +import numpy as np +from itertools import imap + +#leading to import errors: +#from hyperopt import hp, STATUS_OK +#from hyperas.distributions import conditional + +import time +import sys +import os +from functools import partial +import pathos.multiprocessing as mp + +from plasma.conf import conf +from plasma.models.loader import Loader, ProcessGenerator +from plasma.utils.performance import PerformanceAnalyzer +from plasma.utils.evaluation import * +from plasma.utils.state_reset import reset_states + +backend = conf['model']['backend'] + + +def FeatureExtractor(object): + def __init__(self,loader,timesteps = 32): + self.loader = loader + self.timesteps = timesteps + self.positional_fit_order = 4 + self.num_positional_features = self.positional_fit_order + 1 + 3 + self.temporal_fit_order = 3 + self.num_temporal_features = self.temporal_fit_order + 1 + 3 + + + def load_shots(self,shot_list): + X = [] + Y = [] + for shot in shot_list: + x,y = self.load_shot(shot) + X.append(x) + Y.append(y) + return np.vstack(X),np.vstack(Y) + + + def load_shot(self,shot): + prepath = self.loader.conf['paths']['processed_prepath'] + use_signals = self.loader.conf['paths']['use_signals'] + assert(isinstance(shot,Shot)) + assert(shot.valid) + shot.restore(prepath) + if self.loader.normalizer is not None: + self.loader.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + # sig,res = self.get_signal_result_from_shot(shot) + sig_sample = shot.signals_dict[use_signals[0]] + ttd_sample = shot.ttd + timesteps = self.timesteps + length = sig_sample.shape[0] + if length < timesteps: + print(ttd,shot,shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + for i in range(length-timesteps+1) + x,y = get_x_y(self,i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) + + shot.make_light() + return X,Y + + + def get_x_y(self,timestep,shot): + x = [] + for sig in use_signals + x += [self.extract_features(timestep,shot,sig)] + # x = sig[timestep:timestep+timesteps,:] + x = np.concatenate(x,axis=0) + y = np.round(res[timestep+timesteps-1,0]).astype(np.int) + + + def extract_features(self,timestep,shot,signal): + raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] + num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 + output_arr = np.empty((self.timesteps,num_positional_features)) + final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) + for t in range(self.timesteps): + output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) + for i in range(num_positional_features) + idx = i*self.num_temporal_features + final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) + return final_output_arr + + def extract_positional_features(self,arr): + num_channels = len(arr) + if num_channels > 1 + ret_arr = np.empty(self.num_positional_features) + coefficients,_ = np.polynomial.polynomial.polyfit(np.linspace(0,1,signal.num_channels),arr,self.positional_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:positional_fit_order+1] = coefficients + ret_arr[positional_fit_order+1] = mu + ret_arr[positional_fit_order+2] = std + ret_arr[positional_fit_order+3] = max_val + return ret_arr + else: + return arr + + def extract_temporal_features(self,arr): + ret_arr = np.empty(self.num_temporal_features) + coefficients,_ = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:temporal_fit_order+1] = coefficients + ret_arr[temporal_fit_order+1] = mu + ret_arr[temporal_fit_order+2] = std + ret_arr[temporal_fit_order+3] = max_val + return ret_arr + +from sklearn import svm +from sklearn.externals import joblib + +def train(conf,shot_list_train,shot_list_validate,loader): + + np.random.seed(1) + + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + + + feature_extractor = FeatureExtractor(loader) + X,Y = feature_extractor.load_shots(shot_list_train) + + model = svm.SVC() + model.fit(X,Y) + + joblib.dump(model,'saved_model.pkl') + + print('...done') + + +def make_predictions(conf,shot_list,loader): + model = joblib.load('saved_model.pkl') + feature_extractor = FeatureExtractor(loader) + + y_prime = [] + y_gold = [] + disruptive = [] + + from keras.utils.generic_utils import Progbar + pbar = Progbar(len(shot_list)) + for shot in shot_list: + X,Y = feature_extractor.load_shot(shot) + Y_pred = model.predict(X) + disr = 1 if shot.is_disruptive else 0 + + y_prime += [y_p] + y_gold += [y] + disruptive += [disr] + pbar.add(1.0) + return y_prime,y_gold,disruptive + + + +def make_predictions_and_evaluate_gpu(conf,shot_list,loader): + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader) + analyzer = PerformanceAnalyzer(conf=conf) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + return y_prime,y_gold,disruptive,roc_area,loss + From 8f506cc863c0eee93e4966bc28b0f948ea2dce91 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 May 2017 21:38:49 -0400 Subject: [PATCH 103/744] params update --- examples/tune_hyperparams.py | 14 ++++++++------ plasma/conf.py | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 3af24f5e..6f2aa15b 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -10,20 +10,22 @@ tunables = [] lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) -lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,1.0]) -t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,0.512,1.024,40.0]) -fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,10.0]) -#target = CategoricalHyperparam(['target'],['lasso','hi']) +lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) +#t_warn = CategoricalHyperparam(['data','T_warning'],[1.024]) +fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,4.0,8.0]) +#target = CategoricalHyperparam(['target'],['maxhinge','hinge']) +#batch_size = CategoricalHyperparam(['training','batch_size'],[256,128,32,64]) +#dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) -tunables = [lr,lr_decay,t_warn,fac] #target +tunables = [lr,lr_decay,fac] #target run_directory = "/tigress/jk7/hyperparams/" template_path = "/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" executable_name = "mpi_learn.py" num_machines = 2 -num_trials = 40 +num_trials = 50 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) diff --git a/plasma/conf.py b/plasma/conf.py index c5755bcb..3c726fd5 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -18,7 +18,7 @@ #signals conf['paths']['all_signals'] = all_signals#jet_signals#d3d_signals#all_signals #make sure all 1D signals appear last! -conf['paths']['use_signals'] = d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# +conf['paths']['use_signals'] = [q95,li,ip,betan,energy,lm,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile] #d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals# #shot lists #shot_list_dir = conf['paths']['shot_list_dir'] From 99536d1f5895a8d330116bd9449c837712efe149 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 29 May 2017 02:07:19 -0400 Subject: [PATCH 104/744] added support for shallow learning algorithms --- examples/conf.yaml | 5 +- examples/learn.py | 5 +- examples/learn_processed.py | 7 +- examples/mpi_learn.py | 3 + plasma/models/shallow_runner.py | 265 ++++++++++++++++++++------------ plasma/utils/performance.py | 3 +- 6 files changed, 182 insertions(+), 106 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 658c22db..9beeaf89 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,7 +10,7 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_data' + data: 'd3d_data' data: cut_shot_ends: True @@ -29,7 +29,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 40.0 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -40,6 +40,7 @@ data: normalizer: 'var' model: + shallow: True #length of LSTM memory pred_length: 200 pred_batch_size: 128 diff --git a/examples/learn.py b/examples/learn.py index 3adda37d..0baeec62 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -32,7 +32,10 @@ from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.preprocess import Preprocessor from plasma.models.loader import Loader -from plasma.models.runner import train, make_predictions,make_predictions_gpu,make_predictions_and_evaluate_gpu +if conf['model']['shallow']: + from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu +else: + from plasma.models.runner import train, make_predictions_and_evaluate_gpu if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer diff --git a/examples/learn_processed.py b/examples/learn_processed.py index 6fef3959..ff5b923b 100644 --- a/examples/learn_processed.py +++ b/examples/learn_processed.py @@ -32,7 +32,10 @@ from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.preprocess import Preprocessor from plasma.models.loader import Loader -from plasma.models.runner import train, make_predictions,make_predictions_gpu,make_predictions_and_evaluate_gpu +if conf['model']['shallow']: + from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu +else: + from plasma.models.runner import train, make_predictions_and_evaluate_gpu if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer @@ -145,7 +148,7 @@ y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, - shot_list=shot_list,shot_list_train=shot_list_train,shot_list_test=shot_list_test, + shot_list_train=shot_list_train,shot_list_test=shot_list_test, conf = conf) print('finished.') diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 666ce069..81669021 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -34,6 +34,9 @@ from plasma.models.loader import Loader from plasma.preprocessor.normalize import Normalizer +if conf['model']['shallow']: + print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + exit(1) if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index b435cf46..f81b9cae 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -22,115 +22,138 @@ from plasma.utils.evaluation import * from plasma.utils.state_reset import reset_states -backend = conf['model']['backend'] - - -def FeatureExtractor(object): - def __init__(self,loader,timesteps = 32): - self.loader = loader - self.timesteps = timesteps - self.positional_fit_order = 4 - self.num_positional_features = self.positional_fit_order + 1 + 3 - self.temporal_fit_order = 3 - self.num_temporal_features = self.temporal_fit_order + 1 + 3 - - - def load_shots(self,shot_list): - X = [] - Y = [] - for shot in shot_list: - x,y = self.load_shot(shot) - X.append(x) - Y.append(y) - return np.vstack(X),np.vstack(Y) - - - def load_shot(self,shot): - prepath = self.loader.conf['paths']['processed_prepath'] +from keras.utils.generic_utils import Progbar + +debug_use_shots = 1000 +model_path = "saved_model.pkl" +dataset_path = "dataset.npz" + +class FeatureExtractor(object): + def __init__(self,loader,timesteps = 32): + self.loader = loader + self.timesteps = timesteps + self.positional_fit_order = 4 + self.num_positional_features = self.positional_fit_order + 1 + 3 + self.temporal_fit_order = 3 + self.num_temporal_features = self.temporal_fit_order + 1 + 3 + + + def load_shots(self,shot_list,sample_prob = 1.0): + X = [] + Y = [] + print("loading...") + pbar = Progbar(len(shot_list)) + + fn = partial(self.load_shot,sample_prob=sample_prob) + pool = mp.Pool() + print('loading data in parallel on {} processes'.format(pool._processes)) + for x,y in pool.imap(fn,shot_list): + X.append(x) + Y.append(y) + pbar.add(1.0) + pool.close() + pool.join() + return np.concatenate(X,axis=0),np.concatenate(Y,axis=0) + + + def load_shot(self,shot,sample_prob=1.0): + prepath = self.loader.conf['paths']['processed_prepath'] use_signals = self.loader.conf['paths']['use_signals'] - assert(isinstance(shot,Shot)) assert(shot.valid) shot.restore(prepath) if self.loader.normalizer is not None: self.loader.normalizer.apply(shot) else: print('Warning, no normalization. Training data may be poorly conditioned') - # sig,res = self.get_signal_result_from_shot(shot) - sig_sample = shot.signals_dict[use_signals[0]] - ttd_sample = shot.ttd + # sig,res = self.get_signal_result_from_shot(shot) + sig_sample = shot.signals_dict[use_signals[0]] + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + ttd_sample = shot.ttd timesteps = self.timesteps - length = sig_sample.shape[0] - if length < timesteps: + length = sig_sample.shape[0] + if length < timesteps: print(ttd,shot,shot.number) print("Shot must be at least as long as the RNN length.") exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) - - X = [] - Y = [] - for i in range(length-timesteps+1) - x,y = get_x_y(self,i,shot) - X.append(x) - Y.append(y) - X = np.stack(X) - Y = np.stack(Y) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + while(len(X) == 0): + for i in range(length-timesteps+1): + if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) shot.make_light() + #print(X.shape,Y.shape) return X,Y def get_x_y(self,timestep,shot): - x = [] - for sig in use_signals - x += [self.extract_features(timestep,shot,sig)] - # x = sig[timestep:timestep+timesteps,:] - x = np.concatenate(x,axis=0) - y = np.round(res[timestep+timesteps-1,0]).astype(np.int) + x = [] + use_signals = self.loader.conf['paths']['use_signals'] + for sig in use_signals: + x += [self.extract_features(timestep,shot,sig)] + # x = sig[timestep:timestep+timesteps,:] + x = np.concatenate(x,axis=0) + y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) + return x,y def extract_features(self,timestep,shot,signal): - raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] - num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 - output_arr = np.empty((self.timesteps,num_positional_features)) - final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) - for t in range(self.timesteps): - output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) - for i in range(num_positional_features) - idx = i*self.num_temporal_features - final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) - return final_output_arr + raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] + num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 + output_arr = np.empty((self.timesteps,num_positional_features)) + final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) + for t in range(self.timesteps): + output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) + for i in range(num_positional_features): + idx = i*self.num_temporal_features + final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) + return final_output_arr def extract_positional_features(self,arr): - num_channels = len(arr) - if num_channels > 1 - ret_arr = np.empty(self.num_positional_features) - coefficients,_ = np.polynomial.polynomial.polyfit(np.linspace(0,1,signal.num_channels),arr,self.positional_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:positional_fit_order+1] = coefficients - ret_arr[positional_fit_order+1] = mu - ret_arr[positional_fit_order+2] = std - ret_arr[positional_fit_order+3] = max_val - return ret_arr - else: - return arr - - def extract_temporal_features(self,arr): - ret_arr = np.empty(self.num_temporal_features) - coefficients,_ = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:temporal_fit_order+1] = coefficients - ret_arr[temporal_fit_order+1] = mu - ret_arr[temporal_fit_order+2] = std - ret_arr[temporal_fit_order+3] = max_val - return ret_arr + num_channels = len(arr) + if num_channels > 1: + ret_arr = np.empty(self.num_positional_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.positional_fit_order+1] = coefficients + ret_arr[self.positional_fit_order+1] = mu + ret_arr[self.positional_fit_order+2] = std + ret_arr[self.positional_fit_order+3] = max_val + return ret_arr + else: + return arr + + def extract_temporal_features(self,arr): + ret_arr = np.empty(self.num_temporal_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.temporal_fit_order+1] = coefficients + ret_arr[self.temporal_fit_order+1] = mu + ret_arr[self.temporal_fit_order+2] = std + ret_arr[self.temporal_fit_order+3] = max_val + return ret_arr + + def prepend_timesteps(self,arr): + prepend = arr[0]*np.ones(self.timesteps-1) + return np.concatenate((prepend,arr)) from sklearn import svm +from sklearn.ensemble import RandomForestClassifier from sklearn.externals import joblib +from sklearn.metrics import accuracy_score,auc,classification_report,confusion_matrix def train(conf,shot_list_train,shot_list_validate,loader): @@ -139,39 +162,81 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + if not os.path.isfile(dataset_path): + feature_extractor = FeatureExtractor(loader) + shot_list_train = shot_list_train.random_sublist(debug_use_shots) + X,Y = feature_extractor.load_shots(shot_list_train,sample_prob = 1.0) + np.savez(dataset_path,X=X,Y=Y) + else: + print("dataset exists.") + dat = np.load(dataset_path) + X = dat["X"] + Y = dat["Y"] + print("Total data: {} samples, {} positive".format(len(X),np.sum(Y > 0))) + max_samples = 40000 + num_samples = min(max_samples,len(Y)) + indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) + X = X[indices] + Y = Y[indices] + + print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) + + if not os.path.isfile(model_path): + + start_time = time.time() + #model = svm.SVC(probability=True) + model = RandomForestClassifier() + model.fit(X,Y) + joblib.dump(model,model_path) + print("Fit model in {} seconds".format(time.time()-start_time)) + else: + model = joblib.load(model_path) + print("model exists.") + + + Y_pred = model.predict(X) + print(classification_report(Y,Y_pred)) + #print(confusion_matrix(Y,Y_pred)) - feature_extractor = FeatureExtractor(loader) - X,Y = feature_extractor.load_shots(shot_list_train) - - model = svm.SVC() - model.fit(X,Y) - - joblib.dump(model,'saved_model.pkl') print('...done') def make_predictions(conf,shot_list,loader): - model = joblib.load('saved_model.pkl') + model = joblib.load(model_path) feature_extractor = FeatureExtractor(loader) + #shot_list = shot_list.random_sublist(10) y_prime = [] y_gold = [] disruptive = [] - from keras.utils.generic_utils import Progbar pbar = Progbar(len(shot_list)) - for shot in shot_list: - X,Y = feature_extractor.load_shot(shot) - Y_pred = model.predict(X) - disr = 1 if shot.is_disruptive else 0 - - y_prime += [y_p] - y_gold += [y] + fn = partial(predict_single_shot,model=model,feature_extractor=feature_extractor) + pool = mp.Pool() + print('predicting in parallel on {} processes'.format(pool._processes)) + #for (y_p,y,disr) in map(fn,shot_list): + for (y_p,y,disr) in pool.imap(fn,shot_list): + #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) + y_prime += [np.expand_dims(y_p,axis=1)] + y_gold += [np.expand_dims(y,axis=1)] disruptive += [disr] pbar.add(1.0) + + pool.close() + pool.join() return y_prime,y_gold,disruptive +def predict_single_shot(shot,model,feature_extractor): + X,y = feature_extractor.load_shot(shot,sample_prob=1.0) + y_p = model.predict_proba(X)[:,1] + disr = 1 if shot.is_disruptive else 0 + #print(y) + #print(y_p) + y = feature_extractor.prepend_timesteps(y) + y_p = feature_extractor.prepend_timesteps(y_p) + return y_p,y,disr + def make_predictions_and_evaluate_gpu(conf,shot_list,loader): diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 9dc4786c..596efc66 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -648,7 +648,8 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, ax.axhline(P_thresh_opt,color='k',label='trigger threshold') #ax.set_ylim([1e-5,1.1e0]) ax.set_ylim([-2,2]) - ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') + if len(truth)-self.T_min_warn >= 0: + ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') ax.set_xlabel('T [ms]') ax.legend(loc = 'lower left',fontsize=10) From 61113c8d70c48d0fe609e351e677f9c2ada8bfbe Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 29 May 2017 06:30:57 -0400 Subject: [PATCH 105/744] added slurm commands for tiger --- examples/run_mpi.cmd | 15 +++++++++++++++ examples/run_shallow.cmd | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 examples/run_mpi.cmd create mode 100644 examples/run_shallow.cmd diff --git a/examples/run_mpi.cmd b/examples/run_mpi.cmd new file mode 100644 index 00000000..c4f45f7e --- /dev/null +++ b/examples/run_mpi.cmd @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH -t 01:00:00 +#SBATCH -N 2 +#SBATCH --ntasks-per-node=4 +#SBATCH --ntasks-per-socket=2 +#SBATCH --gres=gpu:4 +#SBATCH -c 4 +#SBATCH -o 0.out + + +module load anaconda +module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 +rm -f /tigress/jk7/model_checkpoints/* +srun python mpi_learn.py +echo "done." diff --git a/examples/run_shallow.cmd b/examples/run_shallow.cmd new file mode 100644 index 00000000..98432199 --- /dev/null +++ b/examples/run_shallow.cmd @@ -0,0 +1,12 @@ +#!/bin/bash +#SBATCH -t 01:00:00 +#SBATCH -N 1 +#SBATCH --mem=64000 +#SBATCH -o log.out +#SBATCH --gres=gpu:4 + + +module load anaconda +module rm openmpi +srun python learn_processed.py +echo "done." From 30f8696647af482f34e88661c43bf373b84a8da5 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 29 May 2017 06:32:29 -0400 Subject: [PATCH 106/744] added dataset caching for shallow model --- examples/conf.yaml | 2 +- plasma/conf_parser.py | 6 +- plasma/models/shallow_runner.py | 120 ++++++++++++++++++-------------- plasma/utils/performance.py | 7 +- 4 files changed, 75 insertions(+), 60 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 9beeaf89..c14aa53a 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,7 +10,7 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'd3d_data' + data: 'jet_data' data: cut_shot_ends: True diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index e7dbd0e1..0e23d6f1 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -55,7 +55,7 @@ def parameters(input_file): #signals params['paths']['all_signals'] = all_signals - params['paths']['use_signals'] = [q95,li,ip,betan,energy,lm,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile] #d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals#all_signals + params['paths']['use_signals'] = [q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile] #d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals#all_signals #shot lists jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') @@ -76,9 +76,9 @@ def parameters(input_file): params['paths']['use_signals'] = jet_signals elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] + params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! - params['paths']['use_signals'] = d3d_signals + params['paths']['use_signals'] = [q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] elif params['paths']['data'] == 'jet_to_d3d_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [d3d_full] diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index f81b9cae..4baee07b 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -24,9 +24,10 @@ from keras.utils.generic_utils import Progbar -debug_use_shots = 1000 -model_path = "saved_model.pkl" +debug_use_shots = 100000 +model_path = "saved_model_new.pkl" dataset_path = "dataset.npz" +dataset_test_path = "dataset_test.npz" class FeatureExtractor(object): def __init__(self,loader,timesteps = 32): @@ -38,61 +39,72 @@ def __init__(self,loader,timesteps = 32): self.num_temporal_features = self.temporal_fit_order + 1 + 3 - def load_shots(self,shot_list,sample_prob = 1.0): + def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): X = [] Y = [] + Disr = [] print("loading...") pbar = Progbar(len(shot_list)) fn = partial(self.load_shot,sample_prob=sample_prob) pool = mp.Pool() print('loading data in parallel on {} processes'.format(pool._processes)) - for x,y in pool.imap(fn,shot_list): + for x,y,disr in pool.imap(fn,shot_list): X.append(x) Y.append(y) + Disr.append(disr) pbar.add(1.0) pool.close() pool.join() - return np.concatenate(X,axis=0),np.concatenate(Y,axis=0) + return X,Y,np.array(Disr) def load_shot(self,shot,sample_prob=1.0): prepath = self.loader.conf['paths']['processed_prepath'] - use_signals = self.loader.conf['paths']['use_signals'] - assert(shot.valid) - shot.restore(prepath) - if self.loader.normalizer is not None: - self.loader.normalizer.apply(shot) + save_prepath = prepath + "shallow/" + save_path = shot.get_save_path(save_prepath) + if os.path.isfile(save_path): + dat = np.load(save_path) + X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] else: - print('Warning, no normalization. Training data may be poorly conditioned') - # sig,res = self.get_signal_result_from_shot(shot) - sig_sample = shot.signals_dict[use_signals[0]] - if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) - ttd_sample = shot.ttd - timesteps = self.timesteps - length = sig_sample.shape[0] - if length < timesteps: - print(ttd,shot,shot.number) - print("Shot must be at least as long as the RNN length.") - exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) - - X = [] - Y = [] - while(len(X) == 0): - for i in range(length-timesteps+1): - if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) - X.append(x) - Y.append(y) - X = np.stack(X) - Y = np.stack(Y) - - shot.make_light() - #print(X.shape,Y.shape) - return X,Y + use_signals = self.loader.conf['paths']['use_signals'] + assert(shot.valid) + shot.restore(prepath) + if self.loader.normalizer is not None: + self.loader.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + # sig,res = self.get_signal_result_from_shot(shot) + disr = 1 if shot.is_disruptive else 0 + sig_sample = shot.signals_dict[use_signals[0]] + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + ttd_sample = shot.ttd + timesteps = self.timesteps + length = sig_sample.shape[0] + if length < timesteps: + print(ttd,shot,shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + while(len(X) == 0): + for i in range(length-timesteps+1): + if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) + shot.make_light() + if not os.path.exists(save_prepath): + os.makedirs(save_prepath) + np.savez(save_path,X=X,Y=Y,disr=disr) + #print(X.shape,Y.shape) + return X,Y,disr def get_x_y(self,timestep,shot): @@ -162,18 +174,17 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - if not os.path.isfile(dataset_path): - feature_extractor = FeatureExtractor(loader) - shot_list_train = shot_list_train.random_sublist(debug_use_shots) - X,Y = feature_extractor.load_shots(shot_list_train,sample_prob = 1.0) - np.savez(dataset_path,X=X,Y=Y) - else: - print("dataset exists.") - dat = np.load(dataset_path) - X = dat["X"] - Y = dat["Y"] + feature_extractor = FeatureExtractor(loader) + shot_list_train = shot_list_train.random_sublist(debug_use_shots) + X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = 1.0) + Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = 1.0) + X = np.concatenate(X,axis=0) + Y = np.concatenate(Y,axis=0) + Xv = np.concatenate(Xv,axis=0) + Yv = np.concatenate(Yv,axis=0) + print("Total data: {} samples, {} positive".format(len(X),np.sum(Y > 0))) - max_samples = 40000 + max_samples = 100000 num_samples = min(max_samples,len(Y)) indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) X = X[indices] @@ -185,7 +196,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): start_time = time.time() #model = svm.SVC(probability=True) - model = RandomForestClassifier() + model = RandomForestClassifier(n_estimators=50,max_depth=20,n_jobs=-1) model.fit(X,Y) joblib.dump(model,model_path) print("Fit model in {} seconds".format(time.time()-start_time)) @@ -195,7 +206,11 @@ def train(conf,shot_list_train,shot_list_validate,loader): Y_pred = model.predict(X) + print("Train") print(classification_report(Y,Y_pred)) + Y_predv = model.predict(Xv) + print("Validate") + print(classification_report(Yv,Y_predv)) #print(confusion_matrix(Y,Y_pred)) @@ -228,9 +243,8 @@ def make_predictions(conf,shot_list,loader): return y_prime,y_gold,disruptive def predict_single_shot(shot,model,feature_extractor): - X,y = feature_extractor.load_shot(shot,sample_prob=1.0) + X,y,disr = feature_extractor.load_shot(shot,sample_prob=1.0) y_p = model.predict_proba(X)[:,1] - disr = 1 if shot.is_disruptive else 0 #print(y) #print(y_p) y = feature_extractor.prepend_timesteps(y) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 596efc66..2e7772fa 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -86,6 +86,7 @@ def get_p_thresh_range(self): early_th_te,correct_th_te,late_th_te,nd_th_te = self.get_threshold_arrays(all_preds_te,all_truths_te,all_disruptive_te) all_thresholds = np.sort(np.concatenate((early_th_tr,correct_th_tr,late_th_tr,nd_th_tr,early_th_te,correct_th_te,late_th_te,nd_th_te))) self.p_thresh_range = all_thresholds + #print(np.unique(self.p_thresh_range)) return self.p_thresh_range @@ -648,9 +649,9 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, ax.axhline(P_thresh_opt,color='k',label='trigger threshold') #ax.set_ylim([1e-5,1.1e0]) ax.set_ylim([-2,2]) - if len(truth)-self.T_min_warn >= 0: - ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') - ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') + if len(truth)-self.T_max_warn >= 0: + ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') + ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') ax.set_xlabel('T [ms]') ax.legend(loc = 'lower left',fontsize=10) plt.setp(ax.get_yticklabels(),fontsize=7) From e8115b9d2ea60e3d7757f79fb028f778698f00fa Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 31 May 2017 03:44:07 -0400 Subject: [PATCH 107/744] best performance yet at 0.9583 test ROC on JET ILW --- examples/conf.yaml | 13 +- examples/tune_hyperparams.py | 2 +- plasma/conf_parser.py | 8 +- plasma/models/data.py | 373 ++++++++++++++++---------------- plasma/models/mpi_runner.py | 1 + plasma/models/shallow_runner.py | 46 ++-- plasma/utils/performance.py | 7 +- 7 files changed, 239 insertions(+), 211 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index c14aa53a..224aa6f7 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,7 +3,7 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'maxhinge' #'binary' #'hinge' #'maxhinge' #'binary' #'ttd' #'hinge' +target: 'hinge' #'binary' #'hinge' #'maxhinge' #'binary' #'ttd' #'hinge' num_gpus: 4 paths: @@ -29,7 +29,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 40.0 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -38,9 +38,10 @@ data: window_size: 10 #TODO optimize normalizer: 'var' + shallow_sample_prob: 0.1 #the fraction of samples with which to train the shallow model model: - shallow: True + shallow: False #length of LSTM memory pred_length: 200 pred_batch_size: 128 @@ -65,8 +66,8 @@ model: regularization: 0.0 dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.0001 #0.00005 #0.00005 #0.00005 - lr_decay: 0.99 #0.98 #0.9 + lr: 0.00001 #0.00005 #0.00005 #0.00005 + lr_decay: 1.0 #0.98 #0.9 stateful: True return_sequences: True dropout_prob: 0.3 @@ -84,7 +85,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 100 + num_epochs: 40 use_mock_data: False data_parallel: False hyperparam_tuning: False diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 6f2aa15b..fe997657 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -67,7 +67,7 @@ def create_slurm_script(subdir,num_machines,idx): f.write('module load anaconda\n') #f.write('source activate PPPL\n') f.write('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n') - f.write('rm -f /tigress/{}/model_checkpoints/*\n'.format(user)) + f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('srun python mpi_learn.py\n') f.write('echo "done."') diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 0e23d6f1..0224fee5 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -3,6 +3,7 @@ from data.signals import * import getpass +import uuid import yaml def parameters(input_file): @@ -74,6 +75,10 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals'] = jet_signals + elif params['paths']['data'] == 'jet_carbon_data': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals'] = jet_signals elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] @@ -88,7 +93,8 @@ def parameters(input_file): params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals'] = fully_defined_signals else: - pass + print("Unkown data set {}".format(params['paths']['data'])) + exit(1) params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) diff --git a/plasma/models/data.py b/plasma/models/data.py index e16f8cc4..efd53afe 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -8,196 +8,201 @@ from plasma.utils.downloading import format_save_path # class SignalCollection: -# """GA Data Obj""" -# def __init__(self,signal_descriptions,signal_paths): -# self.signals = [] -# for i in range(len(signal_paths)) -# self.signals.append(Signal(signal_descriptions[i],signal_paths[i])) +# """GA Data Obj""" +# def __init__(self,signal_descriptions,signal_paths): +# self.signals = [] +# for i in range(len(signal_paths)) +# self.signals.append(Signal(signal_descriptions[i],signal_paths[i])) class Signal(object): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,is_ip=False,normalize=True): - assert(len(paths) == len(machines)) - self.description = description - self.paths = paths - self.machines = machines #on which machines is the signal defined - if causal_shifts == None: - causal_shifts = [0 for m in machines] - self.causal_shifts = causal_shifts #causal shift in ms - self.is_ip = is_ip - self.num_channels = 1 - self.normalize = normalize - - def is_ip(self): - return self.is_ip - - def get_file_path(self,prepath,machine,shot_number): - dirname = self.get_path(machine) - return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) - - def is_valid(self,prepath,shot): - t,data,exists = self.load_data(prepath,shot) - return exists - - def is_saved(self,prepath,shot): - file_path = self.get_file_path(prepath,shot.machine,shot.number) - return os.path.isfile(file_path) - - def load_data(self,prepath,shot): - if not self.is_saved(prepath,shot): - print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) - return None,None,False - - file_path = self.get_file_path(prepath,shot.machine,shot.number) - try: - data = np.loadtxt(file_path) - except: - print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) - os.remove(file_path) - return None, None, False - - - if np.ndim(data) == 1: - data = np.expand_dims(data,axis=0) - - t = data[:,0] - sig = data[:,1:] - - if self.is_ip: #restrict shot to current threshold - region = np.where(np.abs(sig) >= shot.machine.current_threshold)[0] - t = t[region] - sig = sig[region,:] - - #make sure shot is not garbage data - if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): - if self.is_ip: - print('shot {} has no current'.format(shot.number)) - else: - print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) - return None,None,False - - #make sure data doesn't contain nan - if np.any(np.isnan(t)) or np.any(np.isnan(sig)): - print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) - return None,None,False - - return t,sig,True - - def is_defined_on_machine(self,machine): - return machine in self.machines - - def is_defined_on_machines(self,machines): - return all([m in self.machines for m in machines]) - - def get_path(self,machine): - idx = self.get_idx(machine) - return self.paths[idx] - - def get_causal_shift(self,machine): - idx = self.get_idx(machine) - return self.causal_shifts[idx] - - def get_idx(self,machine): - assert(machine in self.machines) - idx = self.machines.index(machine) - return idx - - def __eq__(self,other): - return self.description.__eq__(other.description) - - - def __ne__(self,other): - return self.description.__ne__(other.description) - - def __hash__(self): - return self.description.__hash__() - - def __str__(self): - return self.description - - def __repr__(self): - return self.description + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,is_ip=False,normalize=True): + assert(len(paths) == len(machines)) + self.description = description + self.paths = paths + self.machines = machines #on which machines is the signal defined + if causal_shifts == None: + causal_shifts = [0 for m in machines] + self.causal_shifts = causal_shifts #causal shift in ms + self.is_ip = is_ip + self.num_channels = 1 + self.normalize = normalize + + def is_ip(self): + return self.is_ip + + def get_file_path(self,prepath,machine,shot_number): + dirname = self.get_path(machine) + return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) + + def is_valid(self,prepath,shot): + t,data,exists = self.load_data(prepath,shot) + return exists + + def is_saved(self,prepath,shot): + file_path = self.get_file_path(prepath,shot.machine,shot.number) + return os.path.isfile(file_path) + + def load_data(self,prepath,shot): + if not self.is_saved(prepath,shot): + print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) + return None,None,False + + file_path = self.get_file_path(prepath,shot.machine,shot.number) + try: + data = np.loadtxt(file_path) + except: + print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) + os.remove(file_path) + return None, None, False + + + if np.ndim(data) == 1: + data = np.expand_dims(data,axis=0) + + t = data[:,0] + sig = data[:,1:] + + if self.is_ip: #restrict shot to current threshold + region = np.where(np.abs(sig) >= shot.machine.current_threshold)[0] + t = t[region] + sig = sig[region,:] + + #make sure shot is not garbage data + if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): + if self.is_ip: + print('shot {} has no current'.format(shot.number)) + else: + print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) + return None,None,False + + #make sure data doesn't contain nan + if np.any(np.isnan(t)) or np.any(np.isnan(sig)): + print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) + return None,None,False + + return t,sig,True + + def is_defined_on_machine(self,machine): + return machine in self.machines + + def is_defined_on_machines(self,machines): + return all([m in self.machines for m in machines]) + + def get_path(self,machine): + idx = self.get_idx(machine) + return self.paths[idx] + + def get_causal_shift(self,machine): + idx = self.get_idx(machine) + return self.causal_shifts[idx] + + def get_idx(self,machine): + assert(machine in self.machines) + idx = self.machines.index(machine) + return idx + + def __eq__(self,other): + return self.description.__eq__(other.description) + + + def __ne__(self,other): + return self.description.__ne__(other.description) + + def __lt__(self,other): + return self.description.__lt__(other.description) + + def __hash__(self): + return self.description.__hash__() + + def __str__(self): + return self.description + + def __repr__(self): + return self.description class ProfileSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32): - super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False) - self.mapping_range = mapping_range - self.num_channels = num_channels - - def load_data(self,prepath,shot): - if not self.is_saved(prepath,shot): - print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) - return None,None,False - - file_path = self.get_file_path(prepath,shot.machine,shot.number) - data = np.loadtxt(file_path) - if np.ndim(data) == 1: - data = np.expand_dims(data,axis=0) - _ = data[0,0] - mapping = data[0,1:] - remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) - t = data[1:,0] - sig = data[1:,1:] - if sig.shape[1] < 2: - print('Signal {}, shot {} should be profile but has only one channel. Possibly only one profile fit was run for the duration of the shot and was transposed during downloading. Need at least 2.'.format(self.description,shot.number)) - return None,None,False - if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): - print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) - return None,None,False - - if np.any(np.isnan(t)) or np.any(np.isnan(sig)): - print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) - return None,None,False - - timesteps = len(t) - sig_interp = np.zeros((timesteps,self.num_channels)) - for i in range(timesteps): - f = UnivariateSpline(mapping,sig[i,:],s=0,k=1,ext=0) - sig_interp[i,:] = f(remapping) - - return t,sig_interp,True + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32): + super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False) + self.mapping_range = mapping_range + self.num_channels = num_channels + + def load_data(self,prepath,shot): + if not self.is_saved(prepath,shot): + print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) + return None,None,False + + file_path = self.get_file_path(prepath,shot.machine,shot.number) + data = np.loadtxt(file_path) + if np.ndim(data) == 1: + data = np.expand_dims(data,axis=0) + _ = data[0,0] + mapping = data[0,1:] + remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) + t = data[1:,0] + sig = data[1:,1:] + if sig.shape[1] < 2: + print('Signal {}, shot {} should be profile but has only one channel. Possibly only one profile fit was run for the duration of the shot and was transposed during downloading. Need at least 2.'.format(self.description,shot.number)) + return None,None,False + if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): + print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) + return None,None,False + + if np.any(np.isnan(t)) or np.any(np.isnan(sig)): + print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) + return None,None,False + + timesteps = len(t) + sig_interp = np.zeros((timesteps,self.num_channels)) + for i in range(timesteps): + f = UnivariateSpline(mapping,sig[i,:],s=0,k=1,ext=0) + sig_interp[i,:] = f(remapping) + + return t,sig_interp,True class Machine(object): - def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): - self.name = name - self.server = server - self.max_cores = max_cores - self.fetch_data_fn = fetch_data_fn - self.current_threshold = current_threshold - - def get_connection(self): - return Connection(server) - - def fetch_data(self,signal,shot_num,c): - path = signal.get_path(self) - success = False - mapping = None - try: - time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) - except Exception as e: - time,data = create_missing_value_filler() - print(e) - sys.stdout.flush() - time = np.array(time) + 1e-3*signal.get_causal_shift(self) - return time,np.array(data),mapping,success - - def __eq__(self,other): - return self.name.__eq__(other.name) - - - def __ne__(self,other): - return self.name.__ne__(other.name) - - def __hash__(self): - return self.name.__hash__() - - def __str__(self): - return self.name - - def __repr__(self): - return self.__str__() + def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): + self.name = name + self.server = server + self.max_cores = max_cores + self.fetch_data_fn = fetch_data_fn + self.current_threshold = current_threshold + + def get_connection(self): + return Connection(server) + + def fetch_data(self,signal,shot_num,c): + path = signal.get_path(self) + success = False + mapping = None + try: + time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) + except Exception as e: + time,data = create_missing_value_filler() + print(e) + sys.stdout.flush() + time = np.array(time) + 1e-3*signal.get_causal_shift(self) + return time,np.array(data),mapping,success + + def __eq__(self,other): + return self.name.__eq__(other.name) + + def __lt__(self,other): + return self.name.__lt__(other.name) + + def __ne__(self,other): + return self.name.__ne__(other.name) + + def __hash__(self): + return self.name.__hash__() + + def __str__(self): + return self.name + + def __repr__(self): + return self.__str__() def create_missing_value_filler(): - time = np.linspace(0,100,100) - vals = np.zeros_like(time) - return time,vals + time = np.linspace(0,100,100) + vals = np.zeros_like(time) + return time,vals diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index edf21a42..39c7895e 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -583,6 +583,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None): + conf['num_workers'] = comm.Get_size() specific_builder = builder.ModelBuilder(conf) train_model = specific_builder.build_model(False) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 4baee07b..8e3dc483 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -25,7 +25,7 @@ from keras.utils.generic_utils import Progbar debug_use_shots = 100000 -model_path = "saved_model_new.pkl" +model_filename = "saved_model.pkl" dataset_path = "dataset.npz" dataset_test_path = "dataset_test.npz" @@ -58,16 +58,21 @@ def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): pool.join() return X,Y,np.array(Disr) + def get_save_prepath(self): + prepath = self.loader.conf['paths']['processed_prepath'] + use_signals = self.loader.conf['paths']['use_signals'] + save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) + return save_prepath def load_shot(self,shot,sample_prob=1.0): - prepath = self.loader.conf['paths']['processed_prepath'] - save_prepath = prepath + "shallow/" + save_prepath = self.get_save_prepath() save_path = shot.get_save_path(save_prepath) if os.path.isfile(save_path): dat = np.load(save_path) X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] else: use_signals = self.loader.conf['paths']['use_signals'] + prepath = self.loader.conf['paths']['processed_prepath'] assert(shot.valid) shot.restore(prepath) if self.loader.normalizer is not None: @@ -93,10 +98,10 @@ def load_shot(self,shot,sample_prob=1.0): Y = [] while(len(X) == 0): for i in range(length-timesteps+1): - if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) - X.append(x) - Y.append(y) + #if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) X = np.stack(X) Y = np.stack(Y) shot.make_light() @@ -104,6 +109,10 @@ def load_shot(self,shot,sample_prob=1.0): os.makedirs(save_prepath) np.savez(save_path,X=X,Y=Y,disr=disr) #print(X.shape,Y.shape) + if sample_prob < 1.0: + indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) + X = X[indices] + Y = Y[indices] return X,Y,disr @@ -174,24 +183,27 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + sample_prob = conf['data']['shallow_sample_prob'] feature_extractor = FeatureExtractor(loader) shot_list_train = shot_list_train.random_sublist(debug_use_shots) - X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = 1.0) - Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = 1.0) + X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = sample_prob) + Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = sample_prob) X = np.concatenate(X,axis=0) Y = np.concatenate(Y,axis=0) Xv = np.concatenate(Xv,axis=0) Yv = np.concatenate(Yv,axis=0) - print("Total data: {} samples, {} positive".format(len(X),np.sum(Y > 0))) - max_samples = 100000 - num_samples = min(max_samples,len(Y)) - indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) - X = X[indices] - Y = Y[indices] + print("Total data: {} samples, {} positive".format(1.0/sample_prob*len(X),1.0/sample_prob*np.sum(Y > 0))) + #max_samples = 100000 + #num_samples = min(max_samples,len(Y)) + #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) + #X = X[indices] + #Y = Y[indices] print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) + save_prepath = feature_extractor.get_save_prepath() + model_path = save_prepath + model_filename if not os.path.isfile(model_path): start_time = time.time() @@ -218,8 +230,10 @@ def train(conf,shot_list_train,shot_list_validate,loader): def make_predictions(conf,shot_list,loader): - model = joblib.load(model_path) feature_extractor = FeatureExtractor(loader) + save_prepath = feature_extractor.get_save_prepath() + model_path = save_prepath + model_filename + model = joblib.load(model_path) #shot_list = shot_list.random_sublist(10) y_prime = [] diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 2e7772fa..070eacf7 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -365,7 +365,8 @@ def hist_alarms(self,alarms,title_str='alarms',save_figure=False): plt.gca().set_xscale('log') plt.axvline(T_min_warn,color='r') - plt.axvline(T_max_warn,color='r') + if T_max_warn < np.max(alarms): + plt.axvline(T_max_warn,color='r') plt.xlabel('TTD [s]') plt.ylabel('Accumulated fraction of detected disruptions') plt.xlim([1e-4,max(alarms)*10]) @@ -373,8 +374,8 @@ def hist_alarms(self,alarms,title_str='alarms',save_figure=False): plt.grid() plt.title(title_str) plt.show() - if save_figure: - plt.savefig('accum_disruptions.png',bbox_inches='tight') + if save_figure: + plt.savefig('accum_disruptions.png',bbox_inches='tight') else: print(title_str + ": No alarms!") From bd8c97c2f069feb2b94b043cb71d2781f48e3fec Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 31 May 2017 03:45:00 -0400 Subject: [PATCH 108/744] slurm scripts and performance analysis plot warning times --- examples/performance_analysis.py | 13 +++++++------ examples/run_mpi.cmd | 6 +++--- examples/run_shallow.cmd | 3 ++- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index c5f138e0..d134ade1 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -45,10 +45,11 @@ analyzer.example_plots(P_thresh_opt,'train',['late']) -#alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') -#analyzer.hist_alarms(disr_alarms,'disruptive alarms, P_thresh = {}'.format(P_thresh_opt),save_figure=save_figure) -#print('{} disruptive alarms'.format(len(disr_alarms))) -#print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) -#analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P_thresh = {}'.format(P_thresh_opt)) -#print('{} nondisruptive alarms'.format(len(nondisr_alarms))) +alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') +analyzer.hist_alarms(disr_alarms,'disruptive alarms, P_thresh = {}'.format(P_thresh_opt),save_figure=save_figure) +print('{} disruptive alarms'.format(len(disr_alarms))) +print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) +print('{} seconds median alarm time'.format(np.median(disr_alarms[disr_alarms > 0]))) +analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P_thresh = {}'.format(P_thresh_opt)) +print('{} nondisruptive alarms'.format(len(nondisr_alarms))) diff --git a/examples/run_mpi.cmd b/examples/run_mpi.cmd index c4f45f7e..92ace843 100644 --- a/examples/run_mpi.cmd +++ b/examples/run_mpi.cmd @@ -1,15 +1,15 @@ #!/bin/bash #SBATCH -t 01:00:00 -#SBATCH -N 2 +#SBATCH -N 25 #SBATCH --ntasks-per-node=4 #SBATCH --ntasks-per-socket=2 #SBATCH --gres=gpu:4 #SBATCH -c 4 -#SBATCH -o 0.out +#SBATCH -o gpus100.out module load anaconda module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 -rm -f /tigress/jk7/model_checkpoints/* +rm -rf /tigress/jk7/model_checkpoints/*.h5 srun python mpi_learn.py echo "done." diff --git a/examples/run_shallow.cmd b/examples/run_shallow.cmd index 98432199..f1307648 100644 --- a/examples/run_shallow.cmd +++ b/examples/run_shallow.cmd @@ -1,6 +1,7 @@ #!/bin/bash -#SBATCH -t 01:00:00 +#SBATCH -t 06:00:00 #SBATCH -N 1 +#SBATCH --mincpus=16 #SBATCH --mem=64000 #SBATCH -o log.out #SBATCH --gres=gpu:4 From 18f22b04cba593b3c7f4c4e7c4f9e2bfd53dbde6 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 19:38:24 -0400 Subject: [PATCH 109/744] Add floatx parameter to explicitely control data, math and weight update precision in FRNN --- examples/conf.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/conf.yaml b/examples/conf.yaml index 224aa6f7..ef19ee69 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -39,6 +39,7 @@ data: #TODO optimize normalizer: 'var' shallow_sample_prob: 0.1 #the fraction of samples with which to train the shallow model + floatx: 'float32' model: shallow: False From 9b39240e4092363209fe5f3dd1f5bcaca3ffa21e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 19:39:22 -0400 Subject: [PATCH 110/744] Introduce an explicit precision argument to cut and resample signal functions - implicitely default to float64, default value now is float32 --- plasma/utils/processing.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index d63ae185..a2e14349 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -16,15 +16,13 @@ import sys - - -def resample_signal(t,sig,tmin,tmax,dt): +def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): order = np.argsort(t) t = t[order] sig = sig[order,:] sig_width = sig.shape[1] - tt = np.arange(tmin,tmax,dt) - sig_interp = np.zeros((len(tt),sig_width)) + tt = np.arange(tmin,tmax,dt,dtype=precision_str) + sig_interp = np.zeros((len(tt),sig_width),dtype=precision_str) for i in range(sig_width): f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) sig_interp[:,i] = f(tt) @@ -42,9 +40,9 @@ def cut_signal(t,sig,tmin,tmax): mask = np.logical_and(t >= tmin, t <= tmax) return t[mask],sig[mask,:] -def cut_and_resample_signal(t,sig,tmin,tmax,dt): +def cut_and_resample_signal(t,sig,tmin,tmax,dt,precision_str): t,sig = cut_signal(t,sig,tmin,tmax) - return resample_signal(t,sig,tmin,tmax,dt) + return resample_signal(t,sig,tmin,tmax,dt,precision_str) def get_individual_shot_file(prepath,shot_num,ext='.txt'): return prepath + str(shot_num) + ext From 8a006dd69c2f5accbaaaed2711c6988072a13c0a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 19:41:03 -0400 Subject: [PATCH 111/744] Explicitely ask for float32 in cut_and_resample --- plasma/primitives/shots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 9959cea0..90b1ce92 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -358,7 +358,7 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) tr = 0 for (i,signal) in enumerate(self.signals): - tr,sigr = cut_and_resample_signal(time_arrays[i],signal_arrays[i],t_min,t_max,dt) + tr,sigr = cut_and_resample_signal(time_arrays[i],signal_arrays[i],t_min,t_max,dt,conf['data']['floatx']) signals_dict[signal] = sigr ttd = self.convert_to_ttd(tr,conf) From 09eb3e84f8856e08f67592b30b89ca190085f932 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 19:47:20 -0400 Subject: [PATCH 112/744] Explicitely set data precision via floatx conf parameter: first try --- plasma/models/data.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plasma/models/data.py b/plasma/models/data.py index efd53afe..82edc520 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -7,6 +7,7 @@ from plasma.utils.processing import get_individual_shot_file from plasma.utils.downloading import format_save_path +from plasma.conf import conf # class SignalCollection: # """GA Data Obj""" # def __init__(self,signal_descriptions,signal_paths): @@ -49,7 +50,7 @@ def load_data(self,prepath,shot): file_path = self.get_file_path(prepath,shot.machine,shot.number) try: - data = np.loadtxt(file_path) + data = np.loadtxt(file_path,dtype=conf['data']['floatx']) except: print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) os.remove(file_path) @@ -132,7 +133,7 @@ def load_data(self,prepath,shot): return None,None,False file_path = self.get_file_path(prepath,shot.machine,shot.number) - data = np.loadtxt(file_path) + data = np.loadtxt(file_path,dtype=conf['data']['floatx']) if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) _ = data[0,0] From fd26b1784e5c404618e70e01294bed59f45faca2 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 19:54:27 -0400 Subject: [PATCH 113/744] Cannot import conf due to a cyclic dependency, use argument instead --- plasma/models/data.py | 13 ++++++------- plasma/primitives/shots.py | 5 +++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plasma/models/data.py b/plasma/models/data.py index 82edc520..57992434 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -7,7 +7,6 @@ from plasma.utils.processing import get_individual_shot_file from plasma.utils.downloading import format_save_path -from plasma.conf import conf # class SignalCollection: # """GA Data Obj""" # def __init__(self,signal_descriptions,signal_paths): @@ -35,22 +34,22 @@ def get_file_path(self,prepath,machine,shot_number): dirname = self.get_path(machine) return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) - def is_valid(self,prepath,shot): - t,data,exists = self.load_data(prepath,shot) + def is_valid(self,prepath,shot): #,dtype='float32'): + t,data,exists = self.load_data(prepath,shot,dtype) return exists def is_saved(self,prepath,shot): file_path = self.get_file_path(prepath,shot.machine,shot.number) return os.path.isfile(file_path) - def load_data(self,prepath,shot): + def load_data(self,prepath,shot,dtype='float32'): if not self.is_saved(prepath,shot): print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) return None,None,False file_path = self.get_file_path(prepath,shot.machine,shot.number) try: - data = np.loadtxt(file_path,dtype=conf['data']['floatx']) + data = np.loadtxt(file_path,dtype=dtype) except: print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) os.remove(file_path) @@ -127,13 +126,13 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,m self.mapping_range = mapping_range self.num_channels = num_channels - def load_data(self,prepath,shot): + def load_data(self,prepath,shot,dtype='float32'): if not self.is_saved(prepath,shot): print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) return None,None,False file_path = self.get_file_path(prepath,shot.machine,shot.number) - data = np.loadtxt(file_path,dtype=conf['data']['floatx']) + data = np.loadtxt(file_path,dtype=dtype) if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) _ = data[0,0] diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 90b1ce92..158376fd 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -18,7 +18,7 @@ from plasma.utils.processing import train_test_split,cut_and_resample_signal - +import pdb class ShotListFiles(object): def __init__(self,machine,prepath,paths,description=''): @@ -324,7 +324,7 @@ def get_signals_and_times_from_file(self,conf): signal_prepath = conf['paths']['signal_prepath'] for (i,signal) in enumerate(self.signals): - t,sig,valid_signal = signal.load_data(signal_prepath,self) + t,sig,valid_signal = signal.load_data(signal_prepath,self,conf['data']['floatx']) if not valid_signal: return None,None,None,None,False else: @@ -355,6 +355,7 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): signals_dict = dict() #resample signals + pdb.set_trace() assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) tr = 0 for (i,signal) in enumerate(self.signals): From f894220f912e4f80a1fa4672603d304d0131ff60 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 20:31:00 -0400 Subject: [PATCH 114/744] Explicit type argument to is_valid method --- plasma/models/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/data.py b/plasma/models/data.py index 57992434..9cc4db64 100644 --- a/plasma/models/data.py +++ b/plasma/models/data.py @@ -34,7 +34,7 @@ def get_file_path(self,prepath,machine,shot_number): dirname = self.get_path(machine) return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) - def is_valid(self,prepath,shot): #,dtype='float32'): + def is_valid(self,prepath,shot,dtype='float32'): t,data,exists = self.load_data(prepath,shot,dtype) return exists From 5ed3fb171c4556eea51d2464b67248bcabb70b7e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 20:31:39 -0400 Subject: [PATCH 115/744] Move data to primitives --- plasma/{models => primitives}/data.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plasma/{models => primitives}/data.py (100%) diff --git a/plasma/models/data.py b/plasma/primitives/data.py similarity index 100% rename from plasma/models/data.py rename to plasma/primitives/data.py From 3b4a1fdc38141437fcd071482092f58cffd02a1e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 20:35:22 -0400 Subject: [PATCH 116/744] Remove debug setup --- plasma/primitives/shots.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 158376fd..ca26ed65 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -355,7 +355,6 @@ def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): signals_dict = dict() #resample signals - pdb.set_trace() assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) tr = 0 for (i,signal) in enumerate(self.signals): From 88fa3f3d9464e381f384551b0dea9cd04343119c Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 4 Jun 2017 21:07:09 -0400 Subject: [PATCH 117/744] Basic travis test --- .travis.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index fc139ca0..0999494c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ os: python: - 2.7 + - 3.6 addons: apt: @@ -15,5 +16,7 @@ addons: install: - pip install --upgrade pip -script: - python setup.py test +env: + - TEST_DIR=plasma-python; TEST_SCRIPT="python setup.py test" + +script: cd $TEST_DIR && $TEST_SCRIPT && cd .. From 0a87740d3cb904aa8a08f8011895b908f6ae1bc9 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:07:49 -0400 Subject: [PATCH 118/744] Basic travis CI test --- .travis.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index fc139ca0..0999494c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ os: python: - 2.7 + - 3.6 addons: apt: @@ -15,5 +16,7 @@ addons: install: - pip install --upgrade pip -script: - python setup.py test +env: + - TEST_DIR=plasma-python; TEST_SCRIPT="python setup.py test" + +script: cd $TEST_DIR && $TEST_SCRIPT && cd .. From abccd6d25906653d1671f60d5f3cec1a86070739 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:22:14 -0400 Subject: [PATCH 119/744] Add build status tracker --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2b9d1fd2..3891cbc7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +# FRNN [![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master) + ## FRNN - PPPL deep learning disruption prediction package The FRNN code workflow is similar to that characteristic of typical distributed deep learning projects. From 55f8eecd3d5abdd970b89ffea3f295ffc17b64cc Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:24:54 -0400 Subject: [PATCH 120/744] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0999494c..5e3ad2ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,6 @@ install: - pip install --upgrade pip env: - - TEST_DIR=plasma-python; TEST_SCRIPT="python setup.py test" + - TEST_DIR=.; TEST_SCRIPT="python setup.py test" script: cd $TEST_DIR && $TEST_SCRIPT && cd .. From 67f7340cc178e41802bf59ea5884c4b1b7ff27a6 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:37:50 -0400 Subject: [PATCH 121/744] Pre-install requirements for Travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5e3ad2ec..185cf8d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ addons: install: - pip install --upgrade pip + - pip install -r requirements.txt env: - TEST_DIR=.; TEST_SCRIPT="python setup.py test" From cdc756d6752a09a8824a25365929de65c7c0cbee Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:41:44 -0400 Subject: [PATCH 122/744] Create a separate requiremnents for Travis CI test --- requirements-travis.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 requirements-travis.txt diff --git a/requirements-travis.txt b/requirements-travis.txt new file mode 100644 index 00000000..d8d56552 --- /dev/null +++ b/requirements-travis.txt @@ -0,0 +1,6 @@ +scipy +mpi4py +h5py +pyparsing +yaml +tensorflow From 46add265e5a95fa29ec651072c22a1803fac3e24 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:42:08 -0400 Subject: [PATCH 123/744] Use requirements-travis for Travis test --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 185cf8d5..91708527 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ addons: install: - pip install --upgrade pip - - pip install -r requirements.txt + - pip install -r requirements-travis.txt env: - TEST_DIR=.; TEST_SCRIPT="python setup.py test" From 9acc7457d2b58b5976a5e702f675257792cd5fe3 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:48:14 -0400 Subject: [PATCH 124/744] Update yaml requirement --- requirements-travis.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-travis.txt b/requirements-travis.txt index d8d56552..bcfb5072 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -2,5 +2,5 @@ scipy mpi4py h5py pyparsing -yaml +pyyaml tensorflow From cf167bbdafab965c86e3822acca115a9b2c3e0ea Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 4 Jun 2017 21:52:21 -0400 Subject: [PATCH 125/744] Update requirements-travis.txt --- requirements-travis.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements-travis.txt b/requirements-travis.txt index bcfb5072..c2dbdbb0 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -1,5 +1,4 @@ scipy -mpi4py h5py pyparsing pyyaml From 36a5d38b78711985449330775771b109fd55adb0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 5 Jun 2017 11:03:07 -0400 Subject: [PATCH 126/744] Python3 compatibility: fix tab-space inconsistency --- plasma/models/builder.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 10ec5ab2..28073a33 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -161,17 +161,17 @@ def slicer_output_shape(input_shape,indices): pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) - else: - pre_rnn = pre_rnn_input - - if model_conf['rnn_layers'] == 0: - pre_rnn = Dense(dense_size,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size/2,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size/4,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - - pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) - x_input = Input(batch_shape = batch_input_shape) - x_in = TimeDistributed(pre_rnn_model) (x_input) + else: + pre_rnn = pre_rnn_input + + if model_conf['rnn_layers'] == 0: + pre_rnn = Dense(dense_size,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size/2,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size/4,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + + pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) + x_input = Input(batch_shape = batch_input_shape) + x_in = TimeDistributed(pre_rnn_model) (x_input) # x_input = Input(batch_shape=batch_input_shape) # if num_1D > 0: From ba7c8c0327991516561955f68da9c9b49e4e1e01 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 5 Jun 2017 14:17:25 -0400 Subject: [PATCH 127/744] Update README.md --- README.md | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 3891cbc7..2893333b 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,20 @@ # FRNN [![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master) -## FRNN - PPPL deep learning disruption prediction package +## Package description -The FRNN code workflow is similar to that characteristic of typical distributed deep learning projects. -First, the raw data is preprocessed and normalized. The pre-processing step involves cutting, resampling, -and structuring the data - as well as determining and validating the disruptive properties of -the shots considered. Various options for normalization are implemented. +Fusion Recurrent Neural Net (FRNN) is a Python package implementing deep learning models for disruption prediction in tokamak fusion plasmas. -Secondly, with respect to distributed data-parallel training of the model, the associated parameters are check-pointed after each epoch on the disk, in HDF5 file format. Finally – regarding the cross validation and prediction step on -unlabeled data, it is planned to also implement a hyper-parameter tuning; approach using a random search algorithm. +It consists of 4 core modules: -The results are stored as HDF5 files, including the final neural network model parameters together with -statistical summaries of the variables used during training to allow researchers to produce learning -curves and performance summary plots. +- models: Python classes necessary to construct, train and optimize deep RNN models. Including a distributed data-parallel synchronous implementation of mini-batch gradient descent. FRNN makes use of MPI for communication and supports Tensorflow and Theano backends through Keras -The Fusion Recurrent Neural Net (FRNN) deep learning code is implemented as a Python package -consisting of 4 core modules: - -- models: Python classes necessary to construct, train and optimize deep RNN models. Including a distributed data-parallel implementation of mini-batch gradient descent with MPI - -- preprocessors: signal preprocessing and normalization classes, including the methods necessary to prepare physical data for stateful RNN training. +- preprocessors: signal preprocessing and normalization classes, including the methods necessary to prepare physical data for stateful LSTM training. - primitives: contains abstractions specific to the domain implemented as Python classes. For instance: Shot - a measurement of plasma current as a function of time. The Shot object contains attributes corresponding to unique identifier of a shot, disruption time in milliseconds, time profile of the shot converted to time-to- disruption values, validity of a shot (whether plasma current reaches a certain value during the shot), etc - utilities: a set of auxiliary functions for preprocessing, performance evaluation and learning curves analysis -This is a pure Python implementation for Python versions 2.6 and 2.7. +This is a pure Python implementation for Python versions 2.7 and 3.6. ## Installation From c3282ce3065dbcde7c8a7447b756a45d1b8db6d1 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 5 Jun 2017 21:15:38 -0400 Subject: [PATCH 128/744] Explicit dtype --- plasma/models/loader.py | 4 ++-- plasma/primitives/shots.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index e5637c94..38dbcca6 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -245,7 +245,7 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() - ttd,signal = shot.get_data_arrays(use_signals) + ttd,signal = shot.get_data_arrays(use_signals,conf['data']['floatx']) if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) @@ -278,7 +278,7 @@ def get_signal_result_from_shot(self,shot,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() - ttd,signal = shot.get_data_arrays(use_signals) + ttd,signal = shot.get_data_arrays(use_signals,conf['data']['floatx']) if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index ca26ed65..51c786dc 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -289,9 +289,9 @@ def is_valid(self): def is_disruptive_shot(self): return self.is_disruptive - def get_data_arrays(self,use_signals): + def get_data_arrays(self,use_signals,dtype='float32'): t_array = self.ttd - signal_array = np.zeros((len(t_array),sum([sig.num_channels for sig in use_signals]))) + signal_array = np.zeros((len(t_array),sum([sig.num_channels for sig in use_signals])),dtype=dtype) curr_idx = 0 for sig in use_signals: signal_array[:,curr_idx:curr_idx+sig.num_channels] = self.signals_dict[sig] From e7f95eae8485dfabb5e0505147ac70ed60338ebf Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 5 Jun 2017 21:21:09 -0400 Subject: [PATCH 129/744] conf -> self.conf --- plasma/models/loader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 38dbcca6..60c072c5 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -245,7 +245,7 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() - ttd,signal = shot.get_data_arrays(use_signals,conf['data']['floatx']) + ttd,signal = shot.get_data_arrays(use_signals,self.conf['data']['floatx']) if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) @@ -278,7 +278,7 @@ def get_signal_result_from_shot(self,shot,prediction_mode=False): if self.conf['training']['use_mock_data']: signal,ttd = self.get_mock_data() - ttd,signal = shot.get_data_arrays(use_signals,conf['data']['floatx']) + ttd,signal = shot.get_data_arrays(use_signals,self.conf['data']['floatx']) if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) From 1be8c95865de486dd2157aa6698de0f46abbca55 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 5 Jun 2017 22:25:44 -0400 Subject: [PATCH 130/744] Explicit dtypes --- plasma/models/loader.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 60c072c5..622df041 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -14,6 +14,8 @@ from plasma.primitives.shots import Shot import multiprocessing as mp +import pdb + class Loader(object): ''' A Python class to ... @@ -117,7 +119,7 @@ def resize_buffer(self,buff,new_length): old_length = buff.shape[1] batch_size = buff.shape[0] num_signals = buff.shape[2] - new_buff = np.empty((batch_size,new_length,num_signals)) + new_buff = np.empty((batch_size,new_length,num_signals),dtype=self.conf['data']['floatx']) new_buff[:,:old_length,:] = buff #print("Resizing buffer to new length {}".format(new_length)) return new_buff @@ -144,8 +146,8 @@ def training_batch_generator_partial_reset(self,shot_list): batch_size = self.conf['training']['batch_size'] length = self.conf['model']['length'] sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) - Xbuff = np.empty((batch_size,) + sig.shape) - Ybuff = np.empty((batch_size,) + res.shape) + Xbuff = np.empty((batch_size,) + sig.shape,dtype=self.conf['data']['floatx']) + Ybuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) end_indices = np.zeros(batch_size,dtype=np.int) batches_to_reset = np.ones(batch_size,dtype=np.bool) num_at_once = self.conf['training']['num_shots_at_once'] From f7fc92be328f5e6e431af7c7b94ee8996bc5f901 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Jun 2017 02:50:43 -0400 Subject: [PATCH 131/744] specialized directory for processed shotlists --- plasma/preprocessor/preprocess.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 2afa2bc6..f3540e5a 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -19,6 +19,7 @@ from plasma.utils.processing import * from plasma.primitives.shots import ShotList +from plasma.utils.downloading import mkdirdepth class Preprocessor(object): @@ -195,8 +196,9 @@ def get_individual_channel_dirs(self): def get_shot_list_path(self,conf): - return conf['paths']['base_path'] + '/normalization/shot_lists.npz' + return conf['paths']['base_path'] + '/processed_shotlists/' + conf['paths']['data'] + '/shot_lists.npz' def save_shotlists(self,conf,shot_list_train,shot_list_validate,shot_list_test): path = self.get_shot_list_path(conf) + mkdirdepth(path) np.savez(path,shot_list_train=shot_list_train,shot_list_validate=shot_list_validate,shot_list_test=shot_list_test) From e74ff820d3837ae31c2635238b2eabe58597959d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Jun 2017 03:15:40 -0400 Subject: [PATCH 132/744] added optional warmup phase for batch generator. Added option to up-weight more 'difficult shots', as defined by their minimum/maximum threshold. --- examples/guarantee_preprocessed.py | 5 +- plasma/models/loader.py | 17 +++++-- plasma/models/mpi_runner.py | 80 +++++++++++++++++++----------- plasma/models/runner.py | 37 ++++++++++---- plasma/preprocessor/preprocess.py | 13 +++-- plasma/primitives/shots.py | 12 +++++ plasma/utils/performance.py | 20 ++++++++ 7 files changed, 134 insertions(+), 50 deletions(-) diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index f34eb5d4..b1ddaced 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -16,6 +16,9 @@ ##################################################### print("preprocessing all shots",end='') pp = Preprocessor(conf) +if pp.all_are_preprocessed(): + print("\nalready preprocessed.") + exit(0) pp.clean_shot_lists() shot_list = pp.preprocess_all() sorted(shot_list,key = lambda shot: shot.get_number()) @@ -31,4 +34,4 @@ print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) print("...done") -pp.save_shotlists(conf,shot_list_train,shot_list_validate,shot_list_test) +pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index e5637c94..065c61c8 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -148,24 +148,31 @@ def training_batch_generator_partial_reset(self,shot_list): Ybuff = np.empty((batch_size,) + res.shape) end_indices = np.zeros(batch_size,dtype=np.int) batches_to_reset = np.ones(batch_size,dtype=np.bool) - num_at_once = self.conf['training']['num_shots_at_once'] # epoch = 0 num_total = len(shot_list) num_so_far = 0 returned = False + warmup_steps = self.conf['training']['batch_generator_warmup_steps'] + is_warmup_period = warmup_steps > 0 while True: # the list of all shots shot_list.shuffle() - for shot in shot_list: + for i in range(len(shot_list)): + if self.conf['training']['ranking_difficulty_fac'] == 1.0: + shot = shot_list.shots[i] + else: #draw the shot weighted + shot = shot_list.sample_weighted() while not np.any(end_indices == 0): X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) - yield X,Y,batches_to_reset,num_so_far,num_total + yield X,Y,batches_to_reset,num_so_far,num_total,is_warmup_period returned = True + warmup_steps -= 1 + is_warmup_period = warmup_steps > 0 batches_to_reset[:] = False Xbuff,Ybuff,batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot) batches_to_reset[batch_idx] = True - if returned: + if returned and not is_warmup_period: num_so_far += 1 # epoch += 1 @@ -605,7 +612,7 @@ def __init__(self,generator): def fill_batch_queue(self): print("Starting process to fetch data") while True: - self.queue.put(next(self.generator),True,-1) + self.queue.put(next(self.generator),True) def __next__(self): return self.queue.get(True) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 39c7895e..b1da01f3 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -28,6 +28,7 @@ #import keras sequentially because it otherwise reads from ~/.keras/keras.json with too many threads. #from mpi_launch_tensorflow import get_mpi_task_index +import mpi4py from mpi4py import MPI comm = MPI.COMM_WORLD task_index = comm.Get_rank() @@ -153,7 +154,7 @@ def get_val(self): class MPIModel(): - def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01): + def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01,num_batches_minimum=100): # random.seed(task_index) self.epoch = 0 self.num_so_far = 0 @@ -166,9 +167,10 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No self.DUMMY_LR = 0.001 self.comm = comm self.batch_size = batch_size - self.batch_iterator_func = ProcessGenerator(batch_iterator()) self.batch_iterator = batch_iterator + self.set_batch_iterator_func() self.warmup_steps=warmup_steps + self.num_batches_minimum=num_batches_minimum self.num_workers = comm.Get_size() self.task_index = comm.Get_rank() self.history = cbks.History() @@ -177,6 +179,10 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No else: self.num_replicas = num_replicas + + def set_batch_iterator_func(self): + self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + def close(self): self.batch_iterator_func.__exit__() @@ -366,6 +372,7 @@ def train_epoch(self): ''' verbose = False + first_run = True step = 0 loss_averager = Averager() t_start = time.time() @@ -378,27 +385,20 @@ def train_epoch(self): t1 = 0 t2 = 0 - num_batches_minimum = 100 - num_batches_current = 0 - - while (self.num_so_far-self.epoch*num_total) < num_total or num_batches_current < num_batches_minimum: + while (self.num_so_far-self.epoch*num_total) < num_total or step < self.num_batches_minimum: try: - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator_func) except StopIteration: print("Resetting batch iterator.") self.num_so_far_accum = self.num_so_far_indiv - self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + self.set_batch_iterator_func() batch_iterator_func = self.batch_iterator_func - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator_func) + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator_func) self.num_so_far_indiv = self.num_so_far_accum+num_so_far_curr - num_batches_current +=1 - # if batches_to_reset: # self.model.reset_states(batches_to_reset) - if np.any(batches_to_reset): - reset_states(self.model,batches_to_reset) warmup_phase = (step < self.warmup_steps and self.epoch == 0) num_replicas = 1 if warmup_phase else self.num_replicas @@ -406,7 +406,8 @@ def train_epoch(self): self.num_so_far = self.mpi_sum_scalars(self.num_so_far_indiv,num_replicas) #run the model once to force compilation. Don't actually use these values. - if step == 0 and self.epoch == 0: + if first_run: + first_run = False t0_comp = time.time() _,_ = self.get_deltas(batch_xs,batch_ys,verbose) self.comm.Barrier() @@ -414,23 +415,32 @@ def train_epoch(self): print_unique('Compilation finished in {:.2f}s'.format(time.time()-t0_comp)) t_start = time.time() sys.stdout.flush() + + if np.any(batches_to_reset): + reset_states(self.model,batches_to_reset) t0 = time.time() deltas,loss = self.get_deltas(batch_xs,batch_ys,verbose) t1 = time.time() - self.set_new_weights(deltas,num_replicas) - t2 = time.time() - write_str_0 = self.calculate_speed(t0,t1,t2,num_replicas) - - curr_loss = self.mpi_average_scalars(1.0*loss,num_replicas) - #if self.task_index == 0: - #print(self.model.get_weights()[0][0][:4]) - loss_averager.add_val(curr_loss) - ave_loss = loss_averager.get_val() - eta = self.estimate_remaining_time(t0 - t_start,self.num_so_far-self.epoch*num_total,num_total) - write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | '.format(self.task_index,step,eta,1.0*self.num_so_far,num_total,ave_loss,curr_loss) - print_unique(write_str + write_str_0) - step += 1 + if not is_warmup_period: + self.set_new_weights(deltas,num_replicas) + t2 = time.time() + write_str_0 = self.calculate_speed(t0,t1,t2,num_replicas) + + curr_loss = self.mpi_average_scalars(1.0*loss,num_replicas) + #if self.task_index == 0: + #print(self.model.get_weights()[0][0][:4]) + loss_averager.add_val(curr_loss) + ave_loss = loss_averager.get_val() + eta = self.estimate_remaining_time(t0 - t_start,self.num_so_far-self.epoch*num_total,num_total) + write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | '.format(self.task_index,step,eta,1.0*self.num_so_far,num_total,ave_loss,curr_loss) + print_unique(write_str + write_str_0) + step += 1 + else: + print_unique('\r[{}] warmup phase, num so far: {}'.format(self.task_index,self.num_so_far)) + + + effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch @@ -578,6 +588,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader,custom_path) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) return y_prime,y_gold,disruptive,roc_area,loss @@ -597,6 +608,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non batch_size = conf['training']['batch_size'] lr = conf['model']['lr'] warmup_steps = conf['model']['warmup_steps'] + num_batches_minimum = conf['training']['num_batches_minimum'] optimizer = MPIAdam(lr=lr) print('{} epochs left to go'.format(num_epochs - 1 - e)) @@ -605,7 +617,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non #{}batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) print("warmup {}".format(warmup_steps)) - mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps) + mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum) tensorboard = None if backend != "theano" and task_index == 0: @@ -644,6 +656,13 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non epoch_logs = {} _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) + if conf['training']['ranking_difficulty_fac'] != 1.0: + _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) + batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + mpi_model.batch_iterator = batch_generator + mpi_model.batch_iterator_func.__exit__() + mpi_model.num_so_far_accum = mpi_model.num_so_far_indiv + mpi_model.set_batch_iterator_func() epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss @@ -651,9 +670,12 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non stop_training = False if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) - print('Training Loss: {:.3e}'.format(ave_loss)) + print('Training Loss numpy: {:.3e}'.format(ave_loss)) print('Validation Loss: {:.3e}'.format(loss)) print('Validation ROC: {:.4f}'.format(roc_area)) + if conf['training']['ranking_difficulty_fac'] != 1.0: + print('Training Loss: {:.3e}'.format(loss_train)) + print('Training ROC: {:.4f}'.format(roc_area_train)) callbacks.on_epoch_end(int(round(e)), epoch_logs) if hasattr(mpi_model.model,'stop_training'): diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 2b947cc2..195cf95c 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -84,23 +84,27 @@ def train(conf,shot_list_train,shot_list_validate,loader): while num_so_far < (e - e_start)*num_total or num_batches_current < num_batches_minimum: num_so_far_old = num_so_far try: - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator) + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator) except StopIteration: print("Resetting batch iterator.") num_so_far_accum = num_so_far batch_iterator = ProcessGenerator(batch_generator()) - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total = next(batch_iterator) - num_so_far = num_so_far_accum+num_so_far_curr - - num_batches_current +=1 - + batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator) if np.any(batches_to_reset): reset_states(train_model,batches_to_reset) + if not is_warmup_period: + num_so_far = num_so_far_accum+num_so_far_curr + + num_batches_current +=1 + - loss = train_model.train_on_batch(batch_xs,batch_ys) - training_losses_tmp.append(loss) - pbar.add(num_so_far - num_so_far_old, values=[("train loss", loss)]) - loader.verbose=False#True during the first iteration + loss = train_model.train_on_batch(batch_xs,batch_ys) + training_losses_tmp.append(loss) + pbar.add(num_so_far - num_so_far_old, values=[("train loss", loss)]) + loader.verbose=False#True during the first iteration + else: + _ = train_model.predict(batch_xs,batch_size=conf['training']['batch_size']) + e = e_start+1.0*num_so_far/num_total @@ -114,11 +118,21 @@ def train(conf,shot_list_train,shot_list_validate,loader): validation_losses.append(loss) validation_roc.append(roc_area) + if conf['training']['ranking_difficulty_fac'] != 1.0: + _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) + batch_iterator.__exit__() + batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + batch_iterator = ProcessGenerator(batch_generator()) + num_so_far_accum = num_so_far + print('=========Summary========') - print('Training Loss: {:.3e}'.format(training_losses[-1])) + print('Training Loss Numpy: {:.3e}'.format(training_losses[-1])) if conf['training']['validation_frac'] > 0.0: print('Validation Loss: {:.3e}'.format(validation_losses[-1])) print('Validation ROC: {:.4f}'.format(validation_roc[-1])) + if conf['training']['ranking_difficulty_fac'] != 1.0: + print('Train Loss: {:.3e}'.format(loss_train)) + print('Train ROC: {:.4f}'.format(roc_area_train)) @@ -358,6 +372,7 @@ def make_predictions_and_evaluate_gpu(conf,shot_list,loader): y_prime,y_gold,disruptive = make_predictions_gpu(conf,shot_list,loader) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) return y_prime,y_gold,disruptive,roc_area,loss diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index f3540e5a..659fa24e 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -48,6 +48,11 @@ def clean_shot_list(self,path): os.remove(path) + def all_are_preprocessed(self): + return os.path.isfile(self.get_shot_list_path()) + + + def preprocess_all(self): conf = self.conf shot_files_all = conf['paths']['shot_files_all'] @@ -195,10 +200,10 @@ def get_individual_channel_dirs(self): # return signals,ttd - def get_shot_list_path(self,conf): - return conf['paths']['base_path'] + '/processed_shotlists/' + conf['paths']['data'] + '/shot_lists.npz' + def get_shot_list_path(self): + return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists.npz' - def save_shotlists(self,conf,shot_list_train,shot_list_validate,shot_list_test): - path = self.get_shot_list_path(conf) + def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): + path = self.get_shot_list_path() mkdirdepth(path) np.savez(path,shot_list_train=shot_list_train,shot_list_validate=shot_list_validate,shot_list_test=shot_list_test) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 9959cea0..6a949558 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -157,6 +157,17 @@ def filter_by_number(self,numbers): new_shot_list.append(shot) return new_shot_list + def set_weights(self,weights): + assert(len(weights) == len(self.shots)) + for (i,w) in enumerate(weights): + self.shots[i].weight = w + + def sample_weighted(self): + p = np.array([shot.weight for shot in self.shots]) + p = p/np.sum(p) + idx = np.random.choice(range(len(self.shots)),p=p) + return self.shots[idx] + def num_disruptive(self): return len([shot for shot in self.shots if shot.is_disruptive_shot()]) @@ -247,6 +258,7 @@ def __init__(self,number=None,machine=None,signals=None,signals_dict=None,ttd=No self.valid =valid self.is_disruptive = is_disruptive self.t_disrupt = t_disrupt + self.weight = 1.0 if t_disrupt is not None: self.is_disruptive = Shot.is_disruptive_given_disruption_time(t_disrupt) else: diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 070eacf7..c0e5194e 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -5,6 +5,7 @@ import os from pprint import pprint import numpy as np +from scipy import stats from plasma.preprocessor.normalize import VarNormalizer as Normalizer from plasma.conf import conf @@ -129,6 +130,25 @@ def get_shot_prediction_stats_from_threshold_arrays(self,early_th,correct_th,lat return self.get_accuracy_and_fp_rate_from_stats(TPs,FPs,FNs,TNs,earlies,lates) + def get_shot_difficulty(self,preds,truths,disruptives): + disruptives = np.array(disruptives) + d_early_thresholds, d_correct_thresholds,d_late_thresholds, nd_thresholds = self.get_threshold_arrays(preds,truths,disruptives) + d_thresholds = np.maximum(d_early_thresholds,d_correct_thresholds) + #rank shots by difficulty. rank 1 is assigned to lowest value, should be highest difficulty + d_ranks = stats.rankdata(d_thresholds,method='min')#difficulty is highest when threshold is low, can't detect disruption + nd_ranks = stats.rankdata(-nd_thresholds,method='min')#difficulty is highest when threshold is high, can't avoid false positive + ranking_fac = self.conf['training']['ranking_difficulty_fac'] + facs_d = np.linspace(ranking_fac,1,len(d_ranks))[d_ranks-1] + facs_nd = np.linspace(ranking_fac,1,len(nd_ranks))[nd_ranks-1] + ret_facs = np.ones(len(disruptives)) + ret_facs[disruptives] = facs_d + ret_facs[~disruptives] = facs_nd + #print("setting shot difficulty") + #print(disruptives) + #print(d_thresholds) + #print(nd_thresholds) + #print(ret_facs) + return ret_facs def get_threshold_arrays(self,preds,truths,disruptives): num_d = np.sum(disruptives) From b938d749919358532d3528b2aa0c438b586dc881 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Jun 2017 03:41:44 -0400 Subject: [PATCH 133/744] automated guarantee preprocessing. No need to run guarantee_preprocessing.py anymore --- examples/guarantee_preprocessed.py | 25 ++++--------------------- examples/learn.py | 27 +++++++-------------------- examples/learn_processed.py | 18 +++++------------- examples/mpi_learn.py | 7 +++++++ plasma/models/loader.py | 7 ------- plasma/preprocessor/preprocess.py | 9 +++++++++ plasma/utils/processing.py | 28 +++++++++++++++++++++++++--- 7 files changed, 57 insertions(+), 64 deletions(-) diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index b1ddaced..9679d026 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -10,28 +10,11 @@ from pprint import pprint pprint(conf) from plasma.preprocessor.preprocess import Preprocessor +from plasma.utils.processing import guarantee_preprocessed ##################################################### ####################PREPROCESSING#################### ##################################################### -print("preprocessing all shots",end='') -pp = Preprocessor(conf) -if pp.all_are_preprocessed(): - print("\nalready preprocessed.") - exit(0) -pp.clean_shot_lists() -shot_list = pp.preprocess_all() -sorted(shot_list,key = lambda shot: shot.get_number()) -shot_list_train,shot_list_test = shot_list.split_train_test(conf) -num_shots = len(shot_list_train) + len(shot_list_test) -validation_frac = conf['training']['validation_frac'] -if validation_frac <= 0.0: - print('Setting validation to a minimum of 0.05') - validation_frac = 0.05 -shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) -print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) -print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) -print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) -print("...done") - -pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) +np.random.seed(0) +random.seed(0) +guarantee_preprocessed(conf) \ No newline at end of file diff --git a/examples/learn.py b/examples/learn.py index 0baeec62..ccd49ddc 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -32,6 +32,8 @@ from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.preprocess import Preprocessor from plasma.models.loader import Loader +from plasma.utils.processing import guarantee_preprocessed + if conf['model']['shallow']: from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu else: @@ -59,37 +61,22 @@ # else: # batch_size = conf['training']['batch_size_large'] -np.random.seed(1) +np.random.seed(0) +random.seed(0) ##################################################### ####################PREPROCESSING#################### ##################################################### - -print("preprocessing all shots",end='') -pp = Preprocessor(conf) -pp.clean_shot_lists() -shot_list = pp.preprocess_all() -sorted(shot_list) -shot_list_train,shot_list_test = shot_list.split_train_test(conf) -num_shots = len(shot_list_train) + len(shot_list_test) -if validation_frac <= 0.0: - print('Setting validation to a minimum of 0.05') - validation_frac = 0.05 -shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) -print("...done") - +shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) ##################################################### ####################Normalization#################### ##################################################### - print("normalization",end='') nn = Normalizer(conf) nn.train() loader = Loader(conf,nn) print("...done") - - print('Training on {} shots, testing on {} shots'.format(len(shot_list_train),len(shot_list_test))) @@ -140,7 +127,7 @@ y_prime = y_prime_train + y_prime_test disruptive = np.concatenate((disruptive_train,disruptive_test)) -shot_list.make_light() +shot_list_validate.make_light() shot_list_test.make_light() shot_list_train.make_light() @@ -149,7 +136,7 @@ y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, - shot_list=shot_list,shot_list_train=shot_list_train,shot_list_test=shot_list_test, + shot_list_validate=shot_list_validate,shot_list_train=shot_list_train,shot_list_test=shot_list_test, conf = conf) print('finished.') diff --git a/examples/learn_processed.py b/examples/learn_processed.py index ff5b923b..8583f3f9 100644 --- a/examples/learn_processed.py +++ b/examples/learn_processed.py @@ -32,6 +32,8 @@ from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.preprocess import Preprocessor from plasma.models.loader import Loader +from plasma.utils.processing import guarantee_preprocessed + if conf['model']['shallow']: from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu else: @@ -59,33 +61,23 @@ # else: # batch_size = conf['training']['batch_size_large'] -np.random.seed(1) +np.random.seed(0) +random.seed(0) ##################################################### ####################PREPROCESSING#################### ##################################################### - -#print("preprocessing all shots",end='') -#pp = Preprocessor(conf) -#pp.clean_shot_lists() -#shot_list = pp.preprocess_all() -#sorted(shot_list) -#shot_list_train,shot_list_test = shot_list.split_train_test(conf) -#num_shots = len(shot_list_train) + len(shot_list_test) -#print("...done") - +shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed() ##################################################### ####################Normalization#################### ##################################################### - print("normalization",end='') nn = Normalizer(conf) nn.train() loader = Loader(conf,nn) print("...done") -shot_list_train,shot_list_validate,shot_list_test = loader.load_shotlists(conf) print('Training on {} shots, testing on {} shots'.format(len(shot_list_train),len(shot_list_test))) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 81669021..8f20f0a5 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -72,6 +72,13 @@ ##################################################### ####################Normalization#################### ##################################################### +if task_index == 0: #make sure preprocessing has been run, and is saved as a file + shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +comm.Barrier() +shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) + + + print("normalization",end='') nn = Normalizer(conf) nn.train() diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 065c61c8..b0ce7a67 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -594,13 +594,6 @@ def get_batch_size(batch_size,prediction_mode): def get_num_skips(length,skip): return 1 + (length-1)//skip - def load_shotlists(self,conf): - path = conf['paths']['saved_shotlist_path'] - data = np.load(path) - shot_list_train = data['shot_list_train'][()] - shot_list_validate = data['shot_list_validate'][()] - shot_list_test = data['shot_list_test'][()] - return shot_list_train,shot_list_validate,shot_list_test class ProcessGenerator(object): def __init__(self,generator): diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 659fa24e..d56e847d 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -203,6 +203,15 @@ def get_individual_channel_dirs(self): def get_shot_list_path(self): return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists.npz' + def load_shotlists(self,conf): + path = self.get_shot_list_path() + data = np.load(path) + shot_list_train = data['shot_list_train'][()] + shot_list_validate = data['shot_list_validate'][()] + shot_list_test = data['shot_list_test'][()] + return shot_list_train,shot_list_validate,shot_list_test + + def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): path = self.get_shot_list_path() mkdirdepth(path) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index d63ae185..a9555649 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -14,9 +14,31 @@ import numpy as np from scipy.interpolate import UnivariateSpline import sys - - - +from plasma.preprocessor import Preprocessor + +def guarantee_preprocessed(conf): + pp = Preprocessor(conf) + if pp.all_are_preprocessed(): + print("shots already processed.") + shot_list_train,shot_list_validate,shot_list_test = pp.load_shotlists() + else: + print("preprocessing all shots",end='') + pp.clean_shot_lists() + shot_list = pp.preprocess_all() + shot_list.sort() + shot_list_train,shot_list_test = shot_list.split_train_test(conf) + num_shots = len(shot_list_train) + len(shot_list_test) + validation_frac = conf['training']['validation_frac'] + if validation_frac <= 0.05: + print('Setting validation to a minimum of 0.05') + validation_frac = 0.05 + shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) + pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) + print("...done") + return shot_list_train,shot_list_validate,shot_list_test def resample_signal(t,sig,tmin,tmax,dt): order = np.argsort(t) From 8153dbc02f1a719c235723694d75e4a91ada75c9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Jun 2017 03:42:07 -0400 Subject: [PATCH 134/744] learn_preprocessed.py is deprecated and not necessary anymore --- examples/learn_processed.py | 146 ------------------------------------ 1 file changed, 146 deletions(-) delete mode 100644 examples/learn_processed.py diff --git a/examples/learn_processed.py b/examples/learn_processed.py deleted file mode 100644 index 8583f3f9..00000000 --- a/examples/learn_processed.py +++ /dev/null @@ -1,146 +0,0 @@ -''' -######################################################### -This file trains a deep learning model to predict -disruptions on time series data from plasma discharges. - -Dependencies: -conf.py: configuration of model,training,paths, and data -builder.py: logic to construct the ML architecture -data_processing.py: classes to handle data processing - -Author: Julian Kates-Harbeck, jkatesharbeck@g.harvard.edu - -This work was supported by the DOE CSGF program. -######################################################### -''' - -from __future__ import print_function -import datetime,time -import sys -import dill -from functools import partial - -import matplotlib -matplotlib.use('Agg') -import numpy as np -import multiprocessing as old_mp - -from plasma.conf import conf -from pprint import pprint -pprint(conf) -from plasma.primitives.shots import Shot, ShotList -from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.preprocess import Preprocessor -from plasma.models.loader import Loader -from plasma.utils.processing import guarantee_preprocessed - -if conf['model']['shallow']: - from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu -else: - from plasma.models.runner import train, make_predictions_and_evaluate_gpu - -if conf['data']['normalizer'] == 'minmax': - from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer -elif conf['data']['normalizer'] == 'meanvar': - from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer -elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer -elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer -else: - print('unkown normalizer. exiting') - exit(1) - -shot_list_dir = conf['paths']['shot_list_dir'] -shot_files = conf['paths']['shot_files'] -shot_files_test = conf['paths']['shot_files_test'] -train_frac = conf['training']['train_frac'] -stateful = conf['model']['stateful'] -# if stateful: -# batch_size = conf['model']['length'] -# else: -# batch_size = conf['training']['batch_size_large'] - -np.random.seed(0) -random.seed(0) -##################################################### -####################PREPROCESSING#################### -##################################################### -shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed() - -##################################################### -####################Normalization#################### -##################################################### - -print("normalization",end='') -nn = Normalizer(conf) -nn.train() -loader = Loader(conf,nn) -print("...done") - - -print('Training on {} shots, testing on {} shots'.format(len(shot_list_train),len(shot_list_test))) - - -##################################################### -######################TRAINING####################### -##################################################### -#train(conf,shot_list_train,loader) - - - - -p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) -p.start() -p.join() - - -##################################################### -####################PREDICTING####################### -##################################################### - -#load last model for testing -print('saving results') -y_prime = [] -y_prime_test = [] -y_prime_train = [] - -y_gold = [] -y_gold_test = [] -y_gold_train = [] - -disruptive= [] -disruptive_train= [] -disruptive_test= [] - -# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) -# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) - -y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) -y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = make_predictions_and_evaluate_gpu(conf,shot_list_test,loader) -print('=========Summary========') -print('Train Loss: {:.3e}'.format(loss_train)) -print('Train ROC: {:.4f}'.format(roc_train)) -print('Test Loss: {:.3e}'.format(loss_test)) -print('Test ROC: {:.4f}'.format(roc_test)) - -disruptive_train = np.array(disruptive_train) -disruptive_test = np.array(disruptive_test) - -y_gold = y_gold_train + y_gold_test -y_prime = y_prime_train + y_prime_test -disruptive = np.concatenate((disruptive_train,disruptive_test)) - -shot_list_validate.make_light() -shot_list_test.make_light() -shot_list_train.make_light() - -save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") -np.savez(conf['paths']['results_prepath']+save_str, - y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, - y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, - disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, - shot_list_train=shot_list_train,shot_list_test=shot_list_test, - conf = conf) - -print('finished.') From 1fd1c39d2bc0ea67ae84a1a26e88b24d0a2a2f7b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Jun 2017 04:03:43 -0400 Subject: [PATCH 135/744] automated preprocessing. Preprocessed shotlists for every data set are now saved to disk, so one does not have to re-run preprocessing unless the raw .txt shotlist files or all_signals are changed --- examples/conf.yaml | 11 +-- examples/guarantee_preprocessed.py | 5 +- examples/learn.py | 5 +- examples/mpi_learn.py | 4 +- plasma/preprocessor/preprocess.py | 107 ++++++++--------------------- plasma/utils/processing.py | 26 +------ 6 files changed, 40 insertions(+), 118 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 224aa6f7..7728d814 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,14 +3,14 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'hinge' #'binary' #'hinge' #'maxhinge' #'binary' #'ttd' #'hinge' +target: 'maxhinge' #'binary' #'hinge' #'maxhinge' #'binary' #'ttd' #'hinge' num_gpus: 4 paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_data' + data: 'd3d_data' data: cut_shot_ends: True @@ -85,14 +85,17 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 40 + num_epochs: 400 use_mock_data: False data_parallel: False hyperparam_tuning: False + batch_generator_warmup_steps: 0 + num_batches_minimum: 200 #minimum number of batches per epoch + ranking_difficulty_fac: 1.0 #how much to upweight incorrectly classified shots during training callbacks: list: ['earlystop'] metrics: ['val_loss','val_roc','train_loss'] mode: 'max' monitor: 'val_roc' - patience: 2 + patience: 4 write_grads: False diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index 9679d026..67826ad0 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -9,12 +9,11 @@ from plasma.conf import conf from pprint import pprint pprint(conf) -from plasma.preprocessor.preprocess import Preprocessor -from plasma.utils.processing import guarantee_preprocessed +from plasma.preprocessor.preprocess import guarantee_preprocessed ##################################################### ####################PREPROCESSING#################### ##################################################### np.random.seed(0) random.seed(0) -guarantee_preprocessed(conf) \ No newline at end of file +guarantee_preprocessed(conf) diff --git a/examples/learn.py b/examples/learn.py index ccd49ddc..c8ea1281 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -15,7 +15,7 @@ ''' from __future__ import print_function -import datetime,time +import datetime,time,random import sys import dill from functools import partial @@ -30,9 +30,8 @@ pprint(conf) from plasma.primitives.shots import Shot, ShotList from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.preprocess import Preprocessor +from plasma.preprocessor.preprocess import Preprocessor, guarantee_preprocessed from plasma.models.loader import Loader -from plasma.utils.processing import guarantee_preprocessed if conf['model']['shallow']: from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 8f20f0a5..cb635c35 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -33,6 +33,7 @@ from plasma.conf import conf from plasma.models.loader import Loader from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.preprocess import guarantee_preprocessed if conf['model']['shallow']: print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") @@ -85,9 +86,6 @@ loader = Loader(conf,nn) print("...done") - -shot_list_train,shot_list_validate,shot_list_test = loader.load_shotlists(conf) - if not only_predict: mpi_train(conf,shot_list_train,shot_list_validate,loader) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index d56e847d..f89f2458 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -121,89 +121,10 @@ def preprocess_single_file(self,shot): def get_individual_channel_dirs(self): signals_dirs = self.conf['paths']['signals_dirs'] - - # def get_signals_and_times_from_file(self,shot,t_disrupt): - # valid = True - # t_min = -1 - # t_max = np.Inf - # t_thresh = -1 - # signals = [] - # times = [] - # conf = self.conf - - # disruptive = t_disrupt >= 0 - - # signal_prepath = conf['paths']['signal_prepath'] - # signals_dirs = concatenate_sublists(conf['paths']['signals_dirs']) - # current_index = conf['data']['current_index'] - # current_thresh = conf['data']['current_thresh'] - # current_end_thresh = conf['data']['current_end_thresh'] - # for (i,dirname) in enumerate(signals_dirs): - # data = np.loadtxt(get_individual_shot_file(signal_prepath+dirname + '/',shot)) - # t = data[:,0] - # sig = data[:,1] - # t_min = max(t_min,t[0]) - # t_max = min(t_max,t[-1]) - # if i == current_index: - # #throw out shots that never reach curren threshold - # if not (np.any(abs(sig) > current_thresh)): - # valid = False - # print('Shot {} does not exceed current threshold... invalid.'.format(shot)) - # else: - # #begin shot once current reaches threshold - # index_thresh = np.argwhere(abs(sig) > current_thresh)[0][0] - # t_thresh = t[index_thresh] - # #end shot once current drops below current_end_thresh - # if not disruptive: - # acceptable_region = np.zeros_like(sig,dtype=bool) - # acceptable_region[index_thresh:] = True - # index_end_thresh = np.argwhere(np.logical_and(abs(sig) < current_end_thresh,acceptable_region))[0][0] - # t_end_thresh = t[index_end_thresh] - # assert(t_thresh < t_end_thresh < t_max) - # t_max = t_end_thresh - # signals.append(sig) - # times.append(t) - # if not valid: - # t_thresh = t_min - # assert(t_thresh >= t_min) - # assert(t_disrupt <= t_max) - # if disruptive: - # assert(t_thresh < t_disrupt) - # t_max = t_disrupt - # t_min = t_thresh - - # return signals,times,t_min,t_max,t_thresh,valid - - - - # def cut_and_resample_signals(self,times,signals,t_min,t_max,is_disruptive): - # dt = self.conf['data']['dt'] - # T_max = self.conf['data']['T_max'] - - # #resample signals - # signals_processed = [] - # assert(len(signals) == len(times) and len(signals) > 0) - # tr = 0 - # for i in range(len(signals)): - # tr,sigr = cut_and_resample_signal(times[i],signals[i],t_min,t_max,dt) - # signals_processed.append(sigr) - - # signals = signals_processed - # signals = np.column_stack(signals) - - # if is_disruptive: - # ttd = max(tr) - tr - # ttd = np.clip(ttd,0,T_max) - # else: - # ttd = T_max*np.ones_like(tr) - # ttd = np.log10(ttd + 1.0*dt/10) - # return signals,ttd - - def get_shot_list_path(self): return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists.npz' - def load_shotlists(self,conf): + def load_shotlists(self): path = self.get_shot_list_path() data = np.load(path) shot_list_train = data['shot_list_train'][()] @@ -216,3 +137,29 @@ def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): path = self.get_shot_list_path() mkdirdepth(path) np.savez(path,shot_list_train=shot_list_train,shot_list_validate=shot_list_validate,shot_list_test=shot_list_test) + + +def guarantee_preprocessed(conf): + pp = Preprocessor(conf) + if pp.all_are_preprocessed(): + print("shots already processed.") + shot_list_train,shot_list_validate,shot_list_test = pp.load_shotlists() + else: + print("preprocessing all shots",end='') + pp.clean_shot_lists() + shot_list = pp.preprocess_all() + shot_list.sort() + shot_list_train,shot_list_test = shot_list.split_train_test(conf) + num_shots = len(shot_list_train) + len(shot_list_test) + validation_frac = conf['training']['validation_frac'] + if validation_frac <= 0.05: + print('Setting validation to a minimum of 0.05') + validation_frac = 0.05 + shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) + pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) + print("...done") + return shot_list_train,shot_list_validate,shot_list_test + diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index a9555649..b1a3c0c9 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -14,31 +14,7 @@ import numpy as np from scipy.interpolate import UnivariateSpline import sys -from plasma.preprocessor import Preprocessor - -def guarantee_preprocessed(conf): - pp = Preprocessor(conf) - if pp.all_are_preprocessed(): - print("shots already processed.") - shot_list_train,shot_list_validate,shot_list_test = pp.load_shotlists() - else: - print("preprocessing all shots",end='') - pp.clean_shot_lists() - shot_list = pp.preprocess_all() - shot_list.sort() - shot_list_train,shot_list_test = shot_list.split_train_test(conf) - num_shots = len(shot_list_train) + len(shot_list_test) - validation_frac = conf['training']['validation_frac'] - if validation_frac <= 0.05: - print('Setting validation to a minimum of 0.05') - validation_frac = 0.05 - shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) - pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) - print("...done") - return shot_list_train,shot_list_validate,shot_list_test + def resample_signal(t,sig,tmin,tmax,dt): order = np.argsort(t) From d07186749482a61b4c9bfd9fbb77d9513469fefd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 6 Jun 2017 14:03:10 -0400 Subject: [PATCH 136/744] Change duplicate method name (get_deltas) to train_on_batch_and_get_deltas --- plasma/models/mpi_runner.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 39c7895e..e8f8f7ca 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -193,7 +193,7 @@ def compile(self,loss='mse'): self.model.compile(optimizer=SGD(lr=self.DUMMY_LR),loss=loss) - def get_deltas(self,X_batch,Y_batch,verbose=False): + def train_on_batch_get_deltas(self,X_batch,Y_batch,verbose=False): ''' The purpose of the method is to perform a single gradient update over one mini-batch for one model replica. Given a mini-batch, it first accesses the current model weights, performs single gradient update over one mini-batch, @@ -408,7 +408,7 @@ def train_epoch(self): #run the model once to force compilation. Don't actually use these values. if step == 0 and self.epoch == 0: t0_comp = time.time() - _,_ = self.get_deltas(batch_xs,batch_ys,verbose) + _,_ = self.train_on_batch_and_get_deltas(batch_xs,batch_ys,verbose) self.comm.Barrier() sys.stdout.flush() print_unique('Compilation finished in {:.2f}s'.format(time.time()-t0_comp)) @@ -416,7 +416,7 @@ def train_epoch(self): sys.stdout.flush() t0 = time.time() - deltas,loss = self.get_deltas(batch_xs,batch_ys,verbose) + deltas,loss = self.train_on_batch_and_get_deltas(batch_xs,batch_ys,verbose) t1 = time.time() self.set_new_weights(deltas,num_replicas) t2 = time.time() From b0dc8d97c5f12c3684cc53394b9b680f2fc6efbd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 6 Jun 2017 14:37:01 -0400 Subject: [PATCH 137/744] Change duplicate method name (get_deltas) to train_on_batch_and_get_deltas --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index e8f8f7ca..630b251c 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -193,7 +193,7 @@ def compile(self,loss='mse'): self.model.compile(optimizer=SGD(lr=self.DUMMY_LR),loss=loss) - def train_on_batch_get_deltas(self,X_batch,Y_batch,verbose=False): + def train_on_batch_and_get_deltas(self,X_batch,Y_batch,verbose=False): ''' The purpose of the method is to perform a single gradient update over one mini-batch for one model replica. Given a mini-batch, it first accesses the current model weights, performs single gradient update over one mini-batch, From a3d490683a7cbfed795d4cd8ed59750479eac95f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 7 Jun 2017 20:20:45 -0400 Subject: [PATCH 138/744] Consistent optimizer for replica and MPImodel (weight update) --- plasma/models/mpi_runner.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 630b251c..0d63e88d 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -189,8 +189,20 @@ def save_weights(self,path,overwrite=False): def load_weights(self,path): self.model.load_weights(path) - def compile(self,loss='mse'): - self.model.compile(optimizer=SGD(lr=self.DUMMY_LR),loss=loss) + def compile(self,optimizer,loss='mse'): + if optimizer == 'sgd': + optimizer_class = SGD + elif optimizer == 'adam': + optimizer_class = Adam + elif optimizer == 'rmsprop': + optimizer_class = RMSprop + elif optimizer == 'nadam': + optimizer_class = Nadam + else: + print("Optimizer not implemented yet") + exit(1) + self.model.compile(optimizer=optimizer_class(lr=self.DUMMY_LR),loss=loss) + def train_on_batch_and_get_deltas(self,X_batch,Y_batch,verbose=False): @@ -597,7 +609,14 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non batch_size = conf['training']['batch_size'] lr = conf['model']['lr'] warmup_steps = conf['model']['warmup_steps'] - optimizer = MPIAdam(lr=lr) + if conf['model']['optimizer'] == 'adam': + optimizer = MPIAdam(lr=lr) + elif conf['model']['optimizer'] == 'sgd': + optimizer = MPISGD(lr=lr) + else: + print("Optimizer not implemented yet") + exit(1) + print('{} epochs left to go'.format(num_epochs - 1 - e)) # batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) @@ -615,7 +634,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non tensorboard.set_model(mpi_model.model) mpi_model.model.summary() - mpi_model.compile(loss=conf['data']['target'].loss) + mpi_model.compile(conf['model']['optimizer'],loss=conf['data']['target'].loss) if task_index == 0: callbacks = mpi_model.build_callbacks(conf,callbacks_list) From 0027b7162d7d642ca59760705d6978cc4ee7a5bd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 7 Jun 2017 20:23:03 -0400 Subject: [PATCH 139/744] Import all Keras optimizers --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 0d63e88d..acbaa559 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -66,7 +66,7 @@ from keras.layers.recurrent import LSTM from keras.layers.wrappers import TimeDistributed from keras.models import Model - from keras.optimizers import SGD + from keras.optimizers import * from keras.utils.generic_utils import Progbar import keras.callbacks as cbks From 4f37df8680ad2497a48587f7bcfc4946b86572c2 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 8 Jun 2017 14:52:49 -0400 Subject: [PATCH 140/744] Update installation instructions --- README.md | 89 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 2893333b..7dd8c75e 100644 --- a/README.md +++ b/README.md @@ -6,54 +6,73 @@ Fusion Recurrent Neural Net (FRNN) is a Python package implementing deep learnin It consists of 4 core modules: -- models: Python classes necessary to construct, train and optimize deep RNN models. Including a distributed data-parallel synchronous implementation of mini-batch gradient descent. FRNN makes use of MPI for communication and supports Tensorflow and Theano backends through Keras +- `models`: Python classes necessary to construct, train and optimize deep RNN models. Including a distributed data-parallel synchronous implementation of mini-batch gradient descent. FRNN makes use of MPI for communication and supports Tensorflow and Theano backends through Keras. FRNN allows running hyperparameter search optimizations -- preprocessors: signal preprocessing and normalization classes, including the methods necessary to prepare physical data for stateful LSTM training. +- `preprocessors`: signal preprocessing and normalization classes, including the methods necessary to prepare physical data for stateful LSTM training. -- primitives: contains abstractions specific to the domain implemented as Python classes. For instance: Shot - a measurement of plasma current as a function of time. The Shot object contains attributes corresponding to unique identifier of a shot, disruption time in milliseconds, time profile of the shot converted to time-to- disruption values, validity of a shot (whether plasma current reaches a certain value during the shot), etc +- `primitives`: contains abstractions specific to the domain, implemented as Python classes. For instance: Shot - a measurement of plasma current as a function of time. The Shot object contains attributes corresponding to unique identifier of a shot, disruption time in milliseconds, time profile of the shot converted to time-to- disruption values, validity of a shot (whether plasma current reaches a certain value during the shot), etc. Other primitives include `Machines` and `Signals` which carry the relevant information necessary for incorporating physics data into the overall pipeline. Signals know the Machine they live on, their mds+ paths, code for being downloaded, preprocessing approaches, their dimensionality, etc. Machines know which Signals are defined on them, which mds+ server houses the data, etc. -- utilities: a set of auxiliary functions for preprocessing, performance evaluation and learning curves analysis +- `utilities`: a set of auxiliary functions for preprocessing, performance evaluation and learning curves analysis. + +In addition to the `utilities` FRNN supports TensorBoard scaler variable summaries, histogramms of layers, activations and gradients and graph visualizations. This is a pure Python implementation for Python versions 2.7 and 3.6. ## Installation -The package comes with a standard setup script and a list of dependencies which include: mpi4py, Theano, +The package comes with a standard setup script and a list of dependencies which include: mpi4py, TensorFlow, Theano, Keras, h5py, Pathos. It also requires a standard set of CUDA drivers to run on GPU. -Run: +Then checkout the repo and use the setup script: + ```bash -pip install -i https://testpypi.python.org/pypi plasma +git clone https://github.com/PPPLDeepLearning/plasma-python +cd plasma-python +python setup.py install ``` -optionally add `--user` to install in a home directory. -Alternatively, use the setup script: +with `sudo` if superuser permissions are needed or `--home=~` to install in a home directory. The latter option requires an appropriate `PYTHONPATH`. +Alternatively run (no need to checkout the repository in that case): ```bash -python setup.py install +pip install -i https://testpypi.python.org/pypi plasma ``` +optionally add `--user` to install in a home directory. -with `sudo` if superuser permissions are needed or `--home=~` to install in a home directory. The latter option requires an appropriate `PYTHONPATH`. ## Module index ## Tutorials -### Sample usage on Tiger +### Sample usage on Tigergpu + +First, create an isolated Anaconda environment and load CUDA drivers: +``` +#cd plasma-python +module load anaconda3 +module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 +conda create --name my_env --files requirements.txt +source activate my_env +``` + +Then install the plasma-python package: ```bash -module load anaconda cudatoolkit/7.5 cudann openmpi/intel-16.0/1.8.8/64 -source activate environment +source activate my_env python setup.py install ``` -Where `environment` should contain the Python packages as per `requirements.txt` file. +Where `my_env` should contain the Python packages as per `requirements.txt` file. + #### Preprocessing ```bash +cd examples/ python guarantee_preprocessed.py ``` +This will preprocess the data and save it in `/tigress//processed_shots` and `/tigress//normalization` + #### Training and inference @@ -64,36 +83,62 @@ Use Slurm scheduler to perform batch or interactive analysis on Tiger cluster. For batch analysis, make sure to allocate 1 process per GPU: ```bash +#!/bin/bash +#SBATCH -t 01:30:00 #SBATCH -N X #SBATCH --ntasks-per-node=4 #SBATCH --ntasks-per-socket=2 #SBATCH --gres=gpu:4 -``` -where X is the number of nodes for distibuted data parallel training. +#SBATCH -c 4 + +module load anaconda +source activate my_env +module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 +srun python mpi_learn.py +``` +where X is the number of nodes for distibuted training. + +Submit the job with: ```bash +#cd examples sbatch slurm.cmd ``` +And monitor it's completion via: +```bash +squeue -u +``` +Optionally, add an email notification option in the Slurm about the job completion. + ##### Interactive analysis +Interactive option is preferred for debugging or running in the notebook, for all other case batch is preferred. The workflow is to request an interactive session: ```bash -salloc -N [X] --ntasks-per-node=16 --ntasks-per-socket=8 --gres=gpu:4 -t 0-6:00 +salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -t 0-6:00 ``` where the number of GPUs is X * 4. - Then launch the application from the command line: ```bash -cd plasma-python mpirun -npernode 4 python examples/mpi_learn.py ``` -Note: there is Theano compilation going on in the 1st epoch which will distort timing. It is recommended to perform testing setting `num_epochs >= 2` in `conf.py`. +### Understanding the configuration files + +All the configuration parameters are summarised in `examples/conf.yaml`. Highlighting the important ones: + +```yaml +paths: + ... + data: 'jet_data' + +data: + + floatx: 'float64' -## Status From 2154adf3cf40a86c77b5dcf1423feadf0f5bceff Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 8 Jun 2017 16:20:49 -0400 Subject: [PATCH 141/744] Change signals to dictionary for easier selection --- data/signals.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/data/signals.py b/data/signals.py index c37a10db..60a10710 100644 --- a/data/signals.py +++ b/data/signals.py @@ -3,8 +3,7 @@ import time import sys -from plasma.models.data import Signal,ProfileSignal,Machine - +from plasma.primitives.data import Signal,ProfileSignal,Machine def create_missing_value_filler(): time = np.linspace(0,100,100) @@ -118,7 +117,6 @@ def fetch_nstx_data(signal_path,shot_num,c): jet = Machine("jet","mdsplus.jet.efda.org",fetch_jet_data,max_cores=8,current_threshold=1e5) nstx = Machine("nstx","skylark.pppl.gov:8501::",fetch_nstx_data,max_cores=8) - all_machines = [d3d,jet] profile_num_channels = 32 @@ -151,10 +149,10 @@ def fetch_nstx_data(signal_path,shot_num,c): ipdirect = Signal("plasma current direction",["d3d/iptdirect"],[d3d]) #for downloading -all_signals = [q95,li,ip, -betan,energy,lm,dens,pradcore,pradedge,pradtot,pin, -torquein,tmamp1,tmamp2,tmfreq1,tmfreq2,pechin,energydt,ipdirect,etemp_profile,edens_profile, -] +all_signals = {'q95':q95,'li':li,'ip':ip,'betan':betan,'energy':energy,'lm':lm,'dens':dens,'pradcore':pradcore, +'pradedge':pradedge,'pradtot':pradtot,'pin':pin, +'torquein':torquein,'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2, +'pechin':pechin,'energydt':energydt,'ipdirect':ipdirect,'etemp_profile':etemp_profile,'edens_profile':edens_profile} #for actual data analysis #all_signals_restricted = [q95,li,ip,energy,lm,dens,pradcore,pradtot,pin,etemp_profile,edens_profile] @@ -162,12 +160,11 @@ def fetch_nstx_data(signal_path,shot_num,c): all_signals_restricted = all_signals print('all signals:') -print(all_signals) - -fully_defined_signals = [sig for sig in all_signals_restricted if sig.is_defined_on_machines(all_machines)] -d3d_signals = [sig for sig in all_signals_restricted if sig.is_defined_on_machine(d3d)] -jet_signals = [sig for sig in all_signals_restricted if sig.is_defined_on_machine(jet)] +print(all_signals.values()) +fully_defined_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machines(all_machines)} +d3d_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(d3d)} +jet_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(jet)} #['pcechpwrf'] #Total ECH Power Not always on! @@ -192,6 +189,3 @@ def fetch_nstx_data(signal_path,shot_num,c): #['$E_{D}$'], ##ppf signal labels #['ECE unit?']] - - - From aab87c078d7acd0aa9e7398348c03f4577769e2d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 8 Jun 2017 16:22:13 -0400 Subject: [PATCH 142/744] Change signals to dictionary for easier selection --- plasma/conf_parser.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 0224fee5..ea71214b 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -56,7 +56,7 @@ def parameters(input_file): #signals params['paths']['all_signals'] = all_signals - params['paths']['use_signals'] = [q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile] #d3d_signals #fully_defined_signals#d3d_signals#fully_defined_signals #d3d_signals#fully_defined_signals# [ip,lm,li,dens,q95,energy,pin,pradcore]#,edens_profile,etemp_profile]#jet_signals#all_signals + #assert order q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile #shot lists jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') @@ -74,28 +74,44 @@ def parameters(input_file): if params['paths']['data'] == 'jet_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals'] = jet_signals + params['paths']['use_signals_dict'] = jet_signals elif params['paths']['data'] == 'jet_carbon_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] - params['paths']['use_signals'] = jet_signals + params['paths']['use_signals_dict'] = jet_signals elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! - params['paths']['use_signals'] = [q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, +'pradedge':pradedge,'pin':pin,'pechin':pechin,'torquein':torquein,'ipdirect':ipdirect} #'etemp_profile':etemp_profile,'edens_profile'} + #[q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] + elif params['paths']['data'] == 'jet_to_d3d_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [d3d_full] - params['paths']['use_signals'] = fully_defined_signals + params['paths']['use_signals_dict'] = fully_defined_signals elif params['paths']['data'] == 'd3d_to_jet_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals'] = fully_defined_signals + params['paths']['use_signals_dict'] = fully_defined_signals else: print("Unkown data set {}".format(params['paths']['data'])) exit(1) + if len(params['paths']['specific_signals']): + for sig in params['paths']['specific_signals']: + if sig not in params['paths']['use_signals_dict'].keys(): + print("Signal {} is not fully defined for {} machine. Skipping...".format(sig,params['paths']['data'].split("_")[0])) + params['paths']['specific_signals'] = list(filter(lambda x: x in params['paths']['use_signals_dict'].keys(), params['paths']['specific_signals'])) + selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} + params['paths']['use_signals'] = selected_signals.values() + else: + #default case + params['paths']['use_signals'] = params['paths']['use_signals_dict'].values() + + print("Selected signals {}".format(params['paths']['use_signals'])) + params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) From 6f7e986a4d02542ca1daf4c0c5d3331e4d3ee67f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 8 Jun 2017 16:24:00 -0400 Subject: [PATCH 143/744] Add a config parameter for a signal subset selection --- examples/conf.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index ef19ee69..29311082 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -2,8 +2,8 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. -fs_path: '/tigress' #'/cscratch/share/frnn' #'/tigress' -target: 'hinge' #'binary' #'hinge' #'maxhinge' #'binary' #'ttd' #'hinge' +fs_path: '/tigress' +target: 'hinge' #'binary' #'hinge' num_gpus: 4 paths: @@ -11,6 +11,7 @@ paths: shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' data: 'jet_data' + specific_signals: [] #if left empty will use all valid signals defined on a machine. Only use if need a custom set data: cut_shot_ends: True @@ -39,7 +40,7 @@ data: #TODO optimize normalizer: 'var' shallow_sample_prob: 0.1 #the fraction of samples with which to train the shallow model - floatx: 'float32' + floatx: 'float64' model: shallow: False @@ -67,7 +68,7 @@ model: regularization: 0.0 dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00001 #0.00005 #0.00005 #0.00005 + lr: 0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 lr_decay: 1.0 #0.98 #0.9 stateful: True return_sequences: True @@ -75,7 +76,7 @@ model: #only relevant if we want to do mpi training. The number of steps with a single replica warmup_steps: 0 ignore_timesteps: 100 #how many initial timesteps to ignore during evaluation (to let the internal state settle) - backend: 'tensorflow' #'theano' #'tensorflow' #theano + backend: 'tensorflow' training: as_array_of_shots: True shuffle_training: True From acda598c9a5f22e5051541fb7e2ac4ef9f98e218 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 8 Jun 2017 22:01:29 -0400 Subject: [PATCH 144/744] Update tutorial --- README.md | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7dd8c75e..7448f467 100644 --- a/README.md +++ b/README.md @@ -128,17 +128,48 @@ Then launch the application from the command line: mpirun -npernode 4 python examples/mpi_learn.py ``` -### Understanding the configuration files +### Understanding the data -All the configuration parameters are summarised in `examples/conf.yaml`. Highlighting the important ones: +All the configuration parameters are summarised in `examples/conf.yaml`. Highlighting the important ones to control the data. +Currently, FRNN is capable of working with JET and D3D data as well as cross-machine regime. The switch is done in the configuration file: ```yaml paths: ... data: 'jet_data' - -data: - - floatx: 'float64' - +``` +use `d3d_data` for D3D signals, use `jet_to_d3d_data` ir `d3d_to_jet_data` for cross-machine regime. + +By default, FRNN will select, preprocess and normalize all valid signals available. To chose only specific signals use: +```yaml +paths: + ... + specific_signals: [q95,ip] +``` +if left empty `[]` will use all valid signals defined on a machine. Only use if need a custom set. + +### Current signals and notations + +| Signal name | Description | +|-----|:------:|:----------:| +| q95 | q95 safety factor| +| ip | plasma current| +| li | internal inductance| +| lm | Locked mode amplitude| +| dens | Plasma density| +| energy | stored energy| +| pin | Input Power (beam for d3d)| +| pradtot | Radiated Power| +| pradcore | Radiated Power Core| +| pradedge | Radiated Power Edge| +| pechin | ECH input power, not always on| +| pechin | ECH input power, not always on| +| betan | Normalized Beta| +| energydt | stored energy time derivative| +| torquein | Input Beam Torque| +| tmamp1 | Tearing Mode amplitude (rotating 2/1)| +| tmamp2 | Tearing Mode amplitude (rotating 3/2)| +| tmfreq1 | Tearing Mode frequency (rotating 2/1)| +| tmfreq2 | Tearing Mode frequency (rotating 3/2)| +| ipdirect | plasma current direction| From c8001d59d26fb04904855b39d8afa662881d9426 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 8 Jun 2017 22:04:06 -0400 Subject: [PATCH 145/744] Update signals table --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 7448f467..1de2e4e5 100644 --- a/README.md +++ b/README.md @@ -150,26 +150,26 @@ if left empty `[]` will use all valid signals defined on a machine. Only use if ### Current signals and notations -| Signal name | Description | -|-----|:------:|:----------:| -| q95 | q95 safety factor| -| ip | plasma current| -| li | internal inductance| -| lm | Locked mode amplitude| -| dens | Plasma density| -| energy | stored energy| -| pin | Input Power (beam for d3d)| -| pradtot | Radiated Power| -| pradcore | Radiated Power Core| -| pradedge | Radiated Power Edge| -| pechin | ECH input power, not always on| -| pechin | ECH input power, not always on| -| betan | Normalized Beta| -| energydt | stored energy time derivative| -| torquein | Input Beam Torque| -| tmamp1 | Tearing Mode amplitude (rotating 2/1)| -| tmamp2 | Tearing Mode amplitude (rotating 3/2)| -| tmfreq1 | Tearing Mode frequency (rotating 2/1)| -| tmfreq2 | Tearing Mode frequency (rotating 3/2)| -| ipdirect | plasma current direction| +Signal name | Description +--- | --- +q95 | q95 safety factor +ip | plasma current +li | internal inductance +lm | Locked mode amplitude +dens | Plasma density +energy | stored energy +pin | Input Power (beam for d3d) +pradtot | Radiated Power +pradcore | Radiated Power Core +pradedge | Radiated Power Edge +pechin | ECH input power, not always on +pechin | ECH input power, not always on +betan | Normalized Beta +energydt | stored energy time derivative +torquein | Input Beam Torque +tmamp1 | Tearing Mode amplitude (rotating 2/1) +tmamp2 | Tearing Mode amplitude (rotating 3/2) +tmfreq1 | Tearing Mode frequency (rotating 2/1) +tmfreq2 | Tearing Mode frequency (rotating 3/2) +ipdirect | plasma current direction From 7967bd2a601b5a1a0b854bae878265779fc7355a Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 8 Jun 2017 22:24:06 -0400 Subject: [PATCH 146/744] Update tutorial --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/README.md b/README.md index 1de2e4e5..b6646674 100644 --- a/README.md +++ b/README.md @@ -173,3 +173,62 @@ tmfreq1 | Tearing Mode frequency (rotating 2/1) tmfreq2 | Tearing Mode frequency (rotating 3/2) ipdirect | plasma current direction +### Visualizing learning + +A regular FRNN run will produce several outputs and callbacks. + +#### TensorBoard visualization + +Currently supports graph visualization, histograms of weights, activations and biases, and scalar variable summaries of losses and accuracies. + +The summaries are written real time to `/tigress//Graph`. For MacOS, you can set up the `sshfs` mount of /tigress filesystem and view those summaries in your browser. + +For Mac, you could follow the instructions here: +https://github.com/osxfuse/osxfuse/wiki/SSHFS + +then do something like: +``` +sshfs -o allow_other,defer_permissions netid@tigergpu.princeton.edu:/tigress/netid/ /mnt// +``` + +Launch TensorBoard locally: +``` +python -m tensorflow.tensorboard --logdir /mnt//Graph +``` +You should see something like: + +![alt text](http://url/to/img.png) + +#### Learning curves and ROC per epoch + +Besides TensorBoard summaries you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress/netid/csv_logs` (each run will produce a new log file with a timestamp in name). + +A sample code to analyze can be found in `examples/notebooks`. For instance: + +```python +import pandas as pd +import numpy as np +from bokeh.plotting import figure, show, output_file, save + +data = pd.read_csv("/mnt//csv_logs/.csv") + +from bokeh.io import output_notebook +output_notebook() + +from bokeh.models import Range1d +#optionally set the plotting range +#left, right, bottom, top = -0.1, 31, 0.005, 1.51 + +p = figure(title="Learning curve", y_axis_label="Training loss", x_axis_label='Epoch number') #,y_axis_type="log") +#p.set(x_range=Range1d(left, right), y_range=Range1d(bottom, top)) + +p.line(data['epoch'].values, data['train_loss'].values, legend="Test description", + line_color="tomato", line_dash="dotdash", line_width=2) +p.legend.location = "top_right" +show(p, notebook_handle=True) +``` + +### Learning curve summaries per mini-batch + +To extract per mini-batch summaries, use the output produced by FRNN logged to the standard out (in case of the batch jobs, it will all be contained in the Slurm output file). Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: +https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb From 13ed54e6a89ba8d47b336f1867d4abb0b7ed6161 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 8 Jun 2017 22:27:04 -0400 Subject: [PATCH 147/744] Bokeh plot of learning curves from csv_logs --- examples/notebooks/LearningCurves.ipynb | 423 ++++++++++++++++++++++++ 1 file changed, 423 insertions(+) create mode 100644 examples/notebooks/LearningCurves.ipynb diff --git a/examples/notebooks/LearningCurves.ipynb b/examples/notebooks/LearningCurves.ipynb new file mode 100644 index 00000000..ba158d67 --- /dev/null +++ b/examples/notebooks/LearningCurves.ipynb @@ -0,0 +1,423 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "import matplotlib.pyplot as plt\n", + "#import seaborn as sns\n", + "#color = sns.color_palette()\n", + "\n", + "from bokeh.plotting import figure, show, output_file, save" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "data32 = pd.read_csv(\"/mnt/tiger_tigress/csv_logs_precision/float32_sample.csv\")\n", + "data64 = pd.read_csv(\"/mnt/tiger_tigress/csv_logs_precision/float64_sample.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "(function(global) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = \"1\";\n", + "\n", + " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force !== \"\") {\n", + " window._bokeh_onload_callbacks = [];\n", + " window._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + "\n", + " \n", + " if (typeof (window._bokeh_timeout) === \"undefined\" || force !== \"\") {\n", + " window._bokeh_timeout = Date.now() + 5000;\n", + " window._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " if (window.Bokeh !== undefined) {\n", + " Bokeh.$(\"#b178a8ba-75d2-43c2-ac03-746b440e3672\").text(\"BokehJS successfully loaded.\");\n", + " } else if (Date.now() < window._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " delete window._bokeh_onload_callbacks\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " window._bokeh_onload_callbacks.push(callback);\n", + " if (window._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " window._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " window._bokeh_is_loading--;\n", + " if (window._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };var element = document.getElementById(\"b178a8ba-75d2-43c2-ac03-746b440e3672\");\n", + " if (element == null) {\n", + " console.log(\"Bokeh: ERROR: autoload.js configured with elementid 'b178a8ba-75d2-43c2-ac03-746b440e3672' but no matching script tag was found. \")\n", + " return false;\n", + " }\n", + "\n", + " var js_urls = ['https://cdn.pydata.org/bokeh/release/bokeh-0.12.2.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.2.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-compiler-0.12.2.min.js'];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " Bokeh.$(\"#b178a8ba-75d2-43c2-ac03-746b440e3672\").text(\"BokehJS is loading...\");\n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.2.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.2.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.2.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.2.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((window.Bokeh !== undefined) || (force === \"1\")) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i](window.Bokeh);\n", + " }if (force === \"1\") {\n", + " display_loaded();\n", + " }} else if (Date.now() < window._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!window._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " window._bokeh_failed_load = true;\n", + " } else if (!force) {\n", + " var cell = $(\"#b178a8ba-75d2-43c2-ac03-746b440e3672\").parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (window._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(this));" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from bokeh.io import output_notebook\n", + "output_notebook()\n", + "\n", + "\n", + "from bokeh.models import Range1d\n", + "left, right, bottom, top = -0.1, 31, 0.005, 1.51" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

<Bokeh Notebook handle for In[25]>

" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = figure(title=\"Learning curve\", y_axis_label=\"Training loss\", x_axis_label='Epoch number') #,y_axis_type=\"log\")\n", + "#p.set(x_range=Range1d(left, right), y_range=Range1d(bottom, top))\n", + "\n", + "p.line(data32['epoch'].values, data32['train_loss'].values, legend=\"float32 in data\",\n", + " line_color=\"tomato\", line_dash=\"dotdash\", line_width=2)\n", + "p.line(data64['epoch'].values, data64['train_loss'].values, legend=\"float64 in data\",\n", + " line_color=\"orange\", line_width=1) #, line_dash=\"dotdash\")\n", + "\n", + "p.legend.location = \"top_right\"\n", + "\n", + "#output_file(\"logplot.html\", title=\"Bill similarity distribution\")\n", + "\n", + "show(p, notebook_handle=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [default]", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From e2945b48637f6e330a27b3850176f90d2f504a49 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 8 Jun 2017 22:28:52 -0400 Subject: [PATCH 148/744] Example TensorBoard visualization for tutorial --- docs/tb.png | Bin 0 -> 213911 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/tb.png diff --git a/docs/tb.png b/docs/tb.png new file mode 100644 index 0000000000000000000000000000000000000000..71f59e64277a1d348266d81e4d11ec156e692445 GIT binary patch literal 213911 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 z%0D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

bRHP*6!>~V0!$%JQ8fToL0K8DXz;b%bb#%9 zB;tZGTPkF+al(Lahr+*_Qekn}$0(@AKluHgo9nMh!U_xD&exkD0tLt2i2F!#b%TT1 zxr0L%x6!{8q~qeC(yWu>zAfo584iLL1X)Lu{zyVgYgLH>PK7W1`jkYzJqJgo0Y19I z8!dVjqUE_1KI7Hmnukm%!!~b}j?WFW_v8Mi>EZ*1cXe(;j&uAt0=7B)!Iz}k-Hq6t?;ZCiQq3ZD8!8h~Dg2)Avph5+ThCVc+LnVSl$YL9 z^}}sxB8St_seHEPU$Px2Zg^OzLBySz=pW+^6(@M+YkMB(rt;imTmKLF+!Sd4cBSUL9cCNx>{Z_^=Ak= znhXg7Z4QA|x?qzX@lt9jpWXnS4JPk-fsVs14>%?mr_J6u+e_V4BI;BMEBj0jaX zElmO=?Py!fD9%#%C46|mFSAzoEa6ywHXGFBl$N00JLS6FHgBCy$n!|`-R*936oQ6Q z;*M19e%Ib>dwJw?+ zlx;G}Y({WpUkXX9E?K1W#5?P3xtx!_N6$JOH5lwU;+66Hldc;tw;AHdW=80q_)*Yh zuw#?jLhscLCcjZX64U+b;JqZ`S0q3JdUf}P1O4SA?@9^;U>vlcZ^&~@Urx(#^SL)Y z6-GMcLB8RE6Elerdzx&n8ai&75UzRd6cFH4ZDBOy`|k6)vUXH>xGk9~cTqKZtJGwD zVyNDBA3Qp>$%ncJ-q&uvtC>Sx8s7Px3~b@z#q0NjP! zi=SW5XJ=Cs$+Tmss&^gh8a$6-$O~Gkq|w}hXliR|7eu9sl!CycE4-M!*Go(?`&zEE z#Ju8ahO;v;5w>tIthaO?;%h>p#C@h??YVBC*kch(B$lB!7JfcC|}T zs0_frJUET63_N>ie?UTIRQ>WlZgn7ocu@i#wcOm3l`6=8b}W|pi-5*_mFfhrBkda%GVyufVK8JA*;^~xPUz?yf?aS(aD~S8r&W2}^C>^pp@^>17vAKyzd~&C zzS>YFWYgP@V>Bo?dD>by`MUO0wCZ2^#3+BijANO3&GFrR;bYl|^a{lXuk^)RT0pji z9Ub2qNLZXsma@3TGI1otDP64Ab_bGu2(SELooSxrx3AhuU{J_6w^U!&D?8H7ebb*b zyN+p*!J+&}fk2EeH!6+CIQv0NjH2y!8^1-l6_2qZGdN?$M!=A;^hc)!wpYwJvAb z!FG~1zqok+{MBcY&Exs{OBSXSC1c;{(aBolDsMRdZFl9$E06MKHR)_8RZwoxj#H6w z;wIf3a6z7kqKSqr(udt(+^Tg8+_Re`X+C6WwL5Z8t4khN$tM`O7HVn?%lPbu0O&!Bnk9NW5s*&mQTv5MvfkWR^i0t6cs2zfSG zyf4cC=ZBz}j%1)Or-RdV1tTMq$2K(o4jq`)12(?!%In!%Bda}_f8UK?sTfg`ke3%;n<=Y5foglxAO-G33|Q_A zvg_UZ*A0$)C_wwjK=QhFd91KD`Ttk~G-Rv~KebnB{#c_9C$g#!%M7DmGrEsl+}}Gg zqh)m$gf}>zfp!ow42u}pEjvo3yxXgBuqknkYf}Z)f|5V9Z3Lv&J)*gk6M>di+@~m+ z^QRnL?^pX=+8)u7wORtOqo3R=b780Ks2!3H1-=EH80eI$leV9GUD7w{-c}fWaADm@ zBWdD@#!lwX^P!(_-7o#m$Bgq0EZk>GeWRjRkYFxS+ytFr0h4y8S@q_fCn+vdZn$MG z0&zQGjwvtRH&O+i$SSC}C8c?%_XY#EA3K5|3_W(oYv>M_>c=!+11&MQP!Z4tOANq# zFkfedTW7OsUDx_^QfiwQ@)qy{YNaA%&^c-S@9gjzt^+=t_-vdnlFCK}t`A0FE#dFkV^ms`2fi`l;T z45Oj=?|qyt4yvLLJKOxpv=Tn`jSTH<9=05alV_Un8wO{zwpXCq^)2-=vJ|oCHetFQ zkhDpH6lub2aUa>Sz+@O^Q|--qW;IMLF%?`%g6<3vs)-I>cb0J7>M2nNyngq2GsvV| znJx?%0f!^l+vu>vWHw2*X{(^35(G)$n!V;+Z9YRoT9JL<3v^I=Tj?v$Gnfs6)Cu^# zd8n3OrhkI^2`C`msX*U8A4B~;3*di`U=wL}6y}P;gwr1@dGNB5>e88S_P8$j!kUhd zw0>Mu*%T}_x+HPyNT;NZU7z}$&dGzSeiYbiF}itBZD)|9@^0114KHPeuu}T>(&$1# zi)8k&Pr^$~*pVa&2yba9SL7j)1UJc}sYgTZ?GxclC7M!^NT?AIp$pT+iWV|Q4DFMx zN$Lq^=S-0c_aHQWC8$EL?++KDA(hf1ol*`K&;oPg6q~a`(`tEsx)-w*MDC@pU)G0- zKxb~s&<~)cDyvcgTXjDuSF1He=6kv^XwYO>b{OM*nZ$!^Ebk}?0+I2C#hnspdxDRX z2LRS5!Nc#ZOLTEtfK9SvY#XqK8?PihZzRbG|NBN>cG$Y403hVOjGM5d1|hcf4W?FR2gvwO(x4jkJ#AgQsnJhqGNiU1t&>#f)4bHV^l ztOggwL^Jqd-{>Ec-7jW64sX~q4@?x4&EPUhyya|IaWjJxWsr6oL}LURk^Q(fEg(&? za6EL=_uUfkExEJ5hwC*QxzkiuedKEu!D+BS5Zqkg{jBGc)j=e{59E}C&+U@ zp(>o+(p*tv^z~71lofVuSZa@w8|6bOjqZJb<|juIgW?t}rF?q4w-rqDQX3%(@mBd& zGMMoly3l}bHFvycFpg5j+ETVbHkm0WhBEEsb{h91>eAH@i+Atdt-s@x_5OnJF|Phf zDbzUdN%7z5r6CHeCk_xSe-{9&INK`Lyhn@b=QSNN97!%4Ldt#r-d4P;D&JIiPvhpp z5;BrUgot9;0M~s`>n;vgcgx_`s?@#r>PpD_e%PfiXIwwnRHeE;9e=Dqe|T}oHZzV7 zYlP9dY7b>Qyza$9(;6RKkCWr;T<;E+(f9;dtA9=oMScyOvZ^Gl$bj1GAu1fNk3NDKzdQijeEb5q4{j|CkdJ)ldHF6tVr8R6wOKt!07fs zdAdanzBn#zr)1c3T3T9&>HuXz0kT29B6XQ|Yg3wvb<2A+*=St$(GUiRn(MlTz&&wS zKA($k>^r38^PW za}`>B?oPm4Ip%=@e%01nN+Q5yA0Z2i(rSlC!12&oq+TeO^<4>b&a;&xWyo;U^m`auE#f+1kLDWNI-BjRXCizbY$I4{L+A|!2JRUx`^hLSTqt*6R zX(+i2t{J>MAj$Lry~9%=`KAsU5Da6x?N&e%1)-VY6fY2Uoo-NP7eYH^=uPi>&)me_jJN4EIvCewW^<|%!!mfN|H z8}jZSkyVpgwg)gi44icc>suCGgqw-@0P*yn^sWg4f=TifS!qlaUHqduN`H967#(;C z4pQZt@LQepwv}4~8ItM&$ffGZ%lY$24YI8u528h1<=W;rOZE~ac>J$Dwxly5m*21t zsmcZ!=dEGUbWh!#o*r(u7ZVvU9F4L`amV!B%7-rofl=^SdW=d2ry5E6udFw3sqp6y zvu}VLuR|BYe0Vwc^XuiS%-cB=+clP|b19wveK+!thkW5C`#7-)#yrD((PNdFbCp*E zHR>WPz-tlS>})=kC@Y7|z0#_X;`Qd)3(FzK7PR`v@%aZ%)oeoL5AB0*I#V9AIczxb zCsB~!7s2R|wH?u@&9(kQeE*# z45yE5urYk0%fis8vs9n!ygIc8oIPqSuGNh>i^8$A+O0b#W4ad?*h=j`M{lVTl)qdN z5Tf;m6nT5&e6LX&Fl5y2)$zn{=RZO7z8xDQx;@5LGHEeko_#igs>g;84NPjkU^Ep2 zACfbUVK%eqCq9j2+`K-{TwoT1wRyb3yjch*3Db?piga4N<59UY6}DJ+S-k~OlzM{l zxl(&F%lvY$EqZjV-EY83Y+3GBNE&&DTl_dATXz55r&E$Nn~C1(kyQ_8_Nj=~c6DVh zLSdaY=?(S|*}B(?V-1i4@Y@7m(OF)_j7b|%L20HL#P?&DN4vqDH{{PSck^jem#w|I zpjhgsJ+MvbXKzQ<+;*0w!z9c@lX-dBBve>ICH`T!+)pQ$2z%UU9T+mI5}=u3T+_rZ z80?Vt$U=O-5x|!5hKeM|>n&wFq3asRmrAr$Ti$wy$u!ih^i$(@PoXGKIP1Kx%m?VX zL`^ZQ&O;ee_(E{jN@t=V2@L;=k-8j6wzs(?qX}t8fv`IF`{g?mjb6l`QG=R;bJ0%D zgV!(J@juIGZajI6m89F>Um!*t*O}Wsmvq*ACY{VJ1f~?bh z+*~?cF?ohSzpq;h9^(rRE4VhmUd(SssU>hlU2-uZ_sN1BR$=HKA*jW&T6jHwT}{OX z!wild?pqg)xUrDrtPjCARdnh<2hx(c_7S^fH2VX1FTJNgUU*3Ec>fkGno=D8%DeO~ zjHYZrLcQ)%fXon{Q_)MAaJ$~5J9xa+tsjI7Emh&m`g>)EWeuk6%Dl{nj2{gY5(uFB z8Rmy7M(-ISMMz$|5Sdbtl+dUWO?yHq=pgKs1zJ)-`cS>1O^AnvLi7ibRpjUvQv9@M zjDow4FvG#_%dX{i@ySg!9Sw#v!xE~p=1Dr0o|cK1^$GnA8J`aa^z6#FmGApk zbw}Oh{Oq~mXXsLA^9I`aqDZlyU;^oY5C?KZNb1mn=QrlI-h7MqG>4j2EewWE+x7r? zD#H<0NN6SA?ZX{dLgir%R@vgaEdx!)&YFGbvC2Xc%KN zDW9zHKKdN-h&BHpty9DrGKlvF<4fru)LBYRGH@YC8a2A7=1*J?D8%Q{&gd_rZ&jTZ{Y!$CF)_!y}mI^TH1D?eXes9Z#s| z{bl9a5lBX=x@=mCUQD<*`MQCc)LpK?B+N*nw1bq2z$I7j(F3fo4mWMNon}BkrZ@PB zJa8=UODUfD&}&0`0gP0^wTz-C+C{jL^i0Pmfd6*HP|d{f@_cOF!Y3WGmhK_g?56!`iBV+49*vgp^#(~3*2%p0(sOd? z^KB8o*hBxxMw`vIq@f3}rtm?vhJA*30#Ee8*RV)xo3x{zlUn2xmUtpZ>`yC)(6I5| zw}^I2KPp72+jKSeC79npY}hla*s!@2u!x+5T_CgnXr~l*is0%+{fN)3MfTnELMARR z^_Xqc71)6=Hk@we!53It0o2hBVFD1eO;t-fv{~+XdEiTh@a^s*8{x+U8d0TW}%a#!;2l4{%s)KS;t>2^mZjJNRaK(4mV zo2=J3EQCuZwF1!|UDb8f12^e|T5Za{`a@a>gE7y!*F&v4`FIoTs`t;dn`U~Cv%CTS zT#BWb1mY1_M^f**%NF5+etjQ*#`t#Z``6}{Th^ZyJ`Y$A;+gj#VNS*RKR8_aLyT@T)9a`(Qjw&KK#C$^n`RD zn6QHp{wOoYVL=c{y6QX<+%REccJosbw(r%){W(#N@Z<)NP5 zxZ2DlF{0{J-6U_|jyvPtaXEs8og+7IjpG3kD=u~P-DoFVdOsDVdrD?L$IZ_ae9w|{ z4%Z0ppU9MvmD;B#$i3)~@P%9x|0y?Zk#^S=#}#sSdON3&8fO%~1~NoDTE2|FI0LZr zb+WzTU%cJ8=IRzNiLZFu6|3jzG-7q0L2p<;`-Tn4aMb~%P7gb3R{t0N$mE0ZS#}>^ zarReZZ8w*h3tzo`k7_R0$0qNEavhO>yusqj7V+G)W4ggmYo7lx2#066Dub@x7!`nYkzh2ib>)ohziim~DI)1w#Wp*VCQ@$K>s zU$8FI{7&==9;Ln-A0EO|Da55DMDloW#pqeK&pmb+?I`*(>ES522_rLd0m-&*`iU*P zX}!tRd1>XMO(9lJ@wTxJxOMZr^~0bJAJqxJ$S}y49o2Fjs|HL^|IFJE3sS!7{z$*z z9eIL0K=RGh80Ud4*v@_i{l)2EHf1xiKf{3}{^Tf&)nXQH(J4H$pek(egE-W&qFz>cjfuDqzH}@-I57tW-z>Sj)OA9exbp3(10)X^msEHP zkM}W?-p%yK9B!YJrO9U3H6iR-*PWTOWjJf@Vz4isT({N>`<($oJX_$ESfpacVQ@>g zkvsJ~?fJVYJE<$7v78Yv@79B2_znzI)fP*@WaD}0nQ}c|C_1~Dgmyg+<`-EawCVXW z_5>!!qv(e(_e_gW1&+bWfQA3 zCrZ5ir;+FFgt+`Ani1|JV$<3gaX2KQ=XiS3QWWN+jiA*3Y>q|f2>c`N;`<_iK-ndV zDS;-|#21dkvbf`604t#@D~=j|baBDd32#v&dgi9222WP;<>&10QSr8*#QYv&q^;7V z%yeCn;T$mROam$_xpgGZNjPmz@p-;$;fsk3zO00u{r=ee)0qfIR%PF13y>^?f}@GXm3+ZIv(^42FzLPVBwAwVF{;N zPC@IN#CNbBt2g5lz0`OcS8fiv{L!oXWj<~9(+pk%qP}@H8-x6hln*xvaT#7tA<}nc zOX|W&LFoc~gm$%sV&}-goq6`f(F)s=+su8NpPXB3@0|!L8#OD2&xYP9KxomJ!j5E9 zh4&ZJkM18}8HS<$Kf>NJDvqt&0u2QBhQ{4pf?IHRm*5uMo#5_HAh=5c1b6p9Ah^4` zyCknT_q*pi=e{?_``M#^bXC``z1Ny^t~rY_jMn5x`@oc7p(=ZU(E(}8;)nIMG_c$CKKGwH3KO@V*-69uA_YdqDEXt zi9I^Ke?UZC_0;j=s_I4DcvNC`>%ue)V<8$?mOPy@eOppy&O>I2iIXgpWRbB$MId__ z5hnSW;Fdum1LTs zvE2R|&te5Wh})7XzJew+DH0-22_M0k8cM5K?jLh>u`RI{B=)_}1L>UeexB=caRS2Q zps^T-TP1#G@nHk;_FQ`{{E90LwmNe#1ZN(0E#|+7szy&mGdHQc;SFAX@+T*c^|lE5 zYDKEAf6FnTqLuh)eADu@^CIm1lb=`zEzdDSiciK~WP9W3 z!ebOQX1`!}qGbvvwz`fscwLM{sG}|8!g^~YRB>qoNpX9$<;xsvK z27D8W`&VPnR&1e)puD&Lb(0VUne?7_cFAlbPHKT+6IuRJ=i@I^Q zOE>4XfZ+%#1UkU0?fn(|r!tD1l~#9Vz|z~qsqyl_O+oIW>~d=`4!;|kx=1UGOMsq^ zE_!D_5E{`Gy{z%L%I&+5Qg$WrqeJ&yJof0HTNuulD=`0U7?;UeTnwL9y=aHgEZC1b#t zNgX$FwI5uZGSMgZWydhkhjR}TE0W3rxWIfk0owsHg+LXle(HPf2=5Wb#I z6{(%82RTA&Y8`*!YM6e4=W6QstOLnoUOCMk-LVEOYoP7_I0a;|$*q3uV5LcP;8k-t zc60b*$47u4^dwq>*kb9RlImxE>_S68oW5F~+Y8U}m*g6yybQKsATsS2cX0;(Zh*oaSS2!wuk*5V@n+dM3MzDIS^p~ zO7c`VM9NNL)@>TkY!v|J7supRm{ZSrn>o&ul*tq@HM`$UG#Pk!Ak#xe&t7pefA^#f zh0XbMb%r%i|9E83`)uAB`j$BA+*sepH4YIhl0>-o=D2Dqa{lZ=Mi^1=(BplNnbR%@ z+!W^Ll$0;dzWTBj|9}?$B3M~?;Y-hrU3@EBGy&}B9KOV2#-Ce>rJGvo*nx>zyQWXy zmMZm_3#@w{){WoMOZw4o7Zr`?-h`d1A%6oIH^IC?t7=$PD&(Oq!XJ*7*M#b~#T54W zanhgIiVWZAie;7#f;gW$RELb(<$GN2>3arFSG8+Dv-hX1Jb!)-B?>;#mHYjsZQ%cd zXycU)O+|iQV$dhr0r+zKxi_ya*cB}FIS3l9O~40b+9p6ez5 z=;`rTATr@!zM?;$zatXg`t!n&USw0NE%-LC^Pd0nbs@t$v+KEYa+Y(GWEAk&)@1W* zMl0AYVRq1sn>r;6qiA_d+BA}Z8)PN;Vm^0tl!8&bwG;J|nAdRLjzGat+;1^g2W2UL z3MItAZT{#X+oU#x1gy>lG)e%S)jZbcCQ?U3*E7Z2b->T4G!%$E_SV5W)!EcQnt;RuQ1=V(-~f6^oYL4y&UV7si!>T zO(~q`EHP;_UUXt7eY200?cRCbgJ?Jm+T&@emFrCXwMU80U|=^TSLwL!xN1cUjiy@b+w+@gNks7(V*mX}1gI zG1_enh42*@99-LR(jp0g)V~gPx&zCpn}}N*0rAv&>WqWJij=PH|Dv6N54{ooKEJHF zW26W3|EK#4B4Z(n`h7oge`@ksnv2!aX-+#ma`3lU1EwoWGi03a9~~|C0rdBM9&+i+ zH#x9J(M`1i1U)%|Zfs-O<`EaH&D%C62pYc^atwDo4^*>t=}w&|+gi`f1zWy_wREYi zm7K5mY11wh?G!L?{W#kpgvxyH;Q1H)dDe<-Q2B&4CVPm^78|EsI+ewMYtc{z0Ub5KLz7E*lNB9p`*kiN)fAuA6RZlRhfM| zQ=!qu=7_a5jRr0qMBTs z?f-Swc7?LPzu^K?J#xPMK1(48)rwo3)@7_NXbuvru=EbF-FF^SG;(pwc(zHhL|n*R z;%>R$<{Lp}Gily%9pNHRk{H{aM zC~*29zrQOuz`Z8~GzDDZkg_3cXqpMe;T;A8T^w?+eu$Uf5clo?wtCI}r1qfQhK zc!jh@5yXbky8%6s&$drS0vEerRVAB^=pxzF^pefYBNy#|pacb3{#-Z%k;8bwi`Kku zKqfT;S27~v$BYqT33Yk!MrjkXsc1NtxEO@dH`YE%GL@KgCqeY1fKhE}#>ojX0~HQZ zAfc1YJUmzbRO{1U-9$mZ`85(DWs#uUYK`zCno;jA!C|asuemy@3XzD+;;2`F%4~>` zv57$`afO~Iquj7@GasoW%*NHKvXU^A9!i4rry9QtcUVE8Mc zw}D2Nk+I=J$H29AQq4MJprp&ubN;E31luk^P?sOYATO(>YVMfW{x@KSP0qi|LkA6Z zlL4vbW*C5J+4|vBS10sh6`a0zJksfVUx-6d+7>h786u$b?Ep;DJK@PU`b3y%ll}Xo zImNXu6MGl?&wJBo|r<-^ab# z>{J`a;it1s`$OzZw%Uskl^IiX51&f5* z(a-z$+eSKv$ez86xvyK9AsFNSg82`%LiQ7!?3p%y^zCHN$Se18_Z!r4J2cvBp)1Oj zoYbs%J{#+f_RvnV>)9qcSJmJ$3V$x$1z?z%nT-2Rj`clm75m>_j2%O3`KhhH@ag>X zXp+hO1LbtkRHy;ggrAVn+Jr%?L_lrLnDB|I{(ka)LW&wM;YR9ff(xVZ0?nqn@!rI* z^@k%M8nz1P5|o~09WP%S=c9_obauD1jwdFM-#_a}!7$^VqgV)4h>;**0{f%>fwz(U z)+69iIW}DYwN((sRXY~3i+9=sm$7`fE24K@w6`X{~i}}{{FoB zx^IUTLtekh?S$I>dA+{QcXro!&q24>ua#x3*Yf?{ zZGC&mh1ZL(qo9S@Fs8)T8!>E~xV`VH#c}}#i-vL;oTJOnjZ?cT-dCd`V6PQ;gncJr zQphZlG=0;X!0>qvhjUfyH}c>yEfVsJLZ)Plcg9GJSWnszzr+N(Hh85Q^-JH?Y>NjdS_tOj}`hSwKKxye<1~q-L zIoxE)_}bldsgs`1W`lj3>)~ZJ7zSMKroT;waROF6S>I0rXRPwPUNBPar#X6K-#}wE z%m*r_>z(X>uN8OSTBqQ2wz>nmwB{a#g#P<+;YdU6rzgl1MXv{1%Hb%a!qpl>{m%ae zJyoV8W!$PfK2cCsR#wFYjE(o03qEO+b8j>YsKTqb^wg0r4_IR&(9<{>wR{E~JOcBv zBDwZij1dhGkkdoT3oGGCNl~Jy)aAcjQ;%W0w4s$D_Y^s@*A1?pevn@K7wZh%C`&XP zP&VWE;P8U~y3-%C1isVPZIrf!XacCeE zG!~5!JM>T1r>wA<_1P8kZ+0~%=D6wT=p3&1l}+ZB^%hh-S((w4zOA3m@Bf=g*--Q! zLjxNqc?iD?$Z`rE(d9x9%112LGQtDF+(n=e%b8o0yep(B@c7ddLo1yo5UfknlKUjd znZa=&y-(6(jnoqK|5g86d`*~mXg<_`1sz4;S!Vhd)pOV?v0-ls``R8b$z2pB2CA6r z47#%2Z%q!9EwyT&*~m@Cxw>e+Fa<**7Nc%V0p1#WGmAHXTY1KhnFh{XZ@Z8a2gjm( z#1AlQo_kqTC-BZ(ci_zM8Q}f;r>v74$k2i1zcX6|A%JO`nvN=4qj7@lKw#W+-R!+3 za#8?#vpr8Ye7M~C*whA$0|q|5qPQk|V_Ca+MOrT1JdP|_GY6lZ_nTXBSD^d!vk$j< zmgx3fej4@XO1!x^{}T)0>i&8u;vV=-9_L*{K$2P9>AvRUJ`RamjP$DS8BMaK_z|JQ ztA7pt8E30FcB>{a_pg@%=`G~v=#9wQUgWQrxo+7gh+sqlL0QpQqam0GQ&0 z3<45I7(Ubu753+L`3DAGUOKfsUyjhw)4zp=;xEwyNO$SHi77*xmiwFUe#pFo7X+!a zl1=v@#zcsk;!S?$4LCfzI$Xs2IWHTR2GvieRXu7+pVtF>RFO@+fV9_cR)u)TF z1O6sEAX&7SAoYazqd0LVO--)|s7Rn! z%ufpk1f;-Y1nvwF+1mJQ&3T+;X|hakfVf7p7?T7O$=wdYm_|sOS3E0TFeQRKG0T!A z4#)eBa#{SCas1~wYA)~KiZwsXC=eSXGF8@P{hl@XfEvkQQw@DIp&f+rLo}fyI1o{R zfiDD{*>v)w!URZJ&;mpVeqrBt{w{W3H=ak)u3@q)=ia>^c^#Yq77R{1UJ)XGSa@IY zL6wMk)nS~q2kgrN2B{tBuC5N6>ZG`E#nxHX6d-QRQyo_)Fm zt+FEYS9J_z2p}rPCk@Qn4D5kmTG}h;*DOMOD~^84s%qx&<*4ZdkWWgiI{iI6@-!qoip&e6&v~MVMu@iA}E>on-1@) z&S%9vemDMF@9GfcW{JGD=RO{OAEo)_n#{Dq@dn=E@^ey^OI_}GKz`UaT$h~O@g6Ll z`J@rI9LZRMZeZ~H6Ifz?=h3UkS;EYWaz2Nx>HG3tHbAWX3zZAVqc9|$(F(zgAtkW- zDndhmMj9L<#~Y-p;k)b$)y6}Cq3zL^(!KY&!`ZTLr+v=XfIZWOE}$;6VRu{i7qp^e z#)DUc7|f{)cfCdVj8rA<$t=mGwH+ki| zWP6@MhIzTEwI5w=*bRB!5_IN6_H%;+O%>?6y4|wfojUxSU;?<8UE=R4l zIFDSC<(wsrAo)su+5UgGO_^LpKv1@ik%0BreyS@7Dd(qr({I0FYCZN$!2h_K3)B09 zQQ?ur-qt|*`P$cDN3!SEvIrpUzUmM%RZfJ72SED)L&I(}Q(+G1GqiOySR(VSKTZ5C z#l2)9j8jieQchm??T?Vntxn5(tAS(q|E^?2rE^8$j`DO#!-AVsgO6U|qG-q(Tw$H6 zoyu?cLn@RJQ@W8pVCV-2Nl$aaDCua#XnoSdHWKC3k8xUPAW!cNO-59A%RqJ_Z(#_v zkVVE51!Y=Ce#y#3;bP2>!@L36*j|!j*!%BP1kf)<56B_SRPsU@E3GRnlr=q8X9act{|wquq>WmMN$Llw^|#VW2_29a1c6dqn;IOnuU%3RFQqU$*{ zzth}OlzhxP$Ju!C)FpOv&)GZ;UD&=YNPSRHblD|V%Y}vvZd|95;8MJh227&V?sjF9 z;y_yez%Cxti=79jbLI*(tgolizL4@8LL3-;t`!$mVUlkACYRWP5nx|wXv6)19}mU^ z!vg9rmUVf9*^8$aiA*J3JCZZn(sk5dKWKN?c?6&dbO)!&Gid zS6AoHgbgGK|7>**@9N?B5uzw~eqcw)6&rbOeAaOny&g=4y3`)~B--5v*ha{EVJ>M0 z&rP{0Rh`I9)i`X3TzxsO&EpOwLuPHcnbkoS)EP3GdhtyxcU63-^*|%GqlV^9LYj{a7u>42@upOu=E!D-vkvt zI3-SD=^%-(@7A8{y%sEjB3`zbs9+J2=HW64<^XeQJePEG0tr&DEcb&?4&^s@9dn1U`3#{>U<}Hh`@}~20v{5 zp+#58LU<#D@HmI7kap-Ea9yw^b{3E>7T4Ygmtc?mfITz9kOQIJXg5ry_;v0aH4dDNl4R42(h_q+>=Asj zdRg8#Y~}N=1s(VxC=dC^Zw4>J-rqfrFI&I9bAjS+yxq;P$GhkUSZaSD1#oKDgQ$h5 zj`Fqp`AfoJSctB)(J%F~?Xvt@;|KVnvWHCL$-@q^pM3^c-Igyo62Xr4`gkAjL zCaHBMW|I37Hgo6kJv=Q-pbtyuI$5Cb`v6ZF@BB2Gw^gj*3;g8)W2o_EYvZkJ#y^@s zJ2glq12iq=h~n`J1*q6*ge+hxutqTYYdTGjaw;5y2mo|Zh(^pP_d)v=;&JTwQp`q) zN@%D=anqGpiIiSMM!}Gkrry3+$I?(6oY-_;EpD*4=Q05VeXgS!pcOB;kv9Ej`yJB4 z!jGxlaN5b4#LaO|+F3z>ymQD^koOw*>V4hg~A6_8M z>k(YawZ*5458kv?v~KBmpv&RL!QaDsTq9>lhqIq3Zeow;%$5*BT#Rrq*6;S*JD;+6 zP63lcGXk=(3kS*VagWSZU_55`tm_q^&lCqDV!A=i%)A!=T?7`dY?6himGxh1z)0Mm zYoM&>EN%)q=UKTV%IM|-Iivern$tIxyE)A-@a!@#i?I89HQ|3pmHySmXAn< z71@guH~(rbR{-HGC^h4N%1T^{bOLP!7gl^%MgSjO3Dr--Hn#gTCUa4oMF_TEKN5p$U!I@B8L zyhpq#QlpzU({bgejKxMrzD$zMQ+~w4cUknV5*~Y?8A# z4|J|?`_WwVasl~l1pnF&4_!aB_s*x!wc_Ipzg%D7Z-w8%2HhNM>bw!Q{teKC_yJ)H z+(QO!-Es*WcfD?{RT+g-{duBcKRbBEv6mH#@iu-l8gvjacRttX9&J<1>>4xZw{aWz z{N(n;tPXF|Wl0+|{oZ6$MaT=QG~HuX?7Z=t)hDREvsi?=b01BF6rrDZd)R0F9-BeS z@bkmEm=S@EOMl3S?@1l0j^%MgWIAu_)UPp}N+s!~Ip1O-;3ZRiewpi=%37IC>Y?ihC?=cV9 zbOPnYPeBsG?AKR&T?YRABab-t3%tUyLyeRu;QauN*f1XW{XM*U4WB{(X{OfZ>P`yv z#z)e7OYDXh&ZuTpSr)r=*jl}k^B-lXjudlLSS>5`%rHp;g+QqBn%^h%hDN9Nwp(Hh zgiIE9eDNgTR)dKS-QJ<4f6(|xu`w6xzl1H4a<+KmF8;pxC0y+RRxO1I>)A-@jc_Uq zpVtSsNSsId7Q+m%zLNjCOY^!HukrcbjHUsHr7+FoUUS2Hrq8%iO6BpGsjvt%9=}Il zs#Xq~d;wV&)hOIj<5aW~MfVNZ^jtS*(`vRLKCnz_{~j1a1B5nlv_+o!w`o9bXI#Jg ziaMI^{Lz8{G!B4fumsxY{4&RxG77d7qp8dt5AwOq8epM60ndl4zw42W0UECz6GHtD6^oU zlZs;{go>pWpKvAHZIg!$XrWXmbN!j!UVB#)6MOQ=x(q+g69P#sFqAu&EqZM^Q60w1 zig)J%H=N0MWe-QJlD95S{Lv|K;#H&Z*S^n174XhU0|yZaXl3v3F}SdeWCvL(&rlCe0FQ2_Yow!jfd?BSe92DJ(< z#()kIL2Gdu59rO7+^%8M3M+e$16EgR6C!(8z1XVNffio#_5zCjzsaw`G)R zXbsv0ov6BOfPLBk?lX;vEE34tah7+{+(Bmm!$!6pg|tPVv}GGTt%RH)4RzcdFPPj8 z(p#DVMnsm6`pr(19$7sX+T5aqD zS8<~LzPPS=bD(}xowUm&ii}A99V?Va%vOxgQlY4)Q6IKbITkz%&FW&kHMU4zy#5&~ zgqN+zf0lTc6jg3dRKoMY!F--pb+1hxv_Z_b5Ld`nHlCl&J_5_eN(nwEnjSho6W?Z|Ud)Esa=RWUHfcq7 z=PRxSHDcHsb=b4A4hnQf#8HuW{NeZXI%fa)D~J9-yak3a$~Lcm28$5rngD|;J=pPI z?)+31`209`*a{R^v@O}jCyVv(Z72V|d&?M#fvQw}lq|ZOEf5&?ug|Y?{t(EO8A-C> zuq&=Foze2q|y+IOd)1i0Sw^E;b&`zlC^W0M~T5$12GB#R=- zAuw{k8|PqXYq3S$eK0rKI|{ov=+c$jao;`X&Kx7^g&zrO-Hl2)ZSGCfhdLi?^Pghd z+j5(;WYFdv^=@ptx@yjOc-a&yVr*!_!Vq{KW2+zAd75!${^TX;2&cycLoaq%@h4!O z{f=Eh@B7~u3=Bg{`hS6|yk0#uJmeKdQs*1v3_H18cmIrn=8|2o1x1MK!6YY%z^kDY z+_eKFnczuAoU$l62vxkWeK(UoJX1DRGMm~dP)HbZw+2dCSRQ~4$G+?qjb}#1- z<-S@sJFVL|PtbDcrzX>!%Im7SJ6oE?s-?*}Yf=BXC;o=4!QuJ?&$=69KE3NI1Mo*2 zVF};X7k~H_KlZ;t!T|gXpyjYT{$+3n96bTb68;$C5A2|lgoT%gWwC4$uAhTO%haD7 z#@{3ASCg$nH}UF4*PwQ!t{5%i@(MXX4m5P0bTlFUR)kh^@+D>^jANI-U>KNgY~0#x zmwjiwCqOWkJ*Y?jlIG<|P|Vm)y(TBUDj$+m|C3aQh5)wsQXYuoWx0z*>H!S zQIB>@b@2*&>sOuxK4!`W8A5f7VGfq)^6ka%_A5IIXlv)+g|^UKvKoGBot9_MBR!Ci zXJFsY7jzPn_u#@cz5>2HcI0_wwSRmSc)pHQ8>VTp9 z1Wd;b4I&(M@vQC#-CC!{%FGw znz}`ryFh+&j2Isg6V~cxCr7{iRNIbfB+(K2TjOt%z)t9Oa1uh$W##p}k)Vbs=B8P` z9wi*;U^rhdNi{yKUXhB^2`{2+!O0@_=K3TqiKu{wr4sIpf_sX7U;-x z=-;|Quy&FnGmmiiFc6a*R4qBFK$Tc!+O~ZV4diHNT)89A1A&^l^I{P7gv$~a&?bQN zQmeze8DyWs=RQ`5lGjR>vtJAsAOdZ!G%Y;Q11K-g0U&J)2+w0-0+Sz5v4~Rv@~lkI z=lLfoqla(bJ0eBHP;f!;cVFhTbqxqyHgbo8muQD8OG{b4w<+X)lQ4ix-n?bl^*urTLJ_nNu?ix@c*2T5&{s#T-+Y# zxeK79d4aa{-%uTVgBy)YlTF-vC=54aDkV_~f8O0S!Gej$X95)qIk>noG&}YlA^JlY zSg92ZjiWNUnbrDzNi3YA)(W`VIM;eF$xHf*7Qh>H~kbvekhDHxuAxA=wUFl zW-&~{V{$1qIvjMy`UOP2*$f%{KHh={$MBJu3y{evRej-|F~pu<&Wrq=I?AF+xDTR6 z-jtwCJ<|@!NSvMaE=G}zG!`3dqs54y0NN03V4`3mAp2+$ol82(Ybi#D-#V>0JKT^7 zd+NfGA7iP@8CoeCJc2K#t`0t`u{paOVwX^6Y(4xDVG?%i%&8ouH5rI44fPG zid57jDIvY2rK?IErllH;StkumSvk4VbV?YhD6`lFHzIx$i7t8lWZAWHNA9wNyqY?> zb4{8%(=Rw}wNxe{iAQM-&3xtgrt#=dH53iHP{VdOZGz~G9^pb={cXJb(!IS+I9^>O zH8{DvH_&rnLYt+A(M&$U%OUdA2qqft-2K44SvgG+<$-l^nAmQE0`XYSdbqKJMPX9- zpgAEq!5*KwAV@IZaUGp~`_1PC_sTtU1C%s9JtdQdh0$)m12K^}TI@?hu{yq>B! z%23>vCOYkqCGi6LJ?#OMm*8m~ExaMY=6=G-YcldflN0Bv=jALwC!n#f7~n_*MSKC4 zQDG1=3OTWHY=^=Mf#AWSaeBpAD=j9SN&(y=)C5cLalc?wJ>+hT8Xl3}^*_t^uk|w* z=^qXYnc!OW^F}z`3j)KMOPzH6F3)W%Nk}XczptKDo0%)Ne+d^R%6`Dq-CJvhfi zL!)M%lMheed>7kuHS+0X;d#bb6hgVS6gv;dfY?VN6Jx}hO0-0>!Xat=1>FmrmJ3Lh ze5ls`%BuGPaJuTqQW6Cg;g1^$*`kR(_%S@323q_iWa1**g+*(alzAs)I8A7x8;xh}zt1ckY0)}%_ zw)`Fl*Nh30C-V0N4RlbQJHq+h=n~zKTQ=%Y>Nm*Y5=Uq^?x%NvfF+v7-wv#a4zyWa z<^or^KrPa~bm$VC+hqvEDevNi*n!A70HgE`xDYBJ?yd?H-*!1nuUE-OGd$n^iEH;) zPTVV3tJCnakg3oFE=U2}O)i}s9+>E^S;M0S@rJv&+wQnTT?}1lI!H>F^n)d0k(TcG))T62~aw9m3G)uS;JYi;$Av)JEXEh$~{A)RDipo%?Sk+=VO) z%n@=OOMd4Ad>gtfNW1uJA4)QrhE&;^eh%nJ5r1yS=YudAjA3h)rq}ja^xgK`)D*W- z4i13~00?WG?tX`tG2OELz@!Y(FCPlw^vu8JY$9J~YmEMr&}qtsD$jKFypu>H`L+T? z(2~`3u#$0Ie1i-R7SC1k4$~xHqEHQ;#sCGcz+}Wf<~>S)9135jdOJ9*>fXBDJiE$D z8hHPRbPj53D$fk3Wg5k1u)Zi{JhEwj9CVo}z3u`Iz57{_TAQZiIk9Vps6{v-aM6l)eKPa`IVUMEsjlK}d=eyFi)`z9F0yvFIz0o|W-v1s)jYVKJr-8yWO~FB zKdprHhD=(_TTtT$O(uh*3Hh*|zi>Mm&*fpZ7jXMCA%k_)BClYNT(G_2`~w{#!TKH> z(B-<#HLb?vR#|IjTxIwNHr+2558k_8>6O?n8T^i$!H&4w^%&yVNIEVPbFquGGOsfS zRUIz^XILhHQ-s;FF`l(^X*BEv(N$ixikM)ccAgb7usl_nu%HH}JrH`9t|kkd~u z2KN5e@>#CeRRGvoRkNnLDHAY7KZsW&h-%z^9mX*<|DgMyW)9d})L&7PuL24yxIjH* z#|}9LCJ$3xy4aXrAZtjA`I1OwobE?k3?IK_-{}Jc`Yl^ThxPvE&0?(l`MF`QJr^e+ z7Ax}{xMz)?ULF|omZtPd=1h;XlUm$Lvdmr*^#s@MEUIixyqOUva1&48&o2Q&R_U2#MGVPnD@2pn^rK_ z!{mKR%2pQd2l}WG zTmh7T+g!VLBj7CMnsty6YxiG)Pbgo2OB)E@(a#VPr3o@z;So zPBUcZ*2Vm~zP;9TO;$sO02W=i@axlhylh_eJ4yx2$>Q9rkODYv*co$8Ec6&hk3fh* zYtbQzq*A9sw1ZkNVrY-897{GD^j-c{Kz9_A=1&&W5qLu*m&*qw4$s_iPe#*4gGF;a zGv=_`0f-ipW|N-!+3EU)VOYOg_2HU4da`})!TLSU5k!lIm>^4T=E=8g+*eW9A4ccc z7OwfE#4J)OR0Aq=z!9jfg(HFPY^tSDRZm4^?(3!`K$U72=*S3(bv0rK-OqgYHLFae zC75h#fZB9)WI}h(rIh`wyA)f`^}isQjG-1tX%K+F9rq3Ydc$6*yGo91C&b;%(ZdGE z`UrQn9Pdl#!kIj3Jt_8PPXr?-R1gEG;tRWFVlxcSr&|V( z3ZVwD)$vLzb{p-gxQo$;(?hJSiwHPT0{tG^3lB@jsCf}~MT-GE&{?_lYV`iBXyPmt zJrUc3L-YGhmZ|FHY6XM8_oM#^4T1j{5Ew3A&aVFTji`kGY;mjm8P*`s<8ZhV-K}m7 zoX$rWI*f1oFL6*b)}?1T*7zxc>_*{B<>579>@+OPpKR z=YS|J=s4E zc&{e~HKgVrg+7Nx9m1$r^xO~(%4G|Txa#7zMnzvL?%C^vB?9T4OI)>iUP(->#*XRb z#rs31#|i%S7;=j@M*OX0NbNKOHfQtH^+wnZU!!Os=|GleMw9NaJ zKDzhieH2_{Ik<5bG~JBZmb=BZtH*@C zYY4s{f4+=R_jx%>?f)9$c^LE_1{7}ZPO(&rxr<<5ERF6{H-gW{viMq&uC)#+O{p0A zYWV0KZpZbLmpgErb+dq%p=G`Atls-F3=$8)(hI>?!HfS^O!6Pv$buCA6#1?Dd)DOG zU-=zwh;(ym!#Bf*y&}D#qvxUg7W;X?RCmmUnVH_B%=8TDo-^s8U60A1lEVBWGn|zf zW~S_~aiprvSUcj#W>fGsUN!J$-EW2?8{QF$@%j*$nPrW^^`G3H`TRPGfB3~|+qYW7 zajqxuCJ8T&%fnNT70`8&m#=%$O<|~vk2dqKR&DVju+Y?0^+Px7q5zl``f0PIF4lXZ z^8q8)FYIR}@)@(8d2#D1%jQl6^T7=JR+6d0F-Kw~8A2ymh}Lwn-}js7o_%=j8dW(< z2`#ZF`tTXgHvIbif>h1>KD!)?@n2nGJ6;FHz3WzwG~l%FCd^> zBWBZ{Trd8C=0(N{v+;oZRMp-(6MN@1zl_Y_k04sf^O3b@g1y14-iLSQ7a5uvj(ZjE zuFM@(D&e-n#wY4hveR3gSsGXoIkqBOtE}Z0$fw-SHIskSK|nSd5bt(GU9k1n{PeYm zKacT49mwRluFPWP50L=>OsI~}&Mu_ihV2!L<7S`!hjID2#IA_~$qS&CNRM(5h;S(C zrk=n82+3gR%r}Iiv<&xzep@kI2#PQX+B!^8aa2D8jtmjP29k|7POjG7!kK6!^3ZlZ zzzz=oYARWu3OW>;!XW$y!X2#usr_v80y$mhix*c>8Z6ldV^&0lW3dp0B`u#o&lq&% zfe?`l2Wrc13lL|D@o0lSAz~hGajY9EMxRgM3I3^%7*HSJondwv+&C@U=T5T66jss> zebnw-=ldvV64HuUc8y}{WT(b--laDi%h)*|>Ga3LG`4m9COO~X%GEn8&FFb`>~U4a zk~iWWrJ0B7hKGVaqi2>77grQ3y9>`Fa}$9+h*4gpqZrpZJKSZ3%GH?`6n)RNIrWDJ z$=;H0@<)XQk7>6K6IcE={~QthS~2>l)ZSu|2JLduR%>+c;iN(;gyGR=?hon47N`ON zn0hdZ5Eb6JeIYMt-|YRBo7pxA$bGaDt4Zm!d$Kf*Y~VwX$$#H~t2=y6U+e9EOeTciqnD z8r4(=-a>sT-*2)Sh!x$c&dv10Cm2+>MES8>!9A@XdRe2pw^ovC5Uc+1)F;ThYd?-s zH?o$egY^Ul$;WOc4hG=tJV_e7WEn@he4~H>d0>79!k?Vh zn0zKM$B-R$I+*^F#_AfXy~`WPq!ntWy_Yn#H{oW)u(&vwySa;d>2u)S)CI(3-*31( z0CCgvwdQfnFs{7#$;u8?gDjl|bZu2-daarOCjjK#U)`nnvDt=^Aei2tBMS=ZM0Yo% z{LWhU^3?$MwLgw&csno!X>+y4>~Bst$FW#?!7taA1deP`zcssDxi4f4i^3So*m35L zappGp%p7Ykdh|d*rGOvDR)O_V(LIuv;lbUEo;8eBO2NF!lGnN- zCNj#0H^Nr?hB(WOskD^;r`k8XM%&NvTi9PPSiyKbGrLMj#%CCf0{J;ePhm0bju&qE z2zZ>0)YjsOrHM%h@$bPnIgvHYRj|Ci3c-_y?xX1(a8QuD5p17~U2<(>3NKA(cRsCt z?&pJLGTi0_oyeZFk7ZO+(MXBUZ{GlikqLCJNEaL&c$%GJcb2vG`MaVU;{* zw$U&-ADDZ$U+C(>fFkn#rwUZFhpUqjq>rbi;B z@O7i#C4VEnFxjWzisx zjHmOATXzA=Qpax-y~w(gjLJ5i5!ZHTLiNN;(#f)Z@0CyVa?~keE`U-DR^6K-^6h;4SVBVSmVf z<@0BN%LrfRo~{a+6$i~w2ud_LK1u~i9V1;iElZ3#)ozr+xnb(Sj=$A3j{1bnHG8T! z8$N4m*NAI%%5>mMam7?7;j*+ymJnV7q%tHt*>ayA4pI+{4rc?Xqsw!xD9TJ{02}H4 z(l?^6<7Q>fzJjuL_U_MWs$bA`S&@>ZI?XTE+{F`dbvvTSW1<}aj?YPO1(T6vkIj=F zbVj>tjDF|r^|`-AObqWr8{SpZO&i!~RASqO=R_^^Bg1A7p)z!Bgy7`e5f1{=x!>m+ zD9MYLuJmwK4lyg}7xp{p9M~xy|#qQQm_XAKr1d1AM^aHF^37l2z3^(kF z71g{@8eAuHi&w?o6Z+a3X3J?-%5{c_AEISOssR$$i+D{cp3-rlpzWy&1$e>R)6?u3 zmcUH=<9N>Sxfxw4`pco(u67mIw!QrssbvfnIGs^fEf5V2QbY(2E&yJbgk&rW4VE63 z7An{u4JQ@q!;#}NT)Tv>8*w!1L9*y}DnIMOr>8N_&SX(tu3XJv7`pVX4eivxm=KnISDKY`j4tC~{i4wJOs8cgn<840))Da&KVV9o{odN)pi24E7S)DS1hhdqa}#T&nii(;by8Y`o3vOM(wT4 zSJgvFwBw~WdSq^h{9%*D3j$dqs*O)IwQHcKs;T#$dK07Y+8wS4YB&{bF8H$=7Zm?t z=nGv*4UQEhoK$E61!pX8`svKg%+Lm&R=L6?+{f5^lWPqNYsh{a%Y?80Kq!a*3#1>@ z;j|-T_W$tp)p1d-UAxi^(p|$4(%s$N-6bI14bt7+jWp7Yba#hzDBViK8Qt5x-|u|y zIe*UlU}m2CUU98;t#IL12)Z_Xr&DV<27V%)P~}^r$$x=3X$|gA7a9cL?~xn)bvp-r zxgcWwFgUZa;h+>Od!(Nu6o55be%R&^|2A}9YP9$qRIygq_s!WbP%boKNANScQH3(6 z^QMMi@u^RX8pW~{>-Nl5Cr-;}3+2{jzw#qX&SqP3wd4#@Y5z^il3C>XMq4_SGrPVs zVbvDC8?Rcd;$VscDd78xi-cr+1l3^78l9@rn%VO(fuc`9BUC*Iq9#L!!0oGjb?>{& zrQ!6Pu!RbZTYDNjPr^$`fk+0;i@qfaox*rVZn%q9I6eW|UU*D{nzxbICl=qQ3R3Yk z#P>*CxxRGwp1cS4Z?iQ&W!5p>xee%_waX*0C$voGiHmXRoew;5NW@0}q~5ptx*9#; z%rI>?5u&WxI^3IBuYs#fIh)HuUW(8l34i|;_v}r__6uV$4b_KV5)B5Du|Y7fmtz{C zzhB^h{p`U%-zmbbgl%}H}s14o|1MON1lFdMv-wwt+DN)0o)ajiel(p z95G_)JBO-s@~;Q)Rzr)5H}6iTO62KRibQq2iKJVex;aJDyI^!5e-8f2RsAvuJpA*; zAmMJogzR|1tl@hAkOrcGU;ps;kd~gRpDthS1*m4d3!N0mN3WErnEh}T3NBX)y{gFk zfq7mvCPJAdYk)$#Sl+2zn#*8p_XZ^gl^xjL(h?6AL>QM1n1rra78>g(?PK-L9rvny zh<4u8tWD{MMrRIML(z8wt6UVuNLDRaD^Rhgx=mgZ3ZTZ0xXXEz@^>5ye)NG~+oTW8 z9=#KKti4i5Nrl9DuZCH3kj03p4&&g}sexgn!nh3$sI8@5OYc%e)w5^up7=1LEYZ@v z6B&A_r+850+v1qO-UbVab#UQfB12AFV>E`Nw`9>HwX}eWdm^ky)QFC1J$Bsm_*y-^ zIW0)N&NFIIBuJE8^VM6!_u@QWIpF0X_+4RI;!c;vC~;-ZM=uDyVfDXcC#YK#Xz!I0 zA}>1YIR4vSqEd7-xPqgI99(S;gK_Mbj|=1R{a8ksH%U=a=Z#{#0?Rb%5mcDz_ESp& z?@*31=)N=ug!&c75h1qG=eGvxD>sWLs(p`4tMevj1zUi^%mOt+*kG4l$Q-`(iegON z3<=K$|7{^*{lmostyswfK0|(*M0@p5Ooo5e{bbksDKk{sPTUBtb)=?T(ohIIf*N6B z=c4E>OdXohJ7K95qNWnR=Cy$u>ccM#65(*GOOz?cj+^sl~9Yv6-RSRv(fH& z#j5!#y%QbBWXTG~7XHzm_Us^Dp<0slo~oR=x9#%XUZ&h|;ll0e(nQ2vZ>TtwOj*1- zUS|H%7nE2Jftzm|yVLhyTM-6AfFI2p3JePKXC8$O@yCl`U)z(Qu&b)7?v5%x+k<8# zQmf-H2Zw|lT>+c#>T`T1La!iu8k2$XzOCa z4szBA;94hfGjXvHp-omrK}k!3$A@rto)-8xr6cwV&UYWqI^gl}57NfL{@ zppIFdoE67_X1|9geUX&nYXd(Ph^wdZx!}uW^f+#KPs6r&L7_=pb~;n(k@qRm?E}6l zjPk*!x1e3WqVn?cxlQDnte19BNwJr4egr~FgeXdi{@3zw{>s>*YP3LH-3(-Tn>@A{JisPw9 zpI{^SM;-=61O3+nRZGX`U4blof%0RbI#c*xR`Hj6XM+SB5Z^D^4q7Zb=lt!CTRb2^ z<%Wbek6Mod$j%2TLi?^e!ym9S63@i6E_XRTJAG({@%J+%sd3Dg_~zp39^3~?y*+e{ zcgQC@WMj&=D7&qNH{Br?ZS!VLe9&a)ARqPCQc;AFsxG-_`jPjU}lQuVJIBk;ct%gt9>oEpwY043PY)5($ zlvX--kJW3jjuo@$7~uebSXUgZtW@+OcYH+c(}rVMv@NjM%M;KD%%F0seESu2`e-ql z)6-K!j(8C`-S1EL*Ta*O$m-YJqec!mO79nX^wnkQ>7+;8pnYfurdMU+wJ*pzTq@DA zY-*(4f*`@n0tu62gfm`}>_s5m2iP@i0ckYvv_4mZ@QtV88WBgDnE4=q2*ZR{aIZOQ8omfFUfS@K-rsii zm&toZS3H)bI(aEEc!jbvnG`f3pz7+%w;H+WC@e=qPR31s4ySLa(^jZB3uR$iTxStr z2+>||&lv-6x*DuzOJOkBSnr06y#!JUz+7E-zdS!;D)Av`EGIzKzpubLSq;8TOh~{$ zAd@dacUyPSK$(FuF^xpvqbY+E!gbr+(Pnp7*>weEgc}2F7@Z&;t#2jF;@y z!T&>rTfo5eIc?NRYbun4=@mn`40sP-y6$!m8X6mWELf4-CPk^2*VZaw>6VpydIDjR z&HX_22?ZgvgctSg@+B&jCbBuaPjE`#xO8Qx(GPWH_e?M&v766NHcJO0zj8PpYW*V^ zI8xxom&U*k(mKB#u#Tjk#w;Ze=&Yj+3*rG7mt|=YAePT7gEB>ar3=@eK7;x(AY3_^ zv}sv&%}blfBcZT6#jpi=^!f-T=S)clod~Maf~U)UdI4A%(J9Am=Ph;!!iTE=eBZD0 z3_!hTJE`F!TsEAGzX059b=q_3U9=pEs52pIqnzwDiHQWj5#mc+a4Ok230dX&)Fo^= zaE#R*ND+kqposGJ5t`a!g?7k=C~Y`q%dz1qEk_q5TCw_I^Pe|dr5@fWQB zjErD0TS3iqM5C?Ul#pjOMfouEl&LN1A z2n2QGQqlW?+giY^`(bocL00Q`da67SkFq(dK$ArOaZYc+88NsmhLAx!A zHpvXPp;C>O5Yfa_-aK*=QPs4kg64Ba;~gVHMBlpZ-UPnSov!L0Ufk*-o_%y7QK zXjv}|z8R)Gps|#yN$}XEyJ-O-a2*+itpe$u@&U9L053qTF)kcDURTD=I0W5pFCh z0`?ENwaXzzh3RqBCTD>*xI-o+*$}ppuUglW=1dyB%of|9d<`{|Za+V3ceuH8$SQL4 z-fTJNpI=xo68PalNp}SX=gR+jM6)-M8+$Xa>fQNKV3F_Q4FCWLu;Cev+-^+ioj#rl zUOEMiNpim|Hqzle22X3)fxRlP!U95vR@0|{*Af##!6rHW(ERTh;oy_Y?Rv)eCZq`luLek)9g!Zk1mW@ zw6Ddqj4=6>)~g}BSTt%oqU;si|Fq(xSkiJwMMp0zx-FxHYYuv&bFk+oW=;45l!pe9 zpCZoA4S-%)Op`2rA8lNeRGnJmU}dwVd=ZO0rwqABH%(TDx_mIHhB)f@SxzD`tk7@M z-fM>}4zl54Vy>s|4!@ZJ;}!~hoPB5~FZGd?xoomLPNdYz zf7~N1+FK1WAq+Is-}fj7ZmqQK=|9nnJV-wHV>Pbh0#b9jcPDkjUxO~pDt<%t;jCT^ z3(MdJxgM#a*0UJPcBo|euv82i)6jp$!uczz?UVm5stgMlS{>$pIt(0YFfT3CR&X%h zCT0v3V9n{Ad`t1@_H1c^v|UJRIjmU)ZVELS?L%DhC^ernJYh{n6=MljFRJ*|Oo^S; zTX6K~H(DV~`}=_%*N`GAP6(6PU3s!8_0s^u4vxLI5S1ChXPcKp&T8wGoES&t-X65j@;};06+ut>WW5?s9Z5C zIRcQ0O|1b(yN_Iaf5w0bUqO>s2-!Ra7G3?h<#T&wKS;fPTWMKYaMT-=)*hZXd~h-* zD|Sdt<=>vlJ`i%bTuhLOxVkJT2oeV|#9k}G74+UtPdGXyMg`e;dN5<55{Z3aDA&${ zR!t44L?EX(vf9;IY_Qv$wb4BFcFjq_K3Hig>udYa_Z)$3@W<}SsVS6H@_&*jfBl55 zpQwgPVqxEQejn@wn`+6Z(CGcjO$_^ zOJ?o~(DKu*3Zq-L6y|gjprfN(ZgZglLA03haoOTA5LvJ3F=$2uk7i5fZ&?Q(pPITP z@)q3|@>k^|Wv=%uB@G=1w#JC|pk$DV*X@qoVij3-h{F7CDHRm0n0>02;vwmnxaq=h z=~B0rQOJZ~wTL2E{Y2Q2Fd@Nv)utL8&t!<=ePBNoqRC7^rJm?MxBaL3B!U>pzdRop z$PEg^-ROP7&!BPm%O&EVLz+$HR8j3c>iA5d?D2B(S}j&GIq;f%h_e<~)@?<6jtZ`K zof&-*+hsF7G$y8(lkOqBJ&c!>yLO>jBnz3;wEXQ~{@fd^e+{IlGb&aj5Z+%1^`iX> zZcY4@5Y)rPO2W)-q`2@|gNlLz>p={mW+&!ey4Eibpi9_P-K~zfoE#ifD?+kW&HC;g z+=*|{6cfYhvQ)Krb;8#Ssrc=b0>slhXQyvLWn006sxk1hN=ccr7wT~X@F*1*Pd&%6 zFj1O8rce=7Iu`S=Y*_zV3BPqc#J$ykU~GSwj#{@M z=ABDXKPX|^jswD-65!4l-PgB1L)17f-9j1_JEQOOtlHgpnjK$3vm%=7cn)R$6EXcU z(v<%C)!x+&Zh4cZMDeJ#7sm3olXty&y2U*@Sp_A(6b9$k+ZoAxwYxO*Z>+rvj19AkOLoc5ms@{AF;TU6V#24 zI=`lopo9$S<|Lm6?dO~{=qU9TMwyYJA)1`+)BKp9a>aY&hlS445qkHsN?37N+b@)u z5rNyVBiLI-*1f3lfDnHqTd8??t-ymLL;u{!f;YQ@6#c*O7f3&FHX&ILElrEajVy&B z6VP_!dD-CbT!30dVZ!2`zrw2-p+&?x7B&luC>=BV8;md?u}^5+Dgotm^dU?2OsW*>;YO6Tjy8d>54fLtrDQMWs{`}a^%s> zOeujRf&G})bRr_TWl6cBA6gsaicTe=vco}>992zb|4|Y+LBSww^ex~RDF~N>?v}u{ z^&*!&v%r@4OewoHhS8+OCMMLA28*t@(-cXRydWvllY3=#;74U$kn1G9xTZJhzX<7H za}(5ULD5|;;Akd~g3Lt2LWZ*xcL#W@nbbp!3RpuTGi7g@Njw)jY+356* zB!{SN$3m=ARu%=JOu4M87^=#YuPD5q$^e88MNGrD8Hn89u#~uU(c=0ZE3**z<1uG) zr7h`;eJBn`Yg`t?A5DH% zY5|&X@~;Vpb}%1`;w$2v9|(AyVeL9!`E#Dfx>RM^V-z`NqjCkw;B>VmPngpf)hqR! zU0spC*%$rSFZV|!?Y5QSzuSTUIT+GJTH*`#oHgaOE5XR1;nY*QbJt2Y_tRCjnqZ87 zvrOH0WFUBY=_bD)_Un|)A(zo0BI%b$2O3UJ99*3XzuTjYXnfnjq`6p_%)aZR%-wo@ zVR(IigJ_!-6|^3OND)PDg&l~QfcUNDzn(}G5R8HC6W$2)qs?*m_T2LQy~c2Mc3?V7 zeeLNSp`?OBpZB`1ckLsMtT5!&b?VMmPhX4uCE%?6*0x1{Ve8HT`%KG&k~hb!!Ar;C zb+q{TC+cumObm1+!yPWqMHZjOl_@zLJw3hR35A``WoFki%@gSh+>=*2ZnMx&)Sq`p zF`V`dWJomFuI)RpIu{f`A}&YBiHV6c>GM=g#6k)VQtxWd&?$jef_LxUrHP#13yaL{ zM=n2o7a$?^g};eRF@Ej&JhSEq=k{4Me7D-9lnYe6yY3@!#IU$Ky&X7g&_+ZNox%Xgg_M{+bd8`PGQ(}Njb!;;2EHmW-N zc>L83Ec83v2X&oJ#VG6P7HD)!o337j*RhbEWFpx}()X*!7XvU|!ZRkZ+g<{mxLs?9 za3dWqO3~tlVRT1FM>U{IN>w$rcPUbwzMw^_^Gi!KJHOU9_ifu7f~Fmf^2gf0j_@t3 zv=gScen`vU!Y#=Jtu#cB{7|owz}F4^eWEe%>R4Hz*Ep1`aYJ;$qK`0E;k4Xx4N zZV!NVK`?v%rJbEcDRw1lh_ujg_9l?aNo3V}#R{oct**(Fi@eIBAJrIjC02mYDlg^JP!JB2YVae$OSBmC4}O~nAWL=!+T8c~ z&jHAM#7kRgmyA%MKB_vvSy@5VDZ6vD5ub>tam_FVH~ z4F_!^8tM@e^z$2kB4n)|9wo1Ker=ZDWN(wXjcO$Ffx+Kc1EmB&lD zucpz5+Og=BOp2N?mpc@I5If}G+rg{4>=~KXQA%4a{;p9?&sO-u`#Ue1Zjpbi`yd1u zs(w^xJ=G9M!@66@yRjGmhemwr>XVzxTxPH7Br{M4+ldANqM}#z@1U@Z?LDXBvT|a~ zv>UgPuIuv5rB?81{r&Fe{6`fs*^!Lj8IwpS{E>>kG1_mF4uPuJ+FURzR=oC}5##Gt zZEBD5w!geh=!`Dh=TsIDpnoM+!-=p1v-;P$#FdU zT6R+tR>$j5tQ3_o0z0ZbVK4f_uS(H`$=*n7N3k(mS`gl^mOX=^S!3^Z7Yd2e@h5R=}*VldK_aaa?h|htSo7 zx`cgqxXCO2VQtXl?!$sVSS*$PBar>&Sci({o-|5I@Y#>eRt~I5Fd;pCMI_1r)Ma^d zkhPxbD|}{aZZ=84v^^d(^(uQD)wb!PhE1Lq#fqwLPEMeoTsJYs5RzH#?NtUgAm4_t zRxC+XcYk#?`X(A4R6emRnUB#V3#C?&na?~G&`Go@H*>pC3?ICJxz*lx>L^&KqDssc zW8nJ7MMiOe^Lw1S^H6gU{W6c;oTOV63tryBy_{SbU)^z@x)0G`=STujU;V0QAl|{T zcuOOa)A^2Ky!Xnvo64FzCI_y;g0YtzdgZg()650mcE=S3{TEM+DA`@16{%biPvOfp zow8~#Z627}kHyY2LE+`1h##e?lNXRfk>0ro;H)S&a{HoiCS{SbT6#G5rMdYiK-$^a zH9r_@LR564WuPw&2NR27-e@JEReDpqs%Z)b9L`$Lze+bMB^cqfdcys1!Y1v@6PzY- zR*W7de$9TWfN(|=q5}V`UR}!tjr9h8DCHNcVD(zb9(f7w;R2Y8b?lE(i-ef&PG5;H z3SZ%XboU6AAF0sWeXnV(A5UfO4DWT^saPoN4}6+0EsJQ%sv>9-TfUHs%Smso!y;IM z;83+X`ax&zTqlfP=Y|}T+jPCtH^qhSb_RyEoM@_g94X_Xkj^#A1gd3805A{_b3eG0 z>KiW~`)UP-45JkXR$pmJyP3$la$Q@Ctj^K6-T+(t-(>=`2S)ES5wi2o`3f-{)c_T5 zIOocKs3q9_x~N}~_HLRVEW_aCNU{hhnPqr_UTS3_2&giRvxk6O&X(NrsLwS6ETf4_ z=2LaSP5Va3T)l-uTwI0fV$9%nIeM#;y7Lb@`;)=_<;QwaFM6ACHW9Gjdwm!(t}Te8 z$eO@nP}RpCwgRtuye;7U{N^D=9*2N-9Ck_lj`i~`{F?cck@nBZ3#gDdJaqIx52q5E z6k6zV_HbQ=D6AQ%*v5_hdfCe@^gaDRQM3n*7lXVa@S_9ZfyQkAmkRhyy|K$Y2XfF> zGwD@qik{L zr*^koZnmNLQt64P=w5{WBP6j*=Hl|P17iBk*+rtkiiroqh0AXFAyn16_x`-pM$I$N zO2bcPngq)rEpY#Nivpkag*?w?EgA7>1Krf5WS z#-vm0daP4pD-g)j$ldWDgf%jj9DhW4RE@1S{Jk0aRg-P-PZySO*3u}um-KI`3)7_@ z1uGou1gj3p#^6!62THrP1E6k*ctI@I#QAsjxjcbXj!+318UB$!Tn>xybahtmNlx1U;76zL`qZG6Z3S$Wf|!cGse)91l5c*CSXx_IA`KI}LsA{yH}t`bCX;1@lIzbDeP4H$ERrL>C8 zuQ;Y=O+U2gI1oB6W;gv%va76uz>6f8mXa*Aq>O#Ejvbc~A8?RHmBr&jbhHPQm68^m z*sdR*VK@qr28VO1CDQUlU$krjPkENs-?C&+#W9-A%qRblP_`ysTv6-d!#~~x-f_;h zD~l>+=$Wi^%sZ_!&d5``=*xzvI;MCa=Bva;uV}E|9F4b-0^Wv@E36fdX&Vi-KVVu+ zZt9HoC$Go2@hb@E$X5Ex;(;>4Lfw?@TXrw@uxVWv=k;QUa2(OyhE;kOZw50m<7G_c z)&CpJixLN?)-2~SQVLPuCeDM#L@pFK`>I(M#h{v3U&Aw|r3aUpS!sO1S~vQpLJTFj z`mI{q8MD9U&l^=!IT@j&BrDSaCe*{S5l#2otHGr^_%+Wj$p1A*NwwukDS;9X40o2PHy2)>aL6;ge8?%Iir z3Z615^&2-SQ^b2eR!x979JC9HS16$FV{EUk1?)bnP=k|TeyT1 zIekb4FEt1C*(ACLKC};S{5oMjx&x_QDyazNQ@#dn9AAQRXkV(qHiNomw0vELlAe;- zCT&%omxMWTE6nr0DcK*;m-P$uaSHS}y8opq-NFcH8oKRABB(XasLLhuVH=B#kgH*+ zIF%Ox6E@;v(N!N)YS>Wz4VnJ6U5qcV2eMc}Gn$}@hN!5hX&e&x<5TG?Hm!ifer*5l z0>l@4MM^m(egfhOPXr>KY2+b0Uw`T;$E2szM9tc7QhBy8IZqo5inaG|)U~l6B4*sC zGsGCh0Qr#2ENyiDpD3-miII=qsU)Ke6&4yZnw#A&;NqRrwQXIAz)?qok$W2Cij;k) zsqi1s=De{~7Wq5r(#;8AY%=2miW24bTof~zz3V#F00 zp&NGPfzpnFCaR~VSkGK9G*}5CxTM>E@ONR@Tc17W8ksM7vLi6Tj zjAnoncF{XA9&U@d?d}wY8_hBU9CbgTNlDc_#+5mYbm;>Mew_T^&XM>0hPveCE^r1U%yr=O=-Co0wHSMeda zq2AVYEHTe-F_WEEH_XynKvwQh%0e{oKPK1KPf!%pt0(7RON@=}2GN&L{KWIA4g`tLpdmCp2BhMrmY3bhmvD6*}e9#!B8M5=mvxdUP7p?;Ua*@c$RKOOOJ(g72O3NA>oPjd0rDHiWc#NBVbYGHba>9n# zy{`G@3^#e#4`pn6FCIp%g{2z^oz@F?-ci#pWBbCUrogtgwg3s&A4h6p&Zx32Ht}gM z!I(@&{WyVm=Dd|%_k5Ls)LxJ9#c>y;+}wDLjg9u41fzoBfT-@20Z@Brjw=6;A3uIg zTTwnEDPCx3G=kS+>?xAEi&#AXS^?l1T9SA5oWCRLmPrd^9b;6B`Je)?_phe;ZWTfunEr4zZI}Qok9Us1Z3s|F9>*2(W(Zk4%pFo)OXe zIOu~|!XJH%G5|OA()&-xC7#j^S}O^&UJCR9Y2`{;@nro10H?eV@l7+yjyg_GQtK84FjiaN;{7QI2B1xLSw8Gh&ijlNFu zW z{2!JZ)}IvZuShm|t%12~89KHTF$KQPKEJ8YqWVVX!;PHu*9f{A4>rF-oB?*X&pE18 zmDPSRnT}j}Gi8DIM@6FJ8Oiu-UGb7SItUwIJ1}*ctd%m1Xt2S0pcM`>C(OwCRNZ^9 z(3cw}^VXto7+fS$-sDo!wW7ment)h0qU?q^uXvCtBU33K7NRF}La=@v`9^x)-P;NYR) zdoeaz<1^zlbIEeJUlBx5w>t$1^YW#)>;Cc|d0c}A7ja+#^hSQQ4=9rPU*@tKl4NV4 zQmkx2G5`*#p_n~uc4h0+idkm1dGJd1u9q{u!DcmN-s-dgxP4*$qC>`C=&>Jy>yuWk>GHc6-;ZKc>a}Afjx+{=xT?JR zdKFx2g4VZ2&18p%hlVnFL-e|WG?C=P5d+cCHes3ZXHBd%PmrahHHpcQjt2{PrL!pXBfSP&$BxW>gnl?Vw~`>W=z)uwo#GeO1N2co`~7l(0zJ;-;cJ=B@#Q(KWOYv z4|9204n|XN1&6AK81`WvbL*C5^I@?WqgL!-tLbz-60*({Rc@&}I)tmaSEKXdsJ1+1Y`F#`}SwzSeWD#aLbACIzYLBHept(Iwi%HexI?Z z7`VBW)%2R^A}iH=u0ZHuBtLc*QbQHbM|CMXTT9hZy*@TwTPw94Lc-H6h4q!hu#EZQ zq{PpcQhrrB7bR})e!7FegdYi!E-s}4Zt^3xmexU!^gt6e{ zwgW{nHNURMqQFbq08u8MR8i`m6k3p9uAgQ{oXo#zOB|+O8k3Nf#cTX5E%ILkg#@w< zuGFyXtmvH?GUh19u)0`q-$CpnyE^qQ0_Fkj$)uyYM(;O@3LM&6McnRvZyT3Xxc-Kf z!?g6|kU*7cQZ6pIIc8;tJxw5p#A9Uf!jsR=iK5Y1W#Vw7SaZR4xGaFV{=T1A)(T}l zHDIJJk5%oeSNzQ^p%KA>5N(S)zG);pyd{#KzRrDSWg%GC5!{_OPe~m|-7vm`>^? zYzPT=AZvw9q(!b*^BJb+8{h3k$3fo)+9b zN+?F7_PsqX1vegolM`1ti1@Ob5z8C5Zx-o93Hcg3|GUlzq}Gi3zr)TfDK6wc*00b{ zkSx8IKsJrv=fN-{`iME(znHYpGl`k=&tLqyb^ot&TNg^$<*zrm86RBQgW}2Fiu5Av zj=pbk(%Kkiqo(`I=KdQ7kwAt>fljCol5*i6UGvX@T%NL!8QapQC@Cqqt)%t(p8{o= zg=&a^{o1+`(l;a@|L6y4`u;l!sS*4R6;TD68+aerdbVD+g_VtviU|ZB{o*beS_5Zn zR{!qtmv>lGY$7`hR{SZg5KtJGR;tdw!eYLCQ-%)Wi_l)%cV4%;v|g3_ zvB~6h@d#-BcS|OXmQo*?+~koR&CHCBDS7foBta%l{oCBAq+kuT3B4fsbx{%T){MLp~+QK@Djydae3a9GWXBVt2Q(>0od7HYeZ5U z$z;3t9rG(H5G)-L(C&hcjX}eRe{t?+VLGVvOOD03x!y0NXeB_S!vJsZ)3v~FDHLmo zcKx*~65HH9h$w4~&@R|hyWR1fEh-;5s`VjUPuIgcJY?dS*^nNyyo_|4D0G_>e)Fn- z9Va+=qOB0|Z1BH!7zj>R%H<3jD$GA*DNHNXK-?Eg?2VWlDm)u9|KbAQOx!ELd$+~7 zYC9zHsvESqYSqVjHjuMv3;PXeV^xgjr@Cz~%=yRY!Jn>iPXWRRKhN$UL7S}MeiB*1 z&S{X8G4y3XTl%kZeMwwhQ;N& zt-pS7Co(uP^_{KmavP}6j`1zn=R)v(*D1jP={KCkf@d2vFGgm9yP#BkR?wEng|Rh zj}nylJ;wMJ7a#4D*!F7D*s{SbR~wpkzI1L;zfQqXToPtzAhv5^^;mJgLKA_g+_4b3 z@0Y&dJ|u%4{N0|JdKmDDpKG3kRP@JZ_2%EAPg@VuI*c-Yg)HpphRm2fXUHmo|Dtu4 zU)91{*@|2Qf2lqW45W69$@A?}VeM@`tuM6Q>sr9xPj!ML3(-M2ROC2D|M3(vl-kqD zN%oc)z222~+XiTCY|h)(Aq=q-`N-t5dbi;Ep050AWkM?^Q(F+=edlQwX_`-K6?gaC zlgF5r{JkujAFIrFGLV+90-*L8AS!abn$0(0&%-Z_gZ!nP{=+=rh(O9`^M@+9`39Gb zlu63uvWJNCvxkmiF)o+GwmWlq&j))rHJDrrn$B~i`YnkiZqZMlaHw+UDsJpH^nFwA zv6vN+>umq9DI|tS5mph*q>+dk1&eFP{LTNcID@C8UTr4~5;l4p%uWwi~`~Us)Qm9tmo2z==>z z?T2XF1?l(MczLB<&US9)d--2!+UL)@E2X8P%q_A|v08fTQE&c=GL*FSkh1Fu9^hdJ z1|H(P!~YZ-<9vkd-x;{$DRC72>v9+u;ikRPAh|Z?;emk?#`GT z+fmQne4Uw{75+)m8{{fo(qW&UeH=6r8U9_q_j~*btbqaPPSl_{$^l&VD+*lpMbq6P zZ|T!{x@KH=g&^n6636$;w1A1Z2vp=VLc6#F06uxwM!-a7vtb`-pXLv%uI^exq2jcw zh1sJ|r>fS=4Ff|LfhZR}2r}LtgxgxqODX@NK#=BxY8m*!DCJ(9hO?U$S4NjE;A+^w zblc%|$x%5zauQM0>?8Ot+MfuZQD}ga0$&WS)jrXpSFKfFEB*X8%|}WaOepR|zSd-H zn%tJBv=U$bIcUiyuy`3c8jFfOrT4U!bjp$}i707r<_obUC_mn?O7OZ7ZKJK7QG3{l zl5DPNTNbE}Ujqe&3?fohMX?FYIj~w=TM2^oKM##2(>!W+D>CmNH=%8bQG()2B~d0& zDV@^fX13eLiis@kXlZ$Q0EG`XMf{x^u$S_yz+hwC=I9Yw|(q6 zw#tCcc|YS>)Ux$Iyqq8h_-NgD%}hm3&9A=Zb*W?ztdk#in~yi%q@wrKZ9}7Z4%~`b zN=T7HENG#WHh&^ToP}TaUCPh*2M(l_LTci@E&n`Cs}*Yg>5KoXee+MDy5=k5nwRMH zo*OpM_Hl&Gy;MfJyCQ2o{g(^q`kIb(m;N5^=!pJq^r5Ts`|Z|` zh}gH>t9x3&;56=J>6`!D7{$gPNAHrxlk zGXpWOG?et^*X4fbY`M-wkjgotwEj+K2$HhOWYkxK2JMYmYaup| zeviao4DQ_?hGU!=tJsXDKH7p~@dXrfNd=ZMI=+{5Mg{AdHct3>ilacGZzAK_Ks>`I zHBxC}tj6i~<-60!Fp{`7-W;SwFu!kIHia*e;Gs?_Ni%_MNwoTtmyt;`nLeRBm;dQL z*1?CXmVq;J(pYRU3d-{G5xj0+p0x~N>zkA~C`1%q{D@)j5C&aP?9eFa=!Z+&57I!G?%Zm~exjbGFdE>2_`;lmh z-;>h&GnU`Y&5i$K%%sFf1?$Gjr9X6XRX||Kw$8bT6dayuBBUuyY?TJ*mt8CA`!`d( zSFkz04-UKy4=~GO=c~X!>hfELU_m`6Th3MZOiV9YW%wtRMw{ogA8#KmE@*NY&hC+3 zp4YQSfs07&giW62&+<<{Q@eWZ{bnEP@QKe~5Q&M~2w&5FM$#w6UjdB`0r3T-6|E33 z32B^|sq~G#UgUTEZ-*1A-ugwZM=4$;9K$52O)nxu4n*`8ps8x4p&q*gd`oMEY*n-G zJuVgW*NfdL5Z2^M|MY1>jCw8c6=U42Gojajt}0c@>zlLvt2lsq!Sn!|L6ue;aUNM= zEAjwT_E5+mz|XIbI-WLRHlQ4?ULgibI$O#wAgE-jPV~Xv!95TX% zTbcL~^43rfndKl_byQz%vzqehQLPI-4cWRoZDqDx*J7&|V- zml`AC;Z2&HZ;1C>xWDfsWo>Hcd!Dg1y!7O4_lCv}-VaXQe)-|h(6D6qUEcEIjBPmV z0|}`(G*K%L9{$Fre~P&Vb#I7-?@#a)i&DD@ZC;{hX#Q0fyyH570(Gq2fdZH~+1kCv zsonI~J6JpGmDmocqQw|x`*DgsT>|eUv7H^AXIua+i_~Tke!ubwhj388Da-9#WiPk(Dx@s^qk?iA1FBV-x_#_$P}&l$0x& zqoB?VOt-hXv6N~aU%ztqC_bdtarpa5D=gAT=W%F=T)*hloHPsDy%SF#fv;FZimfG3 zO93RsL4`{r<<+O;tJ-y|;3Ei$Gt^*epOhGVh{D>7f74fbO0+v)^iIi)l>c%+i^PXR(<|qwQ zZxP2F=2-xU5$=t&wARZ-sjqr-?lr-wBD#C3CSG+t{cIAlBGmY^!YEHWEi!&Gn-UjB_}Z2ST5XlfIg!J)crS_#4>sY5(OHuf zMBpWrA!PI&nzvqMbYJUPkOCtobJ zm-KxzC2-50wf{gek5?*7O2^qL9{y@duz508({EKqv{f(F|lH zr6z`B-z;A`{zpVowvO9sF(ta{KuLv+hYQ6W$YuB~l& zwWpD`?Te?j@5xHyNwfxdnbe`AoOZAYYUrW%L4U_dFekc7V8|x~%`6`nde+5!_8r!5 z=KJw##0>KKd?8sMS``P%?MrP`l8)=*_GW*$G#DtYU=XUux=TbU*Uw{{g zi5$wNxp8byX4hw{8vLUEgSv0gK$`HytFYIgu_hzP)wYgEMQrn_P_(O-n?)=6U0@%Y zwLajFs15S{s{VUap@pIPEAwp<{{{i}ida)7g}9nQ#DeSQ3!u&2V-Abf++S3VTwUOr zUd%X7HY0LSgtk9Tff$}{=whT=o%SOM5inJ7-05?^H(^x}EYc|`+3eY0QpXlOsJA!R z4{lK9N>IlJIEo?IujN+M#LShQS?An@9GBdlry>^sq(G-Jc6@=b3FX8SYWKp%JCyup zeq6IxoZ1!{_q5YT{EAbu^b%L;bD{ZvV+JPaE#~LKj9yGMjm_7Cj{{PUY;}*C1ZN-j zn2P3fI#Uwuc3sf)L@m4gB_weioX0Yke;yM9Ubc?abcSUf0U+ zTGv{RGQ6qYLg0zBx#oOxUPg~YJxmQY@~J(9owyWV_uU5nnce!J#A)Ss2L-Db&WC!J zT^EfqL zEKz1$cRSFA?&gnmj=yOOHr%d zPDVygs-NErD+8+h(UDo7xdW;GAe{Tc&oOo13vPp7Iwigy*U(%G70FJF`qER>3S*5L zaMiGW-{4Udp!ANwn6jqtfic>^ritN(+3+jTQ)bd__y_r1q z*W1>em^Wpd%M6M9JSw`crIel~bMX>hF1(9RQ{ropcq`!qU&HD~#)0%cidhfw2`f$Cxm5<09mXm!U#FZxO}PWR6_vr*}u>T0{4Th4Eyoi2yzm4C=YisJWpz|;hN zRVZv*VkyZM)^toZJEJZLBctBEmsfI5%!e|{ez+FzN5TqI`69D7=CmJ$zCZ=Sa-F-O znKhDC$NuQ)`tfZmFUiI!1 z4H;?)obly2o=p2)X7s%0s(2%Wdi#t5vcZm!}2O9N~!S+R-O`B<5GRiJ-t6X2R-fun%Rukv_Y~~=>D6H-=3Z@5c7C>h$w2;i zOnpugTIv4ntasoLRnTaZfYN*2bgw&gWTo$yu`5ID^t|(z$7yAuYTK^pc6y->V^j-% z6WQytG5=s1PbuI(h5nW53*msji-Pbh1$v)c=bHO@t~wDOz@3QOZpigJfx zR$bl1i_4uia7@w9v%bLv%YN?=56XLo$8<@MY;ww{seW@`Q~rSmv*z`Ym}xOmxm1C4 z>_<|&EEMrQnE$Fwwa4A$YvVUX(aWNzFbR*E4OfC#?5|`Y6mAC-0XD}+H=ot@uW|QK zSg9nBRd-dmJ~yfgwUSaf5^_AR0&jYj5QSg*$Qv%Tb0#Zme*3Oz>@*)xq`Q046b?>t zo{mYp!q9YIPY`>aSw*}#5QO&a=inx^!TjNh48PhhzM@>wJr-^QFBo^MY+Tb3eR|vNzL1hyHjm>edg24{v?gB_ckwb-LhvG$JMkDLFZa4pfba{T zorH}utK$x|H;y$c<->>PlgPzuKAz#HoB;)Ed#|%wHq$mc*PD?N9#FQERy0`FGOi`P zn?kFYy;BgAzck=r`1HJpH5_Y{1B^G!{6e&ehbSh(*XY}0A?b_x=bYt-JQGs`QZLc} zls%Fl6bb@ap)qfA)!&BO6676Ad0NGwe!g2P>H(j8b!O-mKrd6?NkP(*CA&8k+Vb7V zGmK%*L_pm2KBkMlsrK2#t`2D)KEvUwm&h-9ZTAm|+~qHt=6sB<7^s+31Lmw$MRA{~ zVF)@%5%Gl#XE`6?H#|L`ooicT0!OhBdmfw|L@DZR@o@3*5FD)Z9jrd6w9?w|7b{cwQs3U?J#0%;^}67_+-YcNw7u&t z@2UUg0iR6=#IJ4jtIH|Q<+j|t*SiyM)9d)#J-PYY@6{TWT)$m*rxlV2qSzOXk#>8i zd(`@*cJFQ7g+iJy&|^~T)e1_Vml=lCE$$p;f4%t1^fg^8DI=p4O-y`zZZ$DpKSlPC z%$FFo0uh(muMCivrDXBUQ4#77qp(&+bR(-&1P(qOvMr+rCBMK)3|yVj)=UjCw_=8K zfmNt{+*kTotNgW)7W93)eca-Rgzn=Vf-1{^Tzd3nN`?Vt0-0PI!IE5T6k(-uY;K$? z7Ap&;fKE*$@u&v|hTssxCyz&@NS-~WsNDCBnL_B^I|d4^x*64FkOM=;8zgmgb&Z+d z&b@#)=UQD9PT5Ymu3fgnMuvkEvA1W#Wl;0IEfp$7n$9g3!NxU}(XiZB}hZT7z1 zu9Kwh7o*&VDXGY!iaVp^GEiWM6+k8|>40V%Pm@a8`l4TZe8Dt)6TvvIaJV<)BKHCQByRN1ro&v4=^7;)c4izct`EcCx`|&*alf)R<&;d za@93f;5TbLTnWAMTOM~e!>hE1cTvM6V+5lpshtyi!SZ9;rVz8Cys)j` zxcM(&Xiy5`{1IHx;&#qyp%IL9k`J)z)5`^00@b`ga!z-T1!0mTs9z$lAZ-XjDT_d% z$TRz)4Y$;)JzW;E3zfQ5-DzUHtnt^q0%m8cXNYiwBP-6`P#>q1a$A2BJ7eTVV0UYKO?HXnXCR%9Sg9-gHF2XF|r(y9HW$|F0lFy3J{hed43cpgd5$E=%Uenj10{Y{j9P{W1&N8I2G52@p6KGsP%gD3yZ^s!i>{Ws3b0z z^*jVPDL2)_u?IBxHtmgN#%I>`rN8Tq_#rDJ!&x$BT+q^Na$(@3;A}aoVej71`IMmb zCZF9(2Zq82XrQM_SJa(CZTS1;!>8 zTt?YSGcxTiL(g-n;Pk9u#Eqi28qt_lp7nWpyZALtJ^G8KDAZpOHOJew-q~8*a6HJC6Qc6E91)$ye~mxU_-Fq9U9nAo$u znSnohMJ*oBq;>^&r|a~@CN^m$5z<$Hp^r_BL(gBa@IM*{`w8s88rAFBm z#+$iK;F-E@IlUKRf{L>ZW}v zMAGwH9TmhjYS*3V*+G@*yFYnuj@_nywt%rR@KU!E-+zum_njbpE~Lasos?*v(W zy&5?c2QkL4Tx6EHHY-e=U!R&zj_`V1I_)}rQ>&AN@*1Ya#y;vx;!##cEvA9iL6>XH zq9V0!k~GSd@&s$tc=k$p_f=U*!187MDKu$gYj!e zjSgkY*trZRX0kNo4NBwmn6l*`@St1>x}4Abe;uB0*p_EqfMP{sM$bM3(M zs1fSJMuWUZ^Zr`S6&0|@Z$Uw8;Ksm?iH#VX;uSGQ^^L6c)y$fB3^VnnWoKh|!Wa$b zVDjz3j)%=xT5_qL7YXv_HXrW`k@z57hJZQe-0ToWxw&&|oevBpfvK(_|Mh)! zeLTka4*kPZT6uw=Oiv~}Z(0~iW-yigmm<0ZT@M@#KeIi z!_vZ{fDxK4ooFx@Z9BGmQn!7<q>ssjE6HgIP{`UL>#(?B2?`wx)kE#(NG^zXnbw8%{8YBLKBKM1Q1TFjGil%D2)&6xL z13d_|$Eo)Mc~)0|H}6T_$7A_Syyc$4W!G`huy=2A_sv|RIkkRM{&#rht&_CU(jhaf ziIx4k&&=x?SlQV}FH}5(ms{^yT08X^yMN+)cvv^OD8h{KhY}=eh%8hYo9tjG8|__7 z11LYa8fTfPMGQNu?X}y>s@}xe^bKKyzxV)>dV-AMH0XNFt{w!zMvgRV>y}ije*N}C zyoF?O_RCjzc-t=2#HhF?!~STf^w11HJjsJC)q&4|pg61zkQTX%xW?84XU`>p#_X=* zbF=fr?52?&;lxE_TAmuf*wT|p+i74-z=@YLFff3YhGrigh-u?T@+%omCfiJ0t!J>r z3wpQ*%eUw731=F$JPGz1am!T}@JC^vIg&aN^RgNGVn?=yi5b>(hgOd&Zmxl8r$o-z zPh1w!JqOfV!i|->DY+cf^WpAJF&4X?SnfJianWP7SKBP- zefmuVz=(1MXXhHQvCdL|3jZ#mntt`%Xl^d86;XoYYJZZ;#dehgFbzYqv>!w~QX_$1 zDa1eCim0tZ;!jZ6$a`?oZYqB3ZTuwQS_8bEyy%7@_>Oi9I7^yH`TIMa25>s4vOX;h z8qhO4_!-3{e$hvh`nLx8Au$lgTY?jAr868>w6iWS5>iuJ$Ti0F;QT=SfC5)Y$6FjX#AeE(%30u1 zG+u{4&=_0V^J-Iz9T+FoK@T=CFqo`!EXrpD67ivJ49#hLYiWM?s!x$xzzoe#k$-Os zB=rgMG>1{9*aJe@!DP-T?$`AlpTag#MuTd(>rX7>y2a3QJ)!xyGtRCf7Q_U;zx3FT zO?pobN#6M~p*(^Ohv4S@!3|AA^V4BuYBc?H>UV!CG>rDnB4mg3JPO8 z>eLUT!xbJz?q&C`$-WV-uYO}3Y@J3lUo=orWOMAkgs zd|+tJdYRTmsbykh_7DUAFcWm3J4lb=Z=d*O;!VXv*zp?nmLAdP_Um^st|4!2@Q z$9+vAPV@3g-ZJcA{BuJ{o*hf6J3Q{5b{sW*Sv!zkDWY9VJHuzt^Jg$C1x1(4QGzOq zb^CTzv;z=zRmymAjTgXXrl0+_fNrIl#~{$qUN@qd=4UecEi6rZe|F->d?+)2v9^6W zB-Jyq@z77&S@lsqUWf+I^@f2#_A~jy$=XV`-SN<<-IhEK9@g^v;JP^%4a$2bCidMj zS4$sm=vlLV+1OuuF+&OI2;TW%)PPK4eFRSvcP^!!!GXPEdgKqKtbt+J?y3O6^;ik3 zMtEVbVrGxq{+jZKa*8MF-jP~nZ@`Iz)pJ&E#J*J`QjYggF((E0zW< zGhVb;@h?g8lUjKlyI%#M8h8q)sI&DY7=DSHIX@!~qt!2=Rwm=ClIFKQs6(Qx$Gkav z9@;SU9BugfCPQnr1?JRu-GenPuCldBb?n;7mgrW zAf0a|%{e4HxN>h;8=5_g2)s+@F1i-UztFkN3lZMUW52W9(eo__uRIB;In_Q9lGtO* zynAdu^Wo@Ym^!uii$7}WHohs8^J)&x^VQ=(z*rN31Jg5mx;L`i6;^v@p8*>yRB|3? zot6=NC;TC}Y;TbkpGCL4qT_hr1Q>HDCM9LLNgtEcPee55vRPn(`mOj5S`!5&rO9-) z&E!cd=sK10hUg}RZ%ggO=@q|LrNo;jeFJF3aalK)b5@F1#1CTLwwiup0Ym8-mxP-h znwnEkDsAkF98231q8YrKqS7Fp^W!f-3K@)PJZ1-flFe+oTtTP3>RaNDJhJd%!uKw0 zXhVNm+6#^jO(PE`R$(@l88$SaA8+eWy(4n4_*E~C2|w7(@)Pqw8uNjlL2K$?oP>b~ zFArElPdA6R-Cq+&I*DcvbG&iidCYYYWT4_m?@@A>t(9Gw zRPs2U@N7r0X)w8MmF+c)36q*oU642Ia{xP{ZX8X%GocyLXY`Khpmyi7aY-WeWQH+# zYI8!5k~`s5a~@NhNqp|L{NoqyWtpN|C;jkYjIfqTOdA1Qj|g&2L(ryU%OfSIQA%Su zr(Af8^ly6H@lIyc_J%*kOW-ceQjR(&^@1Rvj)R0c!w7?$<3(RbZ6h+$y+(iM^Gk*s z)B%>8ZMd0mK_HVLNu3_8(M;kT-7%Lt>8MAKqeL}5@R!`l@>BK2 z{-Tl%9behWO=JM|~99Jn1{0!)(|0c3Z>>3b*P74|YdtFwnX&oZYeB)cLyHVUEa(`vDbrG_n_S`qhBWcfw;?&6fE264|+Bu;+cMm?7 zO*^}w4rRwhS9ln9EU#-NP+Cj_3M$rv!TaUYVD!LjneU_>v8&;NK=H-l4Cyd~7bRy# zeet9E)rgLVcAX&w!|}K!bA&y%ItQvH&EZsWoafbsB7D}NeNe{A)(-iobHMP(hnC*heOe#J41FLZ z^SoY_#txw3;(*WcSyD%{^Ho)++i)dlWj4qD*N7(~jfh6$Q&+gvIx`%z(ZjGIJ0HgU z4ngc^HCles&$oOCuM;dEEvXSY>%R~j2tUP1YAV^O70qUo=tX7lYt>2}T^^~cJ18JuAeZk8zOPd@ zS+a9aO9dk0RI;A0;t#snez3Va*W{^pXAn4%Yw=F`a*mSVX40(4xdo4-6~=7X`-o}2 zRZIEmF&h6xM>PW2p|Ij%kNtwr)BI|wn2lCl<51hYK3OY_TO4b&kb*RRc7q!ftW@m50E>bnG7T285lvxFXS39+%`&q5KU zPvNk)QEH8$5cIV`>2iLwlG-Bz^tE1e&+KjK>Tu;Ek6N2`PWvm8O`8_ni3o-244IqV zfT<(D-J8#T!ce0(Owr>WV%F|aF_#%O!!^yJf^~ByU*v3Ua5qu!<7N4wd$cp0$l_dX z1<>w^gbxsEU0BsNlEV3O26hV8y!_n@fS8b08;^ENubo9^JQSZF%g_B{W`QpB?c4p* z29BZ&`AXac}RdXQ5CGt?i^Fr^8$(EK&Z8LD3qgwil?-Sj|)e z3#+2!E_SvR%BS@&uyfPn_0E$U8AS#Otb>K3bpowytDaBC(9rXVQVk{lLVBDmX|t0s z!t+HRM0_4o1?9qc2jO>K2FNAS;_Y(vh6V-|Y(YAI`5!+NzkQIGK?cwz^=8dLyJ0z6 zy?%v{$3U1~0hYMY!_>58&~|m&$sdONI~cU?Vr6^zlN83Z17h03;w_IPjT$Aiw)AJ3 zEN2WvG#^h}LB^1vP$;X$zds9*Kz$SyyR?ak377SZ7zG)bR07ND7BfuF(#o{ev10&r zn{4uIidi16|IKw?UMOsy&UiTg&aHp#Mj*r+XggwjeR<|`G^%{mL11M(-|Vd^UmN{# zvX(~qiS_Z8Y7&>7$gxEV0H(PLFnUC^DOV}1{4)67#+W2~WbwyTQ@<7Qe=K_-4-vpb z*@1jj!x2oKdplmf;yzkr*u!G4;8zh;CV*Q`SO$sy{c~AzAif{j65~Ml<6!@bYjL~u zu6V+l^~?l(8u~lwnVFd-DPhMbDu$p^_42PFIX@BEH4AtI&BIFG{$sMA+Usw(`{xo5 zY2kW&1pbPzo_jYYRT)Qz{O4EyGV*`!CRBAB)HireaQ_$T{sDV2)`Z~TnYbUu2$TQ0 z!~b;GU)Lb^APlF6GZ!%hzrd&eofx-I_m;vY*-OK+QDythY5(;h|8MF4GwJ{DslGP$ zw#RVrKUn@R>O(#wM_RhdNjE-L2u0eoJ6Wb>D8$Mmn$AeM-VmnYkYdH1%i~I_EtQ&n zfE)UY^T_sm-uwsC|HWl#YV*wzb0b$wUx#)Zn^aKxD%sqo*DcOm&ez3ep1RsBDP+`D znn>?OV#-k&!$RKH%F&A$tivVYKbJK@qeCScPakFv4K~|)xuaE(yQo~AaawMFF@vDV z);-|;)6{=M0oc#^A_V`xa4Uod!Bh$-&rsSl*v>aRxGXzpy#4$dD7+eOylnVtI*JQ^ z^!_m&lgpyN!Q}XhJ%5E94JN*fCotYZ&Y5qHg%jD!tn}a0x z_H1K}$n8vEreY%-SHi&|x6t+@-fz@D&>oOvGIw-2&%d_hFO7OD^DgPlIU46HU}fXF zxe(Ef=LHx0cjMP6^#cY&|{UW|A@kB%cdTl zw^i;ZcK<=b5Tc2ML)_C!zWI1&u2fgGK5ZMZvph}N?`iDurX>WUlDLBCzXV<=8#0Gn zz&R@Nn{QmgAPyB98_>FZMF-w2sgZwIr{3AP*{}#Y=z!nO$Pz)7>C#eOq*|r$rY7T2 z<#~Gm!`dQJfy-r;!hch7-kKyBS&00z*@@lq+-mjW(c@&Jh{{_um4&9f6&mryTY2#jhH*4VW)q7F z46Z{e56W5kJE}D64F#Z?K|?VIN2hcGlzAdFW&BywTqZ}X92VZ6CR%BuZuUfIHr3;Y z*>pt8*4Ko8(#!iL7GTDPjvpQUzCc7ZpzJOvkR+CvdH8vWH{Vj>-k$}gW+6wWaOJV$ zL~$z|Yf9(H3BmL}?~&p&n-_mTLJRqFE^h(^zAE1Hl@4m>UvR4i^d)28rOJ(c3ml^k z?BUkoqOr}?46)4KAJ!=6C}bG5dk?00!%*Ampa82b4i@w5QckQpZ^pfXwfoVlbF2mp zv%vk{=4im^ysv1=X83jCkj=aH9lTzt{lQT>)Q%hr8*6x&_NDtj>{u(Wy?c#maURZ} zbMB^>e7=(}HImO$=$QyWcOwj}S)zR$C8WqC1Df7q7H7$z+Sn=)b>i5CzQmh}8kg2u zOel%}g^S%+8k5|yJAr1?=^x8E`cpE`9QAO6SsE67cuF%fX)QV$T(Xn)vD9G&b|zfW zrkZL?@Cik4J$}hYpv5g#t5q(ZVo}5>IOa|?@ zOr`Q5zF-_!oJ*z|n7tdorVa7&&kBR3erqXwTZ?cMybwJ-x|IN+?@4*NBS6C)1z8(4 zbxkKl;fvY9IZv{H`;V0Gc0WfJdgIlufNeFLJfyE^=?M+5Gsn!)ln{)^?F}2vbqHUZ z$jM`)dmRo_$$hIowFc{87k(8RzXboxBhQNOGSXuo64w2l*e;Guw}P#LFE)LBM0pLw zmq*+{GgD*eU8uW5N1ymx`wz^(Lzf*+h_wHxt_65F$pkLRx?pKq8uxgAKnz+>o{WnA zme4|tW*KXN?zzeFd?GjxIl6`(3_!QXE;Dge3T8V^J)0*inruSP zf&EGtzskM=8>A7bmPt6%d3>tFz4}7nu$tS+zN!nNy8b5FsE(RHe)Mh0GTylxfPBrN zkG&sB9Nc^qnErKISG(k`b#y<;?-Kh9LG z=)5#j(+;ABzC?pSm!Q9cG^I<6nrN7m{AIJyw#R{kh0D3{GUK%h)3_APXeMgc!3DKNrE;T|(1;S7f{-#Av!Du#F}S{1X4yAJ^swDZ#y!}> z)o8nRjG}71^LALl!subG(ew$AMMKfqyx8_crFhHAoAqDx_722aBd}r5Z2fIVAmNxV zN19{HXlWQ>@9pH~gB-P86qa-D{}L>K&i6o%X`+-4pS8q4R1_xs< zqg=l`+*A=MhxUvzlh&li?2IK@{gww*I2KKNKbFm3?xHs}F0yf}Zwa@@P9jn$Q4y(Z zeTMlz8KveZ#2|d4Yw1Lm?QX1-cQmGErXx%+@zyy(Qw6P1;EZB+IAb-@g-S^y-v-c= z*WIe^tIg7r&BLyx$+KfV$+*Z_{l~lj86d8RnJXSz>UL8+W22HOPmeS$W?Xhh`+A|j zXf%+H@Wp8`{q?=5UmFV$F&ngTy;$jm`j3-fpW5u&f+hAi@{7#XziQR>QjT!r+uIU!o-fCVLr`qKZ2DGcBZ?FSckKNSbg_~ z!~eziwtov~JB`*}v0v(p#1v5%$*kHel$}k#98>SE7^={Abm?C~nFR(l59Wy1skcRJ zX@JDyqTqR5ZemfvIw{WgJRJeBN6CHgf+}Nc=cqK+ZZ9zYKyJ;gf*)({H%t8VePU3A zUaq;vI2V%v+mkAaLebHAl6@|Nhk#-HibSeSBwXpNi=0*&LgT<7+4l6ezPjT*OM$^W z!RWFfRby?U-A<`kkq_3945OeJxmWj?_q805yU}EER=+m_gVAE6(qJG10}(_N6%~UV z`ic*C=jJvmbvSmePUalnaxxk>d%!Q5}N@L%4M&Njipr2hyba{c_HA5KXzq`(D&#zBP2lh=jcA4m+>cZukL+8|N=6S+WAvrrR?cLrH2r)bdT(br0i0l%^7FYWuxjL*^v+R^ik`L6B} zyQQ`Tpyz%1B(&5KDlaGZ;q}(|M<9u0I+88xa?r=wFdwwP)M*BEHqb0?KN{028XA%# z{eYtv;HlcVqFX8y$w0U9Wah;+9LSgfJq;uyD`C#hAt z)UbT19z$ZL5=eFME-htA0_Jw^Hk@ecH4C3U#?{wpQRI+3&|TV^Lk6|Jd}T7XYkOcY z_?zY4GXR07{w}{Ma6y()8~yr(ko%j);n8L%|Aa2s0AV=q&pWFz`byMru~Qe%VG%zxJlr6xVi*jZ_Mir43*FYx_^Xom&skVCslW5X z*{p27-!$dJvZdF?pwdS4*`p>DI0SBu=8DnI(`7g;dTXdc-c9lnR*Pqwb)UmBw9_6vI z>C`|k{gfoXj!I1tFHpWKoUVV)P*3i5oBIHqp(GwhQ(zW`rnRu4VJ6>Mm$WI6P%aJO zz;)A+ysuHHf+fh&7fB;;4`dHb0PG|lXo(kt({`;grfx3)y%Ac2K(BJ{K zF9uab+t!FHry1IdtBYbp%{y9C+fcZaLi-K0z9gW}7h>MTQ+he;sG&aV>$xarAJO zEwo!X9&i2enlaS0*H{u?E^DbpcbgA4FY?rQ`eh}`KOVX=$_UKfKpY-`~Y zqQ-c2502}_bPzlF_qeZaB5nR?2Yen?p$TjzAKabWXQ5S9(`C~YC$5C{eMyOlTMg{H zMd|xf?c%*!DMh0-cxvp189qDQY}k=KPJ=S_PC*d8VL#Z^v;Gu+;9aT>;eaGa5Ibn- zeLMWqOM`P&CdO*dCPu6$uwv6vP5WoYip2I|#%EuH%x@qR*6naxbp!>W7InSLQy1&81K`3A0-c)@in(>pM<-Qtg#vf)y&nIrDzl4$te7~Iv$Tx*xo+g+ zK8@IFRQYVl(uCNb_xEOexCR7p_UH^e#S%%}ik!1fdJ&Wzotplz$$f+u(5Eas;O1c?irU&pDaU>2!^CXw4MBI`6kE3@BJ}&ci?s6$C3U*jA{SosXs7h(nvv>>Stw1%j zvK9bSs?|M}PS7yy^rIW2V|sG6xJ8*zVZET%g=Fx}Wc$*Vf&RWG$6i`_xdN`Wj<+;y zBmhxS#j71~M&=QjCQhgwtvY<-fzq8@e}k9tAn&Hm$Qu(kTL%u$f}v9brgD*Fe$8Xm zRE0aBb2L$Dkq~p#3QxH;9GjCCN>@^wY|ZqN@VS%BZqrTUiIosg`7^Bj(2TK*$pb@V zsTj0DUaE2W-0i1djL~&V?(ehdI{>-q5b4R^xYw^dg_4L!Qv;p*p>?^;!=qD-g)~60 z3ULsY>HLZ|uofvas`z+#qIs`_BQ9O%VjSroZaxP2zSynu%-o45e;stakm3QWK2Ef{ zl;8?=e?Kg%>I}=<3S1B@%o)N}d3deOc}Z%1+NSRMXbTJ)*qi%u(sX6xMh?WP%ap>j zH0ZP{$)C2i?4z);Yqj5+8yHg1s3?4*01IIwBPxFD$g1-9NZ(JR3aHvCp)r&5(S2(j z(_GGOA25Ba>F)_v@`#u$PXcuZldMhaE+XxOScm6b-=MoU6n&TY19jV(yUhSMlm9 zC`1A;w{&by$wH&xyxn@U;Glh3HHAkxr$kT0zI{XG9{fW}jA}ja=+)Z$;Ez#i3-Hvo zrL0lk$EBj`3SQQdH+ZN+{eyY%;c4Topb<|?1q+?ue=Sfr-jGz|@+^>2prWBsNIl~^ zvqfQ!$L^ufk$j^PL8L5Czv++2q@w)>D587%2GK?Zh6)M;P6dwPfL#}S%sSfOiSdIB zJ{E_k*tEgZUqaA9iFI;%US?I0)Icg_x~DR+PdGIcUh`0BUYC{Bl7p$A z%*pR;M#y7c*qKC~Mt;R?xc_Wcf->O%r@PBRGEkqIJR{qN+w(1OBJn8xpm+;AIw!4R z8EBHIDS`@`FJ9s42qjoGXeizS4`)ga7gWunoO*yU zrCH$5Iz47Iv90ls_7m`GhPvrrwrM4^=jl$cw+4@W`_ldh18n_}FZ$MPxy7&okpRyv zO^2xz?KiKu!`ti!os1D-Jy~RQyWjZdY{V?hQx1numdRW*pvGq&TfArlnkj}&j;8k4 zO3Dh6bf=baRML<0Xc*W00OuGeA}$X0S}E!uh&=-x3G-$|Qd+sTUDhxx33aq8(sp;j zUVsJPMb-)QT)p4nq15Q^*UUbQ#5DM}T$lM0wXFl@sMY}jimpn5unI8bFpxfS4TJ_{ zANcm|dqgFb0Uv{kXFzB@>v3UWU}$K1dAjcclwh*iEDABLE%tHF0YPbcz4X=4)G_Px z`PP&+cqU-pQGKl{3}mMJIUZD^jnY#*2-6M*93CdGwo+pi+y`{gEv=PputB+}0b2Kd zzc$JFk8*K8c50Xn!8j};B21n9XPML*qxWjE>&}p(va+kyb-)W|Ml}6l(Lo^GRj{@F zo^kLL!5bO#nbThC*05Yjm3nDusTzL!UqFK<*F(t1GQj83E;muXE^A#xJZ24zIg%P8MVwupM7~5qgyxh@= zsR~x6vi2_eH-3m}D)NLy4af0dW1BWKPUG9~XRno^YB~*w$BSOQPq3`*0%;d(qk)^_b%VH2j|4t96CeYjqoC|r&`KLmFWaAcXJlE(&x>YzyOx7mz!ZoNj z_0o42&9I-VW|?pi53UtoXd!6YU-RjpB{2a}`zk@%9|KA90rACZ-chF!YWZ$6Y5SA= zBlDzf)9gc#cJx5yn`Vdi^(He)CqIDWdI!0Kea=bScqA zNRw(d_(bhU?3$BWkO5Q#!Ew58!r@zJsIA_{oE)mrL1zc6oLyo%c=Yraekl#DEH?Ew z*B6qsdfw#GU9Eh$<~ngK=CNAlv&x#z!VyoTkKvgw7k;?}UXVl3z{tzPUA@ZNV(K*{ z@5T)R)D4A2wu~o4yZ%RI|9G#rAx)|)BK<|{DsJEK>=otYWow?Mq5n>StbGA*zd=o` zqidyQ*SUHb()Ja$Pls7Hd?VzRtLQRR-X6Nd0o zAjfMJj*te|6BqgL$FErBE%fzReu{OP2vA3rJrQMoTeL9n24Uj`YDm{m-&nYR}rL~d>0P3y+jS;!$iAfV=2)sqnuMTX~=)ol&Fo1_4 z1hO;e#?dphwTE)ft{D_nN289H(yz6~6PK8S$1t017>@p&kXqvdv`g*RWcFKQJxGTU zksaUmb@L4C9`=C%g!p`~5C6rU@ZpYC<^4ZFAE1;9skQN*c4USf@+l|AqWsWP+=|UU z3`qAM%_C~543k`)A05P_m6$(*`38oX6{wU^;MVI%2CE$3ryJ97OuAKpzf1ZcyFgAT z?PS}o^3m-c!FzjU_9bS{v_FZ8i557i$B4IACWRE|M8;@oH|_`B=?4jgN7} zT?%^@7Tg~q3kGeHs=5DUi2vomz!?mn4R6Ezt=7|R!2wKtMrNi+^h7IDG)fzvl6m7t z!GNJpf#GeOzxFM#8T0`DcDuc$Fm5sMt6L1b%T5kS0Gy=VOZHoD|4mqKIg;nqY2-0I zrN6P*bHsCz8>&*jA4}0-!Wi&H(Zg9IN5kjUJlch~cV|!`{}(p-7b5-mQPM5qW&|p8 zyJc}sRKOQIZ%n7ct?KFk^s z2cJdlZ3!GDVr?yaKKkG9@Xrr_|K(lyaBYk|Plw^hdK$z@q?TBX)=ww!O%9D8Iu6zy z^Qi~_3nKlGG5_(`Ar%1JA7(c6Ro*Hq4JvC1zbP?ntUyHxiTqQ&VS~N=f6ByfP3B*q z>W`19!H59B-aeoI;FiM(;rD|;QJY`hr|R+{8$-G=+KE&yM0!$6*uU~) z3FH_>G{XV3_Ju`A5AFjhW-PS~_dlQe*IK+SF#s+n7*M4Ib_?SO-a)i{v-v_!qd?a* zY;z_zdrp_*pYtAn{qE1(q{iG9u8KQ8Pq-~#u+N438!#iKK>+%b^ZE}8{3OE^!nwm# zyeji8!$7b>3Up6tv;>ozB>Z<*-;fi`GP zrlmhZ3@_o*AA7SNWY{6J1p#SwKE?`jyfDUj)Lw z;ErUdeF3N0ZN-v{H>4trkgL#+on4M3Ri^79B2|cz8`HS$ZL;rwW`dubaDoE7#~+<* z?_E0Pm`nEB3#qy}`1I6Em&ZLc|Hl{q_kX;19+E5xpH!DA0S_VxLR^gGViI-mc4`;i zSNcD35ppb`P#)j=u}y@G7)w5ky4-F#^#5G|fJ)^j5FmSPl_Ep_-`?%dk^?brAy0i# zS;_xjUkA?40i|s9?k__B3*r9U976H}0dSz+5ss?os%ogtsB=VZ3;q0GZ%sy-E@x>b zet2%{gS@=u>wh~2@tZp#oG6Ez`A7Z0Im%$AE3uQlSL^wT#naT7+0XYPcT|tbla4EC zRC{3gV~coirt1A%HD@!wag}`@gc-6>g}{5WMlI)BrzFeJeoZk^W}oG;QQ1z)(x5Z$ z{G3Cxz8xF?3eafYW?*V}n}TS*@AhpzRK}x4usj~AxHqnvu!!)hmsV1zm9RO^rAf{Z zO8YmEjAWNRqN}y2^Rl(^e1r2NM{r)B(O}l`+H&c`c)Pd*%dq#B;~Dvw{{w50kRft2 z?CEYUX^l>2oEY~He>E0?W*l$PDw%&rZqHGBGdzUtn5z(FV}hSZqNt3dxK0$OUIjf# zUQ7=nWEQ}ZH~&Txg+!<5P%DOyhIK9oI_~=Z5mx!|Sxs9L+UK z-H=Eyc;Ru)_gl3%H)Zw+PYgHD0%wZdJ7+g!9f&!ceEHbcMGQ1jW_})|Bf&=$tLR76 z$Uhxba_>#*j^?{?U})H6=509AY*&mn9ZLp|P!KNkdoM*sbEssAiQ@pr%r>PX-pGlG z2|DHkh1Z%q>6M9h?0&2;U@%~v)f>OiAHMb2Wh|Mc{bF^bk0$SAO?1vxEJuE3f;|p1 zep5)ob6p;NL)3L;y=v#w#%S<-{R!^+0@!HtqN=WJO?z1HGe_>E#+z-L$|b{G9?RSc zv!3wsToTdnBGs+)gd}0R5TRZhi10%Qi7mqIsffX)Ec?Upt}i+E==tjaP{pP@u1$%C zKYrItH0p2uPOU<=57D?kC{6sN+k86!+Y*ZC~n%dDDiok%ah@?ErihD8<^&ky&{s;&vpT z^ExvN`{}10XmpYD0hMu2Rpq8Qx`$w0Ris!8!(^#Z0>HWZ`1vq? zn$FLqB4Qlt8Vx(LbMW=Gi^WVaKZfcR`y%B>(%7YX7+^uE3b54X7CsTn4fYvd})~ z#Z-va!%cPXO}}FRTZ2V+_k9BtO?Xv@h}TVz)Q33rE4Ktug5FEFt+z3rmdQGt zk^9%%O1$Vlw$3w z(pE~x;O8NVN-f_M;4~A1TJPpp2?^H<`L%zj=0#dTG0hpKFCy>n@%fB@hBWHFkN8Uj z8^Y+X0Ppp>ohi_2IQ1#H-+#`k*|~Sd6V3*jT)^>DemM)XgSmgG+}EM3H#_nHzY`Cj zQ9qX}9~W|ODJ)!$kLMDLkGFNdH1}n1rjq`-Pc#vvUaJDHA%y3eET4Ap987F!x-qt6 zg%}GcshsZVmy9U3xV5Y|duRa;3kV`CClDg!Qv1tsB4ykN(04^XuA=BZqu~3EqWd8v zlVwLUIfnbyCy95@Mk3p4Pfyd+e=iF(4_7kE*Z{GFEOMa>qisM!sqeeKxt_j0ktXTB z{g=fDg9^iYwG$5{zV)i66qI#$=q2vERr@+$m)MPD?)5(-Kder*#XxzsTW@#@8HF_~ zRhe{onezIZ^-sOKE$l1gG;nLg;$i5`%iHK-z9*wb#)o^@76V)9+xG$++f{v(b?YGP z9?U{>M{@F-H~jy4nXvbd*s+?Whl0#Z6(f~y2AADSD=l&keFC6y9|L(8sW9dxE$dQu zn&ETaM|bvz%~uaG5hd_HAp3uNdgm{q3xiq~)6WicnRM;#*5idz*%CX(n>;@ijNM~c z=~%i=U{!nRz?OLe=aaQM6-!hH8V|OAtX){lf8_C~gb$+cmmpXal3(6?mbguEIy!;O zUyFg7%{zR$$4?{4}sg@8kZ3 zZ(d1@?vK44a@Vamn_OA8%QkHU5uA|M{wIH437sTHY#-Q?YpOk!-N5Led!{s9r_8TZ zqd4ORa^3IM;0Feg6#RR2uV*s_&MKe`pL7Cp2OSOY^O)inwLB(|JNnYzpA}?9SUfA7 z<5Rffb5QEsm*gJ|RuZhXg|9;{y0v^3=JZ?xP4oI?6&$chX=if|fZl9BHp`!76sHi? z$lfd#h023wF-4J-1C;SPd_$q=T5-iVGMl3pd|w|jYQlg0IjFJyQ}|o`bimuHct{~@ zXQ(wRCM4o{0+o<lVz?)b2Q|Jmknk9z7jyDBVsofu3rY&i81Yujm61 zGu7{jjUU|x=kh04H9B*dT@^`a&BeNsK~ervQRbF9DFKy?)t1U>KDVcy6BNoMiYB<` zpB78*1YDZ08-?RsnhdWytN2-{W+?5K0(0@t>N)R++4V^w7eVv~w&g#fYlhT*dZ{NbS11ENit)6qLrm z{`*s&6l0z=D}7RV^&qrt7Izt@nz<|~Cz8QTGv7}w_DQM=pY%P$vj@`hgyarX?hM|F zMR|J_;xX#F-!c`&B|bnPR<0_sCF?IN+Qc5Q)x)g*5+(;*)e{Tj!v+kpYUK5M9{HS6 z?~E1VI?{f9-nC%y+3m{&7p^iH-NkI<`|{k}WNa&T|2~`HQE&OYA8dFig>y`)4iOd= zJGB|pWH=53*l0Zc&utu2bgt?`C2_ZBXHe2SEVAZ>%jA6Bx>=f1m#1qV0{IJ~Si0^u zSA-+PUa(%aUAM~~&Eqv~%)hwr^3^2dj#EJXjzJ1EFV8IsfXUi=+L3?Pmx)od_`8o3 zk}hsPLiZE7ZJSDkRfDZ!vZqbD%{_Z(?OA`BmC)qJQH~I#+w?w;Xgs&a zzN+$ft$`73Ru#46@_e2%<$Csl*^0G;O`al!2dl~0)HnQL?%4ZYqnS!Q!(%wuriVrh zboS&StA(KeHI0 zC(yId%(*-cO!`NH%(qCp1)fJLI!raUv47OTb2e}(_X}epVB2iVeLn_)6$r}`U~=y7 z9NJi4y{JF+o{6N6jJD@%_*c$D$gAt478)4SK)oq`aPa5);9hj>Vd+cndoufyPX`%S zLtFVKb|1dyR2fX*;4Y)+avHOomaga^G=V}KmPQe-5m`?<3y#CErk@f8{zuIIRh6hx z%osyr(<**9`>bT4SAK!W=0ynb2UV0xM1sE={6Sn?)nO5P(;|p0)_N1q9C>z_d!&jw zEA%gUj%S1X5%089Q=$QVJOra@p;84vGRG|30d&9Gf(Z-oAMM;e#`FMCnpVsNQaGE>(t;iPla00@Dh~#a8S~ ze|m(1Pg5lDYNu{56>Hy!dWX-pw@U7=G;;5EY)6Ap)Z9ttx`!McTC4e&=f7L}P_SVb zPa*@2En!3fI!|DoOVjg{q1aoe%pDjU*2Cv=Y9plWT#e*fJXv3@U!1_e3bRS- z4>LFHD82HSz{SsRkyhEck2sjLROTw#LVqKd} zHq?On^%y{~*JNGnFZy#Q5*W)Itk*dis6dDg3PQH?Odi@-PZjaiySu^fU%+^q^%q?U zk@dH#e`?7QGDnH^G_V2;#ivuquQ~5ExO6q(a9owq#Q6+qd%`i@Xh<9W0ujzzz0w|u zFYxXb6+?X*L4f-+7Fl6j9Kpfzx$GDRIU;h3ADqH$iAeVtb&;_(>S2xV&fq|XMU!8C zqPijctDfg!o+qrIn_d&WIujZm@R~ zCNwl#dai$0+;IJ|TVJ_j7kWshu=08j!O^?zkZRc3zbc$PZaLd&AwB1IzG?B67ohcd z-*=E!GQA>jX7^B`aG>$#Gt<%5!~68B+YQdlGbqRN^qa5uJ9MgXING_s_xcM3=~s-t zo-f(18`dSi=dnG*%s3d^)nd(!_lsTsgBC1aAsV*6_5>97un#{d1i&U178b;u=3nPM zcUU4`ylsOkTFe1h&X1m+4Pj8|Cty+**o9nJT-<*%lbn>aH8)Yw(hlq#0)Z%|3*uSP z54YEnKwms`Ul9_DMnE%1;7%IJV58Q@@72dyH5u%k5-yiIE00pJCpfRRhF1os&du1 z0BnIqB4MUb=kZ`wf_`onOKr8O9E{Uf&IKI>oBmQgF}e*!uS(4_44{eu;U8RQ?l(Z{ zk~y<&L@txk7~K^Pygf6!>WyU~jU+Ct&-YN|TzA5Jvjz`p#j@dt=9fTRASCe0>Vs=o1vV<2Oa|Iuzl*1UMk|(TG-$*beu2$K^<9g0k*{poS0J8fAzqwg~ zwE)(45bq>m;>jX9o@RhmtcU;kL*5OSq}l1MVsqAB{9W8xj~AChCN^>)jA zvrM|oe2Lk^9SRCN(N?VO(PZWBnI>F%FM9#&B9EUj|Yye(ym2>kt@ z`|>V`(Dk)B4CK78jP?m@`~36DR1CDIJCP>j)wpwEF_!BgM!?-Nw^4rb0<#WSjMz{s zgNbki-xKT#U@q3Um@GFUf$!;kg;>|kVOF%H>mABWR-3A{H-#T(iW4RT#U;gNi7Gee zn%RsxeL0DL$*BC^L#g$c+QclcDEsGJ+4~_i(|46#a<&Zt0j~*#wKA?)4+H*|Pzgyq zI$?lVczv$1GP%jMeUMf7)(<+)J!jkT83Yftva{4g=wd2uTo&rDf@anbz@yESH(8|0 zW&)jyW{OIiw{CtQstS(}R&d@n6=4~h2lK7Pyw=)7uhf|Rr4 zPk79G*8lXH=kE^Qu1#kMmJFPI;S4u#SMOQ>KM1*3gvA46#{&ZK_4Xy>8}(35yZelB zHq8QYH;2TJdYPHoG`;#s1&vq1y-t9O9;-5t(&Y`^BeQ6h{0|qv7=VKIw5mcKcMYHP zsZ$x2JTdAxhx%qsCYW_k6>C;bJI79v6HMk+*Iw^t&e-D2I9P**UGXP{@5|Q~&}!B+ z5Tb0ppd3w>8-ixehdZ{7v3HXbW8|5t$0I|7x6ZO=NpSi=>r8gB0=CoevDx5@>C!kW z37fD06f4~~olhq+EYrqIhg3b=D=@~{61^fbPO}}|qSG>O#ohex-Q)=Rfg9h`)jx^Y zit(w1F!5L{P19Jq&WMR!z`w;skHCzC2$)B6pOX-1)X8GD|J+*-c@VIBP}3-j+H=~e zxwBp=nTZqvXbX&f-V2r6_Kh31>WtfL$*^dw>ywxRI<{sI>-1>v+n>)Zo#dX?YkeW}HK@+uZkrKHj;&YshaWOtL#y%QW__+&I#M`cP|@+lal+yiVzWU75dKxV z!CZ3os!qrSqMB!~qEoRo?K4p_rjt{+o9=9?TJ+BsXURDy7sLfX6?QiQ7M+6=yLNf0 z6l4Of{Q?)~6dIfbs-br!iN_PH)|YTS*e#7*cKlWE^Bb=@39}h#nUs!>!)(|toOxYdulr2(-WOVDajN{53wEB*-4L(R5vYz zd@_7>jPGb7w#39Ka_!`#N2bC;}}Nz}8LmizpHS-x{NC zB-ox{Us%M+Q2nlkpv!ig+rCYA70Tw!*#u1vRTK$)-LaI$%$D`{S|o{ETgjRS$!>?% z8V!nU?_Ca2Ls63qzb)%q<450G?6(##f43^3W$ll@UplECV|kY4dsXS$?4(e8<~5I^ zD>HU*ohHoR^ZhC{r`7Bs(MPvVGf((L@mgscfw18x^gYFWer|5V*PAh~_%k;s=l1xO zY-NG~ZN!AljNYI0FjvM^B(~|(#PYR1p4zgS#A{kfX1{sXNga!48E);webu_%Qy!sn zEwcawa#t_wj-|rsdnCQ7_UNdRw(BFA&eT|{Y!YNj2>~9Ig9MdpjqBx74-<(D@ z>L1s!16k}*Z9VZjCHPBo3hhW;v@5&)sfbo4La$33?13@eYmq*kCDc!o@`7+pYaUO4 zE@n?isoG>}2JBM~Wx3Hfvg4nT{{Z*5b}9d|e@;10UNQ4T18y*RJJ2*RR1%GmU{#$6 z$&k_1_x|XJ%{d1#E@+fV#te{k8`;xa^rX*k3rN+Y_NpOK(o?7?Ik+J$7=r? z$Nu6phT2WS!J`LnZ#HGc_9?5ffk&j{ELdG`tseE42aM@sl^!Nf9#fC5UEWMSxyJ70 zVIcMHfd64~^Ii#TPN@cBNFgA+yA+_yyWl!wqplM-m*NA^X*4E}F4^%-2A{)p;l>QF z_jr$@meyPGUBho^+J#PQ4NsBOHfu)B@1#-vhPiqTyV@m? zLlk;3i(MgWjLtk>@zEvLZW0sZt{_69hA$`#y*-0UzfdOQkoyRk87?BToOz_co}b}5 zY%23)`vFbkWQr(E)y-u(Ogq?kYpW$L6xwle(n-3T0W2|bj?zD$hs5ETKg-7Om7wml zQJgE#%=ynm+)dj`KdI2+zuGLm5Q*sCLX(`wV*xdgfHs#}CM zTrWZo>7T*#*1MD+^YS!G@CMfT;cS@DxAP&f(p+0tA7cv4*|HNDV5{8wYEH74gu-i4 zQCNU>i_q@u^kBs9>_DmhNsHUk#_#iseqTS^q-VRW^{I+8jcTPtLs8;up1rA*gs{T9 zhbb@6WnrPf-UDI`4y7m(B9@FH@`pN$%phW1rc{g^J^sbt-xX}WL=OsVwovp{@%rXA z+d)gl*a@|(B1dZ{*{5HYD+CvS5$#5ho}$|Xh_X6zh~c48BVyUh1T^kUZS1a6^Y!r6 zr>68(UXl(r7dM@2EmS+6Pg@D?TsU1gMcKCAwaf*XC2*kbVy`8c-5B=|yjmdu9E4H)sQs%tWh193$FJM zvEP}9?9mQXkw_Dhnpzxp=`8GZITx3Cu8=Ze(pV9J`&NsV@;N|^A%18fq7*obGry6g zPY#?LsYoOa)8b=KT-G}WgCK0e0aWPwiPVX)-GWC0PC*m;wx^SfA9_UxKY(|b7P{r6 z6%SS1WcC+3`yq#@I^$DnsJUwWPioyKivaPFC1mjhm z<5vquoY5KiP{NVo-9Fu#XIDkF-$Hw&?AL5MPG|DqgxfA%1dA! MM@jY?_**A{X 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≪{60H46u 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

%Co!%Dvexe#*5)=hf{~Y)bD1# zcrW;aS2J9+AitNBIx6RpOk?A1d|c((NwzfCvGdTxbxgh}iP5rx)O^$HpqRq6TV9NF zdC}4S6-*tb_P$qHg|m;NmWFK#{=@C(eIFS1VhkOP@0w%n2`$2Ez1Q-(SxE?X>^RSHqSXrP}?D;>JdMo zNm0RqFWB)+ucVgC2EoW}f&mU>((2SANN)YgEJ>kvkc_TMqeb7A0)J?+xn`frG%~gv zUQx1u4)|foRX@e)=c|`+^45VT(Pkm^wYhSF;x~v%B{#NFjpAs8JVa4a>O(7(NzZq$b_ZLdW^6e8P<nh?mV z(~Cf1ZO(5^5$L<~dun^RE(d<7Jip8jgb_$dElulP``%AYQ0_bDZi5a0^jnCFXpCLNpR2}wvX!lZZ(a(`cBOCwOBHZRRVn42zp2% zYw3rw`NWU9&RbE$hR}6+pEiUqYS#6g;yi`Jab8VX%gX>f^dUJ>cf|gqK?u+n$VLpU zv#fJC)nPrJnq{7xkMerdetXcSc8KJO^XkO9%7mZ>w}=#l+d<@jB^ptaAeIq1PB!0Q z#@T5??~-JJ(G)Rh-2zSxYF{yUhNbYJo^`C;V)iJWS1I6*Y&cKHWp)IvFULEJ@gYW{ zKV1`PrEQ{Qt5K(Xn&FW^V15q_^7bO6eBN?2v#rCa^`fq=?G}Sbn;&qvw{$+JfSWy9 z<#o^~`EGEsd35aV_I6V$HW4zDiVySkjEzA@0|z9u1ivO&S67KVTvebm?c~vXvmdek zE>|aPilQc7u8B?ZDX;S*LQdOF9*&G1oWeA2>}_A#F+*4{oD*rWefe%S=3z%QjZ1+( zYycDa5JKx9t=lqwZeWtLhAhmK#6o2SpN*igCBMYYp4vMu>|fM(THiMjYY%=wLM`e5 zB+=3%N@I!N+SNt?5842Q4<*||+d{v=S#zDu4Y>0J^aatkbeGb!^jnV0eK#$y_eE<- zN^jqvw9T9>P76Z96uVDyN7zxYm9!Eb9X9IX(hEUQln76m6ua;44$q!7+-oZk2i9Gg zSYCrEPW2bHM0=|mb&N`Y5zOQ#6*?srrkLZ_(iHm1CFUM0ibGPHfmrxNoJ6SbLQ_s$fwN1Yh znJHJ@6F*& zU9iWjVK0o780ck53wNzaqJD1aCavG~>vX1X(VU2#ewcOn?$7^P>-d50X4(s?H=$MU z2i^ONFZ_pmyvjR-4|2BKkk;zZnhZED;yB_71{Z~xs3qg(j}Kw+*S*Muo#|Xp_o+E%q=*Bb^Pee|ga@J>1i_FU2!&Ijqz{5zbxa;?7Z z_NAzm1RKHA4_tObr@j)!-r)60vDOzUf}g%(!kzy3@D)elc((E>qxH{$0xb>FN90pC}STWB-Jg`pPOsn70y≠9RZ)=oRLF0HQ`wy2(N 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

3*lfwuUUx(XU8E&* zSjkl=HW{Oc#BG<8m95iHjto+(2JTp(I@DIOva+h!t%S8zVGcyyp~PBc6bE zajz9nI~t*ip(@FUOkU0jcz|_Pot>S%t}$TfJzanYQ=WSLRMC0#OONgB?4C#Ra(ui& zdYifW=xu?HYtZ-pGP*Uj3Z{MmcIKq9s=N1I1=ZILVI{3M_oq~s3v$je$CicP5f^Dy zF|%k@GBYN#q_vz6|EXA9s~GRtb`?+fb^S&YE?Bv0Xm$8*sKN?^c^T-zRCtAr*@>KE z#!|p-BF^^pUU=~JTC4^jyEMS%>fuoR_dJRrXNq^yYHH*_Sm`rW>!FwIr%x}gMZ|Aw z#?EQ2%9}uGu(@#uXL@9p$-C5o0D^8o|1u&F{6@gmbywPV36!&5~q%+>tW zU*zH%1>IK)N{Azf9MFF{|5`>eelyj?)cP|D{cPL;ZZ4nZAi9gHqWOV+>sxoLUYq!`YG>S~+$X6vl54}a8VkuqhX?RnZb%qmr~r?0X)e%FaF7pji7 zVUPtGL#=K*nF-RK@l8#~!xk4}#xZZ}$yN}!!)2zzBx|cu=6ZG&3Gr>!Pkbha3bNOT zMt3j0d5l8rEkjomi?w5W$bGS&)ANIIVxFKu+cSKO+cHI#Dld=S;AKW^fsn%3yn?wZ zCKFZnBzbf~I_p2_?6RW}kN3hQ|FiDO9ibST3zFHSq$mDPQRNupco$zsXUjLV(CsXh zO!EW%c&w^P&mRq+bcOnf(E9X+hYr`yaI6rLASIlgB6=o_Kz<9^v=cz2+v2@qVC+NG zbALAgo9GfsiNyPNY^4oMM;%cJ{8#V1?wj?O^g#1?Ty83baW)W#t1=H;SdKE~I34!C zam=K+FU3#azI?edhXU1=_=FF*5?#|#XUWx>eUYhpOMq3^QX)g~_)&&~omF+za#O_U z$B*)w^`_C_soL~uz|Gs$zEPi#(j6Le*E~R&oa$KskC8#N_~0%|dw)@+bN=FMn^j-r ze*S?%FBzoql@y1}LQ}lmO#0&S=`qjWVpis61YXrg+iYCw$!7YFW);pgorPn&bC9 zw&?=a_&CkR$to5SEmUq1V!C5Hg@uMPgDCC%lo5cPJkZeXZKFqir$A6E1O|MM8Q_5p zmkZ}m%b(@;lQ#l*fL=<-&cE21^#(;>#bVn_QG6W}_3mmhCmXWsJ&%LTZ4jUZ6Mq&V5$I z4D27fl7fgE z4v6XK$eq|3?-U}UueE7$jxjEneLVyvCl=Dq(1D$!5*r1-;7SvV=|v+-`E;@porJOnpNFm2fo-n(H-`dla4=h9Bb=kdiy3aro<+S*+*C9(K4vH{O zvH;4_!__?Otn#SIy~=Pn2Ht1Xlj4UdnD$kHYpR?MDR(L(1s(VVO~stE#LJCnga3OF zqsYjK{-a-t?}qE_@mptVqnEUn()d7NPwOZhioxho5kY>pZZnGF?}3=ANy z)5Jc%XJ~wAtk6(?Ww1-Ix~QmVu$+t0>6hsiqCU@o#iucN@2p8MqrB*hbg9Nh9ygJ) z>aXnB>Z=^SB!Z4R7&=a_Ky3Fg{6xhCL#E948<2Fm(E^kp1E=Fq+ZhZb;q|svDpEG6 zAM{|E$uDiitfK{9%k08v-6!D}B-g^X7EQ7V;sAw3RWL`r?m>8K;Fx-bBWp2+VNZ)I z_sd;;$pwx!(K`+oq8nD8#_#SDurY&GIuMkcvwr-HS*6?UA-zT1Rr_NNz&U?2rclEU zNk1jTK~L9#OEn4dm@9uezgUG7Z>Z0g)u#j@4xhsO*w76-O17m-Y9MNB;hTFw#%6k; z98tNS3}3I#dIQT|Ix1Q0?||&J*9$jaDpG3+B3aBEZ3Ms--mJ<^c|$`(S=kvXJ|n2r za=!==(R-8falXn{jVvyoe2*DdTFUb(LjfB|7W)({>>(;HF78bh8Bu29vu$qUWIS3L zlhyJSQi5DNDA{kf%QfliPf1T-eJc=GXfDTKzy2*H#74d~oo|C1t90lJidQ1(_0Efc z8aR6CHzIx4H8S<{qmhrcsaCqmNVt*~1og$Uf8N2Khil` z^I0))aJf!v$;v?7L9T*b+x^6O$E_Z_FMpb9)6_FR-(^_N>ZvjtGOrQ&b)X%0ZE(00 z4HCuQ34c~wlu6kn3{Mj_+tnUvVSigtKHYNjk(Ux z*}pB-VjFA(aw_}4v?1v?)zJKv{^XEZFoSZJ6@3ITr;$R0^|1c_EQ48qQ(k6S881`i zRyQH5=HqM6H2fsOIcKN9N1F5Gg>0JR-otOk%9vhdzQ*4MFKek7_Q!B$MRD=H4i>=e zNn-RqfE;Nj^C@XPJ^rj9?;=I=HdThc9L0!iF#=v%)wZDb$FsU3;X>Z*qnC-EQWJ#p z5du_#mOYHLgEv{tAbQgu)931DFtdF9lzDg}^}SX2sGO1MVlO>o`Lp(=kW#H-Z&j7e z`i#vt$&;3sokQN=S{3)x7Pom`hA^E*Cy)R)1&@+&wYH;OsMSJ{7T1f&=+><)oA{b9 zKJN))xSUHBB@qjzsb)ZI;c!7_Xf38|felyQ&*h_DA7~zgzNJ`XTl1^xRY@8-caFXF z>Enm8y@FAST#%#PBt%$nebRug+$rXyW5ixEVJHiCt5*zoO4G3kyN9XGbLjkx1c z7!Rv+Gsbk1pK3sH`D)nQo{%wbUj@%FFEj1u)%ga+bMXw-$;*DmBg3_% ziub&LyYi@Z5)z;1Nojx#t1af+9T)u*#e*S!E=N#X;JVojliRm%Yxbr{?<0U~v%)aw zH{48|uaR)GWP6$;_U8cutdpTq&gs&QNXkr~M$`irMG0?e4zG$+()|IUi5eRD9LT~o zwR~TUsbXs*C59ybM$rrmQJjd$F-rB+0GpQZ2a+ff_oqMM>P+L`jXPUtH%J++d|*80 zU%-~IRMSmF1&NAm*Y2a;c`T!q<{<4X@;t3cX&xln>nkyl9-qo{kvWYj+m%QqZ59@>Iqxk8F0;Z=j6n2ET8r_ z0Jq!@b!AW*$lST7`N;8b+?};Ji-RnroJLXZu}GQO@XC<+Dh9o#s6)JPc~BX5ZygG# z=cE8Q`&iW^!YI`I%XZR8xT=uGdKm3sSj#lVmJ<6tQjZN6_uwl;B9~!9*x`8?y^?;R zIEH*26F9Z)?Mw0n^8O3#o|4A)Ha4(_V~Ik~G?rzz;{+^ObIfM_VGR5M#xlv0Z6Nnc z18Oc#8eI1!!f=6v^d`T213bl%D>(P-mip4;i;6fuV!?2)4!H~j*Z|wSZv%RGu}Iob zb&RqvuhET=RHD1I|4ZVcW7vT^zJt^CS#Q(_LA-tcu%CzE*Cy z7oRC(Mk!a@n5L`!mEYG`T#mN+5~Rv^QbchWMk8x(G-laTW-%FOX16iZ)YaRItBB_f zfj|iPtc|qAy)4H7R53i-)WoDcU9Y#Vj}&)fVYq6)^(ZSVPx)`FQ_OEQerCN7BOf`58juI zAXL=xHcC%TrHv5ug$;WMvRxLM0jrY%hC>UR(kmAPn@i0_%{J zubACdb>iVCKnVS;SEs<^S~6 zwbfOZJ$9OlO!oMnX{59k55N!{>=GIw(;x7v$oV=h6ljH7HpYhF34g5cF3TA;ejd$9 zd~$2JE7xhH|IJ8vP=8M3P1jcYfvkS+lfe%!Nxh2qakguR$aUW`I5I|g82mau7tAGQ4a&6Vtm zvh$*YX6r(jLjHlf!tRDai|^JGc%_>8QSn8T%tZrWZBYwyq4<8TB!GUHb*ATQQa<@+(C^@ePq07uxsO$k&z># zHO#>0)4Z?WKDo2Y38o(GVT`)OzGVS;NY04&5@#W=$(bt^d);LUN1JN(JF9KfrZ$R z5NSH)E$DPX^znA^|6*32~X)kD+ zJStQC_ER9z1%T4Yd*PHn%Ko;KCoR4p0cLo*WC=y%{6iU<^T3z4Y@3o$!|mUH`#+NY zkEH+O(o-twl;s8lpN83$C+s&O>KaJb2>_{sMU_09Nv2927f*oH9*8#prskr8?=jgx zrqR|{E)9~iy5m@Ka-c(id|L`cP;RrjW@EuOgj06Zy<4Yaftb|Bs@+7@OgD8H85s|~ zrd}v2Dteo2|IXBRU>c3>ygKTL?rS)>?!)T%*vgy4&fprKj_oya)v@`8@nDS8SSo9> zuQ&0$8eSijKrY{sPyyCIb%~kg#n&=cU>DnUm%5#Tg2o?UYA!lW zKyoDjrgr5ZW(gGpSp*NMxkT#yzukLa(SxGqW3sPYTQEd_K=vCg3Db2=?(U{kT+m!{ zhhdk|OoRE4Tj5Q%x>epSaSc%n(}9*KOZ(?ssQ?2`GSndVo2tYZ*9~fy;idqM3-!G7 zGa9ASw=1S{H012$0)qRq{0P)u4{Z95qLR`TdXl?!gTMGU=3{{&XT=6MP@CGoE}%%j zffrQevI-j^I2<1*&dpx8C*)Yy%OocZG|e=*(m3}$GEOM}qd(txwZrKbE@%+#*W{sSs%?aoCm z2jOnFgC*v@A`S-dJt@IkE&WE%<4MT4`r5pt-NqH~ryB%dFzj%(brVDu<5qdPMoQJ? zXe8HtOls=_oEg9`aqQ&4K;?0oA^={i$L|N7u|Gmjui#b=i@a7%V8kJnwNn@8R8_aY}1yJ z()b!?qEKnvvILMFlOAO`)-zaPd9Ze!R6VmzO z5U{F{M+ByjR?xxoQA-(X*wUW)Rr!J_UXCPL5qAE4@L)eYV!%1jokkMOCQ8m^*)^U+ zhpCb<*56M`YC~2lPnOY0r)HVu+-2@a5(_rEplJ5T@q7TXtmA=Ue3B#P?AT13T(_7U z9R<^K1+N4e_x1IeH{A;clFO*H)+fK^0%xNg_pxkTa{n!YX`TB6!TfTd3}nLXH+@%G zEawR7W&UKfy<0~S%v+d;va};Kagu$c1gm|6LewA5DG6Q9{Oq32>msd5?~b|#&|A9* zHUKV2?QmQXDi>geK*c%d29SGUEm|8F8cFAJVmsy0XdMsz-?B%D)OaZhqj-kT?4nz!~$9+?eW?sUN$#U`58O zaDO9x|36_y9l1YX#v%Y68_d-bV^Aq$cRqrWH()YX_)m;=cHS&3T*adi^^=SZkcCg1 zDFKG-1ZqqIa;$1UUI#Pef?*B^ri>dQRl>I+7KAIma;Kjo7@?^lW!l&csF zNi#_x6muvHK(|S(^a?4ToC_(Q9PaH$$x^B*7nxjlaj-3Jt@%wt$mJ~?*Ez0D9g!pz zmbIGa>4sX`Qz>>1E6)xcf{#@k9op89j0_DAKi@UZrRFpq3<<*8f8jku9z=+nFL;b) z-WAoD{!)3ps%4rBglO0s-sO|;0y1(7e8Q|nt{pac*;>m9E6XC@YGazV+NxdE!Zj3+ z{m7sdP*pbeCz4oQVl0Gwwn>5Z`_kCb6UZc((PmBG#>Oase zNC>1_WRLCN$l6TLj)`lzm7J{M|E4c%cuPcOG44Pt(+4FV3P5EV~%Da(T-0B=L~E zp*K~A>JYaG$T_XbAr8DR;l*M2a^Jr|=b?9o%1&e?F`Mr5Yvki(%0n)-(kt3uIom(l`pnkw7CwC z&F?UbHWb72w&<4LU&!BFE>F{gjHdHuC2wY$u6laO&}lW+$yQDWw`lf6Eo(Z8Swm-| zov5M=${7UhXV+~R3rRT-=L&kC^eYXg@wszpzIbkjya(STKch+@JQ^i zvT}>k&F4bT9D&mwbuKDziIN zO;KE*gD-&77Hv;@N%(9i9YgH;aK3Kk3O2}L#}pb6rUaeNb(l_tfy`nwterH=s(_U~ z4|DOWFTA}5oVV5a;VY1mX|@SpFw=q1Rn;RFXUhpU^W$xD&ms=cC$ZoRUspB|?yNAq zmcml%;!rdMmXrVuCi5d_9tvqs&|%|sc2MAe=Mmymdr2&=hy;_Q+%;D}Co;-68b&4H zI0M{?=}+fji8SmApb~?Om{yZ2PEw}J1~3Y2j9PTmmzYB}fh1J;G?;mA${V;>i+gx@ zSo3HPKIRwqXSQVlkZt+;XSOAs*scF7M!A46C3Lc_`E9=C)`d&;7s-!b8Xc?=K!;o^ znN^>it2K~ei8B{27;t|wfUKQ(yo^1c{6-e?WLHkJ4?&t=T1IG1ls!+ z4_|kxZf5q4fH%Oq{GPY$f-H~m;Kv>=WS~QYmnA=cdlWaPs$xEc>PQ6@BwCdy;5}(@ z|JR22^mZ_jUNW?xunMl3F;SN6-`3bM3u>l^dgpg6=6Q?GU%ibHw$nd8F6%!1rnuIf z>FTbY2AJWE^x*hz)$Xi@_lhk5b|2EK%gW0WgpoAZ7%MwjM0Ile3XVSe$qqG5_%w$4 z`im)j1LeZ08AeD<1=vm+7YY;oP#{k7lPzjU6K}yn&ij$_6=^p!`E2gKdnnDi#j@XxDeBEw=%cG*B|&mE+*@jf#=d~MV217!MSlWSX9;A$52+Enh(qT5 zWh|t+2BXr(U8qlaQe87YHU3BW*U;j#kmhr8(5a_bQr`v z`$gjs0rfVcE%)C_!?hca@I{#nm&I==Qb})Szq&Bk)lFjTkpCIySYrf-`FO@7*QjlW z`w$Ds&(s{uxTv(*oME$S;L{^TJXU;3mmS3^{^I>EQS{lITsY0&&HZ=~%Ds4-tCDEq zxIrvVcV;1l&&58MJQ;a+y}2d*4+IknGs`C*650OY$M{buLai)R55|#Pb46+7FSzMg zF2=ewrNpS6ye=rI4Gu{fI9z5wY^?yc0fl)mA;uh%uBdE<7Hi)5S@f9{0G@4)mlB;t zX>p||H^e7!v_uE$!upu&%4B_Fkqmq<9~Y2WR>n?!Re+DoYwoS5HMSc6tPV(wQA7*6 z&GY+I7t=p-Op~LWnf^$30m3Fi83$2>fOcc2Gv7Q8Yc4}wUi@t4VDH}RmEpeII31+q zo1i1a2>||>f1K?Hlb$r!nF(mUVg|{x(bY|EXIFV*Rlj=V;o@L{T?^bM$>SIefI!o; zOYXLZvuhxE_)c~BJpr}&xCLtH{b%s-?AaYm4R(`J5=D+{Be|H`a*PI2#H4yYe8+>P z))+sg@nmwmXn+jR$I2>asdyR*JXTT{LPkXmp&|xn8U2qpUerLP{7M4W1I_`~h|(U1RC`ahcff5uW@3WO{&6iWrI$%`LaWIR9KI_R$u49eDD+BW$$J?tg0 z50R#j%cKfbGXG@V+>OP=t`MFTRWdH+{Zg7o85G-i>JXIELU*U}hwU1fC zUO{?Vu&xWSGgotE?SJpVZli}<6dzl#leanWJy#nWD|1+-g6}IKQ%9V`iRB?uuw!NA z%}*F*m8uJ-)ml@JvmLqWd!(}Yjih|&qkUnHYabQ%B4<5}p}*vcOC|sdCZBqD7|xgq z*FdJu3THchvjMfo#~ZRfn(L+Tucl6%kYs6&Of_;JpVX^$-LtuZ;yl`T6ju-3rC}ys zvn|05VGyeNJ1^b6GTMfdQl28O`=*ub5bxH@K{4hl*)!Eb4-|+b6mMwRSTMLuhno*L zNhRp5`Ho5W=jI^SVfSx!RrR9iRdxp@43}}5P3P`MzZM;uH_WAyTM_X za1Rt1nkBWV66z+Jp%$v5M&70$<(`}T)aJoh|ll(+VzkC5l>Nji-^&}oT<3K-id?>9M2kMdZ= zEdoc=8JMg*K&<4@WgS9}7ai;}jur#QlshD?%p(N3s_bSnb9LI~r1Q5v4Za-{fLAKD z8*@oy&O7cXvCdbGOh@T;`0x;L&Q_6E&3Ba?j}~J1!Nt|U-#~VhV_hN2uOMHPbQ1@k zCL6DR*<0GJx}CehXD-~Vh8i;6=_CMf$%F4oESFHH=nw1QigTBRo9TEfc)IMsopm|A zxNdK5R+{gP!ePE4q+Y&i*C#}-k7QSs4Rqgm8BxMHOGoykD+^J_XS3!Tb1LL9Y9$-7apuP2Lin<-=n$hND(ysm-3egwG*IYwa&*O=u~{Z;vFU zz10=+9>~&ao>S6Xj~Q-cnpYYocb+?(_T^LM=^U`ZCwnlC<#TAt`UW9jj!aHYmU~r& zLykDYZWf*CW50^EVB3z!X7Z&~e%m52;iUnU1T$_MLN|8>NZV*_u{k)*2X+znm`EcS zsuXc{6VA14eJk(jrYCPtE9WBd)h&#sDEge%07c`Oi`Hx7%2yK$Btx>%Q zGs+VT_(PuF599mOgV~~REl3c%E%AC5nlmz)X3ol#Sr8zX-Z(Ocj0PpL^b6irt61%N zL-Y#A0>Uxh;ylxKRUlDFs7($ADtRV6_4=S{OC03sGjU|^xYs-(+SaNBMJ)D=2w%|e z^ZWj)5F{bZ9axpl`<;UI0i=&)t8Pb>bl;QTKc_ldxS`zGMy>*ROnWn+Xw0KUwqVy5 z7sSVN!^G3&;Jb0IPQOPyQ`pPNxK2B{a*;W%H}d*uW(weAS~jA*+m7OD;pA6dc5a^%ix()wPNq*o9#;;S+Gyufr8lH+vr1M`F{a zMmTXWuO!3qiE2QOFrpjJO(qaNfDma#E>c6A=|?cEpaLMzuRg z{_Xmbc6qHiE9i6}mnxCkQ$37G2Q5eI>B*GWpnKDy<(gB%6JG3LgqEG8i+2Rd>70p+ z+sf~|Gw#%ta*gBk^n`?EmC;2VANiQ;SPNf$&?==S$ANKBhAhj19?zG|4tF%jVU2~& znMobWK*k6emk0DX=x!LvQE44D`aWrL4j;>Pc7nQc>Sr5hubyuZLsDj??Q5saz~5X; zBf@nv$mUBiuB+PvmkW|aAI*G)N3xHzk2+R(gdr@#lq8-HZ9Z;A)-A$qY*g^SM%t&{ z<`LY%%IvX2&G@{@9g6nnS{LiP=H_;ndvp+--)6SVqv^}}^S>}}6-XeqNxlo2R3M+& zAC=c!oebMaWGhO1+nnTYo> zmGRlUP&;gJh)GB9F!gPyM%3G~>(CjzYyegiJ`L}>2(Fb_PrE|)$EW6p?b0v~R^K}C zDkJu!sFFH-Xx#=N1SUt1ly?_8rn`L|#pe1<>?f;mw>>d#%sa${3ZN?12ulEu3q)MK z_8T7`*k-7(xiuyqt9nuqf>8yte|Fa zSE?YY3i`1M!flQQZ1whx2ZhPx|I=A zzacR@ao9BlW)wnK5MPw7u;r@a&^k*R8Xi}M)*Q>lZb#Yx1_kqRyLnQ%dav&fsE8Ca zK$vFQeGgO};q?l+nj%#oAnTI904|xMXd4$7M|uBwh}n~#xw*Mx4e-;z`?CYU*7Dv8 zCure1AlX-o`$V;lE6q1ou|!)H2zMu{S?)+c0@L$R|Q^`xR_qZmd-Jkk1fz zTHD-e>DXLUSn)E+U4R2_di>(a{bk3TWYmFE673c=A>Kr+CZi?L+uE=2sFr~P2ByG$ zzy)U$!0jsz4bC=eqeRt*W3Y`HQG8#T3oM)_qlAhvROt!-O#)f?mIa%{IZW1eh#53$Bt$uTI( zW9QGedoHaE_b;W0Kl}t?AbH89;W8Po`C3J`Ax&ZLTfc3JvEt+7NOR=pO!N8CrSF}Z zhRc2M$vAgu8nfKAaP=kx#QLW}1|Wr#G$x#nDyZW7W5CjP(yap+i5>ul$U|?aSVpS7 z;-OmRQ~IvGIoGDbO#b$$U&(ZK{wf}K-V%^@3Z~C0p~QMg^0pRR(wmT#vO3Hi1SGf_ z7#K|V$*Z;15*8K~2DtO&JtK5C6I(75VKtsh+nddoZ-~?q6I(?`@|pOSYkfPmsgE1l zW;KS7zA4XVA`2_Jqszt2v)7cFnY-;)7|@rUk`j4y8$6IW3EYjvsn7G-6sbR2X(0Xl zNgoSYg~Rx_U0&3!Fg4hKGvfOWdg~Xt{L}HPy5ldGLNga6mqy5RQc~j3J@tmPJALHO0fkE}q;=S|(*^UYr&Twf|2zcmjN^lj<8(1(UbJ-jip<_Q37jU&+E8? zjY0!fM~WMU^rA_Jx+!1&xs4BemaVf7`GG*m2wypSglpN^3%-Hh`_j#Z2MY}Aor8mfz>;^H@QtBc_W{x3OJmBL z6`E_0EC-oMm*~$l1_WH>u|5$t#CA3mfX~}&ae#AUSlU-Y6-y|Uc(sAGrd%7?cnPqx zW@8`7h1S*r6z+2W|FgB-FE1}I-(2G9T3x49pCPuyVngVaSXpDSGu@S^)sF0XzB>6^ zqqpGJm-|+9@6OwAofbcLnqcM}0sd>(%etRu`{-YgGOT(p5#-p*!y zN}xsE=dvPwhPI9|?X2;*@(vP0qjJ&bPw3d%A zSLV~2wWl9FyJ(zzZ1dT|-#z6S)hEvSAvM|qvVap!OTQgEi{&h$c#aguE*+PNp%YJN zMaaCJ7CQd~6W?O@{&R-~+^g^J-WdxF=!;Q-vRB>bF3jj%3(TiouU?gRW$c+9*)tcG zm>U=x<3Mx9svdWdtcBIRz%kXELh^GDi$^Lb-)7^LDhUwn(J4tp8SHDk2ijR4>%SMX z0g7&-s*1samS Date: Thu, 8 Jun 2017 22:29:21 -0400 Subject: [PATCH 149/744] Update plot --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6646674..00abec20 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,7 @@ python -m tensorflow.tensorboard --logdir /mnt/ Date: Thu, 8 Jun 2017 22:37:41 -0400 Subject: [PATCH 150/744] URL to sphinx --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 00abec20..bbbbf602 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,8 @@ optionally add `--user` to install in a home directory. ## Module index +The Sphinx pages for FRNN are building up here: http://tigress-web.princeton.edu/~alexeys/docs-web/html/ + ## Tutorials ### Sample usage on Tigergpu From 5de330b7a69ef18e4539ee95a8e5e7551a512b92 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 8 Jun 2017 23:05:41 -0400 Subject: [PATCH 151/744] all_signals -> all_signals.values(), and cast to list --- plasma/conf_parser.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index ea71214b..04a4ef37 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -55,7 +55,7 @@ def parameters(input_file): #params['model']['loss'] = params['data']['target'].loss #signals - params['paths']['all_signals'] = all_signals + params['paths']['all_signals'] = list(all_signals.values()) #assert order q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile #shot lists @@ -105,10 +105,10 @@ def parameters(input_file): print("Signal {} is not fully defined for {} machine. Skipping...".format(sig,params['paths']['data'].split("_")[0])) params['paths']['specific_signals'] = list(filter(lambda x: x in params['paths']['use_signals_dict'].keys(), params['paths']['specific_signals'])) selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} - params['paths']['use_signals'] = selected_signals.values() + params['paths']['use_signals'] = list(selected_signals.values()) else: #default case - params['paths']['use_signals'] = params['paths']['use_signals_dict'].values() + params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) print("Selected signals {}".format(params['paths']['use_signals'])) From cc7e20e6b2dc16240cd6b3b1ae9878a02e61b8c0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 8 Jun 2017 23:35:59 -0400 Subject: [PATCH 152/744] Ok, there is use_signals and all_signals. Perhaps a better approach exists but that will do for now --- plasma/conf_parser.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 04a4ef37..efd1c5fa 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -55,7 +55,7 @@ def parameters(input_file): #params['model']['loss'] = params['data']['target'].loss #signals - params['paths']['all_signals'] = list(all_signals.values()) + params['paths']['all_signals_dict'] = all_signals #assert order q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile #shot lists @@ -106,9 +106,13 @@ def parameters(input_file): params['paths']['specific_signals'] = list(filter(lambda x: x in params['paths']['use_signals_dict'].keys(), params['paths']['specific_signals'])) selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} params['paths']['use_signals'] = list(selected_signals.values()) + + selected_signals = {k: params['paths']['all_signals_dict'][k] for k in params['paths']['specific_signals']} + params['paths']['all_signals'] = list(selected_signals.values()) else: #default case params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) + params['paths']['all_signals'] = list(params['paths']['all_signals_dict'].values()) print("Selected signals {}".format(params['paths']['use_signals'])) From ca4e2c86dc9abd5f0f9e3d8d6a425059b4eb2c25 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sat, 24 Jun 2017 16:51:38 -0400 Subject: [PATCH 153/744] Update Slurm submission file to CUDA8, later version of MPI --- examples/slurm.cmd | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index bf98d1c3..12f9c2fb 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -1,12 +1,18 @@ #!/bin/bash -#SBATCH -t 01:00:00 -#SBATCH -N 1 +#SBATCH -t 01:30:00 +#SBATCH -N 3 #SBATCH --ntasks-per-node=4 #SBATCH --ntasks-per-socket=2 #SBATCH --gres=gpu:4 +#SBATCH -c 4 module load anaconda source activate PPPL -module load cudatoolkit/7.5 cudann openmpi/intel-16.0/1.8.8/64 +module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 + +rm /tigress/alexeys/model_checkpoints/* +rm /tigress/alexeys/csv_logs/* +rm /tigress/alexeys/Graph/* + srun python mpi_learn.py From 80525862812745e5c91c91905604b3dcf8fc6c5d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 15:09:40 -0400 Subject: [PATCH 154/744] Less epochs for the Jenkins test --- examples/conf.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 92789ab8..c151d10e 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -87,7 +87,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 400 + num_epochs: 4 use_mock_data: False data_parallel: False hyperparam_tuning: False @@ -100,4 +100,4 @@ callbacks: mode: 'max' monitor: 'val_roc' patience: 4 - write_grads: False \ No newline at end of file + write_grads: False From 32265a59b0f3fc6c6059a9366dfe6224e0291d77 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 15:25:17 -0400 Subject: [PATCH 155/744] Jenkins helper script --- examples/jenkins.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 examples/jenkins.sh diff --git a/examples/jenkins.sh b/examples/jenkins.sh new file mode 100644 index 00000000..d7529d7c --- /dev/null +++ b/examples/jenkins.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +rm /tigress/alexeys/results/* +rm /tigress/alexeys/model_checkpoints/* +rm /tigress/alexeys/csv_logs/* +rm /tigress/alexeys/Graph/* + +ls ${PWD} +cd examples + +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 +module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 + +mpirun -npernode 4 python mpi_learn.py From f8ac5d5715f9a5ad4686a7dd79cf98b4dec3a4f0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 15:27:00 -0400 Subject: [PATCH 156/744] Adjust path --- examples/jenkins.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index d7529d7c..27ad2b22 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -6,7 +6,7 @@ rm /tigress/alexeys/csv_logs/* rm /tigress/alexeys/Graph/* ls ${PWD} -cd examples +#cd examples module load anaconda source activate PPPL From 85b2b2eebca9d5dcc54f4740c5cb801b2d55fb91 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 15:30:25 -0400 Subject: [PATCH 157/744] Echo hostname --- examples/jenkins.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 27ad2b22..115618d4 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -7,6 +7,7 @@ rm /tigress/alexeys/Graph/* ls ${PWD} #cd examples +echo $hostname module load anaconda source activate PPPL From 66f089bb40bd64acad95d2531dbdd1b1f9f443cf Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 16:01:58 -0400 Subject: [PATCH 158/744] Test --- examples/jenkins.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 115618d4..a026a157 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -14,4 +14,5 @@ source activate PPPL module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 -mpirun -npernode 4 python mpi_learn.py +echo $SLURM_NODELIST +#mpirun -npernode 4 python mpi_learn.py From 37ec81993930f50c0e6d6b329d41923aaa9505cc Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 16:03:53 -0400 Subject: [PATCH 159/744] Actual test --- examples/jenkins.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index a026a157..1e22cbd9 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -15,4 +15,4 @@ module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 echo $SLURM_NODELIST -#mpirun -npernode 4 python mpi_learn.py +mpirun -npernode 4 python mpi_learn.py From d7b446c4aa4d2509a02cb894abe870efd78c1329 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 19:09:39 -0400 Subject: [PATCH 160/744] Sample batch script --- examples/FRNN_TigerGPU.cmd | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 examples/FRNN_TigerGPU.cmd diff --git a/examples/FRNN_TigerGPU.cmd b/examples/FRNN_TigerGPU.cmd new file mode 100644 index 00000000..0e997d14 --- /dev/null +++ b/examples/FRNN_TigerGPU.cmd @@ -0,0 +1,20 @@ +#!/bin/bash +#SBATCH -t 01:30:00 +#SBATCH -N 4 +#SBATCH --ntasks-per-node=4 +#SBATCH --ntasks-per-socket=2 +#SBATCH --gres=gpu:4 +#SBATCH -c 4 + + +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 +module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 + +rm /tigress/alexeys/results/* +rm /tigress/alexeys/model_checkpoints/* +rm /tigress/alexeys/csv_logs/* +rm /tigress/alexeys/Graph/* + +srun python mpi_learn.py From 408a646544bdef5356169eed4e775609bac52bba Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 20:24:54 -0400 Subject: [PATCH 161/744] Add jenkins validation output --- examples/mpi_learn.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index cb635c35..fe3c7847 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -107,8 +107,7 @@ print('Train ROC: {:.4f}'.format(roc_train)) print('Test Loss: {:.3e}'.format(loss_test)) print('Test ROC: {:.4f}'.format(roc_test)) - - + np.savetxt("jenkins_validate.txt",np.array([roc_test])) if task_index == 0: From 40e83db3cd4258ec4e6871cc60cb45010d8fd416 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 29 Jun 2017 20:27:36 -0400 Subject: [PATCH 162/744] Better: throwing sys.exit(1) should suffice --- examples/mpi_learn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index fe3c7847..90ad11eb 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -107,7 +107,7 @@ print('Train ROC: {:.4f}'.format(roc_train)) print('Test Loss: {:.3e}'.format(loss_test)) print('Test ROC: {:.4f}'.format(roc_test)) - np.savetxt("jenkins_validate.txt",np.array([roc_test])) + if roc_test < 0.8: sys.exit(1) if task_index == 0: From 6243198f46d5686d476bee6559cac868f6e2ef84 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 29 Jun 2017 20:29:25 -0400 Subject: [PATCH 163/744] Delete FRNN_TigerGPU.cmd --- examples/FRNN_TigerGPU.cmd | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 examples/FRNN_TigerGPU.cmd diff --git a/examples/FRNN_TigerGPU.cmd b/examples/FRNN_TigerGPU.cmd deleted file mode 100644 index 0e997d14..00000000 --- a/examples/FRNN_TigerGPU.cmd +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -#SBATCH -t 01:30:00 -#SBATCH -N 4 -#SBATCH --ntasks-per-node=4 -#SBATCH --ntasks-per-socket=2 -#SBATCH --gres=gpu:4 -#SBATCH -c 4 - - -module load anaconda -source activate PPPL -module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 -module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 - -rm /tigress/alexeys/results/* -rm /tigress/alexeys/model_checkpoints/* -rm /tigress/alexeys/csv_logs/* -rm /tigress/alexeys/Graph/* - -srun python mpi_learn.py From 3fe2b18032460cfd7d3c6b2e664f28d20521de96 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 30 Jun 2017 11:14:59 -0400 Subject: [PATCH 164/744] Code cleanup --- examples/jenkins.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 1e22cbd9..5291c551 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -7,7 +7,6 @@ rm /tigress/alexeys/Graph/* ls ${PWD} #cd examples -echo $hostname module load anaconda source activate PPPL From b0a34b671e57bda947dfe1cd66afaefb6a32c41a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 2 Jul 2017 22:53:03 -0400 Subject: [PATCH 165/744] only saving model checkpoint when monitored metric (e.g. validation roc) is increasing --- plasma/models/builder.py | 6 ++++++ plasma/models/mpi_runner.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 28073a33..136fbce4 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -222,6 +222,12 @@ def save_model_weights(self,model,epoch): save_path = self.get_save_path(epoch) model.save_weights(save_path,overwrite=True) + def delete_model_weights(self,model,epoch): + save_path = self.get_save_path(epoch) + assert(os.path.exists(save_path)) + os.remove(save_path) + + def get_save_path(self,epoch): unique_id = self.get_unique_id() return self.conf['paths']['model_save_path'] + 'model.{}._epoch_.{}.h5'.format(unique_id,epoch) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index d49a940c..c8c0fafc 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -659,6 +659,12 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non 'batch_size': batch_size, }) callbacks.on_train_begin() + if conf['callbacks']['mode'] == 'max': + best_so_far = -np.inf + cmp_fn = max + else: + best_so_far = np.inf + cmp_fn = min while e < num_epochs-1: if task_index == 0: @@ -686,6 +692,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss + best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']],best_so_far) stop_training = False if task_index == 0: @@ -700,6 +707,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non callbacks.on_epoch_end(int(round(e)), epoch_logs) if hasattr(mpi_model.model,'stop_training'): stop_training = mpi_model.model.stop_training + if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + specific_builder.delete_model_weights(train_model,int(round(e))) #tensorboard if backend != 'theano': @@ -806,4 +815,4 @@ def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): def on_train_end(self, _): - self.writer.close() \ No newline at end of file + self.writer.close() From e47ee5dac537fc12e45ef9e9e45d23cda1d666bf Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 2 Jul 2017 23:02:45 -0400 Subject: [PATCH 166/744] only saving checkpoint if monitored quality improves in runner.py --- plasma/models/runner.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 195cf95c..6ecfa9b5 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -68,6 +68,14 @@ def train(conf,shot_list_train,shot_list_validate,loader): num_so_far_accum = 0 num_so_far = 0 num_total = np.inf + + if conf['callbacks']['mode'] == 'max': + best_so_far = -np.inf + cmp_fn = max + else: + best_so_far = np.inf + cmp_fn = min + while e < num_epochs-1: e += 1 print('\nEpoch {}/{}'.format(e+1,num_epochs)) @@ -104,12 +112,12 @@ def train(conf,shot_list_train,shot_list_validate,loader): loader.verbose=False#True during the first iteration else: _ = train_model.predict(batch_xs,batch_size=conf['training']['batch_size']) - e = e_start+1.0*num_so_far/num_total sys.stdout.flush() - training_losses.append(np.mean(training_losses_tmp)) + ave_loss = np.mean(training_losses_tmp) + training_losses.append(ave_loss) specific_builder.save_model_weights(train_model,int(round(e))) if conf['training']['validation_frac'] > 0.0: @@ -118,6 +126,14 @@ def train(conf,shot_list_train,shot_list_validate,loader): validation_losses.append(loss) validation_roc.append(roc_area) + epoch_logs = {} + epoch_logs['val_roc'] = roc_area + epoch_logs['val_loss'] = loss + epoch_logs['train_loss'] = ave_loss + best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']],best_so_far) + if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + specific_builder.delete_model_weights(train_model,int(round(e))) + if conf['training']['ranking_difficulty_fac'] != 1.0: _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) batch_iterator.__exit__() From 96ff4fc6b4f619f58323736c7a75be597de922e7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 6 Jul 2017 15:44:10 -0400 Subject: [PATCH 167/744] Add a deterministic option for categorical hyperparam. Use case: feature importance augmentation studies --- plasma/models/hyperparameters.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plasma/models/hyperparameters.py b/plasma/models/hyperparameters.py index b84c5fd1..2f4435f8 100644 --- a/plasma/models/hyperparameters.py +++ b/plasma/models/hyperparameters.py @@ -38,6 +38,14 @@ def __init__(self,path,values): def choice(self): return random.choice(self.values) +class GridCategoricalHyperparam(Hyperparam): + + def __init__(self,path,values): + self.path = path + self.values = iter(values) + + def choice(self): + return next(self.values) class ContinuousHyperparam(Hyperparam): def __init__(self,path,lo,hi): From 769bed6a845dd3477af50fbaf4b3515e339a4c79 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 6 Jul 2017 15:44:52 -0400 Subject: [PATCH 168/744] Hyperparameter belong in primitives sub module, not models --- plasma/primitives/hyperparameters.py | 88 ++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 plasma/primitives/hyperparameters.py diff --git a/plasma/primitives/hyperparameters.py b/plasma/primitives/hyperparameters.py new file mode 100644 index 00000000..2f4435f8 --- /dev/null +++ b/plasma/primitives/hyperparameters.py @@ -0,0 +1,88 @@ +import numpy as np +import random +import abc + +class Hyperparam(object): + + @abc.abstractmethod + def choice(self): + return 0 + + def get_conf_entry(self,conf): + el = conf + for sub_path in self.path: + el = el[sub_path] + return el + + def assign_to_conf(self,conf,save_path): + val = self.choice() + print(" : ".join(self.path)+ ": {}".format(val)) + el = conf + for sub_path in self.path[:-1]: + el = el[sub_path] + el[self.path[-1]] = val + + with open(save_path+"changed_params.out", 'a+') as outfile: + for el in self.path: + outfile.write("{} : ".format(el)) + outfile.write("{}\n".format(val)) + + + +class CategoricalHyperparam(Hyperparam): + + def __init__(self,path,values): + self.path = path + self.values = values + + def choice(self): + return random.choice(self.values) + +class GridCategoricalHyperparam(Hyperparam): + + def __init__(self,path,values): + self.path = path + self.values = iter(values) + + def choice(self): + return next(self.values) + +class ContinuousHyperparam(Hyperparam): + def __init__(self,path,lo,hi): + self.path = path + self.lo =lo + self.hi =hi + + def choice(self): + return float(np.random.uniform(self.lo,self.hi)) + +class LogContinuousHyperparam(Hyperparam): + def __init__(self,path,lo,hi): + self.path = path + self.lo = self.to_log(lo) + self.hi = self.to_log(hi) + + def to_log(self,num_val): + return np.log10(num_val) + + def choice(self): + return float(np.power(10,np.random.uniform(self.lo,self.hi))) + + +class IntegerHyperparam(Hyperparam): + def __init__(self,path,lo,hi): + self.path = path + self.lo =lo + self.hi =hi + + def choice(self): + return int(np.random.random_integers(self.lo,self.hi)) + + +class GenericHyperparam(Hyperparam): + def __init__(self,path,choice_fn): + self.path = path + self.choice_fn = choice_fn + + def choice(self): + return self.choice_fn() From 758b039248a29a83aaf6b2f3b8e242d85f76e897 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 6 Jul 2017 15:51:22 -0400 Subject: [PATCH 169/744] Adjust import paths, use getpass to determine netid --- examples/check_tuning.py | 4 ++-- examples/tune_hyperparams.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index 18a2e943..623d02f9 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -1,4 +1,4 @@ -from plasma.models.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam +from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam from pprint import pprint import yaml import datetime @@ -9,7 +9,7 @@ import pandas import numpy as np -dir_path = "/tigress/jk7/hyperparams/" +dir_path = "/tigress/{}/hyperparams/".format(getpass.getuser()) if len(sys.argv) <= 1: dir_path = dir_path + os.listdir(dir_path)[0] + '/' print("using default dir {}".format(dir_path)) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index fe997657..9b4c6cf8 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,4 +1,4 @@ -from plasma.models.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam +from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam from pprint import pprint import yaml import datetime @@ -20,7 +20,7 @@ tunables = [lr,lr_decay,fac] #target -run_directory = "/tigress/jk7/hyperparams/" +run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = "/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" executable_name = "mpi_learn.py" From 45f873f7acb48c3ab66416a575804957124f4a1a Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 6 Jul 2017 19:03:48 -0400 Subject: [PATCH 170/744] Fix Jenkins build --- examples/jenkins.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 5291c551..6d5a8394 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -6,7 +6,6 @@ rm /tigress/alexeys/csv_logs/* rm /tigress/alexeys/Graph/* ls ${PWD} -#cd examples module load anaconda source activate PPPL @@ -14,4 +13,4 @@ module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 echo $SLURM_NODELIST -mpirun -npernode 4 python mpi_learn.py +srun python mpi_learn.py From e5dee5ffbdd321b076b0588c5ec86e1521ca7561 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 7 Jul 2017 12:54:46 -0400 Subject: [PATCH 171/744] Hyperparameters moved to primitives submodule --- plasma/models/hyperparameters.py | 88 -------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 plasma/models/hyperparameters.py diff --git a/plasma/models/hyperparameters.py b/plasma/models/hyperparameters.py deleted file mode 100644 index 2f4435f8..00000000 --- a/plasma/models/hyperparameters.py +++ /dev/null @@ -1,88 +0,0 @@ -import numpy as np -import random -import abc - -class Hyperparam(object): - - @abc.abstractmethod - def choice(self): - return 0 - - def get_conf_entry(self,conf): - el = conf - for sub_path in self.path: - el = el[sub_path] - return el - - def assign_to_conf(self,conf,save_path): - val = self.choice() - print(" : ".join(self.path)+ ": {}".format(val)) - el = conf - for sub_path in self.path[:-1]: - el = el[sub_path] - el[self.path[-1]] = val - - with open(save_path+"changed_params.out", 'a+') as outfile: - for el in self.path: - outfile.write("{} : ".format(el)) - outfile.write("{}\n".format(val)) - - - -class CategoricalHyperparam(Hyperparam): - - def __init__(self,path,values): - self.path = path - self.values = values - - def choice(self): - return random.choice(self.values) - -class GridCategoricalHyperparam(Hyperparam): - - def __init__(self,path,values): - self.path = path - self.values = iter(values) - - def choice(self): - return next(self.values) - -class ContinuousHyperparam(Hyperparam): - def __init__(self,path,lo,hi): - self.path = path - self.lo =lo - self.hi =hi - - def choice(self): - return float(np.random.uniform(self.lo,self.hi)) - -class LogContinuousHyperparam(Hyperparam): - def __init__(self,path,lo,hi): - self.path = path - self.lo = self.to_log(lo) - self.hi = self.to_log(hi) - - def to_log(self,num_val): - return np.log10(num_val) - - def choice(self): - return float(np.power(10,np.random.uniform(self.lo,self.hi))) - - -class IntegerHyperparam(Hyperparam): - def __init__(self,path,lo,hi): - self.path = path - self.lo =lo - self.hi =hi - - def choice(self): - return int(np.random.random_integers(self.lo,self.hi)) - - -class GenericHyperparam(Hyperparam): - def __init__(self,path,choice_fn): - self.path = path - self.choice_fn = choice_fn - - def choice(self): - return self.choice_fn() From ea02ec9157dc556765db8f4ab809dba76fc5efaa Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 7 Aug 2017 20:57:33 -0400 Subject: [PATCH 172/744] Bug fix: scalar variable summaries on per epoch basis were not being merged --- plasma/models/mpi_runner.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index c8c0fafc..344ef6fd 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -723,8 +723,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non if task_index == 0: callbacks.on_train_end() - pass - #tensorboard.on_train_end() + tensorboard.on_train_end() mpi_model.close() @@ -786,7 +785,14 @@ def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): logs = logs or {} for name, value in logs.items(): - tf.summary.scalar(name,value) + if name in ['batch', 'size']: + continue + summary = tf.Summary() + summary_value = summary.value.add() + summary_value.simple_value = value.item() + summary_value.tag = name + self.writer.add_summary(summary, epoch) + self.writer.flush() tensors = (self.model.inputs + self.model.targets + @@ -814,5 +820,5 @@ def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): if val_steps <= 0: break - def on_train_end(self, _): + def on_train_end(self): self.writer.close() From 7cf6519e7e61cdf00085a298670b29e44eaec109 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 7 Aug 2017 20:58:13 -0400 Subject: [PATCH 173/744] Tab-space compatbility --- examples/mpi_learn.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 90ad11eb..47cb79f5 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -102,11 +102,11 @@ y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) if task_index == 0: - print('=========Summary========') - print('Train Loss: {:.3e}'.format(loss_train)) - print('Train ROC: {:.4f}'.format(roc_train)) - print('Test Loss: {:.3e}'.format(loss_test)) - print('Test ROC: {:.4f}'.format(roc_test)) + print('=========Summary========') + print('Train Loss: {:.3e}'.format(loss_train)) + print('Train ROC: {:.4f}'.format(roc_train)) + print('Test Loss: {:.3e}'.format(loss_test)) + print('Test ROC: {:.4f}'.format(roc_test)) if roc_test < 0.8: sys.exit(1) From e4a5a4efd7e1993dd82e0784cae8018c78781ec5 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 10 Aug 2017 10:33:33 -0400 Subject: [PATCH 174/744] Fix import error for Python3 --- plasma/models/runner.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 6ecfa9b5..1412c241 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -4,7 +4,6 @@ import matplotlib.pyplot as plt import numpy as np -from itertools import imap from hyperopt import hp, STATUS_OK @@ -14,6 +13,9 @@ from functools import partial import pathos.multiprocessing as mp +if sys.version_info[0] < 3: + from itertools import imap + from plasma.conf import conf from plasma.models.loader import Loader, ProcessGenerator from plasma.utils.performance import PerformanceAnalyzer From 619bb71615660bc2c05eb78da34ae581a5042351 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 10 Aug 2017 10:43:53 -0400 Subject: [PATCH 175/744] Tensorflow1.3 requires CuDNN6+ --- examples/jenkins.sh | 10 +++++----- examples/slurm.cmd | 9 ++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 6d5a8394..9d9087e6 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -1,16 +1,16 @@ #!/bin/bash -rm /tigress/alexeys/results/* rm /tigress/alexeys/model_checkpoints/* -rm /tigress/alexeys/csv_logs/* -rm /tigress/alexeys/Graph/* ls ${PWD} module load anaconda -source activate PPPL -module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 +module load cudatoolkit/8.0 module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +module load cudnn/cuda-8.0/6.0 +source activate PPPL + +export OMPI_MCA_btl="tcp,self,sm" echo $SLURM_NODELIST srun python mpi_learn.py diff --git a/examples/slurm.cmd b/examples/slurm.cmd index 12f9c2fb..75007cfe 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -8,11 +8,18 @@ module load anaconda +module load cudatoolkit/8.0 +module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +module load cudnn/cuda-8.0/6.0 source activate PPPL -module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 +#remove checkpoints for a benchmark run rm /tigress/alexeys/model_checkpoints/* +rm /tigress/alexeys/results/* rm /tigress/alexeys/csv_logs/* rm /tigress/alexeys/Graph/* +rm /tigress/alexeys/normalization/* + +export OMPI_MCA_btl="tcp,self,sm" srun python mpi_learn.py From a6852d1328cefbac6d678cb03c61042dfbf5abab Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 10 Aug 2017 11:11:18 -0400 Subject: [PATCH 176/744] Check np.any in Py3.6 to avoid ValueError --- plasma/utils/performance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index c0e5194e..08eb6ba4 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -75,7 +75,7 @@ def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): def get_p_thresh_range(self): #return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) - if self.p_thresh_range == None: + if np.any(self.p_thresh_range) == None: all_preds_tr = self.pred_train all_truths_tr = self.truth_train all_disruptive_tr = self.disruptive_train From e61caf7c605388b8372bde2272d5e2d261251f03 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 10 Aug 2017 11:18:00 -0400 Subject: [PATCH 177/744] Python3 issue: explicitely broadcast weights from root to other tasks: see bug descrption in comments --- plasma/models/mpi_runner.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 344ef6fd..5d5cb045 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -541,6 +541,16 @@ def mpi_make_predictions(conf,shot_list,loader,custom_path=None): model = specific_builder.build_model(True) specific_builder.load_model_weights(model,custom_path) + + #broadcast model weights then set it explicitely: fix for Py3.6 + if sys.version_info[0] > 2: + if task_index == 0: + new_weights = model.get_weights() + else: + new_weights = None + nw = comm.bcast(new_weights,root=0) + model.set_weights(nw) + model.reset_states() if task_index == 0: pbar = Progbar(len(shot_list)) From 8ddafe69980e36f74fe0f7885070f169de5f4e70 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 13 Aug 2017 14:35:06 -0400 Subject: [PATCH 178/744] Fix tensorboard TypeError: List of Tensors when single Tensor expected when writing grads --- plasma/models/mpi_runner.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 5d5cb045..b0f45e2a 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -767,17 +767,25 @@ def __init__(self, log_dir='./logs', def set_model(self, model): self.model = model + print(type(self.model)) self.sess = K.get_session() if self.histogram_freq and self.merged is None: for layer in self.model.layers: for weight in layer.weights: - tf.summary.histogram(weight.name, weight) + mapped_weight_name = weight.name.replace(':', '_') + tf.summary.histogram(mapped_weight_name, weight) if self.write_grads: - grads = model.optimizer.get_gradients(model.total_loss, + grads = self.model.optimizer.get_gradients(self.model.total_loss, weight) - tf.summary.histogram('{}_grad'.format(weight.name), grads) + def is_indexed_slices(grad): + return type(grad).__name__ == 'IndexedSlices' + grads = [ + grad.values if is_indexed_slices(grad) else grad + for grad in grads] + for grad in grads: + tf.summary.histogram('{}_grad'.format(mapped_weight_name), grad) if hasattr(layer, 'output'): tf.summary.histogram('{}_out'.format(layer.name), From 916d336836c2b585b47c0bf64f363b3412507631 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 13 Aug 2017 14:36:20 -0400 Subject: [PATCH 179/744] Model should be compiled before tensorboard.set_model, or optimizer attribute missing --- plasma/models/mpi_runner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index b0f45e2a..242024a7 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -648,6 +648,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print("warmup {}".format(warmup_steps)) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum) + mpi_model.compile(conf['model']['optimizer'],loss=conf['data']['target'].loss) tensorboard = None if backend != "theano" and task_index == 0: @@ -657,8 +658,6 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non tensorboard.set_model(mpi_model.model) mpi_model.model.summary() - mpi_model.compile(conf['model']['optimizer'],loss=conf['data']['target'].loss) - if task_index == 0: callbacks = mpi_model.build_callbacks(conf,callbacks_list) callbacks.set_model(mpi_model.model) From d3984ec7907d5f1abffb60ca2bf0cb8f2859eada Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 13 Aug 2017 14:38:16 -0400 Subject: [PATCH 180/744] Add MPI momentum optimizer class (no Nesterov), initial commit --- plasma/models/mpi_runner.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 242024a7..049781ec 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -105,6 +105,25 @@ def get_deltas(self,raw_deltas): self.iterations += 1 return deltas +class MPIMomentumSGD(MPIOptimizer): + def __init__(self, lr): + super(MPIMomentumSGD, self).__init__(lr) + self.momentum = 0.9 + + def get_deltas(self, raw_deltas): + deltas = [] + + if self.iterations == 0: + self.velocity_list = [np.zeros_like(g) for g in raw_deltas] + + for (i,g) in enumerate(raw_deltas): + self.velocity_list[i] = self.momentum * self.velocity_list[i] + self.lr * g + deltas.append(self.velocity_list[i]) + + self.iterations += 1 + + return deltas + class MPIAdam(MPIOptimizer): def __init__(self,lr): super(MPIAdam,self).__init__(lr) From b1c751f6f547ebaa51b1c534de7596ae899f8aa7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 13 Aug 2017 23:10:42 -0400 Subject: [PATCH 181/744] A macro to make nice plots from EventAccumulator objects from tensorboard summaries (for paper) --- examples/custom_plot.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 examples/custom_plot.py diff --git a/examples/custom_plot.py b/examples/custom_plot.py new file mode 100644 index 00000000..31d21c76 --- /dev/null +++ b/examples/custom_plot.py @@ -0,0 +1,35 @@ +import numpy as np +from bokeh.plotting import figure, show, output_file, save + +from tensorboard.backend.event_processing import event_accumulator + +ea1 = event_accumulator.EventAccumulator("/tigress/alexeys/worked_Graphs/Graph16_momSGD_new/events.out.tfevents.1502649990.tiger-i19g10") +ea1.Reload() + +ea2 = event_accumulator.EventAccumulator("/tigress/alexeys/worked_Graphs/Graph32_momSGD_new/events.out.tfevents.1502652797.tiger-i19g10") +ea2.Reload() + +histograms = ea1.Tags()['histograms'] +#ages': [], 'audio': [], 'histograms': ['input_2_out', 'time_distributed_1_out', 'lstm_1/kernel_0', 'lstm_1/kernel_0_grad', 'lstm_1/recurrent_kernel_0', 'lstm_1/recurrent_kernel_0_grad', 'lstm_1/bias_0', 'lstm_1/bias_0_grad', 'lstm_1_out', 'dropout_1_out', 'lstm_2/kernel_0', 'lstm_2/kernel_0_grad', 'lstm_2/recurrent_kernel_0', 'lstm_2/recurrent_kernel_0_grad', 'lstm_2/bias_0', 'lstm_2/bias_0_grad', 'lstm_2_out', 'dropout_2_out', 'time_distributed_2/kernel_0', 'time_distributed_2/kernel_0_grad', 'time_distributed_2/bias_0', 'time_distributed_2/bias_0_grad', 'time_distributed_2_out'], 'scalars': ['val_roc', 'val_loss', 'train_loss'], 'distributions': ['input_2_out', 'time_distributed_1_out', 'lstm_1/kernel_0', 'lstm_1/kernel_0_grad', 'lstm_1/recurrent_kernel_0', 'lstm_1/recurrent_kernel_0_grad', 'lstm_1/bias_0', 'lstm_1/bias_0_grad', 'lstm_1_out', 'dropout_1_out', 'lstm_2/kernel_0', 'lstm_2/kernel_0_grad', 'lstm_2/recurrent_kernel_0', 'lstm_2/recurrent_kernel_0_grad', 'lstm_2/bias_0', 'lstm_2/bias_0_grad', 'lstm_2_out', 'dropout_2_out', 'time_distributed_2/kernel_0', 'time_distributed_2/kernel_0_grad', 'time_distributed_2/bias_0', 'time_distributed_2/bias_0_grad', 'time_distributed_2_out'], 'tensors': [], 'graph': True, 'meta_graph': True, 'run_metadata': []} + +for h in histograms: + x1 = np.array(ea1.Histograms(h)[0].histogram_value.bucket_limit[:-1]) + y1 = ea1.Histograms(h)[0].histogram_value.bucket[:-1] + x2 = np.array(ea2.Histograms(h)[0].histogram_value.bucket_limit[:-1]) + y2 = ea2.Histograms(h)[0].histogram_value.bucket[:-1] + + h = h.replace("/","_") + + p = figure(title=h, y_axis_label="Arbitrary units", x_axis_label="Arbitrary units") + # ,y_axis_type="log") + + p.line(x1, y1, legend="float16, SGD with momentum", + line_color="green", line_width=2) + + p.line(x2, y2, legend="float32, SGD with momentum", + line_color="indigo", line_width=2) + + p.legend.location = "top_right" + + output_file("plot"+h+".html", title=h) + save(p) # open a browser From f825306e5e50b13170d79e511a780a922eb7354d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 14 Aug 2017 21:05:37 -0400 Subject: [PATCH 182/744] Compile model in mpi_runner/runner, only define NN architecture in builder --- plasma/models/builder.py | 43 ------------------------------------- plasma/models/mpi_runner.py | 9 ++++---- plasma/models/runner.py | 38 +++++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 50 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 136fbce4..bb437716 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -9,7 +9,6 @@ from keras.layers.wrappers import TimeDistributed from keras.layers.merge import Concatenate from keras.callbacks import Callback -from keras.optimizers import * from keras.regularizers import l1,l2,l1_l2 @@ -73,27 +72,9 @@ def build_model(self,predict,custom_batch_size=None): model_conf = conf['model'] rnn_size = model_conf['rnn_size'] rnn_type = model_conf['rnn_type'] - optimizer = model_conf['optimizer'] - lr = model_conf['lr'] - clipnorm = model_conf['clipnorm'] regularization = model_conf['regularization'] dense_regularization = model_conf['dense_regularization'] - if optimizer == 'sgd': - optimizer_class = SGD - elif optimizer == 'adam': - optimizer_class = Adam - elif optimizer == 'rmsprop': - optimizer_class = RMSprop - elif optimizer == 'nadam': - optimizer_class = Nadam - else: - optimizer = optimizer - - if lr is not None or clipnorm is not None: - optimizer = optimizer_class(lr = lr,clipnorm=clipnorm) - - loss_fn = conf['data']['target'].loss#model_conf['loss'] dropout_prob = model_conf['dropout_prob'] length = model_conf['length'] pred_length = model_conf['pred_length'] @@ -108,7 +89,6 @@ def build_model(self,predict,custom_batch_size=None): size_conv_filters = model_conf['size_conv_filters'] pool_size = model_conf['pool_size'] dense_size = model_conf['dense_size'] - # num_signals = conf['data']['num_signals'] batch_size = self.conf['training']['batch_size'] @@ -203,7 +183,6 @@ def slicer_output_shape(input_shape,indices): else: x_out = Dense(1,activation=output_activation) (x_in) model = Model(inputs=x_input,outputs=x_out) - model.compile(loss=loss_fn, optimizer=optimizer) #bug with tensorflow/Keras if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': first_time = "tensorflow" not in sys.modules @@ -212,7 +191,6 @@ def slicer_output_shape(input_shape,indices): K.get_session().run(tf.global_variables_initializer()) model.reset_states() - #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output return model def build_train_test_models(self): @@ -293,26 +271,8 @@ def hyper_build_model(self,space,predict,custom_batch_size=None): model_conf = conf['model'] rnn_size = model_conf['rnn_size'] rnn_type = model_conf['rnn_type'] - optimizer = model_conf['optimizer'] - lr = model_conf['lr'] - clipnorm = model_conf['clipnorm'] regularization = model_conf['regularization'] - if optimizer == 'sgd': - optimizer_class = SGD - elif optimizer == 'adam': - optimizer_class = Adam - elif optimizer == 'rmsprop': - optimizer_class = RMSprop - elif optimizer == 'nadam': - optimizer_class = Nadam - else: - optimizer = optimizer - - if lr is not None or clipnorm is not None: - optimizer = optimizer_class(lr = lr,clipnorm=clipnorm) - - loss_fn = conf['data']['target'].loss#model_conf['loss'] dropout_prob = model_conf['dropout_prob'] length = model_conf['length'] pred_length = model_conf['pred_length'] @@ -355,9 +315,6 @@ def hyper_build_model(self,space,predict,custom_batch_size=None): model.add(TimeDistributed(Dense(1,activation=output_activation))) else: model.add(Dense(1,activation=output_activation)) - model.compile(loss=loss_fn, optimizer=optimizer) model.reset_states() - #model.compile(loss='mean_squared_error', optimizer='sgd') #for numerical output return model - diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 049781ec..7bf1840e 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -214,7 +214,7 @@ def save_weights(self,path,overwrite=False): def load_weights(self,path): self.model.load_weights(path) - def compile(self,optimizer,loss='mse'): + def compile(self,optimizer,lr,clipnorm,loss='mse'): if optimizer == 'sgd': optimizer_class = SGD elif optimizer == 'adam': @@ -226,7 +226,7 @@ def compile(self,optimizer,loss='mse'): else: print("Optimizer not implemented yet") exit(1) - self.model.compile(optimizer=optimizer_class(lr=self.DUMMY_LR),loss=loss) + self.model.compile(optimizer=optimizer_class(lr=lr,clipnorm=clipnorm),loss=loss) @@ -551,6 +551,7 @@ def load_shotlists(conf): #shot_list_train,shot_list_validate,shot_list_test = load_shotlists(conf) def mpi_make_predictions(conf,shot_list,loader,custom_path=None): + np.random.seed(task_index) shot_list.sort()#make sure all replicas have the same list specific_builder = builder.ModelBuilder(conf) @@ -648,6 +649,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non lr_decay = conf['model']['lr_decay'] batch_size = conf['training']['batch_size'] lr = conf['model']['lr'] + clipnorm = conf['model']['clipnorm'] warmup_steps = conf['model']['warmup_steps'] num_batches_minimum = conf['training']['num_batches_minimum'] @@ -667,7 +669,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print("warmup {}".format(warmup_steps)) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum) - mpi_model.compile(conf['model']['optimizer'],loss=conf['data']['target'].loss) + mpi_model.compile(conf['model']['optimizer'],lr,clipnorm,conf['data']['target'].loss) tensorboard = None if backend != "theano" and task_index == 0: @@ -785,7 +787,6 @@ def __init__(self, log_dir='./logs', def set_model(self, model): self.model = model - print(type(self.model)) self.sess = K.get_session() if self.histogram_freq and self.merged is None: diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 1412c241..ce2e1e4e 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -49,11 +49,15 @@ def train(conf,shot_list_train,shot_list_validate,loader): from keras.utils.generic_utils import Progbar from keras import backend as K + from keras.optimizers import * from plasma.models import builder print('Build model...',end='') specific_builder = builder.ModelBuilder(conf) train_model = specific_builder.build_model(False) + print('Compile model',end='') + optimizer_class = optimizer_class(conf['model']['optimizer']) + train_model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) print('...done') #load the latest epoch we did. Returns -1 if none exist yet @@ -65,7 +69,6 @@ def train(conf,shot_list_train,shot_list_validate,loader): num_epochs = conf['training']['num_epochs'] num_at_once = conf['training']['num_shots_at_once'] lr_decay = conf['model']['lr_decay'] - lr = conf['model']['lr'] print('{} epochs left to go'.format(num_epochs - 1 - e)) num_so_far_accum = 0 num_so_far = 0 @@ -160,6 +163,22 @@ def train(conf,shot_list_train,shot_list_validate,loader): batch_iterator.__exit__() print('...done') + +def optimizer_class(optimizer): + if optimizer == 'sgd': + optimizer_class = SGD + elif optimizer == 'adam': + optimizer_class = Adam + elif optimizer == 'rmsprop': + optimizer_class = RMSprop + elif optimizer == 'nadam': + optimizer_class = Nadam + else: + print("Optimizer not implemented yet") + exit(1) + return optimizer_class + + class HyperRunner(object): def __init__(self,conf,loader,shot_list): self.loader = loader @@ -172,7 +191,9 @@ def keras_fmin_fnct(self,space): specific_builder = builder.ModelBuilder(self.conf) - train_model, test_model = specific_builder.hyper_build_model(space,False), specific_builder.hyper_build_model(space,True) + train_model = specific_builder.hyper_build_model(space,False) + optimizer_class = optimizer_class(conf['model']['optimizer']) + train_model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) np.random.seed(1) validation_losses = [] @@ -186,7 +207,6 @@ def keras_fmin_fnct(self,space): num_epochs = self.conf['training']['num_epochs'] num_at_once = self.conf['training']['num_shots_at_once'] lr_decay = self.conf['model']['lr_decay'] - lr = self.conf['model']['lr'] resulting_dict = {'loss':None,'status':STATUS_OK,'model':None} @@ -295,6 +315,9 @@ def make_predictions(conf,shot_list,loader): disruptive = [] model = specific_builder.build_model(True) + optimizer_class = optimizer_class(conf['model']['optimizer']) + model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + specific_builder.load_model_weights(model) model_save_path = specific_builder.get_latest_save_path() @@ -317,6 +340,9 @@ def make_predictions(conf,shot_list,loader): def make_single_prediction(shot,specific_builder,loader,model_save_path): model = specific_builder.build_model(True) + optimizer_class = optimizer_class(conf['model']['optimizer']) + model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + model.load_weights(model_save_path) model.reset_states() X,y = loader.load_as_X_y(shot,prediction_mode=True) @@ -357,6 +383,9 @@ def make_predictions_gpu(conf,shot_list,loader): disruptive = [] model = specific_builder.build_model(True) + optimizer_class = optimizer_class(conf['model']['optimizer']) + model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + specific_builder.load_model_weights(model) model.reset_states() @@ -426,6 +455,9 @@ def make_evaluations_gpu(conf,shot_list,loader): for (i,shot_sublist) in enumerate(shot_sublists): batch_size = len(shot_sublist) model = specific_builder.build_model(True,custom_batch_size=batch_size) + optimizer_class = optimizer_class(conf['model']['optimizer']) + model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + specific_builder.load_model_weights(model) model.reset_states() X,y,shot_lengths,disr = loader.load_as_X_y_pred(shot_sublist,custom_batch_size=batch_size) From f92ec94459eb942158d64113b5a5bc72dd1f6856 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 14 Aug 2017 23:38:35 -0400 Subject: [PATCH 183/744] Add TFOptimizer wrapper options --- plasma/models/mpi_runner.py | 22 +++++++++++++++------- plasma/models/runner.py | 32 +++++++++++++++++++------------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 7bf1840e..49a96729 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -216,17 +216,23 @@ def load_weights(self,path): def compile(self,optimizer,lr,clipnorm,loss='mse'): if optimizer == 'sgd': - optimizer_class = SGD + optimizer_class = SGD(lr=lr,clipnorm=clipnorm) + elif optimizer == 'momentum_sgd': + optimizer_class = SGD(lr=lr, clipnorm=clipnorm, decay=1e-6, momentum=0.9) + elif optimizer == 'tf_momentum_sgd': + optimizer_class = TFOptimizer(tf.train.MomentumOptimizer(learning_rate=lr,momentum=0.9)) elif optimizer == 'adam': - optimizer_class = Adam + optimizer_class = Adam(lr=lr,clipnorm=clipnorm) + elif optimizer == 'tf_adam': + optimizer_class = TFOptimizer(tf.train.AdamOptimizer(learning_rate=lr)) elif optimizer == 'rmsprop': - optimizer_class = RMSprop + optimizer_class = RMSprop(lr=lr,clipnorm=clipnorm) elif optimizer == 'nadam': - optimizer_class = Nadam + optimizer_class = Nadam(lr=lr,clipnorm=clipnorm) else: print("Optimizer not implemented yet") exit(1) - self.model.compile(optimizer=optimizer_class(lr=lr,clipnorm=clipnorm),loss=loss) + self.model.compile(optimizer=optimizer_class,loss=loss) @@ -653,10 +659,12 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non warmup_steps = conf['model']['warmup_steps'] num_batches_minimum = conf['training']['num_batches_minimum'] - if conf['model']['optimizer'] == 'adam': + if 'adam' in conf['model']['optimizer']: optimizer = MPIAdam(lr=lr) - elif conf['model']['optimizer'] == 'sgd': + elif conf['model']['optimizer'] == 'sgd' or conf['model']['optimizer'] == 'tf_sgd': optimizer = MPISGD(lr=lr) + elif 'momentum_sgd' in conf['model']['optimizer']: + optimizer = MPIMomentumSGD(lr=lr) else: print("Optimizer not implemented yet") exit(1) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index ce2e1e4e..893ebe55 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -49,7 +49,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): from keras.utils.generic_utils import Progbar from keras import backend as K - from keras.optimizers import * + from keras.optimizers import SGD,Adam,RMSprop,Nadam,TFOptimizer from plasma.models import builder print('Build model...',end='') @@ -57,7 +57,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): train_model = specific_builder.build_model(False) print('Compile model',end='') optimizer_class = optimizer_class(conf['model']['optimizer']) - train_model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + train_model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) print('...done') #load the latest epoch we did. Returns -1 if none exist yet @@ -163,19 +163,25 @@ def train(conf,shot_list_train,shot_list_validate,loader): batch_iterator.__exit__() print('...done') - -def optimizer_class(optimizer): +def optimizer_class(conf,optimizer): if optimizer == 'sgd': - optimizer_class = SGD + optimizer_class = SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + elif optimizer == 'momentum_sgd': + optimizer_class = SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm'], decay=1e-6, momentum=0.9) + elif optimizer == 'tf_momentum_sgd': + optimizer_class = TFOptimizer(tf.train.MomentumOptimizer(learning_rate=conf['model']['lr'],momentum=0.9)) elif optimizer == 'adam': - optimizer_class = Adam + optimizer_class = Adam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + elif optimizer == 'tf_adam': + optimizer_class = TFOptimizer(tf.train.AdamOptimizer(learning_rate=conf['model']['lr'])) elif optimizer == 'rmsprop': - optimizer_class = RMSprop + optimizer_class = RMSprop(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) elif optimizer == 'nadam': - optimizer_class = Nadam + optimizer_class = Nadam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) else: print("Optimizer not implemented yet") exit(1) + return optimizer_class @@ -193,7 +199,7 @@ def keras_fmin_fnct(self,space): train_model = specific_builder.hyper_build_model(space,False) optimizer_class = optimizer_class(conf['model']['optimizer']) - train_model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + train_model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) np.random.seed(1) validation_losses = [] @@ -316,7 +322,7 @@ def make_predictions(conf,shot_list,loader): model = specific_builder.build_model(True) optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model_save_path = specific_builder.get_latest_save_path() @@ -341,7 +347,7 @@ def make_predictions(conf,shot_list,loader): def make_single_prediction(shot,specific_builder,loader,model_save_path): model = specific_builder.build_model(True) optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) model.load_weights(model_save_path) model.reset_states() @@ -384,7 +390,7 @@ def make_predictions_gpu(conf,shot_list,loader): model = specific_builder.build_model(True) optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model.reset_states() @@ -456,7 +462,7 @@ def make_evaluations_gpu(conf,shot_list,loader): batch_size = len(shot_sublist) model = specific_builder.build_model(True,custom_batch_size=batch_size) optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']),loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model.reset_states() From db88887d52a5e3b638aed41e18a7b294a928e9a9 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 15 Aug 2017 12:59:06 -0400 Subject: [PATCH 184/744] Learning schedule aware of the number of workers --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 49a96729..3b56a567 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -182,7 +182,6 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No self.model = model self.optimizer = optimizer self.max_lr = 0.1 - self.lr = lr if (lr < self.max_lr) else self.max_lr self.DUMMY_LR = 0.001 self.comm = comm self.batch_size = batch_size @@ -197,6 +196,7 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No self.num_replicas = self.num_workers else: self.num_replicas = num_replicas + self.lr = lr/(1.0+self.num_replicas/100.0) if (lr < self.max_lr) else self.max_lr/(1.0+self.num_replicas/100.0) def set_batch_iterator_func(self): From aa45af351120d095dbc86e13561752d931b2973e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 15 Aug 2017 12:59:50 -0400 Subject: [PATCH 185/744] Do not set CUDA_VISIBLE_DEVICES for configurations with 1 GPU per node (like Titan) --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 3b56a567..645bd4cc 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -45,7 +45,7 @@ backend = conf['model']['backend'] if backend == 'tf' or backend == 'tensorflow': - os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU)#,mode=NanGuardMode' + if NUM_GPUS > 1: os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU)#,mode=NanGuardMode' os.environ['KERAS_BACKEND'] = 'tensorflow' import tensorflow as tf from keras.backend.tensorflow_backend import set_session From 7f7bb6dd83284ba278083d5f1f56de231a84beeb Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 15 Aug 2017 13:01:55 -0400 Subject: [PATCH 186/744] Enable lr decay, reduce patience to compensate for it --- examples/conf.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index c151d10e..3b42b96e 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -11,7 +11,7 @@ paths: shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' data: 'jet_data' - specific_signals: [] #if left empty will use all valid signals defined on a machine. Only use if need a custom set + specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set data: cut_shot_ends: True @@ -69,7 +69,7 @@ model: dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) lr: 0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 - lr_decay: 1.0 #0.98 #0.9 + lr_decay: 0.9 #0.98 #0.9 stateful: True return_sequences: True dropout_prob: 0.3 @@ -87,7 +87,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 4 + num_epochs: 400 use_mock_data: False data_parallel: False hyperparam_tuning: False @@ -99,5 +99,5 @@ callbacks: metrics: ['val_loss','val_roc','train_loss'] mode: 'max' monitor: 'val_roc' - patience: 4 + patience: 3 write_grads: False From 74e85f1e814f99d87113b6505380dd7b27c0c708 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 15 Aug 2017 13:22:35 -0400 Subject: [PATCH 187/744] Fixes --- plasma/models/runner.py | 53 ++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 893ebe55..2ef8a228 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -49,15 +49,13 @@ def train(conf,shot_list_train,shot_list_validate,loader): from keras.utils.generic_utils import Progbar from keras import backend as K - from keras.optimizers import SGD,Adam,RMSprop,Nadam,TFOptimizer from plasma.models import builder print('Build model...',end='') specific_builder = builder.ModelBuilder(conf) train_model = specific_builder.build_model(False) print('Compile model',end='') - optimizer_class = optimizer_class(conf['model']['optimizer']) - train_model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) + train_model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) print('...done') #load the latest epoch we did. Returns -1 if none exist yet @@ -163,27 +161,27 @@ def train(conf,shot_list_train,shot_list_validate,loader): batch_iterator.__exit__() print('...done') -def optimizer_class(conf,optimizer): - if optimizer == 'sgd': - optimizer_class = SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) - elif optimizer == 'momentum_sgd': - optimizer_class = SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm'], decay=1e-6, momentum=0.9) - elif optimizer == 'tf_momentum_sgd': - optimizer_class = TFOptimizer(tf.train.MomentumOptimizer(learning_rate=conf['model']['lr'],momentum=0.9)) - elif optimizer == 'adam': - optimizer_class = Adam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) - elif optimizer == 'tf_adam': - optimizer_class = TFOptimizer(tf.train.AdamOptimizer(learning_rate=conf['model']['lr'])) - elif optimizer == 'rmsprop': - optimizer_class = RMSprop(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) - elif optimizer == 'nadam': - optimizer_class = Nadam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) +def optimizer_class(): + from keras.optimizers import SGD,Adam,RMSprop,Nadam,TFOptimizer + + if conf['model']['optimizer'] == 'sgd': + return SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + elif conf['model']['optimizer'] == 'momentum_sgd': + return SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm'], decay=1e-6, momentum=0.9) + elif conf['model']['optimizer'] == 'tf_momentum_sgd': + return TFOptimizer(tf.train.MomentumOptimizer(learning_rate=conf['model']['lr'],momentum=0.9)) + elif conf['model']['optimizer'] == 'adam': + return Adam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + elif conf['model']['optimizer'] == 'tf_adam': + return TFOptimizer(tf.train.AdamOptimizer(learning_rate=conf['model']['lr'])) + elif conf['model']['optimizer'] == 'rmsprop': + return RMSprop(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + elif conf['model']['optimizer'] == 'nadam': + return Nadam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) else: print("Optimizer not implemented yet") exit(1) - return optimizer_class - class HyperRunner(object): def __init__(self,conf,loader,shot_list): @@ -198,8 +196,7 @@ def keras_fmin_fnct(self,space): specific_builder = builder.ModelBuilder(self.conf) train_model = specific_builder.hyper_build_model(space,False) - optimizer_class = optimizer_class(conf['model']['optimizer']) - train_model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) + train_model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) np.random.seed(1) validation_losses = [] @@ -321,8 +318,7 @@ def make_predictions(conf,shot_list,loader): disruptive = [] model = specific_builder.build_model(True) - optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model_save_path = specific_builder.get_latest_save_path() @@ -346,8 +342,7 @@ def make_predictions(conf,shot_list,loader): def make_single_prediction(shot,specific_builder,loader,model_save_path): model = specific_builder.build_model(True) - optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) model.load_weights(model_save_path) model.reset_states() @@ -389,8 +384,7 @@ def make_predictions_gpu(conf,shot_list,loader): disruptive = [] model = specific_builder.build_model(True) - optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model.reset_states() @@ -461,8 +455,7 @@ def make_evaluations_gpu(conf,shot_list,loader): for (i,shot_sublist) in enumerate(shot_sublists): batch_size = len(shot_sublist) model = specific_builder.build_model(True,custom_batch_size=batch_size) - optimizer_class = optimizer_class(conf['model']['optimizer']) - model.compile(optimizer=optimizer_class,loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model.reset_states() From c8976fe9688baebf378208b064b12249008b6da1 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 17 Aug 2017 20:36:34 -0400 Subject: [PATCH 188/744] All layer definitions are in model.builder --- plasma/models/mpi_runner.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 645bd4cc..0002269c 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -63,10 +63,6 @@ if i == task_index: print('[{}] importing Keras'.format(task_index)) from keras import backend as K - from keras.layers import Input,Dense, Dropout - from keras.layers.recurrent import LSTM - from keras.layers.wrappers import TimeDistributed - from keras.models import Model from keras.optimizers import * from keras.utils.generic_utils import Progbar import keras.callbacks as cbks From 3a933b6db6eccc8ed47b4553c0985ef02e13ab46 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 20 Aug 2017 20:18:31 -0400 Subject: [PATCH 189/744] Change back lr->DUMMY_LR scaling factor for mpi model --- plasma/models/mpi_runner.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 0002269c..abe14b8d 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -210,21 +210,21 @@ def save_weights(self,path,overwrite=False): def load_weights(self,path): self.model.load_weights(path) - def compile(self,optimizer,lr,clipnorm,loss='mse'): + def compile(self,optimizer,clipnorm,loss='mse'): if optimizer == 'sgd': - optimizer_class = SGD(lr=lr,clipnorm=clipnorm) + optimizer_class = SGD(lr=self.DUMMY_LR,clipnorm=clipnorm) elif optimizer == 'momentum_sgd': - optimizer_class = SGD(lr=lr, clipnorm=clipnorm, decay=1e-6, momentum=0.9) + optimizer_class = SGD(lr=self.DUMMY_LR, clipnorm=clipnorm, decay=1e-6, momentum=0.9) elif optimizer == 'tf_momentum_sgd': - optimizer_class = TFOptimizer(tf.train.MomentumOptimizer(learning_rate=lr,momentum=0.9)) + optimizer_class = TFOptimizer(tf.train.MomentumOptimizer(learning_rate=self.DUMMY_LR,momentum=0.9)) elif optimizer == 'adam': - optimizer_class = Adam(lr=lr,clipnorm=clipnorm) + optimizer_class = Adam(lr=self.DUMMY_LR,clipnorm=clipnorm) elif optimizer == 'tf_adam': - optimizer_class = TFOptimizer(tf.train.AdamOptimizer(learning_rate=lr)) + optimizer_class = TFOptimizer(tf.train.AdamOptimizer(learning_rate=self.DUMMY_LR)) elif optimizer == 'rmsprop': - optimizer_class = RMSprop(lr=lr,clipnorm=clipnorm) + optimizer_class = RMSprop(lr=self.DUMMY_LR,clipnorm=clipnorm) elif optimizer == 'nadam': - optimizer_class = Nadam(lr=lr,clipnorm=clipnorm) + optimizer_class = Nadam(lr=self.DUMMY_LR,clipnorm=clipnorm) else: print("Optimizer not implemented yet") exit(1) @@ -673,7 +673,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print("warmup {}".format(warmup_steps)) mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum) - mpi_model.compile(conf['model']['optimizer'],lr,clipnorm,conf['data']['target'].loss) + mpi_model.compile(conf['model']['optimizer'],clipnorm,conf['data']['target'].loss) tensorboard = None if backend != "theano" and task_index == 0: From 7cd192a25bb15d0a822743f0b1d51f58027dd8f0 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Tue, 5 Sep 2017 14:58:34 -0400 Subject: [PATCH 190/744] First time installation instructions on Theta cluster at Argonne --- docs/ANL_Theta.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/ANL_Theta.md diff --git a/docs/ANL_Theta.md b/docs/ANL_Theta.md new file mode 100644 index 00000000..cc1a68bb --- /dev/null +++ b/docs/ANL_Theta.md @@ -0,0 +1,21 @@ +#First time setup on Theta, Argonne + +```bash +mkdir PPPL +cd PPPL/ +git clone https://github.com/PPPLDeepLearning/plasma-python + +wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh +sh Anaconda3-4.4.0-Linux-x86_64.sh +PPPL/plasma-python/ + +conda create --name PPPL_dev --file=requirements-travis.txt +#~/.bashrc +export PATH="/home/alexeys/anaconda3/bin:$PATH" +conda create --name PPPL_dev --file=requirements-travis.txt +source activate PPPL_dev + +python setup.py install +module load PrgEnv-intel/6.0.4 +#which mpicc +env MPICC=/opt/intel/compilers_and_libraries_2017.4.196/linux/mpi/intel64/bin/mpicc pip install --user mpi4py From 10021bdd7c14e2f6646092f3c1df3c9836167319 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 21 Sep 2017 10:26:56 -0400 Subject: [PATCH 191/744] Update modules in the tutorial: CUDA 6, Openmpi 2.0, CUDA-aware. Minor typo fixes --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bbbbf602..6facc346 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,9 @@ First, create an isolated Anaconda environment and load CUDA drivers: ``` #cd plasma-python module load anaconda3 -module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 -conda create --name my_env --files requirements.txt +module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 +module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +conda create --name my_env --file requirements.txt source activate my_env ``` @@ -93,10 +94,10 @@ For batch analysis, make sure to allocate 1 process per GPU: #SBATCH --gres=gpu:4 #SBATCH -c 4 -module load anaconda +module load anaconda3 source activate my_env -module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174 - +module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 +module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 srun python mpi_learn.py ``` @@ -203,7 +204,14 @@ You should see something like: #### Learning curves and ROC per epoch -Besides TensorBoard summaries you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress/netid/csv_logs` (each run will produce a new log file with a timestamp in name). +Besides TensorBoard summaries you can produce the ROC curves for validation and test data as well as visualizations of shots: +``` +cd examples/ +python performance_analysis.py +``` +this uses the resulting file produced as a result of training the neural network as an input, and produces several `.png` files with plots as an output. + +In addition, you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress/netid/csv_logs` (each run will produce a new log file with a timestamp in name). A sample code to analyze can be found in `examples/notebooks`. For instance: From e9537eab5022648764892f8ac0eee994208b244a Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 21 Sep 2017 10:36:44 -0400 Subject: [PATCH 192/744] Update tutorial: symbolic links to the dataset --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 6facc346..d86d70a6 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,16 @@ python setup.py install Where `my_env` should contain the Python packages as per `requirements.txt` file. +#### Location of the data on Tigress + +The JET and D3D datasets containing multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions are located on /tigress filesystem on Princeton U clusters. +Fo convenience, create following symbolic links: + +```bash +cd /tigress/ +ln -s /tigress/FRNN/shot_lists shot_lists +ln -s /tigress/FRNN/signal_data signal_data +``` #### Preprocessing From 523258f6013b2bdcf3e795bfaf8997009efa4a7a Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 21 Sep 2017 11:45:14 -0400 Subject: [PATCH 193/744] Modify logic for results folder: create if not exists --- examples/mpi_learn.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 47cb79f5..0c716767 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -122,7 +122,11 @@ shot_list_train.make_light() save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - np.savez(conf['paths']['results_prepath']+save_str, + result_base_path = conf['paths']['results_prepath'] + if not os.path.exists(result_base_path): + os.makedirs(result_base_path) + + np.savez(result_base_path+save_str, y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, From 541d377f33b7afed0c60fcbbbf6231d318e83a35 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 12:05:04 -0400 Subject: [PATCH 194/744] Set MPICC variable in the setup script, properly install mpi4py with setup script --- setup.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 19d230b3..938625f8 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,16 @@ +import os import sys +import subprocess from setuptools import setup, find_packages import plasma.version +try: + os.environ['MPICC'] = subprocess.check_output("which mpicc", shell=True).decode("utf-8") +except: + print ("Please set up the OpenMPI environment") + exit(1) + setup(name = "plasma", version = plasma.version.__version__, packages = find_packages(), @@ -17,7 +25,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras','pathos','matplotlib','hyperopt'], + install_requires = ['keras','pathos','matplotlib','hyperopt','mpi4py'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From 41ccb069eb6c0fa59f1c72926fda870ba8a74730 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 12:05:25 -0400 Subject: [PATCH 195/744] Remove requirement file --- requirements.txt | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 51dd17a1..00000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -mkl-service -scipy -mpi4py -h5py -pyparsing -yaml -tensorflow-gpu From 208c1394269f57a9285bbd0f46b3d45154798749 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 13:17:16 -0400 Subject: [PATCH 196/744] change default to tensorflow-gpu --- requirements-travis.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-travis.txt b/requirements-travis.txt index c2dbdbb0..c10aa4da 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -2,4 +2,4 @@ scipy h5py pyparsing pyyaml -tensorflow +tensorflow-gpu From 7af02170bebbf2f13ccb2fd42d943bc484bc58e8 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 13:24:47 -0400 Subject: [PATCH 197/744] Install OpenMPI first: travis test1 --- .travis.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 67f2500b..8f90bc12 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,12 @@ python: - 2.7 - 3.6 + +matrix: + include: + - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=1.10.7 + rust: stable + addons: apt: packages: @@ -14,10 +20,14 @@ addons: - python-setuptools install: + - sh install-mpi.sh + - export MPI_PREFIX="${HOME}/opt/${MPI_LIBRARY}-${MPI_LIBRARY_VERSION}" + - export PATH="${HOME}/.local/bin:${MPI_PREFIX}/bin${PATH:+":${PATH}"}" + - export LD_LIBRARY_PATH="${MPI_PREFIX}/lib${LD_LIBRARY_PATH:+":${LD_LIBRARY_PATH}"}" - pip install --upgrade pip - pip install -r requirements-travis.txt env: - TEST_DIR=.; TEST_SCRIPT="python setup.py test" -script: cd $TEST_DIR && $TEST_SCRIPT && cd .. \ No newline at end of file +script: cd $TEST_DIR && $TEST_SCRIPT && cd .. From 2ed56de38f92eaf28cefdc6f2c20782a363d592f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 14:33:02 -0400 Subject: [PATCH 198/744] Add Openmpi installer script --- install-mpi.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 install-mpi.sh diff --git a/install-mpi.sh b/install-mpi.sh new file mode 100644 index 00000000..b509269f --- /dev/null +++ b/install-mpi.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +set -e + +DOWNLOAD_DIR="${HOME}/tmp" +INSTALL_PREFIX="${HOME}/opt" + +PACKAGE_NAME="${MPI_LIBRARY:?"MPI_LIBRARY not set!"}-${MPI_LIBRARY_VERSION:?"MPI_LIBRARY_VERSION not set!"}" +INSTALL_PREFIX="${INSTALL_PREFIX}/${PACKAGE_NAME}" +TARBALL_NAME="${PACKAGE_NAME}.tar.gz" + +if [ -d "${INSTALL_PREFIX}" ] +then + echo "MPI library already installed: ${PACKAGE_NAME}" + exit 0 +fi + +case "$MPI_LIBRARY" in + openmpi) + OPENMPI_SHORTVERSION=$(expr "${MPI_LIBRARY_VERSION}" ":" "\(.\{1,\}\..\{1,\}\)\..\{1,\}") + SOURCE_URL="http://www.open-mpi.org/software/ompi/v${OPENMPI_SHORTVERSION}/downloads/${TARBALL_NAME}" + ;; + mpich) + SOURCE_URL="http://www.mpich.org/static/downloads/${MPI_LIBRARY_VERSION}/${TARBALL_NAME}" + ;; +esac + +echo "Installing MPI library: ${PACKAGE_NAME}" +echo "into: ${INSTALL_PREFIX}" +echo "Download URL: ${SOURCE_URL}" +echo "Tarball name: ${TARBALL_NAME}" + +mkdir -p "${DOWNLOAD_DIR}" +cd "${DOWNLOAD_DIR}" +rm -rf "${TARBALL_NAME}" +wget --no-check-certificate -O "${TARBALL_NAME}" "${SOURCE_URL}" +rm -rf "${PACKAGE_NAME}" +tar -xzf "${TARBALL_NAME}" + +cd "${PACKAGE_NAME}" +mkdir -p "${INSTALL_PREFIX}" +./configure --enable-shared --prefix="${INSTALL_PREFIX}" +make -j 2 +make -j 2 install From 9922d67733941d0d9c49753187157c56d9bd6632 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 14:33:39 -0400 Subject: [PATCH 199/744] Remove python rust version --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8f90bc12..8cdb8b65 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,9 @@ python: - 2.7 - 3.6 - matrix: include: - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=1.10.7 - rust: stable addons: apt: From 2d607b8ade933f2cc30489704f7336f5cd7a0154 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 14:54:17 -0400 Subject: [PATCH 200/744] Change travis matrix --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 8cdb8b65..e9671a06 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,9 @@ python: matrix: include: - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=1.10.7 + python: 2 + - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=1.10.7 + python: 3 addons: apt: From 2255bf8f73302f4100a5d91ce0694fde5d12bb05 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Sep 2017 14:59:35 -0400 Subject: [PATCH 201/744] Travis matrix change 2 --- .travis.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index e9671a06..03026741 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,20 @@ language: python +sudo: required + os: - linux -python: - - 2.7 - - 3.6 +#python: +# - 2.7 +# - 3.6 matrix: include: - - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=1.10.7 - python: 2 - - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=1.10.7 - python: 3 + - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=2.0.0 + python: 2.7 + - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=2.0.0 + python: 3.6 addons: apt: From 9eb65154a937080d06cf0fc3f0deffd5df82d54c Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 25 Sep 2017 15:17:42 -0400 Subject: [PATCH 202/744] Separate README.md and Tutorial --- README.md | 209 ------------------------------------------------------ 1 file changed, 209 deletions(-) diff --git a/README.md b/README.md index d86d70a6..6bda91a8 100644 --- a/README.md +++ b/README.md @@ -43,212 +43,3 @@ optionally add `--user` to install in a home directory. ## Module index The Sphinx pages for FRNN are building up here: http://tigress-web.princeton.edu/~alexeys/docs-web/html/ - -## Tutorials - -### Sample usage on Tigergpu - -First, create an isolated Anaconda environment and load CUDA drivers: -``` -#cd plasma-python -module load anaconda3 -module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 -module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 -conda create --name my_env --file requirements.txt -source activate my_env -``` - -Then install the plasma-python package: - -```bash -source activate my_env -python setup.py install -``` - -Where `my_env` should contain the Python packages as per `requirements.txt` file. - -#### Location of the data on Tigress - -The JET and D3D datasets containing multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions are located on /tigress filesystem on Princeton U clusters. -Fo convenience, create following symbolic links: - -```bash -cd /tigress/ -ln -s /tigress/FRNN/shot_lists shot_lists -ln -s /tigress/FRNN/signal_data signal_data -``` - -#### Preprocessing - -```bash -cd examples/ -python guarantee_preprocessed.py -``` -This will preprocess the data and save it in `/tigress//processed_shots` and `/tigress//normalization` - - -#### Training and inference - -Use Slurm scheduler to perform batch or interactive analysis on Tiger cluster. - -##### Batch analysis - -For batch analysis, make sure to allocate 1 process per GPU: - -```bash -#!/bin/bash -#SBATCH -t 01:30:00 -#SBATCH -N X -#SBATCH --ntasks-per-node=4 -#SBATCH --ntasks-per-socket=2 -#SBATCH --gres=gpu:4 -#SBATCH -c 4 - -module load anaconda3 -source activate my_env -module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 -module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 -srun python mpi_learn.py - -``` -where X is the number of nodes for distibuted training. - -Submit the job with: -```bash -#cd examples -sbatch slurm.cmd -``` - -And monitor it's completion via: -```bash -squeue -u -``` -Optionally, add an email notification option in the Slurm about the job completion. - -##### Interactive analysis - -Interactive option is preferred for debugging or running in the notebook, for all other case batch is preferred. -The workflow is to request an interactive session: - -```bash -salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -t 0-6:00 -``` -where the number of GPUs is X * 4. - -Then launch the application from the command line: - -```bash -mpirun -npernode 4 python examples/mpi_learn.py -``` - -### Understanding the data - -All the configuration parameters are summarised in `examples/conf.yaml`. Highlighting the important ones to control the data. -Currently, FRNN is capable of working with JET and D3D data as well as cross-machine regime. The switch is done in the configuration file: - -```yaml -paths: - ... - data: 'jet_data' -``` -use `d3d_data` for D3D signals, use `jet_to_d3d_data` ir `d3d_to_jet_data` for cross-machine regime. - -By default, FRNN will select, preprocess and normalize all valid signals available. To chose only specific signals use: -```yaml -paths: - ... - specific_signals: [q95,ip] -``` -if left empty `[]` will use all valid signals defined on a machine. Only use if need a custom set. - -### Current signals and notations - -Signal name | Description ---- | --- -q95 | q95 safety factor -ip | plasma current -li | internal inductance -lm | Locked mode amplitude -dens | Plasma density -energy | stored energy -pin | Input Power (beam for d3d) -pradtot | Radiated Power -pradcore | Radiated Power Core -pradedge | Radiated Power Edge -pechin | ECH input power, not always on -pechin | ECH input power, not always on -betan | Normalized Beta -energydt | stored energy time derivative -torquein | Input Beam Torque -tmamp1 | Tearing Mode amplitude (rotating 2/1) -tmamp2 | Tearing Mode amplitude (rotating 3/2) -tmfreq1 | Tearing Mode frequency (rotating 2/1) -tmfreq2 | Tearing Mode frequency (rotating 3/2) -ipdirect | plasma current direction - -### Visualizing learning - -A regular FRNN run will produce several outputs and callbacks. - -#### TensorBoard visualization - -Currently supports graph visualization, histograms of weights, activations and biases, and scalar variable summaries of losses and accuracies. - -The summaries are written real time to `/tigress//Graph`. For MacOS, you can set up the `sshfs` mount of /tigress filesystem and view those summaries in your browser. - -For Mac, you could follow the instructions here: -https://github.com/osxfuse/osxfuse/wiki/SSHFS - -then do something like: -``` -sshfs -o allow_other,defer_permissions netid@tigergpu.princeton.edu:/tigress/netid/ /mnt// -``` - -Launch TensorBoard locally: -``` -python -m tensorflow.tensorboard --logdir /mnt//Graph -``` -You should see something like: - -![alt text](https://github.com/PPPLDeepLearning/plasma-python/blob/master/docs/tb.png) - -#### Learning curves and ROC per epoch - -Besides TensorBoard summaries you can produce the ROC curves for validation and test data as well as visualizations of shots: -``` -cd examples/ -python performance_analysis.py -``` -this uses the resulting file produced as a result of training the neural network as an input, and produces several `.png` files with plots as an output. - -In addition, you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress/netid/csv_logs` (each run will produce a new log file with a timestamp in name). - -A sample code to analyze can be found in `examples/notebooks`. For instance: - -```python -import pandas as pd -import numpy as np -from bokeh.plotting import figure, show, output_file, save - -data = pd.read_csv("/mnt//csv_logs/.csv") - -from bokeh.io import output_notebook -output_notebook() - -from bokeh.models import Range1d -#optionally set the plotting range -#left, right, bottom, top = -0.1, 31, 0.005, 1.51 - -p = figure(title="Learning curve", y_axis_label="Training loss", x_axis_label='Epoch number') #,y_axis_type="log") -#p.set(x_range=Range1d(left, right), y_range=Range1d(bottom, top)) - -p.line(data['epoch'].values, data['train_loss'].values, legend="Test description", - line_color="tomato", line_dash="dotdash", line_width=2) -p.legend.location = "top_right" -show(p, notebook_handle=True) -``` - -### Learning curve summaries per mini-batch - -To extract per mini-batch summaries, use the output produced by FRNN logged to the standard out (in case of the batch jobs, it will all be contained in the Slurm output file). Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: -https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb From 5158d11b5960b0e70984f6c1cc89cf3bba1e5493 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 25 Sep 2017 15:20:04 -0400 Subject: [PATCH 203/744] Create PrincetonUTutorial.md --- docs/PrincetonUTutorial.md | 209 +++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 docs/PrincetonUTutorial.md diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md new file mode 100644 index 00000000..04323b07 --- /dev/null +++ b/docs/PrincetonUTutorial.md @@ -0,0 +1,209 @@ +## Tutorials + +### Sample usage on Tigergpu + +First, create an isolated Anaconda environment and load CUDA drivers: +``` +module load anaconda3 +module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 +module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +conda create --name my_env --file requirements-travis.txt +source activate my_env +``` + +Then install the plasma-python package: + +```bash +#source activate my_env +git clone https://github.com/PPPLDeepLearning/plasma-python +cd plasma-python +python setup.py install +``` + +Where `my_env` should contain the Python packages as per `requirements-travis.txt` file. + +#### Location of the data on Tigress + +The JET and D3D datasets containing multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions are located on /tigress filesystem on Princeton U clusters. +Fo convenience, create following symbolic links: + +```bash +cd /tigress/ +ln -s /tigress/FRNN/shot_lists shot_lists +ln -s /tigress/FRNN/signal_data signal_data +``` + +#### Preprocessing + +```bash +cd examples/ +python guarantee_preprocessed.py +``` +This will preprocess the data and save it in `/tigress//processed_shots` and `/tigress//normalization` + + +#### Training and inference + +Use Slurm scheduler to perform batch or interactive analysis on Tiger cluster. + +##### Batch analysis + +For batch analysis, make sure to allocate 1 process per GPU: + +```bash +#!/bin/bash +#SBATCH -t 01:30:00 +#SBATCH -N X +#SBATCH --ntasks-per-node=4 +#SBATCH --ntasks-per-socket=2 +#SBATCH --gres=gpu:4 +#SBATCH -c 4 + +module load anaconda3 +source activate my_env +module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 +module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +srun python mpi_learn.py + +``` +where X is the number of nodes for distibuted training. + +Submit the job with: +```bash +#cd examples +sbatch slurm.cmd +``` + +And monitor it's completion via: +```bash +squeue -u +``` +Optionally, add an email notification option in the Slurm about the job completion. + +##### Interactive analysis + +Interactive option is preferred for debugging or running in the notebook, for all other case batch is preferred. +The workflow is to request an interactive session: + +```bash +salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -t 0-6:00 +``` +where the number of GPUs is X * 4. + +Then launch the application from the command line: + +```bash +mpirun -npernode 4 python examples/mpi_learn.py +``` + +### Understanding the data + +All the configuration parameters are summarised in `examples/conf.yaml`. Highlighting the important ones to control the data. +Currently, FRNN is capable of working with JET and D3D data as well as cross-machine regime. The switch is done in the configuration file: + +```yaml +paths: + ... + data: 'jet_data' +``` +use `d3d_data` for D3D signals, use `jet_to_d3d_data` ir `d3d_to_jet_data` for cross-machine regime. + +By default, FRNN will select, preprocess and normalize all valid signals available. To chose only specific signals use: +```yaml +paths: + ... + specific_signals: [q95,ip] +``` +if left empty `[]` will use all valid signals defined on a machine. Only use if need a custom set. + +### Current signals and notations + +Signal name | Description +--- | --- +q95 | q95 safety factor +ip | plasma current +li | internal inductance +lm | Locked mode amplitude +dens | Plasma density +energy | stored energy +pin | Input Power (beam for d3d) +pradtot | Radiated Power +pradcore | Radiated Power Core +pradedge | Radiated Power Edge +pechin | ECH input power, not always on +pechin | ECH input power, not always on +betan | Normalized Beta +energydt | stored energy time derivative +torquein | Input Beam Torque +tmamp1 | Tearing Mode amplitude (rotating 2/1) +tmamp2 | Tearing Mode amplitude (rotating 3/2) +tmfreq1 | Tearing Mode frequency (rotating 2/1) +tmfreq2 | Tearing Mode frequency (rotating 3/2) +ipdirect | plasma current direction + +### Visualizing learning + +A regular FRNN run will produce several outputs and callbacks. + +#### TensorBoard visualization + +Currently supports graph visualization, histograms of weights, activations and biases, and scalar variable summaries of losses and accuracies. + +The summaries are written real time to `/tigress//Graph`. For MacOS, you can set up the `sshfs` mount of /tigress filesystem and view those summaries in your browser. + +For Mac, you could follow the instructions here: +https://github.com/osxfuse/osxfuse/wiki/SSHFS + +then do something like: +``` +sshfs -o allow_other,defer_permissions netid@tigergpu.princeton.edu:/tigress/netid/ /mnt// +``` + +Launch TensorBoard locally: +``` +python -m tensorflow.tensorboard --logdir /mnt//Graph +``` +You should see something like: + +![alt text](https://github.com/PPPLDeepLearning/plasma-python/blob/master/docs/tb.png) + +#### Learning curves and ROC per epoch + +Besides TensorBoard summaries you can produce the ROC curves for validation and test data as well as visualizations of shots: +``` +cd examples/ +python performance_analysis.py +``` +this uses the resulting file produced as a result of training the neural network as an input, and produces several `.png` files with plots as an output. + +In addition, you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress/netid/csv_logs` (each run will produce a new log file with a timestamp in name). + +A sample code to analyze can be found in `examples/notebooks`. For instance: + +```python +import pandas as pd +import numpy as np +from bokeh.plotting import figure, show, output_file, save + +data = pd.read_csv("/mnt//csv_logs/.csv") + +from bokeh.io import output_notebook +output_notebook() + +from bokeh.models import Range1d +#optionally set the plotting range +#left, right, bottom, top = -0.1, 31, 0.005, 1.51 + +p = figure(title="Learning curve", y_axis_label="Training loss", x_axis_label='Epoch number') #,y_axis_type="log") +#p.set(x_range=Range1d(left, right), y_range=Range1d(bottom, top)) + +p.line(data['epoch'].values, data['train_loss'].values, legend="Test description", + line_color="tomato", line_dash="dotdash", line_width=2) +p.legend.location = "top_right" +show(p, notebook_handle=True) +``` + +### Learning curve summaries per mini-batch + +To extract per mini-batch summaries, use the output produced by FRNN logged to the standard out (in case of the batch jobs, it will all be contained in the Slurm output file). Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: +https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb From bacf3ef2e0e8f681ac0cf4c459d80f6df68908e8 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 25 Sep 2017 15:21:24 -0400 Subject: [PATCH 204/744] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 6bda91a8..d2e34803 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,9 @@ optionally add `--user` to install in a home directory. ## Module index The Sphinx pages for FRNN are building up here: http://tigress-web.princeton.edu/~alexeys/docs-web/html/ + + +## Tutorials + +For tutorial check: +https://github.com/PPPLDeepLearning/plasma-python/blob/mpicc-travis/docs/PrincetonUTutorial.md From d468456c3c5ddcc7cafc869c8c446909a30718bd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Sep 2017 22:15:36 -0400 Subject: [PATCH 205/744] Restrict install requirements to specific version for Keras and matplotlib for now --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 938625f8..dd92f616 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras','pathos','matplotlib','hyperopt','mpi4py'], + install_requires = ['keras==2.0.6','pathos','matplotlib==2.0.2','hyperopt','mpi4py'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From ed27409ce5559e5243862f014a54b9ce3683a0e7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Sep 2017 22:17:26 -0400 Subject: [PATCH 206/744] Require encoding latin1 for npz --- plasma/preprocessor/normalize.py | 6 +++--- plasma/preprocessor/preprocess.py | 2 +- plasma/primitives/shots.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 28a04fca..60812970 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -158,7 +158,7 @@ def previously_saved_stats(self): if not os.path.isfile(self.path): return False else: - dat = np.load(self.path) + dat = np.load(self.path,encoding="latin1") machines = dat['machines'][()] ret = all([m in machines for m in self.conf['paths']['all_machines']]) if not ret: @@ -249,7 +249,7 @@ def save_stats(self): def load_stats(self): assert self.previously_saved_stats(), "stats not saved before" - dat = np.load(self.path) + dat = np.load(self.path,encoding="latin1") self.means = dat['means'][()] self.stds = dat['stds'][()] self.num_processed = dat['num_processed'][()] @@ -377,7 +377,7 @@ def save_stats(self): def load_stats(self): assert(self.previously_saved_stats()) - dat = np.load(self.path) + dat = np.load(self.path,encoding="latin1") self.minimums = dat['minimums'][()] self.maximums = dat['maximums'][()] self.num_processed = dat['num_processed'][()] diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index f89f2458..74fbb289 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -126,7 +126,7 @@ def get_shot_list_path(self): def load_shotlists(self): path = self.get_shot_list_path() - data = np.load(path) + data = np.load(path,encoding="latin1") shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index ece53235..15eb1595 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -402,7 +402,7 @@ def get_save_path(self,prepath): def restore(self,prepath,light=False): assert self.previously_saved(prepath), 'shot was never saved' save_path = self.get_save_path(prepath) - dat = np.load(save_path) + dat = np.load(save_path,encoding="latin1") self.valid = dat['valid'][()] self.is_disruptive = dat['is_disruptive'][()] From ae9401f61712f0ef4f43043f57a01d9e745ed21c Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 11 Oct 2017 21:17:12 -0400 Subject: [PATCH 207/744] Update Slurm config, use os.path.join, update template folder --- examples/tune_hyperparams.py | 105 +++++++++++++++++------------------ 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 9b4c6cf8..b14e892a 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -21,85 +21,84 @@ tunables = [lr,lr_decay,fac] #target run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) -template_path = "/home/{}/plasma-python/examples/".format(getpass.getuser()) +template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" executable_name = "mpi_learn.py" num_machines = 2 num_trials = 50 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): - assert(template_path != save_path) - with open(template_path+conf_name, 'r') as yaml_file: - conf = yaml.load(yaml_file) - for tunable in tunables: - tunable.assign_to_conf(conf,save_path) - conf['training']['num_epochs'] = 1000 #rely on early stopping to terminate training - conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training - with open(save_path+conf_name, 'w') as outfile: - yaml.dump(conf, outfile, default_flow_style=False) + assert(template_path != save_path) + with open(os.path.join(template_path,conf_name), 'r') as yaml_file: + conf = yaml.load(yaml_file) + for tunable in tunables: + tunable.assign_to_conf(conf,save_path) + conf['training']['num_epochs'] = 1000 #rely on early stopping to terminate training + conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training + with open(save_path+conf_name, 'w') as outfile: + yaml.dump(conf, outfile, default_flow_style=False) def generate_working_dirname(run_directory): - s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - s += "_{}/".format(uuid.uuid4()) - return run_directory + s + s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + s += "_{}/".format(uuid.uuid4()) + return run_directory + s def start_slurm_job(subdir,executable,num_machines,i): - shutil.copy2(executable,subdir) - script = create_slurm_script(subdir,num_machines,i) - sp.Popen("sbatch "+script,shell=True) + shutil.copy2(executable,subdir) + script = create_slurm_script(subdir,num_machines,i) + sp.Popen("sbatch "+script,shell=True) def create_slurm_script(subdir,num_machines,idx): - filename = "run_{}_nodes.cmd".format(num_machines) - filepath = subdir+filename - user = getpass.getuser() - with open(filepath,"w") as f: - f.write('#!/bin/bash\n') - f.write('#SBATCH -t 01:00:00\n') - f.write('#SBATCH -N '+str(num_machines)+'\n') - f.write('#SBATCH --ntasks-per-node=4\n') - f.write('#SBATCH --ntasks-per-socket=2\n') - f.write('#SBATCH --gres=gpu:4\n') - f.write('#SBATCH -c 4\n') - f.write('#SBATCH -o {}.out\n'.format(idx)) - f.write('\n\n') - f.write('module load anaconda\n') - #f.write('source activate PPPL\n') - f.write('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n') - f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) - f.write('cd {}\n'.format(subdir)) - f.write('srun python mpi_learn.py\n') - f.write('echo "done."') - - return filepath + filename = "run_{}_nodes.cmd".format(num_machines) + filepath = subdir+filename + user = getpass.getuser() + with open(filepath,"w") as f: + f.write('#!/bin/bash\n') + f.write('#SBATCH -t 01:00:00\n') + f.write('#SBATCH -N '+str(num_machines)+'\n') + f.write('#SBATCH --ntasks-per-node=4\n') + f.write('#SBATCH --ntasks-per-socket=2\n') + f.write('#SBATCH --gres=gpu:4\n') + f.write('#SBATCH -c 4\n') + f.write('#SBATCH --mem-per-cpu=0\n') + f.write('#SBATCH -o {}.out\n'.format(idx)) + f.write('\n\n') + f.write('module load anaconda3\n') + f.write('source activate PPPL_dev3\n') + f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') + f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) + f.write('cd {}\n'.format(subdir)) + f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') + f.write('srun python mpi_learn.py\n') + f.write('echo "done."') + + return filepath def copy_files_to_environment(subdir): from plasma.conf import conf normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) if os.path.isdir(normalization_dir): - print("Copying normalization to") - shutil.copytree(normalization_dir,subdir+os.path.basename(normalization_dir)) - + print("Copying normalization to") + shutil.copytree(normalization_dir,subdir+os.path.basename(normalization_dir)) working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -shutil.copy2(template_path+conf_name,working_directory) -shutil.copy2(template_path+executable_name,working_directory) +shutil.copy2(os.path.join(template_path,conf_name),working_directory) +shutil.copy2(os.path.join(template_path+executable_name,working_directory) os.chdir(working_directory) print("Going into {}".format(working_directory)) for i in range(num_trials): - print(i) - subdir = working_directory + "/{}/".format(i) - os.makedirs(subdir) - copy_files_to_environment(subdir) - print("Making modified conf") - generate_conf_file(tunables,working_directory,subdir,conf_name) - print("Starting job") - start_slurm_job(subdir,executable_name,num_machines,i) + print(i) + subdir = working_directory + "/{}/".format(i) + os.makedirs(subdir) + copy_files_to_environment(subdir) + print("Making modified conf") + generate_conf_file(tunables,working_directory,subdir,conf_name) + print("Starting job") + start_slurm_job(subdir,executable_name,num_machines,i) print("submitted {} jobs.".format(num_trials)) - - From 36a62a7ce1bc27794a7fb2e50d51704dbe9aff57 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 11 Oct 2017 21:31:18 -0400 Subject: [PATCH 208/744] Add Augmentation class hierarchy --- plasma/preprocessor/normalize.py | 56 ++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 60812970..94d0c858 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -389,3 +389,59 @@ def load_stats(self): def get_individual_shot_file(prepath,shot_num,ext='.txt'): return prepath + str(shot_num) + ext + +class AbstractAugmentator(object): + + def __init__(self,normalizer,is_inference,conf): + self.conf = conf + self.to_augment = self.conf['data']['signals_to_augment'] + self.normalizer = normalizer + self.is_inference = is_inference + + #set whether we are training or testing + def set_inference(self,is_inference): + self.is_inference = is_inference + + def __str__(self): + s = self.normalizer.__str__() + s += "\nIs being augmented!".format(self.to_augment) + s += "Signal to augmented: {}\n".format(self.to_augment) + s += "Is inference: {}\n".format(self.is_inference) + return s + + @abc.abstractmethod + def apply(self,shot): + pass + + @abc.abstractmethod + def augment(self,sig): + pass + +class Augmentator(AbstractAugmentator): + + def apply(self,shot): + #first just apply normalization as usual. + self.normalizer.apply(shot) + #during inference, augment a specific signal + if self.is_inference: + to_augment = self.to_augment + else: + #during training augment a random signal + if self.conf['data']['augment_during_training']: + to_augment = random.sample(shot.signals) + else: + to_augment = None + if to_augment is not None: + shot.signals_dict[to_augment] = self.augment(shot.signals_dict[to_augment]) + + def augment(self,sig): + print ('is augmenting signal'.format(sig)) + if self.conf['data']['augmentation_mode'] == "noise": + return randn(sig.shape) #if noise augmentation + elif self.conf['data']['augmentation_mode'] == "zero": + return sig*0 #if "set to zero" augmentation. Can control in conf. + elif self.conf['data']['augmentation_mode'] == "none": + return sig #if no augmentation. Should be the default in conf. + else: + print("unknown augmentation mode. Exiting") + exit(-1) From 8770ba98a5f3588ac3254f7da29f9abaa64ff462 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 11 Oct 2017 21:31:41 -0400 Subject: [PATCH 209/744] Parameters controlling signals to augment in conf --- examples/conf.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/conf.yaml b/examples/conf.yaml index 3b42b96e..c16dbf88 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -14,6 +14,8 @@ paths: specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set data: + signals_to_augment: [] #['plasma current'] + augmentation_mode: 'noise' cut_shot_ends: True T_min_warn: 30 recompute: False From a8ec6f512787b796811b5731759bff8b571df835 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 11 Oct 2017 21:32:11 -0400 Subject: [PATCH 210/744] Split normalization into raw normalization and augmentation stage, introduce is_inference flag --- examples/mpi_learn.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 0c716767..57235e51 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -32,9 +32,11 @@ from plasma.conf import conf from plasma.models.loader import Loader -from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.normalize import Normalizer, Augmentator from plasma.preprocessor.preprocess import guarantee_preprocessed +import pdb + if conf['model']['shallow']: print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") exit(1) @@ -81,8 +83,11 @@ print("normalization",end='') -nn = Normalizer(conf) -nn.train() +pdb.set_trace() +raw_normalizer = Normalizer(conf) +raw_normalizer.train() +is_inference= False +normalizer = Augmentator(Normalizer,is_inference,conf) loader = Loader(conf,nn) print("...done") @@ -98,6 +103,8 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) +normalizer.set_inference(True) + y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader,custom_path) y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) From 985558fc97d1616e02986df05fd354143f4dc34d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 14:50:36 -0400 Subject: [PATCH 211/744] Switch from shutil to os.system to avoid permission issue observed for some users --- examples/tune_hyperparams.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index b14e892a..64dd5c5a 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -4,7 +4,6 @@ import datetime import uuid import sys,os,getpass -import shutil import subprocess as sp tunables = [] @@ -46,7 +45,7 @@ def generate_working_dirname(run_directory): def start_slurm_job(subdir,executable,num_machines,i): - shutil.copy2(executable,subdir) + os.system(" ".join(["cp -p",executable,subdir)]) script = create_slurm_script(subdir,num_machines,i) sp.Popen("sbatch "+script,shell=True) @@ -81,13 +80,13 @@ def copy_files_to_environment(subdir): normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) if os.path.isdir(normalization_dir): print("Copying normalization to") - shutil.copytree(normalization_dir,subdir+os.path.basename(normalization_dir)) - + os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir)))]) working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -shutil.copy2(os.path.join(template_path,conf_name),working_directory) -shutil.copy2(os.path.join(template_path+executable_name,working_directory) +os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) +os.system("".join(["cp -p",os.path.join(template_path+executable_name,working_directory])) + os.chdir(working_directory) print("Going into {}".format(working_directory)) From cf7a52b38d42ca795baa9d272adf6c72a293851f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 14:54:08 -0400 Subject: [PATCH 212/744] Cleanup: remove pdb setup --- plasma/preprocessor/normalize.py | 56 -------------------------------- 1 file changed, 56 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 94d0c858..60812970 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -389,59 +389,3 @@ def load_stats(self): def get_individual_shot_file(prepath,shot_num,ext='.txt'): return prepath + str(shot_num) + ext - -class AbstractAugmentator(object): - - def __init__(self,normalizer,is_inference,conf): - self.conf = conf - self.to_augment = self.conf['data']['signals_to_augment'] - self.normalizer = normalizer - self.is_inference = is_inference - - #set whether we are training or testing - def set_inference(self,is_inference): - self.is_inference = is_inference - - def __str__(self): - s = self.normalizer.__str__() - s += "\nIs being augmented!".format(self.to_augment) - s += "Signal to augmented: {}\n".format(self.to_augment) - s += "Is inference: {}\n".format(self.is_inference) - return s - - @abc.abstractmethod - def apply(self,shot): - pass - - @abc.abstractmethod - def augment(self,sig): - pass - -class Augmentator(AbstractAugmentator): - - def apply(self,shot): - #first just apply normalization as usual. - self.normalizer.apply(shot) - #during inference, augment a specific signal - if self.is_inference: - to_augment = self.to_augment - else: - #during training augment a random signal - if self.conf['data']['augment_during_training']: - to_augment = random.sample(shot.signals) - else: - to_augment = None - if to_augment is not None: - shot.signals_dict[to_augment] = self.augment(shot.signals_dict[to_augment]) - - def augment(self,sig): - print ('is augmenting signal'.format(sig)) - if self.conf['data']['augmentation_mode'] == "noise": - return randn(sig.shape) #if noise augmentation - elif self.conf['data']['augmentation_mode'] == "zero": - return sig*0 #if "set to zero" augmentation. Can control in conf. - elif self.conf['data']['augmentation_mode'] == "none": - return sig #if no augmentation. Should be the default in conf. - else: - print("unknown augmentation mode. Exiting") - exit(-1) From 5d08bb4a076d6ad3c0c003f2593e4ec97bb04741 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 15:15:44 -0400 Subject: [PATCH 213/744] Move augmentation to a dedicated submodule. Fix augment method. Add docstring --- plasma/preprocessor/augment.py | 83 ++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 plasma/preprocessor/augment.py diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py new file mode 100644 index 00000000..63b74a6e --- /dev/null +++ b/plasma/preprocessor/augment.py @@ -0,0 +1,83 @@ +from __future__ import print_function +import os +import time,sys +import abc +import numpy as np + +from plasma.primitives.shots import ShotList, Shot + +class AbstractAugmentator(object): + + def __init__(self,normalizer,is_inference,conf): + self.conf = conf + self.to_augment = self.conf['data']['signals_to_augment'] + self.normalizer = normalizer + self.is_inference = is_inference + + #set whether we are training or testing + def set_inference(self,is_inference): + self.is_inference = is_inference + + def __str__(self): + s = self.normalizer.__str__() + s += "\nIs being augmented!".format(self.to_augment) + s += "Signal to augmented: {}\n".format(self.to_augment) + s += "Is inference: {}\n".format(self.is_inference) + return s + + @abc.abstractmethod + def apply(self,shot): + pass + + @abc.abstractmethod + def augment(self,sig): + pass + +class Augmentator(AbstractAugmentator): + + def apply(self,shot): + #first just apply normalization as usual. + self.normalizer.apply(shot) + #during inference, augment a specific signal + if self.is_inference: + to_augment = self.to_augment + else: + #during training augment a random signal + if self.conf['data']['augment_during_training']: + to_augment =np.random.sample([x.description for x in shot.signals]) + else: + to_augment = None + if to_augment is not None: + #FIXME + for (i,sig) in enumerate(shot.signals): + if sig.description in self.conf['data']['signals_to_augment']: + print ('Augmenting {} signal'.format(sig.description)) + shot.signals_dict[sig] = self.augment(shot.signals_dict[sig]) + + def augment(self,signal,strength=10): + ''' + The purpose of the method is to modify a signal specified by a configuration parameter or at random according to + a specific mode. Modes include: noise, zeroing and no augmentation. + + It performs calls to: numpy random number generator + + Argument list: + - signal: signal + - strength: strength of the noise, measured in standard deviations. Integer, default value: 10 + + Config parameters list: + - conf['data']['augmentation_mode']: categorical config parameter specifying how to augment. Possible values + include "noise", "zero" and "none" (strings) + + Returns: + - signal: augmented signal ... numpy array of numeric types? + ''' + if self.conf['data']['augmentation_mode'] == "noise": + return signal + np.random.normal(0,strength,signal.shape) + elif self.conf['data']['augmentation_mode'] == "zero": + return signal*0.0 #if "set to zero" augmentation. Can control in conf. + elif self.conf['data']['augmentation_mode'] == "none": + return signal #if no augmentation. Should be the default in conf. + else: + print("Unknown augmentation mode. Exiting") + exit(-1) From 9be415c9e80c3e1719607fee092e1659478cb9ac Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 15:16:43 -0400 Subject: [PATCH 214/744] Adjust import statements --- examples/mpi_learn.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 57235e51..35df1aaa 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -32,11 +32,10 @@ from plasma.conf import conf from plasma.models.loader import Loader -from plasma.preprocessor.normalize import Normalizer, Augmentator +from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.augment import Augmentator from plasma.preprocessor.preprocess import guarantee_preprocessed -import pdb - if conf['model']['shallow']: print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") exit(1) @@ -83,12 +82,11 @@ print("normalization",end='') -pdb.set_trace() raw_normalizer = Normalizer(conf) raw_normalizer.train() is_inference= False -normalizer = Augmentator(Normalizer,is_inference,conf) -loader = Loader(conf,nn) +normalizer = Augmentator(raw_normalizer,is_inference,conf) +loader = Loader(conf,normalizer) print("...done") if not only_predict: From 359c6220ed094ea83ea27b81fd3b40cfeef59cdf Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 21:22:19 -0400 Subject: [PATCH 215/744] Add type assertions for config parameters --- plasma/conf_parser.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index efd1c5fa..ba79575d 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -119,4 +119,8 @@ def parameters(input_file): params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) + #type assertations + assert type(params['data']['signals_to_augment']) == str or type(params['data']['signals_to_augment']) == None + assert type(params['data']['augment_during_training']) == bool + return params From 04e56e5d2c2c2004c7a8a04d6a25de65e7ded1e7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 22:07:43 -0400 Subject: [PATCH 216/744] Cleanup --- plasma/preprocessor/augment.py | 37 ++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index 63b74a6e..f20686d6 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -3,14 +3,16 @@ import time,sys import abc import numpy as np +import random +from plasma.preprocessor.normalize import Normalizer from plasma.primitives.shots import ShotList, Shot class AbstractAugmentator(object): def __init__(self,normalizer,is_inference,conf): self.conf = conf - self.to_augment = self.conf['data']['signals_to_augment'] + self.to_augment_str = self.conf['data']['signals_to_augment'] self.normalizer = normalizer self.is_inference = is_inference @@ -20,8 +22,8 @@ def set_inference(self,is_inference): def __str__(self): s = self.normalizer.__str__() - s += "\nIs being augmented!".format(self.to_augment) - s += "Signal to augmented: {}\n".format(self.to_augment) + s += "\nIs being augmented!".format(self.to_augment_str) + s += "Signal to augmented: {}\n".format(self.to_augment_str) s += "Is inference: {}\n".format(self.is_inference) return s @@ -36,21 +38,34 @@ def augment(self,sig): class Augmentator(AbstractAugmentator): def apply(self,shot): + ''' + The purpose of the method is to apply normalization to a shot and then optionally apply augmentation. + During inference, a specific signal (one at a time) is augmented based on the string supplied in the config file. + During training, augment a random signal (again, one at a time) or do not augment at all. + + It performs calls to: Augmentator.augment(), random.random.choice + + Argument list: + - shot: plasma shot + + Config parameters list: + - conf['data']['augment_during_training']: boolean flag, yes or no to augment during training + ''' #first just apply normalization as usual. self.normalizer.apply(shot) - #during inference, augment a specific signal if self.is_inference: - to_augment = self.to_augment + #during inference, augment a specific signal (one at a time) + to_augment_str = self.to_augment_str else: - #during training augment a random signal + #during training augment a random signal, one at a time if self.conf['data']['augment_during_training']: - to_augment =np.random.sample([x.description for x in shot.signals]) + to_augment_str = random.choice([x.description for x in shot.signals]) else: - to_augment = None - if to_augment is not None: - #FIXME + to_augment_str = None + if to_augment_str is not None: + #FIXME might be better to use search. are we always going to augment 1 signal at a time? for (i,sig) in enumerate(shot.signals): - if sig.description in self.conf['data']['signals_to_augment']: + if sig.description == to_augment_str: print ('Augmenting {} signal'.format(sig.description)) shot.signals_dict[sig] = self.augment(shot.signals_dict[sig]) From a6ca8704338d77cfe87ef8c1523ab415ae1344e7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 22:45:18 -0400 Subject: [PATCH 217/744] Cleanup import statement: augmentator module is independent of Shot, ShotList and Normalizer --- plasma/preprocessor/augment.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index f20686d6..55a24804 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -5,9 +5,6 @@ import numpy as np import random -from plasma.preprocessor.normalize import Normalizer -from plasma.primitives.shots import ShotList, Shot - class AbstractAugmentator(object): def __init__(self,normalizer,is_inference,conf): From 143abd9695d88c15c978bc218d067f1a92ac7c29 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 22:52:30 -0400 Subject: [PATCH 218/744] Add augment_during_training flag, signal_to_augment a string --- examples/conf.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index c16dbf88..d64fec30 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -14,8 +14,9 @@ paths: specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set data: - signals_to_augment: [] #['plasma current'] + signal_to_augment: 'plasma current' #or None augmentation_mode: 'noise' + augment_during_training: True cut_shot_ends: True T_min_warn: 30 recompute: False From ae7453fc098d6a8749cdf7c449bbe5bcfcf341f1 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 12 Oct 2017 22:52:50 -0400 Subject: [PATCH 219/744] signals_to_augment -> signal_to_augment --- plasma/conf_parser.py | 2 +- plasma/preprocessor/augment.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index ba79575d..0e6919d5 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -120,7 +120,7 @@ def parameters(input_file): params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) #type assertations - assert type(params['data']['signals_to_augment']) == str or type(params['data']['signals_to_augment']) == None + assert type(params['data']['signal_to_augment']) == str or type(params['data']['signal_to_augment']) == None assert type(params['data']['augment_during_training']) == bool return params diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index 55a24804..bac83921 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -9,7 +9,7 @@ class AbstractAugmentator(object): def __init__(self,normalizer,is_inference,conf): self.conf = conf - self.to_augment_str = self.conf['data']['signals_to_augment'] + self.to_augment_str = self.conf['data']['signal_to_augment'] self.normalizer = normalizer self.is_inference = is_inference From e5d9a916d53a3c877b239dbde2fd95095e5e9b60 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 13 Oct 2017 00:09:48 -0400 Subject: [PATCH 220/744] Working version of hyperparameter search script --- examples/tune_hyperparams.py | 37 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 64dd5c5a..ca1d2444 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -8,23 +8,22 @@ tunables = [] -lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) -lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) +lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) +lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) #t_warn = CategoricalHyperparam(['data','T_warning'],[1.024]) fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,4.0,8.0]) #target = CategoricalHyperparam(['target'],['maxhinge','hinge']) #batch_size = CategoricalHyperparam(['training','batch_size'],[256,128,32,64]) #dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) - tunables = [lr,lr_decay,fac] #target run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" executable_name = "mpi_learn.py" -num_machines = 2 -num_trials = 50 +num_nodes = 2 +num_trials = 2 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) @@ -34,29 +33,29 @@ def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name tunable.assign_to_conf(conf,save_path) conf['training']['num_epochs'] = 1000 #rely on early stopping to terminate training conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training - with open(save_path+conf_name, 'w') as outfile: + with open(os.path.join(save_path,conf_name), 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) def generate_working_dirname(run_directory): s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - s += "_{}/".format(uuid.uuid4()) + s += "_{}".format(uuid.uuid4()) return run_directory + s -def start_slurm_job(subdir,executable,num_machines,i): - os.system(" ".join(["cp -p",executable,subdir)]) - script = create_slurm_script(subdir,num_machines,i) +def start_slurm_job(subdir,executable,num_nodes,i): + os.system(" ".join(["cp -p",executable,subdir])) + script = create_slurm_script(subdir,num_nodes,i) sp.Popen("sbatch "+script,shell=True) -def create_slurm_script(subdir,num_machines,idx): - filename = "run_{}_nodes.cmd".format(num_machines) +def create_slurm_script(subdir,num_nodes,idx): + filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename user = getpass.getuser() with open(filepath,"w") as f: f.write('#!/bin/bash\n') f.write('#SBATCH -t 01:00:00\n') - f.write('#SBATCH -N '+str(num_machines)+'\n') + f.write('#SBATCH -N '+str(num_nodes)+'\n') f.write('#SBATCH --ntasks-per-node=4\n') f.write('#SBATCH --ntasks-per-socket=2\n') f.write('#SBATCH --gres=gpu:4\n') @@ -70,34 +69,34 @@ def create_slurm_script(subdir,num_machines,idx): f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') - f.write('srun python mpi_learn.py\n') + f.write('srun python mpi_learn.py\n') f.write('echo "done."') - return filepath + return filepath def copy_files_to_environment(subdir): from plasma.conf import conf normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) if os.path.isdir(normalization_dir): print("Copying normalization to") - os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir)))]) + os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir))])) working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) + os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) -os.system("".join(["cp -p",os.path.join(template_path+executable_name,working_directory])) +os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) os.chdir(working_directory) print("Going into {}".format(working_directory)) for i in range(num_trials): - print(i) subdir = working_directory + "/{}/".format(i) os.makedirs(subdir) copy_files_to_environment(subdir) print("Making modified conf") generate_conf_file(tunables,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,executable_name,num_machines,i) + start_slurm_job(subdir,executable_name,num_nodes,i) print("submitted {} jobs.".format(num_trials)) From 14d7d14a09096bb8931eabbe4f8fb60d256ae3f0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 13 Oct 2017 00:13:31 -0400 Subject: [PATCH 221/744] Add a dedicated driver script for augmented learning, worry less about default values of augmentation specific parameters --- examples/mpi_augment_learn.py | 143 ++++++++++++++++++++++++++++++++++ examples/mpi_learn.py | 9 +-- 2 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 examples/mpi_augment_learn.py diff --git a/examples/mpi_augment_learn.py b/examples/mpi_augment_learn.py new file mode 100644 index 00000000..35df1aaa --- /dev/null +++ b/examples/mpi_augment_learn.py @@ -0,0 +1,143 @@ +''' +######################################################### +This file trains a deep learning model to predict +disruptions on time series data from plasma discharges. + +Must run guarantee_preprocessed.py in order for this to work. + +Dependencies: +conf.py: configuration of model,training,paths, and data +model_builder.py: logic to construct the ML architecture +data_processing.py: classes to handle data processing + +Author: Julian Kates-Harbeck, jkatesharbeck@g.harvard.edu + +This work was supported by the DOE CSGF program. +######################################################### +''' + +from __future__ import print_function +import os +import sys +import time +import datetime +import random +import numpy as np + +import matplotlib +matplotlib.use('Agg') + +from pprint import pprint +sys.setrecursionlimit(10000) + +from plasma.conf import conf +from plasma.models.loader import Loader +from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.augment import Augmentator +from plasma.preprocessor.preprocess import guarantee_preprocessed + +if conf['model']['shallow']: + print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + exit(1) +if conf['data']['normalizer'] == 'minmax': + from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer +elif conf['data']['normalizer'] == 'meanvar': + from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer +elif conf['data']['normalizer'] == 'var': + from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer +elif conf['data']['normalizer'] == 'averagevar': + from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer +else: + print('unkown normalizer. exiting') + exit(1) + +from mpi4py import MPI +comm = MPI.COMM_WORLD +task_index = comm.Get_rank() +num_workers = comm.Get_size() +NUM_GPUS = 4 +MY_GPU = task_index % NUM_GPUS + +from plasma.models.mpi_runner import * + +np.random.seed(task_index) +random.seed(task_index) +if task_index == 0: + pprint(conf) + +only_predict = len(sys.argv) > 1 +custom_path = None +if only_predict: + custom_path = sys.argv[1] + print("predicting using path {}".format(custom_path)) + +##################################################### +####################Normalization#################### +##################################################### +if task_index == 0: #make sure preprocessing has been run, and is saved as a file + shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +comm.Barrier() +shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) + + + +print("normalization",end='') +raw_normalizer = Normalizer(conf) +raw_normalizer.train() +is_inference= False +normalizer = Augmentator(raw_normalizer,is_inference,conf) +loader = Loader(conf,normalizer) +print("...done") + +if not only_predict: + mpi_train(conf,shot_list_train,shot_list_validate,loader) + +#load last model for testing +print('saving results') +y_prime = [] +y_gold = [] +disruptive= [] + +# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) +# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) + +normalizer.set_inference(True) + +y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader,custom_path) +y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) + +if task_index == 0: + print('=========Summary========') + print('Train Loss: {:.3e}'.format(loss_train)) + print('Train ROC: {:.4f}'.format(roc_train)) + print('Test Loss: {:.3e}'.format(loss_test)) + print('Test ROC: {:.4f}'.format(roc_test)) + if roc_test < 0.8: sys.exit(1) + + +if task_index == 0: + disruptive_train = np.array(disruptive_train) + disruptive_test = np.array(disruptive_test) + + y_gold = y_gold_train + y_gold_test + y_prime = y_prime_train + y_prime_test + disruptive = np.concatenate((disruptive_train,disruptive_test)) + + shot_list_test.make_light() + shot_list_train.make_light() + + save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + result_base_path = conf['paths']['results_prepath'] + if not os.path.exists(result_base_path): + os.makedirs(result_base_path) + + np.savez(result_base_path+save_str, + y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, + y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, + disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, + shot_list_train=shot_list_train,shot_list_test=shot_list_test, + conf = conf) + +sys.stdout.flush() +if task_index == 0: + print('finished.') diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 35df1aaa..1fb4f3c2 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -33,7 +33,6 @@ from plasma.conf import conf from plasma.models.loader import Loader from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.augment import Augmentator from plasma.preprocessor.preprocess import guarantee_preprocessed if conf['model']['shallow']: @@ -82,10 +81,8 @@ print("normalization",end='') -raw_normalizer = Normalizer(conf) -raw_normalizer.train() -is_inference= False -normalizer = Augmentator(raw_normalizer,is_inference,conf) +normalizer = Normalizer(conf) +normalizer.train() loader = Loader(conf,normalizer) print("...done") @@ -101,8 +98,6 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) -normalizer.set_inference(True) - y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader,custom_path) y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) From d39b56e822de5b07fa5b456077c763eac2473687 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 20 Oct 2017 16:40:38 -0400 Subject: [PATCH 222/744] rewrote temporal interpolation to make sure to not use information from the future. Particularly relevant for signals with low temporal resolution. If we interpolated between time points, we might use information from up to delta_t in the future! This way we simply use the value of the latest time point from the real time data --- plasma/utils/processing.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index a2e14349..612b81df 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -15,6 +15,13 @@ from scipy.interpolate import UnivariateSpline import sys +#interpolate in a way that doesn't use future information. +#It simply finds the latest time point in the original array +#that is less than or equal than the time point in question +#and interpolates to there. +def time_sensitive_interp(x,t,t_new): + indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1) + return x[indices] def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): order = np.argsort(t) @@ -24,8 +31,9 @@ def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): tt = np.arange(tmin,tmax,dt,dtype=precision_str) sig_interp = np.zeros((len(tt),sig_width),dtype=precision_str) for i in range(sig_width): - f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) - sig_interp[:,i] = f(tt) + sig_interp[:,i] = time_sensitive_interp(sig[:,i],t,tt) #make sure to not use future information + # f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) + # sig_interp[:,i] = f(tt) if(np.any(np.isnan(sig_interp))): print("signals contains nan") From 43c8843d01466fa704b836036fed1d5e4520efc4 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 21 Oct 2017 19:50:41 -0400 Subject: [PATCH 223/744] modified jet and d3d data fetching routines to more robustly handle profile data. Added d3d current error signals, changed d3d plasma current to ipspr15V and jet spatial profiles and jet scalar temperature signal. The jet signals have 50ms sampling times. --- data/signals.py | 84 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 26 deletions(-) diff --git a/data/signals.py b/data/signals.py index 60a10710..58710703 100644 --- a/data/signals.py +++ b/data/signals.py @@ -50,19 +50,7 @@ def get_units(str): data = c.get('_s = '+signal).data() data_units = c.get('units_of(_s)').data() rank = np.ndim(data) - if rank > 1: - xdata = c.get('dim_of(_s,1)').data() - xunits = get_units('dim_of(_s,1)') - ydata = c.get('dim_of(_s)').data() - yunits = get_units('dim_of(_s)') - else: - xdata = c.get('dim_of(_s)').data() - xunits = get_units('dim_of(_s)') found = True - # MDSplus seems to return 2-D arrays transposed. Change them back. - if np.ndim(data) == 2: data = np.transpose(data) - if np.ndim(ydata) == 2: ydata = np.transpose(ydata) - if np.ndim(xdata) == 2: xdata = np.transpose(xdata) except Exception as e: #print(e) @@ -74,32 +62,60 @@ def get_units(str): #print("not in full path {}".format(signal)) data = c.get('_s = ptdata2("'+signal+'",'+str(shot)+')').data() if len(data) != 1: - xdata = c.get('dim_of(_s)').data() - rank = 1 + rank = np.ndim(data) found = True # Retrieve data from Pseudo-pointname if not in ptdata if not found: #print("not in PTDATA {}".format(signal)) data = c.get('_s = pseudo("'+signal+'",'+str(shot)+')').data() if len(data) != 1: - xdata = c.get('dim_of(_s)').data() - rank = 1 + rank = np.ndim(data) found = True #this means the signal wasn't found if not found: print ("No such signal: {}".format(signal)) pass + # get time base + if found: + if rank > 1: + xdata = c.get('dim_of(_s,1)').data() + xunits = get_units('dim_of(_s,1)') + ydata = c.get('dim_of(_s)').data() + yunits = get_units('dim_of(_s)') + else: + xdata = c.get('dim_of(_s)').data() + xunits = get_units('dim_of(_s)') + + # MDSplus seems to return 2-D arrays transposed. Change them back. + if np.ndim(data) == 2: data = np.transpose(data) + if np.ndim(ydata) == 2: ydata = np.transpose(ydata) + if np.ndim(xdata) == 2: xdata = np.transpose(xdata) + # print ' GADATA Retrieval Time : ',time.time() - t0 xdata = xdata*1e-3#time is measued in ms return xdata,data,ydata,found def fetch_jet_data(signal_path,shot_num,c): - data = c.get('_sig=jet("{}/",{})'.format(signal_path,shot_num)).data() - time = c.get('_sig=dim_of(jet("{}/",{}))'.format(signal_path,shot_num)).data() - found = True - return time,data,None,found + found = False + time = np.array([0]) + ydata = None + data = np.array([0]) + try: + data = c.get('_sig=jet("{}/",{})'.format(signal_path,shot_num)).data() + if np.ndim(data) == 2: + data = np.transpose(data) + time = c.get('_sig=dim_of(jet("{}/",{}),1)'.format(signal_path,shot_num)).data() + ydata = c.get('_sig=dim_of(jet("{}/",{}),0)'.format(signal_path,shot_num)).data() + else: + time = c.get('_sig=dim_of(jet("{}/",{}))'.format(signal_path,shot_num)).data() + found = True + except Exception as e: + #print(e) + #sys.stdout.flush() + pass + return time,data,ydata,found def fetch_nstx_data(signal_path,shot_num,c): tree,tag = get_tree_and_tag(signal_path) @@ -119,13 +135,22 @@ def fetch_nstx_data(signal_path,shot_num,c): all_machines = [d3d,jet] -profile_num_channels = 32 +profile_num_channels = 64 etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) +# epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) +etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) +edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) +etemp = Signal("electron temperature",["ppf/hrtx/te0/"],[jet],causal_shifts=[25]) +# epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) + q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False) -ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipsip"],[jet,d3d],is_ip=True) +ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipspr15V"],[jet,d3d],is_ip=True) #"d3d/ipsip" was used before, ipspr15V seems to be available for a superset of shots. +iptarget = Signal("plasma current target",["d3d/ipsiptargt"],[d3d]) +iperr = Signal("plasma current error",["d3d/ipeecoil"],[d3d]) + li = Signal("internal inductance",["jpf/gs/bl-li Date: Wed, 25 Oct 2017 14:26:55 -0400 Subject: [PATCH 224/744] print message --- plasma/models/runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 6ecfa9b5..c65778e1 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -132,6 +132,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): epoch_logs['train_loss'] = ave_loss best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']],best_so_far) if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + print("Not saving model weights") specific_builder.delete_model_weights(train_model,int(round(e))) if conf['training']['ranking_difficulty_fac'] != 1.0: From b47ef7de1394a777c128357a4f51249a2fc749d8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 15:01:42 -0400 Subject: [PATCH 225/744] spaces to tabs --- plasma/utils/processing.py | 81 +++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index 612b81df..63c8c6f4 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -20,8 +20,8 @@ #that is less than or equal than the time point in question #and interpolates to there. def time_sensitive_interp(x,t,t_new): - indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1) - return x[indices] + indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1) + return x[indices] def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): order = np.argsort(t) @@ -31,10 +31,9 @@ def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): tt = np.arange(tmin,tmax,dt,dtype=precision_str) sig_interp = np.zeros((len(tt),sig_width),dtype=precision_str) for i in range(sig_width): - sig_interp[:,i] = time_sensitive_interp(sig[:,i],t,tt) #make sure to not use future information + sig_interp[:,i] = time_sensitive_interp(sig[:,i],t,tt) #make sure to not use future information # f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) # sig_interp[:,i] = f(tt) - if(np.any(np.isnan(sig_interp))): print("signals contains nan") if(np.any(t[1:] - t[:-1] <= 0)): @@ -53,53 +52,53 @@ def cut_and_resample_signal(t,sig,tmin,tmax,dt,precision_str): return resample_signal(t,sig,tmin,tmax,dt,precision_str) def get_individual_shot_file(prepath,shot_num,ext='.txt'): - return prepath + str(shot_num) + ext + return prepath + str(shot_num) + ext def append_to_filename(path,to_append): - ending_idx = path.rfind('.') - new_path = path[:ending_idx] + to_append + path[ending_idx:] - return new_path + ending_idx = path.rfind('.') + new_path = path[:ending_idx] + to_append + path[ending_idx:] + return new_path def train_test_split(x,frac,do_shuffle=False): - if not isinstance(x,np.ndarray): - return train_test_split_robust(x,frac,do_shuffle) - mask = np.array(range(len(x))) < frac*len(x) - if do_shuffle: - np.random.shuffle(mask) - return x[mask],x[~mask] + if not isinstance(x,np.ndarray): + return train_test_split_robust(x,frac,do_shuffle) + mask = np.array(range(len(x))) < frac*len(x) + if do_shuffle: + np.random.shuffle(mask) + return x[mask],x[~mask] def train_test_split_robust(x,frac,do_shuffle=False): - mask = np.array(range(len(x))) < frac*len(x) - if do_shuffle: - np.random.shuffle(mask) - train = [] - test = [] - for (i,_x) in enumerate(x): - if mask[i]: - train.append(_x) - else: - test.append(_x) - return train,test + mask = np.array(range(len(x))) < frac*len(x) + if do_shuffle: + np.random.shuffle(mask) + train = [] + test = [] + for (i,_x) in enumerate(x): + if mask[i]: + train.append(_x) + else: + test.append(_x) + return train,test def train_test_split_all(x,frac,do_shuffle=True): - groups = [] - length = len(x[0]) - mask = np.array(range(length)) < frac*length - if do_shuffle: - np.random.shuffle(mask) - for item in x: - groups.append((item[mask],item[~mask])) - return groups + groups = [] + length = len(x[0]) + mask = np.array(range(length)) < frac*length + if do_shuffle: + np.random.shuffle(mask) + for item in x: + groups.append((item[mask],item[~mask])) + return groups def concatenate_sublists(superlist): - return list(itertools.chain.from_iterable(superlist)) + return list(itertools.chain.from_iterable(superlist)) def get_signal_slices(signals_superlist): - indices_superlist = [] - signals_so_far = 0 - for sublist in signals_superlist: - indices_sublist = signals_so_far + np.array(range(len(sublist))) - signals_so_far += len(sublist) - indices_superlist.append(indices_sublist) - return indices_superlist + indices_superlist = [] + signals_so_far = 0 + for sublist in signals_superlist: + indices_sublist = signals_so_far + np.array(range(len(sublist))) + signals_so_far += len(sublist) + indices_superlist.append(indices_sublist) + return indices_superlist From 2687cec55c27773b2589b2b0d075e56f9f1534e7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:02:44 -0400 Subject: [PATCH 226/744] adding hyperparameter tuning for shallow models --- examples/check_tuning.py | 198 ++++++------ examples/conf.yaml | 6 + plasma/models/shallow_runner.py | 513 ++++++++++++++++++-------------- 3 files changed, 392 insertions(+), 325 deletions(-) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index 623d02f9..93b4777a 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -11,123 +11,123 @@ dir_path = "/tigress/{}/hyperparams/".format(getpass.getuser()) if len(sys.argv) <= 1: - dir_path = dir_path + os.listdir(dir_path)[0] + '/' - print("using default dir {}".format(dir_path)) + dir_path = dir_path + os.listdir(dir_path)[0] + '/' + print("using default dir {}".format(dir_path)) else: - dir_path = sys.argv[1] + dir_path = sys.argv[1] class HyperparamExperiment(): - def __init__(self,path,conf_name = "conf.yaml"): - if not path.endswith('/'): - path += '/' - self.path = path - self.finished = False - self.success = False - self.logs_path = path + "csv_logs/" - self.raw_logs_path = path[:-1] + ".out" - self.changed_path = path + "changed_params.out" - with open(self.path + conf_name, 'r') as yaml_file: - conf = yaml.load(yaml_file) - self.name_to_monitor = conf['callbacks']['monitor'] - self.load_data() - self.get_changed() - self.get_maximum() - self.read_raw_logs() + def __init__(self,path,conf_name = "conf.yaml"): + if not path.endswith('/'): + path += '/' + self.path = path + self.finished = False + self.success = False + self.logs_path = path + "csv_logs/" + self.raw_logs_path = path[:-1] + ".out" + self.changed_path = path + "changed_params.out" + with open(self.path + conf_name, 'r') as yaml_file: + conf = yaml.load(yaml_file) + self.name_to_monitor = conf['callbacks']['monitor'] + self.load_data() + self.get_changed() + self.get_maximum() + self.read_raw_logs() - def __lt__(self,other): - return self.path.__lt__(other.path) + def __lt__(self,other): + return self.path.__lt__(other.path) - def get_number(self): - return int(os.path.basename(self.path[:-1])) + def get_number(self): + return int(os.path.basename(self.path[:-1])) - def __str__(self): - s = "Experiment:\n" - s += '-'*20+"\n" - s += '# {}\n'.format(self.get_number()) - s += '-'*20+"\n" - s += self.changed - s += '-'*20+"\n" - s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) - s += '-'*20+"\n" - return s + def __str__(self): + s = "Experiment:\n" + s += '-'*20+"\n" + s += '# {}\n'.format(self.get_number()) + s += '-'*20+"\n" + s += self.changed + s += '-'*20+"\n" + s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) + s += '-'*20+"\n" + return s - def summary(self): - s = "Finished" if self.finished else "Running" - print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) - + def summary(self): + s = "Finished" if self.finished else "Running" + print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) + - def load_data(self): - if os.path.exists(self.logs_path): - files = os.listdir(self.logs_path) - assert(len(files) == 1) - self.logs_path = self.logs_path + files[0] - if os.path.getsize(self.logs_path) > 0: - dat = pandas.read_csv(self.logs_path) - self.epochs = np.array(dat['epoch']) - self.values = np.array(dat[self.name_to_monitor]) - self.dat = dat - print("loaded logs") - print(self.epochs) - print(self.values) - return - self.epochs = [] - print("no logs yet") + def load_data(self): + if os.path.exists(self.logs_path): + files = os.listdir(self.logs_path) + assert(len(files) == 1) + self.logs_path = self.logs_path + files[0] + if os.path.getsize(self.logs_path) > 0: + dat = pandas.read_csv(self.logs_path) + self.epochs = np.array(dat['epoch']) + self.values = np.array(dat[self.name_to_monitor]) + self.dat = dat + print("loaded logs") + print(self.epochs) + print(self.values) + return + self.epochs = [] + print("no logs yet") - def get_changed(self): - with open(self.changed_path, 'r') as file: - text = file.read() - print("changed values: {}".format(text)) - self.changed = text - return text + def get_changed(self): + with open(self.changed_path, 'r') as file: + text = file.read() + print("changed values: {}".format(text)) + self.changed = text + return text - def read_raw_logs(self): - self.success = False - self.finished = False - lines = [] - if os.path.exists(self.raw_logs_path): - with open(self.raw_logs_path, 'r') as file: - lines = file.readlines() - if len(lines) > 1: - if lines[-1].strip() == 'done.': - self.finished = True - if lines[-2].strip() == 'finished.': - self.success = True - print('finished: {}, success: {}'.format(self.finished, self.success)) + def read_raw_logs(self): + self.success = False + self.finished = False + lines = [] + if os.path.exists(self.raw_logs_path): + with open(self.raw_logs_path, 'r') as file: + lines = file.readlines() + if len(lines) > 1: + if lines[-1].strip() == 'done.': + self.finished = True + if lines[-2].strip() == 'finished.': + self.success = True + print('finished: {}, success: {}'.format(self.finished, self.success)) - def get_maximum(self,verbose=True): - if len(self.epochs) > 0: - idx = np.argmax(self.values) - s = "Finished" if self.finished else "Running" - if verbose: - #print(self.path) - print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) - return self.values[idx],self.epochs[idx] - else: - return -1,-1 - + def get_maximum(self,verbose=True): + if len(self.epochs) > 0: + idx = np.argmax(self.values) + s = "Finished" if self.finished else "Running" + if verbose: + #print(self.path) + print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) + return self.values[idx],self.epochs[idx] + else: + return -1,-1 + def get_experiments(path): - experiments = [] - num_tot = 0 - num_finished = 0 - num_success = 0 - for name in sorted(os.listdir(path)): - if os.path.isdir(path + name): - print(path+name) - exp= HyperparamExperiment(path+name) - num_finished += 1 if exp.finished else 0 - num_success += 1 if exp.success else 0 - num_tot += 1 - experiments.append(exp) - print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) - return experiments + experiments = [] + num_tot = 0 + num_finished = 0 + num_success = 0 + for name in sorted(os.listdir(path)): + if os.path.isdir(path + name): + print(path+name) + exp= HyperparamExperiment(path+name) + num_finished += 1 if exp.finished else 0 + num_success += 1 if exp.success else 0 + num_tot += 1 + experiments.append(exp) + print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) + return experiments experiments = sorted(get_experiments(dir_path)) print(len(experiments)) best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) for e in experiments: - e.summary() + e.summary() print("Best experiment so far: \n") for e in np.array(experiments)[best_experiments][-3:]: - print(e) + print(e) diff --git a/examples/conf.yaml b/examples/conf.yaml index d64fec30..22624e70 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -47,6 +47,12 @@ data: model: shallow: False + shallow_model: + type: "svm" #"random_forest" + n_estimators: 50 #for random forest + max_depth: 20 #for random forest + C: 1.0 #for svm + kernel: "rbf" #rbf, sigmoid, linear, poly, for svm #length of LSTM memory pred_length: 200 pred_batch_size: 128 diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 8e3dc483..031b8b27 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -30,247 +30,308 @@ dataset_test_path = "dataset_test.npz" class FeatureExtractor(object): - def __init__(self,loader,timesteps = 32): - self.loader = loader - self.timesteps = timesteps - self.positional_fit_order = 4 - self.num_positional_features = self.positional_fit_order + 1 + 3 - self.temporal_fit_order = 3 - self.num_temporal_features = self.temporal_fit_order + 1 + 3 - - - def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): - X = [] - Y = [] - Disr = [] - print("loading...") - pbar = Progbar(len(shot_list)) - - fn = partial(self.load_shot,sample_prob=sample_prob) - pool = mp.Pool() - print('loading data in parallel on {} processes'.format(pool._processes)) - for x,y,disr in pool.imap(fn,shot_list): - X.append(x) - Y.append(y) - Disr.append(disr) - pbar.add(1.0) - pool.close() - pool.join() - return X,Y,np.array(Disr) - - def get_save_prepath(self): - prepath = self.loader.conf['paths']['processed_prepath'] - use_signals = self.loader.conf['paths']['use_signals'] - save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) - return save_prepath - - def load_shot(self,shot,sample_prob=1.0): - save_prepath = self.get_save_prepath() - save_path = shot.get_save_path(save_prepath) - if os.path.isfile(save_path): - dat = np.load(save_path) - X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] - else: - use_signals = self.loader.conf['paths']['use_signals'] - prepath = self.loader.conf['paths']['processed_prepath'] - assert(shot.valid) - shot.restore(prepath) - if self.loader.normalizer is not None: - self.loader.normalizer.apply(shot) - else: - print('Warning, no normalization. Training data may be poorly conditioned') - # sig,res = self.get_signal_result_from_shot(shot) - disr = 1 if shot.is_disruptive else 0 - sig_sample = shot.signals_dict[use_signals[0]] - if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) - ttd_sample = shot.ttd - timesteps = self.timesteps - length = sig_sample.shape[0] - if length < timesteps: - print(ttd,shot,shot.number) - print("Shot must be at least as long as the RNN length.") - exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) - - X = [] - Y = [] - while(len(X) == 0): - for i in range(length-timesteps+1): - #if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) - X.append(x) - Y.append(y) - X = np.stack(X) - Y = np.stack(Y) - shot.make_light() - if not os.path.exists(save_prepath): - os.makedirs(save_prepath) - np.savez(save_path,X=X,Y=Y,disr=disr) - #print(X.shape,Y.shape) - if sample_prob < 1.0: - indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) - X = X[indices] - Y = Y[indices] - return X,Y,disr - - - def get_x_y(self,timestep,shot): - x = [] - use_signals = self.loader.conf['paths']['use_signals'] - for sig in use_signals: - x += [self.extract_features(timestep,shot,sig)] - # x = sig[timestep:timestep+timesteps,:] - x = np.concatenate(x,axis=0) - y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) - return x,y - - - def extract_features(self,timestep,shot,signal): - raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] - num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 - output_arr = np.empty((self.timesteps,num_positional_features)) - final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) - for t in range(self.timesteps): - output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) - for i in range(num_positional_features): - idx = i*self.num_temporal_features - final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) - return final_output_arr - - def extract_positional_features(self,arr): - num_channels = len(arr) - if num_channels > 1: - ret_arr = np.empty(self.num_positional_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:self.positional_fit_order+1] = coefficients - ret_arr[self.positional_fit_order+1] = mu - ret_arr[self.positional_fit_order+2] = std - ret_arr[self.positional_fit_order+3] = max_val - return ret_arr - else: - return arr - - def extract_temporal_features(self,arr): - ret_arr = np.empty(self.num_temporal_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:self.temporal_fit_order+1] = coefficients - ret_arr[self.temporal_fit_order+1] = mu - ret_arr[self.temporal_fit_order+2] = std - ret_arr[self.temporal_fit_order+3] = max_val - return ret_arr - - def prepend_timesteps(self,arr): - prepend = arr[0]*np.ones(self.timesteps-1) - return np.concatenate((prepend,arr)) + def __init__(self,loader,timesteps = 32): + self.loader = loader + self.timesteps = timesteps + self.positional_fit_order = 4 + self.num_positional_features = self.positional_fit_order + 1 + 3 + self.temporal_fit_order = 3 + self.num_temporal_features = self.temporal_fit_order + 1 + 3 + + + def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): + X = [] + Y = [] + Disr = [] + print("loading...") + pbar = Progbar(len(shot_list)) + + fn = partial(self.load_shot,sample_prob=sample_prob) + pool = mp.Pool() + print('loading data in parallel on {} processes'.format(pool._processes)) + for x,y,disr in pool.imap(fn,shot_list): + X.append(x) + Y.append(y) + Disr.append(disr) + pbar.add(1.0) + pool.close() + pool.join() + return X,Y,np.array(Disr) + + def get_save_prepath(self): + prepath = self.loader.conf['paths']['processed_prepath'] + use_signals = self.loader.conf['paths']['use_signals'] + save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) + return save_prepath + + def load_shot(self,shot,sample_prob=1.0): + save_prepath = self.get_save_prepath() + save_path = shot.get_save_path(save_prepath) + if os.path.isfile(save_path): + dat = np.load(save_path) + X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] + else: + use_signals = self.loader.conf['paths']['use_signals'] + prepath = self.loader.conf['paths']['processed_prepath'] + assert(shot.valid) + shot.restore(prepath) + if self.loader.normalizer is not None: + self.loader.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + # sig,res = self.get_signal_result_from_shot(shot) + disr = 1 if shot.is_disruptive else 0 + sig_sample = shot.signals_dict[use_signals[0]] + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + ttd_sample = shot.ttd + timesteps = self.timesteps + length = sig_sample.shape[0] + if length < timesteps: + print(ttd,shot,shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + while(len(X) == 0): + for i in range(length-timesteps+1): + #if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) + shot.make_light() + if not os.path.exists(save_prepath): + os.makedirs(save_prepath) + np.savez(save_path,X=X,Y=Y,disr=disr) + #print(X.shape,Y.shape) + if sample_prob < 1.0: + indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) + X = X[indices] + Y = Y[indices] + return X,Y,disr + + + def get_x_y(self,timestep,shot): + x = [] + use_signals = self.loader.conf['paths']['use_signals'] + for sig in use_signals: + x += [self.extract_features(timestep,shot,sig)] + # x = sig[timestep:timestep+timesteps,:] + x = np.concatenate(x,axis=0) + y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) + return x,y + + + def extract_features(self,timestep,shot,signal): + raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] + num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 + output_arr = np.empty((self.timesteps,num_positional_features)) + final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) + for t in range(self.timesteps): + output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) + for i in range(num_positional_features): + idx = i*self.num_temporal_features + final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) + return final_output_arr + + def extract_positional_features(self,arr): + num_channels = len(arr) + if num_channels > 1: + ret_arr = np.empty(self.num_positional_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.positional_fit_order+1] = coefficients + ret_arr[self.positional_fit_order+1] = mu + ret_arr[self.positional_fit_order+2] = std + ret_arr[self.positional_fit_order+3] = max_val + return ret_arr + else: + return arr + + def extract_temporal_features(self,arr): + ret_arr = np.empty(self.num_temporal_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.temporal_fit_order+1] = coefficients + ret_arr[self.temporal_fit_order+1] = mu + ret_arr[self.temporal_fit_order+2] = std + ret_arr[self.temporal_fit_order+3] = max_val + return ret_arr + + def prepend_timesteps(self,arr): + prepend = arr[0]*np.ones(self.timesteps-1) + return np.concatenate((prepend,arr)) from sklearn import svm from sklearn.ensemble import RandomForestClassifier from sklearn.externals import joblib from sklearn.metrics import accuracy_score,auc,classification_report,confusion_matrix +import keras.callbacks as cbks + +def build_callbacks(self,conf,callbacks_list): + ''' + The purpose of the method is to set up logging and history. It is based on Keras Callbacks + https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py + + Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. + Other possible callbacks to add in future: RemoteMonitor, LearningRateScheduler + + Argument list: + - conf: There is a "callbacks" section in conf.yaml file. Relevant parameters are: + list: Parameter specifying additional callbacks, read in the driver script and passed as an argument of type list (see next arg) + metrics: List of quantities monitored during training and validation + mode: one of {auto, min, max}. The decision to overwrite the current save file is made based on either the maximization or the minimization of the monitored quantity. For val_acc, this should be max, for val_loss this should be min, etc. In auto mode, the direction is automatically inferred from the name of the monitored quantity. + monitor: Quantity used for early stopping, has to be from the list of metrics + patience: Number of epochs used to decide on whether to apply early stopping or continue training + - callbacks_list: uses callbacks.list configuration parameter, specifies the list of additional callbacks + Returns: modified list of callbacks + ''' + + mode = conf['callbacks']['mode'] + monitor = conf['callbacks']['monitor'] + patience = conf['callbacks']['patience'] + csvlog_save_path = conf['paths']['csvlog_save_path'] + #CSV callback is on by default + if not os.path.exists(csvlog_save_path): + os.makedirs(csvlog_save_path) + + callbacks_list = conf['callbacks']['list'] + + callbacks = [cbks.BaseLogger()] + callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(csvlog_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] + + return cbks.CallbackList(callbacks) + def train(conf,shot_list_train,shot_list_validate,loader): - np.random.seed(1) - - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - - sample_prob = conf['data']['shallow_sample_prob'] - feature_extractor = FeatureExtractor(loader) - shot_list_train = shot_list_train.random_sublist(debug_use_shots) - X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = sample_prob) - Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = sample_prob) - X = np.concatenate(X,axis=0) - Y = np.concatenate(Y,axis=0) - Xv = np.concatenate(Xv,axis=0) - Yv = np.concatenate(Yv,axis=0) - - print("Total data: {} samples, {} positive".format(1.0/sample_prob*len(X),1.0/sample_prob*np.sum(Y > 0))) - #max_samples = 100000 - #num_samples = min(max_samples,len(Y)) - #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) - #X = X[indices] - #Y = Y[indices] - - print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) - - save_prepath = feature_extractor.get_save_prepath() - model_path = save_prepath + model_filename - if not os.path.isfile(model_path): - - start_time = time.time() - #model = svm.SVC(probability=True) - model = RandomForestClassifier(n_estimators=50,max_depth=20,n_jobs=-1) - model.fit(X,Y) - joblib.dump(model,model_path) - print("Fit model in {} seconds".format(time.time()-start_time)) - else: - model = joblib.load(model_path) - print("model exists.") - - - Y_pred = model.predict(X) - print("Train") - print(classification_report(Y,Y_pred)) - Y_predv = model.predict(Xv) - print("Validate") - print(classification_report(Yv,Y_predv)) - #print(confusion_matrix(Y,Y_pred)) - - - print('...done') + np.random.seed(1) + + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + + sample_prob = conf['data']['shallow_sample_prob'] + feature_extractor = FeatureExtractor(loader) + shot_list_train = shot_list_train.random_sublist(debug_use_shots) + X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = sample_prob) + Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = sample_prob) + X = np.concatenate(X,axis=0) + Y = np.concatenate(Y,axis=0) + Xv = np.concatenate(Xv,axis=0) + Yv = np.concatenate(Yv,axis=0) + + print("Total data: {} samples, {} positive".format(1.0/sample_prob*len(X),1.0/sample_prob*np.sum(Y > 0))) + #max_samples = 100000 + #num_samples = min(max_samples,len(Y)) + #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) + #X = X[indices] + #Y = Y[indices] + + print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) + callbacks = build_callbacks(conf,callbacks_list) + callback_metrics = conf['callbacks']['metrics'] + callbacks.set_params({ + 'metrics': callback_metrics, + }) + callbacks.on_train_begin() + callbacks.on_epoch_begin(0) + + save_prepath = feature_extractor.get_save_prepath() + model_path = save_prepath + model_filename + if not os.path.isfile(model_path): + + start_time = time.time() + model_conf = conf['model']['shallow_model'] + if model_conf['type'] == "svm": + model = svm.SVC(probability=True, + C=model_conf["C"], + kernel=model_conf["kernel"]) + elif model_conf['type'] == "random_forest": + model = RandomForestClassifier(n_estimators=model_conf["n_estimators"], + max_depth=model_conf["max_depth"],n_jobs=-1) + else: + print("Unkown model type, exiting.") + exit(1) + model.fit(X,Y) + joblib.dump(model,model_path) + print("Fit model in {} seconds".format(time.time()-start_time)) + else: + model = joblib.load(model_path) + print("model exists.") + + + Y_pred = model.predict(X) + print("Train") + print(classification_report(Y,Y_pred)) + Y_predv = model.predict(Xv) + print("Validate") + print(classification_report(Yv,Y_predv)) + #print(confusion_matrix(Y,Y_pred)) + _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) + _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) + + epoch_logs = {} + epoch_logs['val_roc'] = roc_area + epoch_logs['val_loss'] = loss + epoch_logs['train_roc'] = roc_area_train + epoch_logs['train_loss'] = loss_train + callbacks.on_epoch_end(0, epoch_logs) + + + print('...done') def make_predictions(conf,shot_list,loader): - feature_extractor = FeatureExtractor(loader) - save_prepath = feature_extractor.get_save_prepath() - model_path = save_prepath + model_filename - model = joblib.load(model_path) - #shot_list = shot_list.random_sublist(10) - - y_prime = [] - y_gold = [] - disruptive = [] - - pbar = Progbar(len(shot_list)) - fn = partial(predict_single_shot,model=model,feature_extractor=feature_extractor) - pool = mp.Pool() - print('predicting in parallel on {} processes'.format(pool._processes)) - #for (y_p,y,disr) in map(fn,shot_list): - for (y_p,y,disr) in pool.imap(fn,shot_list): - #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) - y_prime += [np.expand_dims(y_p,axis=1)] - y_gold += [np.expand_dims(y,axis=1)] - disruptive += [disr] - pbar.add(1.0) - - pool.close() - pool.join() - return y_prime,y_gold,disruptive + feature_extractor = FeatureExtractor(loader) + save_prepath = feature_extractor.get_save_prepath() + model_path = save_prepath + model_filename + model = joblib.load(model_path) + #shot_list = shot_list.random_sublist(10) + + y_prime = [] + y_gold = [] + disruptive = [] + + pbar = Progbar(len(shot_list)) + fn = partial(predict_single_shot,model=model,feature_extractor=feature_extractor) + pool = mp.Pool() + print('predicting in parallel on {} processes'.format(pool._processes)) + #for (y_p,y,disr) in map(fn,shot_list): + for (y_p,y,disr) in pool.imap(fn,shot_list): + #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) + y_prime += [np.expand_dims(y_p,axis=1)] + y_gold += [np.expand_dims(y,axis=1)] + disruptive += [disr] + pbar.add(1.0) + + pool.close() + pool.join() + return y_prime,y_gold,disruptive def predict_single_shot(shot,model,feature_extractor): - X,y,disr = feature_extractor.load_shot(shot,sample_prob=1.0) - y_p = model.predict_proba(X)[:,1] - #print(y) - #print(y_p) - y = feature_extractor.prepend_timesteps(y) - y_p = feature_extractor.prepend_timesteps(y_p) - return y_p,y,disr + X,y,disr = feature_extractor.load_shot(shot,sample_prob=1.0) + y_p = model.predict_proba(X)[:,1] + #print(y) + #print(y_p) + y = feature_extractor.prepend_timesteps(y) + y_p = feature_extractor.prepend_timesteps(y_p) + return y_p,y,disr def make_predictions_and_evaluate_gpu(conf,shot_list,loader): - y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader) - analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader) + analyzer = PerformanceAnalyzer(conf=conf) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + return y_prime,y_gold,disruptive,roc_area,loss From c3fedda5799ff849525f21b400477f6f03fb3787 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:03:07 -0400 Subject: [PATCH 227/744] tigergpu conf changes --- examples/conf.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index d64fec30..825ca773 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,11 +10,11 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_data' + data: 'jet_to_d3d_data' specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set data: - signal_to_augment: 'plasma current' #or None + signal_to_augment: None #'plasma current' #or None augmentation_mode: 'noise' augment_during_training: True cut_shot_ends: True @@ -43,7 +43,7 @@ data: #TODO optimize normalizer: 'var' shallow_sample_prob: 0.1 #the fraction of samples with which to train the shallow model - floatx: 'float64' + floatx: 'float32' model: shallow: False From d10786569d4756bcc41bd0010497937d3da28980 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:12:31 -0400 Subject: [PATCH 228/744] adding hyperparameter tuning for shallow models --- examples/conf.yaml | 2 ++ examples/tune_hyperparams.py | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 22624e70..0c1507d5 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -12,6 +12,8 @@ paths: tensorboard_save_path: '/Graph/' data: 'jet_data' specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set + executable: "mpi_learn.py" + shallow_executable: "learn.py" data: signal_to_augment: 'plasma current' #or None diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index ca1d2444..ce6a18a8 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -35,6 +35,7 @@ def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training with open(os.path.join(save_path,conf_name), 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) + return conf def generate_working_dirname(run_directory): @@ -43,12 +44,16 @@ def generate_working_dirname(run_directory): return run_directory + s -def start_slurm_job(subdir,executable,num_nodes,i): - os.system(" ".join(["cp -p",executable,subdir])) - script = create_slurm_script(subdir,num_nodes,i) +def start_slurm_job(subdir,num_nodes,i,conf): + if conf['model']['shallow']: + executable_name = conf['paths']['shallow_executable'] + else: + executable_name = conf['paths']['executable'] + os.system(" ".join(["cp -p",executable_name,subdir])) + script = create_slurm_script(subdir,num_nodes,i,executable_name) sp.Popen("sbatch "+script,shell=True) -def create_slurm_script(subdir,num_nodes,idx): +def create_slurm_script(subdir,num_nodes,idx,executable_name): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename user = getpass.getuser() @@ -69,7 +74,7 @@ def create_slurm_script(subdir,num_nodes,idx): f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') - f.write('srun python mpi_learn.py\n') + f.write('srun python {}\n'.format(executable_name)) f.write('echo "done."') return filepath @@ -95,8 +100,8 @@ def copy_files_to_environment(subdir): os.makedirs(subdir) copy_files_to_environment(subdir) print("Making modified conf") - generate_conf_file(tunables,working_directory,subdir,conf_name) + conf = generate_conf_file(tunables,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,executable_name,num_nodes,i) + start_slurm_job(subdir,num_nodes,i,conf) print("submitted {} jobs.".format(num_trials)) From 75ac2f27e28eb60b078c562a45c58b938294da2f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:12:49 -0400 Subject: [PATCH 229/744] tigergpu conf changes --- examples/conf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e1390205..4c2503a3 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -46,7 +46,7 @@ data: floatx: 'float32' model: - shallow: False + shallow: True shallow_model: type: "svm" #"random_forest" n_estimators: 50 #for random forest From 9d6c2e257b3374369444d4e169874b3ccbbc7cdc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:14:25 -0400 Subject: [PATCH 230/744] tune hyperparams for shallow model --- examples/tune_hyperparams.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index ce6a18a8..f3aea04f 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -21,7 +21,6 @@ run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" -executable_name = "mpi_learn.py" num_nodes = 2 num_trials = 2 From b79fdc50ba35eb4db44baa714962df06bcf1bda5 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:23:33 -0400 Subject: [PATCH 231/744] tabs to spaces --- examples/check_tuning.py | 198 ++++++------ plasma/models/shallow_runner.py | 546 ++++++++++++++++---------------- plasma/utils/processing.py | 122 +++---- 3 files changed, 433 insertions(+), 433 deletions(-) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index 93b4777a..7735f0f6 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -11,123 +11,123 @@ dir_path = "/tigress/{}/hyperparams/".format(getpass.getuser()) if len(sys.argv) <= 1: - dir_path = dir_path + os.listdir(dir_path)[0] + '/' - print("using default dir {}".format(dir_path)) + dir_path = dir_path + os.listdir(dir_path)[0] + '/' + print("using default dir {}".format(dir_path)) else: - dir_path = sys.argv[1] + dir_path = sys.argv[1] class HyperparamExperiment(): - def __init__(self,path,conf_name = "conf.yaml"): - if not path.endswith('/'): - path += '/' - self.path = path - self.finished = False - self.success = False - self.logs_path = path + "csv_logs/" - self.raw_logs_path = path[:-1] + ".out" - self.changed_path = path + "changed_params.out" - with open(self.path + conf_name, 'r') as yaml_file: - conf = yaml.load(yaml_file) - self.name_to_monitor = conf['callbacks']['monitor'] - self.load_data() - self.get_changed() - self.get_maximum() - self.read_raw_logs() + def __init__(self,path,conf_name = "conf.yaml"): + if not path.endswith('/'): + path += '/' + self.path = path + self.finished = False + self.success = False + self.logs_path = path + "csv_logs/" + self.raw_logs_path = path[:-1] + ".out" + self.changed_path = path + "changed_params.out" + with open(self.path + conf_name, 'r') as yaml_file: + conf = yaml.load(yaml_file) + self.name_to_monitor = conf['callbacks']['monitor'] + self.load_data() + self.get_changed() + self.get_maximum() + self.read_raw_logs() - def __lt__(self,other): - return self.path.__lt__(other.path) + def __lt__(self,other): + return self.path.__lt__(other.path) - def get_number(self): - return int(os.path.basename(self.path[:-1])) + def get_number(self): + return int(os.path.basename(self.path[:-1])) - def __str__(self): - s = "Experiment:\n" - s += '-'*20+"\n" - s += '# {}\n'.format(self.get_number()) - s += '-'*20+"\n" - s += self.changed - s += '-'*20+"\n" - s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) - s += '-'*20+"\n" - return s + def __str__(self): + s = "Experiment:\n" + s += '-'*20+"\n" + s += '# {}\n'.format(self.get_number()) + s += '-'*20+"\n" + s += self.changed + s += '-'*20+"\n" + s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) + s += '-'*20+"\n" + return s - def summary(self): - s = "Finished" if self.finished else "Running" - print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) - + def summary(self): + s = "Finished" if self.finished else "Running" + print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) + - def load_data(self): - if os.path.exists(self.logs_path): - files = os.listdir(self.logs_path) - assert(len(files) == 1) - self.logs_path = self.logs_path + files[0] - if os.path.getsize(self.logs_path) > 0: - dat = pandas.read_csv(self.logs_path) - self.epochs = np.array(dat['epoch']) - self.values = np.array(dat[self.name_to_monitor]) - self.dat = dat - print("loaded logs") - print(self.epochs) - print(self.values) - return - self.epochs = [] - print("no logs yet") + def load_data(self): + if os.path.exists(self.logs_path): + files = os.listdir(self.logs_path) + assert(len(files) == 1) + self.logs_path = self.logs_path + files[0] + if os.path.getsize(self.logs_path) > 0: + dat = pandas.read_csv(self.logs_path) + self.epochs = np.array(dat['epoch']) + self.values = np.array(dat[self.name_to_monitor]) + self.dat = dat + print("loaded logs") + print(self.epochs) + print(self.values) + return + self.epochs = [] + print("no logs yet") - def get_changed(self): - with open(self.changed_path, 'r') as file: - text = file.read() - print("changed values: {}".format(text)) - self.changed = text - return text + def get_changed(self): + with open(self.changed_path, 'r') as file: + text = file.read() + print("changed values: {}".format(text)) + self.changed = text + return text - def read_raw_logs(self): - self.success = False - self.finished = False - lines = [] - if os.path.exists(self.raw_logs_path): - with open(self.raw_logs_path, 'r') as file: - lines = file.readlines() - if len(lines) > 1: - if lines[-1].strip() == 'done.': - self.finished = True - if lines[-2].strip() == 'finished.': - self.success = True - print('finished: {}, success: {}'.format(self.finished, self.success)) + def read_raw_logs(self): + self.success = False + self.finished = False + lines = [] + if os.path.exists(self.raw_logs_path): + with open(self.raw_logs_path, 'r') as file: + lines = file.readlines() + if len(lines) > 1: + if lines[-1].strip() == 'done.': + self.finished = True + if lines[-2].strip() == 'finished.': + self.success = True + print('finished: {}, success: {}'.format(self.finished, self.success)) - def get_maximum(self,verbose=True): - if len(self.epochs) > 0: - idx = np.argmax(self.values) - s = "Finished" if self.finished else "Running" - if verbose: - #print(self.path) - print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) - return self.values[idx],self.epochs[idx] - else: - return -1,-1 - + def get_maximum(self,verbose=True): + if len(self.epochs) > 0: + idx = np.argmax(self.values) + s = "Finished" if self.finished else "Running" + if verbose: + #print(self.path) + print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) + return self.values[idx],self.epochs[idx] + else: + return -1,-1 + def get_experiments(path): - experiments = [] - num_tot = 0 - num_finished = 0 - num_success = 0 - for name in sorted(os.listdir(path)): - if os.path.isdir(path + name): - print(path+name) - exp= HyperparamExperiment(path+name) - num_finished += 1 if exp.finished else 0 - num_success += 1 if exp.success else 0 - num_tot += 1 - experiments.append(exp) - print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) - return experiments + experiments = [] + num_tot = 0 + num_finished = 0 + num_success = 0 + for name in sorted(os.listdir(path)): + if os.path.isdir(path + name): + print(path+name) + exp= HyperparamExperiment(path+name) + num_finished += 1 if exp.finished else 0 + num_success += 1 if exp.success else 0 + num_tot += 1 + experiments.append(exp) + print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) + return experiments experiments = sorted(get_experiments(dir_path)) print(len(experiments)) best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) for e in experiments: - e.summary() + e.summary() print("Best experiment so far: \n") for e in np.array(experiments)[best_experiments][-3:]: - print(e) + print(e) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 031b8b27..7b71b4e5 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -30,146 +30,146 @@ dataset_test_path = "dataset_test.npz" class FeatureExtractor(object): - def __init__(self,loader,timesteps = 32): - self.loader = loader - self.timesteps = timesteps - self.positional_fit_order = 4 - self.num_positional_features = self.positional_fit_order + 1 + 3 - self.temporal_fit_order = 3 - self.num_temporal_features = self.temporal_fit_order + 1 + 3 - - - def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): - X = [] - Y = [] - Disr = [] - print("loading...") - pbar = Progbar(len(shot_list)) - - fn = partial(self.load_shot,sample_prob=sample_prob) - pool = mp.Pool() - print('loading data in parallel on {} processes'.format(pool._processes)) - for x,y,disr in pool.imap(fn,shot_list): - X.append(x) - Y.append(y) - Disr.append(disr) - pbar.add(1.0) - pool.close() - pool.join() - return X,Y,np.array(Disr) - - def get_save_prepath(self): - prepath = self.loader.conf['paths']['processed_prepath'] - use_signals = self.loader.conf['paths']['use_signals'] - save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) - return save_prepath - - def load_shot(self,shot,sample_prob=1.0): - save_prepath = self.get_save_prepath() - save_path = shot.get_save_path(save_prepath) - if os.path.isfile(save_path): - dat = np.load(save_path) - X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] - else: - use_signals = self.loader.conf['paths']['use_signals'] - prepath = self.loader.conf['paths']['processed_prepath'] - assert(shot.valid) - shot.restore(prepath) - if self.loader.normalizer is not None: - self.loader.normalizer.apply(shot) - else: - print('Warning, no normalization. Training data may be poorly conditioned') - # sig,res = self.get_signal_result_from_shot(shot) - disr = 1 if shot.is_disruptive else 0 - sig_sample = shot.signals_dict[use_signals[0]] - if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) - ttd_sample = shot.ttd - timesteps = self.timesteps - length = sig_sample.shape[0] - if length < timesteps: - print(ttd,shot,shot.number) - print("Shot must be at least as long as the RNN length.") - exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) - - X = [] - Y = [] - while(len(X) == 0): - for i in range(length-timesteps+1): - #if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) - X.append(x) - Y.append(y) - X = np.stack(X) - Y = np.stack(Y) - shot.make_light() - if not os.path.exists(save_prepath): - os.makedirs(save_prepath) - np.savez(save_path,X=X,Y=Y,disr=disr) - #print(X.shape,Y.shape) - if sample_prob < 1.0: - indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) - X = X[indices] - Y = Y[indices] - return X,Y,disr - - - def get_x_y(self,timestep,shot): - x = [] - use_signals = self.loader.conf['paths']['use_signals'] - for sig in use_signals: - x += [self.extract_features(timestep,shot,sig)] - # x = sig[timestep:timestep+timesteps,:] - x = np.concatenate(x,axis=0) - y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) - return x,y - - - def extract_features(self,timestep,shot,signal): - raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] - num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 - output_arr = np.empty((self.timesteps,num_positional_features)) - final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) - for t in range(self.timesteps): - output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) - for i in range(num_positional_features): - idx = i*self.num_temporal_features - final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) - return final_output_arr - - def extract_positional_features(self,arr): - num_channels = len(arr) - if num_channels > 1: - ret_arr = np.empty(self.num_positional_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:self.positional_fit_order+1] = coefficients - ret_arr[self.positional_fit_order+1] = mu - ret_arr[self.positional_fit_order+2] = std - ret_arr[self.positional_fit_order+3] = max_val - return ret_arr - else: - return arr - - def extract_temporal_features(self,arr): - ret_arr = np.empty(self.num_temporal_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:self.temporal_fit_order+1] = coefficients - ret_arr[self.temporal_fit_order+1] = mu - ret_arr[self.temporal_fit_order+2] = std - ret_arr[self.temporal_fit_order+3] = max_val - return ret_arr - - def prepend_timesteps(self,arr): - prepend = arr[0]*np.ones(self.timesteps-1) - return np.concatenate((prepend,arr)) + def __init__(self,loader,timesteps = 32): + self.loader = loader + self.timesteps = timesteps + self.positional_fit_order = 4 + self.num_positional_features = self.positional_fit_order + 1 + 3 + self.temporal_fit_order = 3 + self.num_temporal_features = self.temporal_fit_order + 1 + 3 + + + def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): + X = [] + Y = [] + Disr = [] + print("loading...") + pbar = Progbar(len(shot_list)) + + fn = partial(self.load_shot,sample_prob=sample_prob) + pool = mp.Pool() + print('loading data in parallel on {} processes'.format(pool._processes)) + for x,y,disr in pool.imap(fn,shot_list): + X.append(x) + Y.append(y) + Disr.append(disr) + pbar.add(1.0) + pool.close() + pool.join() + return X,Y,np.array(Disr) + + def get_save_prepath(self): + prepath = self.loader.conf['paths']['processed_prepath'] + use_signals = self.loader.conf['paths']['use_signals'] + save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) + return save_prepath + + def load_shot(self,shot,sample_prob=1.0): + save_prepath = self.get_save_prepath() + save_path = shot.get_save_path(save_prepath) + if os.path.isfile(save_path): + dat = np.load(save_path) + X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] + else: + use_signals = self.loader.conf['paths']['use_signals'] + prepath = self.loader.conf['paths']['processed_prepath'] + assert(shot.valid) + shot.restore(prepath) + if self.loader.normalizer is not None: + self.loader.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + # sig,res = self.get_signal_result_from_shot(shot) + disr = 1 if shot.is_disruptive else 0 + sig_sample = shot.signals_dict[use_signals[0]] + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + ttd_sample = shot.ttd + timesteps = self.timesteps + length = sig_sample.shape[0] + if length < timesteps: + print(ttd,shot,shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + while(len(X) == 0): + for i in range(length-timesteps+1): + #if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) + shot.make_light() + if not os.path.exists(save_prepath): + os.makedirs(save_prepath) + np.savez(save_path,X=X,Y=Y,disr=disr) + #print(X.shape,Y.shape) + if sample_prob < 1.0: + indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) + X = X[indices] + Y = Y[indices] + return X,Y,disr + + + def get_x_y(self,timestep,shot): + x = [] + use_signals = self.loader.conf['paths']['use_signals'] + for sig in use_signals: + x += [self.extract_features(timestep,shot,sig)] + # x = sig[timestep:timestep+timesteps,:] + x = np.concatenate(x,axis=0) + y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) + return x,y + + + def extract_features(self,timestep,shot,signal): + raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] + num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 + output_arr = np.empty((self.timesteps,num_positional_features)) + final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) + for t in range(self.timesteps): + output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) + for i in range(num_positional_features): + idx = i*self.num_temporal_features + final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) + return final_output_arr + + def extract_positional_features(self,arr): + num_channels = len(arr) + if num_channels > 1: + ret_arr = np.empty(self.num_positional_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.positional_fit_order+1] = coefficients + ret_arr[self.positional_fit_order+1] = mu + ret_arr[self.positional_fit_order+2] = std + ret_arr[self.positional_fit_order+3] = max_val + return ret_arr + else: + return arr + + def extract_temporal_features(self,arr): + ret_arr = np.empty(self.num_temporal_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.temporal_fit_order+1] = coefficients + ret_arr[self.temporal_fit_order+1] = mu + ret_arr[self.temporal_fit_order+2] = std + ret_arr[self.temporal_fit_order+3] = max_val + return ret_arr + + def prepend_timesteps(self,arr): + prepend = arr[0]*np.ones(self.timesteps-1) + return np.concatenate((prepend,arr)) from sklearn import svm from sklearn.ensemble import RandomForestClassifier @@ -178,160 +178,160 @@ def prepend_timesteps(self,arr): import keras.callbacks as cbks def build_callbacks(self,conf,callbacks_list): - ''' - The purpose of the method is to set up logging and history. It is based on Keras Callbacks - https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py + ''' + The purpose of the method is to set up logging and history. It is based on Keras Callbacks + https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py - Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. - Other possible callbacks to add in future: RemoteMonitor, LearningRateScheduler + Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. + Other possible callbacks to add in future: RemoteMonitor, LearningRateScheduler - Argument list: - - conf: There is a "callbacks" section in conf.yaml file. Relevant parameters are: - list: Parameter specifying additional callbacks, read in the driver script and passed as an argument of type list (see next arg) - metrics: List of quantities monitored during training and validation - mode: one of {auto, min, max}. The decision to overwrite the current save file is made based on either the maximization or the minimization of the monitored quantity. For val_acc, this should be max, for val_loss this should be min, etc. In auto mode, the direction is automatically inferred from the name of the monitored quantity. - monitor: Quantity used for early stopping, has to be from the list of metrics - patience: Number of epochs used to decide on whether to apply early stopping or continue training - - callbacks_list: uses callbacks.list configuration parameter, specifies the list of additional callbacks - Returns: modified list of callbacks - ''' + Argument list: + - conf: There is a "callbacks" section in conf.yaml file. Relevant parameters are: + list: Parameter specifying additional callbacks, read in the driver script and passed as an argument of type list (see next arg) + metrics: List of quantities monitored during training and validation + mode: one of {auto, min, max}. The decision to overwrite the current save file is made based on either the maximization or the minimization of the monitored quantity. For val_acc, this should be max, for val_loss this should be min, etc. In auto mode, the direction is automatically inferred from the name of the monitored quantity. + monitor: Quantity used for early stopping, has to be from the list of metrics + patience: Number of epochs used to decide on whether to apply early stopping or continue training + - callbacks_list: uses callbacks.list configuration parameter, specifies the list of additional callbacks + Returns: modified list of callbacks + ''' - mode = conf['callbacks']['mode'] - monitor = conf['callbacks']['monitor'] - patience = conf['callbacks']['patience'] - csvlog_save_path = conf['paths']['csvlog_save_path'] - #CSV callback is on by default - if not os.path.exists(csvlog_save_path): - os.makedirs(csvlog_save_path) + mode = conf['callbacks']['mode'] + monitor = conf['callbacks']['monitor'] + patience = conf['callbacks']['patience'] + csvlog_save_path = conf['paths']['csvlog_save_path'] + #CSV callback is on by default + if not os.path.exists(csvlog_save_path): + os.makedirs(csvlog_save_path) - callbacks_list = conf['callbacks']['list'] + callbacks_list = conf['callbacks']['list'] - callbacks = [cbks.BaseLogger()] - callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(csvlog_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] + callbacks = [cbks.BaseLogger()] + callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(csvlog_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] - return cbks.CallbackList(callbacks) + return cbks.CallbackList(callbacks) def train(conf,shot_list_train,shot_list_validate,loader): - np.random.seed(1) - - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - - sample_prob = conf['data']['shallow_sample_prob'] - feature_extractor = FeatureExtractor(loader) - shot_list_train = shot_list_train.random_sublist(debug_use_shots) - X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = sample_prob) - Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = sample_prob) - X = np.concatenate(X,axis=0) - Y = np.concatenate(Y,axis=0) - Xv = np.concatenate(Xv,axis=0) - Yv = np.concatenate(Yv,axis=0) - - print("Total data: {} samples, {} positive".format(1.0/sample_prob*len(X),1.0/sample_prob*np.sum(Y > 0))) - #max_samples = 100000 - #num_samples = min(max_samples,len(Y)) - #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) - #X = X[indices] - #Y = Y[indices] - - print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) - callbacks = build_callbacks(conf,callbacks_list) - callback_metrics = conf['callbacks']['metrics'] - callbacks.set_params({ - 'metrics': callback_metrics, - }) - callbacks.on_train_begin() - callbacks.on_epoch_begin(0) - - save_prepath = feature_extractor.get_save_prepath() - model_path = save_prepath + model_filename - if not os.path.isfile(model_path): - - start_time = time.time() - model_conf = conf['model']['shallow_model'] - if model_conf['type'] == "svm": - model = svm.SVC(probability=True, - C=model_conf["C"], - kernel=model_conf["kernel"]) - elif model_conf['type'] == "random_forest": - model = RandomForestClassifier(n_estimators=model_conf["n_estimators"], - max_depth=model_conf["max_depth"],n_jobs=-1) - else: - print("Unkown model type, exiting.") - exit(1) - model.fit(X,Y) - joblib.dump(model,model_path) - print("Fit model in {} seconds".format(time.time()-start_time)) - else: - model = joblib.load(model_path) - print("model exists.") - - - Y_pred = model.predict(X) - print("Train") - print(classification_report(Y,Y_pred)) - Y_predv = model.predict(Xv) - print("Validate") - print(classification_report(Yv,Y_predv)) - #print(confusion_matrix(Y,Y_pred)) + np.random.seed(1) + + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + + sample_prob = conf['data']['shallow_sample_prob'] + feature_extractor = FeatureExtractor(loader) + shot_list_train = shot_list_train.random_sublist(debug_use_shots) + X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = sample_prob) + Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = sample_prob) + X = np.concatenate(X,axis=0) + Y = np.concatenate(Y,axis=0) + Xv = np.concatenate(Xv,axis=0) + Yv = np.concatenate(Yv,axis=0) + + print("Total data: {} samples, {} positive".format(1.0/sample_prob*len(X),1.0/sample_prob*np.sum(Y > 0))) + #max_samples = 100000 + #num_samples = min(max_samples,len(Y)) + #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) + #X = X[indices] + #Y = Y[indices] + + print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) + callbacks = build_callbacks(conf,callbacks_list) + callback_metrics = conf['callbacks']['metrics'] + callbacks.set_params({ + 'metrics': callback_metrics, + }) + callbacks.on_train_begin() + callbacks.on_epoch_begin(0) + + save_prepath = feature_extractor.get_save_prepath() + model_path = save_prepath + model_filename + if not os.path.isfile(model_path): + + start_time = time.time() + model_conf = conf['model']['shallow_model'] + if model_conf['type'] == "svm": + model = svm.SVC(probability=True, + C=model_conf["C"], + kernel=model_conf["kernel"]) + elif model_conf['type'] == "random_forest": + model = RandomForestClassifier(n_estimators=model_conf["n_estimators"], + max_depth=model_conf["max_depth"],n_jobs=-1) + else: + print("Unkown model type, exiting.") + exit(1) + model.fit(X,Y) + joblib.dump(model,model_path) + print("Fit model in {} seconds".format(time.time()-start_time)) + else: + model = joblib.load(model_path) + print("model exists.") + + + Y_pred = model.predict(X) + print("Train") + print(classification_report(Y,Y_pred)) + Y_predv = model.predict(Xv) + print("Validate") + print(classification_report(Yv,Y_predv)) + #print(confusion_matrix(Y,Y_pred)) _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) - _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) + _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) - epoch_logs = {} - epoch_logs['val_roc'] = roc_area - epoch_logs['val_loss'] = loss - epoch_logs['train_roc'] = roc_area_train - epoch_logs['train_loss'] = loss_train - callbacks.on_epoch_end(0, epoch_logs) + epoch_logs = {} + epoch_logs['val_roc'] = roc_area + epoch_logs['val_loss'] = loss + epoch_logs['train_roc'] = roc_area_train + epoch_logs['train_loss'] = loss_train + callbacks.on_epoch_end(0, epoch_logs) - print('...done') + print('...done') def make_predictions(conf,shot_list,loader): - feature_extractor = FeatureExtractor(loader) - save_prepath = feature_extractor.get_save_prepath() - model_path = save_prepath + model_filename - model = joblib.load(model_path) - #shot_list = shot_list.random_sublist(10) - - y_prime = [] - y_gold = [] - disruptive = [] - - pbar = Progbar(len(shot_list)) - fn = partial(predict_single_shot,model=model,feature_extractor=feature_extractor) - pool = mp.Pool() - print('predicting in parallel on {} processes'.format(pool._processes)) - #for (y_p,y,disr) in map(fn,shot_list): - for (y_p,y,disr) in pool.imap(fn,shot_list): - #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) - y_prime += [np.expand_dims(y_p,axis=1)] - y_gold += [np.expand_dims(y,axis=1)] - disruptive += [disr] - pbar.add(1.0) - - pool.close() - pool.join() - return y_prime,y_gold,disruptive + feature_extractor = FeatureExtractor(loader) + save_prepath = feature_extractor.get_save_prepath() + model_path = save_prepath + model_filename + model = joblib.load(model_path) + #shot_list = shot_list.random_sublist(10) + + y_prime = [] + y_gold = [] + disruptive = [] + + pbar = Progbar(len(shot_list)) + fn = partial(predict_single_shot,model=model,feature_extractor=feature_extractor) + pool = mp.Pool() + print('predicting in parallel on {} processes'.format(pool._processes)) + #for (y_p,y,disr) in map(fn,shot_list): + for (y_p,y,disr) in pool.imap(fn,shot_list): + #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) + y_prime += [np.expand_dims(y_p,axis=1)] + y_gold += [np.expand_dims(y,axis=1)] + disruptive += [disr] + pbar.add(1.0) + + pool.close() + pool.join() + return y_prime,y_gold,disruptive def predict_single_shot(shot,model,feature_extractor): - X,y,disr = feature_extractor.load_shot(shot,sample_prob=1.0) - y_p = model.predict_proba(X)[:,1] - #print(y) - #print(y_p) - y = feature_extractor.prepend_timesteps(y) - y_p = feature_extractor.prepend_timesteps(y_p) - return y_p,y,disr + X,y,disr = feature_extractor.load_shot(shot,sample_prob=1.0) + y_p = model.predict_proba(X)[:,1] + #print(y) + #print(y_p) + y = feature_extractor.prepend_timesteps(y) + y_p = feature_extractor.prepend_timesteps(y_p) + return y_p,y,disr def make_predictions_and_evaluate_gpu(conf,shot_list,loader): - y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader) - analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader) + analyzer = PerformanceAnalyzer(conf=conf) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + return y_prime,y_gold,disruptive,roc_area,loss diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index 63c8c6f4..dd641d10 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -20,85 +20,85 @@ #that is less than or equal than the time point in question #and interpolates to there. def time_sensitive_interp(x,t,t_new): - indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1) - return x[indices] + indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1) + return x[indices] def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): - order = np.argsort(t) - t = t[order] - sig = sig[order,:] - sig_width = sig.shape[1] - tt = np.arange(tmin,tmax,dt,dtype=precision_str) - sig_interp = np.zeros((len(tt),sig_width),dtype=precision_str) - for i in range(sig_width): - sig_interp[:,i] = time_sensitive_interp(sig[:,i],t,tt) #make sure to not use future information - # f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) - # sig_interp[:,i] = f(tt) - if(np.any(np.isnan(sig_interp))): - print("signals contains nan") - if(np.any(t[1:] - t[:-1] <= 0)): - print("non increasing") - idx = np.where(t[1:] - t[:-1] <= 0)[0][0] - print(t[idx-10:idx+10]) - - return tt,sig_interp + order = np.argsort(t) + t = t[order] + sig = sig[order,:] + sig_width = sig.shape[1] + tt = np.arange(tmin,tmax,dt,dtype=precision_str) + sig_interp = np.zeros((len(tt),sig_width),dtype=precision_str) + for i in range(sig_width): + sig_interp[:,i] = time_sensitive_interp(sig[:,i],t,tt) #make sure to not use future information + # f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) + # sig_interp[:,i] = f(tt) + if(np.any(np.isnan(sig_interp))): + print("signals contains nan") + if(np.any(t[1:] - t[:-1] <= 0)): + print("non increasing") + idx = np.where(t[1:] - t[:-1] <= 0)[0][0] + print(t[idx-10:idx+10]) + + return tt,sig_interp def cut_signal(t,sig,tmin,tmax): - mask = np.logical_and(t >= tmin, t <= tmax) - return t[mask],sig[mask,:] + mask = np.logical_and(t >= tmin, t <= tmax) + return t[mask],sig[mask,:] def cut_and_resample_signal(t,sig,tmin,tmax,dt,precision_str): - t,sig = cut_signal(t,sig,tmin,tmax) - return resample_signal(t,sig,tmin,tmax,dt,precision_str) + t,sig = cut_signal(t,sig,tmin,tmax) + return resample_signal(t,sig,tmin,tmax,dt,precision_str) def get_individual_shot_file(prepath,shot_num,ext='.txt'): - return prepath + str(shot_num) + ext + return prepath + str(shot_num) + ext def append_to_filename(path,to_append): - ending_idx = path.rfind('.') - new_path = path[:ending_idx] + to_append + path[ending_idx:] - return new_path + ending_idx = path.rfind('.') + new_path = path[:ending_idx] + to_append + path[ending_idx:] + return new_path def train_test_split(x,frac,do_shuffle=False): - if not isinstance(x,np.ndarray): - return train_test_split_robust(x,frac,do_shuffle) - mask = np.array(range(len(x))) < frac*len(x) - if do_shuffle: - np.random.shuffle(mask) - return x[mask],x[~mask] + if not isinstance(x,np.ndarray): + return train_test_split_robust(x,frac,do_shuffle) + mask = np.array(range(len(x))) < frac*len(x) + if do_shuffle: + np.random.shuffle(mask) + return x[mask],x[~mask] def train_test_split_robust(x,frac,do_shuffle=False): - mask = np.array(range(len(x))) < frac*len(x) - if do_shuffle: - np.random.shuffle(mask) - train = [] - test = [] - for (i,_x) in enumerate(x): - if mask[i]: - train.append(_x) - else: - test.append(_x) - return train,test + mask = np.array(range(len(x))) < frac*len(x) + if do_shuffle: + np.random.shuffle(mask) + train = [] + test = [] + for (i,_x) in enumerate(x): + if mask[i]: + train.append(_x) + else: + test.append(_x) + return train,test def train_test_split_all(x,frac,do_shuffle=True): - groups = [] - length = len(x[0]) - mask = np.array(range(length)) < frac*length - if do_shuffle: - np.random.shuffle(mask) - for item in x: - groups.append((item[mask],item[~mask])) - return groups + groups = [] + length = len(x[0]) + mask = np.array(range(length)) < frac*length + if do_shuffle: + np.random.shuffle(mask) + for item in x: + groups.append((item[mask],item[~mask])) + return groups def concatenate_sublists(superlist): - return list(itertools.chain.from_iterable(superlist)) + return list(itertools.chain.from_iterable(superlist)) def get_signal_slices(signals_superlist): - indices_superlist = [] - signals_so_far = 0 - for sublist in signals_superlist: - indices_sublist = signals_so_far + np.array(range(len(sublist))) - signals_so_far += len(sublist) - indices_superlist.append(indices_sublist) - return indices_superlist + indices_superlist = [] + signals_so_far = 0 + for sublist in signals_superlist: + indices_sublist = signals_so_far + np.array(range(len(sublist))) + signals_so_far += len(sublist) + indices_superlist.append(indices_sublist) + return indices_superlist From cfb7f75358a7ea80c348fb9865e5861f8c40570b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:24:37 -0400 Subject: [PATCH 232/744] tabs to spaces --- plasma/models/shallow_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 7b71b4e5..07de887e 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -277,7 +277,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): print(classification_report(Yv,Y_predv)) #print(confusion_matrix(Y,Y_pred)) _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) - _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) + _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) epoch_logs = {} epoch_logs['val_roc'] = roc_area From 20ac7849bd0dbc019cd020d680dcfe02136ce75c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:30:29 -0400 Subject: [PATCH 233/744] tabs to spaces --- plasma/models/shallow_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 07de887e..4d72a11a 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -177,7 +177,7 @@ def prepend_timesteps(self,arr): from sklearn.metrics import accuracy_score,auc,classification_report,confusion_matrix import keras.callbacks as cbks -def build_callbacks(self,conf,callbacks_list): +def build_callbacks(self,conf): ''' The purpose of the method is to set up logging and history. It is based on Keras Callbacks https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py @@ -237,7 +237,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): #Y = Y[indices] print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) - callbacks = build_callbacks(conf,callbacks_list) + callbacks = build_callbacks(conf) callback_metrics = conf['callbacks']['metrics'] callbacks.set_params({ 'metrics': callback_metrics, From 94609653939e44f361cb28512a9635d786d1443b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:32:41 -0400 Subject: [PATCH 234/744] callbacks_list not defined --- plasma/models/shallow_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 4d72a11a..9a9489b2 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -177,7 +177,7 @@ def prepend_timesteps(self,arr): from sklearn.metrics import accuracy_score,auc,classification_report,confusion_matrix import keras.callbacks as cbks -def build_callbacks(self,conf): +def build_callbacks(conf): ''' The purpose of the method is to set up logging and history. It is based on Keras Callbacks https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py From 77feac1d2d777bd357fb14c788ca9f893ec4ace1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:34:39 -0400 Subject: [PATCH 235/744] callbacks_list not defined --- plasma/models/shallow_runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 9a9489b2..39a49e46 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -11,6 +11,7 @@ #from hyperas.distributions import conditional import time +import datetime import sys import os from functools import partial From 0d3510869e218f29a8605447cba269c2f43cfdcf Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:38:58 -0400 Subject: [PATCH 236/744] callbacks_list not defined --- plasma/models/shallow_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 39a49e46..73afb9fb 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -277,8 +277,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): print("Validate") print(classification_report(Yv,Y_predv)) #print(confusion_matrix(Y,Y_pred)) - _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) - _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) + _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) + _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) epoch_logs = {} epoch_logs['val_roc'] = roc_area From 1880ec50fa344d5aa114d4f3bd69a7994e8f5712 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:41:49 -0400 Subject: [PATCH 237/744] callbacks_list not defined --- plasma/models/shallow_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 73afb9fb..2ed2add7 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -277,8 +277,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): print("Validate") print(classification_report(Yv,Y_predv)) #print(confusion_matrix(Y,Y_pred)) - _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) - _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) + _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) + _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) epoch_logs = {} epoch_logs['val_roc'] = roc_area From 99516847ad1e072440ad2313464c66b05d0e92e7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:46:14 -0400 Subject: [PATCH 238/744] callbacks_list not defined --- examples/conf.yaml | 3 ++- plasma/models/shallow_runner.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 0c1507d5..d427fbd5 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -44,7 +44,7 @@ data: window_size: 10 #TODO optimize normalizer: 'var' - shallow_sample_prob: 0.1 #the fraction of samples with which to train the shallow model + shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model floatx: 'float64' model: @@ -55,6 +55,7 @@ model: max_depth: 20 #for random forest C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm + skip_train: False #should a finished model be loaded if available #length of LSTM memory pred_length: 200 pred_batch_size: 128 diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 2ed2add7..49bc5c2c 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -248,10 +248,10 @@ def train(conf,shot_list_train,shot_list_validate,loader): save_prepath = feature_extractor.get_save_prepath() model_path = save_prepath + model_filename - if not os.path.isfile(model_path): + model_conf = conf['model']['shallow_model'] + if not model_conf['skip_train'] or not os.path.isfile(model_path): start_time = time.time() - model_conf = conf['model']['shallow_model'] if model_conf['type'] == "svm": model = svm.SVC(probability=True, C=model_conf["C"], From 3939eebd03e9bac6a90ad5544319a0e4ea63b020 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 19:46:29 -0400 Subject: [PATCH 239/744] local conf --- examples/conf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 815b0b58..828e9149 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -44,7 +44,7 @@ data: window_size: 10 #TODO optimize normalizer: 'var' - shallow_sample_prob: 0.1 #the fraction of samples with which to train the shallow model + shallow_sample_prob: 0.0005 #the fraction of samples with which to train the shallow model floatx: 'float32' model: From 545b0ecd837865bacd793aadb034fbbbcda04fad Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 21:14:50 -0400 Subject: [PATCH 240/744] added option to equalize classes --- examples/conf.yaml | 5 +- plasma/models/custom_loss.py | 64 +++++++ plasma/models/loader.py | 5 +- plasma/models/shallow_runner.py | 316 +++++++++++++++++--------------- plasma/models/test.py | 65 +++++++ plasma/primitives/shots.py | 39 +++- 6 files changed, 341 insertions(+), 153 deletions(-) create mode 100644 plasma/models/custom_loss.py create mode 100644 plasma/models/test.py diff --git a/examples/conf.yaml b/examples/conf.yaml index d427fbd5..c3f4ea67 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -44,12 +44,15 @@ data: window_size: 10 #TODO optimize normalizer: 'var' - shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model + equalize_classes: False + # shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model + shallow_num_samples: 10000 #the number of samples to use for training floatx: 'float64' model: shallow: False shallow_model: + num_samples: 10000 type: "svm" #"random_forest" n_estimators: 50 #for random forest max_depth: 20 #for random forest diff --git a/plasma/models/custom_loss.py b/plasma/models/custom_loss.py new file mode 100644 index 00000000..2146a7b3 --- /dev/null +++ b/plasma/models/custom_loss.py @@ -0,0 +1,64 @@ +import numpy as np + +from keras import objectives +from keras import backend as K +from keras.losses import hinge, squared_hinge + +_EPSILON = K.epsilon() + +def _loss_tensor(y_true, y_pred): + max_val = K.max(y_pred,axis=-2) #temporal axis! + max_val = K.repeat(max_val,K.shape(y_pred)[-2]) + print K.eval(max_val) + mask = K.cast(K.equal(max_val,y_pred),K.floatx()) + y_pred = mask * y_pred + (1-mask) * y_true + return squared_hinge(y_true,y_pred) + +def _loss_np(y_true, y_pred): + print(y_pred.shape) + max_val = np.max(y_pred,axis=-2) #temporal axis! + max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) + max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) + print(max_val.shape) + print(max_val) + mask = np.equal(max_val,y_pred) + mask = mask.astype(np.float32) + y_pred = mask * y_pred + (1-mask) * y_true + return np.mean(np.square(np.maximum(1. - y_true * y_pred, 0.)), axis=-1) + + +def check_loss(_shape): + if _shape == '2d': + shape = (2, 3) + elif _shape == '3d': + shape = (2, 3, 1) + elif _shape == '4d': + shape = (8, 5, 6, 7) + elif _shape == '5d': + shape = (9, 8, 5, 6, 7) + + y_a = 1.0*np.ones(shape) + y_b = 0.5+np.random.random(shape) + + print(y_a) + print(y_b) + out1 = K.eval(_loss_tensor(K.variable(y_a), K.variable(y_b))) + print(out1) + out2 = _loss_np(y_a, y_b) + print(out2) + + assert out1.shape == out2.shape + assert out1.shape == shape[:-1] + print np.linalg.norm(out1) + print np.linalg.norm(out2) + print np.linalg.norm(out1-out2) + + +def test_loss(): + shape_list = ['3d']#, '3d', '4d', '5d'] + for _shape in shape_list: + check_loss(_shape) + print '======================' + +if __name__ == '__main__': + test_loss() \ No newline at end of file diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 75b1caad..90288726 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -161,7 +161,10 @@ def training_batch_generator_partial_reset(self,shot_list): shot_list.shuffle() for i in range(len(shot_list)): if self.conf['training']['ranking_difficulty_fac'] == 1.0: - shot = shot_list.shots[i] + if self.conf['data']['equalize_classes']: + shot = shot_list.sample_equal_classes() + else: + shot = shot_list.shots[i] else: #draw the shot weighted shot = shot_list.sample_weighted() while not np.any(end_indices == 0): diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 49bc5c2c..ef3e100b 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -31,146 +31,165 @@ dataset_test_path = "dataset_test.npz" class FeatureExtractor(object): - def __init__(self,loader,timesteps = 32): - self.loader = loader - self.timesteps = timesteps - self.positional_fit_order = 4 - self.num_positional_features = self.positional_fit_order + 1 + 3 - self.temporal_fit_order = 3 - self.num_temporal_features = self.temporal_fit_order + 1 + 3 - - - def load_shots(self,shot_list,sample_prob = 1.0,as_list=False): - X = [] - Y = [] - Disr = [] - print("loading...") - pbar = Progbar(len(shot_list)) - - fn = partial(self.load_shot,sample_prob=sample_prob) - pool = mp.Pool() - print('loading data in parallel on {} processes'.format(pool._processes)) - for x,y,disr in pool.imap(fn,shot_list): - X.append(x) - Y.append(y) - Disr.append(disr) - pbar.add(1.0) - pool.close() - pool.join() - return X,Y,np.array(Disr) - - def get_save_prepath(self): - prepath = self.loader.conf['paths']['processed_prepath'] - use_signals = self.loader.conf['paths']['use_signals'] - save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) - return save_prepath - - def load_shot(self,shot,sample_prob=1.0): - save_prepath = self.get_save_prepath() - save_path = shot.get_save_path(save_prepath) - if os.path.isfile(save_path): - dat = np.load(save_path) - X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] - else: - use_signals = self.loader.conf['paths']['use_signals'] - prepath = self.loader.conf['paths']['processed_prepath'] - assert(shot.valid) - shot.restore(prepath) - if self.loader.normalizer is not None: - self.loader.normalizer.apply(shot) - else: - print('Warning, no normalization. Training data may be poorly conditioned') - # sig,res = self.get_signal_result_from_shot(shot) - disr = 1 if shot.is_disruptive else 0 - sig_sample = shot.signals_dict[use_signals[0]] - if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) - ttd_sample = shot.ttd - timesteps = self.timesteps - length = sig_sample.shape[0] - if length < timesteps: - print(ttd,shot,shot.number) - print("Shot must be at least as long as the RNN length.") - exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) - - X = [] - Y = [] - while(len(X) == 0): - for i in range(length-timesteps+1): - #if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) - X.append(x) - Y.append(y) - X = np.stack(X) - Y = np.stack(Y) - shot.make_light() - if not os.path.exists(save_prepath): - os.makedirs(save_prepath) - np.savez(save_path,X=X,Y=Y,disr=disr) - #print(X.shape,Y.shape) - if sample_prob < 1.0: - indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) - X = X[indices] - Y = Y[indices] - return X,Y,disr - - - def get_x_y(self,timestep,shot): - x = [] - use_signals = self.loader.conf['paths']['use_signals'] - for sig in use_signals: - x += [self.extract_features(timestep,shot,sig)] - # x = sig[timestep:timestep+timesteps,:] - x = np.concatenate(x,axis=0) - y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) - return x,y - - - def extract_features(self,timestep,shot,signal): - raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] - num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 - output_arr = np.empty((self.timesteps,num_positional_features)) - final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) - for t in range(self.timesteps): - output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) - for i in range(num_positional_features): - idx = i*self.num_temporal_features - final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) - return final_output_arr - - def extract_positional_features(self,arr): - num_channels = len(arr) - if num_channels > 1: - ret_arr = np.empty(self.num_positional_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:self.positional_fit_order+1] = coefficients - ret_arr[self.positional_fit_order+1] = mu - ret_arr[self.positional_fit_order+2] = std - ret_arr[self.positional_fit_order+3] = max_val - return ret_arr - else: - return arr - - def extract_temporal_features(self,arr): - ret_arr = np.empty(self.num_temporal_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) - mu = np.mean(arr) - std = np.std(arr) - max_val = np.max(arr) - ret_arr[:self.temporal_fit_order+1] = coefficients - ret_arr[self.temporal_fit_order+1] = mu - ret_arr[self.temporal_fit_order+2] = std - ret_arr[self.temporal_fit_order+3] = max_val - return ret_arr - - def prepend_timesteps(self,arr): - prepend = arr[0]*np.ones(self.timesteps-1) - return np.concatenate((prepend,arr)) + def __init__(self,loader,timesteps = 32): + self.loader = loader + self.timesteps = timesteps + self.positional_fit_order = 4 + self.num_positional_features = self.positional_fit_order + 1 + 3 + self.temporal_fit_order = 3 + self.num_temporal_features = self.temporal_fit_order + 1 + 3 + + def get_sample_probs(self,shot_list,num_samples): + print("Calculating number of timesteps") + timesteps_total,timesteps_d,timesteps_nd = shot_list.num_timesteps() + print("Total data: {} time samples, {} disruptive".format(timesteps_total,timesteps_d/timesteps_total)) + if self.loader.conf['data']['equalize_classes']: + sample_prob_d = np.minimum(1.0,timesteps_nd/timesteps_d) + sample_prob_nd = np.minimum(1.0,timesteps_d/timesteps_nd) + timesteps_total = sample_prob_d*timesteps_d+sample_prob_nd*timesteps_nd + sample_prob = np.minimum(1.0,num_samples/timesteps_total) + sample_prob_d *= sample_prob + sample_prob_nd *= sample_prob + else: + sample_prob_d = np.minimum(1.0,num_samples/timesteps_total) + sample_prob_nd = sample_prob_d + return sample_prob_d,sample_prob_nd + + def load_shots(self,shot_list,as_list=False,num_samples=np.Inf): + X = [] + Y = [] + Disr = [] + print("loading...") + pbar = Progbar(len(shot_list)) + + sample_prob_d,sample_prob_nd = self.get_sample_probs(shot_list,num_samples) + fn = partial(self.load_shot,sample_prob_d=sample_prob_d,sample_prob_nd=sample_prob_nd) + pool = mp.Pool() + print('loading data in parallel on {} processes'.format(pool._processes)) + for x,y,disr in pool.imap(fn,shot_list): + X.append(x) + Y.append(y) + Disr.append(disr) + pbar.add(1.0) + pool.close() + pool.join() + return X,Y,np.array(Disr) + + def get_save_prepath(self): + prepath = self.loader.conf['paths']['processed_prepath'] + use_signals = self.loader.conf['paths']['use_signals'] + save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) + return save_prepath + + def load_shot(self,shot,sample_prob_d=1.0,sample_prob_nd=1.0): + save_prepath = self.get_save_prepath() + save_path = shot.get_save_path(save_prepath) + if os.path.isfile(save_path): + dat = np.load(save_path) + X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] + else: + use_signals = self.loader.conf['paths']['use_signals'] + prepath = self.loader.conf['paths']['processed_prepath'] + assert(shot.valid) + shot.restore(prepath) + if self.loader.normalizer is not None: + self.loader.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + # sig,res = self.get_signal_result_from_shot(shot) + disr = 1 if shot.is_disruptive else 0 + sig_sample = shot.signals_dict[use_signals[0]] + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + ttd_sample = shot.ttd + timesteps = self.timesteps + length = sig_sample.shape[0] + if length < timesteps: + print(ttd,shot,shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + while(len(X) == 0): + for i in range(length-timesteps+1): + #if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) + shot.make_light() + if not os.path.exists(save_prepath): + os.makedirs(save_prepath) + np.savez(save_path,X=X,Y=Y,disr=disr) + #print(X.shape,Y.shape) + sample_prob = sample_prob_nd + if disr: + sample_prob = sample_prob_d + if sample_prob < 1.0: + indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) + X = X[indices] + Y = Y[indices] + return X,Y,disr + + + def get_x_y(self,timestep,shot): + x = [] + use_signals = self.loader.conf['paths']['use_signals'] + for sig in use_signals: + x += [self.extract_features(timestep,shot,sig)] + # x = sig[timestep:timestep+timesteps,:] + x = np.concatenate(x,axis=0) + y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) + return x,y + + + def extract_features(self,timestep,shot,signal): + raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] + num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 + output_arr = np.empty((self.timesteps,num_positional_features)) + final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) + for t in range(self.timesteps): + output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) + for i in range(num_positional_features): + idx = i*self.num_temporal_features + final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) + return final_output_arr + + def extract_positional_features(self,arr): + num_channels = len(arr) + if num_channels > 1: + ret_arr = np.empty(self.num_positional_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.positional_fit_order+1] = coefficients + ret_arr[self.positional_fit_order+1] = mu + ret_arr[self.positional_fit_order+2] = std + ret_arr[self.positional_fit_order+3] = max_val + return ret_arr + else: + return arr + + def extract_temporal_features(self,arr): + ret_arr = np.empty(self.num_temporal_features) + coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) + mu = np.mean(arr) + std = np.std(arr) + max_val = np.max(arr) + ret_arr[:self.temporal_fit_order+1] = coefficients + ret_arr[self.temporal_fit_order+1] = mu + ret_arr[self.temporal_fit_order+2] = std + ret_arr[self.temporal_fit_order+3] = max_val + return ret_arr + + def prepend_timesteps(self,arr): + prepend = arr[0]*np.ones(self.timesteps-1) + return np.concatenate((prepend,arr)) from sklearn import svm from sklearn.ensemble import RandomForestClassifier @@ -220,17 +239,16 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - sample_prob = conf['data']['shallow_sample_prob'] + num_samples = conf['data']['shallow_num_samples'] feature_extractor = FeatureExtractor(loader) shot_list_train = shot_list_train.random_sublist(debug_use_shots) - X,Y,_ = feature_extractor.load_shots(shot_list_train,sample_prob = sample_prob) - Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,sample_prob = sample_prob) + X,Y,_ = feature_extractor.load_shots(shot_list_train,num_samples = num_samples) + Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,num_samples = num_samples) X = np.concatenate(X,axis=0) Y = np.concatenate(Y,axis=0) Xv = np.concatenate(Xv,axis=0) Yv = np.concatenate(Yv,axis=0) - print("Total data: {} samples, {} positive".format(1.0/sample_prob*len(X),1.0/sample_prob*np.sum(Y > 0))) #max_samples = 100000 #num_samples = min(max_samples,len(Y)) #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) @@ -308,11 +326,11 @@ def make_predictions(conf,shot_list,loader): print('predicting in parallel on {} processes'.format(pool._processes)) #for (y_p,y,disr) in map(fn,shot_list): for (y_p,y,disr) in pool.imap(fn,shot_list): - #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) - y_prime += [np.expand_dims(y_p,axis=1)] - y_gold += [np.expand_dims(y,axis=1)] - disruptive += [disr] - pbar.add(1.0) + #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) + y_prime += [np.expand_dims(y_p,axis=1)] + y_gold += [np.expand_dims(y,axis=1)] + disruptive += [disr] + pbar.add(1.0) pool.close() pool.join() diff --git a/plasma/models/test.py b/plasma/models/test.py new file mode 100644 index 00000000..544ac257 --- /dev/null +++ b/plasma/models/test.py @@ -0,0 +1,65 @@ +import keras +from keras.models import Sequential, Model +from keras.layers import Input +from keras.layers.core import Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute +from keras.layers.recurrent import LSTM, SimpleRNN +from keras.layers.convolutional import Convolution1D +from keras.layers.pooling import MaxPooling1D +from keras.utils.data_utils import get_file +from keras.layers.wrappers import TimeDistributed +from keras.layers.merge import Concatenate +from keras.callbacks import Callback +from keras.optimizers import * +from keras.regularizers import l1,l2,l1_l2 + + +import keras.backend as K + +import dill +import re +import os,sys +import numpy as np +from copy import deepcopy + +x = np.array(range(8)) +num_signals = len(x) +x = np.atleast_2d(x) +x = np.reshape(x,(1,num_signals)) +print(x.shape) +print(x) + +indices_0d = np.array([0,1]) +indices_1d = np.array([2,3,4,5,6,7]) + +num_1D = 2 + +pre_rnn_input = Input(shape=(num_signals,)) +pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) +pre_rnn_0D = Lambda(lambda x: x[:,:len(indices_0d)],output_shape=(len(indices_0d),))(pre_rnn_input)# slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) +pre_rnn_1D = Reshape((num_1D,len(indices_1d)/num_1D)) (pre_rnn_1D) +pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) + +# for i in range(model_conf['num_conv_layers']): +# pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) +# pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) +# pre_rnn_1D = Flatten() (pre_rnn_1D) +# pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) + +model = Model(inputs = pre_rnn_input,outputs=pre_rnn_1D) +# x_input = Input(batch_shape = batch_input_shape) +# x_in = TimeDistributed(pre_rnn_model) (x_input) + +# if return_sequences: + #x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) + # x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) +# else: + # x_out = Dense(1,activation=output_activation) (x_in) +model.compile(loss='mse',optimizer='sgd') + +y = model.predict(x) +print(model.layers) +print(x) +print(y) +print(y.shape) +print(y[0,:,0]) +#bug with tensorflow/Keras \ No newline at end of file diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 15eb1595..4efc177b 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -162,12 +162,41 @@ def set_weights(self,weights): for (i,w) in enumerate(weights): self.shots[i].weight = w - def sample_weighted(self): - p = np.array([shot.weight for shot in self.shots]) + def sample_weighted_given_arr(self,p): p = p/np.sum(p) idx = np.random.choice(range(len(self.shots)),p=p) return self.shots[idx] + def sample_weighted(self): + p = np.array([shot.weight for shot in self.shots]) + return self.sample_weighted_given_arr(p) + + def sample_equal_classes(self): + weights_d,weights_nd = self.get_weights_d_nd() + p = np.array([weights_d for shot in self.shots if shot.is_disruptive_shot() else weights_nd]) + return self.sample_weighted_given_arr(p) + + def get_weights_d_nd(self): + num_total = len(self) + num_d = self.num_disruptive() + num_nd = num_total - num_d + if num_nd == 0 or num_d == 0: + weights_d = 1.0 + weights_nd = 1.0 + else: + weights_d = num_nd + weights_nd = num_d + max_weight = np.maximum(weights_d,weights_nd) + return weights_d/max_weight,weights_nd/max_weight + + def num_timesteps(self): + ls = [shot.num_timesteps() for shot in self.shots] + timesteps_total = sum(ls) + timesteps_d = sum([ts for (i,ts) in enumerate(ls) if self.shots[i].is_disruptive_shot()]) + timesteps_nd = timesteps_total-timesteps_d + return timesteps_total,timesteps_d,timesteps_nd + + def num_disruptive(self): return len([shot for shot in self.shots if shot.is_disruptive_shot()]) @@ -289,6 +318,12 @@ def __str__(self): return string + def num_timesteps(self): + self.restore() + ts = len(self.ttd.shape[0]) + self.make_light() + return ts + def get_number(self): return self.number From ca4e6f39116cdc7e1f3bde7a7ee57b521ac55fd7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 21:23:10 -0400 Subject: [PATCH 241/744] added option to equalize classes --- plasma/models/shallow_runner.py | 2 +- plasma/primitives/shots.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index ef3e100b..6d6376cf 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -41,7 +41,7 @@ def __init__(self,loader,timesteps = 32): def get_sample_probs(self,shot_list,num_samples): print("Calculating number of timesteps") - timesteps_total,timesteps_d,timesteps_nd = shot_list.num_timesteps() + timesteps_total,timesteps_d,timesteps_nd = shot_list.num_timesteps(self.loader.conf['paths']['processed_prepath']) print("Total data: {} time samples, {} disruptive".format(timesteps_total,timesteps_d/timesteps_total)) if self.loader.conf['data']['equalize_classes']: sample_prob_d = np.minimum(1.0,timesteps_nd/timesteps_d) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 4efc177b..0901e31a 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -189,8 +189,8 @@ def get_weights_d_nd(self): max_weight = np.maximum(weights_d,weights_nd) return weights_d/max_weight,weights_nd/max_weight - def num_timesteps(self): - ls = [shot.num_timesteps() for shot in self.shots] + def num_timesteps(self,prepath): + ls = [shot.num_timesteps(prepath) for shot in self.shots] timesteps_total = sum(ls) timesteps_d = sum([ts for (i,ts) in enumerate(ls) if self.shots[i].is_disruptive_shot()]) timesteps_nd = timesteps_total-timesteps_d @@ -318,8 +318,8 @@ def __str__(self): return string - def num_timesteps(self): - self.restore() + def num_timesteps(self,prepath): + self.restore(prepath) ts = len(self.ttd.shape[0]) self.make_light() return ts From f0142ee4af902273b84a710860319e20f2bb894f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 21:23:31 -0400 Subject: [PATCH 242/744] syntax error fixed --- plasma/primitives/shots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 4efc177b..c78d67be 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -173,7 +173,7 @@ def sample_weighted(self): def sample_equal_classes(self): weights_d,weights_nd = self.get_weights_d_nd() - p = np.array([weights_d for shot in self.shots if shot.is_disruptive_shot() else weights_nd]) + p = np.array([weights_d if shot.is_disruptive_shot() else weights_nd for shot in self.shots ]) return self.sample_weighted_given_arr(p) def get_weights_d_nd(self): From 5f5287ddbdc9d87ba774bcc2d76d440d561687b6 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 21:25:58 -0400 Subject: [PATCH 243/744] added option to equalize classes --- plasma/models/shallow_runner.py | 2 +- plasma/primitives/shots.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 6d6376cf..1bb031ff 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -337,7 +337,7 @@ def make_predictions(conf,shot_list,loader): return y_prime,y_gold,disruptive def predict_single_shot(shot,model,feature_extractor): - X,y,disr = feature_extractor.load_shot(shot,sample_prob=1.0) + X,y,disr = feature_extractor.load_shot(shot) y_p = model.predict_proba(X)[:,1] #print(y) #print(y_p) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 0901e31a..35c233b0 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -320,7 +320,7 @@ def __str__(self): def num_timesteps(self,prepath): self.restore(prepath) - ts = len(self.ttd.shape[0]) + ts = self.ttd.shape[0] self.make_light() return ts From 22114021e573f20a60e7d69ce38304c5523d24bb Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 21:42:43 -0400 Subject: [PATCH 244/744] added option to equalize classes --- plasma/models/shallow_runner.py | 3 +++ plasma/primitives/shots.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 1bb031ff..2dc61038 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -53,6 +53,9 @@ def get_sample_probs(self,shot_list,num_samples): else: sample_prob_d = np.minimum(1.0,num_samples/timesteps_total) sample_prob_nd = sample_prob_d + if sample_prob_nd <= 0.0 or sample_prob_d <= 0.0: + val = np.minimum(1.0,num_samples/timesteps_total) + return val,val return sample_prob_d,sample_prob_nd def load_shots(self,shot_list,as_list=False,num_samples=np.Inf): diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 35c233b0..3003dfd7 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -184,8 +184,8 @@ def get_weights_d_nd(self): weights_d = 1.0 weights_nd = 1.0 else: - weights_d = num_nd - weights_nd = num_d + weights_d = 1.0*num_nd + weights_nd = 1.0*num_d max_weight = np.maximum(weights_d,weights_nd) return weights_d/max_weight,weights_nd/max_weight From c246691b4a420661d905e29e3c2fe4608555a6a5 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 28 Oct 2017 21:43:17 -0400 Subject: [PATCH 245/744] integer arithmetic error --- plasma/models/shallow_runner.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 1bb031ff..55c2c171 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -42,16 +42,16 @@ def __init__(self,loader,timesteps = 32): def get_sample_probs(self,shot_list,num_samples): print("Calculating number of timesteps") timesteps_total,timesteps_d,timesteps_nd = shot_list.num_timesteps(self.loader.conf['paths']['processed_prepath']) - print("Total data: {} time samples, {} disruptive".format(timesteps_total,timesteps_d/timesteps_total)) + print("Total data: {} time samples, {} disruptive".format(timesteps_total,1.0*timesteps_d/timesteps_total)) if self.loader.conf['data']['equalize_classes']: - sample_prob_d = np.minimum(1.0,timesteps_nd/timesteps_d) - sample_prob_nd = np.minimum(1.0,timesteps_d/timesteps_nd) - timesteps_total = sample_prob_d*timesteps_d+sample_prob_nd*timesteps_nd - sample_prob = np.minimum(1.0,num_samples/timesteps_total) + sample_prob_d = np.minimum(1.0,1.0*timesteps_nd/timesteps_d) + sample_prob_nd = np.minimum(1.0,1.0*timesteps_d/timesteps_nd) + timesteps_total = 1.0*sample_prob_d*timesteps_d+sample_prob_nd*timesteps_nd + sample_prob = np.minimum(1.0,1.0*num_samples/timesteps_total) sample_prob_d *= sample_prob sample_prob_nd *= sample_prob else: - sample_prob_d = np.minimum(1.0,num_samples/timesteps_total) + sample_prob_d = np.minimum(1.0,1.0*num_samples/timesteps_total) sample_prob_nd = sample_prob_d return sample_prob_d,sample_prob_nd From e00ef04eacffa466d14f2732d10269de3d84c5e2 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 22:24:08 -0400 Subject: [PATCH 246/744] removed training ROC from computed values at the end of training due to computation time restrictions --- plasma/models/shallow_runner.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 4ae34452..2ed834c0 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -299,13 +299,13 @@ def train(conf,shot_list_train,shot_list_validate,loader): print(classification_report(Yv,Y_predv)) #print(confusion_matrix(Y,Y_pred)) _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) - _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) + # _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) epoch_logs = {} epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss - epoch_logs['train_roc'] = roc_area_train - epoch_logs['train_loss'] = loss_train + # epoch_logs['train_roc'] = roc_area_train + # epoch_logs['train_loss'] = loss_train callbacks.on_epoch_end(0, epoch_logs) From c8261701a3d451d3fa6d17b7573ff1eba54fb884 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 22:53:31 -0400 Subject: [PATCH 247/744] added parameters for xgboost --- examples/conf.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 4b7e3554..28f7ae1f 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -55,9 +55,12 @@ model: num_samples: 10000 type: "svm" #"random_forest" n_estimators: 50 #for random forest - max_depth: 20 #for random forest + max_depth: 20 #for random forest and xgboost C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm + max_depth: 3 #xgboost + learning_rate: 0.1 #xgboost + scale_pos_weight: 1.0 #xgboost skip_train: False #should a finished model be loaded if available #length of LSTM memory pred_length: 200 From c4d61ebbd958b019117d6a866db794c04ae566d8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 22:54:06 -0400 Subject: [PATCH 248/744] local model changes --- examples/conf.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 4b7e3554..91e7c5bf 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -44,16 +44,16 @@ data: window_size: 10 #TODO optimize normalizer: 'var' - equalize_classes: False + equalize_classes: True # shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model shallow_num_samples: 10000 #the number of samples to use for training floatx: 'float32' model: - shallow: True + shallow: False shallow_model: num_samples: 10000 - type: "svm" #"random_forest" + type: "svm" #"random_forest" "xgboost" n_estimators: 50 #for random forest max_depth: 20 #for random forest C: 1.0 #for svm From ce1c6287a70c9e966a112a3e8d8a0e296b803523 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 22:54:38 -0400 Subject: [PATCH 249/744] added functionality for XGBoost (gradient boosted decision trees) shallow learning --- plasma/models/shallow_runner.py | 3 +++ setup.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 2ed834c0..737c00dc 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -16,6 +16,7 @@ import os from functools import partial import pathos.multiprocessing as mp +from xgboost import XGBClassifier from plasma.conf import conf from plasma.models.loader import Loader, ProcessGenerator @@ -280,6 +281,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): elif model_conf['type'] == "random_forest": model = RandomForestClassifier(n_estimators=model_conf["n_estimators"], max_depth=model_conf["max_depth"],n_jobs=-1) + elif model_conf['type'] == "xgboost": + model = XGBClassifier() else: print("Unkown model type, exiting.") exit(1) diff --git a/setup.py b/setup.py index dd92f616..59e70b94 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras==2.0.6','pathos','matplotlib==2.0.2','hyperopt','mpi4py'], + install_requires = ['keras==2.0.6','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From 19043a0931bc0a6e63897452911765521b07a939 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 23:20:48 -0400 Subject: [PATCH 250/744] added hyperparameter tuning of shallow models --- examples/conf.yaml | 3 +-- examples/tune_hyperparams.py | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index a4d60557..73f21041 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -55,10 +55,9 @@ model: num_samples: 10000 type: "svm" #"random_forest" "xgboost" n_estimators: 50 #for random forest - max_depth: 20 #for random forest and xgboost + max_depth: 20 #for random forest and xgboost (def = 3) C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm - max_depth: 3 #xgboost learning_rate: 0.1 #xgboost scale_pos_weight: 1.0 #xgboost skip_train: False #should a finished model be loaded if available diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index f3aea04f..92aca6dc 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,4 +1,4 @@ -from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam +from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,IntegerHyperparam from pprint import pprint import yaml import datetime @@ -8,6 +8,17 @@ tunables = [] +#for shallow +shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost"]) +n_estimators = CategoricalHyperparam(['model','shallow_model','n_estimators'],[5,20,50,100,300,1000]) +max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[0,3,6,10,30,100]) +C = LogContinuousHyperparam(['model','shallow_model','C'],1e-3,1e3) +kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) +xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) +scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) +tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight] #target + +#for DL lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) #t_warn = CategoricalHyperparam(['data','T_warning'],[1.024]) @@ -15,8 +26,8 @@ #target = CategoricalHyperparam(['target'],['maxhinge','hinge']) #batch_size = CategoricalHyperparam(['training','batch_size'],[256,128,32,64]) #dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) +# tunables = [lr,lr_decay,fac] #target -tunables = [lr,lr_decay,fac] #target run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) From 4bb4ac3e3e5229c840f388c6d0b2875351954901 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 23:43:55 -0400 Subject: [PATCH 251/744] hyperparam tunign --- examples/conf.yaml | 8 ++++---- examples/tune_hyperparams.py | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 73f21041..e85a2a6e 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -52,10 +52,10 @@ data: model: shallow: False shallow_model: - num_samples: 10000 - type: "svm" #"random_forest" "xgboost" - n_estimators: 50 #for random forest - max_depth: 20 #for random forest and xgboost (def = 3) + num_samples: 100000 + type: "xgboost" #"random_forest" "xgboost" + n_estimators: 100 #for random forest + max_depth: 3 #for random forest and xgboost (def = 3) C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm learning_rate: 0.1 #xgboost diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 92aca6dc..f5b38cff 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -5,6 +5,7 @@ import uuid import sys,os,getpass import subprocess as sp +import numpy as np tunables = [] @@ -16,7 +17,8 @@ kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) -tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight] #target +num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e10]) +tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target #for DL lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) @@ -32,8 +34,8 @@ run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" -num_nodes = 2 -num_trials = 2 +num_nodes = 10 +num_trials = 1 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) From e012f8160f8efcd1b3a93154e20761ffe0367945 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 23:44:22 -0400 Subject: [PATCH 252/744] executable name --- examples/tune_hyperparams.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 92aca6dc..78724b5d 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -53,12 +53,16 @@ def generate_working_dirname(run_directory): s += "_{}".format(uuid.uuid4()) return run_directory + s - -def start_slurm_job(subdir,num_nodes,i,conf): +def get_executable_name() + from plasma.conf import conf if conf['model']['shallow']: - executable_name = conf['paths']['shallow_executable'] + return conf['paths']['shallow_executable'] else: - executable_name = conf['paths']['executable'] + return conf['paths']['executable'] + + +def start_slurm_job(subdir,num_nodes,i,conf): + executable_name = get_executable_name() os.system(" ".join(["cp -p",executable_name,subdir])) script = create_slurm_script(subdir,num_nodes,i,executable_name) sp.Popen("sbatch "+script,shell=True) @@ -100,7 +104,7 @@ def copy_files_to_environment(subdir): os.makedirs(working_directory) os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) -os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) +os.system(" ".join(["cp -p",os.path.join(template_path,get_executable_name()),working_directory])) os.chdir(working_directory) print("Going into {}".format(working_directory)) From cb7de598c24e674ee770baf66ac559498fac884a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 29 Oct 2017 23:52:36 -0400 Subject: [PATCH 253/744] small syntax error --- examples/tune_hyperparams.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index b24aab8c..a11c643b 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -34,8 +34,8 @@ run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" -num_nodes = 10 -num_trials = 1 +num_nodes = 1 +num_trials = 10 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) @@ -55,7 +55,7 @@ def generate_working_dirname(run_directory): s += "_{}".format(uuid.uuid4()) return run_directory + s -def get_executable_name() +def get_executable_name(): from plasma.conf import conf if conf['model']['shallow']: return conf['paths']['shallow_executable'] From 7813a30bcbd45d15762646639354859ba8d99951 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 00:12:42 -0400 Subject: [PATCH 254/744] python 3 print statements --- plasma/models/custom_loss.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plasma/models/custom_loss.py b/plasma/models/custom_loss.py index 2146a7b3..aaaa03b5 100644 --- a/plasma/models/custom_loss.py +++ b/plasma/models/custom_loss.py @@ -9,7 +9,7 @@ def _loss_tensor(y_true, y_pred): max_val = K.max(y_pred,axis=-2) #temporal axis! max_val = K.repeat(max_val,K.shape(y_pred)[-2]) - print K.eval(max_val) + print(K.eval(max_val)) mask = K.cast(K.equal(max_val,y_pred),K.floatx()) y_pred = mask * y_pred + (1-mask) * y_true return squared_hinge(y_true,y_pred) @@ -49,16 +49,16 @@ def check_loss(_shape): assert out1.shape == out2.shape assert out1.shape == shape[:-1] - print np.linalg.norm(out1) - print np.linalg.norm(out2) - print np.linalg.norm(out1-out2) + print(np.linalg.norm(out1)) + print(np.linalg.norm(out2)) + print(np.linalg.norm(out1-out2)) def test_loss(): shape_list = ['3d']#, '3d', '4d', '5d'] for _shape in shape_list: check_loss(_shape) - print '======================' + print('======================') if __name__ == '__main__': - test_loss() \ No newline at end of file + test_loss() From 799993e7a2dc90db5ec3a11afd48017f8eaca6f8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 02:02:33 -0400 Subject: [PATCH 255/744] running python2.7 for hyperparameter tuning. Added tensorflow version 1.3 as a requirement to fix cudnn compatibility issues --- examples/tune_hyperparams.py | 4 ++-- install-mpi.sh | 0 requirements-travis.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 install-mpi.sh diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index a11c643b..6a31940b 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -84,8 +84,8 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name): f.write('#SBATCH --mem-per-cpu=0\n') f.write('#SBATCH -o {}.out\n'.format(idx)) f.write('\n\n') - f.write('module load anaconda3\n') - f.write('source activate PPPL_dev3\n') + f.write('module load anaconda\n') + f.write('source activate frnn\n') f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) diff --git a/install-mpi.sh b/install-mpi.sh old mode 100644 new mode 100755 diff --git a/requirements-travis.txt b/requirements-travis.txt index c10aa4da..441b82b3 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -2,4 +2,4 @@ scipy h5py pyparsing pyyaml -tensorflow-gpu +tensorflow-gpu=1.3 From bde0c21740bd6e05896fa49bd0b09fad03f891b2 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 30 Oct 2017 10:50:06 -0400 Subject: [PATCH 256/744] Resuest TF version =>1.3 --- requirements-travis.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-travis.txt b/requirements-travis.txt index 441b82b3..f1e1e53f 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -2,4 +2,4 @@ scipy h5py pyparsing pyyaml -tensorflow-gpu=1.3 +tensorflow-gpu>=1.3 From 967644a1b34b2a5ed8ab88ea1f5d2d3d13aad494 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 30 Oct 2017 11:12:01 -0400 Subject: [PATCH 257/744] Fix itertools import error for Python3 --- plasma/models/shallow_runner.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 737c00dc..7bc2d7ad 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -4,7 +4,9 @@ import matplotlib.pyplot as plt import numpy as np -from itertools import imap +import sys +if sys.version_info[0] < 3: + from itertools import imap #leading to import errors: #from hyperopt import hp, STATUS_OK @@ -12,7 +14,6 @@ import time import datetime -import sys import os from functools import partial import pathos.multiprocessing as mp From ee4c7ac0bfce6e35ddd4b3c8b1ed90e5ca3cf08a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 30 Oct 2017 11:41:33 -0400 Subject: [PATCH 258/744] Cleanup --- {plasma/models => examples}/test.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {plasma/models => examples}/test.py (100%) diff --git a/plasma/models/test.py b/examples/test.py similarity index 100% rename from plasma/models/test.py rename to examples/test.py From 3fb58cf24b2768e7a7c405ffdf2ebf310c835ce0 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 14:22:37 -0400 Subject: [PATCH 259/744] allow shallow and deep learning in hyperparameter tuning by selectively turning mpi on or off --- examples/tune_hyperparams.py | 49 ++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 6a31940b..1cc7e973 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -58,32 +58,28 @@ def generate_working_dirname(run_directory): def get_executable_name(): from plasma.conf import conf if conf['model']['shallow']: - return conf['paths']['shallow_executable'] + executable_name = conf['paths']['shallow_executable'] + use_mpi = False else: - return conf['paths']['executable'] + executable_name = conf['paths']['executable'] + use_mpi = True + return executable_name,use_mpi def start_slurm_job(subdir,num_nodes,i,conf): - executable_name = get_executable_name() + executable_name,use_mpi = get_executable_name() os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_slurm_script(subdir,num_nodes,i,executable_name) + script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi) sp.Popen("sbatch "+script,shell=True) -def create_slurm_script(subdir,num_nodes,idx,executable_name): +def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename user = getpass.getuser() + sbatch_header = create_sbatch_header(num_nodes,use_mpi,idx) with open(filepath,"w") as f: - f.write('#!/bin/bash\n') - f.write('#SBATCH -t 01:00:00\n') - f.write('#SBATCH -N '+str(num_nodes)+'\n') - f.write('#SBATCH --ntasks-per-node=4\n') - f.write('#SBATCH --ntasks-per-socket=2\n') - f.write('#SBATCH --gres=gpu:4\n') - f.write('#SBATCH -c 4\n') - f.write('#SBATCH --mem-per-cpu=0\n') - f.write('#SBATCH -o {}.out\n'.format(idx)) - f.write('\n\n') + for line in sbatch_header: + f.write(line) f.write('module load anaconda\n') f.write('source activate frnn\n') f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') @@ -95,6 +91,26 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name): return filepath +def create_sbatch_header(num_nodes,use_mpi,idx): + if not use_mpi: + assert(num_nodes == 1) + lines = [] + lines.append('#!/bin/bash\n') + lines.append('#SBATCH -t 01:00:00\n') + lines.append('#SBATCH -N '+str(num_nodes)+'\n') + if use_mpi: + lines.append('#SBATCH --ntasks-per-node=4\n') + lines.append('#SBATCH --ntasks-per-socket=2\n') + else: + lines.append('#SBATCH --ntasks-per-node=1\n') + lines.append('#SBATCH --ntasks-per-socket=1\n') + lines.append('#SBATCH --gres=gpu:4\n') + lines.append('#SBATCH -c 4\n') + lines.append('#SBATCH --mem-per-cpu=0\n') + lines.append('#SBATCH -o {}.out\n'.format(idx)) + lines.append('\n\n') + return lines + def copy_files_to_environment(subdir): from plasma.conf import conf normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) @@ -105,8 +121,9 @@ def copy_files_to_environment(subdir): working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) +executable_name,_ = get_executable_name() os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) -os.system(" ".join(["cp -p",os.path.join(template_path,get_executable_name()),working_directory])) +os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) os.chdir(working_directory) print("Going into {}".format(working_directory)) From 6a51432b18d39c6b18b4bd5af5723e23e7369edd Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 14:23:38 -0400 Subject: [PATCH 260/744] added pandas requirement --- requirements-travis.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-travis.txt b/requirements-travis.txt index 441b82b3..40a413fa 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -1,4 +1,5 @@ scipy +pandas h5py pyparsing pyyaml From 21d2fa8a1d147918638d4819ed13e7783b4c1a1f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 15:18:33 -0400 Subject: [PATCH 261/744] new signals commented out since not downloaded yet --- data/signals.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/data/signals.py b/data/signals.py index 58710703..e22fcf08 100644 --- a/data/signals.py +++ b/data/signals.py @@ -180,11 +180,14 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pin':pin,'torquein':torquein, 'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2, 'pechin':pechin,'energydt':energydt, -'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -'etemp_profile':etemp_profile,'edens_profile':edens_profile, -'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial, -'etemp':etemp +'etemp_profile':etemp_profile,'edens_profile':edens_profile +# 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +# 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial, +# 'etemp':etemp } +#new signals are not downloaded yet + + #for actual data analysis #all_signals_restricted = [q95,li,ip,energy,lm,dens,pradcore,pradtot,pin,etemp_profile,edens_profile] From 7fd786eda79c96908bc34020ac0343ff75ba867b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 18:31:36 -0400 Subject: [PATCH 262/744] added bleed in option --- examples/conf.yaml | 1 + plasma/preprocessor/preprocess.py | 27 +++++++++++++++++++++++++++ plasma/primitives/shots.py | 10 ++++++++++ 3 files changed, 38 insertions(+) diff --git a/examples/conf.yaml b/examples/conf.yaml index e85a2a6e..78d46f73 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -16,6 +16,7 @@ paths: shallow_executable: "learn.py" data: + bleed_in: 0 #how many shots from the test sit to use in training? signal_to_augment: None #'plasma current' #or None augmentation_mode: 'noise' augment_during_training: True diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 74fbb289..58b2cb11 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -139,6 +139,32 @@ def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): np.savez(path,shot_list_train=shot_list_train,shot_list_validate=shot_list_validate,shot_list_test=shot_list_test) + +def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): + np.random.seed(1) + num = conf['data']['bleed_in'] + new_shots = [] + if num > 0: + print('applying bleed in with {} shots\n'.format(num)) + num_total = len(shot_list_test) + num_d = shot_list_test.num_disruptive() + num_nd = num_total - num_d + if num_d > 0: + for i in range(num): + shot_list_train.append(shot_list_test.sample_single_class(True)) + else: + print('No disruptive shots in test set, omitting bleed in') + if num_nd > 0: + for i in range(num): + shot_list_train.append(shot_list_test.sample_single_class(False)) + else: + print('No nondisruptive shots in test set, omitting bleed in') + return shot_list_train,shot_list_validate,shot_list_test + + + + + def guarantee_preprocessed(conf): pp = Preprocessor(conf) if pp.all_are_preprocessed(): @@ -157,6 +183,7 @@ def guarantee_preprocessed(conf): validation_frac = 0.05 shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) + shot_list_train,shot_list_validate,shot_list_test = apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test) print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 74cd554e..423e7fb9 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -171,6 +171,16 @@ def sample_weighted(self): p = np.array([shot.weight for shot in self.shots]) return self.sample_weighted_given_arr(p) + def sample_single_class(self,disruptive): + weights_d = 0.0 + weights_nd = 1.0 + if disruptive: + weights_d = 1.0 + weights_nd = 0.0 + p = np.array([weights_d if shot.is_disruptive_shot() else weights_nd for shot in self.shots ]) + return self.sample_weighted_given_arr(p) + + def sample_equal_classes(self): weights_d,weights_nd = self.get_weights_d_nd() p = np.array([weights_d if shot.is_disruptive_shot() else weights_nd for shot in self.shots ]) From 6f0ad92063f16237d314baeccc1dbd32a96317f7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 18:32:40 -0400 Subject: [PATCH 263/744] conf changes --- examples/conf.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e85a2a6e..3d3a9f43 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,7 +10,7 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_to_d3d_data' + data: 'jet_data' specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" @@ -19,7 +19,7 @@ data: signal_to_augment: None #'plasma current' #or None augmentation_mode: 'noise' augment_during_training: True - cut_shot_ends: True + cut_shot_ends: False T_min_warn: 30 recompute: False recompute_normalization: False @@ -44,13 +44,13 @@ data: window_size: 10 #TODO optimize normalizer: 'var' - equalize_classes: True + equalize_classes: False # shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model shallow_num_samples: 10000 #the number of samples to use for training floatx: 'float32' model: - shallow: False + shallow: True shallow_model: num_samples: 100000 type: "xgboost" #"random_forest" "xgboost" @@ -59,7 +59,7 @@ model: C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm learning_rate: 0.1 #xgboost - scale_pos_weight: 1.0 #xgboost + scale_pos_weight: 10.0 #xgboost skip_train: False #should a finished model be loaded if available #length of LSTM memory pred_length: 200 From 2153072967dcf3db42db98cad2a4e526cc4c4ef4 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 23:55:44 -0400 Subject: [PATCH 264/744] fixing bug in loading shallow data, need to change load path based on whether or not shots are cut for training --- plasma/models/shallow_runner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 7bc2d7ad..0f91c2cc 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -83,7 +83,10 @@ def load_shots(self,shot_list,as_list=False,num_samples=np.Inf): def get_save_prepath(self): prepath = self.loader.conf['paths']['processed_prepath'] use_signals = self.loader.conf['paths']['use_signals'] - save_prepath = prepath + "shallow/use_signals_{}/".format(hash(tuple(sorted(use_signals)))) + cut_ends = self.loader.conf['data']['cut_shot_ends'] + T_min_warn = self.loader.conf['data']['T_min_warn'] + identifying_tuple = tuple(sorted(use_signals)) + (T_min_warn,cut_ends) + save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) return save_prepath def load_shot(self,shot,sample_prob_d=1.0,sample_prob_nd=1.0): From 480ebf54e114f2d3b886d141bccffef05259675e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 23:56:44 -0400 Subject: [PATCH 265/744] removed duplicate variable from conf --- plasma/models/shallow_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 7bc2d7ad..04b18e62 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -244,7 +244,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - num_samples = conf['data']['shallow_num_samples'] + num_samples = conf['model']['shallow_model']['num_samples'] feature_extractor = FeatureExtractor(loader) shot_list_train = shot_list_train.random_sublist(debug_use_shots) X,Y,_ = feature_extractor.load_shots(shot_list_train,num_samples = num_samples) From afe130c1442c35845623deb278d3e1067342a980 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 30 Oct 2017 23:58:01 -0400 Subject: [PATCH 266/744] removed cutting shots and removed duplicate conf entry --- examples/conf.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 5550b072..e3cdf0b2 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,16 +10,16 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_data' + data: 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" data: - bleed_in: 0 #how many shots from the test sit to use in training? + bleed_in: 100 #how many shots from the test sit to use in training? signal_to_augment: None #'plasma current' #or None - augmentation_mode: 'noise' - augment_during_training: True + augmentation_mode: 'none' + augment_during_training: False cut_shot_ends: False T_min_warn: 30 recompute: False @@ -47,15 +47,14 @@ data: normalizer: 'var' equalize_classes: False # shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model - shallow_num_samples: 10000 #the number of samples to use for training floatx: 'float32' model: shallow: True shallow_model: - num_samples: 100000 + num_samples: 100000 #the number of samples to use for training type: "xgboost" #"random_forest" "xgboost" - n_estimators: 100 #for random forest + n_estimators: 500 #for random forest max_depth: 3 #for random forest and xgboost (def = 3) C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm From f7dbe608ec0ca0468598ddebf5c4a120b7548a1b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 31 Oct 2017 00:07:58 -0400 Subject: [PATCH 267/744] better save path --- plasma/models/shallow_runner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 0f91c2cc..a6871a76 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -85,7 +85,10 @@ def get_save_prepath(self): use_signals = self.loader.conf['paths']['use_signals'] cut_ends = self.loader.conf['data']['cut_shot_ends'] T_min_warn = self.loader.conf['data']['T_min_warn'] - identifying_tuple = tuple(sorted(use_signals)) + (T_min_warn,cut_ends) + if cut_ends: + identifying_tuple = tuple(sorted(use_signals)) + (cut_ends,T_min_warn) + else: + identifying_tuple = tuple(sorted(use_signals)) + (cut_ends,) save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) return save_prepath From d802f70e21b2df6fe558c8b68960e47e41efbdce Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 1 Nov 2017 02:04:28 -0400 Subject: [PATCH 268/744] shallow learning num samples paramter modification --- examples/tune_hyperparams.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 1cc7e973..08ce989d 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -17,7 +17,7 @@ kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) -num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e10]) +num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target #for DL @@ -28,14 +28,14 @@ #target = CategoricalHyperparam(['target'],['maxhinge','hinge']) #batch_size = CategoricalHyperparam(['training','batch_size'],[256,128,32,64]) #dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) -# tunables = [lr,lr_decay,fac] #target +#tunables = [lr,lr_decay,fac] #target run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" num_nodes = 1 -num_trials = 10 +num_trials = 100 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) From 86d123cab7eed1270f77c093a61cd669b61981e0 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 6 Nov 2017 23:47:53 -0500 Subject: [PATCH 269/744] printing validation performance for shallow --- plasma/models/shallow_runner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 5d8f24de..630af68f 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -311,6 +311,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) # _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) + print('Validation Loss: {:.3e}'.format(loss)) + print('Validation ROC: {:.4f}'.format(roc_area)) epoch_logs = {} epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss From dc151b99a0c2ba024db6685740f83f857e333f9c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 6 Nov 2017 23:54:13 -0500 Subject: [PATCH 270/744] write results locally during hyperparameter tuning --- plasma/conf_parser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 0e6919d5..3768241d 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -22,17 +22,18 @@ def parameters(input_file): params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path params['paths']['processed_prepath'] = output_path +'/processed_shots/' - params['paths']['results_prepath'] = output_path + '/results/' if params['training']['hyperparam_tuning']: params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' params['paths']['normalizer_path'] = './normalization/normalization.npz' params['paths']['model_save_path'] = './model_checkpoints/' params['paths']['csvlog_save_path'] = './csv_logs/' + params['paths']['results_prepath'] = './results/' else: params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' params['paths']['model_save_path'] = output_path + '/model_checkpoints/' params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' + params['paths']['results_prepath'] = output_path + '/results/' params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] if params['target'] == 'hinge': From 1d9cf574d28f0d3dc0e1a820e3cacf10f152ac0d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 00:50:32 -0500 Subject: [PATCH 271/744] more complete hyperparameter tuning for shallow models --- plasma/models/shallow_runner.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 630af68f..1e876339 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -281,15 +281,25 @@ def train(conf,shot_list_train,shot_list_validate,loader): if not model_conf['skip_train'] or not os.path.isfile(model_path): start_time = time.time() + if model_conf["scale_pos_weight"] != 1: + scale_pos_weight_dict = {np.min(Y) : 1, np.max(Y):model_conf["scale_pos_weight"]} + else: + scale_pos_weight_dict = None if model_conf['type'] == "svm": model = svm.SVC(probability=True, C=model_conf["C"], - kernel=model_conf["kernel"]) + kernel=model_conf["kernel"], + class_weight=scale_pos_weight_dict) elif model_conf['type'] == "random_forest": model = RandomForestClassifier(n_estimators=model_conf["n_estimators"], - max_depth=model_conf["max_depth"],n_jobs=-1) + max_depth=model_conf["max_depth"], + class_weight=scale_pos_weight_dict, + n_jobs=-1) elif model_conf['type'] == "xgboost": - model = XGBClassifier() + model = XGBClassifier(max_depth=model_conf["max_depth"], + learning_rate=model_conf['learning_rate'], + n_estimators=model_conf["n_estimators"], + scale_pos_weight=model_conf["scale_pos_weight"]) else: print("Unkown model type, exiting.") exit(1) From 36c9dc281107e3f2fee37671622bef533a123f12 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 01:13:03 -0500 Subject: [PATCH 272/744] more compact hyperparameter tuning --- examples/tune_hyperparams.py | 47 +++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 08ce989d..8171e5ef 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -8,34 +8,37 @@ import numpy as np tunables = [] +shallow = True +num_nodes = 2 +num_trials = 50 #for shallow -shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost"]) -n_estimators = CategoricalHyperparam(['model','shallow_model','n_estimators'],[5,20,50,100,300,1000]) -max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[0,3,6,10,30,100]) -C = LogContinuousHyperparam(['model','shallow_model','C'],1e-3,1e3) -kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) -xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) -scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) -num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) -tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target - -#for DL -lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-3) -lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) -#t_warn = CategoricalHyperparam(['data','T_warning'],[1.024]) -fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,2.0,4.0,8.0]) -#target = CategoricalHyperparam(['target'],['maxhinge','hinge']) -#batch_size = CategoricalHyperparam(['training','batch_size'],[256,128,32,64]) -#dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) -#tunables = [lr,lr_decay,fac] #target +if shallow: + num_nodes = 1 + shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost"]) + n_estimators = CategoricalHyperparam(['model','shallow_model','n_estimators'],[5,20,50,100,300,1000]) + max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[0,3,6,10,30,100]) + C = LogContinuousHyperparam(['model','shallow_model','C'],1e-3,1e3) + kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) + xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) + scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) + num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) + tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target +else: + #for DL + lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-4) + lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) + t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,4.096]) + fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,4.0,16.0]) + target = CategoricalHyperparam(['target'],['maxhinge','hinge']) + batch_size = CategoricalHyperparam(['training','batch_size'],[1024,256,64]) + dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) + tunables = [lr,lr_decay,t_warn,fac,target,batch_size,dropout_prob] #target run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" -num_nodes = 1 -num_trials = 100 def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) @@ -96,7 +99,7 @@ def create_sbatch_header(num_nodes,use_mpi,idx): assert(num_nodes == 1) lines = [] lines.append('#!/bin/bash\n') - lines.append('#SBATCH -t 01:00:00\n') + lines.append('#SBATCH -t 04:00:00\n') lines.append('#SBATCH -N '+str(num_nodes)+'\n') if use_mpi: lines.append('#SBATCH --ntasks-per-node=4\n') From c2a53d6ea91ff6bfa5c208e217bb5f935c973f93 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 01:19:21 -0500 Subject: [PATCH 273/744] shallow needs only to be set in tune_hyperparams.py to be used in hyperparameter tuning --- examples/tune_hyperparams.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 8171e5ef..76bbe8f7 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -40,7 +40,7 @@ template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" -def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name="conf.yaml"): +def generate_conf_file(tunables,shallow,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) with open(os.path.join(template_path,conf_name), 'r') as yaml_file: conf = yaml.load(yaml_file) @@ -48,6 +48,7 @@ def generate_conf_file(tunables,template_path = "../",save_path = "./",conf_name tunable.assign_to_conf(conf,save_path) conf['training']['num_epochs'] = 1000 #rely on early stopping to terminate training conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training + conf['model']['shallow'] = shallow with open(os.path.join(save_path,conf_name), 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) return conf @@ -58,9 +59,9 @@ def generate_working_dirname(run_directory): s += "_{}".format(uuid.uuid4()) return run_directory + s -def get_executable_name(): +def get_executable_name(shallow): from plasma.conf import conf - if conf['model']['shallow']: + if shallow: executable_name = conf['paths']['shallow_executable'] use_mpi = False else: @@ -69,8 +70,8 @@ def get_executable_name(): return executable_name,use_mpi -def start_slurm_job(subdir,num_nodes,i,conf): - executable_name,use_mpi = get_executable_name() +def start_slurm_job(subdir,num_nodes,i,conf,shallow): + executable_name,use_mpi = get_executable_name(shallow) os.system(" ".join(["cp -p",executable_name,subdir])) script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi) sp.Popen("sbatch "+script,shell=True) @@ -124,7 +125,7 @@ def copy_files_to_environment(subdir): working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -executable_name,_ = get_executable_name() +executable_name,_ = get_executable_name(shallow) os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) @@ -136,8 +137,8 @@ def copy_files_to_environment(subdir): os.makedirs(subdir) copy_files_to_environment(subdir) print("Making modified conf") - conf = generate_conf_file(tunables,working_directory,subdir,conf_name) + conf = generate_conf_file(tunables,shallow,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf) + start_slurm_job(subdir,num_nodes,i,conf,shallow) print("submitted {} jobs.".format(num_trials)) From b7618906297f760f3948af389c9cf1ec77f91d91 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 01:47:44 -0500 Subject: [PATCH 274/744] print message --- plasma/models/mpi_runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index abe14b8d..4fd560c2 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -742,6 +742,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non if hasattr(mpi_model.model,'stop_training'): stop_training = mpi_model.model.stop_training if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + print("Not saving model weights") specific_builder.delete_model_weights(train_model,int(round(e))) #tensorboard From ea2d5da4e494514502337713e69d9d485012af77 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 01:56:04 -0500 Subject: [PATCH 275/744] no need to remove global model checkpoints anymore --- examples/tune_hyperparams.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 76bbe8f7..cc089aad 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -87,7 +87,7 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi): f.write('module load anaconda\n') f.write('source activate frnn\n') f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') - f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) + # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') f.write('srun python {}\n'.format(executable_name)) From 2738fc2056510636bad0d0e8d559e74444a29609 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 17:17:36 -0500 Subject: [PATCH 276/744] make sure save path exists --- examples/learn.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/learn.py b/examples/learn.py index c8ea1281..5e4dcbfb 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -131,7 +131,10 @@ shot_list_train.make_light() save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") -np.savez(conf['paths']['results_prepath']+save_str, +result_base_path = conf['paths']['results_prepath'] +if not os.path.exists(result_base_path): + os.makedirs(result_base_path) +np.savez(result_base_path+save_str, y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, From 7149e13910b7dd69df7ddeb6f52284217ea52da1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 17:26:56 -0500 Subject: [PATCH 277/744] conf --- examples/conf.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e3cdf0b2..f4ad6e20 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,13 +10,13 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_to_d3d_data' #jet_data + data: 'd3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" data: - bleed_in: 100 #how many shots from the test sit to use in training? + bleed_in: 0 #how many shots from the test sit to use in training? signal_to_augment: None #'plasma current' #or None augmentation_mode: 'none' augment_during_training: False @@ -30,13 +30,13 @@ data: #train/validate split #how many shots to use use_shots: 200000 #1000 #200000 - positive_example_penalty: 1.0 #by what factor to upweight positive examples? + positive_example_penalty: 16.0 #by what factor to upweight positive examples? #normalization timescale dt: 0.001 #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 4.096 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -50,10 +50,10 @@ data: floatx: 'float32' model: - shallow: True + shallow: False shallow_model: - num_samples: 100000 #the number of samples to use for training - type: "xgboost" #"random_forest" "xgboost" + num_samples: 10000 #1000000 #the number of samples to use for training + type: "svm" #"xgboost" #"random_forest" "xgboost" n_estimators: 500 #for random forest max_depth: 3 #for random forest and xgboost (def = 3) C: 1.0 #for svm @@ -85,11 +85,11 @@ model: regularization: 0.0 dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 - lr_decay: 0.9 #0.98 #0.9 + lr: 0.000137 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 + lr_decay: 0.985 #0.98 #0.9 stateful: True return_sequences: True - dropout_prob: 0.3 + dropout_prob: 0.1 #only relevant if we want to do mpi training. The number of steps with a single replica warmup_steps: 0 ignore_timesteps: 100 #how many initial timesteps to ignore during evaluation (to let the internal state settle) @@ -99,7 +99,7 @@ training: shuffle_training: True train_frac: 0.75 validation_frac: 0.33 - batch_size: 256 + batch_size: 64 #256 #THIS WAS THE CULPRIT FOR NO TRAINING! Lower than 1000 performs very poorly max_patch_length: 100000 #How many shots are we loading at once? @@ -116,5 +116,5 @@ callbacks: metrics: ['val_loss','val_roc','train_loss'] mode: 'max' monitor: 'val_roc' - patience: 3 + patience: 5 write_grads: False From 91592b4eb01fafb69a36b7e2c6d7670c18e11b28 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 17:28:01 -0500 Subject: [PATCH 278/744] bleed in remove from test set --- examples/conf.yaml | 1 + plasma/preprocessor/preprocess.py | 10 ++++++++-- plasma/primitives/shots.py | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e3cdf0b2..9fcf1e40 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -17,6 +17,7 @@ paths: data: bleed_in: 100 #how many shots from the test sit to use in training? + bleed_in_remove_from_test: True signal_to_augment: None #'plasma current' #or None augmentation_mode: 'none' augment_during_training: False diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 58b2cb11..204a90a2 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -151,12 +151,18 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): num_nd = num_total - num_d if num_d > 0: for i in range(num): - shot_list_train.append(shot_list_test.sample_single_class(True)) + s = shot_list_test.sample_single_class(True) + shot_list_train.append(s) + if conf['data']['bleed_in_remove_from_test']: + shot_list_test.remove(s) else: print('No disruptive shots in test set, omitting bleed in') if num_nd > 0: for i in range(num): - shot_list_train.append(shot_list_test.sample_single_class(False)) + s = shot_list_test.sample_single_class(False) + shot_list_train.append(s) + if conf['data']['bleed_in_remove_from_test']: + shot_list_test.remove(s) else: print('No nondisruptive shots in test set, omitting bleed in') return shot_list_train,shot_list_validate,shot_list_test diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 423e7fb9..1325b960 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -257,6 +257,11 @@ def append(self,shot): assert(isinstance(shot,Shot)) self.shots.append(shot) + def remove(self,shot): + assert(shot in self.shots) + self.shots.remove(shot) + assert(shot not in self.shots) + def make_light(self): for shot in self.shots: shot.make_light() From fe7f47df162b896007b32d87dd8c12b1e645c447 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 7 Nov 2017 17:30:51 -0500 Subject: [PATCH 279/744] adding bleed in to train and validation sets --- plasma/preprocessor/preprocess.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 204a90a2..8b5fc591 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -153,6 +153,7 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): for i in range(num): s = shot_list_test.sample_single_class(True) shot_list_train.append(s) + shot_list_validate.append(s) if conf['data']['bleed_in_remove_from_test']: shot_list_test.remove(s) else: @@ -161,6 +162,7 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): for i in range(num): s = shot_list_test.sample_single_class(False) shot_list_train.append(s) + shot_list_validate.append(s) if conf['data']['bleed_in_remove_from_test']: shot_list_test.remove(s) else: From ab841a473e994018eb3910800b4d7b64fcf03eef Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 8 Nov 2017 02:13:11 -0500 Subject: [PATCH 280/744] updates to get_mdsplus_data --- data/get_mdsplus_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 54e0d982..59317aeb 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -3,9 +3,9 @@ import plasma.conf -prepath = '/cscratch/share/frnn/'#'/p/datad2/' +prepath = '/p/datad2/' #'/cscratch/share/frnn/'#'/p/datad2/' shot_numbers_path = 'shot_lists/' -save_path = 'signal_data/' +save_path = 'signal_data_new/' machine = d3d#jet#d3d signals = all_signals#jet_signals#d3d_signals print('using signals: ') @@ -13,7 +13,7 @@ # shot_list_files = plasma.conf.jet_full #shot_list_files = plasma.conf.d3d_full -shot_list_files = plasma.conf.d3d_1000 +shot_list_files = conf['paths']['shot_files']#plasma.conf.d3d_100 download_all_shot_numbers(prepath,save_path,shot_list_files,signals) From ece3457683e15c088b8b2b9f0d0e2de4d6fb4776 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 8 Nov 2017 02:14:26 -0500 Subject: [PATCH 281/744] updates to get_mdsplus_data --- data/get_mdsplus_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 59317aeb..ec9a13ac 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -1,6 +1,6 @@ from plasma.utils.downloading import download_all_shot_numbers from data.signals import * -import plasma.conf +import from plasma import conf prepath = '/p/datad2/' #'/cscratch/share/frnn/'#'/p/datad2/' From 2a937700d32b20050ae7ee32563687c0d5434eed Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 8 Nov 2017 02:40:48 -0500 Subject: [PATCH 282/744] updates to get_mdsplus_data --- data/get_mdsplus_data.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index ec9a13ac..077b0c85 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -1,19 +1,19 @@ from plasma.utils.downloading import download_all_shot_numbers from data.signals import * -import from plasma import conf +from plasma.conf import conf prepath = '/p/datad2/' #'/cscratch/share/frnn/'#'/p/datad2/' shot_numbers_path = 'shot_lists/' save_path = 'signal_data_new/' -machine = d3d#jet#d3d -signals = all_signals#jet_signals#d3d_signals +machine = conf['paths']['all_machines'][0]# d3d#jet#d3d #should match with data set from conf.yaml +signals = conf['paths']['all_signals']#all_signals#jet_signals#d3d_signals print('using signals: ') print(signals) # shot_list_files = plasma.conf.jet_full #shot_list_files = plasma.conf.d3d_full -shot_list_files = conf['paths']['shot_files']#plasma.conf.d3d_100 +shot_list_files = conf['paths']['shot_files'][0]#plasma.conf.d3d_100 download_all_shot_numbers(prepath,save_path,shot_list_files,signals) From 7ababf3ce9f7c18093fa2a63914e5e50adb9001b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 8 Nov 2017 23:34:02 -0500 Subject: [PATCH 283/744] added new signals --- data/signals.py | 20 ++++++++++---------- plasma/utils/downloading.py | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/data/signals.py b/data/signals.py index e22fcf08..3e43cddf 100644 --- a/data/signals.py +++ b/data/signals.py @@ -112,9 +112,9 @@ def fetch_jet_data(signal_path,shot_num,c): time = c.get('_sig=dim_of(jet("{}/",{}))'.format(signal_path,shot_num)).data() found = True except Exception as e: - #print(e) - #sys.stdout.flush() - pass + print(e) + sys.stdout.flush() + #pass return time,data,ydata,found def fetch_nstx_data(signal_path,shot_num,c): @@ -140,9 +140,9 @@ def fetch_nstx_data(signal_path,shot_num,c): edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) # epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp = Signal("electron temperature",["ppf/hrtx/te0/"],[jet],causal_shifts=[25]) +etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) +edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) +etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25]) # epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False) @@ -180,10 +180,10 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pin':pin,'torquein':torquein, 'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2, 'pechin':pechin,'energydt':energydt, -'etemp_profile':etemp_profile,'edens_profile':edens_profile -# 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -# 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial, -# 'etemp':etemp +'etemp_profile':etemp_profile,'edens_profile':edens_profile, + 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, + 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial, + 'etemp':etemp } #new signals are not downloaded yet diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 45ad87de..66735074 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -69,6 +69,8 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): try: try: time,data,mapping,success = machine.fetch_data(signal,shot_num,c) + if not success: + print('No success shot {}, signal {}'.format(shot_num,signal)) except: #missing_values += 1 print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) From 40e64ef370dd1d2096a707efe33a81d0f15c8ecc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 00:40:24 -0500 Subject: [PATCH 284/744] preprocessing files by which group of all signals was used for downloading. This is relevant because if we change all_signals, the amount of shots that are valid might change. So we can remove rarely available signals and produce a larger training set. We can then still use a subset of signals using use_signals for training on subsets of signals on the same set of shots. --- data/signals.py | 5 +++-- plasma/conf_parser.py | 2 +- plasma/preprocessor/preprocess.py | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/data/signals.py b/data/signals.py index e22fcf08..4ad3bd22 100644 --- a/data/signals.py +++ b/data/signals.py @@ -173,7 +173,8 @@ def fetch_nstx_data(signal_path,shot_num,c): tmfreq2 = Signal("Tearing Mode frequency (rotating 3/2)", ['d3d/nssfrqn2l'],[d3d]) ipdirect = Signal("plasma current direction",["d3d/iptdirect"],[d3d]) -#for downloading +#for downloading #modify this to preprocess shots with only a subset of signals. This may produce more shots +#since only those shots that contain all_signals contained here are used. all_signals = {'q95':q95,'li':li,'ip':ip, 'betan':betan,'energy':energy,'lm':lm,'dens':dens, 'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, @@ -194,7 +195,7 @@ def fetch_nstx_data(signal_path,shot_num,c): all_signals_restricted = all_signals -print('all signals:') +print('all signals (determines which signals are downloaded and preprocessed):') print(all_signals.values()) fully_defined_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machines(all_machines)} diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 3768241d..62ceb79e 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -115,7 +115,7 @@ def parameters(input_file): params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) params['paths']['all_signals'] = list(params['paths']['all_signals_dict'].values()) - print("Selected signals {}".format(params['paths']['use_signals'])) + print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 8b5fc591..c4de3c45 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -122,7 +122,9 @@ def get_individual_channel_dirs(self): signals_dirs = self.conf['paths']['signals_dirs'] def get_shot_list_path(self): - return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists.npz' + use_signals = self.loader.conf['paths']['all_signals'] + identifying_tuple = tuple(sorted(use_signals)) + return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists.npz_signals_{}.npz'.format(hash(identifying_tuple)) def load_shotlists(self): path = self.get_shot_list_path() From 8201934424423c94c8c81cb48c2d3b4976c3b727 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 01:32:39 -0500 Subject: [PATCH 285/744] added option to use full jet dataset with both walls --- plasma/conf_parser.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 3768241d..3ae90745 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -80,6 +80,10 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = jet_signals + elif params['paths']['data'] == 'jet_mixed_data': + params['paths']['shot_files'] = [jet_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = jet_signals elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] From 21c88ed3899fbf68f22706daa923f689b86b710d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 15:57:14 -0500 Subject: [PATCH 286/744] saving preprocessed data by signal group. If all_signals is changed, shots have to be re-processed. --- plasma/preprocessor/preprocess.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index c4de3c45..d05ca147 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -96,10 +96,13 @@ def preprocess_from_files(self,shot_files,use_shots): print('Finished Preprocessing {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) print('{}/{} disruptive shots'.format(used_shots.num_disruptive(),len(used_shots))) + if len(use_shots) == 0: + print("WARNING: All shots were omitted, please ensure raw data is complete and available at {}.".format(conf['paths']['signal_prepath'])) return used_shots def preprocess_single_file(self,shot): - processed_prepath = self.conf['paths']['processed_prepath'] + h = self.get_unique_signal_hash() + processed_prepath = self.conf['paths']['processed_prepath'] + 'signal_group_{}/'.format(h) recompute = self.conf['data']['recompute'] # print('({}/{}): '.format(num_processed,use_shots)) if recompute or not shot.previously_saved(processed_prepath): @@ -121,10 +124,13 @@ def preprocess_single_file(self,shot): def get_individual_channel_dirs(self): signals_dirs = self.conf['paths']['signals_dirs'] - def get_shot_list_path(self): + def get_unique_signal_hash(self): use_signals = self.loader.conf['paths']['all_signals'] - identifying_tuple = tuple(sorted(use_signals)) - return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists.npz_signals_{}.npz'.format(hash(identifying_tuple)) + return hash(tuple(sorted(use_signals))) + + def get_shot_list_path(self): + h = self.get_unique_signal_hash() + return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists_signal_group_{}.npz'.format(h) def load_shotlists(self): path = self.get_shot_list_path() From 470e0aa3ac248742def7a9b6b35e3c0851313327 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 16:03:37 -0500 Subject: [PATCH 287/744] small bug in preprocessing path --- plasma/preprocessor/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index d05ca147..5b3bc3a8 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -125,7 +125,7 @@ def get_individual_channel_dirs(self): signals_dirs = self.conf['paths']['signals_dirs'] def get_unique_signal_hash(self): - use_signals = self.loader.conf['paths']['all_signals'] + use_signals = self.conf['paths']['all_signals'] return hash(tuple(sorted(use_signals))) def get_shot_list_path(self): From 19e5f2898a721ca4fb979428145a4fb5d1a8271a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 22:07:39 -0500 Subject: [PATCH 288/744] make creating directories robust to race conditions --- plasma/models/builder.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index bb437716..9a6d2293 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -213,7 +213,15 @@ def get_save_path(self,epoch): def ensure_save_directory(self): prepath = self.conf['paths']['model_save_path'] if not os.path.exists(prepath): - os.makedirs(prepath) + try: #can lead to race condition + os.makedirs(prepath) + except OSError as e: + if e.errno == errno.EEXIST: + # File exists, and it's a directory, another process beat us to creating this dir, that's OK. + pass + else: + # Our target dir exists as a file, or different error, reraise the error! + raise def load_model_weights(self,model,custom_path=None): if custom_path == None: From 3621fb76af7c45688691788d6a0ee0dbc16b8ea3 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 22:22:34 -0500 Subject: [PATCH 289/744] make preprocessing resilient to empty raw data files. This can happen if downloading is corrupted. --- plasma/primitives/data.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 9cc4db64..7fab4990 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -43,11 +43,14 @@ def is_saved(self,prepath,shot): return os.path.isfile(file_path) def load_data(self,prepath,shot,dtype='float32'): + file_path = self.get_file_path(prepath,shot.machine,shot.number) if not self.is_saved(prepath,shot): print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) return None,None,False - file_path = self.get_file_path(prepath,shot.machine,shot.number) + if os.path.getsize(file_path) == 0: + print('Signal {}, shot {} was downloaded incorrectly (empty file)'.format(self.description,shot.number)) + return None,None,False try: data = np.loadtxt(file_path,dtype=dtype) except: From 586090046bf0ecc379a3ef7c49208875b55a009e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 22:35:13 -0500 Subject: [PATCH 290/744] check for empty files during downloading and redownload --- plasma/utils/downloading.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 45ad87de..62d6dbc8 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -62,10 +62,15 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): save_path_full = signal.get_file_path(save_prepath,machine,shot_num) success = False mapping = None - if os.path.isfile(save_path_full): - print('-',end='') - success = True - else: + if os.path.getsize(file_path) == 0: + return None,None,False + if os.path.isfile(save_path_full) + if os.path.getsize(file_path) > 0: + print('-',end='') + success = True + else: + print('Signal {}, shot {} was downloaded incorrectly (empty file). Redownloading.'.format(signal_path,shot_num)) + if not success: try: try: time,data,mapping,success = machine.fetch_data(signal,shot_num,c) From 1e77c8dcec31c448e451c53868f6e588e638ed31 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 23:01:57 -0500 Subject: [PATCH 291/744] redownload empty files --- plasma/utils/downloading.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 62d6dbc8..77c934ac 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -62,8 +62,6 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): save_path_full = signal.get_file_path(save_prepath,machine,shot_num) success = False mapping = None - if os.path.getsize(file_path) == 0: - return None,None,False if os.path.isfile(save_path_full) if os.path.getsize(file_path) > 0: print('-',end='') From cb5b1b91f104ffb0ccdfdca30c3e65a465803d37 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 9 Nov 2017 23:12:31 -0500 Subject: [PATCH 292/744] shot saving resilient to race conditions --- plasma/primitives/shots.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 1325b960..1f592e53 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -440,7 +440,13 @@ def convert_to_ttd(self,tr,conf): def save(self,prepath): if not os.path.exists(prepath): - os.makedirs(prepath) + try: #can lead to race condition + os.makedirs(prepath) + except OSError as e: + if e.errno == errno.EEXIST:# File exists, and it's a directory, another process beat us to creating this dir, that's OK. + pass + else:# Our target dir exists as a file, or different error, reraise the error! + raise save_path = self.get_save_path(prepath) np.savez(save_path,valid=self.valid,is_disruptive=self.is_disruptive, signals_dict=self.signals_dict,ttd=self.ttd) From 3b5ead46a547d730b9e7a3ca8e38974f8c8c804a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 01:04:33 -0500 Subject: [PATCH 293/744] small bug fixes --- plasma/preprocessor/preprocess.py | 2 +- plasma/primitives/data.py | 3 ++- plasma/utils/downloading.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 5b3bc3a8..9a8df0e6 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -96,7 +96,7 @@ def preprocess_from_files(self,shot_files,use_shots): print('Finished Preprocessing {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) print('{}/{} disruptive shots'.format(used_shots.num_disruptive(),len(used_shots))) - if len(use_shots) == 0: + if len(used_shots) == 0: print("WARNING: All shots were omitted, please ensure raw data is complete and available at {}.".format(conf['paths']['signal_prepath'])) return used_shots diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 7fab4990..103ccb4d 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -49,7 +49,8 @@ def load_data(self,prepath,shot,dtype='float32'): return None,None,False if os.path.getsize(file_path) == 0: - print('Signal {}, shot {} was downloaded incorrectly (empty file)'.format(self.description,shot.number)) + print('Signal {}, shot {} was downloaded incorrectly (empty file). Removing.'.format(self.description,shot.number)) + os.remove(file_path) return None,None,False try: data = np.loadtxt(file_path,dtype=dtype) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 81b392b5..e70ac759 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -62,8 +62,8 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): save_path_full = signal.get_file_path(save_prepath,machine,shot_num) success = False mapping = None - if os.path.isfile(save_path_full) - if os.path.getsize(file_path) > 0: + if os.path.isfile(save_path_full): + if os.path.getsize(save_path_full) > 0: print('-',end='') success = True else: From 19ed7b897182024e2355a1a6f498cc368852d1ab Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 01:05:14 -0500 Subject: [PATCH 294/744] new set of signals --- data/signals.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/data/signals.py b/data/signals.py index 349091d3..04515516 100644 --- a/data/signals.py +++ b/data/signals.py @@ -175,17 +175,30 @@ def fetch_nstx_data(signal_path,shot_num,c): #for downloading #modify this to preprocess shots with only a subset of signals. This may produce more shots #since only those shots that contain all_signals contained here are used. +#all_signals = {'q95':q95,'li':li,'ip':ip, +#'betan':betan,'energy':energy,'lm':lm,'dens':dens, +#'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, +#'pin':pin,'torquein':torquein, +#'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2, +#'pechin':pechin,'energydt':energydt, +#'etemp_profile':etemp_profile,'edens_profile':edens_profile, +# 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +# 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial, +# 'etemp':etemp +#} + +#Restricted subset to those signals that are present for most shots. The idea is to remove signals that cause many shots to be dropped from the dataset. all_signals = {'q95':q95,'li':li,'ip':ip, 'betan':betan,'energy':energy,'lm':lm,'dens':dens, 'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, 'pin':pin,'torquein':torquein, -'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2, -'pechin':pechin,'energydt':energydt, +'energydt':energydt, 'etemp_profile':etemp_profile,'edens_profile':edens_profile, - 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, - 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial, - 'etemp':etemp + 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr +#'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, +# 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp } + #new signals are not downloaded yet From 96308ccbffc2b345974694948e4bd29c07fd1efe Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 01:10:26 -0500 Subject: [PATCH 295/744] removed pechin from signals for d3d --- plasma/conf_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 62ceb79e..a50c9d47 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -85,7 +85,7 @@ def parameters(input_file): params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, -'pradedge':pradedge,'pin':pin,'pechin':pechin,'torquein':torquein,'ipdirect':ipdirect} #'etemp_profile':etemp_profile,'edens_profile'} +'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect} #'etemp_profile':etemp_profile,'edens_profile'} #[q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] elif params['paths']['data'] == 'jet_to_d3d_data': From 25adba365e48479a3353530ee133df5421f6d406 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 12:30:16 -0500 Subject: [PATCH 296/744] path changes based on group of signals used for selecting valid shots. If all_signals is changed, the group of shots considered valid (because all signals are present) and their lengths (because of overlapping times of signals) might change, and thus the preprocessing changes. --- plasma/conf_parser.py | 13 ++++++++++--- plasma/preprocessor/preprocess.py | 10 ++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index feb082cf..81d7b4cc 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -6,6 +6,7 @@ import uuid import yaml + def parameters(input_file): """Parse yaml file of configuration parameters.""" @@ -21,20 +22,22 @@ def parameters(input_file): params['paths']['signal_prepath'] = base_path + params['paths']['signal_prepath'] params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path - params['paths']['processed_prepath'] = output_path +'/processed_shots/' if params['training']['hyperparam_tuning']: - params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' + # params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' params['paths']['normalizer_path'] = './normalization/normalization.npz' params['paths']['model_save_path'] = './model_checkpoints/' params['paths']['csvlog_save_path'] = './csv_logs/' params['paths']['results_prepath'] = './results/' else: - params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' + # params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' params['paths']['model_save_path'] = output_path + '/model_checkpoints/' params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['results_prepath'] = output_path + '/results/' params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] + signal_hash = get_unique_signal_hash(all_signals) + params['paths']['saved_shotlist_path'] = params['paths']['base_path'] + '/processed_shotlists/' + params['paths']['data'] + '/shot_lists_signal_group_{}.npz'.format(h) + params['paths']['processed_prepath'] = output_path +'/processed_shots/' + 'signal_group_{}/'.format(h) if params['target'] == 'hinge': params['data']['target'] = t.HingeTarget @@ -129,3 +132,7 @@ def parameters(input_file): assert type(params['data']['augment_during_training']) == bool return params + +def get_unique_signal_hash(signals): + return hash(tuple(sorted(signals))) + diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 9a8df0e6..d71ba76f 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -101,8 +101,7 @@ def preprocess_from_files(self,shot_files,use_shots): return used_shots def preprocess_single_file(self,shot): - h = self.get_unique_signal_hash() - processed_prepath = self.conf['paths']['processed_prepath'] + 'signal_group_{}/'.format(h) + processed_prepath = self.conf['paths']['processed_prepath'] recompute = self.conf['data']['recompute'] # print('({}/{}): '.format(num_processed,use_shots)) if recompute or not shot.previously_saved(processed_prepath): @@ -124,13 +123,8 @@ def preprocess_single_file(self,shot): def get_individual_channel_dirs(self): signals_dirs = self.conf['paths']['signals_dirs'] - def get_unique_signal_hash(self): - use_signals = self.conf['paths']['all_signals'] - return hash(tuple(sorted(use_signals))) - def get_shot_list_path(self): - h = self.get_unique_signal_hash() - return self.conf['paths']['base_path'] + '/processed_shotlists/' + self.conf['paths']['data'] + '/shot_lists_signal_group_{}.npz'.format(h) + return self.conf['paths']['saved_shotlist_path'] def load_shotlists(self): path = self.get_shot_list_path() From e5529bbab4637e80703d64d0de3c9f422cee1c50 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 15:01:06 -0500 Subject: [PATCH 297/744] changed handling of shot cutting. Shots are only cut during training but not during inference. --- plasma/models/loader.py | 3 +++ plasma/models/mpi_runner.py | 3 +++ plasma/models/runner.py | 10 +++++++++- plasma/models/shallow_runner.py | 17 +++++++++++++---- plasma/preprocessor/normalize.py | 6 +++++- plasma/utils/performance.py | 15 ++++++++++++--- 6 files changed, 45 insertions(+), 9 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 90288726..d3751701 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -35,6 +35,9 @@ def __init__(self,conf,normalizer=None): self.normalizer = normalizer self.verbose = True + def set_inference_mode(self,val): + self.normalizer.set_inference_mode(val) + def training_batch_generator(self,shot_list): """ The method implements a training batch generator as a Python generator with a while-loop. diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 4fd560c2..2fad6bc2 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -553,6 +553,7 @@ def load_shotlists(conf): #shot_list_train,shot_list_validate,shot_list_test = load_shotlists(conf) def mpi_make_predictions(conf,shot_list,loader,custom_path=None): + loader.set_inference_mode(True) np.random.seed(task_index) shot_list.sort()#make sure all replicas have the same list specific_builder = builder.ModelBuilder(conf) @@ -624,6 +625,7 @@ def mpi_make_predictions(conf,shot_list,loader,custom_path=None): y_prime_global = y_prime_global[:len(shot_list)] y_gold_global = y_gold_global[:len(shot_list)] disruptive_global = disruptive_global[:len(shot_list)] + loader.set_inference_mode(False) return y_prime_global,y_gold_global,disruptive_global @@ -638,6 +640,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None): + loader.set_inference_mode(False) conf['num_workers'] = comm.Get_size() specific_builder = builder.ModelBuilder(conf) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 8ef29af6..2c759812 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -25,7 +25,7 @@ backend = conf['model']['backend'] def train(conf,shot_list_train,shot_list_validate,loader): - + loader.set_inference_mode(False) np.random.seed(1) validation_losses = [] @@ -296,6 +296,7 @@ def plot_losses(conf,losses_list,specific_builder,name=''): def make_predictions(conf,shot_list,loader): + loader.set_inference_mode(True) use_cores = max(1,mp.cpu_count()-2) @@ -338,10 +339,12 @@ def make_predictions(conf,shot_list,loader): pool.close() pool.join() print('Finished Predictions in {} seconds'.format(time.time()-start_time)) + loader.set_inference_mode(False) return y_prime,y_gold,disruptive def make_single_prediction(shot,specific_builder,loader,model_save_path): + loader.set_inference_mode(True) model = specific_builder.build_model(True) model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) @@ -359,10 +362,12 @@ def make_single_prediction(shot,specific_builder,loader,model_save_path): y = np.reshape(y,(shot_length,answer_dims)) is_disruptive = shot.is_disruptive_shot() model.reset_states() + loader.set_inference_mode(False) return y_p,y,is_disruptive def make_predictions_gpu(conf,shot_list,loader): + loader.set_inference_mode(True) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules @@ -412,6 +417,7 @@ def make_predictions_gpu(conf,shot_list,loader): y_prime = y_prime[:len(shot_list)] y_gold = y_gold[:len(shot_list)] disruptive = disruptive[:len(shot_list)] + loader.set_inference_mode(False) return y_prime,y_gold,disruptive @@ -425,6 +431,7 @@ def make_predictions_and_evaluate_gpu(conf,shot_list,loader): return y_prime,y_gold,disruptive,roc_area,loss def make_evaluations_gpu(conf,shot_list,loader): + loader.set_inference_mode(True) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules @@ -473,4 +480,5 @@ def make_evaluations_gpu(conf,shot_list,loader): print('evaluations all: {}'.format(all_metrics)) loss = np.average(all_metrics,weights = all_weights) print('Evaluation Loss: {}'.format(loss)) + loader.set_inference_mode(False) return loss diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 1e876339..bd07a557 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -60,7 +60,7 @@ def get_sample_probs(self,shot_list,num_samples): return val,val return sample_prob_d,sample_prob_nd - def load_shots(self,shot_list,as_list=False,num_samples=np.Inf): + def load_shots(self,shot_list,is_inference=False,as_list=False,num_samples=np.Inf): X = [] Y = [] Disr = [] @@ -68,7 +68,7 @@ def load_shots(self,shot_list,as_list=False,num_samples=np.Inf): pbar = Progbar(len(shot_list)) sample_prob_d,sample_prob_nd = self.get_sample_probs(shot_list,num_samples) - fn = partial(self.load_shot,sample_prob_d=sample_prob_d,sample_prob_nd=sample_prob_nd) + fn = partial(self.load_shot,is_inference=is_inference,sample_prob_d=sample_prob_d,sample_prob_nd=sample_prob_nd) pool = mp.Pool() print('loading data in parallel on {} processes'.format(pool._processes)) for x,y,disr in pool.imap(fn,shot_list): @@ -92,7 +92,7 @@ def get_save_prepath(self): save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) return save_prepath - def load_shot(self,shot,sample_prob_d=1.0,sample_prob_nd=1.0): + def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0): save_prepath = self.get_save_prepath() save_path = shot.get_save_path(save_prepath) if os.path.isfile(save_path): @@ -103,10 +103,12 @@ def load_shot(self,shot,sample_prob_d=1.0,sample_prob_nd=1.0): prepath = self.loader.conf['paths']['processed_prepath'] assert(shot.valid) shot.restore(prepath) + self.loader.set_inference_mode(True)#make sure shots aren't cut if self.loader.normalizer is not None: self.loader.normalizer.apply(shot) else: print('Warning, no normalization. Training data may be poorly conditioned') + self.loader.set_inference_mode(False) # sig,res = self.get_signal_result_from_shot(shot) disr = 1 if shot.is_disruptive else 0 sig_sample = shot.signals_dict[use_signals[0]] @@ -137,6 +139,13 @@ def load_shot(self,shot,sample_prob_d=1.0,sample_prob_nd=1.0): os.makedirs(save_prepath) np.savez(save_path,X=X,Y=Y,disr=disr) #print(X.shape,Y.shape) + + #cut shot ends if we are supposed to + if self.conf['data']['cut_shot_ends'] and not is_inference: + T_min_warn = self.conf['data']['T_min_warn'] + X = X[:-T_min_warn] + Y = Y[:-T_min_warn] + sample_prob = sample_prob_nd if disr: sample_prob = sample_prob_d @@ -362,7 +371,7 @@ def make_predictions(conf,shot_list,loader): return y_prime,y_gold,disruptive def predict_single_shot(shot,model,feature_extractor): - X,y,disr = feature_extractor.load_shot(shot) + X,y,disr = feature_extractor.load_shot(shot,is_inference=True) y_p = model.predict_proba(X)[:,1] #print(y) #print(y_p) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 60812970..64a06ce2 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -42,6 +42,7 @@ def __init__(self,conf): self.path = conf['paths']['normalizer_path'] self.remapper = conf['data']['target'].remapper self.machines = set() + self.inference_mode = False @abc.abstractmethod def __str__(self): @@ -67,6 +68,9 @@ def save_stats(self): def load_stats(self): pass + def set_inference_mode(self,val): + self.inference_mode = val + def ensure_machine(self,machine): if machine not in self.means: self.num_processed[machine] = 0 @@ -124,7 +128,7 @@ def train_on_files(self,shot_files,use_shots): def cut_end_of_shot(self,shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] - if cut_shot_ends: + if not self.inference_mode and cut_shot_ends: #only cut shots during training T_min_warn = self.conf['data']['T_min_warn'] for key in shot.signals_dict: shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 08eb6ba4..ffdcb86c 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -11,9 +11,18 @@ from plasma.conf import conf class PerformanceAnalyzer(): - def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = 0,T_max_warn = 1000, verbose = False,pred_ttd=False,conf=None): - self.T_min_warn = T_min_warn - self.T_max_warn = T_max_warn + def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_warn = None, verbose = False,pred_ttd=False,conf=None): + cut_shot_ends = conf['data']['cut_shot_ends'] + dt = conf['data']['dt'] + T_max_warn_def = int(round(conf['data']['T_warning']/dt)) + T_min_warn_def = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) + if T_min_warn == None: + self.T_min_warn = T_min_warn_def + if T_max_warn == None: + self.T_max_warn = T_max_warn_def + if cut_shot_ends: + self.T_max_warn = self.T_max_warn-self.T_min + self.T_min_warn = 0 self.verbose = verbose self.results_dir = results_dir self.shots_dir = shots_dir From 07a71e3d2667e97c9f3c2d9548cc3c57bd05d52a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 16:01:02 -0500 Subject: [PATCH 298/744] more changes due to cutting --- examples/learn.py | 2 +- examples/mpi_learn.py | 1 + examples/performance_analysis.py | 19 ++++++++++--------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/examples/learn.py b/examples/learn.py index 5e4dcbfb..7da4bba1 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -87,10 +87,10 @@ p.start() p.join() - ##################################################### ####################PREDICTING####################### ##################################################### +loader.set_inference_mode(True) #load last model for testing print('saving results') diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 1fb4f3c2..f1068e6b 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -90,6 +90,7 @@ mpi_train(conf,shot_list_train,shot_list_validate,loader) #load last model for testing +loader.set_inference_mode(True) print('saving results') y_prime = [] y_gold = [] diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index d134ade1..17af06fd 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -9,20 +9,21 @@ save_figure = True pred_ttd = False -cut_shot_ends = conf['data']['cut_shot_ends'] -dt = conf['data']['dt'] -T_max_warn = int(round(conf['data']['T_warning']/dt)) -T_min_warn = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) -if cut_shot_ends: - T_max_warn = T_max_warn-T_min_warn - T_min_warn = 0 +# cut_shot_ends = conf['data']['cut_shot_ends'] +# dt = conf['data']['dt'] +# T_max_warn = int(round(conf['data']['T_warning']/dt)) +# T_min_warn = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) +# if cut_shot_ends: +# T_max_warn = T_max_warn-T_min_warn +# T_min_warn = 0 +T_min_warn = None #take value from conf #30 verbose=False results_dir = conf['paths']['results_prepath'] shots_dir = conf['paths']['processed_prepath'] -analyzer = PerformanceAnalyzer(results_dir=results_dir,shots_dir=shots_dir,i = file_num, -T_min_warn = T_min_warn,T_max_warn = T_max_warn, verbose = verbose, pred_ttd=pred_ttd) +analyzer = PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num, +T_min_warn = T_min_warn, verbose = verbose, pred_ttd=pred_ttd) analyzer.load_ith_file() From 8bc28833c35e8936eb7c51e02e343008a2374ea7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 16:01:44 -0500 Subject: [PATCH 299/744] remove sys.exit for jenkins --- examples/mpi_learn.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 1fb4f3c2..a4302a4d 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -107,7 +107,6 @@ print('Train ROC: {:.4f}'.format(roc_train)) print('Test Loss: {:.3e}'.format(loss_test)) print('Test ROC: {:.4f}'.format(roc_test)) - if roc_test < 0.8: sys.exit(1) if task_index == 0: From ac62d38fa8fe394a5bf5a21a9cea12075a62bb6e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 16:04:30 -0500 Subject: [PATCH 300/744] small bug fixes --- examples/conf.yaml | 16 ++++++++-------- examples/tune_hyperparams.py | 9 +++++++-- plasma/conf_parser.py | 6 +++--- plasma/utils/performance.py | 2 +- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 542c4254..2d3d06de 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,14 +3,14 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' -target: 'maxhinge' #'binary' #'hinge' +target: 'hinge' #'maxhinge' #'binary' #'hinge' num_gpus: 4 paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'd3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: 'd3d_data' #'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" @@ -21,7 +21,7 @@ data: signal_to_augment: None #'plasma current' #or None augmentation_mode: 'none' augment_during_training: False - cut_shot_ends: False + cut_shot_ends: True T_min_warn: 30 recompute: False recompute_normalization: False @@ -31,13 +31,13 @@ data: #train/validate split #how many shots to use use_shots: 200000 #1000 #200000 - positive_example_penalty: 16.0 #by what factor to upweight positive examples? + positive_example_penalty: 1.0 #by what factor to upweight positive examples? #normalization timescale dt: 0.001 #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 4.096 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 1.024 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -86,7 +86,7 @@ model: regularization: 0.0 dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.000137 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 + lr: 0.00001 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 lr_decay: 0.985 #0.98 #0.9 stateful: True return_sequences: True @@ -100,7 +100,7 @@ training: shuffle_training: True train_frac: 0.75 validation_frac: 0.33 - batch_size: 64 #256 + batch_size: 1024 #256 #THIS WAS THE CULPRIT FOR NO TRAINING! Lower than 1000 performs very poorly max_patch_length: 100000 #How many shots are we loading at once? @@ -110,7 +110,7 @@ training: data_parallel: False hyperparam_tuning: False batch_generator_warmup_steps: 0 - num_batches_minimum: 200 #minimum number of batches per epoch + num_batches_minimum: 100 #minimum number of batches per epoch ranking_difficulty_fac: 1.0 #how much to upweight incorrectly classified shots during training callbacks: list: ['earlystop'] diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index cc089aad..842cc644 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -8,9 +8,9 @@ import numpy as np tunables = [] -shallow = True +shallow = False num_nodes = 2 -num_trials = 50 +num_trials = 10 #for shallow if shallow: @@ -33,7 +33,12 @@ target = CategoricalHyperparam(['target'],['maxhinge','hinge']) batch_size = CategoricalHyperparam(['training','batch_size'],[1024,256,64]) dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) + conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[5,10]) + conv_layers = IntegerHyperparam(['model','num_conv_layers'],1,3) + rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,4) + rnn_size = CategoricalHyperparam(['model','rnn_size'],[100,200,300]) tunables = [lr,lr_decay,t_warn,fac,target,batch_size,dropout_prob] #target + tunables += [conv_filters,conv_layers] #,rnn_layers,rnn_size] run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 81d7b4cc..b6777eba 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -22,20 +22,20 @@ def parameters(input_file): params['paths']['signal_prepath'] = base_path + params['paths']['signal_prepath'] params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path + h = get_unique_signal_hash(all_signals.values()) if params['training']['hyperparam_tuning']: # params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' - params['paths']['normalizer_path'] = './normalization/normalization.npz' + params['paths']['normalizer_path'] = './normalization/normalization_signal_group_{}.npz'.format(h) params['paths']['model_save_path'] = './model_checkpoints/' params['paths']['csvlog_save_path'] = './csv_logs/' params['paths']['results_prepath'] = './results/' else: # params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' - params['paths']['normalizer_path'] = output_path + '/normalization/normalization.npz' + params['paths']['normalizer_path'] = output_path + '/normalization/normalization_signal_group_{}.npz'.format(h) params['paths']['model_save_path'] = output_path + '/model_checkpoints/' params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['results_prepath'] = output_path + '/results/' params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] - signal_hash = get_unique_signal_hash(all_signals) params['paths']['saved_shotlist_path'] = params['paths']['base_path'] + '/processed_shotlists/' + params['paths']['data'] + '/shot_lists_signal_group_{}.npz'.format(h) params['paths']['processed_prepath'] = output_path +'/processed_shots/' + 'signal_group_{}/'.format(h) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index ffdcb86c..c55366df 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -21,7 +21,7 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ if T_max_warn == None: self.T_max_warn = T_max_warn_def if cut_shot_ends: - self.T_max_warn = self.T_max_warn-self.T_min + self.T_max_warn = self.T_max_warn-self.T_min_warn self.T_min_warn = 0 self.verbose = verbose self.results_dir = results_dir From cc3a09f021ba9ec12235d41d748c1d32575172ab Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 16:16:27 -0500 Subject: [PATCH 301/744] setting inference true in performance analysis --- plasma/utils/performance.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index c55366df..da6d3cda 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -610,6 +610,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, nn = Normalizer(self.conf) nn.train() self.normalizer = nn + self.normalizer.set_inference_mode(True) if(shot.previously_saved(self.shots_dir)): shot.restore(self.shots_dir) From 31c432074992db1f795be35fe86f64ec1b771b06 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 20:32:34 -0500 Subject: [PATCH 302/744] add new d3d signals and add cut_shot_ends to tunable parameters --- examples/tune_hyperparams.py | 7 ++++--- plasma/conf_parser.py | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 842cc644..6945435e 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -10,8 +10,9 @@ tunables = [] shallow = False num_nodes = 2 -num_trials = 10 +num_trials = 50 +cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) #for shallow if shallow: num_nodes = 1 @@ -23,7 +24,7 @@ xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) - tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target + tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,cut_ends] #target else: #for DL lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-4) @@ -37,7 +38,7 @@ conv_layers = IntegerHyperparam(['model','num_conv_layers'],1,3) rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,4) rnn_size = CategoricalHyperparam(['model','rnn_size'],[100,200,300]) - tunables = [lr,lr_decay,t_warn,fac,target,batch_size,dropout_prob] #target + tunables = [lr,lr_decay,t_warn,fac,target,batch_size,dropout_prob,cut_ends] #target tunables += [conv_filters,conv_layers] #,rnn_layers,rnn_size] diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index b6777eba..36cd0a3c 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -91,8 +91,9 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, -'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect} #'etemp_profile':etemp_profile,'edens_profile'} + params['paths']['use_signals_dict'] = d3d_signals + #params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, +#'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, 'etemp_profile':etemp_profile ,'edens_profile':edens_profile} #[q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] elif params['paths']['data'] == 'jet_to_d3d_data': From d4a30415e8bba59c4fb5f7393706456f8aab1d15 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 20:53:57 -0500 Subject: [PATCH 303/744] fixed overflow error in normalization --- plasma/preprocessor/normalize.py | 3 ++- plasma/utils/performance.py | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 64a06ce2..bf073d14 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -198,7 +198,8 @@ def extract_stats(self,shot): list_of_signals = shot.get_individual_signal_arrays() num_signals = len(list_of_signals) stats.means = np.reshape(np.array([np.mean(sig) for sig in list_of_signals]),(1,num_signals)) - stats.stds = np.reshape(np.array([np.std(sig) for sig in list_of_signals]),(1,num_signals)) + stats.stds = np.reshape(np.array([np.std(sig,dtype=np.float64) for sig in list_of_signals]),(1,num_signals)) + stats.is_disruptive = shot.is_disruptive else: print('Warning: shot {} not valid, omitting'.format(shot.number)) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index da6d3cda..75d0eade 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -12,7 +12,6 @@ class PerformanceAnalyzer(): def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_warn = None, verbose = False,pred_ttd=False,conf=None): - cut_shot_ends = conf['data']['cut_shot_ends'] dt = conf['data']['dt'] T_max_warn_def = int(round(conf['data']['T_warning']/dt)) T_min_warn_def = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) @@ -20,9 +19,6 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ self.T_min_warn = T_min_warn_def if T_max_warn == None: self.T_max_warn = T_max_warn_def - if cut_shot_ends: - self.T_max_warn = self.T_max_warn-self.T_min_warn - self.T_min_warn = 0 self.verbose = verbose self.results_dir = results_dir self.shots_dir = shots_dir From 77d90d3840193464231b8869fda32e6601cc0204 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 21:20:19 -0500 Subject: [PATCH 304/744] only update normalizer with those machines that are missing --- plasma/preprocessor/normalize.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 64a06ce2..eb452950 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -93,19 +93,24 @@ def train(self): # shot_list_dir = conf['paths']['shot_list_dir'] use_shots = max(400,conf['data']['use_shots']) - return self.train_on_files(shot_files_use,use_shots) + return self.train_on_files(shot_files_use,use_shots,all_machines) - def train_on_files(self,shot_files,use_shots): + def train_on_files(self,shot_files,use_shots,all_machines): conf = self.conf all_signals = conf['paths']['all_signals'] shot_list = ShotList() shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) + previously_saved,machines_saved = self.previously_saved_stats() + machines_to_compute = all_machines - machines_saved recompute = conf['data']['recompute_normalization'] + if recompute: + machines_to_compute = all_machines - if recompute or not self.previously_saved_stats(): + if not previously_saved or len(machines_to_compute) > 0: + print('computing normalization for machines {}'.format(machines_to_compute)) use_cores = max(1,mp.cpu_count()-2) pool = mp.Pool(use_cores) print('running in parallel on {} processes'.format(pool._processes)) @@ -113,8 +118,9 @@ def train_on_files(self,shot_files,use_shots): for (i,stats) in enumerate(pool.imap_unordered(self.train_on_single_shot,shot_list_picked)): #for (i,stats) in enumerate(map(self.train_on_single_shot,shot_list_picked)): - self.incorporate_stats(stats) - self.machines.add(stats.machine) + if stats.machine in machines_to_compute: + self.incorporate_stats(stats) + self.machines.add(stats.machine) sys.stdout.write('\r' + '{}/{}'.format(i,len(shot_list_picked))) pool.close() @@ -160,7 +166,7 @@ def ensure_save_directory(self): def previously_saved_stats(self): if not os.path.isfile(self.path): - return False + return False,set([]) else: dat = np.load(self.path,encoding="latin1") machines = dat['machines'][()] @@ -169,7 +175,7 @@ def previously_saved_stats(self): print(machines) print(self.conf['paths']['all_machines']) print('Not all machines present. Recomputing normalizer.') - return ret + return ret,set(machines) # def get_indices_list(self): # return get_signal_slices(self.conf['paths']['signals_dirs']) From 3a16cac1397ee0f45f65c5efa06c658f41b2e862 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 21:23:08 -0500 Subject: [PATCH 305/744] only update normalizer with those machines that are missing --- plasma/preprocessor/normalize.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index eb452950..8cfedb0c 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -108,8 +108,11 @@ def train_on_files(self,shot_files,use_shots,all_machines): recompute = conf['data']['recompute_normalization'] if recompute: machines_to_compute = all_machines + previously_saved = False if not previously_saved or len(machines_to_compute) > 0: + if previously_saved: + self.load_stats() print('computing normalization for machines {}'.format(machines_to_compute)) use_cores = max(1,mp.cpu_count()-2) pool = mp.Pool(use_cores) @@ -258,7 +261,7 @@ def save_stats(self): print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) def load_stats(self): - assert self.previously_saved_stats(), "stats not saved before" + assert self.previously_saved_stats()[0], "stats not saved before" dat = np.load(self.path,encoding="latin1") self.means = dat['means'][()] self.stds = dat['stds'][()] @@ -386,7 +389,7 @@ def save_stats(self): print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) def load_stats(self): - assert(self.previously_saved_stats()) + assert(self.previously_saved_stats()[0]) dat = np.load(self.path,encoding="latin1") self.minimums = dat['minimums'][()] self.maximums = dat['maximums'][()] From ea375ae6b38314b0b0086cfb3b34908a555954c7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 10 Nov 2017 21:38:00 -0500 Subject: [PATCH 306/744] only update normalizer with those machines that are missing --- plasma/preprocessor/normalize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 3ed11794..2a43c73e 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -178,7 +178,7 @@ def previously_saved_stats(self): print(machines) print(self.conf['paths']['all_machines']) print('Not all machines present. Recomputing normalizer.') - return ret,set(machines) + return True,set(machines) # def get_indices_list(self): # return get_signal_slices(self.conf['paths']['signals_dirs']) From b5b55f21d0f2963477d0a4f7d8f966c0a60611d2 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 11 Nov 2017 16:08:21 -0500 Subject: [PATCH 307/744] using conf in performance analyzer --- plasma/utils/performance.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 75d0eade..20233691 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -39,6 +39,7 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ self.p_thresh_range = None self.normalizer = None + self.saved_conf = None @@ -142,7 +143,7 @@ def get_shot_difficulty(self,preds,truths,disruptives): #rank shots by difficulty. rank 1 is assigned to lowest value, should be highest difficulty d_ranks = stats.rankdata(d_thresholds,method='min')#difficulty is highest when threshold is low, can't detect disruption nd_ranks = stats.rankdata(-nd_thresholds,method='min')#difficulty is highest when threshold is high, can't avoid false positive - ranking_fac = self.conf['training']['ranking_difficulty_fac'] + ranking_fac = self.saved_conf['training']['ranking_difficulty_fac'] facs_d = np.linspace(ranking_fac,1,len(d_ranks))[d_ranks-1] facs_nd = np.linspace(ranking_fac,1,len(nd_ranks))[nd_ranks-1] ret_facs = np.ones(len(disruptives)) @@ -267,7 +268,7 @@ def get_shot_prediction_stats(self,P_thresh,pred,truth,is_disruptive): return TP,FP,FN,TN,early,late def get_ignore_indices(self): - return conf['model']['ignore_timesteps'] + return self.saved_conf['model']['ignore_timesteps'] def get_positives(self,predictions): @@ -337,7 +338,7 @@ def load_ith_file(self): self.disruptive_test = dat['disruptive_test'] self.shot_list_test = dat['shot_list_test'][()] self.shot_list_train = dat['shot_list_train'][()] - self.conf = dat['conf'][()] + self.saved_conf = dat['conf'][()] for mode in ['test','train']: print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) self.print_conf() @@ -603,7 +604,10 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type=''): if self.normalizer is None and normalize: - nn = Normalizer(self.conf) + if self.conf is not None: + nn = Normalizer(self.conf) + else: + nn = Normalizer(self.saved_conf) nn.train() self.normalizer = nn self.normalizer.set_inference_mode(True) @@ -615,7 +619,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, if normalize: self.normalizer.apply(shot) - use_signals = self.conf['paths']['use_signals'] + use_signals = self.saved_conf['paths']['use_signals'] f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) plt.title(prediction_type) assert(np.all(shot.ttd.flatten() == truth.flatten())) From 58ea4da6ce483e1dd26941a2678cd1ab0d6e5ac8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 11 Nov 2017 16:23:46 -0500 Subject: [PATCH 308/744] using conf in performance analyzer --- plasma/utils/performance.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 20233691..ea6eae3a 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -358,7 +358,7 @@ def assert_same_lists(self,shot_list,truth_arr,disr_arr): print("Same Shape!") def print_conf(self): - pprint(self.conf) + pprint(self.saved_conf) def get_num_shots(self,mode): if mode == 'test': @@ -605,9 +605,8 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type=''): if self.normalizer is None and normalize: if self.conf is not None: - nn = Normalizer(self.conf) - else: - nn = Normalizer(self.saved_conf) + self.saved_conf['paths'] = self.conf['paths'] + nn = Normalizer(self.saved_conf) nn.train() self.normalizer = nn self.normalizer.set_inference_mode(True) From 8aa15a0912b8186494db56f0e6b2df3c881522c6 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sat, 11 Nov 2017 22:40:53 -0500 Subject: [PATCH 309/744] Get number of GPUs per node from the config --- examples/mpi_learn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 8a974d27..a965a86b 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -54,7 +54,7 @@ comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() -NUM_GPUS = 4 +NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS from plasma.models.mpi_runner import * From 4245112e5a26d5f59ddafafea979414eb412e619 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 20:01:14 -0500 Subject: [PATCH 310/744] added inv ttd target --- plasma/conf_parser.py | 2 ++ plasma/models/targets.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 36cd0a3c..60318109 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -48,6 +48,8 @@ def parameters(input_file): params['data']['target'] = t.BinaryTarget elif params['target'] == 'ttd': params['data']['target'] = t.TTDTarget + elif params['target'] == 'ttdinv': + params['data']['target'] = t.TTDInvTarget elif params['target'] == 'ttdlinear': params['data']['target'] = t.TTDLinearTarget else: diff --git a/plasma/models/targets.py b/plasma/models/targets.py index ed353d9f..a901c672 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -64,6 +64,28 @@ def threshold_range(T_warning): return np.linspace(-np.log10(T_warning),6,100) +class TTDInvTarget(Target): + activation = 'linear' + loss = 'mse' + + @staticmethod + def loss_np(y_true,y_pred): + return mse_np(y_true,y_pred) + + @staticmethod + def remapper(ttd,T_warning): + eps = 1e-4 + ttd = 10**(ttd) + mask = ttd < T_warning + ttd[~mask] = 0#T_warning + ttd[mask] = 30.0/(ttd[mask]+eps_)#T_warning + return ttd + + @staticmethod + def threshold_range(T_warning): + return np.logspace(-6,np.log10(T_warning),100) + + class TTDLinearTarget(Target): activation = 'linear' From e6a918168276fb0e2db9bc0bcfc7bb4f3fad3e53 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 20:02:14 -0500 Subject: [PATCH 311/744] different d3d signal subsets --- plasma/conf_parser.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 36cd0a3c..c6360893 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -91,9 +91,18 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! - params['paths']['use_signals_dict'] = d3d_signals - #params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, -#'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, 'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + #params['paths']['use_signals_dict'] = d3d_signals + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ip':ip,'iptarget':iptarget,'iperr':iperr} + + #params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + + + #{'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + #{'ip':ip,'iperr':iperr,'li':li,'lm':lm,'pradcore':pradcore,'pradedge':pradedge,'betan':betan,'dens':dens,'energy':energy,'q95':q95} + +# {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, +#'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +#'etemp_profile':etemp_profile ,'edens_profile':edens_profile} #[q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] elif params['paths']['data'] == 'jet_to_d3d_data': From b962b4e5375affbd0e02d97176f11af8afb5e5f8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 21:46:33 -0500 Subject: [PATCH 312/744] removing shots that have the disruption event outside of the valid time scales --- data/signals.py | 2 +- plasma/primitives/shots.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/data/signals.py b/data/signals.py index 04515516..b4529533 100644 --- a/data/signals.py +++ b/data/signals.py @@ -129,7 +129,7 @@ def fetch_nstx_data(signal_path,shot_num,c): -d3d = Machine("d3d","atlas.gat.com",fetch_d3d_data,max_cores=32,current_threshold=1e-1) +d3d = Machine("d3d","atlas.gat.com",fetch_d3d_data,max_cores=32,current_threshold=2e-1) jet = Machine("jet","mdsplus.jet.efda.org",fetch_jet_data,max_cores=8,current_threshold=1e5) nstx = Machine("nstx","skylark.pppl.gov:8501::",fetch_nstx_data,max_cores=8) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 1f592e53..7bb7969e 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -401,13 +401,17 @@ def get_signals_and_times_from_file(self,conf): #make sure the shot is long enough. dt = conf['data']['dt'] if (t_max - t_min)/dt <= (conf['model']['length']+conf['data']['T_min_warn']): - print('Shot {} contains insufficient data'.format(self.number)) + print('Shot {} contains insufficient data, omitting.'.format(self.number)) valid = False + + if self.is_disruptive and self.t_disrupt > t_max: + print('Shot {}: disruption event is not contained in valid time region, omitting.'.format(self.number)) + valid = False if self.is_disruptive: - t_max = self.t_disrupt assert(self.t_disrupt <= t_max or not valid) + t_max = self.t_disrupt return time_arrays,signal_arrays,t_min,t_max,valid From 97fe11ece5072b64f835a9eb8b457653b26583f1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 21:47:29 -0500 Subject: [PATCH 313/744] removing shots that have the disruption event outside of the valid time scales --- plasma/primitives/shots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 7bb7969e..a63a97b2 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -400,7 +400,7 @@ def get_signals_and_times_from_file(self,conf): assert(t_max > t_min or not valid) #make sure the shot is long enough. dt = conf['data']['dt'] - if (t_max - t_min)/dt <= (conf['model']['length']+conf['data']['T_min_warn']): + if (t_max - t_min)/dt <= (2*conf['model']['length']+conf['data']['T_min_warn']): print('Shot {} contains insufficient data, omitting.'.format(self.number)) valid = False From 1bb9ff7f7356fc62572b2b21f4583ecd1ceb305f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 22:10:51 -0500 Subject: [PATCH 314/744] removing shots that have the disruption event outside of the valid time scales --- plasma/primitives/data.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 103ccb4d..71a68f4d 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -68,8 +68,12 @@ def load_data(self,prepath,shot,dtype='float32'): if self.is_ip: #restrict shot to current threshold region = np.where(np.abs(sig) >= shot.machine.current_threshold)[0] - t = t[region] - sig = sig[region,:] + first_idx = region[0] + last_idx = region[-1] + last_time = t[last_idx]+5e-2 #add 50 ms to cover possible disruption event + last_idx = np.where(t > last_time)[0][0] + t = t[fist_idx:last_idx] + sig = sig[fist_idx:last_idx,:] #make sure shot is not garbage data if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): From c29521bed8dd2b18e9157920de9e98a6b8a8d0fa Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 22:13:01 -0500 Subject: [PATCH 315/744] removing shots that have the disruption event outside of the valid time scales --- plasma/primitives/data.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 71a68f4d..c36de05e 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -71,7 +71,11 @@ def load_data(self,prepath,shot,dtype='float32'): first_idx = region[0] last_idx = region[-1] last_time = t[last_idx]+5e-2 #add 50 ms to cover possible disruption event - last_idx = np.where(t > last_time)[0][0] + last_indices = np.where(t > last_time)[0] + if len(last_indices) == 0 + last_idx = -1 + else: + last_idx = last_indices[0] t = t[fist_idx:last_idx] sig = sig[fist_idx:last_idx,:] From 10378278495f21a43d152c29f4f55c2d1f00a5bc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 23:08:49 -0500 Subject: [PATCH 316/744] added dense layer to convolutions --- plasma/models/builder.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 9a6d2293..94ab93b5 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -140,6 +140,8 @@ def slicer_output_shape(input_shape,indices): pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) + pre_rnn_1D = Dense(num_conv_filters*4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + pre_rnn_1D = Dense(num_conv_filters,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) else: pre_rnn = pre_rnn_input From ae4463a39317faa50a69e09b29bc4fd4677fd9e7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 12 Nov 2017 23:09:33 -0500 Subject: [PATCH 317/744] various small bug fixes --- plasma/models/shallow_runner.py | 4 +-- plasma/models/targets.py | 5 ++-- plasma/primitives/data.py | 9 ++++--- plasma/primitives/shots.py | 2 +- plasma/utils/performance.py | 48 ++++++++------------------------- 5 files changed, 23 insertions(+), 45 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index bd07a557..8dbcbf48 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -141,8 +141,8 @@ def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0) #print(X.shape,Y.shape) #cut shot ends if we are supposed to - if self.conf['data']['cut_shot_ends'] and not is_inference: - T_min_warn = self.conf['data']['T_min_warn'] + if self.loader.conf['data']['cut_shot_ends'] and not is_inference: + T_min_warn = self.loader.conf['data']['T_min_warn'] X = X[:-T_min_warn] Y = Y[:-T_min_warn] diff --git a/plasma/models/targets.py b/plasma/models/targets.py index a901c672..0823f459 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -77,8 +77,8 @@ def remapper(ttd,T_warning): eps = 1e-4 ttd = 10**(ttd) mask = ttd < T_warning - ttd[~mask] = 0#T_warning - ttd[mask] = 30.0/(ttd[mask]+eps_)#T_warning + ttd[~mask] = T_warning + ttd = (1.0)/(ttd+eps)#T_warning return ttd @staticmethod @@ -188,3 +188,4 @@ def remapper(ttd,T_warning,as_array_of_shots=True): @staticmethod def threshold_range(T_warning): return np.concatenate((np.linspace(-2,-1.06,100),np.linspace(-1.06,-0.96,100),np.linspace(-0.96,2,50))) + diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index c36de05e..62bf9222 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -68,16 +68,19 @@ def load_data(self,prepath,shot,dtype='float32'): if self.is_ip: #restrict shot to current threshold region = np.where(np.abs(sig) >= shot.machine.current_threshold)[0] + if len(region) == 0: + print('shot {} has no current'.format(shot.number)) + return None,None,False first_idx = region[0] last_idx = region[-1] last_time = t[last_idx]+5e-2 #add 50 ms to cover possible disruption event last_indices = np.where(t > last_time)[0] - if len(last_indices) == 0 + if len(last_indices) == 0: last_idx = -1 else: last_idx = last_indices[0] - t = t[fist_idx:last_idx] - sig = sig[fist_idx:last_idx,:] + t = t[first_idx:last_idx] + sig = sig[first_idx:last_idx,:] #make sure shot is not garbage data if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index a63a97b2..db0da87c 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -405,7 +405,7 @@ def get_signals_and_times_from_file(self,conf): valid = False if self.is_disruptive and self.t_disrupt > t_max: - print('Shot {}: disruption event is not contained in valid time region, omitting.'.format(self.number)) + print('Shot {}: disruption event is not contained in valid time region by {}s, omitting.'.format(self.number,self.t_disrupt - t_max)) valid = False diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index ea6eae3a..f7f55019 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -1,6 +1,9 @@ from __future__ import print_function import matplotlib matplotlib.use('Agg')#for machines that don't have a display +from matplotlib import rc +rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) +rc('text', usetex=True) import matplotlib.pyplot as plt import os from pprint import pprint @@ -12,6 +15,8 @@ class PerformanceAnalyzer(): def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_warn = None, verbose = False,pred_ttd=False,conf=None): + self.T_min_warn = T_min_warn + self.T_max_warn = T_max_warn dt = conf['data']['dt'] T_max_warn_def = int(round(conf['data']['T_warning']/dt)) T_min_warn_def = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) @@ -24,6 +29,7 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ self.shots_dir = shots_dir self.i = i self.pred_ttd = pred_ttd + self.saved_conf = conf self.conf = conf self.pred_train = None @@ -39,7 +45,6 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ self.p_thresh_range = None self.normalizer = None - self.saved_conf = None @@ -605,7 +610,7 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type=''): if self.normalizer is None and normalize: if self.conf is not None: - self.saved_conf['paths'] = self.conf['paths'] + self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] nn = Normalizer(self.saved_conf) nn.train() self.normalizer = nn @@ -631,44 +636,13 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, else: ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description + " (profile)") ax.set_ylim([0,num_channels]) - ax.legend(loc='upper center',fontsize=8) + ax.legend(loc='best',fontsize=8) plt.setp(ax.get_xticklabels(),visible=False) plt.setp(ax.get_yticklabels(),fontsize=7) f.subplots_adjust(hspace=0) #print(sig) #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) - #shot.signals is a 2D numpy array with the rows containing the unlabeled timeseries data - # signals = np.empty((len(shot.signals),0)) #None - - # labels = [] - # signals_index = 0 - # signals_masks = conf['paths']['signals_masks'] - # plot_masks = conf['plots']['plot_masks'] - # group_labels = conf['plots']['group_labels'] - # for i, group in enumerate(conf['paths']['signals_dirs']): - # for j,signal_name in enumerate(group): - # if signals_masks[i][j]: #signal was used in training/testing - # if plot_masks[i][j]: #subset of signals to be plotted - # labels += group_labels[i] #original object was 2D by PPFvs.JPF x signal group - # signals = np.column_stack((signals,shot.signals.T[signals_index])) - # signals_index += 1 - - # if is_disruptive: - # print('disruptive') - # else: - # print('non disruptive') - - # f,axarr = subplots(len(signals.T)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) - # title(prediction_type) - # for (i,sig) in enumerate(signals.T): - # ax = axarr[i] - # ax.plot(sig[::-1],label = labels[i]) - # ax.legend(loc='best',fontsize=8) - # setp(ax.get_xticklabels(),visible=False) - # setp(ax.get_yticklabels(),fontsize=7) - # f.subplots_adjust(hspace=0) - # print('min: {}, max: {}'.format(min(sig), max(sig))) - ax = axarr[-1] + ax = axarr[-1] if self.pred_ttd: ax.semilogy((-truth+0.0001),label='ground truth') ax.plot(-prediction+0.0001,'g',label='neural net prediction') @@ -683,7 +657,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') ax.set_xlabel('T [ms]') - ax.legend(loc = 'lower left',fontsize=10) + #ax.legend(loc = 'lower left',fontsize=10) plt.setp(ax.get_yticklabels(),fontsize=7) # ax.grid() if save_fig: @@ -707,7 +681,7 @@ def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,sa plt.legend(loc=(1.0,.6)) plt.xlabel('Alarm threshold') plt.grid() - title_str = 'metrics{}'.format(plot_string) + title_str = 'metrics{}'.format(plot_string.replace('_',' ')) plt.title(title_str) if save_figure: plt.savefig(title_str + '.png',bbox_inches='tight') From 8019ba0be8d7cdcd5bdfe0850b53c462c60a8e5b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 13 Nov 2017 01:33:28 -0500 Subject: [PATCH 318/744] adding tolerance for equilibrium signals not being available before disruption --- data/signals.py | 12 ++++++------ plasma/primitives/data.py | 3 ++- plasma/primitives/shots.py | 16 ++++++++++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/data/signals.py b/data/signals.py index b4529533..7e668756 100644 --- a/data/signals.py +++ b/data/signals.py @@ -136,16 +136,16 @@ def fetch_nstx_data(signal_path,shot_num,c): all_machines = [d3d,jet] profile_num_channels = 64 -etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) -edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels) +etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) # epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25]) +etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) +edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) +etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25],data_avail_tolerance=0.05) # epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) -q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False) +q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False,data_avail_tolerance=0.03) ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipspr15V"],[jet,d3d],is_ip=True) #"d3d/ipsip" was used before, ipspr15V seems to be available for a superset of shots. iptarget = Signal("plasma current target",["d3d/ipsiptargt"],[d3d]) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 62bf9222..bc1c33a7 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -15,7 +15,7 @@ # self.signals.append(Signal(signal_descriptions[i],signal_paths[i])) class Signal(object): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,is_ip=False,normalize=True): + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,is_ip=False,normalize=True,data_avail_tolerance=0): assert(len(paths) == len(machines)) self.description = description self.paths = paths @@ -26,6 +26,7 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,i self.is_ip = is_ip self.num_channels = 1 self.normalize = normalize + self.data_avail_tolerance = data_avail_tolerance def is_ip(self): return self.is_ip diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index db0da87c..dd7156c1 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -394,9 +394,17 @@ def get_signals_and_times_from_file(self,conf): assert(len(t.shape) == 1) assert(len(t) > 1) t_min = max(t_min,np.min(t)) - t_max = min(t_max,np.max(t)) signal_arrays.append(sig) time_arrays.append(t) + if self.is_disruptive and self.t_disrupt > np.max(t): + if self.t_disrupt > np.max(t) + signal.data_avail_tolerance: + print('Shot {}: disruption event is not contained in valid time region of signal {} by {}s, omitting.'.format(self.number,signal,self.t_disrupt - np.max(t))) + valid = False + else: + t_max = np.max(t) + signal.data_avail_tolerance + else: + t_max = min(t_max,np.max(t)) + assert(t_max > t_min or not valid) #make sure the shot is long enough. dt = conf['data']['dt'] @@ -404,9 +412,9 @@ def get_signals_and_times_from_file(self,conf): print('Shot {} contains insufficient data, omitting.'.format(self.number)) valid = False - if self.is_disruptive and self.t_disrupt > t_max: - print('Shot {}: disruption event is not contained in valid time region by {}s, omitting.'.format(self.number,self.t_disrupt - t_max)) - valid = False + # if self.is_disruptive and self.t_disrupt > t_max+conf['data']['data_avail_tolerance']: + # print('Shot {}: disruption event is not contained in valid time region by {}s, omitting.'.format(self.number,self.t_disrupt - t_max)) + # valid = False if self.is_disruptive: From 6cdf2dece04137a4eda76387c2045b76b159d8d5 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 13 Nov 2017 01:38:48 -0500 Subject: [PATCH 319/744] adding tolerance for equilibrium signals not being available before disruption --- plasma/primitives/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index bc1c33a7..9cbc2672 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -137,8 +137,8 @@ def __repr__(self): return self.description class ProfileSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32): - super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False) + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerance=0): + super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerance=data_avail_tolerance) self.mapping_range = mapping_range self.num_channels = num_channels From 024846d7d6e7091d49902103df64edd8da3c0246 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 13 Nov 2017 03:55:45 -0500 Subject: [PATCH 320/744] hyperparameter changes --- examples/conf.yaml | 18 +++++++++--------- examples/performance_analysis.py | 14 +++++++++----- examples/tune_hyperparams.py | 10 +++++----- plasma/conf_parser.py | 6 ++++-- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 2d3d06de..e089d77d 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,7 +3,7 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' -target: 'hinge' #'maxhinge' #'binary' #'hinge' +target: 'ttdinv' #'maxhinge' #'maxhinge' #'binary' #'hinge' num_gpus: 4 paths: @@ -37,7 +37,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 1.024 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 10.024 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -53,9 +53,9 @@ data: model: shallow: False shallow_model: - num_samples: 10000 #1000000 #the number of samples to use for training - type: "svm" #"xgboost" #"random_forest" "xgboost" - n_estimators: 500 #for random forest + num_samples: 1000000 #1000000 #the number of samples to use for training + type: "xgboost" #"xgboost" #"random_forest" "xgboost" + n_estimators: 100 #for random forest max_depth: 3 #for random forest and xgboost (def = 3) C: 1.0 #for svm kernel: "rbf" #rbf, sigmoid, linear, poly, for svm @@ -77,7 +77,7 @@ model: rnn_layers: 2 num_conv_filters: 10 size_conv_filters: 3 - num_conv_layers: 2 + num_conv_layers: 3 pool_size: 2 dense_size: 200 #have not found a difference yet @@ -87,7 +87,7 @@ model: dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) lr: 0.00001 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 - lr_decay: 0.985 #0.98 #0.9 + lr_decay: 0.97 #0.98 #0.9 stateful: True return_sequences: True dropout_prob: 0.1 @@ -100,7 +100,7 @@ training: shuffle_training: True train_frac: 0.75 validation_frac: 0.33 - batch_size: 1024 #256 + batch_size: 128 #256 #THIS WAS THE CULPRIT FOR NO TRAINING! Lower than 1000 performs very poorly max_patch_length: 100000 #How many shots are we loading at once? @@ -110,7 +110,7 @@ training: data_parallel: False hyperparam_tuning: False batch_generator_warmup_steps: 0 - num_batches_minimum: 100 #minimum number of batches per epoch + num_batches_minimum: 200 #minimum number of batches per epoch ranking_difficulty_fac: 1.0 #how much to upweight incorrectly classified shots during training callbacks: list: ['earlystop'] diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 17af06fd..0f6ba4fb 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -1,8 +1,9 @@ -import os +import os,sys import numpy as np from plasma.utils.performance import * from plasma.conf import conf +print conf['paths'] #mode = 'test' file_num = 0 @@ -16,10 +17,13 @@ # if cut_shot_ends: # T_max_warn = T_max_warn-T_min_warn # T_min_warn = 0 -T_min_warn = None #take value from conf #30 +T_min_warn = 30 #None #take value from conf #30 verbose=False -results_dir = conf['paths']['results_prepath'] +if len(sys.argv) > 1: + results_dir = sys.argv[1] +else: + results_dir = conf['paths']['results_prepath'] shots_dir = conf['paths']['processed_prepath'] analyzer = PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num, @@ -47,10 +51,10 @@ alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') -analyzer.hist_alarms(disr_alarms,'disruptive alarms, P_thresh = {}'.format(P_thresh_opt),save_figure=save_figure) +analyzer.hist_alarms(disr_alarms,'disruptive alarms, P thresh = {}'.format(P_thresh_opt),save_figure=save_figure) print('{} disruptive alarms'.format(len(disr_alarms))) print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) print('{} seconds median alarm time'.format(np.median(disr_alarms[disr_alarms > 0]))) -analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P_thresh = {}'.format(P_thresh_opt)) +analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P thresh = {}'.format(P_thresh_opt)) print('{} nondisruptive alarms'.format(len(nondisr_alarms))) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 6945435e..e721b640 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -27,15 +27,15 @@ tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,cut_ends] #target else: #for DL - lr = LogContinuousHyperparam(['model','lr'],5e-6,4e-4) + lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-4) lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) - t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,4.096]) + t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,4.0,16.0]) - target = CategoricalHyperparam(['target'],['maxhinge','hinge']) - batch_size = CategoricalHyperparam(['training','batch_size'],[1024,256,64]) + target = CategoricalHyperparam(['target'],['maxhinge','hinge','ttdinv','ttd']) + batch_size = CategoricalHyperparam(['training','batch_size'],[128,64]) dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[5,10]) - conv_layers = IntegerHyperparam(['model','num_conv_layers'],1,3) + conv_layers = IntegerHyperparam(['model','num_conv_layers'],2,4) rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,4) rnn_size = CategoricalHyperparam(['model','rnn_size'],[100,200,300]) tunables = [lr,lr_decay,t_warn,fac,target,batch_size,dropout_prob,cut_ends] #target diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index dcb55f76..42b1230c 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -94,9 +94,11 @@ def parameters(input_file): params['paths']['shot_files_test'] = [] #make sure all 1D signals appear last! #params['paths']['use_signals_dict'] = d3d_signals - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ip':ip,'iptarget':iptarget,'iperr':iperr} + #params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ip':ip,'iptarget':iptarget,'iperr':iperr} - #params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, +'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +'etemp_profile':etemp_profile ,'edens_profile':edens_profile} #{'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} From 248f5a0a7016608d7a95b2ef33410234982d32c1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 13 Nov 2017 20:07:29 -0500 Subject: [PATCH 321/744] added options for 0D and 1D data for d3d --- plasma/conf_parser.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 42b1230c..fc336cb3 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -92,23 +92,24 @@ def parameters(input_file): elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] - #make sure all 1D signals appear last! - #params['paths']['use_signals_dict'] = d3d_signals - #params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ip':ip,'iptarget':iptarget,'iperr':iperr} - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, -'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -'etemp_profile':etemp_profile ,'edens_profile':edens_profile} - - - #{'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} - #{'ip':ip,'iperr':iperr,'li':li,'lm':lm,'pradcore':pradcore,'pradedge':pradedge,'betan':betan,'dens':dens,'energy':energy,'q95':q95} - -# {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, -#'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -#'etemp_profile':etemp_profile ,'edens_profile':edens_profile} - #[q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile][:-2] + 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, + 'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + elif params['paths']['data'] == 'd3d_data_1D': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + elif params['paths']['data'] == 'd3d_data_0D': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, + 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr} + elif params['paths']['data'] == 'd3d_data_all': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = d3d_signals + #cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [d3d_full] From d97f2712ca98ccac6ad0874747fa666f01f6a85e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 14 Nov 2017 22:53:45 -0500 Subject: [PATCH 322/744] removed necessity for keeping track of shot end cutting --- plasma/models/shallow_runner.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 8dbcbf48..d0ce4bec 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -83,12 +83,10 @@ def load_shots(self,shot_list,is_inference=False,as_list=False,num_samples=np.In def get_save_prepath(self): prepath = self.loader.conf['paths']['processed_prepath'] use_signals = self.loader.conf['paths']['use_signals'] - cut_ends = self.loader.conf['data']['cut_shot_ends'] - T_min_warn = self.loader.conf['data']['T_min_warn'] if cut_ends: - identifying_tuple = tuple(sorted(use_signals)) + (cut_ends,T_min_warn) + identifying_tuple = tuple(sorted(use_signals)) else: - identifying_tuple = tuple(sorted(use_signals)) + (cut_ends,) + identifying_tuple = tuple(sorted(use_signals)) save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) return save_prepath From 82935e41f25f438e7a924a5eb4954a1699996a27 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 15 Nov 2017 03:53:44 -0500 Subject: [PATCH 323/744] making shallow model resilient to corrupted .npz files --- plasma/models/shallow_runner.py | 95 +++++++------ plasma/utils/downloading.py | 229 +++++++++++++++++--------------- 2 files changed, 172 insertions(+), 152 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index d0ce4bec..94db535a 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -24,6 +24,7 @@ from plasma.utils.performance import PerformanceAnalyzer from plasma.utils.evaluation import * from plasma.utils.state_reset import reset_states +from plasma.utils.downloading import makedirs_process_safe from keras.utils.generic_utils import Progbar @@ -90,53 +91,63 @@ def get_save_prepath(self): save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) return save_prepath + def process(self,shot): + use_signals = self.loader.conf['paths']['use_signals'] + prepath = self.loader.conf['paths']['processed_prepath'] + assert(shot.valid) + shot.restore(prepath) + self.loader.set_inference_mode(True)#make sure shots aren't cut + if self.loader.normalizer is not None: + self.loader.normalizer.apply(shot) + else: + print('Warning, no normalization. Training data may be poorly conditioned') + self.loader.set_inference_mode(False) + # sig,res = self.get_signal_result_from_shot(shot) + disr = 1 if shot.is_disruptive else 0 + sig_sample = shot.signals_dict[use_signals[0]] + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + ttd_sample = shot.ttd + timesteps = self.timesteps + length = sig_sample.shape[0] + if length < timesteps: + print(ttd,shot,shot.number) + print("Shot must be at least as long as the RNN length.") + exit(1) + assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) + assert(ttd_sample.shape[1] == 1) + + X = [] + Y = [] + while(len(X) == 0): + for i in range(length-timesteps+1): + #if np.random.rand() < sample_prob: + x,y = self.get_x_y(i,shot) + X.append(x) + Y.append(y) + X = np.stack(X) + Y = np.stack(Y) + shot.make_light() + + return X,Y,disr + def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0): save_prepath = self.get_save_prepath() save_path = shot.get_save_path(save_prepath) - if os.path.isfile(save_path): - dat = np.load(save_path) - X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] - else: - use_signals = self.loader.conf['paths']['use_signals'] - prepath = self.loader.conf['paths']['processed_prepath'] - assert(shot.valid) - shot.restore(prepath) - self.loader.set_inference_mode(True)#make sure shots aren't cut - if self.loader.normalizer is not None: - self.loader.normalizer.apply(shot) - else: - print('Warning, no normalization. Training data may be poorly conditioned') - self.loader.set_inference_mode(False) - # sig,res = self.get_signal_result_from_shot(shot) - disr = 1 if shot.is_disruptive else 0 - sig_sample = shot.signals_dict[use_signals[0]] - if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) - ttd_sample = shot.ttd - timesteps = self.timesteps - length = sig_sample.shape[0] - if length < timesteps: - print(ttd,shot,shot.number) - print("Shot must be at least as long as the RNN length.") - exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) - - X = [] - Y = [] - while(len(X) == 0): - for i in range(length-timesteps+1): - #if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) - X.append(x) - Y.append(y) - X = np.stack(X) - Y = np.stack(Y) - shot.make_light() - if not os.path.exists(save_prepath): - os.makedirs(save_prepath) + if not os.path.exists(save_prepath): + makedirs_process_safe(save_prepath) + + if not os.path.isfile(save_path): + X,Y,disr = self.process(shot) np.savez(save_path,X=X,Y=Y,disr=disr) #print(X.shape,Y.shape) + else: + try: + dat = np.load(save_path) + X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] + except: #data was there but corrupted, save it again + X,Y,disr = self.process(shot) + np.savez(save_path,X=X,Y=Y,disr=disr) #cut shot ends if we are supposed to if self.loader.conf['data']['cut_shot_ends'] and not is_inference: diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index e70ac759..39480299 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -14,9 +14,9 @@ - TEST ''' try: - from MDSplus import * + from MDSplus import * except ImportError: - pass + pass #from pylab import * import numpy as np import sys @@ -35,125 +35,134 @@ #print("Importing numpy version"+np.__version__) def create_missing_value_filler(): - time = np.linspace(0,100,100) - vals = np.zeros_like(time) - return time,vals + time = np.linspace(0,100,100) + vals = np.zeros_like(time) + return time,vals + +def makedirs_process_safe(dirpath): + try: #can lead to race condition + os.makedirs(dirpath) + except OSError as e: + if e.errno == errno.EEXIST:# File exists, and it's a directory, another process beat us to creating this dir, that's OK. + pass + else:# Our target dir exists as a file, or different error, reraise the error! + raise def mkdirdepth(filename): - folder=os.path.dirname(filename) - if not os.path.exists(folder): - os.makedirs(folder) + folder=os.path.dirname(filename) + if not os.path.exists(folder): + os.makedirs(folder) def format_save_path(prepath,signal_path,shot_num): - return prepath + signal_path + '/{}.txt'.format(shot_num) + return prepath + signal_path + '/{}.txt'.format(shot_num) def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): - missing_values = 0 - # if machine == 'd3d': - # reload(gadata) #reloads Gadata object with connection - while True: - shot_num = shot_num_queue.get() - if shot_num == sentinel: - break - shot_complete = True - for signal in signals: - signal_path = signal.get_path(machine) - save_path_full = signal.get_file_path(save_prepath,machine,shot_num) - success = False - mapping = None - if os.path.isfile(save_path_full): - if os.path.getsize(save_path_full) > 0: - print('-',end='') - success = True - else: - print('Signal {}, shot {} was downloaded incorrectly (empty file). Redownloading.'.format(signal_path,shot_num)) - if not success: - try: - try: - time,data,mapping,success = machine.fetch_data(signal,shot_num,c) - if not success: - print('No success shot {}, signal {}'.format(shot_num,signal)) - except: - #missing_values += 1 - print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) - time,data = create_missing_value_filler() - mapping = None - - - data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() - if mapping is not None: - mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) - data_two_column = np.vstack((mapping_two_column,data_two_column)) - try: #can lead to race condition - mkdirdepth(save_path_full) - except OSError as e: - if e.errno == errno.EEXIST: - # File exists, and it's a directory, another process beat us to creating this dir, that's OK. - pass - else: - # Our target dir exists as a file, or different error, reraise the error! - raise - np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') - print('.',end='') - except: - print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) - print('Warning: Incomplete!!!') - raise - sys.stdout.flush() - if not success: - missing_values += 1 - shot_complete = False - #only add shot to list if it was complete - if shot_complete: - print('saved shot {}'.format(shot_num)) - #complete_queue.put(shot_num) - else: - print('shot {} not complete. removing from list.'.format(shot_num)) - print('Finished with {} missing values total'.format(missing_values)) - return + missing_values = 0 + # if machine == 'd3d': + # reload(gadata) #reloads Gadata object with connection + while True: + shot_num = shot_num_queue.get() + if shot_num == sentinel: + break + shot_complete = True + for signal in signals: + signal_path = signal.get_path(machine) + save_path_full = signal.get_file_path(save_prepath,machine,shot_num) + success = False + mapping = None + if os.path.isfile(save_path_full): + if os.path.getsize(save_path_full) > 0: + print('-',end='') + success = True + else: + print('Signal {}, shot {} was downloaded incorrectly (empty file). Redownloading.'.format(signal_path,shot_num)) + if not success: + try: + try: + time,data,mapping,success = machine.fetch_data(signal,shot_num,c) + if not success: + print('No success shot {}, signal {}'.format(shot_num,signal)) + except: + #missing_values += 1 + print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) + time,data = create_missing_value_filler() + mapping = None + + + data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() + if mapping is not None: + mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) + data_two_column = np.vstack((mapping_two_column,data_two_column)) + try: #can lead to race condition + mkdirdepth(save_path_full) + except OSError as e: + if e.errno == errno.EEXIST: + # File exists, and it's a directory, another process beat us to creating this dir, that's OK. + pass + else: + # Our target dir exists as a file, or different error, reraise the error! + raise + np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') + print('.',end='') + except: + print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) + print('Warning: Incomplete!!!') + raise + sys.stdout.flush() + if not success: + missing_values += 1 + shot_complete = False + #only add shot to list if it was complete + if shot_complete: + print('saved shot {}'.format(shot_num)) + #complete_queue.put(shot_num) + else: + print('shot {} not complete. removing from list.'.format(shot_num)) + print('Finished with {} missing values total'.format(missing_values)) + return def download_shot_numbers(shot_numbers,save_prepath,machine,signals): - max_cores = machine.max_cores - sentinel = -1 - fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) - num_cores = min(mp.cpu_count(),max_cores) #can only handle 8 connections at once :( - queue = mp.Queue() - #complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() - - assert(len(shot_numbers) < 32000) # mp.queue can't handle larger queues yet! - for shot_num in shot_numbers: - queue.put(shot_num) - for i in range(num_cores): - queue.put(sentinel) - connections = [Connection(machine.server) for _ in range(num_cores)] - processes = [mp.Process(target=fn,args=(queue,connections[i])) for i in range(num_cores)] - - print('running in parallel on {} processes'.format(num_cores)) - - for p in processes: - p.start() - for p in processes: - p.join() + max_cores = machine.max_cores + sentinel = -1 + fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) + num_cores = min(mp.cpu_count(),max_cores) #can only handle 8 connections at once :( + queue = mp.Queue() + #complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() + + assert(len(shot_numbers) < 32000) # mp.queue can't handle larger queues yet! + for shot_num in shot_numbers: + queue.put(shot_num) + for i in range(num_cores): + queue.put(sentinel) + connections = [Connection(machine.server) for _ in range(num_cores)] + processes = [mp.Process(target=fn,args=(queue,connections[i])) for i in range(num_cores)] + + print('running in parallel on {} processes'.format(num_cores)) + + for p in processes: + p.start() + for p in processes: + p.join() def download_all_shot_numbers(prepath,save_path,shot_list_files,signals_full): - max_len = 30000 - - machine = shot_list_files.machine - signals = [] - for sig in signals_full: - if not sig.is_defined_on_machine(machine): - print('Signal {} not defined on machine {}, omitting'.format(sig,machine)) - else: - signals.append(sig) - save_prepath = prepath+save_path + '/' - shot_numbers,_ = shot_list_files.get_shot_numbers_and_disruption_times() - shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 - start_time = time.time() - for shot_numbers_chunk in shot_numbers_chunks: - download_shot_numbers(shot_numbers_chunk,save_prepath,machine,signals) - - print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) + max_len = 30000 + + machine = shot_list_files.machine + signals = [] + for sig in signals_full: + if not sig.is_defined_on_machine(machine): + print('Signal {} not defined on machine {}, omitting'.format(sig,machine)) + else: + signals.append(sig) + save_prepath = prepath+save_path + '/' + shot_numbers,_ = shot_list_files.get_shot_numbers_and_disruption_times() + shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 + start_time = time.time() + for shot_numbers_chunk in shot_numbers_chunks: + download_shot_numbers(shot_numbers_chunk,save_prepath,machine,signals) + + print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) From c8998969805f82bc52e78090df988795cd6f0354 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 15 Nov 2017 03:54:18 -0500 Subject: [PATCH 324/744] syntax --- plasma/models/shallow_runner.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index d0ce4bec..2d1158e3 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -83,10 +83,7 @@ def load_shots(self,shot_list,is_inference=False,as_list=False,num_samples=np.In def get_save_prepath(self): prepath = self.loader.conf['paths']['processed_prepath'] use_signals = self.loader.conf['paths']['use_signals'] - if cut_ends: - identifying_tuple = tuple(sorted(use_signals)) - else: - identifying_tuple = tuple(sorted(use_signals)) + identifying_tuple = tuple(sorted(use_signals)) save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) return save_prepath From 1449e4dbf912f1e7b5364db9cf4c0e114c661787 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 15 Nov 2017 19:27:07 -0500 Subject: [PATCH 325/744] outsourcing job submission functions. created script to submit the same job one or multiple times in its own environment --- examples/submit_batch_job.py | 52 ++++++++++++++++++++++++ examples/tune_hyperparams.py | 61 +--------------------------- plasma/utils/batch_jobs.py | 77 ++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 60 deletions(-) create mode 100644 examples/submit_batch_job.py create mode 100644 plasma/utils/batch_jobs.py diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py new file mode 100644 index 00000000..c7c3436e --- /dev/null +++ b/examples/submit_batch_job.py @@ -0,0 +1,52 @@ +from plasma.utils.batch_jobs import generate_conf_file, +generate_working_dirname,start_slurm_job,copy_files_to_environment +from pprint import pprint +import yaml +import sys,os,getpass + +# tunables = [] +# shallow = False +num_nodes = 2 +num_trials = 5 + + +run_directory = "/tigress/{}/batch_jobs/".format(getpass.getuser()) +template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) +conf_name = "conf.yaml" + +def copy_conf_file(shallow,template_path = "../",save_path = "./",conf_name="conf.yaml"): + assert(template_path != save_path) + pathsrc = os.path.join(template_path,conf_name) + pathdst = os.path.join(save_path,conf_name) + os.system(" ".join(["cp -p",pathsrc,pathdst])) + +def get_conf(template_path,conf_name): + with open(os.path.join(template_path,conf_name), 'r') as yaml_file: + conf = yaml.load(yaml_file) + return conf + +conf = get_conf(template_path,conf_name) +shallow = conf['model']['shallow'] +if shallow: + num_nodes = 1 +working_directory = generate_working_dirname(run_directory) +os.makedirs(working_directory) + +#copy conf and executable into directory +executable_name,_ = get_executable_name(shallow) +os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) +os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) + +os.chdir(working_directory) +print("Going into {}".format(working_directory)) + +for i in range(num_trials): + subdir = working_directory + "/{}/".format(i) + os.makedirs(subdir) + copy_files_to_environment(subdir) + print("Making modified conf") + copy_conf_file(shallow,working_directory,subdir,conf_name) + print("Starting job") + start_slurm_job(subdir,num_nodes,i,conf,shallow) + +print("submitted {} jobs.".format(num_trials)) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index e721b640..95f48470 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,11 +1,8 @@ from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,IntegerHyperparam +from plasma.primitives.batch_jobs import create_slurm_script,create_sbatch_header,start_slurm_job,generate_working_dirname,copy_files_to_environment from pprint import pprint import yaml -import datetime -import uuid import sys,os,getpass -import subprocess as sp -import numpy as np tunables = [] shallow = False @@ -60,11 +57,6 @@ def generate_conf_file(tunables,shallow,template_path = "../",save_path = "./",c return conf -def generate_working_dirname(run_directory): - s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - s += "_{}".format(uuid.uuid4()) - return run_directory + s - def get_executable_name(shallow): from plasma.conf import conf if shallow: @@ -76,57 +68,6 @@ def get_executable_name(shallow): return executable_name,use_mpi -def start_slurm_job(subdir,num_nodes,i,conf,shallow): - executable_name,use_mpi = get_executable_name(shallow) - os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi) - sp.Popen("sbatch "+script,shell=True) - -def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi): - filename = "run_{}_nodes.cmd".format(num_nodes) - filepath = subdir+filename - user = getpass.getuser() - sbatch_header = create_sbatch_header(num_nodes,use_mpi,idx) - with open(filepath,"w") as f: - for line in sbatch_header: - f.write(line) - f.write('module load anaconda\n') - f.write('source activate frnn\n') - f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') - # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) - f.write('cd {}\n'.format(subdir)) - f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') - f.write('srun python {}\n'.format(executable_name)) - f.write('echo "done."') - - return filepath - -def create_sbatch_header(num_nodes,use_mpi,idx): - if not use_mpi: - assert(num_nodes == 1) - lines = [] - lines.append('#!/bin/bash\n') - lines.append('#SBATCH -t 04:00:00\n') - lines.append('#SBATCH -N '+str(num_nodes)+'\n') - if use_mpi: - lines.append('#SBATCH --ntasks-per-node=4\n') - lines.append('#SBATCH --ntasks-per-socket=2\n') - else: - lines.append('#SBATCH --ntasks-per-node=1\n') - lines.append('#SBATCH --ntasks-per-socket=1\n') - lines.append('#SBATCH --gres=gpu:4\n') - lines.append('#SBATCH -c 4\n') - lines.append('#SBATCH --mem-per-cpu=0\n') - lines.append('#SBATCH -o {}.out\n'.format(idx)) - lines.append('\n\n') - return lines - -def copy_files_to_environment(subdir): - from plasma.conf import conf - normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) - if os.path.isdir(normalization_dir): - print("Copying normalization to") - os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir))])) working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py new file mode 100644 index 00000000..102837bd --- /dev/null +++ b/plasma/utils/batch_jobs.py @@ -0,0 +1,77 @@ +from pprint import pprint +import yaml +import datetime +import uuid +import sys,os,getpass +import subprocess as sp +import numpy as np + +def generate_working_dirname(run_directory): + s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + s += "_{}".format(uuid.uuid4()) + return run_directory + s + + + +def get_executable_name(conf): + shallow = conf['model']['shallow'] + if shallow: + executable_name = conf['paths']['shallow_executable'] + use_mpi = False + else: + executable_name = conf['paths']['executable'] + use_mpi = True + return executable_name,use_mpi + + +def start_slurm_job(subdir,num_nodes,i,conf,shallow): + executable_name,use_mpi = get_executable_name(shallow) + os.system(" ".join(["cp -p",executable_name,subdir])) + script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi) + sp.Popen("sbatch "+script,shell=True) + +def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi): + filename = "run_{}_nodes.cmd".format(num_nodes) + filepath = subdir+filename + user = getpass.getuser() + sbatch_header = create_sbatch_header(num_nodes,use_mpi,idx) + with open(filepath,"w") as f: + for line in sbatch_header: + f.write(line) + f.write('module load anaconda\n') + f.write('source activate frnn\n') + f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') + # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) + f.write('cd {}\n'.format(subdir)) + f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') + f.write('srun python {}\n'.format(executable_name)) + f.write('echo "done."') + + return filepath + +def create_sbatch_header(num_nodes,use_mpi,idx): + if not use_mpi: + assert(num_nodes == 1) + lines = [] + lines.append('#!/bin/bash\n') + lines.append('#SBATCH -t 04:00:00\n') + lines.append('#SBATCH -N '+str(num_nodes)+'\n') + if use_mpi: + lines.append('#SBATCH --ntasks-per-node=4\n') + lines.append('#SBATCH --ntasks-per-socket=2\n') + else: + lines.append('#SBATCH --ntasks-per-node=1\n') + lines.append('#SBATCH --ntasks-per-socket=1\n') + lines.append('#SBATCH --gres=gpu:4\n') + lines.append('#SBATCH -c 4\n') + lines.append('#SBATCH --mem-per-cpu=0\n') + lines.append('#SBATCH -o {}.out\n'.format(idx)) + lines.append('\n\n') + return lines + +def copy_files_to_environment(subdir): + from plasma.conf import conf + normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) + if os.path.isdir(normalization_dir): + print("Copying normalization to") + os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir))])) From f649f7923033ed52beea5ed8b5f62d45f681a58c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 15 Nov 2017 19:28:12 -0500 Subject: [PATCH 326/744] hyperparameter changes --- examples/tune_hyperparams.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index e721b640..1ac4efb2 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -8,10 +8,11 @@ import numpy as np tunables = [] -shallow = False +shallow = True num_nodes = 2 num_trials = 50 +t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) #for shallow if shallow: @@ -24,22 +25,22 @@ xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) - tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,cut_ends] #target + tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target else: #for DL lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-4) lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) - t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,4.0,16.0]) target = CategoricalHyperparam(['target'],['maxhinge','hinge','ttdinv','ttd']) - batch_size = CategoricalHyperparam(['training','batch_size'],[128,64]) + batch_size = CategoricalHyperparam(['training','batch_size'],[64,256,1024]) dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[5,10]) conv_layers = IntegerHyperparam(['model','num_conv_layers'],2,4) rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,4) rnn_size = CategoricalHyperparam(['model','rnn_size'],[100,200,300]) - tunables = [lr,lr_decay,t_warn,fac,target,batch_size,dropout_prob,cut_ends] #target - tunables += [conv_filters,conv_layers] #,rnn_layers,rnn_size] + tunables = [lr,lr_decay,fac,target,batch_size,dropout_prob] + tunables += [conv_filters,conv_layers,rnn_layers,rnn_size] +tunables += [cut_ends,t_warn] run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) From 9820fed3541a43df50d53f037c0a46c251c9595f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 16 Nov 2017 00:01:38 -0500 Subject: [PATCH 327/744] added new script for submission of single jobs --- examples/learn.py | 2 +- examples/performance_analysis.py | 19 ++++++++-------- examples/submit_batch_job.py | 7 +++--- examples/tune_hyperparams.py | 6 +++--- plasma/conf_parser.py | 3 ++- plasma/utils/batch_jobs.py | 2 +- plasma/utils/performance.py | 37 ++++++++++++++++++++++++++++---- 7 files changed, 52 insertions(+), 24 deletions(-) diff --git a/examples/learn.py b/examples/learn.py index 7da4bba1..c11f5de2 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -16,7 +16,7 @@ from __future__ import print_function import datetime,time,random -import sys +import sys,os import dill from functools import partial diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 0f6ba4fb..8223e429 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -3,7 +3,6 @@ from plasma.utils.performance import * from plasma.conf import conf -print conf['paths'] #mode = 'test' file_num = 0 @@ -39,15 +38,15 @@ analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') #analyzer.example_plots(P_thresh_opt,'test','any') -analyzer.example_plots(P_thresh_opt,'test',['FP']) -analyzer.example_plots(P_thresh_opt,'test',['FN']) -analyzer.example_plots(P_thresh_opt,'test',['TP']) -analyzer.example_plots(P_thresh_opt,'test',['late']) - -analyzer.example_plots(P_thresh_opt,'train',['FP']) -analyzer.example_plots(P_thresh_opt,'train',['FN']) -analyzer.example_plots(P_thresh_opt,'train',['TP']) -analyzer.example_plots(P_thresh_opt,'train',['late']) +analyzer.example_plots(P_thresh_opt,'test',['FP'],extra_filename='test') +analyzer.example_plots(P_thresh_opt,'test',['FN'],extra_filename='test') +analyzer.example_plots(P_thresh_opt,'test',['TP'],extra_filename='test') +analyzer.example_plots(P_thresh_opt,'test',['late'],extra_filename='test') + +analyzer.example_plots(P_thresh_opt,'train',['FP'],extra_filename='train') +analyzer.example_plots(P_thresh_opt,'train',['FN'],extra_filename='train') +analyzer.example_plots(P_thresh_opt,'train',['TP'],extra_filename='train') +analyzer.example_plots(P_thresh_opt,'train',['late'],extra_filename='train') alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index c7c3436e..06d07dbd 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -1,5 +1,4 @@ -from plasma.utils.batch_jobs import generate_conf_file, -generate_working_dirname,start_slurm_job,copy_files_to_environment +from plasma.utils.batch_jobs import get_executable_name,generate_working_dirname,start_slurm_job,copy_files_to_environment from pprint import pprint import yaml import sys,os,getpass @@ -7,7 +6,7 @@ # tunables = [] # shallow = False num_nodes = 2 -num_trials = 5 +num_trials = 1 run_directory = "/tigress/{}/batch_jobs/".format(getpass.getuser()) @@ -33,7 +32,7 @@ def get_conf(template_path,conf_name): os.makedirs(working_directory) #copy conf and executable into directory -executable_name,_ = get_executable_name(shallow) +executable_name,_ = get_executable_name(conf) os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index d895e53d..5cca7c40 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,5 +1,5 @@ from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,IntegerHyperparam -from plasma.primitives.batch_jobs import create_slurm_script,create_sbatch_header,start_slurm_job,generate_working_dirname,copy_files_to_environment +from plasma.utils.batch_jobs import create_slurm_script,create_sbatch_header,start_slurm_job,generate_working_dirname,copy_files_to_environment from pprint import pprint import yaml import sys,os,getpass @@ -58,7 +58,7 @@ def generate_conf_file(tunables,shallow,template_path = "../",save_path = "./",c return conf -def get_executable_name(shallow): +def get_executable_name_imposed_shallow(shallow): from plasma.conf import conf if shallow: executable_name = conf['paths']['shallow_executable'] @@ -73,7 +73,7 @@ def get_executable_name(shallow): working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -executable_name,_ = get_executable_name(shallow) +executable_name,_ = get_executable_name_imposed_shallow(shallow) os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index fc336cb3..83f3fe88 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -39,7 +39,8 @@ def parameters(input_file): params['paths']['saved_shotlist_path'] = params['paths']['base_path'] + '/processed_shotlists/' + params['paths']['data'] + '/shot_lists_signal_group_{}.npz'.format(h) params['paths']['processed_prepath'] = output_path +'/processed_shots/' + 'signal_group_{}/'.format(h) - if params['target'] == 'hinge': + #ensure shallow model has +1 -1 target. + if params['model']['shallow'] or params['target'] == 'hinge': params['data']['target'] = t.HingeTarget elif params['target'] == 'maxhinge': t.MaxHingeTarget.fac = params['data']['positive_example_penalty'] diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index 102837bd..b2ebb5db 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -25,7 +25,7 @@ def get_executable_name(conf): def start_slurm_job(subdir,num_nodes,i,conf,shallow): - executable_name,use_mpi = get_executable_name(shallow) + executable_name,use_mpi = get_executable_name(conf) os.system(" ".join(["cp -p",executable_name,subdir])) script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi) sp.Popen("sbatch "+script,shell=True) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index f7f55019..f906d7ee 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -12,6 +12,7 @@ from plasma.preprocessor.normalize import VarNormalizer as Normalizer from plasma.conf import conf +from plasma.primitives.shots import Shot class PerformanceAnalyzer(): def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_warn = None, verbose = False,pred_ttd=False,conf=None): @@ -561,9 +562,36 @@ def get_prediction_type(self,TP,FP,FN,TN,early,late): elif late: return 'late' + def plot_individual_shot(self,P_thresh_opt,shot_num,normalize=True,plot_signals=True): + success = False + for mode in ['test','train']: + if mode == 'test': + pred = self.pred_test + truth = self.truth_test + is_disruptive = self.disruptive_test + shot_list = self.shot_list_test + else: + pred = self.pred_train + truth = self.truth_train + is_disruptive = self.disruptive_train + shot_list = self.shot_list_train + for i,shot in enumerate(shot_list): + if shot.number == shot_num: + t = truth[i] + p = pred[i] + is_disr = is_disruptive[i] + + TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh_opt,p,t,is_disr) + prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) + print(prediction_type) + self.plot_shot(shot,True,normalize,t,p,P_thresh_opt,prediction_type,extra_filename = '_indiv') + success = True + if not success: + print("Shot {} not found".format(shot_num)) + - def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot = 5,normalize=True,plot_signals=True): + def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot = 5,normalize=True,plot_signals=True,extra_filename=''): if mode == 'test': pred = self.pred_test truth = self.truth_test @@ -590,7 +618,7 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot return if ('any' in types_to_plot or prediction_type in types_to_plot) and plotted < max_plot: if plot_signals: - self.plot_shot(shot,True,normalize,t,p,P_thresh_opt,prediction_type) + self.plot_shot(shot,True,normalize,t,p,P_thresh_opt,prediction_type,extra_filename=extra_filename) else: plt.figure() plt.semilogy((t+0.001)[::-1],label='ground truth') @@ -607,7 +635,7 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot - def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type=''): + def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): if self.normalizer is None and normalize: if self.conf is not None: self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] @@ -661,7 +689,8 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, plt.setp(ax.get_yticklabels(),fontsize=7) # ax.grid() if save_fig: - plt.savefig('sig_fig_{}.png'.format(shot.number),bbox_inches='tight') + plt.savefig('sig_fig_{}{}.png'.format(shot.number,extra_filename),bbox_inches='tight') + np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=prediction,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) plt.close() else: print("Shot hasn't been processed") From 80f4437eb936f9c94384c3189e017606f6107982 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 16 Nov 2017 05:27:27 -0500 Subject: [PATCH 328/744] conf --- examples/conf.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e089d77d..4bc5b0d4 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,14 +3,14 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' -target: 'ttdinv' #'maxhinge' #'maxhinge' #'binary' #'hinge' +target: 'hinge' #'maxhinge' #'maxhinge' #'binary' #'hinge' num_gpus: 4 paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'd3d_data' #'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: 'jet_to_d3d_data' #'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" @@ -37,7 +37,7 @@ data: #maximum TTD considered T_max: 1000.0 #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 10.024 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + T_warning: 1.024 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds current_thresh: 750000 current_end_thresh: 10000 #the characteristic decay length of the decaying moving average window @@ -51,7 +51,7 @@ data: floatx: 'float32' model: - shallow: False + shallow: True shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training type: "xgboost" #"xgboost" #"random_forest" "xgboost" From 5049f57afbab4e6ede9e6b91a26857ed5668307e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 16 Nov 2017 05:45:22 -0500 Subject: [PATCH 329/744] added mlp as shallow model --- examples/conf.yaml | 3 +++ examples/tune_hyperparams.py | 7 +++++-- plasma/models/shallow_runner.py | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 4bc5b0d4..50f6bdeb 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -61,6 +61,9 @@ model: kernel: "rbf" #rbf, sigmoid, linear, poly, for svm learning_rate: 0.1 #xgboost scale_pos_weight: 10.0 #xgboost + final_hidden_layer_size: 10 #final layers has this many neurons, every layer before twice as many + num_hidden_layers: 3 + learning_rate_mlp: 0.0001 skip_train: False #should a finished model be loaded if available #length of LSTM memory pred_length: 200 diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 5cca7c40..dbbbf330 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -14,7 +14,7 @@ #for shallow if shallow: num_nodes = 1 - shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost"]) + shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost","mlp"]) n_estimators = CategoricalHyperparam(['model','shallow_model','n_estimators'],[5,20,50,100,300,1000]) max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[0,3,6,10,30,100]) C = LogContinuousHyperparam(['model','shallow_model','C'],1e-3,1e3) @@ -22,7 +22,10 @@ xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) - tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples] #target + hidden_size = CategoricalHyperparam(['model','final_hidden_layer_size'],[5,10,20]) + hidden_num = CategoricalHyperparam(['model','num_hidden_layers'],[2,4]) + mlp_learning_rate = CategoricalHyperparam(['model','learning_rate_mlp'],[0.001,0.0001,0.00001]) + tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,hidden_num,hidden_size,mlp_learning_rate] #target else: #for DL lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-4) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index def69cf1..ac984a1d 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -315,6 +315,10 @@ def train(conf,shot_list_train,shot_list_validate,loader): learning_rate=model_conf['learning_rate'], n_estimators=model_conf["n_estimators"], scale_pos_weight=model_conf["scale_pos_weight"]) + elif model_conf['type'] == 'mlp': + hidden_layer_sizes = tuple(reversed([model_conf['final_hidden_layer_size']*2**x for x in range(model_conf['num_hidden_layers'])])) + model = MLPClassifier(hidden_layer_sizes = hidden_layer_sizes, + learning_rate_init = model_conf['learning_rate_mlp']) else: print("Unkown model type, exiting.") exit(1) From 35b5c48e971e6e83426a6cb4109eb4761d714142 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 16 Nov 2017 07:01:35 -0500 Subject: [PATCH 330/744] adding multi layer perceptron to shallow models --- examples/conf.yaml | 5 +++-- examples/tune_hyperparams.py | 5 +++-- plasma/models/shallow_runner.py | 4 +++- plasma/utils/batch_jobs.py | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 50f6bdeb..8a575643 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,7 +10,7 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_to_d3d_data' #'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: 'd3d_data_0D' #'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" @@ -54,7 +54,7 @@ model: shallow: True shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training - type: "xgboost" #"xgboost" #"random_forest" "xgboost" + type: "mlp" #"xgboost" #"xgboost" #"random_forest" "xgboost" n_estimators: 100 #for random forest max_depth: 3 #for random forest and xgboost (def = 3) C: 1.0 #for svm @@ -64,6 +64,7 @@ model: final_hidden_layer_size: 10 #final layers has this many neurons, every layer before twice as many num_hidden_layers: 3 learning_rate_mlp: 0.0001 + mlp_regularization: 0.0001 skip_train: False #should a finished model be loaded if available #length of LSTM memory pred_length: 200 diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index dbbbf330..5024106c 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -7,7 +7,7 @@ tunables = [] shallow = True num_nodes = 2 -num_trials = 50 +num_trials = 1 t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) @@ -25,7 +25,8 @@ hidden_size = CategoricalHyperparam(['model','final_hidden_layer_size'],[5,10,20]) hidden_num = CategoricalHyperparam(['model','num_hidden_layers'],[2,4]) mlp_learning_rate = CategoricalHyperparam(['model','learning_rate_mlp'],[0.001,0.0001,0.00001]) - tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,hidden_num,hidden_size,mlp_learning_rate] #target + mlp_regularization = CategoricalHyperparam(['model','mlp_regularization'],[0.1,0.003,0.0001]) + tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,hidden_num,hidden_size,mlp_learning_rate,mlp_regularization] #target else: #for DL lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-4) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index ac984a1d..12d9224f 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -18,6 +18,7 @@ from functools import partial import pathos.multiprocessing as mp from xgboost import XGBClassifier +from sklearn.neural_network import MLPClassifier from plasma.conf import conf from plasma.models.loader import Loader, ProcessGenerator @@ -318,7 +319,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): elif model_conf['type'] == 'mlp': hidden_layer_sizes = tuple(reversed([model_conf['final_hidden_layer_size']*2**x for x in range(model_conf['num_hidden_layers'])])) model = MLPClassifier(hidden_layer_sizes = hidden_layer_sizes, - learning_rate_init = model_conf['learning_rate_mlp']) + learning_rate_init = model_conf['learning_rate_mlp'], + alpha = model_conf['mlp_regularization']) else: print("Unkown model type, exiting.") exit(1) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index b2ebb5db..49e39b4d 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -54,7 +54,7 @@ def create_sbatch_header(num_nodes,use_mpi,idx): assert(num_nodes == 1) lines = [] lines.append('#!/bin/bash\n') - lines.append('#SBATCH -t 04:00:00\n') + lines.append('#SBATCH -t 06:00:00\n') lines.append('#SBATCH -N '+str(num_nodes)+'\n') if use_mpi: lines.append('#SBATCH --ntasks-per-node=4\n') From 7a557438c0460c447f8f25afa31975910e9b1308 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 17 Nov 2017 00:23:17 -0500 Subject: [PATCH 331/744] flexible T_warning for shallow models --- plasma/models/shallow_runner.py | 83 +++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 12d9224f..a4fb02e6 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -90,7 +90,10 @@ def get_save_prepath(self): return save_prepath def process(self,shot): - use_signals = self.loader.conf['paths']['use_signals'] + save_prepath = self.get_save_prepath() + save_path = shot.get_save_path(save_prepath) + if not os.path.exists(save_prepath): + makedirs_process_safe(save_prepath) prepath = self.loader.conf['paths']['processed_prepath'] assert(shot.valid) shot.restore(prepath) @@ -102,50 +105,60 @@ def process(self,shot): self.loader.set_inference_mode(False) # sig,res = self.get_signal_result_from_shot(shot) disr = 1 if shot.is_disruptive else 0 + + + if not os.path.isfile(save_path): + X = self.get_X(shot) + np.savez(save_path,X=X)#,Y=Y,disr=disr + #print(X.shape,Y.shape) + else: + try: + dat = np.load(save_path) + # X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] + X = dat["X"] + except: #data was there but corrupted, save it again + X = self.get_X(shot) + np.savez(save_path,X=X) + + + Y = self.get_Y(shot) + + shot.make_light() + + return X,Y,disr + + def get_X(self,shot): + + use_signals = self.loader.conf['paths']['use_signals'] sig_sample = shot.signals_dict[use_signals[0]] if len(shot.ttd.shape) == 1: shot.ttd = np.expand_dims(shot.ttd,axis=1) - ttd_sample = shot.ttd - timesteps = self.timesteps length = sig_sample.shape[0] - if length < timesteps: + if length < self.timesteps: print(ttd,shot,shot.number) print("Shot must be at least as long as the RNN length.") exit(1) - assert(len(sig_sample.shape) == len(ttd_sample.shape) == 2) - assert(ttd_sample.shape[1] == 1) + assert(len(sig_sample.shape) == len(shot.ttd.shape) == 2) + assert(shot.ttd.shape[1] == 1) X = [] - Y = [] while(len(X) == 0): - for i in range(length-timesteps+1): + for i in range(length-self.timesteps+1): #if np.random.rand() < sample_prob: - x,y = self.get_x_y(i,shot) + x = self.get_x(i,shot) X.append(x) - Y.append(y) X = np.stack(X) - Y = np.stack(Y) - shot.make_light() + return X - return X,Y,disr + def get_Y(self,shot): + if len(shot.ttd.shape) == 1: + shot.ttd = np.expand_dims(shot.ttd,axis=1) + offset = self.timesteps - 1 + return np.round(shot.ttd[offset:,0]).astype(np.int) def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0): - save_prepath = self.get_save_prepath() - save_path = shot.get_save_path(save_prepath) - if not os.path.exists(save_prepath): - makedirs_process_safe(save_prepath) - if not os.path.isfile(save_path): - X,Y,disr = self.process(shot) - np.savez(save_path,X=X,Y=Y,disr=disr) - #print(X.shape,Y.shape) - else: - try: - dat = np.load(save_path) - X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] - except: #data was there but corrupted, save it again - X,Y,disr = self.process(shot) - np.savez(save_path,X=X,Y=Y,disr=disr) + X,Y,disr = self.process(shot) #cut shot ends if we are supposed to if self.loader.conf['data']['cut_shot_ends'] and not is_inference: @@ -170,8 +183,18 @@ def get_x_y(self,timestep,shot): x += [self.extract_features(timestep,shot,sig)] # x = sig[timestep:timestep+timesteps,:] x = np.concatenate(x,axis=0) - y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) - return x,y + return x + + + # def get_x_y(self,timestep,shot): + # x = [] + # use_signals = self.loader.conf['paths']['use_signals'] + # for sig in use_signals: + # x += [self.extract_features(timestep,shot,sig)] + # # x = sig[timestep:timestep+timesteps,:] + # x = np.concatenate(x,axis=0) + # y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) + # return x,y def extract_features(self,timestep,shot,signal): From 4ff40e6a4587352cc49624ad83fa4f08f78c50e3 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 18 Nov 2017 00:55:30 -0500 Subject: [PATCH 332/744] bug in model saving location --- plasma/models/shallow_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index a4fb02e6..f6e00e9f 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -315,7 +315,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): callbacks.on_epoch_begin(0) save_prepath = feature_extractor.get_save_prepath() - model_path = save_prepath + model_filename + model_path = conf['paths']['model_save_path'] #save_prepath + model_filename model_conf = conf['model']['shallow_model'] if not model_conf['skip_train'] or not os.path.isfile(model_path): @@ -381,7 +381,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): def make_predictions(conf,shot_list,loader): feature_extractor = FeatureExtractor(loader) save_prepath = feature_extractor.get_save_prepath() - model_path = save_prepath + model_filename + model_path = conf['paths']['model_save_path']#save_prepath + model_filename model = joblib.load(model_path) #shot_list = shot_list.random_sublist(10) From b7b653b66b957ef3653bbdfbeea27f041cd75fcc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 18 Nov 2017 00:55:57 -0500 Subject: [PATCH 333/744] syntax --- plasma/models/shallow_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index a4fb02e6..a57ecd19 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -176,7 +176,7 @@ def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0) return X,Y,disr - def get_x_y(self,timestep,shot): + def get_x(self,timestep,shot): x = [] use_signals = self.loader.conf['paths']['use_signals'] for sig in use_signals: From 8dedfaea2f6f64dfe3b180e8f8d6746919b19c4e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 18 Nov 2017 04:08:38 -0500 Subject: [PATCH 334/744] make sure hyperparameter tuning is on, so that files like results, normalization etc. get saved in local directory and not globally --- examples/submit_batch_job.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index 06d07dbd..42ec8a82 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -15,9 +15,15 @@ def copy_conf_file(shallow,template_path = "../",save_path = "./",conf_name="conf.yaml"): assert(template_path != save_path) + pathsrc = os.path.join(template_path,conf_name) pathdst = os.path.join(save_path,conf_name) - os.system(" ".join(["cp -p",pathsrc,pathdst])) + + with open(pathsrc, 'r') as yaml_file: + conf = yaml.load(yaml_file) + conf['training']['hyperparam_tuning'] = True #make sure all files like checkpoints and normalization are done locally + with open(pathdst, 'w') as outfile: + yaml.dump(conf, outfile, default_flow_style=False) def get_conf(template_path,conf_name): with open(os.path.join(template_path,conf_name), 'r') as yaml_file: From 3f70621e70d8e89202304e0184e2838a6ef1b77a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 18 Nov 2017 09:27:41 -0500 Subject: [PATCH 335/744] creating model directory --- plasma/models/shallow_runner.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index f94de79c..32c97af4 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -315,7 +315,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): callbacks.on_epoch_begin(0) save_prepath = feature_extractor.get_save_prepath() - model_path = conf['paths']['model_save_path'] #save_prepath + model_filename + model_path = conf['paths']['model_save_path'] + model_filename #save_prepath + model_filename + makedirs_process_safe(conf['paths']['model_save_path']) model_conf = conf['model']['shallow_model'] if not model_conf['skip_train'] or not os.path.isfile(model_path): @@ -381,7 +382,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): def make_predictions(conf,shot_list,loader): feature_extractor = FeatureExtractor(loader) save_prepath = feature_extractor.get_save_prepath() - model_path = conf['paths']['model_save_path']#save_prepath + model_filename + model_path = conf['paths']['model_save_path'] + model_filename#save_prepath + model_filename model = joblib.load(model_path) #shot_list = shot_list.random_sublist(10) From b5a1902502443fa31030e47bd0011fbd101bd86f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 18 Nov 2017 09:35:43 -0500 Subject: [PATCH 336/744] max depth as 0 for XGBoost but None for decision trees --- plasma/models/shallow_runner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 32c97af4..19954000 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -336,7 +336,10 @@ def train(conf,shot_list_train,shot_list_validate,loader): class_weight=scale_pos_weight_dict, n_jobs=-1) elif model_conf['type'] == "xgboost": - model = XGBClassifier(max_depth=model_conf["max_depth"], + max_depth = model_conf["max_depth"] + if max_depth == None: + max_depth = 0 + model = XGBClassifier(max_depth=max_depth, learning_rate=model_conf['learning_rate'], n_estimators=model_conf["n_estimators"], scale_pos_weight=model_conf["scale_pos_weight"]) From 78066e94bc6d0079b9141c13e94b8d50a121c224 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 14:57:03 -0500 Subject: [PATCH 337/744] Disable hash randomisation when labeling preprocessing and normalization folders with hash (otherwise recomputes indefinitely in some cases) --- examples/guarantee_preprocessed.py | 2 ++ examples/mpi_learn.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index 67826ad0..7c1eefb3 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -11,6 +11,8 @@ pprint(conf) from plasma.preprocessor.preprocess import guarantee_preprocessed +os.environ["PYTHONHASHSEED"] = 0 + ##################################################### ####################PREPROCESSING#################### ##################################################### diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index a965a86b..0b470dfd 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -24,6 +24,8 @@ import random import numpy as np +os.environ["PYTHONHASHSEED"] = 0 + import matplotlib matplotlib.use('Agg') From 841fffc9b98ab1dd5752a7e11f340077b8ee75db Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 14:58:13 -0500 Subject: [PATCH 338/744] Use str not int when setting env during runtime --- examples/guarantee_preprocessed.py | 2 +- examples/mpi_learn.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index 7c1eefb3..3f005f0e 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -11,7 +11,7 @@ pprint(conf) from plasma.preprocessor.preprocess import guarantee_preprocessed -os.environ["PYTHONHASHSEED"] = 0 +os.environ["PYTHONHASHSEED"] = "0" ##################################################### ####################PREPROCESSING#################### diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 0b470dfd..e6fd6503 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -24,7 +24,7 @@ import random import numpy as np -os.environ["PYTHONHASHSEED"] = 0 +os.environ["PYTHONHASHSEED"] = "0" import matplotlib matplotlib.use('Agg') From 8da37ce37cb239ffa9bee3f6ef5f690d917c051a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 20:45:11 -0500 Subject: [PATCH 339/744] Add anaconda env name config parameter with default --- examples/conf.yaml | 2 ++ examples/submit_batch_job.py | 2 +- examples/tune_hyperparams.py | 6 +++--- plasma/utils/batch_jobs.py | 8 ++++---- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 8a575643..de91be0c 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -123,3 +123,5 @@ callbacks: monitor: 'val_roc' patience: 5 write_grads: False +env: + name: 'frnn' diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index 42ec8a82..2daf0033 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -52,6 +52,6 @@ def get_conf(template_path,conf_name): print("Making modified conf") copy_conf_file(shallow,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf,shallow) + start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name']) print("submitted {} jobs.".format(num_trials)) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 5024106c..4c955003 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -5,9 +5,9 @@ import sys,os,getpass tunables = [] -shallow = True +shallow = False num_nodes = 2 -num_trials = 1 +num_trials = 2 t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) @@ -91,6 +91,6 @@ def get_executable_name_imposed_shallow(shallow): print("Making modified conf") conf = generate_conf_file(tunables,shallow,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf,shallow) + start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name']) print("submitted {} jobs.".format(num_trials)) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index 49e39b4d..fa88a06c 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -24,13 +24,13 @@ def get_executable_name(conf): return executable_name,use_mpi -def start_slurm_job(subdir,num_nodes,i,conf,shallow): +def start_slurm_job(subdir,num_nodes,i,conf,shallow,env_name="frnn"): executable_name,use_mpi = get_executable_name(conf) os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi) + script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi,env_name) sp.Popen("sbatch "+script,shell=True) -def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi): +def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn"): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename user = getpass.getuser() @@ -39,7 +39,7 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi): for line in sbatch_header: f.write(line) f.write('module load anaconda\n') - f.write('source activate frnn\n') + f.write('source activate '+env_name+'\n') f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) From 8601dcde0aa4b366774e0913fd71ee95cde2c584 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 20:48:11 -0500 Subject: [PATCH 340/744] Disable PYTHONHASHSEED at the start --- plasma/utils/batch_jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index fa88a06c..cb0791c0 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -44,7 +44,7 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="f # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') - f.write('srun python {}\n'.format(executable_name)) + f.write('srun env PYTHONHASHSEED=0 python {}\n'.format(executable_name)) f.write('echo "done."') return filepath From c9d37d50ba8c0dd5e03ad93971b3b6447598491e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 20:54:04 -0500 Subject: [PATCH 341/744] Add env type config parameter with default Anaconda --- examples/conf.yaml | 1 + examples/submit_batch_job.py | 2 +- examples/tune_hyperparams.py | 2 +- plasma/utils/batch_jobs.py | 8 ++++---- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index de91be0c..cd8b6247 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -125,3 +125,4 @@ callbacks: write_grads: False env: name: 'frnn' + type: 'anaconda' diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index 2daf0033..7f13f23c 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -52,6 +52,6 @@ def get_conf(template_path,conf_name): print("Making modified conf") copy_conf_file(shallow,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name']) + start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name'],conf['env']['type']) print("submitted {} jobs.".format(num_trials)) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 4c955003..936c5dfc 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -91,6 +91,6 @@ def get_executable_name_imposed_shallow(shallow): print("Making modified conf") conf = generate_conf_file(tunables,shallow,working_directory,subdir,conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name']) + start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name'],conf['env']['type']) print("submitted {} jobs.".format(num_trials)) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index cb0791c0..e667af2f 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -24,13 +24,13 @@ def get_executable_name(conf): return executable_name,use_mpi -def start_slurm_job(subdir,num_nodes,i,conf,shallow,env_name="frnn"): +def start_slurm_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="anaconda"): executable_name,use_mpi = get_executable_name(conf) os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi,env_name) + script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi,env_name,env_type) sp.Popen("sbatch "+script,shell=True) -def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn"): +def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn",env_type="anaconda"): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename user = getpass.getuser() @@ -38,7 +38,7 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="f with open(filepath,"w") as f: for line in sbatch_header: f.write(line) - f.write('module load anaconda\n') + f.write('module load '+env_type+'\n') f.write('source activate '+env_name+'\n') f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) From d3f9f397fdc1306a8db4757facd8e5943eac9b3a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 21:06:52 -0500 Subject: [PATCH 342/744] Initial set of cunctions for PBS --- plasma/utils/batch_jobs.py | 46 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index e667af2f..e01b2291 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -30,11 +30,19 @@ def start_slurm_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="an script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi,env_name,env_type) sp.Popen("sbatch "+script,shell=True) + +def start_pbs_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="anaconda"): + executable_name,use_mpi = get_executable_name(conf) + os.system(" ".join(["cp -p",executable_name,subdir])) + script = create_pbs_script(subdir,num_nodes,i,executable_name,use_mpi,env_name,env_type) + sp.Popen("qsub "+script,shell=True) + + def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn",env_type="anaconda"): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename user = getpass.getuser() - sbatch_header = create_sbatch_header(num_nodes,use_mpi,idx) + sbatch_header = create_slurm_header(num_nodes,use_mpi,idx) with open(filepath,"w") as f: for line in sbatch_header: f.write(line) @@ -49,7 +57,27 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="f return filepath -def create_sbatch_header(num_nodes,use_mpi,idx): +def create_pbs_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn",env_type="anaconda"): + filename = "run_{}_nodes.cmd".format(num_nodes) + filepath = subdir+filename + user = getpass.getuser() + sbatch_header = create_pbs_header(num_nodes,use_mpi,idx) + with open(filepath,"w") as f: + for line in sbatch_header: + f.write(line) + #f.write('export HOME=/lustre/atlas/proj-shared/fus117\n') + #f.write('cd $HOME/PPPL/plasma-python/examples\n') + f.write('source $MODULESHOME/init/bash\n') + f.write('module load tensorflow\n') + # f.write('rm $HOME/tigress/alexeys/model_checkpoints/*\n') + f.write('cd {}\n'.format(subdir)) + f.write('aprun -n {} -N1 env PYTHONHASHSEED=0 env KERAS_HOME={} singularity exec $TENSORFLOW_CONTAINER python3 {}\n'.format(str(num_nodes),subdir,executable_name)) + f.write('echo "done."') + + return filepath + + +def create_slurm_header(num_nodes,use_mpi,idx): if not use_mpi: assert(num_nodes == 1) lines = [] @@ -69,6 +97,20 @@ def create_sbatch_header(num_nodes,use_mpi,idx): lines.append('\n\n') return lines +def create_pbs_header(num_nodes,use_mpi,idx): + if not use_mpi: + assert(num_nodes == 1) + lines = [] + lines.append('#!/bin/bash\n') + + lines.append('#PBS -A FUS117\n') + lines.append('#PBS -l walltime=02:00:00\n') + lines.append('#PBS -l nodes='+str(num_nodes)+'\n') + lines.append('#PBS -o {}.out\n'.format(idx)) + lines.append('\n\n') + return lines + + def copy_files_to_environment(subdir): from plasma.conf import conf normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) From 06be85140e06c07d60823b807a511925a4055999 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 21:19:19 -0500 Subject: [PATCH 343/744] sbatch -> slurm --- examples/tune_hyperparams.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 936c5dfc..6a9d11a0 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,5 +1,5 @@ from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,IntegerHyperparam -from plasma.utils.batch_jobs import create_slurm_script,create_sbatch_header,start_slurm_job,generate_working_dirname,copy_files_to_environment +from plasma.utils.batch_jobs import create_slurm_script,create_slurm_header,start_slurm_job,generate_working_dirname,copy_files_to_environment from pprint import pprint import yaml import sys,os,getpass From 0868bdddce72a9006da7b1b8ea2e534ff3cf2e9e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 21:22:03 -0500 Subject: [PATCH 344/744] Do not hardcode directory names --- examples/submit_batch_job.py | 2 +- examples/tune_hyperparams.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index 7f13f23c..2ee87721 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -9,7 +9,7 @@ num_trials = 1 -run_directory = "/tigress/{}/batch_jobs/".format(getpass.getuser()) +run_directory = "{}/{}/batch_jobs/".format(conf['fs_path'],getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 6a9d11a0..13e267c9 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -44,7 +44,7 @@ tunables += [cut_ends,t_warn] -run_directory = "/tigress/{}/hyperparams/".format(getpass.getuser()) +run_directory = "{}/{}/hyperparams/".format(conf['fs_path'],getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" From 663c0e5c9c0baf7833023d688ca8f5a3369e8b53 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 20 Nov 2017 21:32:32 -0500 Subject: [PATCH 345/744] Import conf --- examples/submit_batch_job.py | 3 ++- examples/tune_hyperparams.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index 2ee87721..d13f8213 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -2,6 +2,7 @@ from pprint import pprint import yaml import sys,os,getpass +import plasma.conf # tunables = [] # shallow = False @@ -9,7 +10,7 @@ num_trials = 1 -run_directory = "{}/{}/batch_jobs/".format(conf['fs_path'],getpass.getuser()) +run_directory = "{}/{}/batch_jobs/".format(plasma.conf.conf['fs_path'],getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 13e267c9..dd4801d9 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -3,6 +3,7 @@ from pprint import pprint import yaml import sys,os,getpass +import plasma.conf tunables = [] shallow = False @@ -44,7 +45,7 @@ tunables += [cut_ends,t_warn] -run_directory = "{}/{}/hyperparams/".format(conf['fs_path'],getpass.getuser()) +run_directory = "{}/{}/hyperparams/".format(plasma.conf.conf['fs_path'],getpass.getuser()) template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) conf_name = "conf.yaml" From 8533eec499d93ba0d555e32f7bcce536ac6ae350 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 20 Nov 2017 21:35:05 -0500 Subject: [PATCH 346/744] add option to predict from custom path for shallow and deep models --- examples/learn.py | 18 +++++++++++++----- plasma/models/runner.py | 8 ++++---- plasma/models/shallow_runner.py | 11 +++++++---- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/examples/learn.py b/examples/learn.py index c11f5de2..14eae8fb 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -62,6 +62,13 @@ np.random.seed(0) random.seed(0) + +only_predict = len(sys.argv) > 1 +custom_path = None +if only_predict: + custom_path = sys.argv[1] + print("predicting using path {}".format(custom_path)) + ##################################################### ####################PREPROCESSING#################### ##################################################### @@ -83,9 +90,10 @@ ######################TRAINING####################### ##################################################### #train(conf,shot_list_train,loader) -p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) -p.start() -p.join() +if not only_predict: + p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) + p.start() + p.join() ##################################################### ####################PREDICTING####################### @@ -109,8 +117,8 @@ # y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) # y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) -y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) -y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = make_predictions_and_evaluate_gpu(conf,shot_list_test,loader) +y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader,custom_path) +y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = make_predictions_and_evaluate_gpu(conf,shot_list_test,loader,custom_path) print('=========Summary========') print('Train Loss: {:.3e}'.format(loss_train)) print('Train ROC: {:.4f}'.format(roc_train)) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 2c759812..11f3ff3d 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -366,7 +366,7 @@ def make_single_prediction(shot,specific_builder,loader,model_save_path): return y_p,y,is_disruptive -def make_predictions_gpu(conf,shot_list,loader): +def make_predictions_gpu(conf,shot_list,loader,custom_path=None): loader.set_inference_mode(True) if backend == 'tf' or backend == 'tensorflow': @@ -392,7 +392,7 @@ def make_predictions_gpu(conf,shot_list,loader): model = specific_builder.build_model(True) model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) - specific_builder.load_model_weights(model) + specific_builder.load_model_weights(model,custom_path) model.reset_states() pbar = Progbar(len(shot_list)) @@ -422,8 +422,8 @@ def make_predictions_gpu(conf,shot_list,loader): -def make_predictions_and_evaluate_gpu(conf,shot_list,loader): - y_prime,y_gold,disruptive = make_predictions_gpu(conf,shot_list,loader) +def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path=None): + y_prime,y_gold,disruptive = make_predictions_gpu(conf,shot_list,loader,custom_path) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 19954000..140454cc 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -382,10 +382,13 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('...done') -def make_predictions(conf,shot_list,loader): +def make_predictions(conf,shot_list,loader,custom_path=None): feature_extractor = FeatureExtractor(loader) save_prepath = feature_extractor.get_save_prepath() - model_path = conf['paths']['model_save_path'] + model_filename#save_prepath + model_filename + if custom_path == None: + model_path = conf['paths']['model_save_path'] + model_filename#save_prepath + model_filename + else: + model_path = custom_path model = joblib.load(model_path) #shot_list = shot_list.random_sublist(10) @@ -420,8 +423,8 @@ def predict_single_shot(shot,model,feature_extractor): -def make_predictions_and_evaluate_gpu(conf,shot_list,loader): - y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader) +def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) From 8e21c813102a8098a0adfbf421d677ebe269a091 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 20 Nov 2017 21:38:15 -0500 Subject: [PATCH 347/744] small bug fix for conflicting conf files in performance anlaysis --- examples/performance_analysis.py | 3 ++- examples/tune_hyperparams.py | 14 +++++++------- plasma/utils/performance.py | 2 ++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 8223e429..af2d6fae 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -16,7 +16,7 @@ # if cut_shot_ends: # T_max_warn = T_max_warn-T_min_warn # T_min_warn = 0 -T_min_warn = 30 #None #take value from conf #30 +T_min_warn = 10 #None #take value from conf #30 verbose=False if len(sys.argv) > 1: @@ -43,6 +43,7 @@ analyzer.example_plots(P_thresh_opt,'test',['TP'],extra_filename='test') analyzer.example_plots(P_thresh_opt,'test',['late'],extra_filename='test') +analyzer.example_plots(P_thresh_opt,'train',['TN'],extra_filename='train') analyzer.example_plots(P_thresh_opt,'train',['FP'],extra_filename='train') analyzer.example_plots(P_thresh_opt,'train',['FN'],extra_filename='train') analyzer.example_plots(P_thresh_opt,'train',['TP'],extra_filename='train') diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 5024106c..af3039a0 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -7,7 +7,7 @@ tunables = [] shallow = True num_nodes = 2 -num_trials = 1 +num_trials = 50 t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) @@ -16,16 +16,16 @@ num_nodes = 1 shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost","mlp"]) n_estimators = CategoricalHyperparam(['model','shallow_model','n_estimators'],[5,20,50,100,300,1000]) - max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[0,3,6,10,30,100]) + max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[None,3,6,10,30,100]) C = LogContinuousHyperparam(['model','shallow_model','C'],1e-3,1e3) kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) - num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[10000,100000,1000000,1e7]) - hidden_size = CategoricalHyperparam(['model','final_hidden_layer_size'],[5,10,20]) - hidden_num = CategoricalHyperparam(['model','num_hidden_layers'],[2,4]) - mlp_learning_rate = CategoricalHyperparam(['model','learning_rate_mlp'],[0.001,0.0001,0.00001]) - mlp_regularization = CategoricalHyperparam(['model','mlp_regularization'],[0.1,0.003,0.0001]) + num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[30000,100000,1000000,2000000]) + hidden_size = CategoricalHyperparam(['model','shallow_model','final_hidden_layer_size'],[5,10,20]) + hidden_num = CategoricalHyperparam(['model','shallow_model','num_hidden_layers'],[2,4]) + mlp_learning_rate = CategoricalHyperparam(['model','shallow_model','learning_rate_mlp'],[0.001,0.0001,0.00001]) + mlp_regularization = CategoricalHyperparam(['model','shallow_model','mlp_regularization'],[0.1,0.003,0.0001]) tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,hidden_num,hidden_size,mlp_learning_rate,mlp_regularization] #target else: #for DL diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index f906d7ee..1777c439 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -345,6 +345,7 @@ def load_ith_file(self): self.shot_list_test = dat['shot_list_test'][()] self.shot_list_train = dat['shot_list_train'][()] self.saved_conf = dat['conf'][()] + self.conf['data']['T_warning'] = self.saved_conf['data']['T_warning'] #all files must agree on T_warning due to output of truth vs. normalized shot ttd. for mode in ['test','train']: print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) self.print_conf() @@ -654,6 +655,7 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, use_signals = self.saved_conf['paths']['use_signals'] f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) plt.title(prediction_type) + #all files must agree on T_warning due to output of truth vs. normalized shot ttd. assert(np.all(shot.ttd.flatten() == truth.flatten())) for i,sig in enumerate(use_signals): num_channels = sig.num_channels From 04d07997642b08d004a6502f025828d3d3d77253 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 20 Nov 2017 22:06:32 -0500 Subject: [PATCH 348/744] copying normalization from global value --- plasma/conf_parser.py | 3 ++- plasma/utils/batch_jobs.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 83f3fe88..9455664a 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -23,6 +23,7 @@ def parameters(input_file): params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path h = get_unique_signal_hash(all_signals.values()) + params['paths']['global_normalizer_path'] = output_path + '/normalization/normalization_signal_group_{}.npz'.format(h) if params['training']['hyperparam_tuning']: # params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' params['paths']['normalizer_path'] = './normalization/normalization_signal_group_{}.npz'.format(h) @@ -31,7 +32,7 @@ def parameters(input_file): params['paths']['results_prepath'] = './results/' else: # params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' - params['paths']['normalizer_path'] = output_path + '/normalization/normalization_signal_group_{}.npz'.format(h) + params['paths']['normalizer_path'] = params['paths']['global_normalizer_path'] params['paths']['model_save_path'] = output_path + '/model_checkpoints/' params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['results_prepath'] = output_path + '/results/' diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index e01b2291..977a2ca5 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -82,7 +82,7 @@ def create_slurm_header(num_nodes,use_mpi,idx): assert(num_nodes == 1) lines = [] lines.append('#!/bin/bash\n') - lines.append('#SBATCH -t 06:00:00\n') + lines.append('#SBATCH -t 01:00:00\n') lines.append('#SBATCH -N '+str(num_nodes)+'\n') if use_mpi: lines.append('#SBATCH --ntasks-per-node=4\n') @@ -113,7 +113,7 @@ def create_pbs_header(num_nodes,use_mpi,idx): def copy_files_to_environment(subdir): from plasma.conf import conf - normalization_dir = os.path.dirname(conf['paths']['normalizer_path']) + normalization_dir = os.path.dirname(conf['paths']['global_normalizer_path']) if os.path.isdir(normalization_dir): print("Copying normalization to") os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir))])) From 3c273df5ed9c19ef1ed219084152006c78959446 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 21 Nov 2017 00:34:15 -0500 Subject: [PATCH 349/744] better plotting --- plasma/utils/performance.py | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index f906d7ee..978874eb 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -633,6 +633,89 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot plt.savefig('fig_{}.png'.format(shot.number),bbox_inches='tight') plotted += 1 +def plot_shot1(shot,use_signals,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='', + T_min_warn=T_min_warn,T_max_warn=T_max_warn): + if self.normalizer is None and normalize: + if self.conf is not None: + self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] + nn = Normalizer(self.saved_conf) + nn.train() + self.normalizer = nn + self.normalizer.set_inference_mode(True) + + if(shot.previously_saved(self.shots_dir)): + shot.restore(self.shots_dir) + t_disrupt = shot.t_disrupt + is_disruptive = shot.is_disruptive + if normalize: + self.normalizer.apply(shot) + + use_signals = self.saved_conf['paths']['use_signals'] + fontsize= 15 + lower_lim = 0 #len(pred) + plt.close() + colors = ["b","k"] + lss = ["-","--"] + f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False) + assert(np.all(shot.ttd.flatten() == truth.flatten())) + xx = range(len(pred)) #list(reversed(range(len(pred)))) + for i,sig in enumerate(use_signals): + ax = axarr[i] + num_channels = sig.num_channels + sig_arr = shot.signals_dict[sig] + if num_channels == 1: + # if j == 0: + ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j]) + # else: + # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) + ax.plot([],linestyle="none",label = sig.description)#labels[sig]) + if np.min(sig_arr[:,0]) < 0: + ax.set_ylim([-6,6]) + ax.set_yticks([-5,0,5]) + else: + ax.set_ylim([0,8]) + ax.set_yticks([0,5]) + # ax.set_ylabel(labels[sig],size=fontsize) + else: + ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description,cmap="inferno" ) + ax.set_ylim([0,num_channels]) + ax.text(lower_lim+200, 45, sig.description, bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize-5) + ax.set_yticks([0,num_channels/2]) + ax.set_yticklabels(["0","0.5"]) + ax.set_ylabel("$\\rho$",size=fontsize) + ax.legend(loc="best",labelspacing=0.1,fontsize=fontsize,frameon=False) + ax.axvline(len(truth)-T_min_warn,color='r',linewidth=0.5) + plt.setp(ax.get_xticklabels(),visible=False) + plt.setp(ax.get_yticklabels(),fontsize=fontsize) + f.subplots_adjust(hspace=0) + #print(sig) + #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) + ax = axarr[-1] + # ax.semilogy((-truth+0.0001),label='ground truth') + # ax.plot(-prediction+0.0001,'g',label='neural net prediction') + # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') + # nn = np.min(pred) + ax.plot(xx,truth,'g',label='target',linewidth=2) + # ax.axhline(0.4,linestyle="--",color='k',label='threshold') + ax.plot(xx,prediction,'b',label='RNN output',linewidth=2) + ax.axhline(P_thresh_opt,linestyle="--",color='k',label='threshold') + ax.set_ylim([-2,2]) + ax.set_yticks([-1,0,1]) + # if len(truth)-T_max_warn >= 0: + # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time') + ax.axvline(len(truth)-T_min_warn,color='r',linewidth=0.5)#,label='min warning time') + ax.set_xlabel('T [ms]',size=fontsize) + # ax.axvline(2400) + ax.legend(loc = (0.5,0.7),fontsize=fontsize-5,labelspacing=0.1,frameon=False) + plt.setp(ax.get_yticklabels(),fontsize=fontsize) + plt.setp(ax.get_xticklabels(),fontsize=fontsize) + # plt.xlim(0,200) + plt.xlim([lower_lim,len(truth)]) + # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") + plt.show() + else: + print("Shot hasn't been processed") + def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): From 1e3823b2c5e18f1469483b03f85d8e6a5ba44902 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 21 Nov 2017 00:34:57 -0500 Subject: [PATCH 350/744] merging --- plasma/utils/performance.py | 46 +++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 1777c439..e2e8cf7f 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -2,7 +2,7 @@ import matplotlib matplotlib.use('Agg')#for machines that don't have a display from matplotlib import rc -rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) +rc('font',**{'family':'serif','sans-serif':['Times']}) rc('text', usetex=True) import matplotlib.pyplot as plt import os @@ -380,7 +380,8 @@ def get_num_disruptive_shots(self,mode): return sum(self.disruptive_train) - def hist_alarms(self,alarms,title_str='alarms',save_figure=False): + def hist_alarms(self,alarms,title_str='alarms',save_figure=False,linestyle='-'): + fontsize=15 T_min_warn = self.T_min_warn T_max_warn = self.T_max_warn if len(alarms) > 0: @@ -394,21 +395,23 @@ def hist_alarms(self,alarms,title_str='alarms',save_figure=False): #bins=linspace(min(alarms),max(alarms),100) # hist(alarms,bins=bins,alpha=1.0,histtype='step',normed=True,log=False,cumulative=-1) # - plt.step(np.concatenate((alarms[::-1], alarms[[0]])), 1.0*np.arange(alarms.size+1)/(alarms.size)) + plt.step(np.concatenate((alarms[::-1], alarms[[0]])), 1.0*np.arange(alarms.size+1)/(alarms.size),linestyle=linestyle,linewidth=1.5) plt.gca().set_xscale('log') - plt.axvline(T_min_warn,color='r') + plt.axvline(T_min_warn,color='r',linewidth=0.5) if T_max_warn < np.max(alarms): plt.axvline(T_max_warn,color='r') - plt.xlabel('TTD [s]') - plt.ylabel('Accumulated fraction of detected disruptions') - plt.xlim([1e-4,max(alarms)*10]) + plt.xlabel('Time to disruption [s]',size=fontsize) + plt.ylabel('Fraction of detected disruptions',size=fontsize) + plt.xlim([1e-4,4e1])#max(alarms)*10]) plt.ylim([0,1]) plt.grid() plt.title(title_str) + plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize) + plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize) plt.show() if save_figure: - plt.savefig('accum_disruptions.png',bbox_inches='tight') + plt.savefig('accum_disruptions.png',dpi=200,bbox_inches='tight') else: print(title_str + ": No alarms!") @@ -544,10 +547,10 @@ def compute_tradeoffs_and_print_from_training(self): return P_thresh_ret - def compute_tradeoffs_and_plot(self,mode,save_figure=True,plot_string=''): + def compute_tradeoffs_and_plot(self,mode,save_figure=True,plot_string='',linestyle="-"): correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = self.get_metrics_vs_p_thresh(mode) - self.tradeoff_plot(accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=save_figure,plot_string=plot_string) + self.tradeoff_plot(accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=save_figure,plot_string=plot_string,linestyle=linestyle) def get_prediction_type(self,TP,FP,FN,TN,early,late): if TP: @@ -698,42 +701,45 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, print("Shot hasn't been processed") - def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=False,plot_string=''): + def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=False,plot_string='',linestyle="-"): + fontsize=15 plt.figure() P_thresh_range = self.get_p_thresh_range() # semilogx(P_thresh_range,accuracy_range,label="accuracy") if self.pred_ttd: - plt.semilogx(abs(P_thresh_range[::-1]),missed_range,'r',label="missed") - plt.plot(abs(P_thresh_range[::-1]),fp_range,'k',label="false positives") + plt.semilogx(abs(P_thresh_range[::-1]),missed_range,'r',label="missed",linestyle=linestyle) + plt.plot(abs(P_thresh_range[::-1]),fp_range,'k',label="false positives",linestyle=linestyle) else: - plt.plot(P_thresh_range,missed_range,'r',label="missed") - plt.plot(P_thresh_range,fp_range,'k',label="false positives") + plt.plot(P_thresh_range,missed_range,'r',label="missed",linestyle=linestyle) + plt.plot(P_thresh_range,fp_range,'k',label="false positives",linestyle=linestyle) # plot(P_thresh_range,early_alarm_range,'c',label="early alarms") plt.legend(loc=(1.0,.6)) - plt.xlabel('Alarm threshold') + plt.xlabel('Alarm threshold',size=fontsize) plt.grid() title_str = 'metrics{}'.format(plot_string.replace('_',' ')) plt.title(title_str) if save_figure: plt.savefig(title_str + '.png',bbox_inches='tight') plt.close('all') - plt.plot(fp_range,1-missed_range,'-b') + plt.plot(fp_range,1-missed_range,'-b',linestyle=linestyle) ax = plt.gca() - plt.xlabel('FP rate') - plt.ylabel('TP rate') + plt.xlabel('FP rate',size=fontsize) + plt.ylabel('TP rate',size=fontsize) major_ticks = np.arange(0,1.01,0.2) minor_ticks = np.arange(0,1.01,0.05) ax.set_xticks(major_ticks) ax.set_yticks(major_ticks) ax.set_xticks(minor_ticks,minor=True) ax.set_yticks(minor_ticks,minor=True) + plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize) + plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize) ax.grid(which='both') ax.grid(which='major',alpha=0.5) ax.grid(which='minor',alpha=0.3) plt.xlim([0,1]) plt.ylim([0,1]) if save_figure: - plt.savefig(title_str + '_roc.png',bbox_inches='tight') + plt.savefig(title_str + '_roc.png',bbox_inches='tight',dpi=200) print('ROC area ({}) is {}'.format(plot_string,self.roc_from_missed_fp(missed_range,fp_range))) From be44a63d4dc88e677e376ce59b3f743b96292784 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 24 Nov 2017 03:06:42 -0500 Subject: [PATCH 351/744] ability to find out prediction type from a single shot --- plasma/utils/performance.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index f93849b9..fb4d4f94 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -591,6 +591,27 @@ def plot_individual_shot(self,P_thresh_opt,shot_num,normalize=True,plot_signals= print("Shot {} not found".format(shot_num)) + def get_prediction_type_for_individual_shot(self,P_thresh,shot,mode='test'): + if mode == 'test': + pred = self.pred_test + truth = self.truth_test + is_disruptive = self.disruptive_test + shot_list = self.shot_list_test + else: + pred = self.pred_train + truth = self.truth_train + is_disruptive = self.disruptive_train + shot_list = self.shot_list_train + i = shot_list.index(shot) + t = truth[i] + p = pred[i] + is_disr = is_disruptive[i] + shot = shot_list.shots[i] + + TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh_opt,p,t,is_disr) + prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) + return prediction_type + def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot = 5,normalize=True,plot_signals=True,extra_filename=''): if mode == 'test': From 48ca3793ef55660dae6883c67dc1a80b73c61a5c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 24 Nov 2017 03:08:11 -0500 Subject: [PATCH 352/744] better plotting --- plasma/utils/performance.py | 169 ++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 83 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 1591f43e..45cbfeac 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -399,8 +399,8 @@ def hist_alarms(self,alarms,title_str='alarms',save_figure=False,linestyle='-'): plt.gca().set_xscale('log') plt.axvline(T_min_warn,color='r',linewidth=0.5) - if T_max_warn < np.max(alarms): - plt.axvline(T_max_warn,color='r') + #if T_max_warn < np.max(alarms): + # plt.axvline(T_max_warn,color='r',linewidth=0.5) plt.xlabel('Time to disruption [s]',size=fontsize) plt.ylabel('Fraction of detected disruptions',size=fontsize) plt.xlim([1e-4,4e1])#max(alarms)*10]) @@ -637,92 +637,95 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot plt.savefig('fig_{}.png'.format(shot.number),bbox_inches='tight') plotted += 1 -def plot_shot1(shot,use_signals,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='', - T_min_warn=T_min_warn,T_max_warn=T_max_warn): - if self.normalizer is None and normalize: - if self.conf is not None: - self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] - nn = Normalizer(self.saved_conf) - nn.train() - self.normalizer = nn - self.normalizer.set_inference_mode(True) - - if(shot.previously_saved(self.shots_dir)): - shot.restore(self.shots_dir) - t_disrupt = shot.t_disrupt - is_disruptive = shot.is_disruptive - if normalize: - self.normalizer.apply(shot) - - use_signals = self.saved_conf['paths']['use_signals'] - fontsize= 15 - lower_lim = 0 #len(pred) - plt.close() - colors = ["b","k"] - lss = ["-","--"] - f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False) - assert(np.all(shot.ttd.flatten() == truth.flatten())) - xx = range(len(pred)) #list(reversed(range(len(pred)))) - for i,sig in enumerate(use_signals): - ax = axarr[i] - num_channels = sig.num_channels - sig_arr = shot.signals_dict[sig] - if num_channels == 1: - # if j == 0: - ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j]) - # else: - # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) - ax.plot([],linestyle="none",label = sig.description)#labels[sig]) - if np.min(sig_arr[:,0]) < 0: - ax.set_ylim([-6,6]) - ax.set_yticks([-5,0,5]) + def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): + if self.normalizer is None and normalize: + if self.conf is not None: + self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] + nn = Normalizer(self.saved_conf) + nn.train() + self.normalizer = nn + self.normalizer.set_inference_mode(True) + + if(shot.previously_saved(self.shots_dir)): + shot.restore(self.shots_dir) + t_disrupt = shot.t_disrupt + is_disruptive = shot.is_disruptive + if normalize: + self.normalizer.apply(shot) + + use_signals = self.saved_conf['paths']['use_signals'] + fontsize= 15 + lower_lim = 0 #len(pred) + plt.close() + colors = ["b","k"] + lss = ["-","--"] + f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False) + plt.title(prediction_type) + assert(np.all(shot.ttd.flatten() == truth.flatten())) + xx = range(len(prediction)) #list(reversed(range(len(pred)))) + for i,sig in enumerate(use_signals): + ax = axarr[i] + num_channels = sig.num_channels + sig_arr = shot.signals_dict[sig] + if num_channels == 1: + # if j == 0: + ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j]) + # else: + # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) + ax.plot([],linestyle="none",label = sig.description)#labels[sig]) + if np.min(sig_arr[:,0]) < 0: + ax.set_ylim([-6,6]) + ax.set_yticks([-5,0,5]) + else: + ax.set_ylim([0,8]) + ax.set_yticks([0,5]) + # ax.set_ylabel(labels[sig],size=fontsize) else: - ax.set_ylim([0,8]) - ax.set_yticks([0,5]) - # ax.set_ylabel(labels[sig],size=fontsize) - else: - ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description,cmap="inferno" ) - ax.set_ylim([0,num_channels]) - ax.text(lower_lim+200, 45, sig.description, bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize-5) - ax.set_yticks([0,num_channels/2]) - ax.set_yticklabels(["0","0.5"]) - ax.set_ylabel("$\\rho$",size=fontsize) - ax.legend(loc="best",labelspacing=0.1,fontsize=fontsize,frameon=False) - ax.axvline(len(truth)-T_min_warn,color='r',linewidth=0.5) - plt.setp(ax.get_xticklabels(),visible=False) + ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description,cmap="inferno" ) + ax.set_ylim([0,num_channels]) + ax.text(lower_lim+200, 45, sig.description, bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize-5) + ax.set_yticks([0,num_channels/2]) + ax.set_yticklabels(["0","0.5"]) + ax.set_ylabel("$\\rho$",size=fontsize) + ax.legend(loc="best",labelspacing=0.1,fontsize=fontsize,frameon=False) + ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5) + plt.setp(ax.get_xticklabels(),visible=False) + plt.setp(ax.get_yticklabels(),fontsize=fontsize) + f.subplots_adjust(hspace=0) + #print(sig) + #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) + ax = axarr[-1] + # ax.semilogy((-truth+0.0001),label='ground truth') + # ax.plot(-prediction+0.0001,'g',label='neural net prediction') + # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') + # nn = np.min(pred) + ax.plot(xx,truth,'g',label='target',linewidth=2) + # ax.axhline(0.4,linestyle="--",color='k',label='threshold') + ax.plot(xx,prediction,'b',label='RNN output',linewidth=2) + ax.axhline(P_thresh_opt,linestyle="--",color='k',label='threshold') + ax.set_ylim([-2,2]) + ax.set_yticks([-1,0,1]) + # if len(truth)-T_max_warn >= 0: + # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time') + ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5)#,label='min warning time') + ax.set_xlabel('T [ms]',size=fontsize) + # ax.axvline(2400) + ax.legend(loc = (0.5,0.7),fontsize=fontsize-5,labelspacing=0.1,frameon=False) plt.setp(ax.get_yticklabels(),fontsize=fontsize) - f.subplots_adjust(hspace=0) - #print(sig) - #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) - ax = axarr[-1] - # ax.semilogy((-truth+0.0001),label='ground truth') - # ax.plot(-prediction+0.0001,'g',label='neural net prediction') - # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') - # nn = np.min(pred) - ax.plot(xx,truth,'g',label='target',linewidth=2) - # ax.axhline(0.4,linestyle="--",color='k',label='threshold') - ax.plot(xx,prediction,'b',label='RNN output',linewidth=2) - ax.axhline(P_thresh_opt,linestyle="--",color='k',label='threshold') - ax.set_ylim([-2,2]) - ax.set_yticks([-1,0,1]) - # if len(truth)-T_max_warn >= 0: - # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time') - ax.axvline(len(truth)-T_min_warn,color='r',linewidth=0.5)#,label='min warning time') - ax.set_xlabel('T [ms]',size=fontsize) - # ax.axvline(2400) - ax.legend(loc = (0.5,0.7),fontsize=fontsize-5,labelspacing=0.1,frameon=False) - plt.setp(ax.get_yticklabels(),fontsize=fontsize) - plt.setp(ax.get_xticklabels(),fontsize=fontsize) - # plt.xlim(0,200) - plt.xlim([lower_lim,len(truth)]) - # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") - plt.show() - else: - print("Shot hasn't been processed") + plt.setp(ax.get_xticklabels(),fontsize=fontsize) + # plt.xlim(0,200) + plt.xlim([lower_lim,len(truth)]) + # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") + if save_fig: + plt.savefig('sig_fig_{}{}.png'.format(shot.number,extra_filename),bbox_inches='tight') + np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=prediction,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) + #plt.show() + else: + print("Shot hasn't been processed") - def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): + def plot_shot_old(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): if self.normalizer is None and normalize: if self.conf is not None: self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] From 8b610ab59b4d4f6e17b19f0468aeb80da0944ccc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 24 Nov 2017 04:35:04 -0500 Subject: [PATCH 353/744] added script compare_performance.py to check the performance results of more than one results file against each other. Gives the ability to do things like print all the cases where predictions are different in different results files (e.g. 'FP' in one and 'TN' in the other), and then save the shot. Useful for comparative data analysis. --- examples/compare_performance.py | 54 +++++++++++ examples/performance_analysis.py | 12 +-- plasma/primitives/shots.py | 2 + plasma/utils/performance.py | 150 +++++++++++++------------------ 4 files changed, 124 insertions(+), 94 deletions(-) create mode 100644 examples/compare_performance.py diff --git a/examples/compare_performance.py b/examples/compare_performance.py new file mode 100644 index 00000000..0a39ee92 --- /dev/null +++ b/examples/compare_performance.py @@ -0,0 +1,54 @@ +import os,sys +import numpy as np + +from plasma.utils.performance import * +from plasma.conf import conf + +#mode = 'test' +file_num = 0 +save_figure = True +pred_ttd = False + +# cut_shot_ends = conf['data']['cut_shot_ends'] +# dt = conf['data']['dt'] +# T_max_warn = int(round(conf['data']['T_warning']/dt)) +# T_min_warn = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) +# if cut_shot_ends: +# T_max_warn = T_max_warn-T_min_warn +# T_min_warn = 0 +T_min_warn = 30 #None #take value from conf #30 + +verbose=False +assert(sys.argv > 1) +results_dirs = sys.argv[1:] +shots_dir = conf['paths']['processed_prepath'] + +analyzers = [PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num,T_min_warn = T_min_warn, verbose = verbose, pred_ttd=pred_ttd) for results_dir in results_dirs] + +for analyzer in analyzers: + analyzer.load_ith_file() + analyzer.verbose = False + +P_threshs = [analyzer.compute_tradeoffs_and_print_from_training() for analyzer in analyzers] + +print('Test ROC:') +for analyzer in analyzers: + print(analyzer.get_roc_area_by_mode('test')) +#P_thresh_opt = 0.566#0.566#0.92# analyzer.compute_tradeoffs_and_print_from_training() +linestyle="-" + +#analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test',linestyle=linestyle) +#analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train',linestyle=linestyle) +#analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') +shots = analyzers[0].shot_list_test + +for shot in shots: + types = [analyzers[i].get_prediction_type_for_individual_shot(P_threshs[i],shot,mode='test') for i in range(len(analyzers))] + #if len(set(types)) > 1: + if types == ['TP','FN']: + print(shot.number) + print(types) + for i,analyzer in enumerate(analyzers): + analyzer.save_shot(shot,P_thresh_opt=P_threshs[i],extra_filename=['deep','shallow'][i]) + + diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index af2d6fae..69b4f8cb 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -16,7 +16,7 @@ # if cut_shot_ends: # T_max_warn = T_max_warn-T_min_warn # T_min_warn = 0 -T_min_warn = 10 #None #take value from conf #30 +T_min_warn = 30 #None #take value from conf #30 verbose=False if len(sys.argv) > 1: @@ -31,13 +31,15 @@ analyzer.load_ith_file() P_thresh_opt = analyzer.compute_tradeoffs_and_print_from_training() +#P_thresh_opt = 0.566#0.566#0.92# analyzer.compute_tradeoffs_and_print_from_training() +linestyle="-" -analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test') -analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train') +analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test',linestyle=linestyle) +analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train',linestyle=linestyle) analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') -#analyzer.example_plots(P_thresh_opt,'test','any') +analyzer.example_plots(P_thresh_opt,'test','any') analyzer.example_plots(P_thresh_opt,'test',['FP'],extra_filename='test') analyzer.example_plots(P_thresh_opt,'test',['FN'],extra_filename='test') analyzer.example_plots(P_thresh_opt,'test',['TP'],extra_filename='test') @@ -51,7 +53,7 @@ alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') -analyzer.hist_alarms(disr_alarms,'disruptive alarms, P thresh = {}'.format(P_thresh_opt),save_figure=save_figure) +analyzer.hist_alarms(disr_alarms,'disruptive alarms, P thresh = {}'.format(P_thresh_opt),save_figure=save_figure,linestyle=linestyle) print('{} disruptive alarms'.format(len(disr_alarms))) print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) print('{} seconds median alarm time'.format(np.median(disr_alarms[disr_alarms > 0]))) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index dd7156c1..6de4faf3 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -225,6 +225,8 @@ def next(self): def __add__(self,other_list): return ShotList(self.shots + other_list.shots) + def index(self,item): + return self.shots.index(item) def random_sublist(self,num): num = min(num,len(self)) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index deb982ad..43bd6b5a 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -348,7 +348,8 @@ def load_ith_file(self): self.conf['data']['T_warning'] = self.saved_conf['data']['T_warning'] #all files must agree on T_warning due to output of truth vs. normalized shot ttd. for mode in ['test','train']: print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) - self.print_conf() + if self.verbose: + self.print_conf() #self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) #self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) @@ -595,23 +596,9 @@ def plot_individual_shot(self,P_thresh_opt,shot_num,normalize=True,plot_signals= def get_prediction_type_for_individual_shot(self,P_thresh,shot,mode='test'): - if mode == 'test': - pred = self.pred_test - truth = self.truth_test - is_disruptive = self.disruptive_test - shot_list = self.shot_list_test - else: - pred = self.pred_train - truth = self.truth_train - is_disruptive = self.disruptive_train - shot_list = self.shot_list_train - i = shot_list.index(shot) - t = truth[i] - p = pred[i] - is_disr = is_disruptive[i] - shot = shot_list.shots[i] + p,t,is_disr = self.get_pred_truth_disr_by_shot(shot) - TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh_opt,p,t,is_disr) + TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh,p,t,is_disr) prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) return prediction_type @@ -849,6 +836,63 @@ def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,sa plt.savefig(title_str + '_roc.png',bbox_inches='tight',dpi=200) print('ROC area ({}) is {}'.format(plot_string,self.roc_from_missed_fp(missed_range,fp_range))) + def get_pred_truth_disr_by_shot(self,shot): + if shot in self.shot_list_test: + mode = 'test' + elif shot in self.shot_list_train: + mode = 'train' + else: + print('Shot {} not found'.format(shot)) + exit(1) + if mode == 'test': + pred = self.pred_test + truth = self.truth_test + is_disruptive = self.disruptive_test + shot_list = self.shot_list_test + else: + pred = self.pred_train + truth = self.truth_train + is_disruptive = self.disruptive_train + shot_list = self.shot_list_train + i = shot_list.index(shot) + t = truth[i] + p = pred[i] + is_disr = is_disruptive[i] + shot = shot_list.shots[i] + return p,t,is_disr + + def save_shot(self,shot,P_thresh_opt = 0,extra_filename=''): + if self.normalizer is None: + if self.conf is not None: + self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] + nn = Normalizer(self.saved_conf) + nn.train() + self.normalizer = nn + self.normalizer.set_inference_mode(True) + + shot.restore(self.shots_dir) + t_disrupt = shot.t_disrupt + is_disruptive = shot.is_disruptive + self.normalizer.apply(shot) + + + + pred,truth,is_disr = self.get_pred_truth_disr_by_shot(shot) + use_signals = self.saved_conf['paths']['use_signals'] + np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=pred,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) + + def get_roc_area_by_mode(self,mode='test'): + if mode == 'test': + pred = self.pred_test + truth = self.truth_test + is_disruptive = self.disruptive_test + shot_list = self.shot_list_test + else: + pred = self.pred_train + truth = self.truth_train + is_disruptive = self.disruptive_train + shot_list = self.shot_list_train + return self.get_roc_area(pred,truth,is_disruptive) def get_roc_area(self,all_preds,all_truths,all_disruptive): correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = \ @@ -862,75 +906,3 @@ def roc_from_missed_fp(self,missed_range,fp_range): return -np.trapz(1-missed_range,x=fp_range) - - - -# def cut_ttd(arr,length): -# return arr[length-1:] - - -# def get_disruptive(is_disr_list): -# return array([1 if any(arr > 0.5) else 0 for arr in is_disr_list]) - - -# def create_acceptable_regions(is_disrupt): -# end_indices = get_end_indices(is_disrupt) -# acceptable = zeros_like(is_disrupt,dtype=bool) - - - - -# def cut_ttd(arr,length): -# return arr[length-1:] - - -# def get_disruptive(is_disr_list): -# return array([1 if any(arr > 0.5) else 0 for arr in is_disr_list]) - - -# def create_acceptable_regions(is_disrupt): -# end_indices = get_end_indices(is_disrupt) -# acceptable = zeros_like(is_disrupt,dtype=bool) -# for idx in end_indices: -# acceptable[idx - acceptable_timesteps:idx] = True -# return acceptable - -# def get_end_indices(is_disrupt): -# end_indices = where(np.logical_and(is_disrupt[:-1] > 0.5, is_disrupt[1:] < 0.5))[0] -# return end_indices - -# def get_accuracy_and_fp_rate(P_thresh,pred,is_disrupt,T_min_warn = 30,T_max_warn = 1000): -# predictions = pred > P_thresh -# predictions = reshape(predictions,(len(predictions),)) - -# max_acceptable = create_acceptable_region(is_disrupt,T_max_warn) -# min_acceptable = create_acceptable_region(is_disrupt,T_min_warn) - -# tp = sum(np.logical_and(predictions,max_acceptable)) -# fp = sum(np.logical_and(predictions,~max_acceptable)) -# tn = sum(np.logical_and(~predictions,~min_acceptable)) -# fn = sum(np.logical_and(~predictions,min_acceptable)) - -# # print(1.0*tp/(tp + fp)) -# # print(1.0*tn/(tn + fn)) -# # print(1.0*(tp + tn)/(tp + fp + tn + fn)) -# print('total: {}, tp: {} fp: {} fn: {} tn: {}'.format(len(predictions),tp,fp,fn,tn)) - - -# return get_accuracy_and_fp_rate_from_stats(tp,fp,fn) - - -# def get_thresholds(ttd_prime_by_shot,ttd_by_shot,disr,length, \ -# T_min_warn = 30,T_max_warn = 1000,verbose=False): - -# def fp_vs_thresh(P_thresh): -# correct,accuracy,fp_rate,missed,early_alarm_rate = summarize_shot_prediction_stats(P_thresh,ttd_prime_by_shot, \ -# ttd_by_shot,disr,length,T_min_warn,T_max_warn,verbose=verbose) -# return fp_rate - -# def missed_vs_thresh(P_thresh): -# correct,accuracy,fp_rate,missed,early_alarm_rate = summarize_shot_prediction_stats(P_thresh,ttd_prime_by_shot, \ -# ttd_by_shot,disr,length,T_min_warn,T_max_warn,verbose=verbose) -# return fp_rate - - From f18d321ecbd94bad110116ff2e25abd57227b0db Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 24 Nov 2017 04:36:20 -0500 Subject: [PATCH 354/744] added ability to plot performance for a single shot by number --- examples/individual_shot_performance.py | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 examples/individual_shot_performance.py diff --git a/examples/individual_shot_performance.py b/examples/individual_shot_performance.py new file mode 100644 index 00000000..dec7a6b7 --- /dev/null +++ b/examples/individual_shot_performance.py @@ -0,0 +1,32 @@ +import os,sys +import numpy as np + +from plasma.utils.performance import * +from plasma.conf import conf + +#mode = 'test' +file_num = 0 +save_figure = True +pred_ttd = False + +T_min_warn = 30 #None #take value from conf #30 + +verbose=False +if len(sys.argv) == 3: + results_dir = sys.argv[1] + num = int(sys.argv[2]) +else: + results_dir = conf['paths']['results_prepath'] + num = int(sys.argv[1]) + +print("loading results from {}".format(results_dir)) +print("Plotting shot {}".format(num)) +shots_dir = conf['paths']['processed_prepath'] + +analyzer = PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num, +T_min_warn = T_min_warn, verbose = verbose, pred_ttd=pred_ttd) + +analyzer.load_ith_file() +P_thresh_opt = analyzer.compute_tradeoffs_and_print_from_training() +analyzer.plot_individual_shot(P_thresh_opt,num) + From 76e4ab43a06b325cfa2c8ccba92d12a0f64cb827 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 26 Nov 2017 13:30:16 -0500 Subject: [PATCH 355/744] Move HyperparamExperiment to primitives/hyperparameters module, use os.path.join for save paths --- plasma/primitives/hyperparameters.py | 183 ++++++++++++++++++++------- 1 file changed, 137 insertions(+), 46 deletions(-) diff --git a/plasma/primitives/hyperparameters.py b/plasma/primitives/hyperparameters.py index 2f4435f8..d3e29e35 100644 --- a/plasma/primitives/hyperparameters.py +++ b/plasma/primitives/hyperparameters.py @@ -1,42 +1,42 @@ import numpy as np import random import abc +import yaml,os class Hyperparam(object): @abc.abstractmethod def choice(self): - return 0 + return 0 def get_conf_entry(self,conf): - el = conf - for sub_path in self.path: - el = el[sub_path] - return el + el = conf + for sub_path in self.path: + el = el[sub_path] + return el def assign_to_conf(self,conf,save_path): - val = self.choice() - print(" : ".join(self.path)+ ": {}".format(val)) - el = conf - for sub_path in self.path[:-1]: - el = el[sub_path] - el[self.path[-1]] = val - - with open(save_path+"changed_params.out", 'a+') as outfile: - for el in self.path: - outfile.write("{} : ".format(el)) - outfile.write("{}\n".format(val)) + val = self.choice() + print(" : ".join(self.path)+ ": {}".format(val)) + el = conf + for sub_path in self.path[:-1]: + el = el[sub_path] + el[self.path[-1]] = val + with open(os.path.join(save_path,"changed_params.out"), 'a+') as outfile: + for el in self.path: + outfile.write("{} : ".format(el)) + outfile.write("{}\n".format(val)) class CategoricalHyperparam(Hyperparam): - def __init__(self,path,values): - self.path = path - self.values = values + def __init__(self,path,values): + self.path = path + self.values = values - def choice(self): - return random.choice(self.values) + def choice(self): + return random.choice(self.values) class GridCategoricalHyperparam(Hyperparam): @@ -48,41 +48,132 @@ def choice(self): return next(self.values) class ContinuousHyperparam(Hyperparam): - def __init__(self,path,lo,hi): - self.path = path - self.lo =lo - self.hi =hi + def __init__(self,path,lo,hi): + self.path = path + self.lo =lo + self.hi =hi - def choice(self): - return float(np.random.uniform(self.lo,self.hi)) + def choice(self): + return float(np.random.uniform(self.lo,self.hi)) class LogContinuousHyperparam(Hyperparam): - def __init__(self,path,lo,hi): - self.path = path - self.lo = self.to_log(lo) - self.hi = self.to_log(hi) + def __init__(self,path,lo,hi): + self.path = path + self.lo = self.to_log(lo) + self.hi = self.to_log(hi) - def to_log(self,num_val): - return np.log10(num_val) + def to_log(self,num_val): + return np.log10(num_val) - def choice(self): - return float(np.power(10,np.random.uniform(self.lo,self.hi))) + def choice(self): + return float(np.power(10,np.random.uniform(self.lo,self.hi))) class IntegerHyperparam(Hyperparam): - def __init__(self,path,lo,hi): - self.path = path - self.lo =lo - self.hi =hi + def __init__(self,path,lo,hi): + self.path = path + self.lo =lo + self.hi =hi - def choice(self): - return int(np.random.random_integers(self.lo,self.hi)) + def choice(self): + return int(np.random.random_integers(self.lo,self.hi)) class GenericHyperparam(Hyperparam): - def __init__(self,path,choice_fn): - self.path = path - self.choice_fn = choice_fn + def __init__(self,path,choice_fn): + self.path = path + self.choice_fn = choice_fn - def choice(self): - return self.choice_fn() + def choice(self): + return self.choice_fn() + + +class HyperparamExperiment(object): + def __init__(self,path,conf_name = "conf.yaml"): + if not path.endswith('/'): + path += '/' + self.path = path + self.finished = False + self.success = False + self.logs_path = os.path.join(path,"csv_logs/") + self.raw_logs_path = path[:-1] + ".out" + self.changed_path = os.path.join(path,"changed_params.out") + with open(os.path.join(self.path,conf_name), 'r') as yaml_file: + conf = yaml.load(yaml_file) + self.name_to_monitor = conf['callbacks']['monitor'] + self.load_data() + self.get_changed() + self.get_maximum() + self.read_raw_logs() + + def __lt__(self,other): + return self.path.__lt__(other.path) + + def get_number(self): + return int(os.path.basename(self.path[:-1])) + + def __str__(self): + s = "Experiment:\n" + s += '-'*20+"\n" + s += '# {}\n'.format(self.get_number()) + s += '-'*20+"\n" + s += self.changed + s += '-'*20+"\n" + s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) + s += '-'*20+"\n" + return s + + def summary(self): + s = "Finished" if self.finished else "Running" + print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) + + + def load_data(self): + import pandas + if os.path.exists(self.logs_path): + files = os.listdir(self.logs_path) + assert(len(files) == 1) + self.logs_path = self.logs_path + files[0] + if os.path.getsize(self.logs_path) > 0: + dat = pandas.read_csv(self.logs_path) + self.epochs = np.array(dat['epoch']) + self.values = np.array(dat[self.name_to_monitor]) + self.dat = dat + print("loaded logs") + print(self.epochs) + print(self.values) + return + self.epochs = [] + print("no logs yet") + + def get_changed(self): + with open(self.changed_path, 'r') as file: + text = file.read() + print("changed values: {}".format(text)) + self.changed = text + return text + + def read_raw_logs(self): + self.success = False + self.finished = False + lines = [] + if os.path.exists(self.raw_logs_path): + with open(self.raw_logs_path, 'r') as file: + lines = file.readlines() + if len(lines) > 1: + if lines[-1].strip() == 'done.': + self.finished = True + if lines[-2].strip() == 'finished.': + self.success = True + print('finished: {}, success: {}'.format(self.finished, self.success)) + + def get_maximum(self,verbose=True): + if len(self.epochs) > 0: + idx = np.argmax(self.values) + s = "Finished" if self.finished else "Running" + if verbose: + #print(self.path) + print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) + return self.values[idx],self.epochs[idx] + else: + return -1,-1 From 5293cbe6fa1074725cb905f64669d7859d3d36fc Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 26 Nov 2017 13:36:19 -0500 Subject: [PATCH 356/744] Refactor, use os.path.join --- examples/check_tuning.py | 101 +++------------------------------------ 1 file changed, 6 insertions(+), 95 deletions(-) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index 7735f0f6..b65581f6 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -1,4 +1,4 @@ -from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam +from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,HyperparamExperiment from pprint import pprint import yaml import datetime @@ -8,8 +8,9 @@ import subprocess as sp import pandas import numpy as np +import plasma.conf -dir_path = "/tigress/{}/hyperparams/".format(getpass.getuser()) +dir_path = "/{}/{}/hyperparams/".format(plasma.conf.conf['fs_path'],getpass.getuser()) if len(sys.argv) <= 1: dir_path = dir_path + os.listdir(dir_path)[0] + '/' print("using default dir {}".format(dir_path)) @@ -17,105 +18,15 @@ dir_path = sys.argv[1] -class HyperparamExperiment(): - def __init__(self,path,conf_name = "conf.yaml"): - if not path.endswith('/'): - path += '/' - self.path = path - self.finished = False - self.success = False - self.logs_path = path + "csv_logs/" - self.raw_logs_path = path[:-1] + ".out" - self.changed_path = path + "changed_params.out" - with open(self.path + conf_name, 'r') as yaml_file: - conf = yaml.load(yaml_file) - self.name_to_monitor = conf['callbacks']['monitor'] - self.load_data() - self.get_changed() - self.get_maximum() - self.read_raw_logs() - - def __lt__(self,other): - return self.path.__lt__(other.path) - - def get_number(self): - return int(os.path.basename(self.path[:-1])) - - def __str__(self): - s = "Experiment:\n" - s += '-'*20+"\n" - s += '# {}\n'.format(self.get_number()) - s += '-'*20+"\n" - s += self.changed - s += '-'*20+"\n" - s += "Maximum of {} at epoch {}\n".format(*self.get_maximum(False)) - s += '-'*20+"\n" - return s - - def summary(self): - s = "Finished" if self.finished else "Running" - print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) - - - def load_data(self): - if os.path.exists(self.logs_path): - files = os.listdir(self.logs_path) - assert(len(files) == 1) - self.logs_path = self.logs_path + files[0] - if os.path.getsize(self.logs_path) > 0: - dat = pandas.read_csv(self.logs_path) - self.epochs = np.array(dat['epoch']) - self.values = np.array(dat[self.name_to_monitor]) - self.dat = dat - print("loaded logs") - print(self.epochs) - print(self.values) - return - self.epochs = [] - print("no logs yet") - - def get_changed(self): - with open(self.changed_path, 'r') as file: - text = file.read() - print("changed values: {}".format(text)) - self.changed = text - return text - - def read_raw_logs(self): - self.success = False - self.finished = False - lines = [] - if os.path.exists(self.raw_logs_path): - with open(self.raw_logs_path, 'r') as file: - lines = file.readlines() - if len(lines) > 1: - if lines[-1].strip() == 'done.': - self.finished = True - if lines[-2].strip() == 'finished.': - self.success = True - print('finished: {}, success: {}'.format(self.finished, self.success)) - - def get_maximum(self,verbose=True): - if len(self.epochs) > 0: - idx = np.argmax(self.values) - s = "Finished" if self.finished else "Running" - if verbose: - #print(self.path) - print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) - return self.values[idx],self.epochs[idx] - else: - return -1,-1 - - def get_experiments(path): experiments = [] num_tot = 0 num_finished = 0 num_success = 0 for name in sorted(os.listdir(path)): - if os.path.isdir(path + name): - print(path+name) - exp= HyperparamExperiment(path+name) + if os.path.isdir(os.path.join(path,name)): + print(os.path.join(path,name)) + exp= HyperparamExperiment(os.path.join(path,name)) num_finished += 1 if exp.finished else 0 num_success += 1 if exp.success else 0 num_tot += 1 From fe9811d3acd13f535c2109dd716686dd91bd9f78 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 26 Nov 2017 19:56:20 -0500 Subject: [PATCH 357/744] Helper tool to analyze the hyperparameter limits, extends check_tuning --- examples/analyze_tuning.py | 99 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 examples/analyze_tuning.py diff --git a/examples/analyze_tuning.py b/examples/analyze_tuning.py new file mode 100644 index 00000000..29c7743b --- /dev/null +++ b/examples/analyze_tuning.py @@ -0,0 +1,99 @@ +from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,HyperparamExperiment +import matplotlib.pylab as plt + +from pprint import pprint +import yaml +import datetime +import uuid +import sys,os,getpass +import shutil +import subprocess as sp +import pandas +import numpy as np +import plasma.conf + +dir_path = "/{}/{}/hyperparams/".format(plasma.conf.conf['fs_path'],getpass.getuser()) + +if len(sys.argv) <= 1: + dir_path = dir_path + os.listdir(dir_path)[0] + '/' + print("using default dir {}".format(dir_path)) +else: + dir_path = sys.argv[1] + + +def get_experiments(path,verbose=0): + experiments = [] + num_tot = 0 + num_finished = 0 + num_success = 0 + for name in sorted(os.listdir(path)): + if os.path.isdir(os.path.join(path,name)): + print(os.path.join(path,name)) + exp= HyperparamExperiment(os.path.join(path,name)) + num_finished += 1 if exp.finished else 0 + num_success += 1 if exp.success else 0 + num_tot += 1 + experiments.append(exp) + if verbose: + print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) + return experiments + +experiments = sorted(get_experiments(dir_path)) +best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) +best = [] +for e in np.array(experiments)[best_experiments][-3:]: + best.append(e.get_number()) + +bigdict = {} +for base in best: + f = "/{}/{}/changed_params.out".format(dir_path,base) + data = open(f).readlines() + + for line in data: + tuples = line.split(":") + #if len(tuples) == 2: + key, values = tuples[-2:] + key = key.strip() + try: + bigdict[key] += [values] + except KeyError: + bigdict[key] = [values] + + +def make_comparison_plot(key,tunable,trial): + trial = list(map(lambda x: eval(x),trial)) + values,edges = np.histogram(trial,bins=10) + total = values.sum() + values_percentages =list(map(lambda x: x*100.0/total, values)) + + plt.bar(edges[:-1], values_percentages, width=np.diff(edges), ec="k", align="edge") + plt.xlabel(key, fontsize=20) + plt.yscale('log') + plt.ylabel('Num. trials/bin', fontsize=20) + + values,edges = tunable + plt.bar(edges[:-1], values, width=np.diff(edges), ec="k", align="edge") + plt.savefig(key+".png") + #plt.show() + plt.clf() + + +#default tunables: +defaults = {} +defaults['lr'] = np.histogram([1e-7,1e-4]) +defaults['lr_decay'] = np.histogram([0.97,0.985,1.0]) +defaults['positive_example_penalty'] = np.histogram([1.0,4.0,16.0]) +#defaults['target'] = np.histogram([50,50,50],bins=['hinge','ttdinv','ttd']) +defaults['batch_size'] = np.histogram([64,256,1024]) +defaults['dropout_prob'] = np.histogram([0.1,0.3,0.5]) +defaults['rnn_layers'] = np.histogram([1,4]) +defaults['rnn_size'] = np.histogram([100,200,300]) +defaults['num_conv_filters'] = np.histogram([5,10]) +defaults['num_conv_layers'] = np.histogram([2,4]) +defaults['T_warning'] = np.histogram([0.256,1.024,10.024]) +defaults['cut_shot_ends'] = np.histogram([False,True]) + +#Histogram it +for key,trial in bigdict.items(): + if key == 'target': continue + make_comparison_plot(key,defaults[key],trial) From f92c8fcff4b1a5dd31bca60e6914515a42fc4992 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 26 Nov 2017 20:36:03 -0500 Subject: [PATCH 358/744] Assure binning of the same size --- examples/analyze_tuning.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/analyze_tuning.py b/examples/analyze_tuning.py index 29c7743b..7a32e855 100644 --- a/examples/analyze_tuning.py +++ b/examples/analyze_tuning.py @@ -41,7 +41,7 @@ def get_experiments(path,verbose=0): experiments = sorted(get_experiments(dir_path)) best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) best = [] -for e in np.array(experiments)[best_experiments][-3:]: +for e in np.array(experiments)[best_experiments][-5:]: best.append(e.get_number()) bigdict = {} @@ -61,17 +61,18 @@ def get_experiments(path,verbose=0): def make_comparison_plot(key,tunable,trial): + values,edges = tunable + trial = list(map(lambda x: eval(x),trial)) - values,edges = np.histogram(trial,bins=10) + trial_values,_ = np.histogram(trial,bins=edges) total = values.sum() - values_percentages =list(map(lambda x: x*100.0/total, values)) + values_percentages =list(map(lambda x: x*100.0/total, trial_values)) plt.bar(edges[:-1], values_percentages, width=np.diff(edges), ec="k", align="edge") plt.xlabel(key, fontsize=20) - plt.yscale('log') + #plt.yscale('log') plt.ylabel('Num. trials/bin', fontsize=20) - values,edges = tunable plt.bar(edges[:-1], values, width=np.diff(edges), ec="k", align="edge") plt.savefig(key+".png") #plt.show() From 2e325ad0aaae381a00a5dbe44a2985666869cce2 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 27 Nov 2017 09:06:15 -0500 Subject: [PATCH 359/744] Correct normalization and label --- examples/analyze_tuning.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/analyze_tuning.py b/examples/analyze_tuning.py index 7a32e855..1cb91f0f 100644 --- a/examples/analyze_tuning.py +++ b/examples/analyze_tuning.py @@ -65,13 +65,13 @@ def make_comparison_plot(key,tunable,trial): trial = list(map(lambda x: eval(x),trial)) trial_values,_ = np.histogram(trial,bins=edges) - total = values.sum() + total = trial_values.sum() values_percentages =list(map(lambda x: x*100.0/total, trial_values)) plt.bar(edges[:-1], values_percentages, width=np.diff(edges), ec="k", align="edge") plt.xlabel(key, fontsize=20) #plt.yscale('log') - plt.ylabel('Num. trials/bin', fontsize=20) + plt.ylabel('Fraction of trials [%]/bin', fontsize=20) plt.bar(edges[:-1], values, width=np.diff(edges), ec="k", align="edge") plt.savefig(key+".png") From baf06fa680ae6b4b85694d07290ffa9f9c45fd55 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 27 Nov 2017 14:00:55 -0500 Subject: [PATCH 360/744] During augmentation, replace signal with noise instead of add (note: this is done after normalization) --- plasma/preprocessor/augment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index bac83921..2ff15e8c 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -85,7 +85,7 @@ def augment(self,signal,strength=10): - signal: augmented signal ... numpy array of numeric types? ''' if self.conf['data']['augmentation_mode'] == "noise": - return signal + np.random.normal(0,strength,signal.shape) + return np.random.normal(0,strength,signal.shape) elif self.conf['data']['augmentation_mode'] == "zero": return signal*0.0 #if "set to zero" augmentation. Can control in conf. elif self.conf['data']['augmentation_mode'] == "none": From c56430e7c97b193db44270061b50e923237d1cdb Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 30 Nov 2017 16:09:52 -0800 Subject: [PATCH 361/744] added functionality to compute signal influence by hiding part of the signal in time and performing inference with that modified signal --- examples/signal_influence.py | 149 +++++++++++++++++++++++++++++++++ plasma/preprocessor/augment.py | 27 ++++++ plasma/primitives/shots.py | 1 + 3 files changed, 177 insertions(+) create mode 100644 examples/signal_influence.py diff --git a/examples/signal_influence.py b/examples/signal_influence.py new file mode 100644 index 00000000..d344692d --- /dev/null +++ b/examples/signal_influence.py @@ -0,0 +1,149 @@ +''' +######################################################### +This file trains a deep learning model to predict +disruptions on time series data from plasma discharges. + +Must run guarantee_preprocessed.py in order for this to work. + +Dependencies: +conf.py: configuration of model,training,paths, and data +model_builder.py: logic to construct the ML architecture +data_processing.py: classes to handle data processing + +Author: Julian Kates-Harbeck, jkatesharbeck@g.harvard.edu + +This work was supported by the DOE CSGF program. +######################################################### +''' + +from __future__ import print_function +import os +import sys +import time +import datetime +import random +import numpy as np +import copy +from functools import partial + +os.environ["PYTHONHASHSEED"] = "0" + +import matplotlib +matplotlib.use('Agg') + +from pprint import pprint +sys.setrecursionlimit(10000) + +from plasma.conf import conf +from plasma.models.loader import Loader +from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.augment import ByShotAugmentator +from plasma.preprocessor.preprocess import guarantee_preprocessed + +if conf['model']['shallow']: + print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + exit(1) +if conf['data']['normalizer'] == 'minmax': + from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer +elif conf['data']['normalizer'] == 'meanvar': + from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer +elif conf['data']['normalizer'] == 'var': + from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer +elif conf['data']['normalizer'] == 'averagevar': + from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer +else: + print('unkown normalizer. exiting') + exit(1) + +from mpi4py import MPI +comm = MPI.COMM_WORLD +task_index = comm.Get_rank() +num_workers = comm.Get_size() +NUM_GPUS = conf['num_gpus'] +MY_GPU = task_index % NUM_GPUS + +from plasma.models.mpi_runner import * + +np.random.seed(task_index) +random.seed(task_index) +if task_index == 0: + pprint(conf) + +only_predict = len(sys.argv) > 1 +custom_path = None +if only_predict: + custom_path = sys.argv[1] +shot_num = sys.argv[2] +print("predicting using path {} on shot {}".format(custom_path,shot_num)) + +assert(only_predict) +##################################################### +####################Normalization#################### +##################################################### +if task_index == 0: #make sure preprocessing has been run, and is saved as a file + shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +comm.Barrier() +shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) + +shot_list = sum([l.filter_by_number([shot_num]) for l in [shot_list_train,shot_list_validate,shot_list_test]],[]) +# for s in shot_list.shots: + # s.restore() + +def hide_signal_data(shot,t=0,sig_to_hide=None): + for sig in shot.signals: + if sig == sig_to_hide or sig_to_hide == None: + shot.signals_dict[sig][t:,:] = shot.signals_dict[sig][t,:] + + +original_shot = s[0] +T = len(original_shot.ttd) +t_range = np.linspace(0,T-1,10,dtype=np.int) +for t in t_range: + new_shot = copy.deepcopy(original_shot) + assert(new_shot.augmentation_fn == None) + new_shot.augmentation_fn = partial(hide_signal_data,t = t) + hide_signal_data(new_shot,t,None) + new_shot.number = original_shot.number + shot_list.append(new_shot) + + + +print("normalization",end='') +normalizer = Normalizer(conf) +normalizer.train() +normalizer = ByShotAugmentator(normalizer) +loader = Loader(conf,normalizer) +print("...done") + +# if not only_predict: +# mpi_train(conf,shot_list_train,shot_list_validate,loader) + +#load last model for testing +loader.set_inference_mode(True) +print('saving results') +y_prime = [] +y_gold = [] +disruptive= [] + +# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) +# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) + +y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader,custom_path) + +if task_index == 0: + disruptive = np.array(disruptive) + + shot_list.make_light() + + save_str = 'signal_influence_results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + result_base_path = conf['paths']['results_prepath'] + if not os.path.exists(result_base_path): + os.makedirs(result_base_path) + + np.savez(result_base_path+save_str, + y_gold=y_gold,y_prime=y_prime,disruptive=disruptive, + shot_list=shot_list,conf = conf) + +sys.stdout.flush() +if task_index == 0: + print('finished.') diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index bac83921..35612e03 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -5,6 +5,33 @@ import numpy as np import random + +class ByShotAugmentator(object): + def __init__(self,normalizer): + self.normalizer = normalizer + + def __str__(self): + s = self.normalizer.__str__() + s += "\n including by shot augmentation" + return s + + @abc.abstractmethod + def apply(self,shot): + ''' + The purpose of the method is to apply normalization to a shot and then optionally apply augmentation with a function that is individual to every shot. + + Argument list: + - shot: plasma shot. Should contain an augment function + + Config parameters list: + - conf['data']['augment_during_training']: boolean flag, yes or no to augment during training + ''' + #first just apply normalization as usual. + self.normalizer.apply(shot) + assert(shot.augmentation_fn is not None) + shot.augmentation_fn(shot) + + class AbstractAugmentator(object): def __init__(self,normalizer,is_inference,conf): diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index dd7156c1..cf3d2f0c 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -303,6 +303,7 @@ def __init__(self,number=None,machine=None,signals=None,signals_dict=None,ttd=No self.is_disruptive = is_disruptive self.t_disrupt = t_disrupt self.weight = 1.0 + self.augmentation_fn = None if t_disrupt is not None: self.is_disruptive = Shot.is_disruptive_given_disruption_time(t_disrupt) else: From 83db2b6331204afd3440a1f081ea3ec7ea0956a8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 30 Nov 2017 19:35:17 -0500 Subject: [PATCH 362/744] added [] operator to shotlist --- plasma/primitives/shots.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index c7767b0a..3e1d17bf 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -228,6 +228,9 @@ def __add__(self,other_list): def index(self,item): return self.shots.index(item) + def __getitem__(self,key): + return self.shots[key] + def random_sublist(self,num): num = min(num,len(self)) shots_picked = np.random.choice(self.shots,size=num,replace=False) From 6cb25ee0fe24830666709e07db4baef85aa458be Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 1 Dec 2017 21:59:15 -0800 Subject: [PATCH 363/744] added many more d3d profile signals --- data/signals.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index 7e668756..e672a435 100644 --- a/data/signals.py +++ b/data/signals.py @@ -136,8 +136,24 @@ def fetch_nstx_data(signal_path,shot_num,c): all_machines = [d3d,jet] profile_num_channels = 64 +#ZIPFIT comes from actual measurements etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +pthm_profile = ProfileSignal("Thermal pressure profile",["ZIPFIT01/PROFILES.PTHMFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02)# thermal pressure doesn't include fast ions +neut_profile = ProfileSignal("Neutrals profile",["ZIPFIT01/PROFILES.NEUTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) + +q_profile = ProfileSignal("Q profile",["ZIPFIT01/PROFILES.BOOTSTRAP.QRHO"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02)#compare to just q95 +bootstrap_current_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.BOOTSTRAP.JBS_SAUTER"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) + +#equilibrium_image = 2DSignal("2D Magnetic Equilibrium",["EFIT01/RESULTS.GEQDSK.PSIRZ"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) + +#EFIT is the inverse problem from external magnetic measurements +#pressure_profile = ProfileSignal("Pressure profile",["EFIT01/RESULTS.GEQDSK.PRES"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02)# pressure might be unphysical since it is not constrained by measurements, only the EFIT which does not know about density and temperature +q_psi_profile = ProfileSignal("Q(psi) profile",["EFIT01/RESULTS.GEQDSK.QPSI"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) + # epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) @@ -193,10 +209,15 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, 'pin':pin,'torquein':torquein, 'energydt':energydt, -'etemp_profile':etemp_profile,'edens_profile':edens_profile, 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp +'etemp_profile':etemp_profile,'edens_profile':edens_profile, +'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, +'trot_profile':trot_profile,'pthm_profile':pthm_profile, +'neut_profile':neut_profile,'q_profile':q_profile, +'bootstrap_current_profile':bootstrap_current_profile, +'q_psi_profile':q_psi_profile } #new signals are not downloaded yet From 468578932005be3fcfe81765da0c611aa72c78ed Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 1 Dec 2017 22:00:43 -0800 Subject: [PATCH 364/744] added many more d3d profile signals --- data/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index e672a435..60fd6ac5 100644 --- a/data/signals.py +++ b/data/signals.py @@ -209,7 +209,7 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, 'pin':pin,'torquein':torquein, 'energydt':energydt, - 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr + 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp 'etemp_profile':etemp_profile,'edens_profile':edens_profile, From 30df67bf13d655db41c123f01477649dbfcaacc1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 4 Dec 2017 11:52:25 -0500 Subject: [PATCH 365/744] using signal hiding to compute influence --- examples/signal_influence.py | 89 ++++++++++++++++++++++------------ plasma/preprocessor/augment.py | 13 +++-- plasma/primitives/data.py | 2 + plasma/primitives/shots.py | 2 +- 4 files changed, 72 insertions(+), 34 deletions(-) diff --git a/examples/signal_influence.py b/examples/signal_influence.py index d344692d..509af551 100644 --- a/examples/signal_influence.py +++ b/examples/signal_influence.py @@ -36,6 +36,7 @@ from plasma.conf import conf from plasma.models.loader import Loader +from plasma.primitives.shots import ShotList from plasma.preprocessor.normalize import Normalizer from plasma.preprocessor.augment import ByShotAugmentator from plasma.preprocessor.preprocess import guarantee_preprocessed @@ -73,7 +74,7 @@ custom_path = None if only_predict: custom_path = sys.argv[1] -shot_num = sys.argv[2] +shot_num = int(sys.argv[2]) print("predicting using path {} on shot {}".format(custom_path,shot_num)) assert(only_predict) @@ -85,27 +86,54 @@ comm.Barrier() shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) -shot_list = sum([l.filter_by_number([shot_num]) for l in [shot_list_train,shot_list_validate,shot_list_test]],[]) +shot_list = sum([l.filter_by_number([shot_num]) for l in [shot_list_train,shot_list_validate,shot_list_test]],ShotList()) +assert(len(shot_list) == 1) # for s in shot_list.shots: # s.restore() -def hide_signal_data(shot,t=0,sig_to_hide=None): +def chunks(l, n): + """Yield successive n-sized chunks from l.""" + return[ l[i:i + n] for i in range(0, len(l), n)] + +def hide_signal_data(shot,t=0,sigs_to_hide=None): for sig in shot.signals: - if sig == sig_to_hide or sig_to_hide == None: + if sigs_to_hide is None or (sigs_to_hide is not None and sig in sigs_to_hide): shot.signals_dict[sig][t:,:] = shot.signals_dict[sig][t,:] +def create_shot_list_tmp(original_shot,time_points,sigs=None): + shot_list_tmp = ShotList() + T = len(original_shot.ttd) + t_range = np.linspace(0,T-1,time_points,dtype=np.int) + for t in t_range: + new_shot = copy.copy(original_shot) + assert(new_shot.augmentation_fn == None) + new_shot.augmentation_fn = partial(hide_signal_data,t = t,sigs_to_hide=sigs) + #new_shot.number = original_shot.number + shot_list_tmp.append(new_shot) + return shot_list_tmp,t_range + +def get_importance_measure(original_shot,loader,custom_path,metric,time_points=10,sig=None): + shot_list_tmp,t_range = create_shot_list_tmp(original_shot,time_points,sigs) + y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list_tmp,loader,custom_path) + shot_list_tmp.make_light() + return t_range,get_importance_measure_given_y_prime(y_prime,metric),y_prime[-1] + +def difference_metric(y_prime,y_prime_orig): + idx = np.argmax(y_prime_orig) + return (np.max(y_prime_orig) - y_prime[idx])/(np.max(y_prime_orig) - np.min(y_prime_orig)) + +def get_importance_measure_given_y_prime(y_prime,metric): + differences = [metric(y_prime[i],y_prime[-1]) for i in range(len(y_prime))] + return 1.0-np.array(differences)#/np.max(differences) + + + -original_shot = s[0] -T = len(original_shot.ttd) -t_range = np.linspace(0,T-1,10,dtype=np.int) -for t in t_range: - new_shot = copy.deepcopy(original_shot) - assert(new_shot.augmentation_fn == None) - new_shot.augmentation_fn = partial(hide_signal_data,t = t) - hide_signal_data(new_shot,t,None) - new_shot.number = original_shot.number - shot_list.append(new_shot) +original_shot = shot_list[0] +original_shot.augmentation_fn = None +original_shot.restore(conf['paths']['processed_prepath']) +#remove original shot print("normalization",end='') @@ -120,29 +148,30 @@ def hide_signal_data(shot,t=0,sig_to_hide=None): #load last model for testing loader.set_inference_mode(True) -print('saving results') -y_prime = [] -y_gold = [] -disruptive= [] +use_signals = copy.copy(conf['paths']['use_signals']) +use_signals.append(None) +importances = dict() +y_prime = 0 +use_signals = [[s] for s in use_signals[:-3]] + [use_signals[-3:-1]] + [use_signals[-1]] +print(use_signals) +for sigs in use_signals: + t_range,measure,y_prime = get_importance_measure(original_shot,loader,custom_path,difference_metric,time_points=128,sig=sigs) + if sigs is None: + idx = None + else: + idx = tuple(sorted(sigs)) + importances[idx] = (t_range,measure) + -# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) -# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) - -y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader,custom_path) if task_index == 0: - disruptive = np.array(disruptive) - - shot_list.make_light() - - save_str = 'signal_influence_results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + save_str = 'signal_influence_results_{}_'.format(shot_num) + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") result_base_path = conf['paths']['results_prepath'] if not os.path.exists(result_base_path): os.makedirs(result_base_path) - np.savez(result_base_path+save_str, - y_gold=y_gold,y_prime=y_prime,disruptive=disruptive, - shot_list=shot_list,conf = conf) + original_shot=original_shot,importances=importances,y_prime=y_prime,conf = conf) + shot_list.make_light() sys.stdout.flush() if task_index == 0: diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index 1f7878fb..38903f1f 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -15,7 +15,6 @@ def __str__(self): s += "\n including by shot augmentation" return s - @abc.abstractmethod def apply(self,shot): ''' The purpose of the method is to apply normalization to a shot and then optionally apply augmentation with a function that is individual to every shot. @@ -28,8 +27,11 @@ def apply(self,shot): ''' #first just apply normalization as usual. self.normalizer.apply(shot) - assert(shot.augmentation_fn is not None) - shot.augmentation_fn(shot) + if shot.augmentation_fn is not None: + shot.augmentation_fn(shot) + + def set_inference_mode(self,is_inference): + self.normalizer.set_inference_mode(is_inference) class AbstractAugmentator(object): @@ -50,6 +52,10 @@ def __str__(self): s += "Signal to augmented: {}\n".format(self.to_augment_str) s += "Is inference: {}\n".format(self.is_inference) return s + + #for compatibility with code that changes the mode of the normalizer + def set_inference_mode(self,is_inference): + self.normalizer.set_inference_mode(is_inference) @abc.abstractmethod def apply(self,shot): @@ -58,6 +64,7 @@ def apply(self,shot): @abc.abstractmethod def augment(self,sig): pass + class Augmentator(AbstractAugmentator): diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 9cbc2672..349ff05c 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -118,6 +118,8 @@ def get_idx(self,machine): return idx def __eq__(self,other): + if other is None: + return False return self.description.__eq__(other.description) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 3e1d17bf..56d0d48d 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -329,7 +329,7 @@ def __hash__(self): def __str__(self): string = 'number: {}\n'.format(self.number) - string = 'machine: {}\n'.format(self.machine) + string += 'machine: {}\n'.format(self.machine) string += 'signals: {}\n'.format(self.signals ) string += 'signals_dict: {}\n'.format(self.signals_dict ) string += 'ttd: {}\n'.format(self.ttd ) From ebf33eea715d45207c6567f94ae5030927ba04dc Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Tue, 5 Dec 2017 22:32:31 -0500 Subject: [PATCH 366/744] Fix NameError: global name 'conf' is not defined --- plasma/preprocessor/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index d71ba76f..a067fb81 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -97,7 +97,7 @@ def preprocess_from_files(self,shot_files,use_shots): print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) print('{}/{} disruptive shots'.format(used_shots.num_disruptive(),len(used_shots))) if len(used_shots) == 0: - print("WARNING: All shots were omitted, please ensure raw data is complete and available at {}.".format(conf['paths']['signal_prepath'])) + print("WARNING: All shots were omitted, please ensure raw data is complete and available at {}.".format(self.conf['paths']['signal_prepath'])) return used_shots def preprocess_single_file(self,shot): From d8193b70efb32d31e19d5d503e7ea4ada20135ba Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 14:12:51 -0500 Subject: [PATCH 367/744] Fix ShotList type mismatch --- plasma/preprocessor/preprocess.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index a067fb81..f6dfde53 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -132,7 +132,10 @@ def load_shotlists(self): shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] - return shot_list_train,shot_list_validate,shot_list_test + if isinstance(shot_list_train,ShotList): + return shot_list_train,shot_list_validate,shot_list_test + else: + return ShotList(shot_list_train),ShotList(shot_list_validate),ShotList(shot_list_test) def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): From b2156fc3815435fedbc660bd10cf4ef44c2819bc Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 16:01:54 -0500 Subject: [PATCH 368/744] Signal positivity constraint, rebase --- data/signals.py | 2 +- plasma/preprocessor/normalize.py | 11 +++++++++++ plasma/primitives/data.py | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index 60fd6ac5..7c3141ea 100644 --- a/data/signals.py +++ b/data/signals.py @@ -169,7 +169,7 @@ def fetch_nstx_data(signal_path,shot_num,c): li = Signal("internal inductance",["jpf/gs/bl-li Date: Wed, 6 Dec 2017 16:02:37 -0500 Subject: [PATCH 369/744] Default --- examples/conf.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index cd8b6247..358a5adf 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,14 +3,14 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' -target: 'hinge' #'maxhinge' #'maxhinge' #'binary' #'hinge' +target: 'maxhinge' #'maxhinge' #'maxhinge' #'binary' #'hinge' num_gpus: 4 paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'd3d_data_0D' #'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: 'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" @@ -51,7 +51,7 @@ data: floatx: 'float32' model: - shallow: True + shallow: False shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training type: "mlp" #"xgboost" #"xgboost" #"random_forest" "xgboost" From d77d57073c3ca4d1859198be0e8748063e0f6857 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Wed, 6 Dec 2017 19:23:58 -0500 Subject: [PATCH 370/744] Reduce verbosity --- plasma/preprocessor/normalize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index d52ffab1..06e9ed3d 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -412,5 +412,5 @@ def get_individual_shot_file(prepath,shot_num,ext='.txt'): def apply_positivity(shot): for (i,sig) in enumerate(shot.signals): if sig.is_strictly_positive: - print ('Applying positivity constraint to {} signal'.format(sig.description)) + #print ('Applying positivity constraint to {} signal'.format(sig.description)) shot.signals_dict[sig]=np.clip(shot.signals_dict[sig],0,np.inf) From 624058ac1bb76ed514be968e936d37df1b25c38d Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 19:27:22 -0500 Subject: [PATCH 371/744] Cleanup obsolete examples --- examples/dynamic_lstm.py | 321 ---------------------------------- examples/mnist_distributed.py | 214 ----------------------- 2 files changed, 535 deletions(-) delete mode 100644 examples/dynamic_lstm.py delete mode 100644 examples/mnist_distributed.py diff --git a/examples/dynamic_lstm.py b/examples/dynamic_lstm.py deleted file mode 100644 index 913935a7..00000000 --- a/examples/dynamic_lstm.py +++ /dev/null @@ -1,321 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import -from __future__ import division - -import math -import sys -import time - - -import tensorflow as tf -import random -import tempfile - -NUM_GPUS = 4 -data_dir = '/scratch/network/alexeys' -from plasma.utils.mpi_launch_tensorflow import get_mpi_cluster_server_jobname - -flags = tf.app.flags -#flags.DEFINE_string("data_dir", "/scratch/network/alexeys/", -# "Directory for storing mnist data") -#flags.DEFINE_boolean("download_only", False, -# "Only perform downloading of data; Do not proceed to " -# "session preparation, model definition or training") -flags.DEFINE_integer("task_index", None, - "Worker task index, should be >= 0. task_index=0 is " - "the master worker task the performs the variable " - "initialization ") -flags.DEFINE_integer("replicas_to_aggregate", None, - "Number of replicas to aggregate before parameter update" - "is applied (For sync_replicas mode only; default: " - "num_workers)") -flags.DEFINE_integer("hidden_units", 100, - "Number of units in the hidden layer of the NN") -flags.DEFINE_integer("train_steps", 20000, - "Number of (global) training steps to perform") -flags.DEFINE_integer("batch_size", 100, "Training batch size") -flags.DEFINE_float("learning_rate", 0.01, "Learning rate") -flags.DEFINE_boolean("sync_replicas", False, - "Use the sync_replicas (synchronized replicas) mode, " - "wherein the parameter updates from workers are aggregated " - "before applied to avoid stale gradients") - -FLAGS = flags.FLAGS - - -# ==================== -# TOY DATA GENERATOR -# ==================== -class ToySequenceData(object): - """ Generate sequence of data with dynamic length. - This class generate samples for training: - - Class 0: linear sequences (i.e. [0, 1, 2, 3,...]) - - Class 1: random sequences (i.e. [1, 3, 10, 7,...]) - - NOTICE: - We have to pad each sequence to reach 'max_seq_len' for TensorFlow - consistency (we cannot feed a numpy array with inconsistent - dimensions). The dynamic calculation will then be perform thanks to - 'seqlen' attribute that records every actual sequence length. - """ - def __init__(self, n_samples=1000, max_seq_len=20, min_seq_len=3, - max_value=1000): - self.data = [] - self.labels = [] - self.seqlen = [] - for i in range(n_samples): - # Random sequence length - len = random.randint(min_seq_len, max_seq_len) - # Monitor sequence length for TensorFlow dynamic calculation - self.seqlen.append(len) - # Add a random or linear int sequence (50% prob) - if random.random() < .5: - # Generate a linear sequence - rand_start = random.randint(0, max_value - len) - s = [[float(i)/max_value] for i in - range(rand_start, rand_start + len)] - # Pad sequence for dimension consistency - s += [[0.] for i in range(max_seq_len - len)] - self.data.append(s) - self.labels.append([1., 0.]) - else: - # Generate a random sequence - s = [[float(random.randint(0, max_value))/max_value] - for i in range(len)] - # Pad sequence for dimension consistency - s += [[0.] for i in range(max_seq_len - len)] - self.data.append(s) - self.labels.append([0., 1.]) - self.batch_id = 0 - - def next(self, batch_size): - """ Return a batch of data. When dataset end is reached, start over. - """ - if self.batch_id == len(self.data): - self.batch_id = 0 - batch_data = (self.data[self.batch_id:min(self.batch_id + - batch_size, len(self.data))]) - batch_labels = (self.labels[self.batch_id:min(self.batch_id + - batch_size, len(self.data))]) - batch_seqlen = (self.seqlen[self.batch_id:min(self.batch_id + - batch_size, len(self.data))]) - self.batch_id = min(self.batch_id + batch_size, len(self.data)) - return batch_data, batch_labels, batch_seqlen - -def dynamicRNN(x, seqlen, seq_max_len, n_hidden, weights, biases): - - # Prepare data shape to match `rnn` function requirements - # Current data input shape: (batch_size, n_steps, n_input) - # Required shape: 'n_steps' tensors list of shape (batch_size, n_input) - - # Permuting batch_size and n_steps - x = tf.transpose(x, [1, 0, 2]) - # Reshaping to (n_steps*batch_size, n_input) - x = tf.reshape(x, [-1, 1]) - # Split to get a list of 'n_steps' tensors of shape (batch_size, n_input) - x = tf.split(0, seq_max_len, x) - - # Define a lstm cell with tensorflow - lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden) - - # Get lstm cell output, providing 'sequence_length' will perform dynamic - # calculation. - outputs, states = tf.nn.rnn(lstm_cell, x, dtype=tf.float32, - sequence_length=seqlen) - - # When performing dynamic calculation, we must retrieve the last - # dynamically computed output, i.e., if a sequence length is 10, we need - # to retrieve the 10th output. - # However TensorFlow doesn't support advanced indexing yet, so we build - # a custom op that for each sample in batch size, get its length and - # get the corresponding relevant output. - - # 'outputs' is a list of output at every timestep, we pack them in a Tensor - # and change back dimension to [batch_size, n_step, n_input] - outputs = tf.pack(outputs) - outputs = tf.transpose(outputs, [1, 0, 2]) - - # Hack to build the indexing and retrieve the right output. - batch_size = tf.shape(outputs)[0] - # Start indices for each sample - index = tf.range(0, batch_size) * seq_max_len + (seqlen - 1) - # Indexing - outputs = tf.gather(tf.reshape(outputs, [-1, n_hidden]), index) - - # Linear activation, using outputs computed above - return tf.matmul(outputs, weights['out']) + biases['out'] - - - -def main(unused_argv): - - cluster,server,job_name,task_index,num_workers = get_mpi_cluster_server_jobname(num_ps = 1, num_workers = 2) - if job_name == "ps": - server.join() - - is_chief = (task_index == 0) - if NUM_GPUS > 0: - if NUM_GPUS < num_workers: - raise ValueError("number of gpus is less than number of workers") - # Avoid gpu allocation conflict: now allocate task_num -> #gpu - # for each worker in the corresponding machine - MY_GPU = (task_index % NUM_GPUS) - worker_device = "/job:worker/task:%d/gpu:%d" % (task_index, MY_GPU) - elif NUM_GPUS == 0: - raise ValueError("number of gpus is zero") - # # Just allocate the CPU to worker server - # cpu = 0 - # worker_device = "/job:worker/task:%d/cpu:%d" % (task_index, cpu) - # The device setter will automatically place Variables ops on separate - # parameter servers (ps). The non-Variable ops will be placed on the workers. - # The ps use CPU and workers use corresponding GPU - with tf.device( - tf.train.replica_device_setter( - worker_device=worker_device, - ps_device="/job:ps/cpu:0", - cluster=cluster)): - global_step = tf.Variable(0, name="global_step", trainable=False) - - # Parameters - display_step = 10 - - # Network Parameters - #The rest of parameters is provided through the FLAGS - seq_max_len = 20 # Sequence max length - n_classes = 2 # linear sequence or not - - trainset = ToySequenceData(n_samples=1000, max_seq_len=seq_max_len) - testset = ToySequenceData(n_samples=500, max_seq_len=seq_max_len) - - # tf Graph input - x = tf.placeholder("float", [None, seq_max_len, 1]) - y = tf.placeholder("float", [None, n_classes]) - # A placeholder for indicating each sequence length - seqlen = tf.placeholder(tf.int32, [None]) - - # Define weights - weights = { - 'out': tf.Variable(tf.random_normal([FLAGS.hidden_units, n_classes])) - } - biases = { - 'out': tf.Variable(tf.random_normal([n_classes])) - } - - pred = dynamicRNN(x, seqlen, seq_max_len, FLAGS.hidden_units, weights, biases) - - # Define loss and optimizer - cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) - opt = tf.train.GradientDescentOptimizer(learning_rate=FLAGS.learning_rate) #.minimize(cost) - - # Evaluate model - correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1)) - accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) - - if FLAGS.sync_replicas: - if FLAGS.replicas_to_aggregate is None: - replicas_to_aggregate = num_workers - else: - replicas_to_aggregate = FLAGS.replicas_to_aggregate - - opt = tf.train.SyncReplicasOptimizerV2( - opt, - replicas_to_aggregate=replicas_to_aggregate, - total_num_replicas=num_workers, - name="lstm_sync_replicas") - - train_step = opt.minimize(cost, global_step=global_step) - - if FLAGS.sync_replicas: - local_init_op = opt.local_step_init_op - if is_chief: - local_init_op = opt.chief_init_op - - ready_for_local_init_op = opt.ready_for_local_init_op - - # Initial token and chief queue runners required by the sync_replicas mode - chief_queue_runner = opt.get_chief_queue_runner() - sync_init_op = opt.get_init_tokens_op() - - init_op = tf.initialize_all_variables() - train_dir = tempfile.mkdtemp() - - if FLAGS.sync_replicas: - sv = tf.train.Supervisor( - is_chief=is_chief, - logdir=train_dir, - init_op=init_op, - local_init_op=local_init_op, - ready_for_local_init_op=ready_for_local_init_op, - recovery_wait_secs=1, - global_step=global_step) - else: - sv = tf.train.Supervisor( - is_chief=is_chief, - logdir=train_dir, - init_op=init_op, - recovery_wait_secs=1, - global_step=global_step) - - sess_config = tf.ConfigProto( - allow_soft_placement=True, - log_device_placement=False, - device_filters=["/job:ps", "/job:worker/task:%d" % task_index]) - - # The chief worker (task_index==0) session will prepare the session, - # while the remaining workers will wait for the preparation to complete. - if is_chief: - print("Worker %d: Initializing session..." % task_index) - else: - print("Worker %d: Waiting for session to be initialized..." % task_index) - - #if FLAGS.existing_servers: - # server_grpc_url = "grpc://" + worker_spec[task_index] - # print("Using existing server at: %s" % server_grpc_url) - # - # sess = sv.prepare_or_wait_for_session(server_grpc_url, - # config=sess_config) - #else: - sess = sv.prepare_or_wait_for_session(server.target, config=sess_config) - - print("Worker %d: Session initialization complete." % task_index) - - if FLAGS.sync_replicas and is_chief: - # Chief worker will start the chief queue runner and call the init op. - sess.run(sync_init_op) - sv.start_queue_runners(sess, [chief_queue_runner]) - - # Perform training - time_begin = time.time() - print("Training begins @ %f" % time_begin) - - local_step = 0 - while True: - # Training feed - batch_xs, batch_ys, batch_seqlen = trainset.next(FLAGS.batch_size) - train_feed = {x: batch_xs, y: batch_ys, seqlen: batch_seqlen} - - _, step = sess.run([train_step, global_step], feed_dict=train_feed) - local_step += 1 - - now = time.time() - print("%f: Worker %d: training step %d done (global step: %d)" % - (now, task_index, local_step, step)) - - if step >= FLAGS.train_steps: - break - - time_end = time.time() - print("Training ends @ %f" % time_end) - training_time = time_end - time_begin - print("Training elapsed time: %f s" % training_time) - - # Calculate accuracy - #test_data = testset.data - #test_label = testset.labels - #test_seqlen = testset.seqlen - #print("Testing Accuracy:", \ - # sess.run(accuracy, feed_dict={x: test_data, y: test_label, - # seqlen: test_seqlen})) - -if __name__ == "__main__": - tf.app.run() diff --git a/examples/mnist_distributed.py b/examples/mnist_distributed.py deleted file mode 100644 index f357ea96..00000000 --- a/examples/mnist_distributed.py +++ /dev/null @@ -1,214 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import math -import sys -import tempfile -import time - -import tensorflow as tf -from tensorflow.examples.tutorials.mnist import input_data - -NUM_GPUS = 4 -data_dir = '/scratch/network/alexeys' -from plasma.utils.mpi_launch_tensorflow import get_mpi_cluster_server_jobname - -flags = tf.app.flags -flags.DEFINE_string("data_dir", "/scratch/network/alexeys/", - "Directory for storing mnist data") -flags.DEFINE_boolean("download_only", False, - "Only perform downloading of data; Do not proceed to " - "session preparation, model definition or training") -flags.DEFINE_integer("task_index", None, - "Worker task index, should be >= 0. task_index=0 is " - "the master worker task the performs the variable " - "initialization ") -flags.DEFINE_integer("replicas_to_aggregate", None, - "Number of replicas to aggregate before parameter update" - "is applied (For sync_replicas mode only; default: " - "num_workers)") -flags.DEFINE_integer("hidden_units", 100, - "Number of units in the hidden layer of the NN") -flags.DEFINE_integer("train_steps", 200, - "Number of (global) training steps to perform") -flags.DEFINE_integer("batch_size", 100, "Training batch size") -flags.DEFINE_float("learning_rate", 0.01, "Learning rate") -flags.DEFINE_boolean("sync_replicas", False, - "Use the sync_replicas (synchronized replicas) mode, " - "wherein the parameter updates from workers are aggregated " - "before applied to avoid stale gradients") - -FLAGS = flags.FLAGS - - -IMAGE_PIXELS = 28 - - -def main(unused_argv): - mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) - if FLAGS.download_only: - sys.exit(0) - - cluster,server,job_name,task_index,num_workers = get_mpi_cluster_server_jobname(num_ps = 1, num_workers = 2) - - if job_name == "ps": - server.join() - - is_chief = (task_index == 0) - if NUM_GPUS > 0: - if NUM_GPUS < num_workers: - raise ValueError("number of gpus is less than number of workers") - # Avoid gpu allocation conflict: now allocate task_num -> #gpu - # for each worker in the corresponding machine - MY_GPU = (task_index % NUM_GPUS) - worker_device = "/job:worker/task:%d/gpu:%d" % (task_index, MY_GPU) - elif NUM_GPUS == 0: - raise ValueError("number of gpus is zero") - # # Just allocate the CPU to worker server - # cpu = 0 - # worker_device = "/job:worker/task:%d/cpu:%d" % (task_index, cpu) - # The device setter will automatically place Variables ops on separate - # parameter servers (ps). The non-Variable ops will be placed on the workers. - # The ps use CPU and workers use corresponding GPU - with tf.device( - tf.train.replica_device_setter( - worker_device=worker_device, - ps_device="/job:ps/cpu:0", - cluster=cluster)): - global_step = tf.Variable(0, name="global_step", trainable=False) - - # Variables of the hidden layer - hid_w = tf.Variable( - tf.truncated_normal( - [IMAGE_PIXELS * IMAGE_PIXELS, FLAGS.hidden_units], - stddev=1.0 / IMAGE_PIXELS), - name="hid_w") - hid_b = tf.Variable(tf.zeros([FLAGS.hidden_units]), name="hid_b") - - # Variables of the softmax layer - sm_w = tf.Variable( - tf.truncated_normal( - [FLAGS.hidden_units, 10], - stddev=1.0 / math.sqrt(FLAGS.hidden_units)), - name="sm_w") - sm_b = tf.Variable(tf.zeros([10]), name="sm_b") - - # Ops: located on the worker specified with FLAGS.task_index - x = tf.placeholder(tf.float32, [None, IMAGE_PIXELS * IMAGE_PIXELS]) - y_ = tf.placeholder(tf.float32, [None, 10]) - - hid_lin = tf.nn.xw_plus_b(x, hid_w, hid_b) - hid = tf.nn.relu(hid_lin) - - y = tf.nn.softmax(tf.nn.xw_plus_b(hid, sm_w, sm_b)) - cross_entropy = -tf.reduce_sum(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) - - opt = tf.train.AdamOptimizer(FLAGS.learning_rate) - - if FLAGS.sync_replicas: - if FLAGS.replicas_to_aggregate is None: - replicas_to_aggregate = num_workers - else: - replicas_to_aggregate = FLAGS.replicas_to_aggregate - - opt = tf.train.SyncReplicasOptimizerV2( - opt, - replicas_to_aggregate=replicas_to_aggregate, - total_num_replicas=num_workers, - name="mnist_sync_replicas") - - train_step = opt.minimize(cross_entropy, global_step=global_step) - - if FLAGS.sync_replicas: - local_init_op = opt.local_step_init_op - if is_chief: - local_init_op = opt.chief_init_op - - ready_for_local_init_op = opt.ready_for_local_init_op - - # Initial token and chief queue runners required by the sync_replicas mode - chief_queue_runner = opt.get_chief_queue_runner() - sync_init_op = opt.get_init_tokens_op() - - init_op = tf.initialize_all_variables() - train_dir = tempfile.mkdtemp() - - if FLAGS.sync_replicas: - sv = tf.train.Supervisor( - is_chief=is_chief, - logdir=train_dir, - init_op=init_op, - local_init_op=local_init_op, - ready_for_local_init_op=ready_for_local_init_op, - recovery_wait_secs=1, - global_step=global_step) - else: - sv = tf.train.Supervisor( - is_chief=is_chief, - logdir=train_dir, - init_op=init_op, - recovery_wait_secs=1, - global_step=global_step) - - sess_config = tf.ConfigProto( - allow_soft_placement=True, - log_device_placement=False, - device_filters=["/job:ps", "/job:worker/task:%d" % task_index]) - - # The chief worker (task_index==0) session will prepare the session, - # while the remaining workers will wait for the preparation to complete. - if is_chief: - print("Worker %d: Initializing session..." % task_index) - else: - print("Worker %d: Waiting for session to be initialized..." % task_index) - - #if FLAGS.existing_servers: - # server_grpc_url = "grpc://" + worker_spec[task_index] - # print("Using existing server at: %s" % server_grpc_url) - # - # sess = sv.prepare_or_wait_for_session(server_grpc_url, - # config=sess_config) - #else: - sess = sv.prepare_or_wait_for_session(server.target, config=sess_config) - - print("Worker %d: Session initialization complete." % task_index) - - if FLAGS.sync_replicas and is_chief: - # Chief worker will start the chief queue runner and call the init op. - sess.run(sync_init_op) - sv.start_queue_runners(sess, [chief_queue_runner]) - - # Perform training - time_begin = time.time() - print("Training begins @ %f" % time_begin) - - local_step = 0 - while True: - # Training feed - batch_xs, batch_ys = mnist.train.next_batch(FLAGS.batch_size) - train_feed = {x: batch_xs, y_: batch_ys} - - _, step = sess.run([train_step, global_step], feed_dict=train_feed) - local_step += 1 - - now = time.time() - print("%f: Worker %d: training step %d done (global step: %d)" % - (now, task_index, local_step, step)) - - if step >= FLAGS.train_steps: - break - - time_end = time.time() - print("Training ends @ %f" % time_end) - training_time = time_end - time_begin - print("Training elapsed time: %f s" % training_time) - - # Validation feed - val_feed = {x: mnist.validation.images, y_: mnist.validation.labels} - val_xent = sess.run(cross_entropy, feed_dict=val_feed) - print("After %d training step(s), validation cross entropy = %g" % (FLAGS.train_steps, val_xent)) - - -if __name__ == "__main__": - tf.app.run() From 42ecc8cf5698844b390db0f09ba173b7d21e322a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 20:19:38 -0500 Subject: [PATCH 372/744] all_signals -> use_signals --- plasma/primitives/shots.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 56d0d48d..547ee527 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -18,8 +18,6 @@ from plasma.utils.processing import train_test_split,cut_and_resample_signal -import pdb - class ShotListFiles(object): def __init__(self,machine,prepath,paths,description=''): self.machine = machine @@ -119,7 +117,7 @@ def split_train_test(self,conf): train_frac = conf['training']['train_frac'] shuffle_training = conf['training']['shuffle_training'] use_shots = conf['data']['use_shots'] - all_signals = conf['paths']['all_signals'] + use_signals = conf['paths']['use_signals'] #split randomly use_shots_train = int(round(train_frac*use_shots)) use_shots_test = int(round((1-train_frac)*use_shots)) @@ -128,10 +126,10 @@ def split_train_test(self,conf): #train and test list given else: shot_list_train = ShotList() - shot_list_train.load_from_shot_list_files_objects(shot_files,all_signals) + shot_list_train.load_from_shot_list_files_objects(shot_files,use_signals) shot_list_test = ShotList() - shot_list_test.load_from_shot_list_files_objects(shot_files_test,all_signals) + shot_list_test.load_from_shot_list_files_objects(shot_files_test,use_signals) shot_numbers_train = [shot.number for shot in shot_list_train] From 4f408891eaf92e52896d1fc5781f9bfb8315a8c1 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 20:20:43 -0500 Subject: [PATCH 373/744] all_signals -> use_signals --- plasma/preprocessor/preprocess.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index f6dfde53..755521b0 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -74,9 +74,9 @@ def preprocess_all(self): def preprocess_from_files(self,shot_files,use_shots): #all shots, including invalid ones - all_signals = self.conf['paths']['all_signals'] + use_signals = self.conf['paths']['use_signals'] shot_list = ShotList() - shot_list.load_from_shot_list_files_objects(shot_files,all_signals) + shot_list.load_from_shot_list_files_objects(shot_files,use_signals) shot_list_picked = shot_list.random_sublist(use_shots) #empty From e09122f612d595144605307457425a998f88cf9a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 20:21:06 -0500 Subject: [PATCH 374/744] all_signals -> use_signals --- plasma/preprocessor/normalize.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 06e9ed3d..d0df1513 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -98,9 +98,9 @@ def train(self): def train_on_files(self,shot_files,use_shots,all_machines): conf = self.conf - all_signals = conf['paths']['all_signals'] + use_signals = conf['paths']['use_signals'] shot_list = ShotList() - shot_list.load_from_shot_list_files_objects(shot_files,all_signals) + shot_list.load_from_shot_list_files_objects(shot_files,use_signals) shot_list_picked = shot_list.random_sublist(use_shots) previously_saved,machines_saved = self.previously_saved_stats() From d69e64a4441f7ff87a7f73e73010d58394e3ca75 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 21:46:42 -0500 Subject: [PATCH 375/744] Keep all_signals for preprocessing, adjust all_signals in the conf_parser.py instead --- plasma/preprocessor/normalize.py | 4 ++-- plasma/preprocessor/preprocess.py | 4 ++-- plasma/primitives/shots.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index d0df1513..06e9ed3d 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -98,9 +98,9 @@ def train(self): def train_on_files(self,shot_files,use_shots,all_machines): conf = self.conf - use_signals = conf['paths']['use_signals'] + all_signals = conf['paths']['all_signals'] shot_list = ShotList() - shot_list.load_from_shot_list_files_objects(shot_files,use_signals) + shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) previously_saved,machines_saved = self.previously_saved_stats() diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 755521b0..f6dfde53 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -74,9 +74,9 @@ def preprocess_all(self): def preprocess_from_files(self,shot_files,use_shots): #all shots, including invalid ones - use_signals = self.conf['paths']['use_signals'] + all_signals = self.conf['paths']['all_signals'] shot_list = ShotList() - shot_list.load_from_shot_list_files_objects(shot_files,use_signals) + shot_list.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_picked = shot_list.random_sublist(use_shots) #empty diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 547ee527..ca9e1d14 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -117,7 +117,7 @@ def split_train_test(self,conf): train_frac = conf['training']['train_frac'] shuffle_training = conf['training']['shuffle_training'] use_shots = conf['data']['use_shots'] - use_signals = conf['paths']['use_signals'] + all_signals = conf['paths']['all_signals'] #split randomly use_shots_train = int(round(train_frac*use_shots)) use_shots_test = int(round((1-train_frac)*use_shots)) @@ -126,10 +126,10 @@ def split_train_test(self,conf): #train and test list given else: shot_list_train = ShotList() - shot_list_train.load_from_shot_list_files_objects(shot_files,use_signals) + shot_list_train.load_from_shot_list_files_objects(shot_files,all_signals) shot_list_test = ShotList() - shot_list_test.load_from_shot_list_files_objects(shot_files_test,use_signals) + shot_list_test.load_from_shot_list_files_objects(shot_files_test,all_signals) shot_numbers_train = [shot.number for shot in shot_list_train] From 2bac566e82aa9ecdbf190cae14d8713efd23c0a9 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 6 Dec 2017 21:55:12 -0500 Subject: [PATCH 376/744] All_signals may include signals which are not available for download causing all shots to be invalid during preprocessing. Make sure it is set to the proper signals dict --- plasma/conf_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 9455664a..112ba62b 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -137,7 +137,7 @@ def parameters(input_file): else: #default case params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) - params['paths']['all_signals'] = list(params['paths']['all_signals_dict'].values()) + params['paths']['all_signals'] = list(params['paths']['use_signals_dict'].values()) print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) From ea976cdf23724d0c63b5539179fc6bfe0066d568 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 13:27:58 -0500 Subject: [PATCH 377/744] Remove signals which are not yet downlaoded --- data/signals.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/signals.py b/data/signals.py index 7c3141ea..afbcee8f 100644 --- a/data/signals.py +++ b/data/signals.py @@ -213,12 +213,12 @@ def fetch_nstx_data(signal_path,shot_num,c): #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp 'etemp_profile':etemp_profile,'edens_profile':edens_profile, -'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, -'trot_profile':trot_profile,'pthm_profile':pthm_profile, -'neut_profile':neut_profile,'q_profile':q_profile, -'bootstrap_current_profile':bootstrap_current_profile, -'q_psi_profile':q_psi_profile -} +'itemp_profile':itemp_profile,'zdens_profile':zdens_profile} +#'trot_profile':trot_profile,'pthm_profile':pthm_profile, +#'neut_profile':neut_profile,'q_profile':q_profile, +#'bootstrap_current_profile':bootstrap_current_profile, +#'q_psi_profile':q_psi_profile +#} #new signals are not downloaded yet From 9075af5a799d67276eae403c9491ad60e9b1fc81 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 13:29:38 -0500 Subject: [PATCH 378/744] Revert 2bac566e82aa9ecdbf190cae14d8713efd23c0a9, We need all for cross machine. But always remove signals which are not downloaded --- plasma/conf_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 112ba62b..9455664a 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -137,7 +137,7 @@ def parameters(input_file): else: #default case params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) - params['paths']['all_signals'] = list(params['paths']['use_signals_dict'].values()) + params['paths']['all_signals'] = list(params['paths']['all_signals_dict'].values()) print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) From e30101720c56bb4da8cf764bbfc8f9f23848fadd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 15:12:01 -0500 Subject: [PATCH 379/744] Preprocess once on all signals (like you'd do for cross machine) --- plasma/conf_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 9455664a..67cae936 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -132,12 +132,12 @@ def parameters(input_file): selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} params['paths']['use_signals'] = list(selected_signals.values()) - selected_signals = {k: params['paths']['all_signals_dict'][k] for k in params['paths']['specific_signals']} + selected_signals = {k: fully_defined_signals[k] for k in params['paths']['specific_signals']} params['paths']['all_signals'] = list(selected_signals.values()) else: #default case params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) - params['paths']['all_signals'] = list(params['paths']['all_signals_dict'].values()) + params['paths']['all_signals'] = list(fully_defined_signals.values()) print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) From eb67aae241f373caf69a7f1ad1208ee877831552 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 15:14:04 -0500 Subject: [PATCH 380/744] Clip to good statistical tange after normalization --- plasma/preprocessor/normalize.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 06e9ed3d..951513ab 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -43,6 +43,7 @@ def __init__(self,conf): self.remapper = conf['data']['target'].remapper self.machines = set() self.inference_mode = False + self.bound = self.conf['data']['norm_stat_range'] @abc.abstractmethod def __str__(self): @@ -192,6 +193,7 @@ def __init__(self,conf): Normalizer.__init__(self,conf) self.means = dict() self.stds = dict() + self.bound = self.conf['data']['norm_stat_range'] def __str__(self): s = '' @@ -246,6 +248,7 @@ def apply(self,shot): if stds_curr == 0.0: stds_curr = 1.0 shot.signals_dict[sig] = (shot.signals_dict[sig] - means[i])/stds_curr + shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) @@ -288,6 +291,7 @@ def apply(self,shot): if stds_curr == 0.0: stds_curr = 1.0 shot.signals_dict[sig] = (shot.signals_dict[sig])/stds_curr + shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) @@ -312,6 +316,7 @@ def apply(self,shot): for (i,sig) in enumerate(shot.signals): if sig.normalize: shot.signals_dict[sig] = apply_along_axis(lambda m : correlate(m,window,'valid'),axis=0,arr=shot.signals_dict[sig]) + shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) shot.ttd = shot.ttd[-shot.signals.shape[0]:] def __str__(self): @@ -330,6 +335,7 @@ def __init__(self,conf): Normalizer.__init__(self,conf) self.minimums = None self.maximums = None + self.bound = self.conf['data']['norm_stat_range'] def __str__(self): @@ -379,6 +385,7 @@ def apply(self,shot): for (i,sig) in enumerate(shot.signals): if sig.normalize: shot.signals_dict[sig] = (shot.signals_dict[sig] - self.minimums[m])/(self.maximums[m] - self.minimums[m]) + shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) self.cut_end_of_shot(shot) # self.apply_positivity_mask(shot) From 189a21cd2a91335aad147341e91b0bed55505992 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 15:14:38 -0500 Subject: [PATCH 381/744] Introduce a tunable parameter to control statistical range after normalization from conf --- examples/conf.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/conf.yaml b/examples/conf.yaml index 358a5adf..d914b636 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -46,6 +46,7 @@ data: window_size: 10 #TODO optimize normalizer: 'var' + norm_stat_range: 100.0 equalize_classes: False # shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model floatx: 'float32' From 08dc60b2185561212f05ceb4ddcad895e8be14f2 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 15:43:20 -0500 Subject: [PATCH 382/744] Revert e30101720c56bb4da8cf764bbfc8f9f23848fadd, remove iptarget and iperr as not valid for all --- plasma/conf_parser.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 67cae936..51b118de 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -95,7 +95,7 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, - 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, + 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect, #'iptarget':iptarget,'iperr':iperr, 'etemp_profile':etemp_profile ,'edens_profile':edens_profile} elif params['paths']['data'] == 'd3d_data_1D': params['paths']['shot_files'] = [d3d_full] @@ -105,7 +105,7 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, - 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr} + 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect} #,'iptarget':iptarget,'iperr':iperr} elif params['paths']['data'] == 'd3d_data_all': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] @@ -132,12 +132,12 @@ def parameters(input_file): selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} params['paths']['use_signals'] = list(selected_signals.values()) - selected_signals = {k: fully_defined_signals[k] for k in params['paths']['specific_signals']} + selected_signals = {k: params['paths']['all_signals_dict'][k] for k in params['paths']['specific_signals']} params['paths']['all_signals'] = list(selected_signals.values()) else: #default case params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) - params['paths']['all_signals'] = list(fully_defined_signals.values()) + params['paths']['all_signals'] = list(params['paths']['all_signals_dict'].values()) print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) From baf15a0036e1bb3474cde7612028d2737bb54ff0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 15:43:50 -0500 Subject: [PATCH 383/744] Remove iptarget and iperr before understood --- data/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index afbcee8f..ce378f97 100644 --- a/data/signals.py +++ b/data/signals.py @@ -209,7 +209,7 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, 'pin':pin,'torquein':torquein, 'energydt':energydt, - 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, + 'ipdirect':ipdirect, #'iptarget':iptarget,'iperr':iperr, #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp 'etemp_profile':etemp_profile,'edens_profile':edens_profile, From aefb5297ebf0ea6640cfd0215611df1830de0ff0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 8 Dec 2017 20:30:10 -0500 Subject: [PATCH 384/744] Fixed: d3d_data working --- data/signals.py | 13 +++++-------- plasma/conf_parser.py | 8 +++----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/data/signals.py b/data/signals.py index ce378f97..38cea268 100644 --- a/data/signals.py +++ b/data/signals.py @@ -204,16 +204,13 @@ def fetch_nstx_data(signal_path,shot_num,c): #} #Restricted subset to those signals that are present for most shots. The idea is to remove signals that cause many shots to be dropped from the dataset. -all_signals = {'q95':q95,'li':li,'ip':ip, -'betan':betan,'energy':energy,'lm':lm,'dens':dens, -'pradcore':pradcore,'pradedge':pradedge,'pradtot':pradtot, -'pin':pin,'torquein':torquein, -'energydt':energydt, - 'ipdirect':ipdirect, #'iptarget':iptarget,'iperr':iperr, +all_signals = {'q95':q95,'li':li,'ip':ip,'betan':betan,'energy':energy,'lm':lm,'dens':dens,'pradcore':pradcore, +'pradedge':pradedge,'pradtot':pradtot,'pin':pin, +'torquein':torquein, +'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +'etemp_profile':etemp_profile,'edens_profile':edens_profile} #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp -'etemp_profile':etemp_profile,'edens_profile':edens_profile, -'itemp_profile':itemp_profile,'zdens_profile':zdens_profile} #'trot_profile':trot_profile,'pthm_profile':pthm_profile, #'neut_profile':neut_profile,'q_profile':q_profile, #'bootstrap_current_profile':bootstrap_current_profile, diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 51b118de..c917ee52 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -94,9 +94,8 @@ def parameters(input_file): elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, - 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect, #'iptarget':iptarget,'iperr':iperr, - 'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +'etemp_profile':etemp_profile ,'edens_profile':edens_profile} elif params['paths']['data'] == 'd3d_data_1D': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] @@ -104,8 +103,7 @@ def parameters(input_file): elif params['paths']['data'] == 'd3d_data_0D': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore, - 'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect} #,'iptarget':iptarget,'iperr':iperr} + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr} elif params['paths']['data'] == 'd3d_data_all': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] From 2e7b3fa991416164986615880e8bb5878d80b8d9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 10 Dec 2017 17:49:49 -0500 Subject: [PATCH 385/744] sorting of 1D signals such that they are at the end. Extended is_strictly_positive to 1D signals. Fixed bug where attribute and function had the same name is_strictly_positive --- data/signals.py | 10 +++++----- examples/performance_analysis.py | 23 ++++++++++++----------- plasma/conf_parser.py | 17 ++++++++++++----- plasma/models/builder.py | 6 +++--- plasma/primitives/data.py | 6 +++--- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/data/signals.py b/data/signals.py index afbcee8f..1bc14539 100644 --- a/data/signals.py +++ b/data/signals.py @@ -213,11 +213,11 @@ def fetch_nstx_data(signal_path,shot_num,c): #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp 'etemp_profile':etemp_profile,'edens_profile':edens_profile, -'itemp_profile':itemp_profile,'zdens_profile':zdens_profile} -#'trot_profile':trot_profile,'pthm_profile':pthm_profile, -#'neut_profile':neut_profile,'q_profile':q_profile, -#'bootstrap_current_profile':bootstrap_current_profile, -#'q_psi_profile':q_psi_profile +'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, +'trot_profile':trot_profile,'pthm_profile':pthm_profile, +'neut_profile':neut_profile,'q_profile':q_profile, +'bootstrap_current_profile':bootstrap_current_profile, +'q_psi_profile':q_psi_profile} #} #new signals are not downloaded yet diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 69b4f8cb..4729a286 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -39,17 +39,18 @@ analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') -analyzer.example_plots(P_thresh_opt,'test','any') -analyzer.example_plots(P_thresh_opt,'test',['FP'],extra_filename='test') -analyzer.example_plots(P_thresh_opt,'test',['FN'],extra_filename='test') -analyzer.example_plots(P_thresh_opt,'test',['TP'],extra_filename='test') -analyzer.example_plots(P_thresh_opt,'test',['late'],extra_filename='test') - -analyzer.example_plots(P_thresh_opt,'train',['TN'],extra_filename='train') -analyzer.example_plots(P_thresh_opt,'train',['FP'],extra_filename='train') -analyzer.example_plots(P_thresh_opt,'train',['FN'],extra_filename='train') -analyzer.example_plots(P_thresh_opt,'train',['TP'],extra_filename='train') -analyzer.example_plots(P_thresh_opt,'train',['late'],extra_filename='train') +normalize = True +analyzer.example_plots(P_thresh_opt,'test','any',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'test',['FP'],extra_filename='test',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'test',['FN'],extra_filename='test',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'test',['TP'],extra_filename='test',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'test',['late'],extra_filename='test',normalize=normalize) + +analyzer.example_plots(P_thresh_opt,'train',['TN'],extra_filename='train',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'train',['FP'],extra_filename='train',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'train',['FN'],extra_filename='train',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'train',['TP'],extra_filename='train',normalize=normalize) +analyzer.example_plots(P_thresh_opt,'train',['late'],extra_filename='train',normalize=normalize) alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 67cae936..ded40110 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -101,6 +101,10 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + elif params['paths']['data'] == 'd3d_data_all_profiles': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile,'itemp_profile':itemp_profile,'zdens_profile':zdens_profile,'trot_profile':trot_profile,'pthm_profile':pthm_profile,'neut_profile':neut_profile,'q_profile':q_profile,'bootstrap_current_profile':bootstrap_current_profile,'q_psi_profile':q_psi_profile} elif params['paths']['data'] == 'd3d_data_0D': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] @@ -130,14 +134,13 @@ def parameters(input_file): print("Signal {} is not fully defined for {} machine. Skipping...".format(sig,params['paths']['data'].split("_")[0])) params['paths']['specific_signals'] = list(filter(lambda x: x in params['paths']['use_signals_dict'].keys(), params['paths']['specific_signals'])) selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} - params['paths']['use_signals'] = list(selected_signals.values()) + params['paths']['use_signals'] = sort_by_channels(list(selected_signals.values())) - selected_signals = {k: fully_defined_signals[k] for k in params['paths']['specific_signals']} - params['paths']['all_signals'] = list(selected_signals.values()) else: #default case - params['paths']['use_signals'] = list(params['paths']['use_signals_dict'].values()) - params['paths']['all_signals'] = list(fully_defined_signals.values()) + params['paths']['use_signals'] = sort_by_channels(list(params['paths']['use_signals_dict'].values())) + + params['paths']['all_signals'] = sort_by_channels(list(params['paths']['all_signals_dict'].values())) print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) @@ -153,3 +156,7 @@ def parameters(input_file): def get_unique_signal_hash(signals): return hash(tuple(sorted(signals))) +#make sure 1D signals come last! This is necessary for model builder. +def sort_by_channels(list_of_signals): + return sorted(list_of_signals,key = lambda x: x.num_channels) + diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 94ab93b5..62d000a5 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -147,9 +147,9 @@ def slicer_output_shape(input_shape,indices): pre_rnn = pre_rnn_input if model_conf['rnn_layers'] == 0: - pre_rnn = Dense(dense_size,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size/2,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size/4,activation='tanh',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size/2,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size/4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) x_input = Input(batch_shape = batch_input_shape) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index ab6eb8be..b6c9cb37 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -29,7 +29,7 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,i self.data_avail_tolerance = data_avail_tolerance self.is_strictly_positive=is_strictly_positive - def is_strictly_positive(self): + def is_strictly_positive_fn(self): return self.is_strictly_positive def is_ip(self): @@ -143,8 +143,8 @@ def __repr__(self): return self.description class ProfileSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerance=0): - super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerance=data_avail_tolerance) + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerance=0,is_strictly_positive=False): + super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerance=data_avail_tolerance,is_strictly_positive=is_strictly_positive) self.mapping_range = mapping_range self.num_channels = num_channels From c4bfa5c7c9d80af6c0e63103e28047edfc4c56b2 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 10 Dec 2017 17:58:41 -0500 Subject: [PATCH 386/744] syntax error fixed --- data/signals.py | 1 - 1 file changed, 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index 087254d7..047ff562 100644 --- a/data/signals.py +++ b/data/signals.py @@ -208,7 +208,6 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pradedge':pradedge,'pradtot':pradtot,'pin':pin, 'torquein':torquein, 'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -'etemp_profile':etemp_profile,'edens_profile':edens_profile} #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp 'etemp_profile':etemp_profile,'edens_profile':edens_profile, From c92cfd98960e2ba379872c5654011569e633a5af Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 10 Dec 2017 18:28:21 -0500 Subject: [PATCH 387/744] keep only etemp and edens for now as defaults --- data/signals.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/signals.py b/data/signals.py index 047ff562..b2292fa2 100644 --- a/data/signals.py +++ b/data/signals.py @@ -210,12 +210,12 @@ def fetch_nstx_data(signal_path,shot_num,c): 'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp -'etemp_profile':etemp_profile,'edens_profile':edens_profile, -'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, -'trot_profile':trot_profile,'pthm_profile':pthm_profile, -'neut_profile':neut_profile,'q_profile':q_profile, -'bootstrap_current_profile':bootstrap_current_profile, -'q_psi_profile':q_psi_profile} +'etemp_profile':etemp_profile,'edens_profile':edens_profile} +#'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, +#'trot_profile':trot_profile,'pthm_profile':pthm_profile, +#'neut_profile':neut_profile,'q_profile':q_profile, +#'bootstrap_current_profile':bootstrap_current_profile, +#'q_psi_profile':q_psi_profile} #} #new signals are not downloaded yet From 292f5948169896c0fd8b002a9fc9e1eb1b49a63b Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 12 Dec 2017 23:19:32 -0500 Subject: [PATCH 388/744] TigerGPU slurm file update --- examples/slurm.cmd | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index 75007cfe..ca0a4904 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -5,13 +5,15 @@ #SBATCH --ntasks-per-socket=2 #SBATCH --gres=gpu:4 #SBATCH -c 4 +#SBATCH --mem-per-cpu=0 - +export PYTHONHASHSEED=0 module load anaconda +source activate pppl module load cudatoolkit/8.0 -module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 module load cudnn/cuda-8.0/6.0 -source activate PPPL +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 #remove checkpoints for a benchmark run rm /tigress/alexeys/model_checkpoints/* From bc1001c4cd577e61371b17fb3d202f03ee250fe3 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 12 Dec 2017 23:22:47 -0500 Subject: [PATCH 389/744] Make user agnostic -- user alexeys env variable --- examples/slurm.cmd | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index ca0a4904..16af0d4f 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -16,11 +16,11 @@ module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 #remove checkpoints for a benchmark run -rm /tigress/alexeys/model_checkpoints/* -rm /tigress/alexeys/results/* -rm /tigress/alexeys/csv_logs/* -rm /tigress/alexeys/Graph/* -rm /tigress/alexeys/normalization/* +rm /tigress/$USER/model_checkpoints/* +rm /tigress/$USER/results/* +rm /tigress/$USER/csv_logs/* +rm /tigress/$USER/Graph/* +rm /tigress/$USER/normalization/* export OMPI_MCA_btl="tcp,self,sm" From 1db9bca64c7dce10da549e316a5a91856f2aecde Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 13 Dec 2017 16:06:40 -0500 Subject: [PATCH 390/744] added Rho JET signal --- data/signals.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index afbcee8f..8fa07efe 100644 --- a/data/signals.py +++ b/data/signals.py @@ -158,6 +158,8 @@ def fetch_nstx_data(signal_path,shot_num,c): # epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) +rho_profile_spatial = ProfileSignal("Rho at spatial positions",["ppf/hrts/rho"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) + etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25],data_avail_tolerance=0.05) # epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) @@ -211,7 +213,7 @@ def fetch_nstx_data(signal_path,shot_num,c): 'energydt':energydt, 'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, -# 'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp +# 'rho_profile_spatial':rho_profile_spatial,'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp 'etemp_profile':etemp_profile,'edens_profile':edens_profile, 'itemp_profile':itemp_profile,'zdens_profile':zdens_profile} #'trot_profile':trot_profile,'pthm_profile':pthm_profile, From 38df46de82d969154896ebe786cdd3acaed09588 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 13 Dec 2017 17:04:16 -0500 Subject: [PATCH 391/744] added normalized beta --- data/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index 85dcd4a7..c7b03fc5 100644 --- a/data/signals.py +++ b/data/signals.py @@ -181,7 +181,7 @@ def fetch_nstx_data(signal_path,shot_num,c): # pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) -betan = Signal("Normalized Beta",['d3d/efsbetan'],[d3d]) +betan = Signal("Normalized Beta",['jpf/gs/bl-bndia Date: Wed, 13 Dec 2017 17:25:24 -0500 Subject: [PATCH 392/744] normalized beta not available on jet --- data/signals.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index c7b03fc5..b96e0b2c 100644 --- a/data/signals.py +++ b/data/signals.py @@ -181,7 +181,8 @@ def fetch_nstx_data(signal_path,shot_num,c): # pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) -betan = Signal("Normalized Beta",['jpf/gs/bl-bndia Date: Thu, 14 Dec 2017 00:28:10 -0500 Subject: [PATCH 393/744] adding support for signals which use other signals as mappings, such as ppf/hrts/te (profile) and ppf/hrts/rho (rho coordinate) --- data/signals.py | 34 +++++++++++++++++----------------- plasma/primitives/data.py | 33 +++++++++++++++++++++++++++++---- plasma/primitives/shots.py | 4 ++-- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/data/signals.py b/data/signals.py index b96e0b2c..f57ca7bb 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,33 +137,33 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) -edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) -itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) -zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) -trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) -pthm_profile = ProfileSignal("Thermal pressure profile",["ZIPFIT01/PROFILES.PTHMFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02)# thermal pressure doesn't include fast ions -neut_profile = ProfileSignal("Neutrals profile",["ZIPFIT01/PROFILES.NEUTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +pthm_profile = ProfileSignal("Thermal pressure profile",["ZIPFIT01/PROFILES.PTHMFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02])# thermal pressure doesn't include fast ions +neut_profile = ProfileSignal("Neutrals profile",["ZIPFIT01/PROFILES.NEUTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -q_profile = ProfileSignal("Q profile",["ZIPFIT01/PROFILES.BOOTSTRAP.QRHO"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02)#compare to just q95 -bootstrap_current_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.BOOTSTRAP.JBS_SAUTER"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +q_profile = ProfileSignal("Q profile",["ZIPFIT01/PROFILES.BOOTSTRAP.QRHO"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02])#compare to just q95 +bootstrap_current_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.BOOTSTRAP.JBS_SAUTER"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -#equilibrium_image = 2DSignal("2D Magnetic Equilibrium",["EFIT01/RESULTS.GEQDSK.PSIRZ"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +#equilibrium_image = 2DSignal("2D Magnetic Equilibrium",["EFIT01/RESULTS.GEQDSK.PSIRZ"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) #EFIT is the inverse problem from external magnetic measurements -#pressure_profile = ProfileSignal("Pressure profile",["EFIT01/RESULTS.GEQDSK.PRES"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02)# pressure might be unphysical since it is not constrained by measurements, only the EFIT which does not know about density and temperature -q_psi_profile = ProfileSignal("Q(psi) profile",["EFIT01/RESULTS.GEQDSK.QPSI"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerance=0.02) +#pressure_profile = ProfileSignal("Pressure profile",["EFIT01/RESULTS.GEQDSK.PRES"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02])# pressure might be unphysical since it is not constrained by measurements, only the EFIT which does not know about density and temperature +q_psi_profile = ProfileSignal("Q(psi) profile",["EFIT01/RESULTS.GEQDSK.QPSI"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) # epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) -edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) -rho_profile_spatial = ProfileSignal("Rho at spatial positions",["ppf/hrts/rho"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerance=0.05) +etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) +edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) +rho_profile_spatial = ProfileSignal("Rho at spatial positions",["ppf/hrts/rho"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) -etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25],data_avail_tolerance=0.05) +etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25],data_avail_tolerances=[0.05]) # epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) -q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False,data_avail_tolerance=0.03) +q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False,data_avail_tolerances=[0.03,0.02]) ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipspr15V"],[jet,d3d],is_ip=True) #"d3d/ipsip" was used before, ipspr15V seems to be available for a superset of shots. iptarget = Signal("plasma current target",["d3d/ipsiptargt"],[d3d]) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index b6c9cb37..93a7497a 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -15,7 +15,10 @@ # self.signals.append(Signal(signal_descriptions[i],signal_paths[i])) class Signal(object): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,is_ip=False,normalize=True,data_avail_tolerance=0,is_strictly_positive=False): + def __init__(self,description,paths,machines,tex_label=None, + causal_shifts=None,is_ip=False,normalize=True, + data_avail_tolerances=None,is_strictly_positive=False, + mapping_paths=None): assert(len(paths) == len(machines)) self.description = description self.paths = paths @@ -26,8 +29,11 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,i self.is_ip = is_ip self.num_channels = 1 self.normalize = normalize - self.data_avail_tolerance = data_avail_tolerance + if data_avail_tolerances == None: + data_avail_tolerances = [0 for m in machines] + self.data_avail_tolerances = data_avail_tolerances self.is_strictly_positive=is_strictly_positive + self.mapping_paths = mapping_paths def is_strictly_positive_fn(self): return self.is_strictly_positive @@ -112,10 +118,21 @@ def get_path(self,machine): idx = self.get_idx(machine) return self.paths[idx] + def get_mapping_path(self,machine): + if self.mapping_paths is None: + return None + else: + idx = self.get_idx(machine) + return self.mapping_paths[idx] + def get_causal_shift(self,machine): idx = self.get_idx(machine) return self.causal_shifts[idx] + def get_data_avail_tolerance(self,machine): + idx = self.get_idx(machine) + return self.data_avail_tolerances[idx] + def get_idx(self,machine): assert(machine in self.machines) idx = self.machines.index(machine) @@ -143,8 +160,8 @@ def __repr__(self): return self.description class ProfileSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerance=0,is_strictly_positive=False): - super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerance=data_avail_tolerance,is_strictly_positive=is_strictly_positive) + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): + super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerance=data_avail_tolerance,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) self.mapping_range = mapping_range self.num_channels = num_channels @@ -195,10 +212,18 @@ def get_connection(self): def fetch_data(self,signal,shot_num,c): path = signal.get_path(self) + mapping_path = signal.get_mapping_path(self) success = False mapping = None try: time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) + if mapping_path is not None: + time_map,data_map,mapping_map,success_map = self.fetch_data_fn(mapping_path,shot_num,c) + assert(time == time_map), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) + success = (success and success_map) + if not success: + print("No success for signal {} and mapping {}".format(path,mapping_path)) + mapping = data_map except Exception as e: time,data = create_missing_value_filler() print(e) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index ca9e1d14..7316767a 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -401,11 +401,11 @@ def get_signals_and_times_from_file(self,conf): signal_arrays.append(sig) time_arrays.append(t) if self.is_disruptive and self.t_disrupt > np.max(t): - if self.t_disrupt > np.max(t) + signal.data_avail_tolerance: + if self.t_disrupt > np.max(t) + signal.get_data_avail_tolerance(self.machine): print('Shot {}: disruption event is not contained in valid time region of signal {} by {}s, omitting.'.format(self.number,signal,self.t_disrupt - np.max(t))) valid = False else: - t_max = np.max(t) + signal.data_avail_tolerance + t_max = np.max(t) + signal.get_data_avail_tolerance(self.machine) else: t_max = min(t_max,np.max(t)) From f519d7d23eb487a644635c269166638df88e1bc1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 00:52:17 -0500 Subject: [PATCH 394/744] syntax error --- plasma/primitives/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 93a7497a..dcbf4b44 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -161,7 +161,7 @@ def __repr__(self): class ProfileSignal(Signal): def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): - super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerance=data_avail_tolerance,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) + super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerances=data_avail_tolerances,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) self.mapping_range = mapping_range self.num_channels = num_channels From 3b379328f97b3a60c2f3519fef32523a58b69cf4 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 01:05:05 -0500 Subject: [PATCH 395/744] mapping is now always saved for every time step --- plasma/primitives/data.py | 17 +++++++++++------ plasma/utils/downloading.py | 3 ++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index dcbf4b44..5ab0428a 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -174,11 +174,12 @@ def load_data(self,prepath,shot,dtype='float32'): data = np.loadtxt(file_path,dtype=dtype) if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) - _ = data[0,0] - mapping = data[0,1:] + #_ = data[0,0] + T = data.shape[0]/2 #time is stored twice, once for mapping and once for signal + mapping = data[:T,1:] remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) - t = data[1:,0] - sig = data[1:,1:] + t = data[:T,0] + sig = data[T:,1:] if sig.shape[1] < 2: print('Signal {}, shot {} should be profile but has only one channel. Possibly only one profile fit was run for the duration of the shot and was transposed during downloading. Need at least 2.'.format(self.description,shot.number)) return None,None,False @@ -193,7 +194,7 @@ def load_data(self,prepath,shot,dtype='float32'): timesteps = len(t) sig_interp = np.zeros((timesteps,self.num_channels)) for i in range(timesteps): - f = UnivariateSpline(mapping,sig[i,:],s=0,k=1,ext=0) + f = UnivariateSpline(mapping[i,:],sig[i,:],s=0,k=1,ext=0) sig_interp[i,:] = f(remapping) return t,sig_interp,True @@ -217,13 +218,17 @@ def fetch_data(self,signal,shot_num,c): mapping = None try: time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) - if mapping_path is not None: + if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep + T = len(time) + mapping = np.tile(mapping,(T,1)) + if mapping_path is not None:#fetch the mapping separately time_map,data_map,mapping_map,success_map = self.fetch_data_fn(mapping_path,shot_num,c) assert(time == time_map), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) success = (success and success_map) if not success: print("No success for signal {} and mapping {}".format(path,mapping_path)) mapping = data_map + except Exception as e: time,data = create_missing_value_filler() print(e) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 39480299..b13ebf76 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -92,7 +92,8 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() if mapping is not None: - mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) + mapping_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(mapping))).transpose() + # mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) data_two_column = np.vstack((mapping_two_column,data_two_column)) try: #can lead to race condition mkdirdepth(save_path_full) From d5009a1b7d55493e466991ffcb2ef001f089e97b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 02:22:41 -0500 Subject: [PATCH 396/744] for d3d data mapping needs to be rotated --- data/signals.py | 12 ++++++------ plasma/primitives/data.py | 9 ++++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/data/signals.py b/data/signals.py index f57ca7bb..f3d9c593 100644 --- a/data/signals.py +++ b/data/signals.py @@ -213,12 +213,12 @@ def fetch_nstx_data(signal_path,shot_num,c): 'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, #'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'rho_profile_spatial':rho_profile_spatial,'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp -'etemp_profile':etemp_profile,'edens_profile':edens_profile} -#'itemp_profile':itemp_profile,'zdens_profile':zdens_profile} -#'trot_profile':trot_profile,'pthm_profile':pthm_profile, -#'neut_profile':neut_profile,'q_profile':q_profile, -#'bootstrap_current_profile':bootstrap_current_profile, -#'q_psi_profile':q_psi_profile} +'etemp_profile':etemp_profile,'edens_profile':edens_profile, +'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, +'trot_profile':trot_profile,'pthm_profile':pthm_profile, +'neut_profile':neut_profile,'q_profile':q_profile, +'bootstrap_current_profile':bootstrap_current_profile, +'q_psi_profile':q_psi_profile} #} #new signals are not downloaded yet diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 5ab0428a..bb89ee9c 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -220,14 +220,17 @@ def fetch_data(self,signal,shot_num,c): time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep T = len(time) - mapping = np.tile(mapping,(T,1)) + mapping = np.tile(mapping,(T,1)).transpose() + assert(mapping.shape == data.shape), "shape of mapping and data is different" if mapping_path is not None:#fetch the mapping separately time_map,data_map,mapping_map,success_map = self.fetch_data_fn(mapping_path,shot_num,c) - assert(time == time_map), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) success = (success and success_map) if not success: print("No success for signal {} and mapping {}".format(path,mapping_path)) - mapping = data_map + mapping = data + else: + assert(np.all(time == time_map)), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) + mapping = data_map except Exception as e: time,data = create_missing_value_filler() From 5f09a5c826541ecbf242da3c9cd3d5a675faae26 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 02:47:46 -0500 Subject: [PATCH 397/744] new format for empty shot data: a single array with entry -1. This removes all the confusing ways in which missing data was stored so far --- plasma/primitives/data.py | 41 +++++++++++++++++++++++-------------- plasma/utils/downloading.py | 39 ++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index bb89ee9c..0c82641a 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -53,23 +53,33 @@ def is_saved(self,prepath,shot): file_path = self.get_file_path(prepath,shot.machine,shot.number) return os.path.isfile(file_path) - def load_data(self,prepath,shot,dtype='float32'): + def load_data_from_txt_safe(self,prepath,shot,dtype='float32'): file_path = self.get_file_path(prepath,shot.machine,shot.number) if not self.is_saved(prepath,shot): print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) - return None,None,False + return None,False if os.path.getsize(file_path) == 0: print('Signal {}, shot {} was downloaded incorrectly (empty file). Removing.'.format(self.description,shot.number)) os.remove(file_path) - return None,None,False + return None,False try: data = np.loadtxt(file_path,dtype=dtype) + if data == get_missing_value_array(): + print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) + return None,False except: print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) os.remove(file_path) - return None, None, False - + return None, False + + + return data,True + + def load_data(self,prepath,shot,dtype='float32'): + data,succ = self.load_data_from_txt_safe(prepath,shot) + if not succ: + return None,None,False if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) @@ -166,12 +176,10 @@ def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,m self.num_channels = num_channels def load_data(self,prepath,shot,dtype='float32'): - if not self.is_saved(prepath,shot): - print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) + data,succ = self.load_data_from_txt_safe(prepath,shot) + if not succ: return None,None,False - file_path = self.get_file_path(prepath,shot.machine,shot.number) - data = np.loadtxt(file_path,dtype=dtype) if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) #_ = data[0,0] @@ -186,7 +194,6 @@ def load_data(self,prepath,shot,dtype='float32'): if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) return None,None,False - if np.any(np.isnan(t)) or np.any(np.isnan(sig)): print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) return None,None,False @@ -221,21 +228,22 @@ def fetch_data(self,signal,shot_num,c): if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep T = len(time) mapping = np.tile(mapping,(T,1)).transpose() - assert(mapping.shape == data.shape), "shape of mapping and data is different" + assert(mapping.shape == data.shape), "shape of mapping and data is different" if mapping_path is not None:#fetch the mapping separately time_map,data_map,mapping_map,success_map = self.fetch_data_fn(mapping_path,shot_num,c) success = (success and success_map) if not success: print("No success for signal {} and mapping {}".format(path,mapping_path)) - mapping = data - else: + else: assert(np.all(time == time_map)), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) mapping = data_map - except Exception as e: - time,data = create_missing_value_filler() print(e) sys.stdout.flush() + + if not success: + return None,None,None,False + time = np.array(time) + 1e-3*signal.get_causal_shift(self) return time,np.array(data),mapping,success @@ -261,3 +269,6 @@ def create_missing_value_filler(): time = np.linspace(0,100,100) vals = np.zeros_like(time) return time,vals + +def get_missing_value_array(): + return np.array([-1.0]) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index b13ebf76..93690d35 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -25,6 +25,7 @@ from multiprocessing import Queue import os import errno +from plasma.primitives.data import get_missing_value_array # import gadata @@ -48,6 +49,15 @@ def makedirs_process_safe(dirpath): else:# Our target dir exists as a file, or different error, reraise the error! raise +def makedirdepth_process_safe(dirpath): + try: #can lead to race condition + mkdirdepth(dirpath) + except OSError as e: + if e.errno == errno.EEXIST:# File exists, and it's a directory, another process beat us to creating this dir, that's OK. + pass + else:# Our target dir exists as a file, or different error, reraise the error! + raise + def mkdirdepth(filename): folder=os.path.dirname(filename) if not os.path.exists(folder): @@ -86,25 +96,20 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): except: #missing_values += 1 print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) - time,data = create_missing_value_filler() - mapping = None + success = False - data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() - if mapping is not None: - mapping_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(mapping))).transpose() - # mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) - data_two_column = np.vstack((mapping_two_column,data_two_column)) - try: #can lead to race condition - mkdirdepth(save_path_full) - except OSError as e: - if e.errno == errno.EEXIST: - # File exists, and it's a directory, another process beat us to creating this dir, that's OK. - pass - else: - # Our target dir exists as a file, or different error, reraise the error! - raise - np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') + if success: + data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() + if mapping is not None: + mapping_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(mapping))).transpose() + # mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) + data_two_column = np.vstack((mapping_two_column,data_two_column)) + makedirdepth_process_safe(save_path_full) + if success: + np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') + else + np.savetxt(save_path_full,get_missing_value_array()) print('.',end='') except: print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) From 91cbab05c1d634fbd5d30b2e11c13e953d195c5c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 03:24:20 -0500 Subject: [PATCH 398/744] added new way to store missing signals as text files. removed spatial profiles as they would be saved under the same name as the jet profiles mapped to rho --- data/signals.py | 4 ++-- plasma/primitives/data.py | 8 +------- plasma/utils/downloading.py | 12 +++++------- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/data/signals.py b/data/signals.py index f3d9c593..f55eaaec 100644 --- a/data/signals.py +++ b/data/signals.py @@ -211,8 +211,8 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pradedge':pradedge,'pradtot':pradtot,'pin':pin, 'torquein':torquein, 'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -#'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, -# 'rho_profile_spatial':rho_profile_spatial,'etemp_profile_spatial':etemp_profile_spatial,'edens_profile_spatial':edens_profile_spatial,'etemp':etemp +'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, + 'rho_profile_spatial':rho_profile_spatial,'etemp':etemp, 'etemp_profile':etemp_profile,'edens_profile':edens_profile, 'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, 'trot_profile':trot_profile,'pthm_profile':pthm_profile, diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 0c82641a..9a533336 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -5,7 +5,7 @@ from scipy.interpolate import UnivariateSpline from plasma.utils.processing import get_individual_shot_file -from plasma.utils.downloading import format_save_path +from plasma.utils.downloading import format_save_path,get_missing_value_array # class SignalCollection: # """GA Data Obj""" @@ -265,10 +265,4 @@ def __str__(self): def __repr__(self): return self.__str__() -def create_missing_value_filler(): - time = np.linspace(0,100,100) - vals = np.zeros_like(time) - return time,vals -def get_missing_value_array(): - return np.array([-1.0]) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 93690d35..6c8ea3cd 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -25,7 +25,6 @@ from multiprocessing import Queue import os import errno -from plasma.primitives.data import get_missing_value_array # import gadata @@ -35,10 +34,9 @@ #print("Importing numpy version"+np.__version__) -def create_missing_value_filler(): - time = np.linspace(0,100,100) - vals = np.zeros_like(time) - return time,vals + +def get_missing_value_array(): + return np.array([-1.0]) def makedirs_process_safe(dirpath): try: #can lead to race condition @@ -108,8 +106,8 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): makedirdepth_process_safe(save_path_full) if success: np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') - else - np.savetxt(save_path_full,get_missing_value_array()) + else: + np.savetxt(save_path_full,get_missing_value_array(),fmt = '%.5e') print('.',end='') except: print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) From 14858b92a3e90bac36effb95238eb97049398390 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 21:20:48 -0500 Subject: [PATCH 399/744] added support for channel signals (i.e. signals that come as channels but we only want individual chords --- data/signals.py | 6 +- plasma/primitives/data.py | 119 +++++++++++++++++++++++++++--------- plasma/utils/downloading.py | 2 +- 3 files changed, 94 insertions(+), 33 deletions(-) diff --git a/data/signals.py b/data/signals.py index f3d9c593..f9074e1a 100644 --- a/data/signals.py +++ b/data/signals.py @@ -3,7 +3,7 @@ import time import sys -from plasma.primitives.data import Signal,ProfileSignal,Machine +from plasma.primitives.data import Signal,ProfileSignal,ChannelSignal,Machine def create_missing_value_filler(): time = np.linspace(0,100,100) @@ -176,8 +176,8 @@ def fetch_nstx_data(signal_path,shot_num,c): pin = Signal("Input Power (beam for d3d)",['jpf/gs/bl-ptotout'],[jet]) -pradcore = Signal("Radiated Power Core",['d3d/'+r'\bol_l15_p'],[d3d]) -pradedge = Signal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) +pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) +pradedge = ChannelSignal("Radiated Power Edge",['ppf/bolo/kb5h/channel10','d3d/'+r'\bol_l03_p'],[jet,d3d]) # pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 0c82641a..e8d1fa68 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -118,6 +118,27 @@ def load_data(self,prepath,shot,dtype='float32'): return t,sig,True + + def fetch_data_basic(self,machine,shot_num,c): + path = self.get_path(machine) + mapping_path = self.get_mapping_path(machine) + success = False + mapping = None + try: + time,data,mapping,success = machine.fetch_data_fn(path,shot_num,c) + except Exception as e: + print(e) + sys.stdout.flush() + + if not success: + return None,None,None,False + + time = np.array(time) + 1e-3*self.get_causal_shift(machine) + return time,np.array(data),mapping,success + + def fetch_data(self,machine,shot_num,c): + return self.fetch_data_basic(machine,shot_num,c) + def is_defined_on_machine(self,machine): return machine in self.machines @@ -206,6 +227,75 @@ def load_data(self,prepath,shot,dtype='float32'): return t,sig_interp,True + def fetch_data(self,machine,shot_num,c): + time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) + + if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep + T = len(time) + mapping = np.tile(mapping,(T,1)).transpose() + assert(mapping.shape == data.shape), "shape of mapping and data is different" + if mapping_path is not None:#fetch the mapping separately + time_map,data_map,mapping_map,success_map = machine.fetch_data_fn(mapping_path,shot_num,c) + success = (success and success_map) + if not success: + print("No success for signal {} and mapping {}".format(path,mapping_path)) + else: + assert(np.all(time == time_map)), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) + mapping = data_map + + if not success: + return None,None,None,False + return time,data,mapping,success + + +class ChannelSignal(Signal): + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): + super(ChannelSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerances=data_avail_tolerances,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) + nums,new_paths = self.get_channel_nums(paths) + self.channel_nums = nums + self.paths = new_paths + + def get_channel_nums(self,paths): + regex = re.compile('channel\d+') + regex_int = re.compile('\d+') + nums = [] + new_paths = [] + for p in paths: + assert(p[-1] != '/') + elements = p.split('/') + res = regex.findall(elements[-1]) + assert(len(res) < 2) + if len(res) == 0: + nums.append(None) + new_paths.append(p) + else: + nums.append(int(regex_int.findall(res[0])[0])) + new_paths.append("/".join(elements[:-1])) + return nums,new_paths + + def get_channel_num(self,machine): + idx = self.get_idx(machine) + return self.channel_nums[idx] + + def fetch_data(self,machine,shot_num,c): + time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) + channel_num = self.get_channel_num(machine) + if channel_num is not None and success: + if np.ndim(data) != 2: + print("Channel Signal {} expected 2D array for shot {}".format(self,shot)) + success = False + else: + data = data[:,channel_num] + return time,data,mapping,success + + def get_file_path(self,prepath,machine,shot_number): + dirname = self.get_path(machine) + num = self.get_channel_num(machine) + if num is not None: + dirname += "/channel{}".format(num) + return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) + + class Machine(object): def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): @@ -218,35 +308,6 @@ def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): def get_connection(self): return Connection(server) - def fetch_data(self,signal,shot_num,c): - path = signal.get_path(self) - mapping_path = signal.get_mapping_path(self) - success = False - mapping = None - try: - time,data,mapping,success = self.fetch_data_fn(path,shot_num,c) - if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep - T = len(time) - mapping = np.tile(mapping,(T,1)).transpose() - assert(mapping.shape == data.shape), "shape of mapping and data is different" - if mapping_path is not None:#fetch the mapping separately - time_map,data_map,mapping_map,success_map = self.fetch_data_fn(mapping_path,shot_num,c) - success = (success and success_map) - if not success: - print("No success for signal {} and mapping {}".format(path,mapping_path)) - else: - assert(np.all(time == time_map)), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) - mapping = data_map - except Exception as e: - print(e) - sys.stdout.flush() - - if not success: - return None,None,None,False - - time = np.array(time) + 1e-3*signal.get_causal_shift(self) - return time,np.array(data),mapping,success - def __eq__(self,other): return self.name.__eq__(other.name) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 93690d35..0b63c1db 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -90,7 +90,7 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): if not success: try: try: - time,data,mapping,success = machine.fetch_data(signal,shot_num,c) + time,data,mapping,success = signal.fetch_data(machine,shot_num,c) if not success: print('No success shot {}, signal {}'.format(shot_num,signal)) except: From 70430c4a432feb94ca34d0f508edda3458fffc9f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 22:46:18 -0500 Subject: [PATCH 400/744] making sure shot has minimum length --- plasma/primitives/shots.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index ca9e1d14..ba38b15d 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -380,7 +380,7 @@ def preprocess(self,conf): def get_signals_and_times_from_file(self,conf): valid = True - t_min = -1 + t_min = -np.Inf t_max = np.Inf t_thresh = -1 signal_arrays = [] @@ -409,7 +409,6 @@ def get_signals_and_times_from_file(self,conf): else: t_max = min(t_max,np.max(t)) - assert(t_max > t_min or not valid) #make sure the shot is long enough. dt = conf['data']['dt'] if (t_max - t_min)/dt <= (2*conf['model']['length']+conf['data']['T_min_warn']): @@ -419,6 +418,7 @@ def get_signals_and_times_from_file(self,conf): # if self.is_disruptive and self.t_disrupt > t_max+conf['data']['data_avail_tolerance']: # print('Shot {}: disruption event is not contained in valid time region by {}s, omitting.'.format(self.number,self.t_disrupt - t_max)) # valid = False + assert(t_max > t_min or not valid), "t max: {}, t_min: {}".format(t_max,t_min) if self.is_disruptive: From c0e9ef8f8509892036ad29cd30c714e42a8a919c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 23:43:29 -0500 Subject: [PATCH 401/744] bug fixes for ChannelSignals --- plasma/primitives/data.py | 14 +++++++++----- plasma/utils/downloading.py | 4 +++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 68197896..c72adbaf 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -1,6 +1,7 @@ import numpy as np import time import sys,os +import re from scipy.interpolate import UnivariateSpline @@ -119,9 +120,9 @@ def load_data(self,prepath,shot,dtype='float32'): return t,sig,True - def fetch_data_basic(self,machine,shot_num,c): - path = self.get_path(machine) - mapping_path = self.get_mapping_path(machine) + def fetch_data_basic(self,machine,shot_num,c,path=None): + if path is None: + path = self.get_path(machine) success = False mapping = None try: @@ -229,13 +230,15 @@ def load_data(self,prepath,shot,dtype='float32'): def fetch_data(self,machine,shot_num,c): time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) + path = self.get_path(machine) + mapping_path = self.get_mapping_path(machine) if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep T = len(time) mapping = np.tile(mapping,(T,1)).transpose() assert(mapping.shape == data.shape), "shape of mapping and data is different" if mapping_path is not None:#fetch the mapping separately - time_map,data_map,mapping_map,success_map = machine.fetch_data_fn(mapping_path,shot_num,c) + time_map,data_map,mapping_map,success_map = self.fetch_data_basic(machine,shot_num,c,path=mapping_path) success = (success and success_map) if not success: print("No success for signal {} and mapping {}".format(path,mapping_path)) @@ -279,13 +282,14 @@ def get_channel_num(self,machine): def fetch_data(self,machine,shot_num,c): time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) + mapping = None #we are not interested in the whole profile channel_num = self.get_channel_num(machine) if channel_num is not None and success: if np.ndim(data) != 2: print("Channel Signal {} expected 2D array for shot {}".format(self,shot)) success = False else: - data = data[:,channel_num] + data = data[channel_num,:] #extract channel of interest return time,data,mapping,success def get_file_path(self,prepath,machine,shot_number): diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index c126eaf1..8980ebde 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -91,7 +91,9 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): time,data,mapping,success = signal.fetch_data(machine,shot_num,c) if not success: print('No success shot {}, signal {}'.format(shot_num,signal)) - except: + except Exception as e: + print(e) + sys.stdout.flush() #missing_values += 1 print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) success = False From ca3a88c0d3bf34d522954252029b190093efab9e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 14 Dec 2017 23:52:26 -0500 Subject: [PATCH 402/744] not using radiated power edge/core on data yet since not yet downloaded --- data/signals.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index 84f2c9eb..a83d438c 100644 --- a/data/signals.py +++ b/data/signals.py @@ -176,8 +176,10 @@ def fetch_nstx_data(signal_path,shot_num,c): pin = Signal("Input Power (beam for d3d)",['jpf/gs/bl-ptotout'],[jet]) -pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) -pradedge = ChannelSignal("Radiated Power Edge",['ppf/bolo/kb5h/channel10','d3d/'+r'\bol_l03_p'],[jet,d3d]) +pradcore = ChannelSignal("Radiated Power Core",[ 'd3d/'+r'\bol_l15_p'],[d3d]) +pradedge = ChannelSignal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) +#pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) +#pradedge = ChannelSignal("Radiated Power Edge",['ppf/bolo/kb5h/channel10','d3d/'+r'\bol_l03_p'],[jet,d3d]) # pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) From 7b2d8b66125de8268c27528f928fd210af2f8cba Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 00:49:25 -0500 Subject: [PATCH 403/744] small bug fix with checking for no-content --- data/signals.py | 2 +- plasma/primitives/data.py | 5 +++-- plasma/primitives/shots.py | 10 ++-------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/data/signals.py b/data/signals.py index a83d438c..42fd11c1 100644 --- a/data/signals.py +++ b/data/signals.py @@ -214,7 +214,7 @@ def fetch_nstx_data(signal_path,shot_num,c): 'torquein':torquein, 'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, 'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, - 'rho_profile_spatial':rho_profile_spatial,'etemp':etemp, +# 'rho_profile_spatial':rho_profile_spatial,'etemp':etemp, 'etemp_profile':etemp_profile,'edens_profile':edens_profile, 'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, 'trot_profile':trot_profile,'pthm_profile':pthm_profile, diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index c72adbaf..990eb6d0 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -66,10 +66,11 @@ def load_data_from_txt_safe(self,prepath,shot,dtype='float32'): return None,False try: data = np.loadtxt(file_path,dtype=dtype) - if data == get_missing_value_array(): + if np.all(data == get_missing_value_array()): print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) return None,False - except: + except Exception as e: + print(e) print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) os.remove(file_path) return None, False diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index b922c3c9..eeebb0a9 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -17,6 +17,7 @@ import numpy as np from plasma.utils.processing import train_test_split,cut_and_resample_signal +from plasma.utils.downloading import makedirs_process_safe class ShotListFiles(object): def __init__(self,machine,prepath,paths,description=''): @@ -455,14 +456,7 @@ def convert_to_ttd(self,tr,conf): return ttd def save(self,prepath): - if not os.path.exists(prepath): - try: #can lead to race condition - os.makedirs(prepath) - except OSError as e: - if e.errno == errno.EEXIST:# File exists, and it's a directory, another process beat us to creating this dir, that's OK. - pass - else:# Our target dir exists as a file, or different error, reraise the error! - raise + makedirs_process_safe(prepath) save_path = self.get_save_path(prepath) np.savez(save_path,valid=self.valid,is_disruptive=self.is_disruptive, signals_dict=self.signals_dict,ttd=self.ttd) From cd206212bf9d48bd79bda24d3f382dbfcbdcf93c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 02:07:49 -0500 Subject: [PATCH 404/744] added extra parameter extra_dense_input, whether we want an extra dense layer before the rnn --- examples/conf.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 358a5adf..1b308cd8 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -79,18 +79,19 @@ model: rnn_type: 'LSTM' #TODO optimize rnn_layers: 2 - num_conv_filters: 10 + num_conv_filters: 128 size_conv_filters: 3 num_conv_layers: 3 pool_size: 2 - dense_size: 200 + dense_size: 128 + extra_dense_input: False #have not found a difference yet optimizer: 'adam' clipnorm: 10.0 regularization: 0.0 dense_regularization: 0.01 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00001 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 + lr: 0.00002 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 lr_decay: 0.97 #0.98 #0.9 stateful: True return_sequences: True @@ -109,7 +110,7 @@ training: max_patch_length: 100000 #How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 400 + num_epochs: 1000 use_mock_data: False data_parallel: False hyperparam_tuning: False From 67b1189ea4f399ae783c26641840b073245eeddf Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 02:09:20 -0500 Subject: [PATCH 405/744] slight model architecture modification. dense layer after convolutions has dense_size --- plasma/models/builder.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 62d000a5..2e0fc0c0 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -19,6 +19,7 @@ import os,sys import numpy as np from copy import deepcopy +from plasma.utils.downloading import makedirs_process_safe class LossHistory(Callback): @@ -137,16 +138,18 @@ def slicer_output_shape(input_shape,indices): pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) for i in range(model_conf['num_conv_layers']): - pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) + div_fac = 2**i + pre_rnn_1D = Convolution1D(num_conv_filters/div_fac,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) + pre_rnn_1D = Convolution1D(num_conv_filters/div_fac,1,padding='valid',activation='relu') (pre_rnn_1D) pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) - pre_rnn_1D = Dense(num_conv_filters*4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) - pre_rnn_1D = Dense(num_conv_filters,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + pre_rnn_1D = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + pre_rnn_1D = Dense(dense_size/4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) else: pre_rnn = pre_rnn_input - if model_conf['rnn_layers'] == 0: + if model_conf['rnn_layers'] == 0 or model_conf['extra_dense_input']: pre_rnn = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn = Dense(dense_size/2,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn = Dense(dense_size/4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) @@ -214,16 +217,7 @@ def get_save_path(self,epoch): def ensure_save_directory(self): prepath = self.conf['paths']['model_save_path'] - if not os.path.exists(prepath): - try: #can lead to race condition - os.makedirs(prepath) - except OSError as e: - if e.errno == errno.EEXIST: - # File exists, and it's a directory, another process beat us to creating this dir, that's OK. - pass - else: - # Our target dir exists as a file, or different error, reraise the error! - raise + makedirs_process_safe(prepath) def load_model_weights(self,model,custom_path=None): if custom_path == None: From 4150d1d07fd34fd8547f7e80b749538a2d8de387 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 02:09:47 -0500 Subject: [PATCH 406/744] typo --- plasma/utils/processing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index dd641d10..7f8ab81f 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -35,7 +35,7 @@ def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): # f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) # sig_interp[:,i] = f(tt) if(np.any(np.isnan(sig_interp))): - print("signals contains nan") + print("signal contains nan") if(np.any(t[1:] - t[:-1] <= 0)): print("non increasing") idx = np.where(t[1:] - t[:-1] <= 0)[0][0] From 4da546a39fa6c9de550458807ce7e3fd5dc82d29 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 02:10:26 -0500 Subject: [PATCH 407/744] updated modules for batch jobs --- plasma/utils/batch_jobs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index 977a2ca5..f0bcea7f 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -48,7 +48,8 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="f f.write(line) f.write('module load '+env_type+'\n') f.write('source activate '+env_name+'\n') - f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64\n') + f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64\n') + f.write('module load intel/17.0/64/17.0.5.239 intel-mkl/2017.3/4/64\n') # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') @@ -82,7 +83,7 @@ def create_slurm_header(num_nodes,use_mpi,idx): assert(num_nodes == 1) lines = [] lines.append('#!/bin/bash\n') - lines.append('#SBATCH -t 01:00:00\n') + lines.append('#SBATCH -t 06:00:00\n') lines.append('#SBATCH -N '+str(num_nodes)+'\n') if use_mpi: lines.append('#SBATCH --ntasks-per-node=4\n') From d55c75e229136737f3231fe7b4b2901ba2072cc7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 02:10:57 -0500 Subject: [PATCH 408/744] indentation --- plasma/primitives/shots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index eeebb0a9..383ed7e6 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -377,7 +377,7 @@ def preprocess(self,conf): self.valid = valid #cut and resample if self.valid: - self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) + self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) def get_signals_and_times_from_file(self,conf): valid = True From c05993762e69dcea7096af282008e157eb6e358b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 02:11:39 -0500 Subject: [PATCH 409/744] enforcing ordering for spatial interpolation, get NaN's otherwise --- plasma/primitives/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 990eb6d0..72f2e20e 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -75,7 +75,6 @@ def load_data_from_txt_safe(self,prepath,shot,dtype='float32'): os.remove(file_path) return None, False - return data,True def load_data(self,prepath,shot,dtype='float32'): @@ -224,7 +223,8 @@ def load_data(self,prepath,shot,dtype='float32'): timesteps = len(t) sig_interp = np.zeros((timesteps,self.num_channels)) for i in range(timesteps): - f = UnivariateSpline(mapping[i,:],sig[i,:],s=0,k=1,ext=0) + _,order = np.unique(mapping[i,:],return_index=True) #make sure the mapping is ordered and unique + f = UnivariateSpline(mapping[i,order],sig[i,order],s=0,k=1,ext=0) sig_interp[i,:] = f(remapping) return t,sig_interp,True From 9b2bce17b1f7991822ecf80bead2efa9d7a99bfc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 12:55:31 -0500 Subject: [PATCH 410/744] hrts has no integration time, set to 0 --- data/signals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index 42fd11c1..62a6ec72 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,8 +137,8 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) From ff2a072e20a0b7a858a923421cca3ed2be5353b8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 14:20:23 -0500 Subject: [PATCH 411/744] added core and edge radiated power for jet --- data/signals.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/signals.py b/data/signals.py index 62a6ec72..6cd8accf 100644 --- a/data/signals.py +++ b/data/signals.py @@ -176,10 +176,10 @@ def fetch_nstx_data(signal_path,shot_num,c): pin = Signal("Input Power (beam for d3d)",['jpf/gs/bl-ptotout'],[jet]) -pradcore = ChannelSignal("Radiated Power Core",[ 'd3d/'+r'\bol_l15_p'],[d3d]) -pradedge = ChannelSignal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) -#pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) -#pradedge = ChannelSignal("Radiated Power Edge",['ppf/bolo/kb5h/channel10','d3d/'+r'\bol_l03_p'],[jet,d3d]) +#pradcore = ChannelSignal("Radiated Power Core",[ 'd3d/'+r'\bol_l15_p'],[d3d]) +#pradedge = ChannelSignal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) +pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) +pradedge = ChannelSignal("Radiated Power Edge",['ppf/bolo/kb5h/channel10','d3d/'+r'\bol_l03_p'],[jet,d3d]) # pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) From 87dbf0323fa787ee2959fd3c49da637587e15c04 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 14:26:46 -0500 Subject: [PATCH 412/744] added option for 0D jet data only, since we now have jet signals --- data/signals.py | 1 + plasma/conf_parser.py | 4 ++++ plasma/primitives/data.py | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index 6cd8accf..57a8bd48 100644 --- a/data/signals.py +++ b/data/signals.py @@ -238,6 +238,7 @@ def fetch_nstx_data(signal_path,shot_num,c): fully_defined_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machines(all_machines)} d3d_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(d3d)} jet_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(jet)} +jet_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} #['pcechpwrf'] #Total ECH Power Not always on! diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index c6d8fafb..470b848e 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -83,6 +83,10 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals + if params['paths']['data'] == 'jet_data_0D': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = jet_signals_0D elif params['paths']['data'] == 'jet_carbon_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 72f2e20e..d6139f66 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -253,7 +253,7 @@ def fetch_data(self,machine,shot_num,c): class ChannelSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): + def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): super(ChannelSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerances=data_avail_tolerances,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) nums,new_paths = self.get_channel_nums(paths) self.channel_nums = nums From 44461cde0037f8e0c4f4ccb95f66787c288c758b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 14:33:23 -0500 Subject: [PATCH 413/744] typo --- plasma/conf_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 470b848e..8c9418c2 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -83,7 +83,7 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals - if params['paths']['data'] == 'jet_data_0D': + elif params['paths']['data'] == 'jet_data_0D': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals_0D From eaa3629c9f6bff2091d48614a8371ff4cf672957 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 15 Dec 2017 14:39:51 -0500 Subject: [PATCH 414/744] Extract time to solution plots --- examples/extract_best_overtime.py | 159 ++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 examples/extract_best_overtime.py diff --git a/examples/extract_best_overtime.py b/examples/extract_best_overtime.py new file mode 100644 index 00000000..f20fed60 --- /dev/null +++ b/examples/extract_best_overtime.py @@ -0,0 +1,159 @@ +import pandas as pd +import glob +from subprocess import Popen +import yaml +import os +import math +import numpy as np +from random import shuffle +from joblib import Parallel, delayed +import multiprocessing + +import matplotlib +matplotlib.use('Agg') +import matplotlib.pylab as plt + +import pdb + +def arrangeTrialsAtRandom(filenames,scale=1.0): + shuffle(filenames) + previous = pd.read_csv(filenames[0]) + previous['times'] = previous['times'].apply(lambda x: x/60.0/scale) + dataframes = [previous] + for filename in filenames[1:]: + shift = max(previous['times'].values) + current = pd.read_csv(filename) + current['times'] = current['times'].apply(lambda x: x/60.0/scale+shift) + dataframes.append(current) + previous = current + return pd.concat(dataframes) + +def getOneBestValidationAUC(T_of_test,dataset): + #select subset of dataframe by time for all + dataset = dataset[dataset.times <= T_of_test] + + #apply emulate_converge script + aucs = dataset['val_roc'].values + if len(aucs) > 0: + return max(aucs) + else: + return 0.0 + +def doPlot(parallel_aucs, serial_aucs, times, errors): + times = list(times) + times_histo = np.histogram(parallel_aucs,bins=times) + #values,edges = times_histo + parallel_values = parallel_aucs[1:] + edges = times + print(len(parallel_values)) + print(len(edges)) + serial_values = np.array(serial_aucs[1:]) + errors = np.array(errors[1:]) + edges = np.array(times[:-1]) + print(errors.shape) + print(edges.shape) + print(serial_values.shape) + + + plt.figure() + plt.plot(edges, parallel_values,label = "Distributed search") #, width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, serial_values, label="Sequential search") #, width=np.diff(edges), ec="k", align="edge") + #plt.fill_between(edges, serial_values-errors,serial_values+errors) + plt.legend(loc = (0.6,0.7)) + plt.xlabel("Time [minutes]", fontsize=20) + #plt.yscale('log') + plt.ylabel('Best validation AUC', fontsize=20) + plt.savefig("times.png") + + plt.figure() + plt.plot(edges, parallel_values,label = "Distributed search") #, width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, serial_values, label="Sequential search") #, width=np.diff(edges), ec="k", align="edge") + #plt.fill_between(edges, serial_values-errors,serial_values+errors) + plt.legend(loc = (0.6,0.7)) + plt.xlabel("Time [minutes]", fontsize=20) + plt.xscale('log') + plt.xlim([0,100]) + plt.ylabel('Best validation AUC', fontsize=20) + plt.savefig("times_logx_start.png") + + plt.figure() + plt.plot(edges, parallel_values,label = "Distributed search") #, width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, serial_values, label="Sequential search") #, width=np.diff(edges), ec="k", align="edge") + #plt.fill_between(edges, serial_values-errors,serial_values+errors) + plt.legend(loc = (0.6,0.7)) + plt.xlabel("Time [minutes]", fontsize=20) + plt.xscale('log') + plt.xlim([100,10000]) + plt.ylabel('Best validation AUC', fontsize=20) + plt.savefig("times_logx.png") + + +def getReplica(filenames, times): + serial_auc_replica = arrangeTrialsAtRandom(filenames,100.0) + + best_serial_aucs_over_time = [] + for T in times: + current_best = 0 + ##pass AUCs and real epoch counts to emulate_converge + auc = getOneBestValidationAUC(T,serial_auc_replica) + if auc > current_best: current_best = auc + + best_serial_aucs_over_time.append(current_best) + + #replicas.append(best_serial_aucs_over_time) + return best_serial_aucs_over_time + +def getTimeReplica(filenames,T): + current_best = 0 + for filename in filenames: + #get AUCs for this trial, one per effective epoch + try: + dataset = pd.read_csv(filename) + dataset['times'] = dataset['times'].apply(lambda x: x/60.0) + except: + print("No data in {}".format(filename)) + continue + ##pass AUCs and real epoch counts to emulate_converge + auc = getOneBestValidationAUC(T,dataset) + if auc > current_best: current_best = auc + return current_best + +def getTimeReplicaSerial(serial_auc_replica,T): + current_best = 0 + ##pass AUCs and real epoch counts to emulate_converge + auc = getOneBestValidationAUC(T,serial_auc_replica) + if auc > current_best: current_best = auc + + #replicas.append(best_serial_aucs_over_time) + return current_best + + +if __name__ == '__main__': + + filenames = glob.glob("/tigress/FRNN/JET_Titan_hyperparameter_run/*/temporal_csv_log.csv") + patience = 5 + + times = np.linspace(0,310*30,186*30) + + best_parallel_aucs_over_time = [] + num_cores = multiprocessing.cpu_count() + print ("Running on ", num_cores, " CPU cores") + best_parallel_aucs_over_time = Parallel(n_jobs=num_cores)(delayed(getTimeReplica)(filenames, T) for T in times) + + Nreplicas = 20 + replicas = [] + + + for i in range(Nreplicas): + serial_auc_replica = arrangeTrialsAtRandom(filenames,100.0) + + #replicas = Parallel(n_jobs=num_cores)(delayed(getReplica)(filenames, times) for i in range(Nreplicas)) + best_serial_aucs_over_time = Parallel(n_jobs=num_cores)(delayed(getTimeReplicaSerial)(serial_auc_replica, T) for T in times) + replicas.append(best_serial_aucs_over_time) + + + from statistics import mean,stdev + best_serial_aucs_over_time = list(map(mean, zip(*replicas))) + errors = list(map(stdev, zip(*replicas))) + + doPlot(best_parallel_aucs_over_time, best_serial_aucs_over_time, times, errors) From bf75108b89871cd4b5bdd8247f35daac713ef6a9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 17:16:10 -0500 Subject: [PATCH 415/744] added notebook to analyze hyperparameter tuning --- Analyze Hyperparameter Tuning.ipynb | 361 ++++++++++++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100644 Analyze Hyperparameter Tuning.ipynb diff --git a/Analyze Hyperparameter Tuning.ipynb b/Analyze Hyperparameter Tuning.ipynb new file mode 100644 index 00000000..b293586d --- /dev/null +++ b/Analyze Hyperparameter Tuning.ipynb @@ -0,0 +1,361 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import glob\n", + "import os\n", + "import math\n", + "import numpy as np\n", + "from random import shuffle\n", + "\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "filenames = glob.glob(\"./temp_data/jet_hyperparameter_run/*/temporal_csv_log.csv\")\n", + "patience = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 317, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#these functions load the data into a convenient form\n", + "ts,aucs = get_raw_ts_aucs(filenames,patience)\n", + "all_t,all_auc,all_maxs = get_global_auc_stats(ts,aucs)\n", + "ind = np.argmax(all_maxs)\n", + "#cut off redundant parts of the signal for better visuals\n", + "all_t = all_t[:ind+1] \n", + "all_maxs = all_maxs[:ind+1]\n", + "all_auc = all_auc[:ind+1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time spent as a function of AUC " + ] + }, + { + "cell_type": "code", + "execution_count": 351, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "replicas = 1000\n", + "num_points = 100000\n", + "fontsize = 15\n", + "# ind = np.argmax(all_maxs)\n", + "# mmp,ttp = place_maxs_onto_grid(all_maxs[:ind+1],all_t[:ind+1],num_points)\n", + "mmp,ttp = place_maxs_onto_grid(all_maxs,all_t,num_points)\n", + "#compute time spent as a function of AUC for many replicas, and place the averaged values onto a grid\n", + "mm,tt = average_accum_curves_by_t(ts,aucs,replicas,num_points)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 425, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fontsize=15\n", + "\n", + "plt.close()\n", + "plt.figure(dpi=300)\n", + "plot_ratio = False\n", + "\n", + "if plot_ratio: #plot ratio of curves\n", + " plt.semilogy(mm,tt/ttp)\n", + " plt.axhline(100,color=\"k\",linestyle=\"--\",label=\"ideal speedup\")\n", + " plt.ylim([1,300])\n", + " plt.xlabel('Validation AUC achieved',size=15)\n", + " plt.ylabel('Speedup',size=fontsize)\n", + "else: #plot both curves\n", + " plt.plot(mmp,ttp,label=\"parallel\")\n", + " plt.semilogy(mm,tt,label=\"serial\")\n", + " plt.semilogy(mm,tt/100,\"--g\",label=\"serial, scaled T\")\n", + "# plt.plot(all_maxs,all_t)\n", + " plt.ylim([1e1,1e6])\n", + " plt.ylabel('T [seconds]',size=fontsize)\n", + " plt.xlabel('Validation AUC achieved',size=15)\n", + "\n", + "plt.xlim([0.5,1.0])\n", + "plt.legend(frameon=False,loc=\"lower right\",fontsize=fontsize)\n", + "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", + "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## AUC as a function of time" + ] + }, + { + "cell_type": "code", + "execution_count": 372, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "replicas = 500\n", + "num_points = 10000\n", + "#place the running max for the parallel runs onto a grid\n", + "ttp,mmp = place_maxs_onto_grid(all_t,all_maxs,num_points)\n", + "#compute AUC as a function of time for many replicas, and place the averaged values onto a grid\n", + "tt,mm = average_accum_curves(ts,aucs,replicas,num_points)" + ] + }, + { + "cell_type": "code", + "execution_count": 393, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nrJjevIJlhQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(ttp,mmp,label=\"parallel\")\n", + "# plt.plot(all_t,all_maxs)\n", + "plt.semilogx(tt,mm,label=\"serial\")\n", + "plt.semilogx(tt/100,mm,\"--g\",label=\"serial, scaled T\")\n", + "# plt.xlim([-50,5e3])\n", + "plt.xlim([10,1e6])\n", + "plt.ylabel('AUC',size=fontsize)\n", + "plt.xlabel('T [seconds]',size=fontsize)\n", + "plt.legend(frameon=False,loc=\"lower right\",fontsize=fontsize)\n", + "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", + "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mean time until best auc is found " + ] + }, + { + "cell_type": "code", + "execution_count": 411, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "replicas = 10000\n", + "#compute the mean value of the time necessary to find the best AUC value\n", + "ttmax = generate_maximum_times(ts,aucs,replicas)\n", + "tmaxp = all_t[np.argmax(all_auc)]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 420, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean speedup: 90.7393052288\n", + "Mean time serial: 93.7773075786 hours\n", + "Time parallel: 1.03348055556 hours\n" + ] + } + ], + "source": [ + "#Mean speedup\n", + "print(\"Mean speedup: {}\".format(np.mean(ttmax)/tmaxp))\n", + "print(\"Mean time serial: {} hours\".format(np.mean(ttmax)/3600))\n", + "print(\"Time parallel: {} hours\".format(tmaxp/3600))\n", + "#its a uniform distribution\n", + "# plt.close()\n", + "# plt.hist(ttmax)\n", + "# plt.show()\n", + "# # tt" + ] + }, + { + "cell_type": "code", + "execution_count": 396, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def time_sensitive_interp(x,t,t_new):\n", + " indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1)\n", + " return x[indices]\n", + "\n", + "\n", + "def place_maxs_onto_grid(t,y,num=100):\n", + " tt = np.linspace(0,np.max(t),num)\n", + " return tt,time_sensitive_interp(y,t,tt)\n", + "\n", + "def generate_maximum_times(ts,aucs,replicas = 10):\n", + " tts = []\n", + " for i in range(replicas):\n", + " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", + " ind = np.argmax(all_auc_serial)k\n", + " tts.append(all_t_serial[ind])\n", + " return tts\n", + "\n", + "def average_accum_curves(ts,aucs,replicas = 10,num = 1000):\n", + " all_mm = 0\n", + " tt = 0\n", + " for i in range(replicas):\n", + " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", + " tt,mm = place_maxs_onto_grid(all_t_serial,all_maxs_serial,num)\n", + " all_mm += mm\n", + " all_mm /= replicas\n", + " return tt,all_mm\n", + "\n", + "def average_accum_curves_by_t(ts,aucs,replicas = 10,num = 1000):\n", + " mm = 0\n", + " all_tt = 0\n", + " for i in range(replicas):\n", + " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", + " mm,tt = place_maxs_onto_grid(all_maxs_serial,all_t_serial,num)\n", + " all_tt += tt\n", + " all_tt /= replicas\n", + " return mm,all_tt\n", + "\n", + "def generate_serial_times_aucs(ts,aucs):\n", + " combined = list(zip(ts, aucs))\n", + " shuffle(combined)\n", + " ts,aucs = zip(*combined)\n", + " ts_new = []\n", + " for t in ts:\n", + " if len(ts_new) == 0:\n", + " ts_new.append(1.0*t)\n", + " else:\n", + " ts_new.append(1.0*t + ts_new[-1][-1])\n", + " return ts_new,aucs\n", + "\n", + "def get_raw_ts_aucs(filenames,patience=5):\n", + " ts = []\n", + " aucs = []\n", + " auc_maxs = []\n", + " for f in filenames:\n", + " dataset = pd.read_csv(f)\n", + " t = np.concatenate((np.array([0]),np.array(dataset['times'])))\n", + " auc = np.concatenate((np.array([0]),np.array(dataset['val_roc'])))\n", + " max_index = np.argmax(auc)\n", + " auc = auc[:max_index+patience+1]\n", + " t = t[:max_index+patience+1]\n", + " auc_max = np.maximum.accumulate(auc) \n", + " ts.append(t)\n", + " aucs.append(auc)\n", + " auc_maxs.append(auc_max)\n", + " return ts,aucs\n", + "\n", + "def get_global_auc_stats(ts,aucs):\n", + " all_t = np.concatenate(ts)\n", + " all_aucs = np.concatenate(aucs)\n", + " all_t,all_aucs = zip(*sorted(zip(all_t,all_aucs),key = lambda x : x[0]))\n", + " all_t = np.array(all_t)\n", + " all_aucs = np.array(all_aucs)\n", + " all_auc_maxs = np.maximum.accumulate(all_aucs) \n", + " return all_t,all_aucs,all_auc_maxs\n", + "\n", + "def generate_serial_auc_stats(ts,aucs):\n", + " ts,aucs = generate_serial_times_aucs(ts,aucs)\n", + " return get_global_auc_stats(ts,aucs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda root]", + "language": "python", + "name": "conda-root-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 5b9872e06d62082cc7ea36e80af7a89cf00a5a3d Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 20:29:49 -0500 Subject: [PATCH 416/744] further analysis --- Analyze Hyperparameter Tuning.ipynb | 117 +++++++++++++++++++++------- 1 file changed, 88 insertions(+), 29 deletions(-) diff --git a/Analyze Hyperparameter Tuning.ipynb b/Analyze Hyperparameter Tuning.ipynb index b293586d..1db2f2ff 100644 --- a/Analyze Hyperparameter Tuning.ipynb +++ b/Analyze Hyperparameter Tuning.ipynb @@ -48,6 +48,46 @@ "all_auc = all_auc[:ind+1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Statistics of AUC values" + ] + }, + { + "cell_type": "code", + "execution_count": 549, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAGECAYAAAAC8us+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3c2PFVea5/HfQ7tVyFKTWTZrGtJtWbkquGn/AcWLvepF\nAy53TrPqAdzuHSoDdku1HRLbI3qHwfbO1dlkuqpn0bIGDPZqZlFA4l6lkHHiSlW3Z6TLS9pSCasH\nnlnECeflEvc1Im6cuPn9SKHMjDgR8ZyIyBvPjThxwtxdAAAAMdhUdQAAAAApEhMAABANEhMAABAN\nEhMAABANEhMAABANEhMAABANEhMAABCNsUpMzGyXmR02sy1VxwIAAAYXbWJiZpNmNmdm23uUmzCz\n02b2laQZSQvu/t0oYgQAAMWKMjExs+OSViQdlzTZpVxD0m1Jf+7uz7v7hyQlAADUV3SJiZntlHRO\n0rUe5RqhzC13/+tRxAYAAMoVXWLi7l+Gqx4rPYpekeSS9pQfFQAAGIXoEpN+mNkJSROSPnH376uO\nBwAAFKOWiYmko0qulqyY2SUze2Rmt8xsrurAAADA8GqXmJjZhKSp8OcdSQfD359JOmFmF6uKDQAA\n5FO7xETrScmSu7/n7t+5+zfu/oakJUl7zWx3hfEBAIAhPVV1AEN4JvzMahx7Lgz7JH3eaQFm9qyk\nVyR9I+lBwfEBADDONkvaLumiu98peuF1TEzShCSrf5N02lTGtFavSPp1YREBALDx/I2kfyp6obVL\nTNz9tplJ61dOWqWJyd0ei/lGkj7++GNNT08XF1xFjh07pjNnzlQdRmGoT7zGqS4S9YnZONVFGq/6\nLC8v69ChQ1I4lxatdolJsCSpkTE+vVJyq8f8DyRpenpajUbWYuplYmJiLOqRoj7xGqe6SNQnZuNU\nF2n86hOU0hSijo1fJemkJGU0cn1OyWPEH4w8IgAAkFvMicmznSa4+xUlPb+eC48Pp05IOsH7cgAA\nqKfobuWY2S5Jr0naH0adNrNFd/+wtZy7v2xmpyQtmNmKkjYnx939X0YbMQAAKEp0iYm735B0Q9Jb\nfZR9u/yI4jc7O1t1CIWiPvEap7pI1Cdm41QXafzqUyZz96pjGLnwZuLr169fH8fGSAAAlGZpaUkz\nMzOSNOPuS0UvP+Y2JgAAYIMhMQEAANEgMQEAANEgMQEAANEgMQEAANEgMQEAANEgMQEAANEgMQEA\nANEgMQEAANEgMQEAANEgMQEAANGI7iV+AACkVldX1Ww2+yq7detWbdu2reSIUDYSEwBAlFZXV/XC\nC9N68OCPfZXfvPlp3by5THJScyQmAIAoNZvNkJR8LGm6R+llPXhwSM1mk8Sk5khMAACRm5bUqDoI\njAiNXwEAQDRITAAAQDRITAAAQDRITAAAQDRITAAAQDRITAAAQDRITAAAQDSiTUzMbNLM5sxse5/l\nz5nZhXKjAgAAZYoyMTGz45JWJB2XNNlH+YakI2XHBQAAyhVdYmJmOyWdk3RtgNnmJHk5EQEAgFGJ\nLjFx9y/d/TslV0x6MrM5JYmJlRoYAAAoXXSJySDCLZwJd/+86lgAAEB+dX+J35y7v1x1EAAAoBi1\nvWLScgsHAACMiVomJtzCAQBgPNX1Vs4pSQerDgIAABSrdolJ6ONkUdImM5tIR4efk+k4d1/rtaxj\nx45pYmLisXGzs7OanZ0tMGIAAOppfn5e8/Pzj41bW+t5es2ldomJpNckNSSdz5i2T9I9SdclvdRr\nQWfOnFGj0Sg2OgAAxkTWl/WlpSXNzMyUts46JiaHJT2TMf6ykoTkhJLkBAAA1EztEhN3/zJrvJnd\nl7Ti7l+MOCQAAFCQmJ/KebbqAAAAwGhFl5iY2a7QR8n+MOq0mR3uY1YX78sBAKDWoruV4+43JN2Q\n9NaA83GFBQCAmovuigkAANi4SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwA\nAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0\nSEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0ok1MzGzSzObMbHvVsQAAgNGIMjEx\ns+OSViQdlzTZocyUmS2a2d0wLJjZxEgDBQAAhYouMTGznZLOSbrWpUwjTN8i6aokl3RQ0oqZbRlF\nnAAAoHjRJSbu/qW7f6fkikknc5J2ufsr7v6KpB2SlpRcXXl7BGECAIASRJeY9GJmOyRdcvffp+NC\nInNEkklqVBUbAADIp3aJiaQ77v5e+0h3vxF+vT/ieAAAQEFql5iEqyNPCFdSJOnSCMMBAAAFql1i\n0sWrkq67+0dVBwIAAIbzVNUBFMHMJpW0MdlbdSwAAGB4Y5GYSFqQdLS1QWw/jh07pomJx7s+mZ2d\n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\nddY2MXH322YmrV85aZUmJne7LePMmTNqNBpFhwYAwFjI+rK+tLSkmZmZ0tZZ51s5UtKWJCuzSK+U\n3BphLAAAIKe6JyYnJSmjketzSh4j/mDkEQEAgKHVOjFx9ytKen49Fx4fTp2QdIKX+AEAUC+1bWOS\ncveXzeyUpAUzW1HS5uS4u/9LxaEBAIAB1T4xkSR3f7vqGAAAQH61vpUDAADGC4kJAACIBokJAACI\nBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJ\nAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACI\nBokJAACIxtglJmZ2zswuVB0HAAAY3FglJmbWkHSk6jgAAMBwxioxkTQnyasOAgAADGdsEhMzm1OS\nmFjVsQAAgOGMRWISbuFMuPvnVccCAACG91TVARRkzt1frjoIAACQT+2vmLTcwgEAADVX68SEWzgA\nAIyXut/KOSXpYNVBAGVaXV1Vs9nsq+zWrVu1bdu2kiNCXXEsoQ5qm5iY2XFJi5I2mdlEOjr8nEzH\nuftap2UcO3ZMExMTj42bnZ3V7OxsCREDg1tdXdULL0zrwYM/9lV+8+andfPmMicUPIFjCcOYn5/X\n/Pz8Y+PW1jqeVgtR28RE0muSGpLOZ0zbJ+mepOuSXuq0gDNnzqjRaJQTHVCAZrMZTiQfS5ruUXpZ\nDx4cUrPZ5GSCJ3AsYRhZX9aXlpY0MzNT2jrrnJgclvRMxvjLShKSE0qSE2AMTCvJw4G8OJYQt9om\nJu7+ZdZ4M7svacXdvxhxSAAAIKdaP5UDAADGyzgmJi7elwMAQC3V9lZOJ+7+bNUxAACA4YzjFRMA\nAFBTJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAa\nJCYAACAaY/eunBj867/+q27evNlXWTPT3/7t32pycrLkqAAAeSwvL/dVbuvWrdq2bVvJ0YwvEpOC\n/cd//If+8i//Ups2PS2zP+1Z/uHD77W6uqp//Md/HEF0AIDBfStpkw4dOtRX6c2bn9bNm8skJ0Mi\nMSnYf/7nf0qSHj36H5L29Sz/p386ox9++KHkqAAAw7sv6ZGkjyVN9yi7rAcPDqnZbJKYDInEBACA\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "maxs = np.array([np.max(auc) for auc in aucs])\n", + "plt.close()\n", + "plt.hist(maxs,bins=35,color=\"b\")\n", + "# plt.ylim([1e1,1e6])\n", + "plt.ylabel('Count',size=fontsize)\n", + "plt.xlabel('Validation AUC achieved',size=15)\n", + "\n", + "# plt.xlim([0.8,0.92])\n", + "# plt.legend(frameon=False,loc=\"center left\",fontsize=fontsize)\n", + "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", + "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", + "plt.show()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -57,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 351, + "execution_count": 522, "metadata": { "collapsed": false }, @@ -68,23 +108,24 @@ "fontsize = 15\n", "# ind = np.argmax(all_maxs)\n", "# mmp,ttp = place_maxs_onto_grid(all_maxs[:ind+1],all_t[:ind+1],num_points)\n", - "mmp,ttp = place_maxs_onto_grid(all_maxs,all_t,num_points)\n", + "mmp,ttp = place_maxs_onto_grid(all_maxs,all_t,num_points,np.unique(np.concatenate(aucs)))\n", "#compute time spent as a function of AUC for many replicas, and place the averaged values onto a grid\n", - "mm,tt = average_accum_curves_by_t(ts,aucs,replicas,num_points)\n" + "# mm,tt = average_accum_curves_by_t(ts,aucs,replicas,num_points)\n", + "tt,mm =generate_mean_reach_times(ts,aucs,replicas)\n" ] }, { "cell_type": "code", - "execution_count": 425, + "execution_count": 535, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAF7CAYAAADIc2FgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl0XGeZ5/HvKzuJk2BLlgPB6Q6xZAcSMwm2pNDAMIHY\nljhsYfAWDMxGvAiGnm4fYstulsw53YNt2dNhSA+ObMM5AyTCiwLT0H3atuRulsnMiS05QDohcaxy\nOt0xJLZkOXjJIj3zx3tLKpVKUpVquXVLv88595Tq1r33feutUtVT7+rMDBEREZEoKgs7AyIiIiIT\npUBGREREIkuBjIiIiESWAhkRERGJLAUyIiIiElkKZERERCSyFMiIiIhIZE0NOwPFyDk3C/gQcAq4\nHG5uREREImUaMAc4aGZn852YApnUPgQ8HHYmREREIuwzwCP5TkSBTGqnAL7//e9z6623hpyV6Fi/\nfj0PPPBA2NmIHJVb5lRmE6Nyy5zKLHNPP/00n/3sZyH4Ls03BTKpXQa49dZbqampCTsvkVFeXq7y\nmgCVW+ZUZhOjcsucyiwrBemaoc6+IiIiElkKZERERCSyFMiIiIhIZCmQkZxZtWpV2FmIJJVb5lRm\nE6Nyy5zKrPg5Mws7D0XHOVcDdHZ2dqqTl4iISAa6urqora0FqDWzrnynpxoZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGSVdCDjnKtyzh1yzg04555zzi0LO08iIiKSOyUdyAAtwAagBjgJ7HPOLQg3\n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\nIiIikfX/Aa0cIX4GrzqYAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -96,12 +137,12 @@ "\n", "plt.close()\n", "plt.figure(dpi=300)\n", - "plot_ratio = False\n", + "plot_ratio = True\n", "\n", "if plot_ratio: #plot ratio of curves\n", - " plt.semilogy(mm,tt/ttp)\n", - " plt.axhline(100,color=\"k\",linestyle=\"--\",label=\"ideal speedup\")\n", - " plt.ylim([1,300])\n", + " plt.semilogy(mm,tt/ttp,label=\"measured\")\n", + " plt.axhline(100,color=\"k\",linestyle=\"--\",label=\"ideal\")\n", + " plt.ylim([10,200])\n", " plt.xlabel('Validation AUC achieved',size=15)\n", " plt.ylabel('Speedup',size=fontsize)\n", "else: #plot both curves\n", @@ -113,8 +154,8 @@ " plt.ylabel('T [seconds]',size=fontsize)\n", " plt.xlabel('Validation AUC achieved',size=15)\n", "\n", - "plt.xlim([0.5,1.0])\n", - "plt.legend(frameon=False,loc=\"lower right\",fontsize=fontsize)\n", + "plt.xlim([0.8,0.92])\n", + "plt.legend(frameon=False,loc=\"center left\",fontsize=fontsize)\n", "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", "\n", @@ -146,16 +187,16 @@ }, { "cell_type": "code", - "execution_count": 393, + "execution_count": 428, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nrJjevIJlhQAAAABJRU5ErkJggg==\n", + "image/png": "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\n3vkVwf7BLJu+jO9P+T6hgaFOlyYiIufxyjCD65JQobW24rztm4BlxphJnemdaby8FG2t3aa/pKWz\n1mxfw7+/8u+crT3LD6/+IRnXZRATEuN0WSIi0gavCzPGmMlADLC1ld15uMbPzMd1e4WOLLPWzvBg\nedIKa8HP4/PinPHOwXf43t++x7cmfotHpz6qcTEiIj7A68IMkNb4XNLKvqZtSR010uzykkinPf7O\n44yJG8PTtz2Nn+knCU1EpJ/zxn+tm/rzy1rZ17St3TDT/PKSJwuT1vWXMTOfln9K5keZ/PDqHyrI\niIj4EG/smWktxHTVUuBOD7QjndQfwszqd1cTERTBtyd92+lSRESkC7wxzBQ2Prc24rK9XhsAjDGL\ncM148mtcqwZc42wAYpq2WWvbXJ34gQceIDo6usW2uXPnMnfu3I6rH4D6w9TsMzVnWJe3jntT7iUi\nKMLpckREvNrGjRvZuHFji23l5c4t+u/NYSaulX1N23a0c/4cIAVY18q+dKAUyAWmtNXAY489RkpK\nSseVipuv98z8bufvOF19mvuuus/pUkREvF5rf+Dn5eWRmprqSD1eF2astUXGmDJcgeR8KbgWv9vc\nThP30HoQysYVYh7GFWjEQ3y9Z6bBNvDrf/6amRNmMjpmtNPliIhIF3ldmGm0DlhkjImy1p5utn0G\nUGCtfaWtE9taf6YxIBW2d650ny/3zPxt79/YW7KX3/3L75wuRUREusErp2xYaxfjuty0vmmbMWY6\nMBWY1WxbtDGmwRizve+rlCa+3jPz2DuPcdXIq7jmomucLkVERLrBW3tmsNaONcasMcZswnVZKBFI\nsdbuanZMuTGmACjoTJPo/ky9xld7Zt479h7biraxceZG3W9JRMRHeW2YAbDWdrjKr7W2U/dpstbG\n97wiaY0v98w8/s7jXBR1ETMnzHS6FBER6SavvMwkvscXOzWOVx7nv9//b+6bch+B/oFOlyMiIt2k\nMCM95qs9M2u2ryHAL4B7U+91uhQREekBhRnxCF/rmTlXd47f7vgt35r4LeJCW5vJLyIivkJhRnrM\nF3tmNr6/keOVx/nh1T90uhQREekhhRnpMV+70aS1ll++/UtuueQWxg0a53Q5IiLSQwozMuC8VPAS\nH574kH+79t+cLkVERDxAYUZ6zNd6Zlb9YxVpI9K4YfQNTpciIiIe4NXrzIh42s6jO8kpytEieSIi\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -165,10 +206,10 @@ "source": [ "plt.plot(ttp,mmp,label=\"parallel\")\n", "# plt.plot(all_t,all_maxs)\n", - "plt.semilogx(tt,mm,label=\"serial\")\n", - "plt.semilogx(tt/100,mm,\"--g\",label=\"serial, scaled T\")\n", + "plt.plot(tt,mm,label=\"serial\")\n", + "plt.plot(tt/100,mm,\"--g\",label=\"serial, scaled T\")\n", "# plt.xlim([-50,5e3])\n", - "plt.xlim([10,1e6])\n", + "plt.xlim([10,5e3])\n", "plt.ylabel('AUC',size=fontsize)\n", "plt.xlabel('T [seconds]',size=fontsize)\n", "plt.legend(frameon=False,loc=\"lower right\",fontsize=fontsize)\n", @@ -186,21 +227,22 @@ }, { "cell_type": "code", - "execution_count": 411, + "execution_count": 484, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "replicas = 10000\n", + "replicas = 100\n", "#compute the mean value of the time necessary to find the best AUC value\n", "ttmax = generate_maximum_times(ts,aucs,replicas)\n", + "#compute actual time it took in parallel\n", "tmaxp = all_t[np.argmax(all_auc)]\n" ] }, { "cell_type": "code", - "execution_count": 420, + "execution_count": 497, "metadata": { "collapsed": false }, @@ -209,8 +251,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mean speedup: 90.7393052288\n", - "Mean time serial: 93.7773075786 hours\n", + "Mean speedup: 88.2172247234\n", + "Mean time serial: 91.1707864167 hours\n", "Time parallel: 1.03348055556 hours\n" ] } @@ -229,7 +271,7 @@ }, { "cell_type": "code", - "execution_count": 396, + "execution_count": 513, "metadata": { "collapsed": false }, @@ -240,15 +282,30 @@ " return x[indices]\n", "\n", "\n", - "def place_maxs_onto_grid(t,y,num=100):\n", - " tt = np.linspace(0,np.max(t),num)\n", + "def place_maxs_onto_grid(t,y,num=100,tt=None):\n", + "# tt = np.unique(t)\n", + " if tt is None:\n", + " tt = np.linspace(0,np.max(t),num)\n", " return tt,time_sensitive_interp(y,t,tt)\n", "\n", + "def generate_mean_reach_times(ts,aucs,replicas = 10):\n", + " tts = []\n", + " mm = np.unique(np.concatenate(aucs))\n", + " tts = np.zeros_like(mm)\n", + " for i in range(replicas):\n", + " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", + " for (j,m) in enumerate(mm):\n", + " tts[j] += all_t_serial[np.argmax(all_maxs_serial >= m)]\n", + " tts /= replicas\n", + " return tts,mm\n", + "\n", + "\n", + "\n", "def generate_maximum_times(ts,aucs,replicas = 10):\n", " tts = []\n", " for i in range(replicas):\n", " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", - " ind = np.argmax(all_auc_serial)k\n", + " ind = np.argmax(all_auc_serial)\n", " tts.append(all_t_serial[ind])\n", " return tts\n", "\n", @@ -257,7 +314,8 @@ " tt = 0\n", " for i in range(replicas):\n", " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", - " tt,mm = place_maxs_onto_grid(all_t_serial,all_maxs_serial,num)\n", + " grid = np.unique(all_t_serial)\n", + " tt,mm = place_maxs_onto_grid(all_t_serial,all_maxs_serial,num,grid)\n", " all_mm += mm\n", " all_mm /= replicas\n", " return tt,all_mm\n", @@ -267,7 +325,8 @@ " all_tt = 0\n", " for i in range(replicas):\n", " all_t_serial,all_auc_serial,all_maxs_serial = generate_serial_auc_stats(ts,aucs)\n", - " mm,tt = place_maxs_onto_grid(all_maxs_serial,all_t_serial,num)\n", + " grid = np.unique(all_auc_serial)\n", + " mm,tt = place_maxs_onto_grid(all_maxs_serial,all_t_serial,num,grid)\n", " all_tt += tt\n", " all_tt /= replicas\n", " return mm,all_tt\n", From 7c1e2d40d3042639c540e5ee0310fafc5c2db3c1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 15 Dec 2017 21:01:37 -0500 Subject: [PATCH 417/744] correctly take patience into account --- Analyze Hyperparameter Tuning.ipynb | 85 +++++++++++++++++------------ 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/Analyze Hyperparameter Tuning.ipynb b/Analyze Hyperparameter Tuning.ipynb index 1db2f2ff..b42cc3fc 100644 --- a/Analyze Hyperparameter Tuning.ipynb +++ b/Analyze Hyperparameter Tuning.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 603, "metadata": { "collapsed": false }, @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 317, + "execution_count": 604, "metadata": { "collapsed": false }, @@ -57,20 +57,27 @@ }, { "cell_type": "code", - "execution_count": 549, + "execution_count": 605, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAGECAYAAAAC8us+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3c2PFVea5/HfQ7tVyFKTWTZrGtJtWbkquGn/AcWLvepF\nAy53TrPqAdzuHSoDdku1HRLbI3qHwfbO1dlkuqpn0bIGDPZqZlFA4l6lkHHiSlW3Z6TLS9pSCasH\nnlnECeflEvc1Im6cuPn9SKHMjDgR8ZyIyBvPjThxwtxdAAAAMdhUdQAAAAApEhMAABANEhMAABAN\nEhMAABANEhMAABANEhMAABANEhMAABCNsUpMzGyXmR02sy1VxwIAAAYXbWJiZpNmNmdm23uUmzCz\n02b2laQZSQvu/t0oYgQAAMWKMjExs+OSViQdlzTZpVxD0m1Jf+7uz7v7hyQlAADUV3SJiZntlHRO\n0rUe5RqhzC13/+tRxAYAAMoVXWLi7l+Gqx4rPYpekeSS9pQfFQAAGIXoEpN+mNkJSROSPnH376uO\nBwAAFKOWiYmko0qulqyY2SUze2Rmt8xsrurAAADA8GqXmJjZhKSp8OcdSQfD359JOmFmF6uKDQAA\n5FO7xETrScmSu7/n7t+5+zfu/oakJUl7zWx3hfEBAIAhPVV1AEN4JvzMahx7Lgz7JH3eaQFm9qyk\nVyR9I+lBwfEBADDONkvaLumiu98peuF1TEzShCSrf5N02lTGtFavSPp1YREBALDx/I2kfyp6obVL\nTNz9tplJ61dOWqWJyd0ei/lGkj7++GNNT08XF1xFjh07pjNnzlQdRmGoT7zGqS4S9YnZONVFGq/6\nLC8v69ChQ1I4lxatdolJsCSpkTE+vVJyq8f8DyRpenpajUbWYuplYmJiLOqRoj7xGqe6SNQnZuNU\nF2n86hOU0hSijo1fJemkJGU0cn1OyWPEH4w8IgAAkFvMicmznSa4+xUlPb+eC48Pp05IOsH7cgAA\nqKfobuWY2S5Jr0naH0adNrNFd/+wtZy7v2xmpyQtmNmKkjYnx939X0YbMQAAKEp0iYm735B0Q9Jb\nfZR9u/yI4jc7O1t1CIWiPvEap7pI1Cdm41QXafzqUyZz96pjGLnwZuLr169fH8fGSAAAlGZpaUkz\nMzOSNOPuS0UvP+Y2JgAAYIMhMQEAANEgMQEAANEgMQEAANEgMQEAANEgMQEAANEgMQEAANEgMQEA\nANEgMQEAANEgMQEAANEgMQEAANGI7iV+AACkVldX1Ww2+yq7detWbdu2reSIUDYSEwBAlFZXV/XC\nC9N68OCPfZXfvPlp3by5THJScyQmAIAoNZvNkJR8LGm6R+llPXhwSM1mk8Sk5khMAACRm5bUqDoI\njAiNXwEAQDRITAAAQDRITAAAQDRITAAAQDRITAAAQDRITAAAQDRITAAAQDSiTUzMbNLM5sxse5/l\nz5nZhXKjAgAAZYoyMTGz45JWJB2XNNlH+YakI2XHBQAAyhVdYmJmOyWdk3RtgNnmJHk5EQEAgFGJ\nLjFx9y/d/TslV0x6MrM5JYmJlRoYAAAoXXSJySDCLZwJd/+86lgAAEB+dX+J35y7v1x1EAAAoBi1\nvWLScgsHAACMiVomJtzCAQBgPNX1Vs4pSQerDgIAABSrdolJ6ONkUdImM5tIR4efk+k4d1/rtaxj\nx45pYmLisXGzs7OanZ0tMGIAAOppfn5e8/Pzj41bW+t5es2ldomJpNckNSSdz5i2T9I9SdclvdRr\nQWfOnFGj0Sg2OgAAxkTWl/WlpSXNzMyUts46JiaHJT2TMf6ykoTkhJLkBAAA1EztEhN3/zJrvJnd\nl7Ti7l+MOCQAAFCQmJ/KebbqAAAAwGhFl5iY2a7QR8n+MOq0mR3uY1YX78sBAKDWoruV4+43JN2Q\n9NaA83GFBQCAmovuigkAANi4SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwA\nAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0\nSEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0SEwAAEA0ok1MzGzSzObMbHvVsQAAgNGIMjEx\ns+OSViQdlzTZocyUmS2a2d0wLJjZxEgDBQAAhYouMTGznZLOSbrWpUwjTN8i6aokl3RQ0oqZbRlF\nnAAAoHjRJSbu/qW7f6fkikknc5J2ufsr7v6KpB2SlpRcXXl7BGECAIASRJeY9GJmOyRdcvffp+NC\nInNEkklqVBUbAADIp3aJiaQ77v5e+0h3vxF+vT/ieAAAQEFql5iEqyNPCFdSJOnSCMMBAAAFql1i\n0sWrkq67+0dVBwIAAIbzVNUBFMHMJpW0MdlbdSwAAGB4Y5GYSFqQdLS1QWw/jh07pomJx7s+mZ2d\n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\nddY2MXH322YmrV85aZUmJne7LePMmTNqNBpFhwYAwFjI+rK+tLSkmZmZ0tZZ51s5UtKWJCuzSK+U\n3BphLAAAIKe6JyYnJSmjketzSh4j/mDkEQEAgKHVOjFx9ytKen49Fx4fTp2QdIKX+AEAUC+1bWOS\ncveXzeyUpAUzW1HS5uS4u/9LxaEBAIAB1T4xkSR3f7vqGAAAQH61vpUDAADGC4kJAACIBokJAACI\nBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJ\nAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACIBokJAACI\nBokJAACIxtglJmZ2zswuVB0HAAAY3FglJmbWkHSk6jgAAMBwxioxkTQnyasOAgAADGdsEhMzm1OS\nmFjVsQAAgOGMRWISbuFMuPvnVccCAACG91TVARRkzt1frjoIAACQT+2vmLTcwgEAADVX68SEWzgA\nAIyXut/KOSXpYNVBAGVaXV1Vs9nsq+zWrVu1bdu2kiNCXXEsoQ5qm5iY2XFJi5I2mdlEOjr8nEzH\nuftap2UcO3ZMExMTj42bnZ3V7OxsCREDg1tdXdULL0zrwYM/9lV+8+andfPmMicUPIFjCcOYn5/X\n/Pz8Y+PW1jqeVgtR28RE0muSGpLOZ0zbJ+mepOuSXuq0gDNnzqjRaJQTHVCAZrMZTiQfS5ruUXpZ\nDx4cUrPZ5GSCJ3AsYRhZX9aXlpY0MzNT2jrrnJgclvRMxvjLShKSE0qSE2AMTCvJw4G8OJYQt9om\nJu7+ZdZ4M7svacXdvxhxSAAAIKdaP5UDAADGyzgmJi7elwMAQC3V9lZOJ+7+bNUxAACA4YzjFRMA\nAFBTJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAaJCYAACAa\nJCYAACAaY/eunBj867/+q27evNlXWTPT3/7t32pycrLkqAAAeSwvL/dVbuvWrdq2bVvJ0YwvEpOC\n/cd//If+8i//Ups2PS2zP+1Z/uHD77W6uqp//Md/HEF0AIDBfStpkw4dOtRX6c2bn9bNm8skJ0Mi\nMSnYf/7nf0qSHj36H5L29Sz/p386ox9++KHkqAAAw7sv6ZGkjyVN9yi7rAcPDqnZbJKYDInEBACA\nvkxLalQdxNij8SsAAIgGiQkAAIgGiQkAAIgGiQkAAIgGiQkAAIgGiQkAAIgGiQkAAIgGiQkAAIhG\n7RMTM5sys0UzuxuGBTObqDouAAAwuFonJmbWkHRN0hZJVyW5pIOSVsxsS5WxAQCAwdU6MZE0J2mX\nu7/i7q9I2iFpSdKkpLcrjQwAAAystomJme2QdMndf5+Oc/fvJB2RZOKFBgAA1E5tExNJd9z9vfaR\n7n4j/Hp/xPEAAICcapuYhKsjTwhXUiTp0gjDAQAABahtYtLFq5Kuu/tHVQcCAAAG81TVARTJzCaV\ntDHZW3UsAABgcGOVmEhakHS0tUEs+re6uqpms9lX2a1bt2rbtm0lR1QfG2HbDVLHH374QT/5yU/6\nKjvo9hj3OAYpO0j55eXlvpeJ/AbZ3nX9TCjL2CQmZnZc0oK7f9HvPMeOHdPExON9sc3Ozmp2drbo\n8KK3urqqF16Y1oMHf+yr/ObNT+vmzWX+mbQxtt2gdZT+RNLDvkoOsj02QhyDlR2mPMr1raRNOnTo\nUN9zxPyZMD8/r/n5+cfGra2tlbrOsUhMzOyApHvu/uEg8505c0aNBk8VS1Kz2Qwfsh9Lmu5RelkP\nHhxSs9mM8h9p1DbCthusjp9K+lWfZQfbHuMfxyBlh102ynVf0iP1vw/j/kzI+rK+tLSkmZmZ0tZZ\n+8TEzPZI2pH16LCZHXf3dysIq8amRRcww9oI266fOqaXsMvcHuMax6AxD7NsjMZG+DwoR60Tk9Al\n/aKky2a20DpJ0h4l3dMDAICaqG1iEvoruabk/TgHMorcc/fPRxsVAADIo7aJibvf1nj2wwIAwIbF\niR0AAESDxAQAAESDxAQAAESDxAQAAESDxAQAAESDxAQAAESDxAQAAESDxAQAAESDxAQAAESDxAQA\nAESDxAQAAESDxAQAAESjti/xAwa1urqqZrPZd/kffvhBP/nJT3qWW15ezhNW4fqNp9/6DbLMYfW7\n/I0SRyzYHqgCiQk2hNXVVb3wwrQePPjjAHP9iaSHZYVUgm8lbdKhQ4f6LB9D/QaNedzjiAXbA9Uh\nMcGG0Gw2Q1LysaTpPub4VNKv+iyflq3afUmPNFjMg26Pog0S80aIIxZsD1SHxAQbzLSkRh/l0kvT\n/ZSP7TL2IDEPuj3KQhxxYntg9Gj8CgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFi\nAgAAokFiAgAAolH7DtbMbELSaUk/lWSSJiS95e43Kg0MAAAMrPaJiaQlSVfd/TVJMrM9kq6Y2W53\n/7La0AAAwCBqfSvHzE5L2i7pSDrO3a9IWpG0WFFYIzc/P191CIUat/pI41Sf/1l1AAUbp30jjVd9\nxqku0vjVpzy1TkyUJCQr7v592/gLkqbMbGcFMY3cuJ3Ix60+4/WBdLHqAAo2TvtGGq/6jFNdpPGr\nT3lqm5iY2S5Jk0pu5bRbUtLe5PWRBgUAAHKpbWIi6cXw827GtHTc1IhiAQAABahzYjIZft7PmJaO\nIzEBAKBG6vxUTlZC0q/NkrS8vFxQKOu+/fbb8NuCpN4PBT18+H+0urqqX//6130tf9OmTXr06NFj\n4/7whz90nD+rfJbbt2+H3z6V1Gu7JGU//fTTvrZhvzGk/v3f/z3X9sgyWP0k6X8NUL5X2T9ISusz\n2LYbLO4iY+5U/v9qvS5VxlHUstN9U3Ucw5TNKt96rFUZRxFl/1DScocpX0TZTvsm+R8v43xUlpZY\nN5exfHP3MpZbuvBY8GeSzrn7G23Tdkm6Lum6u7+UMe9/Ue9PVwAA0NnfuPs/Fb3QOl8xWQk/n8mY\nlo671mHei5L+RtI3kh4UGxYAAGNts5KuOkp5TK+2iYm73zaz+5IaGZMbklzJ/ZSsee9IKjzLAwBg\ng/jfZS24zo1fJem8kv5KtrSNf1nS1+7+RQUxAQCAIdW2jUnKzL6StNTSJf1eJZeXGu7+b5UGBwAA\nBlL7xESSzOysknYl9yTtkHSCpARAUUKD+hlJC+7+XdXxIA55XyLbMr+UdG+x4u5/V0asdTIWiUnR\nzGxS0luS3nf3byoOBxuAmZ2TNJle+RsHZrarzm/5DieNf5C0X8nJg6QEjzGzr5W8RPavw997lLyn\nredLZM1sSskDGgfSZgdmtqAkQdldxbEWy7lvrBKTvNlrWMZxSW+HeWeqekNxAZn4VJh/Txh1WdIR\nd18rIdx+4imiPnOS9oZRlyWddPfbnecqTxHHWsuyGko+oBarSEwK+r9ZlHSgbfRn7v5KYYH2H0sR\n9WkoOcYupSedquSpT3jR6fEuRRqj/Iwr8HPgjqRnw/zn3f035UTcNZbTkt5U8oXi+5bx1yRNuPvz\nPeZflLSztVzYPvcknXb3t8uJvGM8Q5/7ivw8lCS5+9gMkr6W9M8tf+9R0j39zj7n3ylpi6RLkh72\nO19sdVHyVNJdJW1tLir5J34Ufm6pYX2mJN1S8iGwX8lLGh9J+qqO+ydjWenxdqGOdQkfQq3H20Ul\nryGu5P+ngPo0wvH1u6qOr6LqE8r9TtLZtuGqpDs1q8tUKPuzlnE7wr7aX0Fd7mZ9BilJBLueP8L/\nzKOs/3klX1IejvKzOu+5r8jPQ3cfn8RESbb2UNKfZezkgU5gkt4fZufEUpdwcP15y99bWg72UzWs\nz/sZ8y6EZW6vW33a5pmTtLvTh1Qd6hLqMPITQ4n1uZe1jLrVR8kVrMMdpi1IOluXurTMn5UIXJJ0\nccR12dUlsdgTpnXcvt3KtHy27a7geBv43Ffk52E61P1x4VZHlDQc+r5t/AUljxTvrCCmYQ1dFzPb\noeTy8+/TcZ7cqzyi5BJbVr8vZcu7b+Yy5r0qSV7NfdBCjrVwu2DC3T8vOsABFFGXo5KeCcde1XLV\nx8xOKPk2+0nGMqqQpz6fufuHHaYdVId+nkqU91jboezuIap4J1rel8hOdplWt5fQFn7uHYvEJLSY\nn5S0lDF5SckJ+fWRBjWkAupyx93fax/p6/f68rxjaGBF7JsOycdLkk7kjW9QBR9rc972OoVRKqIu\n4b70hJI+hb42s1tm1t7WZCQK2jdHlXTOuGJml8zsUajTXLHR9pa3Pt6h8WToUsF9hP08FbRvPgvl\nFluW21CSsIx6/+R9iWzac/mLGdPS+bslL1Eo69w7FomJ8mevMclVly4fRum32UvDhzaUwvdN+Fbr\n7v7f8wQ2pELqE050Iz/ZtSmiLotKPnhOK7nPvEPSopmdKiTCweSqT2jAl06/o+SqwpSSE+IJMyul\n++0uyvpcOyjpk6EiGl7uurj7B0ri3tuSAC9I2jvKJCvI9QUvfFG8L6mRcQWoW9ITm1KO0XFJTPJm\nrzEpqy6vKnmp4UdDRTW8wupjZgdCi/dTkl4Nj9aNWu76RHILRyqgLu7+jbt/6O5ve/J0wetKrjic\nMLPdxYXal7z1Sactuft77v5dqN8bSr797R1xncr6LPiFpH8eKqLhFVIXd/+FpA9C2UUlj7VW0cN3\nesUj66pGv4nFyfDzSvrF0cyOKNk/reuIWSnH6LgkJnXILPtVeF3Cs+lHlHxTGrXC6uPJI4EHlSRZ\nX0s6UME38yLqc0oV3IbKUPixFto0vKxqbp/mrU/68s+sE8I5JXXal3Mdgyjjs2CvkqT4X4pedg9F\n1uUZJfvDJb1jZu8XuOx+5XmJrKQfrwCl/yPXzOyqkit1d8P0qr+49KOUc++4JCZFZK+xKKMuC5KO\ntjaIHaHIUGQbAAAL00lEQVRC6xO+wf5WySVE0+iTrVz1CW0yFiVtMrOJMKTzTabjigu3q1L+b9z9\nipIrDKO+Spm3Pt3mT6eNsk5l7J8qbuNIBdQl/G9cU/IEzhtKPgPuSToy6i8onvSfNNRLZNuW86G7\nv+Tuz7r7S5Jua/1qUB2U8hkybonJ0NlrRAqtSzgRLlR0uVMqad940lHcJx2WW6a89XlNSUPRey1D\nei92X/j7cv4w+1Lm/82Ksu87lylXfXy9s76s+dNlj7JOZeyfKm7jSMXU5R1Ju9Lb0aGdxoykNSW3\nDtvbapStjJfIvqMkqTnZq2AkSvkMGYvEpKjsNQZF1iU0DrvX5ZHB0pW8b+5qxAlnAfU5rKT32vZB\nkq4r6d/gSFHxdlPyvpnUiO+RF1SfpQ7zp1dKbg0d4ICK3j/pbRxJVwoJcAAF1WVGbU9/hCf2zoc/\nR3qFzt3fUnKMf5COC9t4t5Lbzem4ifB019VuywuN+neruqvbAyvrM2QsEpOgjOy1KrnrEt7ZsCMr\nKQlXUUaprH2zV9U82TJ0fdz9S3f/vH1Q8s+94u5f+Ghfg1D4vgm3pmZUTTuavPU5KUkZjVyfU/Ih\n+8ETc5SryP1zUNLlTk/ujUDeuqwoO/lYkZL/rfwhDiY0+L5rZhdCW5fjanuzfbi6+3UYMoWk5JSS\npGTUDyjkVfzn+zC9ssU6SPpKLT3xKTlxPdTjXRinXQFf7bKcRVXfJf3QddF6l/QLbcNiGF9Fj4J5\n6pPWZUfLuDlJb9Zx/3RY3l1V1yX9UHXReu+XC0ousaflFiT9VV33jZJH6r9S0kg0HXdL0i/rWJ+2\nY+y/VrVf8tYlHG8P2//vlVw1/W9V1ivH9jgQjreLaumtu8J4Op77evzP9NyvgwxPaYy4+/NmdtbM\nLii5V79DGdlreCPkE9lr6CzmNSXvY5Gk02a26BXcChm2LuGxs2tKvt1ldXR1zyto7Z1z31xQcqDf\nMrNPlHxDqvTtl3mPtaxFhmHkctRlRckHWUPJUwXpvjnsFb6FN+++cfeXQ2PKBTNbUXKv/LiP/kmW\nNJ7cx1q4gjqhihtV5qmLu98wsxkln8v7lBxrzyj5LKjsdvWwwqPBX0s6WOX/S4il57mvx/9Mz/06\nUDwhuwEAAKjcOLUxAQAANUdiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAA\nokFiAgAAokFiAkQovFoAiA7HJspGYgIUxMx2mNnx8JbR9vF3zexwH/O/b2bpSwuLiqnnukfNzK5V\nHcMomVkj7NudPcrFur8KPzaBTkhMsOGY2QEzu2Vmj8JwNetEYGZHWspd7XZSCS9JOx2GmbbJk0pe\noNboFpe73w7zTw5apy76WvcomdlRSbs6bc+wfxZa9s8dM3uz9bXqZjZhZnMtZS6a2e6MZTXCsm6F\nE/7DlnkemdnFEquaxnBE0mVJR5S8dK6b6PaXVNqxCWTiJX7YkMxsu5K3k7qkk+7+XodyBySdl7Td\n3b/vY7mPJF1395faxm/p9w2inZbRx3w7pB9PIkOtexTC1ZJdkj5x99e6lLur5CR9sNObfc3suKSj\n7v582/gJSR8qecP2+5LeSd9GHRKiRUlTki67+yu5K9WDmc1JOi5pX6+3e8e2v1oNe2wCg+CKCTak\ncJJ6R5JJer1L0X2STvWTlPRY3yhONJ8pOZFXse6+hNer31Wy3Q+2XgXJcDf8XOtSZklJgpk1fr+k\nI+7+92lSIknu/mVIZG6o9xWMotzpt2BM+wuoAokJNrJT4edUl9s0v1ByxSRqZrYoqQ6NEl+XNKf1\nbXq0gGXeb/3DzE4r2RbX3f2jLvO9WsC6ARSMxAQblruvSfpEybf3t9unm9lBSVfTb7BmdsLMLoS2\nDZfCbYSeQpuJS1ntGUJbifdDO4gLnZbZbd3hdtOu8Ofp0N5iZx/rngzrPhvKXAptZVpjO2pm18xs\nv5ntCr8/MrML/dQ9w55wK+O0el+tGtZxJbfo5roVCre8ejbC7We/t+zH1m25q8PyjnTajj32165w\nnFwLbWbmWqbtCW1o0vZQ21umpW1xTvWzrIw6dT02gcK5OwPDhh2UfLN+JOmhpC1t065J+nn4/bSk\nhy3T9oT59rfN80hJMpP+vUvJCfKRpIttZaeU3K74ecu44xnL6LnusI6Hkn7W57obYd2t5Y+Esqda\n5r8UlntR0llJuyVdCOXeHHBbH0mX3bJ9H0ra3aH8rW7TW7bFhYxt81BJu6C8x0c/234qxPrnLePu\nth5TLfv1gpIrdTvD9vxxO/axvy62/L07XV7LuP3t48L4ibbjqZ9l9XVsMjCUMVQeAAND1UPLybf1\npDkl6U5bmWbL3xPhQ/ps27Ke+OBuKdt+sllsH5e1jH7WrfXEZGef677eYd3XWpejtmQljNuRtcw+\ntvM1SX/W8nfmibRl+jCJyYGwzIeDxNbj2Oi17a9J+mXbfMcl/T89npg8lHQ4Y1lXM8a1769bGfs2\n3T7b28dlxLJ/kGX1e2wyMJQxcCsHWL+t0Nre4ageb1tyUEmyknqx34V7csvoMeEJmgNKGqz2Usa6\ndylpINrunJJtkT4tkzZA/bplmelTP303HA3rvOstjYjd/bdK2of0agQ7lIKW2XXbm9mUkisQV1rH\nu/u77v6UP9mQdaWlzJqS+k+2jXtMuCU0peQ23aVwq+6SpHthea3xnQvz7G8Z91rY1n0ta8BjEyjc\nU1UHAFTN3a+Y2YqkHWZ22N0/VJKYbG8pk7YzOSBpr5J+KaThn+qYUtIOIuuJkvb4il53tz4yrvVR\nZhhvSZoxs9anU0zrTxEdlZT5yPaAWrfnlKQv8yysj23fULIf7z85d2HSY+Wg93467LySRPttSb8N\nScbVQZYV2hn1dWwCZeCKCZBIr5qcDCehq63fds1sKvS/8VN3f8Pdf5NzfVNhfVO9Cpaw7tYY2t1v\n+1mU3e7+bNvwjJIrEJ0awaYnxm6dek1q/aqO3P1Gy7S+ryx10se2T5+E6rkfc0iX/Vyvgr7eoLsR\nkpLXFa6iDLCsvo9NoAwkJoAkd/9Aycl4StIHSjrlavWZkjYnHxa0yvSk209HVUWvO72Fk3VVJE0C\nflfQulp7Pn1CSCTSWwjtPbem26jbCXJKLbeZgvMq7omfXtt+Kawr89HjLo+hD2JFj99ea1/HgbZR\np7Re/13u3nrVqJ9lDXJsAoUjMQHWpR/o7i09jYZvno/1EWJmebvmTm+ZdGpfMTnkunve3gltRJaU\n3X/LPiXtDT7otZwBnNSTiV6r9JHtk23jF9XlJBq8FuZvX999JVcNOj7iGq6GnO0yvZ9tn+7Ho+0J\ngpktqJjbIWlSd6L1ce6wjvfVlpi1JHsnlDTeHXRZfR2bQFlITIB1aWPXc23j01sFey15Sd8RJU/B\nuJKT32Ez29Jy0nrsg7tl/I/f/MMl9/REvBT6odjV0p/EVOh34lE/61ZyQjFJr4bl7O+07uBVJSfv\nHxOQUPaokidH0ttYz7bXqVM9s5jZ3rDu212KpY0s97b2/eHuV7R+W2IhnRb619gbbrHMe0uvrmG+\nNSVXg1YkpX2P/LjcsH2OK3l093SXuHru9/B7emVmMfQLsmBJd/oXW7bjXyj79shk67gux0oa52eh\nPnOh/vfaroikzoXYHksw+1lWv8dmGQ2WAUk8LszA0Doo6Vtie8b4w0q6Ff9K6/1OzIVxp/R4nx8P\nw7jtSh5nXWgZ/6Za+ksJy/1K632FbA9//1Lrj252XXfLsq6GcWfD373WvUXJyflqqPdZtTxGGuZP\nHyP9SsnjvRNKrn78WM8u2/KA1vvzuKi2R1RbylxrWd5XerJvmP1h/juhzJ3w9887rbtt+2bNe7jX\nvANu+/1hOz4MP1v7/zjSsv6rSvoNad+OZ/vYX2+2HCtfSfqrLnFP9Ng3PZfVz7HJwFDGwEv8AABA\nNLiVAwAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFiAgAAokFi\nAgAAokFiAgAAokFiAgAAovH/AULXivAOGgb2AAAAAElFTkSuQmCC\n", + "image/png": "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\nEEwAAEAy/j8rbCOiYuZA3wAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.859247414262\n" + ] } ], "source": [ @@ -85,7 +92,8 @@ "# plt.legend(frameon=False,loc=\"center left\",fontsize=fontsize)\n", "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", - "plt.show()" + "plt.show()\n", + "print(np.max(maxs))" ] }, { @@ -97,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 522, + "execution_count": 619, "metadata": { "collapsed": false }, @@ -116,16 +124,16 @@ }, { "cell_type": "code", - "execution_count": 535, + "execution_count": 626, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAF7CAYAAADIc2FgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl0XGeZ5/HvKzuJk2BLlgPB6Q6xZAcSMwm2pNDAMIHY\nljhsYfAWDMxGvAiGnm4fYstulsw53YNt2dNhSA+ObMM5AyTCiwLT0H3atuRulsnMiS05QDohcaxy\nOt0xJLZkOXjJIj3zx3tLKpVKUpVquXVLv88595Tq1r33feutUtVT7+rMDBEREZEoKgs7AyIiIiIT\npUBGREREIkuBjIiIiESWAhkRERGJLAUyIiIiElkKZERERCSyFMiIiIhIZE0NOwPFyDk3C/gQcAq4\nHG5uREREImUaMAc4aGZn852YApnUPgQ8HHYmREREIuwzwCP5TkSBTGqnAL7//e9z6623hpyV6Fi/\nfj0PPPBA2NmIHJVb5lRmE6Nyy5zKLHNPP/00n/3sZyH4Ls03BTKpXQa49dZbqampCTsvkVFeXq7y\nmgCVW+ZUZhOjcsucyiwrBemaoc6+IiIiElkKZERERCSyFMiIiIhIZCmQkZxZtWpV2FmIJJVb5lRm\nE6Nyy5zKrPg5Mws7D0XHOVcDdHZ2dqqTl4iISAa6urqora0FqDWzrnynpxoZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGQpkBEREZHIUiAjIiIikaVARkRERCJLgYyIiIhElgIZERERiSwFMiIiIhJZ\nCmREREQkshTIiIiISGSVdCDjnKtyzh1yzg04555zzi0LO08iIiKSOyUdyAAtwAagBjgJ7HPOLQg3\n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\nIiIikfX/Aa0cIX4GrzqYAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAF7CAYAAAATyMtCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X94XFd95/HPkU3ihI0ly5ASlm4tyVkSt7uxJZFueApt\nbEvhR0gX27GjwCZlG8cKhe26jS0ZaNNSii3ZQHeftv6Zp4XSKLZlh222C7YlN0C3C7ElOQ+UhCbS\nGEri/sC25BDi/JC++8e5I41Go9GM5se9M3q/nuc+I53763uPRpqvzj3nXGdmAgAAiKqKsAMAAABI\nh2QFAABEGskKAACINJIVAAAQaSQrAAAg0khWAABApJGsAACASJsfdgBR5JxbLOk2SWclXQ43GgAA\nSsoCSUskHTOz8/k4IMlKardJ+suwgwAAoIR9SNIj+TgQyUpqZyXpy1/+sm688caQQykNmzdv1he+\n8IWwwygZ1Fd2qK/sUF/Zo86yk66+nn76aX34wx+Wgs/SfCBZSe2yJN14442qr68PO5aSUFlZSV1l\ngfrKDvWVHeore9RZdjKsr7x1o6CDLQAAiDSSFQAAEGkkKwAAINJIVpAXLS0tYYdQUqiv7FBf2aG+\nskedZafY9eXMrKgnLAXOuXpJfX19fXS4AgAgC/39/WpoaJCkBjPrz8cxaVkBAACRRrICAAAijWQF\nAABEGskKAACINJIVAAAQaSQrAAAg0khWAABApJGsAACASCNZAQAAkUayAgAAIo1kBQAARBrJCgAA\niDSSFQAAEGkkKwAAINJIVgAAQKSRrAAAgEgjWQEAAJFGsgIAACKNZAUAAEQayQoAAIg0khUAABBp\nJCsAACDSSFYAAECkkawAAIBII1kBAACRRrICAAAijWQFAABEGskKAACINJIVAAAQaSQrAAAg0khW\nAABApJGsAACASCNZAQAAkUayAgAAIo1kBQAARBrJCgAAiDSSFQAAEGkkKwAAINJIVgAAQKSRrAAA\ngEgjWQEAAJFGsgIAACKNZAUAAEQayQoAAIg0khUAABBpJCsAACDSSFYAAECkkawAAIBII1kBAACR\nRrICAAAijWQFAABEGskKAACItLJOVpxzNc654865Mefcc865tWHHBAAAslPWyYqkvZK2SKqXNCjp\nkHNuebghAQCAbMwPO4BCCVpR7jezs0HRbc65MUmrJZ0JLTAAAJCVyLasOOeqnHM7nHNLZrO/mR1J\n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\n6dinT5+eEkdjY6M6OjpUXV2tLVu2SJIefDD7x1JVVVXJOTfp1lCmsZqZjhw5os7OzqzPi9SefFK6\n/nr/ZGMAc0cuycqwpEPBa7LzknrMbCCH45e1q6+W5voDneOJzYULvo/24OCgnHPq7u7WNddcM+1+\nCxculORv0/T09Gj16tWTjiNJe/fuVXNzs9ra2rR3714dPnxYK1asyFvsQ0NDM8ba29sr59x4Uobc\nPfmk9Iu/GHYUAIotlw62282s1czaUyw75fusABmLxfzzMAcH07914v1ALl68qN27d2vt2rVTtqmp\nqVFfX5/uvPNOxWIxNTQ0TOqjkquhoaEZY423rsS3RW5eeUU6c0a6+eawIwFQbLNOVmzmmWi3pZrB\nFphObW2tzGy8c2qyo0ePSpKampq0ePFi3Xff9I+ZisViWrhwoQ4ePKgTJ05I0qRRPIWO9ciRI+Mt\nKkypnx9PPeWHHdOyAsw9MyYrzrka59ypLJdn5furTP2XF5hG/HZOZ2enensnDzZrbW1VbW2tYrHY\neAtMXKqp6zs6Osa/Xrlypfbu9c/bPHv2rCRp8eLFMrNJ/V2ySSpmirWurk6NjY2S/PDn+LDtmeLG\n9L79bemKK6Sbbgo7EgDFNmOyYmYxSXWSGrJY6uQ72Zb0pHCbN2/WHXfcoa6urrBDKRnnz59PWX7x\n4kVJmnRLJPkWSmVlpdra2iT51pPm5ma1t7ersbFRixYt0vLly8f7ufT09Gjnzp3av3+/2tvb5ZxT\nf3+/Dhw4oJGRER06dGhSUmNmqq2t1ZIlSyRNJBttbW3jx4h33O3p6dGBAwckSc8991x8hFjWsVZW\nVo4nTfX19ert7dXAwMD4XCxDQ0Patm1bykQGUz35pLR8uXTllWFHAiCVrq4u3XHHHdq8eXP+D57J\nkCFJeyTVJJVtkbQlzT47JC3J17ClYi4qwtDlctTT02MNDQ1WUVFh1dXVtn//fjPzw38rKiqsoqLC\nmpubbWBgwPr7+62pqWnKtmZ+iPHSpUutoqLCli5dakePHp10nv3791t1dbUtXbp0fDhyW1ubVVdX\n27Zt28zMD12uqKiw1tZW27Rpk61fv358OHHieaqrq626utp27dplZmZLly61bdu2WSwWs3379ll1\ndfV4HIlDnzONNR5vfJvm5maLxWK2dOlS27Vr15SYML3rrzf72MfCjgLATAoxdNlZiv8akznnasy3\nsCSWHTSzDWn2WSFph5ndNpskKkzOuXpJfX19faqf60N2gAi4cEFavFj6i7+QPvzhsKMBkE5/f78a\nGhokqcHM+vNxzIw62CYnKgGXoixRtfyTlwEgJ/GuRYwEAuamXIYuX3DO3ZpqhXNuoaS9khizCSBn\n3/62VFXlJ4QDMPfkMilcm6SYc+6UpBPyiUmtgicuB9tsyi08APCda2++WXIztecCKEu5PMhwxDnX\nKKlDUqd8Z5rEPyVtZnYgx/gAzHFmvmUlj9PkACgxubSsyMyGJN3pnKuRb1WplW9hOW1mI3mID8Ac\n94MfSP/6r/RXAeayXPqsSJKCWWprzKzXzPZLqpJUk+txAUDyrSoSyQowl+WUrDjnDso/A2hvvMzM\njkhqdc5tzzE2ANCTT0pLlkjXXht2JADCMuvbQM65HZLulL/tM2necDNrdc6dds49aWaP5RgjgBLz\n+uvSww9LIyPS6Ojk5fXXp5ZNt7z+uvSNb0jvfnfYVwQgTLn0WVknabWZnXTOHU+xvke+4y3JCjDH\nxDvELlwoveEN0vz50rx5U5dMyv/jf5Q2bgz7igCEKZdkZdjMTgZfp5oGt16+wy2AOeZHP/KvP/yh\nVFkZbiwASl8ufVYSJ3ybNPuBc26V/Oy1TAoHzEEvvCBdfbVvWQGAXOWSrGx3zh1zzi2XZM65a5xz\ny4OOtcflW1v2pj8EgHL0wgvSW9/KJG4A8iOXSeEGnHPbJHXL3+6Jd7KN/3nqMLNdOcYHoASdO+eT\nFQDIh1wnheuXtDR4wnLipHA9TAqHTMViMdXUMDVPOYm3rABAPuRrUrhFZnbEzHYGxXzyzFGxWEzV\n1dU6cCD9kxZisZhaW1tVXV2t9evXFySOnTt3qpU52kPxwgvSddeFHQWAcsGkcMir4eFhjYyMqL+/\nP+12NTU1amtr0/DwcNrtZqO3t1dtbW1qa2tTX19f3o+PmdGyAiCfmBQOebVixQpdvHhRCzMYBlKo\nWz+rVq3SqlWrVFGRc8MhZuHFF/1CsgIgX3L5ax6fFG6ppIsp1scnhcMck0migtl773ulqio/f0ll\npR8evHCh9O/+nfRP/xR2dL5zrUSyAiB/mBQOKCEvvywdOybddZdUXz95aPAnPyn9xV9IW7aEF5/k\nbwFJJCsA8ieXZCWTSeEGczg+StCRI0e0d+9eOed07NixSetGRkbU1tamCxcuyDmnxsbGlMcYGBjQ\n9u3bNTQ0pOHhYa1bt047duyYtE1nZ6f6+vpUU1Oj/v5+NTU1aUvYn9JF8Oyzkpn0sY9J73zn5HVP\nPil98YvSgw+GO79JPFmhgy2AfMklWdnunDsmqU3BpHCS6iRtkLRVZTAp3ObNm1VZWamWlha1tLTk\n/fjnzp3TuXibeQoLFizQsmXL0h7je9/7ni5fvjzt+uuuu07XFelTY2BgQKdOnVJPT4+ampomrRsa\nGlJjY6OOHDmiW2+9VZK0c+fOKcfo7+/Xtm3bxhOdkydPavXq1YrFYjp48KAkqa2tTbt27dLo6Kgk\n36G2qalJdXV1WrNmTSEvMXTPPONf3/72qevuvVd6//ulgQHf6hKWF16QrrnGLwDmjq6uLnV1dWlk\npAAzl5jZrBf5Wz3PSRqTNBosY8GyPZdjh7kE12V9fX1WSA899JDJJ3Upl2XLls14jGXLlqU9xkMP\nPVTQa0g2PDxszjlrbm6eVL5u3bopZWZmzjlrbGwc/76urs4GBgYmbVNXV2cVFRUWi8XMzKypqckW\nL1485Zytra1pj10Ofv/3zd785tTrXnvN7Gd+xuw3f7O4MSXbvNns7W8PNwYA4enr64t/BtVbnj6X\nmRQuRJs2bdIdd9wx7foFCxbMeIzDhw/P2LJSTJUpnloXi8V05MgRdXam7289MDCgoaEhtbW1yczk\nnJOZadGiRXLOaWhoSEuWLFF3d/ek/U6fPp3Xa4iyZ56Rbrgh9br586UPfcj3W9m50z/tONH3vied\nPy+NjUmPPSadPVuYGPv7pbq6whwbwNyUU7IiSc65NZKaNJGoXCBRyUw+btHMdJsoCoaGhuScU21t\n+v7Wg4ODcs6pu7tb16S5hxAfbXTkyBH19PRo9erVkqQLFy7kL+iI+v7309/iuece6fOfl772NekD\nH5gov3hR+oVf8P1dJN+nZeVK6aqr8h/jTTdJBbhrCmAOy2WelUpJp+WTlMTufJucc52S7jPmWIF8\nsmJmGhpK/xDuWCwmyScty5cvT3u89evXq7W1Vbt3785rrFE2NuZbVu6+e/ptbrrJL1/84uRk5Sc/\n8YnKgQPSL/2StGiRdO21hY8ZAPIhl3lW9st3qO2VnxyuTtKi4LVD0sPOuVtzjhAlL96icurUqRm3\nM7PxjrTJjh49KklqamrS4sWLdd999+U30Ih7/nnppz+d/jZQ3D33SI8/LiU2NL36qn+tqfGdc0lU\n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\ntCoYXlxNAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -154,7 +162,7 @@ " plt.ylabel('T [seconds]',size=fontsize)\n", " plt.xlabel('Validation AUC achieved',size=15)\n", "\n", - "plt.xlim([0.8,0.92])\n", + "plt.xlim([0.8,0.861])\n", "plt.legend(frameon=False,loc=\"center left\",fontsize=fontsize)\n", "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", @@ -171,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 372, + "execution_count": 608, "metadata": { "collapsed": false }, @@ -187,16 +195,16 @@ }, { "cell_type": "code", - "execution_count": 428, + "execution_count": 617, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n3vkVwf7BLJu+jO9P+T6hgaFOlyYiIufxyjCD65JQobW24rztm4BlxphJnemdaby8FG2t3aa/pKWz\n1mxfw7+/8u+crT3LD6/+IRnXZRATEuN0WSIi0gavCzPGmMlADLC1ld15uMbPzMd1e4WOLLPWzvBg\nedIKa8HP4/PinPHOwXf43t++x7cmfotHpz6qcTEiIj7A68IMkNb4XNLKvqZtSR010uzykkinPf7O\n44yJG8PTtz2Nn+knCU1EpJ/zxn+tm/rzy1rZ17St3TDT/PKSJwuT1vWXMTOfln9K5keZ/PDqHyrI\niIj4EG/smWktxHTVUuBOD7QjndQfwszqd1cTERTBtyd92+lSRESkC7wxzBQ2Prc24rK9XhsAjDGL\ncM148mtcqwZc42wAYpq2WWvbXJ34gQceIDo6usW2uXPnMnfu3I6rH4D6w9TsMzVnWJe3jntT7iUi\nKMLpckREvNrGjRvZuHFji23l5c4t+u/NYSaulX1N23a0c/4cIAVY18q+dKAUyAWmtNXAY489RkpK\nSseVipuv98z8bufvOF19mvuuus/pUkREvF5rf+Dn5eWRmprqSD1eF2astUXGmDJcgeR8KbgWv9vc\nThP30HoQysYVYh7GFWjEQ3y9Z6bBNvDrf/6amRNmMjpmtNPliIhIF3ldmGm0DlhkjImy1p5utn0G\nUGCtfaWtE9taf6YxIBW2d650ny/3zPxt79/YW7KX3/3L75wuRUREusErp2xYaxfjuty0vmmbMWY6\nMBWY1WxbtDGmwRizve+rlCa+3jPz2DuPcdXIq7jmomucLkVERLrBW3tmsNaONcasMcZswnVZKBFI\nsdbuanZMuTGmACjoTJPo/ky9xld7Zt479h7biraxceZG3W9JRMRHeW2YAbDWdrjKr7W2U/dpstbG\n97wiaY0v98w8/s7jXBR1ETMnzHS6FBER6SavvMwkvscXOzWOVx7nv9//b+6bch+B/oFOlyMiIt2k\nMCM95qs9M2u2ryHAL4B7U+91uhQREekBhRnxCF/rmTlXd47f7vgt35r4LeJCW5vJLyIivkJhRnrM\nF3tmNr6/keOVx/nh1T90uhQREekhhRnpMV+70aS1ll++/UtuueQWxg0a53Q5IiLSQwozMuC8VPAS\nH574kH+79t+cLkVERDxAYUZ6zNd6Zlb9YxVpI9K4YfQNTpciIiIe4NXrzIh42s6jO8kpytEieSIi\n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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -207,9 +215,10 @@ "plt.plot(ttp,mmp,label=\"parallel\")\n", "# plt.plot(all_t,all_maxs)\n", "plt.plot(tt,mm,label=\"serial\")\n", - "plt.plot(tt/100,mm,\"--g\",label=\"serial, scaled T\")\n", + "plt.semilogx(tt/100,mm,\"--g\",label=\"serial, scaled T\")\n", "# plt.xlim([-50,5e3])\n", - "plt.xlim([10,5e3])\n", + "plt.xlim([10,2e5])\n", + "plt.ylim([0.5,0.87])\n", "plt.ylabel('AUC',size=fontsize)\n", "plt.xlabel('T [seconds]',size=fontsize)\n", "plt.legend(frameon=False,loc=\"lower right\",fontsize=fontsize)\n", @@ -227,13 +236,13 @@ }, { "cell_type": "code", - "execution_count": 484, + "execution_count": 627, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "replicas = 100\n", + "replicas = 1000\n", "#compute the mean value of the time necessary to find the best AUC value\n", "ttmax = generate_maximum_times(ts,aucs,replicas)\n", "#compute actual time it took in parallel\n", @@ -242,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 497, + "execution_count": 628, "metadata": { "collapsed": false }, @@ -251,9 +260,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mean speedup: 88.2172247234\n", - "Mean time serial: 91.1707864167 hours\n", - "Time parallel: 1.03348055556 hours\n" + "Mean speedup: 104.163321695\n", + "Mean time serial: 53.9568899806 hours\n", + "Time parallel: 0.518002777778 hours\n" ] } ], @@ -271,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 513, + "execution_count": 602, "metadata": { "collapsed": false }, @@ -351,7 +360,7 @@ " dataset = pd.read_csv(f)\n", " t = np.concatenate((np.array([0]),np.array(dataset['times'])))\n", " auc = np.concatenate((np.array([0]),np.array(dataset['val_roc'])))\n", - " max_index = np.argmax(auc)\n", + " max_index = find_max_auc_index_given_patience(auc,patience)\n", " auc = auc[:max_index+patience+1]\n", " t = t[:max_index+patience+1]\n", " auc_max = np.maximum.accumulate(auc) \n", @@ -360,6 +369,23 @@ " auc_maxs.append(auc_max)\n", " return ts,aucs\n", "\n", + "def find_max_auc_index_given_patience(auc,patience):\n", + " max_val = -1.0\n", + " max_idx = 0\n", + " no_best = 0\n", + " for (i,val) in enumerate(auc):\n", + " if no_best >= patience:\n", + " break\n", + " if val > max_val:\n", + " no_best = 0\n", + " max_val = val\n", + " max_idx = i\n", + " else:\n", + " no_best += 1\n", + " return max_idx\n", + " \n", + " \n", + "\n", "def get_global_auc_stats(ts,aucs):\n", " all_t = np.concatenate(ts)\n", " all_aucs = np.concatenate(aucs)\n", @@ -373,15 +399,6 @@ " ts,aucs = generate_serial_times_aucs(ts,aucs)\n", " return get_global_auc_stats(ts,aucs)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { From bcf0a1182b77fd4efab9fad817003ebe49a91021 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Sun, 17 Dec 2017 19:57:42 -0500 Subject: [PATCH 418/744] Changes to Jenkins as we move to pull request based trigger --- examples/jenkins.sh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 9d9087e6..c9ac520d 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -4,13 +4,26 @@ rm /tigress/alexeys/model_checkpoints/* ls ${PWD} -module load anaconda +echo "Jenkins test Python3.6" +export PYTHONHASHSEED=0 +module load anaconda3 +source activate PPPL_dev3 module load cudatoolkit/8.0 -module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 module load cudnn/cuda-8.0/6.0 -source activate PPPL - +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 export OMPI_MCA_btl="tcp,self,sm" echo $SLURM_NODELIST srun python mpi_learn.py + +echo "Jenkins test Python2.7" +module purge +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +srun python mpi_learn.py From 4638745b22682671f853e04120626788037b0acc Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 17 Dec 2017 22:58:30 -0500 Subject: [PATCH 419/744] notebook to plot signal influence --- Signal Influence.ipynb | 498 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 498 insertions(+) create mode 100644 Signal Influence.ipynb diff --git a/Signal Influence.ipynb b/Signal Influence.ipynb new file mode 100644 index 00000000..6e865638 --- /dev/null +++ b/Signal Influence.ipynb @@ -0,0 +1,498 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#%matplotlib inline\n", + "import pandas as pd\n", + "import numpy as np\n", + "from plasma.primitives.shots import Shot\n", + "import data\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import rc\n", + "rc('font',**{'family':'serif','sans-serif':['Times New Roman']})\n", + "## for Palatino and other serif fonts use:\n", + "#rc('font',**{'family':'serif','serif':['Palatino']})\n", + "rc('text', usetex=True)\n", + "#import seaborn as sns\n", + "#color = sns.color_palette()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "dat = np.load('./temp_data/signal_influence/signal_influence_results_155191_2017-12-01-01-42-33.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "all signals (determines which signals are downloaded and preprocessed):\n", + "[Radiated Power Core, Input Beam Torque, Input Power (beam for d3d), Impurity density profile, q95 safety factor, plasma current, stored energy, Locked mode amplitude, plasma current error, internal inductance, Plasma density, Radiated Power Edge, plasma current target, Normalized Beta, plasma current direction, Electron density profile, Electron temperature profile, stored energy time derivative, Radiated Power, Ion temperature profile]\n" + ] + } + ], + "source": [ + "shot = dat['original_shot'][()]\n", + "plot_signals = shot.signals\n", + "importances = dat['importances'][()]\n", + "pred = dat['y_prime'][()]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[[Radiated Power Core],\n", + " [Input Beam Torque],\n", + " [Input Power (beam for d3d)],\n", + " [q95 safety factor],\n", + " [plasma current],\n", + " [stored energy],\n", + " [Locked mode amplitude],\n", + " [plasma current error],\n", + " [internal inductance],\n", + " [Plasma density],\n", + " [Radiated Power Edge],\n", + " [plasma current target],\n", + " [Normalized Beta],\n", + " [plasma current direction],\n", + " [Electron density profile, Electron temperature profile],\n", + " [None]]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import copy\n", + "plot_signals = copy.copy(shot.signals)\n", + "plot_signals.append(None)\n", + "sigs = [[s] for s in plot_signals[:-3]] + [plot_signals[-3:-1]] + [[plot_signals[-1] ]]\n", + "# sigs[-2][0]\n", + "sigs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Normalized Beta,\n", + " Radiated Power Core,\n", + " plasma current error,\n", + " Input Beam Torque,\n", + " Input Power (beam for d3d),\n", + " q95 safety factor,\n", + " plasma current target,\n", + " Radiated Power Edge,\n", + " Locked mode amplitude,\n", + " stored energy,\n", + " None,\n", + " internal inductance,\n", + " plasma current,\n", + " Plasma density,\n", + " plasma current direction,\n", + " Electron temperature profile]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "importances.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Radiated Power Core\n", + "Input Beam Torque\n", + "Input Power (beam for d3d)\n", + "q95 safety factor\n", + "plasma current\n", + "stored energy\n", + "Locked mode amplitude\n", + "plasma current error\n", + "internal inductance\n", + "Plasma density\n", + "Radiated Power Edge\n", + "plasma current target\n", + "Normalized Beta\n", + "plasma current direction\n", + "Electron density profile\n", + "Electron temperature profile\n", + "None\n", + "None\n" + ] + }, + { + "data": { + "image/png": "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\nFzAw1G+L67O4CXvY4Wjf4+5/F547Bj07QuOuimqfFppnlka8vPa4/Y5we65yddNcnweIWLj/zZ1p\nRajvPjf3asxAt8YLDWPwXnP344l4iFVhTJbCH9X+3INSoTBJIUch15WSUPsyhTSFFIVBCguixqsb\nk+ba57q6vu453G+B65emcLerC8aURfUbFFpzbYw1m1rGNONc7a+MG6f68ceq776rmpVVu+2YY1Sz\nssboJ5+olpZa3x49VG+6SfXAAdV33lE955z4c/ftqzp+vOrixar//reqquqOHaqnnhp/zDHHqH75\ny6qLFhlNqqqvvaaakZHYfjp1Uv3d72zcypWqxx3X8JgvflG1rMzG/PGPqiee2HzfgW7dVGfOVP3X\nv1QPHlT9859Vb7lF9QtfUO3Zs3bfiy5Sfewx1epqrReVlaoLF6p+6lO15zj7bNVvf1v1nntU771X\ndf581SuvtM/h2GNVr75a9dFHrX3IEBuTlaWam2vjgs9ywADr++Mfq37ta1bfpcsYFbH2M85QnT5d\n9Qc/UP3sZ1W7dq2775QU1X797PMA1cxM1W9+U3XuXNt79JjPf171vffsuzhzptEbtInYPF262Hn2\n6KHav7/q7berfvKJndeyZarnn2/lhhtUp01T7d69Ll0iqiecYLQ17rMco/37277q6/eDH9T/2R2t\nKCoqUveOyVZtAR6hJSY92gpx3MSTuWCR+Erdl28NFkGv1DFUq0PM0krXpzrEEClwe5x5s639EvcP\nPlwebtaXrJVYDE57KB2bwQHV4cNVP/3p+PsfNKjuy+Kzn63LENVXjj3WXuwnn5z4mO7dVW++WXXg\nwMbtJyVFdfToxo3p00d16tSW+w707JkYswWqF1yg+vTTWguvvWaM2803G62t/z1p+b+D005TPe+8\nxo05/3z7/raX/f/wh3rU4+GHH9YxY8bUKpdccom2JIMjqkqyw6lv8oFRqhoztUCyQURWY8kyj8U8\ntvoCzwELNRR0MBQJerJr74zlXLhIY6SncNGXi9asKeLccyMqirffhscfh82bTTQ7erSVtASsmFRN\npL97N7z+eiS4Wrdu8NOfptG373Fs3LijzriKCigrM/VLoObp2tVEx+nppgoJrxFGVZWJwV97rbY6\noU89Fk7V1SaGfu01mD9/LNdeayFMe/SwNU87ra6YXtXE1W+8YaqLw4etPlANnXZaRDUUHlNebuu8\n+WbkPLp3t/4mGo9PZ1WVRQzevdtUYaeeamNiqUQqKmyd1183lcEnn8AvflE3/9Spp8KNN1po/lWr\noKpqLFB/CNfTToObboIdO+Ddd63u0CFT1ezbF3vMpz4FP/iBqTbKyqyuutrUSe+8E3vMGWfAb39r\nZ1JZaWO3bLFzyMmxZKH331933Fe+Apdfbmu+8oqps957z9r+7//sTKIxYgRceSWcdx7ccstYLrhg\nHW+/HWnv189UkX372uddVga9etk6w4bBiy9a5Nv777cUArEQfH87dbLP/9VXa7fn5poKcfly22cs\nZGXZ397Bg3Z2sfIqHXecnW30Z5GZad+J4LuakmJqnNLS2t+Lrl2hc+exnHuufQ9KSiJjwNRxn/uc\nRcEeMMD+N2zYYN/JtDTb34sv1lbrZmaaarJ/f1Prhc8W7H9Cdrb9jYTTJwRl+/bYwRlTUiLqrV69\n4PrrLaXC9u12vm+/bd+vgwdt/SFDTM0bIDpA56FD9p0pLBxLz57rOPFEU3OdfLKV44+3Ph99ZJ/z\npZfWVpF2FIRUVEM1iPLanGgJruloK3gJTqwzWQt8iElmBrq6KsyDaQi1gw7uwNRXDwNfwWLHrIoz\nbzagRUVF2hro27evDho0qFXWagwefvjhtiahxfDcc6a+CH59nnSSqZAClJSoDhxo0rrOnU38/uST\ntVVM6ekR9U40Dh9W3bLFpA7dukXGDB4cUVlFo7pa9cUXVb//fVNFBGPOOkv17bfr309VleqNN0bG\n9Oql+uCD9Y8pL1edPDkypnNnU/+E1URH8h146y1T6XXtavuZPFm1sLDu/quqrD4RCUaXLqbu+cc/\nas9RUWEqrvvvt/Lgg6p//7vNfeCA6tq1qtdfb5/jiy/amMpK1Q0bVB9/3Marmirt+edVH3nExh88\nWPsM9u9X3bhR9U9/MtVbIvj4Y9WnnjIa3nyzdtvbb6t+5jOR/Z17rq1bH0pKrF9Y+vP447afv/xF\n9fe/j+ynOdCR/w8kgpZWUXkJDjX5mm7Fgua1Vrbudg0RWYdJcDoBD2Kxbb4J/BKLD/OCOjdxZ6y8\nHIubczwWjLAz0EddoMHQvNlA0SWXXEJqlBVmrFwlR4qUlBQyMzPZsaOuBMej5fDSS/Yrt6oKVqyw\nX/BhHD4MTz5pxrnp6Vb3r39ZAtL9++HnPzepT0N45x249177pXv77YlJ/P79bxuzd6+NCf/SjgdV\nWLLEsqN/73smKUhkzMqVJnmYMcOMkJsbQdLH+hJIgvX51a9sv2FD+MGDYcwY+Oxn4aKLTHLUkXDg\ngO07JcX9eKB9AAAgAElEQVQkiIHBfUNj7r3XpJE332wSG48jR7xkm0899RS0kAQn6Rkcp56ag3lD\nlQJLNRLfJWnhVFQTgE+r6ksiMgV4CJcXy2UxL1fVMhG5A7hTLclmoO5LwaQ8u6PmzQaKioqKannR\nNDcKCwtZunQpmzeb9/zs2bOZN29ei63n4XE04LXX4Gc/M/XQt74FQ4cmZ5JPj/aBllZRJT2Dk6wQ\nkVRVjZurXkTWYhKcUuAp4BIsu/hCVZ3lGKAX1DKy3wrcgjGJPTB393eBOzQqwGBrS3BaG2VlZaQH\nIol2OJ+Hh4dHW6AtJDhtbuvhS+sUzB08FVPFbSVkWxOn/1rX53T3PATTlf4iRt9rgI8xD6uBrt9+\nYFyMvi1ig1NcXKzz58/XUaNGaWZmpi5btqxZ568PpaWlOmPGDO3bt6/m5OS0yHylpaVaXFx8xHN7\neHh4tBe0tA1Oo3JRicgIEVkiItWhslhEjhr7bhEZLyIbQvTvFZE9IrLD1ee7CMAdBk7Ckq6qFaq6\nAMux1ZDorr+7Bj4S4sac6OYcEjqndzAGZ5OaSkqxgH6baAWUl5czdOhQcnNz2bBhA3369GH+/Pmt\nsTQA6enp5OXlUV5eXqettLSUSZMmkZaWRlpaGpMmTaKsrKzOL5mG5ktPT2fVqlUsX768RfbQ2qhv\n/8kCfwb+DJJ9/y2NRjE4qrpZVXOxF5cCS9QSOLa5a7WIpCfCmKhqoaoG+YYUC+Z3nKqeASzFIgPv\ncqkJjnqIyGwgTWurihJJHpoCfAA8JyKLMUPjKiLRr+diQfzAohTPANa4DOQCrNEoA+MwZs6cydix\nY2uVpv6xz5s3j759+9akfti6dStFRdGpp1oWsdRIpaWljB49mgsvvJBf//rXjBo1ijVr1jB69OgG\n9xprvvz8fIqLi2vsio5m+H/s/gzAn0Ey7X/lypV1/ufPnDmzRddsaqqGUkzlEdeGow2wETOKTRTl\nmMqmxsROVQtdaoQ1mFfQUe1R5exdbnDMW2NRjSWpPF8tieYQLBVEJYCqhlM2TAS+CLxFJFnlOBGZ\npXEMthcuXNhsRsYlJSWkRbnP9I4Xx74VMX/+fEpKSmoYr3HjxqGqFBYWcvrppzdpzvz8fNLT09m9\ne3e72KOHh4dHIohlYxkyMm4RNEqC014hIo9gSSWbA8HP4z4iMrCZ5mwrrMbSQDQFLmRZLRVVzXOU\nimoplpoh3d0HNjjNbzQWA6WliQikWh9z5sypYW4CXHCB5Wbt0cQEQampqUyaNIlp06YdMX0eHh4e\nHRnNxuCISKqITBeRrSIyzr0Atzo7l1VRfSc4e5cRInKD67dXRFYHCSJF5FZXVy0ig13diJD9zCpX\nNx4zgAVLgrk+6N+cEJE+zv5osaNhg4iMCNEV2PSsEpHerm6nq9sRtlNy+6wKM1DuvFa7s9gpIvn1\nnNl0dzZxmRcRGYkxffXpM/qKSIGbK9Z8B4D7RGQL8Liru8Rdwyqqm4GeIrISi2gMxghlu+/FDY72\nacDJAEOHDqVPnz5cfvnljB07lnPOOYcTTzyRtLQ05syZUw/JESxfvpzRo0dTWlpKaWkpl112GZdd\ndhlPPBHRmJaXl5Obm8uNN97I6NGjGT16dB0VT6A22rx5M8uWLSMtLY3c3Nx6166oqCA3N5dJkyYx\nefJkFixYUKfPwIED69Rt2bIlpn1QIvMFGDVqFIWFhezevbteGj08PDzaC44mFVUsZGAqoiGYPUYp\nZs8yA8uqvUXNpTgI7Z+O/dIvxaQME0Pjz1DVBSKSCdwQLKCqm0WkFEvmGNQVisgFmHfQbFV98Qj3\nEbygdzmD2UDVswmz13nR1d2AZfEuUIsLs8zRusrZnmwWkRmY6mxNlJ3Sqhjzz1PVy9zzcGCTiKSr\n6uSoMyvF0ibswtSE8TARQGOkS3AQN2cplih0BjDdrXkZFthPgb6qeoGj8SngAsdczgPKxYIkXura\nAjufjW7+bOx7MRTLcq44ydAtt9zCokWL2LdvHwMGDOC6667jrLPO4pe//CULFizg/PPPJysrq57t\nGZM0dOhQrrzySiorK2vFuSkuLmb79u3cdNNNLF26lDPPPBOAtWvXMmrUKL7xjW/wne98h82bN7No\n0SLefvttevfuzQcffMBJJ53EY489RnFxbAHUm2++yde//nXmz59fI5F54IEHAPjoo4/ijluxYgXl\n5eUMGzaMdevW1fRr7Hxdu3ZFVfmv//ovpk6dWu8ZtVdUVFTEPadkgT8DfwbJtP+srCzuvPPOWnXb\nt28P3MS7t8iiTXG9IpL9el5U/Q2Y7ca8UF26q1sfqgtSI1wfNX6Dqx/nnvPd8+BQn1Q336pQXZ1+\nCexhb3iMm3e6m/t9zPYk6FsUpj9UH2TWHhza56oY6+yIqltN7czjO6NpJ5IJfWDozOrMX8/+dgJ7\nGvj8rgrV9Q6tOdyd6cfAs8B3gMXAbuBfrs+fMLfwDcBBqEmyGU66ebNGXNSr3RxXh9p98cUXX3zx\n5ermcAuPLs0pwQF7mUNtCUuZWKjMWEHUy6Kel2K/9EfRega+mx19ezHD41uB5YEHkLMzGQIUxBi7\n1JXJTopTTGxD5wwRGRySpqSGpDdDMClHgRghikk/9rn7DIyxKHfPq0gMacCeBvqUBDeq+oGILMX2\nOQqzoekOfBaT5nwMnAK8ihmX/0JVnxCR9cB/Ame7cc9gaqhPgL+66YPvRTmwHoubsxu4E2N+vojl\nvcKNXQcUYlKiRPAHoBfGmAUI5rkf+FVU/6uA20NtVwG3YRLHJxtYK5j3l5hnWRhbge3A12OMOwkL\nlHgLdo4r3NpNnW8r8Cbw1Qbo9fDw8Giv6I7FTlvfEpM3N4NzpAhkdRmtuObwBtRa9bn6bI3qsxRY\nIiLjVHWtU2OtwiRDk4Ftru6R0BwZGOMyQVUrm7SD2OhDiNFMEEHcmgxMygRG201AV2qr0QIj4+Ox\nl/Y/MBVVOfbS3hdLPaaqe7CknIhIEOjlxRBDGdBcrQlGthSRT4Ae4f4hA+j3oucREcUYnFNUtVhE\nAjP+sobWFJG+2Jk8HWNegI/qmeNREfk1xrx+QVWvE5G0psznzu7YRM/Iw8PDo53i2ZaauL0xOMEv\n/dZ0i0k0E0sspqs86roaY3JmYBKoGZhUIRNjcuYCM1Q1J8a8mUA8e5mmoBxjcho7Buz8zyEiTfo6\npsKaEeo7F3gB2+d2YCFmGxToUrcSAyJyHHAZJsEJ6DtfRAIJTk937ePsfhJBN6BTVP+AwcmOMc/J\nIXqygdOCMQms+UXsTL4gIrtjtPdIYI5NwIWu36VNnK8TUNGIM/Lw8PBob6iR4Lgfv82K9sbgBGqs\nmC/HNkLwCznWiyR4Qb8AoKoVIrIGGO8Mg7eEVD+PiEUU3hI1Ryn2gptMDAZHRMaramET6N5LbLVg\nfQj2s4XajN8fVfWvUX1/56RU7wJVqjrX0RuIGnsSG5cBv42qeypGv9FEYuokiljR/eqbJ7qtMUlW\nv+dKNM6JQ0cshPs1Zb7ejVjLw8PDo73iGpxkvznR3hiciZhq4z73vAd70eYQeflfUM/4xr7QG4Sz\nISoGhkTZ0YDZnOzDggIGWIrZ4azGpDKBpxeY4W50VKNALTRbRDapao0Ps3Pbbmocm02EPNASxCjM\nu2tt4K7v8C0RuRbIc0zcEkwVl46ldNjjXOZvx5ij0YSkJFHYDTBkyBDeeOMN3n//fT73uc/RuXNn\nLrvsMi6++GKGDRvGyJEjyc/PjzNFbQReVGH3cIBrr72WV199lYceeqiWR9aKFStYsWIF69ato2fP\nnqxdu5Z58+ZRUFDA8OH1Zx2prKxk2LBhiAhPPvkkPXtG+LicnBwGDBjA73//+wbpTUtL4ze/+U2T\n5gvGfPOb3+Tmm29u8HzaI2bOnMnChQvbmow2hT8DfwbJtP/HH3+c9etrm9pUVlZSUlIC7r3Q3Ggq\ng5OJMR7RKpDj3LWmXkT6RNcFTZjK4wnXLwOYA1wf6hO8/AMD3MzQPCNFZJpaCoJdbr6JIrIPy7vU\nkJFyH0wFkwhTNBGTKi3HMVhuX9OBaRpKSaDmyl6OZdreHZpjGTAi2i7FMQwFmIHrRhHZhEmNRgIb\nQ/0Hkbg6DczO54YYTBlEVFHZuC+WO/8bcEbSjq5yTO30LeBvwG5nI7NRVbeFmKA04FHMaDaoy3Rx\nbx4h8r0Ai61D9+6/RjUP+/jvoUePwTz9NPzpT8Wowv/9X19uvz0x7ct7730IdKrT//jjH2Xnzhxy\nc3/B5z5ngrNDh8p57rlHycr6DfPmWUifV19dRXW18tvfZrB5c8NrnnlmAa++OofLL7+Oc89dSpcu\nabzzzipU4Y033mLChEfIyJjDU0+lc9xxIznzzAJ69Eh3a83h2GNv4Z13nqqhN5H5MjPn0rmzRS7e\ns2czqsKrr97C7befn9AZtTds356a8OfbUeHPwJ9BovufPBm++c2Wp6clkZ2dzW233VarLhTJ+ECL\nLNoYlyvM4yVwMQ7KPMxNegQRN+MdwDjsZRfuPy/k8hyM3YpZUK/H4sxErzkLk+TsAX7g6nZgsVvC\nrtZbXJ/FDexhPBF39IDWWUDvBsb1xgyGt2DuzouJ45YOTItuc2dUJ7t21D53hGgKu3Df4PZWQ2+C\nn9eWeH3d2a93fVa5/fQOtY93aynwRui8foR5laW7fo8RiZmzxNXtD32+I4i40+8BfmJ9b1FIcWW0\nQolCscIoV5emsFxB6ynFCjNC8+QqFEb1qVCYpJDj2nPdWkH7MrdWisIghQUNrBmU5a5/QH+Ze77b\n3atbK+gzSWFOqG1ME+YLymy3n0TobK8lev/JWPwZ+DNIbP9z52qHREtnExdVjcn4tCScLUo+MErb\nQaLOjgrngr5am5CLSkQWAldixrqFmGv4MOBe4EJMQnW3iNwJ/AfUGCQH+Kqq/iHGvNlAkQVETo1q\nneJKMmAs5h3eFKRh3uxHp/TGcCT77yjwZ+DPILH9z50Ld93V8tS0JFauXFknuWhFRUUQ6G+otoBH\naHuzwfFoRqhqiYgsFZEbVHV5wyNq4RTMBVwx6VJfzBDsOFwUY7fGnSJyDXAdplLsDLwVi7kJ43//\ndyHnn5+8oukpU6ApiYTvvHMO/frdzs03H83MTdP335Hgz8CfQaL779at5WlpabRFsk3P4HRwOCnL\nYhEZ3khpWXfM/Rrgx5gaqosrgYt44HU0CgsAuA1Ta00SkUJVHU8c/OhHM0lNrS3BifUH0FExdeoU\n+jTSiX/58uUcc4zwwx/+oGWIakU0Zf8dDf4M/Bkk0/7jSXBaEm2loirA7HAmaMPGwB7NAGfwu1pD\nBtEN9F+LRclNV9XXnLqrGFioqt+P6jsWiya8BLM1ugiT/PSJXi9QURUVFZGdnbwSnMairKyMsrKy\nBr28PDw8PI4WhCQ4HUNF5exvpmEvwAIRyVDVxsQf8WgC1LzNGoP+7rrPXYM0EidCjX1PuaqWYcYg\n1cAaVzZgmerTgIQYKo/6kZ6eTnp6esMdPTw8PDyANmBwVHUBsKC1121NiMgQVS1puGfzrUckh1cG\nUNAEm5topGDMyXMi8hRmFVxF5DsTVlMdwLKE/wlTawnwLhY/Z3+YLlxgupkzk1tF5eHh4ZFMSBoV\nVXuHi+8SJNfMAEpVNTdO30cwl+owNqrL2dTScPF49mIJPCtFZKu7b7TnVNS8z2CJNqNVVP+tqtdH\n9b0GuF9Vu4jIQCyJ6odAj2i6sIjNXkXl4eHhkeRoaRVVSnNPeLTDBbwrA1apaq6qjgbSRGSriPSO\n6puKxXnZGCobgLxWJHkuFv25EkAtz1XCZukikh5KTBnGe+4aVlHVPIeSbYLFxXnTBRXcjamyemAq\nrCbRlQgCu5SjEdG/ZJINyb5/8GcA/gySff8tDe9FVRcFwB5VfTJUdwP2Yp/rSoC5WCTjtjSUHkIk\nSSkAiRoSO2zERS+OgYPUVlFVE2GKwyqq87Dv0gsi8hHGDAWBAWvR5VJWNIuKatSoUaxZsybh/u0J\nK1euTGp1XLLvH/wZgD+DZNp/W6ioPIMTgpPIjMfSC9RALW1BMZYval6IgZgO7BSRdGds2xbIwCQm\njYZTr8WzXD0MdAUmqepLIjIFeAj4xLWHY+GMFpGdwBlOnRVEpyyPMS8ACxcuPCIV1cSJE49a6Y2H\nh4dHssHHwWlhhGxr+mJShlQsON0op4rKcV33xhheiklLcoAnnDdYKpZjChEpxZJRJpT5O0RLEAF4\nJJbq4O5Qn9mYWqcMyxu10RlpIyI3YDmyMgANZfEuCOLdOLuZua5PH2CNqs5xbePdfsC82cBUa5kY\ngyeYxOZOEdng1hdgjojswUUzBu52c6ljbgLmsDOQEYsugC996UukpqZSXl7O8ccfz6BBg2r9AVRU\nVJCXl4eIsGvXLpugoIAhQ4ZQWFgYJGgjLy+vpm3w4MEAlJeXM2fOnFpj8/LyGDFiRM35r1mzhmXL\nlpGXl8euXbuYM2cOkyZNYsmSpuY29fDw8PCIh7aQ4DR77of2WrCX/F5q53gagr3Ed7jn8e65Tj4r\nIjm1prnngZi7+zwiOaSqcfm2EqBndbgvFi14Vui5AKgKPY9w84+LmmcnplKLnj8bWB96Hu7GrwrV\n5Tu6z48aOwtjvA5G1Vdh9j7Ra+Vjea1GAMNd3UHgwxh97we0qKhIVVU3bdqkIqKFhYUaYNeuXZqZ\nmam7d++uqevbt6+mpKRoRUWFqqrm5eVpSkqKbtu2TcMoKirSvn371qpftmyZiojOmTNHVVXXrFmj\nmZmZmpKSojNmzNBJkyZpTk6ODho0SFsLY8aMabW12iOSff+q/gxU/Rkk+/5bOhdVMklwlgJbVPV/\nggq1VAbhPqXumkNdBOqWPm7sbiCILTPXBdJbiqmxNmrDUYNHYlnQA1ruFpFZofYhRAx8wRJWgrlc\nJ2Lzs5qQbY2qPuGkTBNEZKDWznQenaV8OebK31lErsWSpQzC1FPFUCcOzkXAZ9yeCkWkCPvSxvp+\nnQ2wfft2ADp3ti4PP/wwAwcOBODaa69lzJgx7Nmzhz179gAwdepUfvWrX7Ft2zZ69uzJu+++C8DL\nL79MVVXE1Oeaa64hKyuLqqoqiovNKH/o0KGcddZZzJ8/n/POO4+srCyuuOIKFi1aRGlpKfn5+TXj\ngzEtjYqKilZbqz0i2fcP/gzAn0Gy7z94D2CR85sfLcE1tbeC2ZlU46QvUW17cRKc0HMVUdnFiZLg\nxFknkLKsSoCmDa7vrXHae1M7u3cw9+KofnUkOEQkU+vdOsF1CyZtCqQsgQSnTlZ04O8Yk6LAHCzb\n+MfAza59NSbpSQdecv2qQmOU2BKc66P6+OKLL774ktzl6pZ49yeLBCcbO8RYtjXRyMOYmc0iMklV\ny5y9yyTXXhpvoKpudsbIGQmsMwNjOgpEZAYwUUPBAdUZMjv7lpGYrRBYdOCGEBgeT1Dnpt0ELMYy\nhwP8DpMmTQP+6uib5OgbDvwIyFfVM9xZTcfO/FCMeX+PMUoDMUbsb8B8zJtrLsbI5WNpdt+ph77v\nAFOxBKD/dHXD3Vz3A7+K6p8F/BZ4HrgZuAq4DZiNpeb28PDw8GhddMfeBesb6NckJEscnIDhaJA5\nUIsAPMM9bhWRLcAeHHOkDaueSkmAkVJT7QzFDHrTgSLHHAAWj8cFx+urqjdqgsbLDsF+MxsxJpq+\nxcBH7vFMTFrzqqpuc/QNcd5jT2Bqq+OdOusmLPHmJ0S5iTucDvwM6IXZL0Wf5ynuOqCptIfmCKMy\n6urh4eHh0ZHR1uqj1ijUbzxcS0UVZ3yg8vldAmttiLVOjH7pofvAADhsVLyLkJGwq6uj/iK2iirY\nb0yDZ2C8u9anokoFCjFJ0PPA68CnQu2rcUbRjoaLMcnXLqAC2B1Nl+v7Hm0vDvXFF1988aX9FK+i\nOgIEVlzTRSRPI+qfPpjR8J4Gxs/HPoR6IxS7+YZSN3VDLOQBuQBqBsAzgCUu1YFgUp2dUXMnikCd\nNVtENqnq5tA8SzBGJIw6ki1VrQDGu5g25wB/VtV/hNoDFVXgIv6MiHzOzf0E0CV6Thf5+HiAhx56\niLPPPpvKykqGDRvGyJEjyc/Pr3kWEfLz82u5dufl5XHHHXfQs2dPFi1axIMPPsg999zDhRdeWNPn\n2muv5dVXX+Whhx4iKyurpn7FihWsWLGCdevW0bNnT9auXcu8efMoKChokwzdM2fOZOHCha2+bltC\nFQ4etJKXN5Pbb19IdbXVq0J1daRfUA/U6hMNkdqlofpwe0P3sZ4THROrPXwVgf/4j5n8+McL47YH\n6NQJunSBrl3tOXw+0ecXXDt3hh49ICVBGX34vGPtL945HCmS8e8gjGTf//bt27n22mvBfhA3O5KC\nwVGzo3kE8yoqFpEgz1SDEYZcLJrhwHRVfc3VDcGSRq7BpCQlLq7NMswIORE1yCQRKdBIgEDBcl7t\ndnMBjHTxdsodrQpkO4+t1Y5RS3P14f1WuD3OBjaKyCaMyRuJxdLZ5rrucutOFJF9mFSpxkMrlIqh\nJ5AqIqmO8QnjAqDUeYANcbR2cnR9FNW3RnV3xx130KtXLyoqKlBVnn32WZYsWcLdd9/N0qVLyc3N\nJS8vj+zsbDIyMti0aRMLFizgkksuAeDiiy/mgQce4MUXX+Qzn/kMZWVljBs3jkcffZScnBx+8Ytf\nsGXLFsDi4jz66KP85je/qRm/atUqVJWMjIw2yYmVmprarnJxHTwIn3xSt37/figrs7Jvnz3v3w8f\nfmjXWGMCqMKePTb29dfho1rfhlTGjm0/+28bpPKlL7XcGaSkQK9eUFVln9Phw7UZpaoqqzt8ODbz\nGA/RzGNKSt26RNvKy1P58peza+YNrxF9nwhT2tZ9O3WCY46pXXr0gGOPjV0+/DCVt9/Ornnu2tXO\npVOnyLVTJ+jbF9ISsb5sx2ggDs6BFlm0LVRGbVUww9k9mCfRXa4urooKYxCqgOtjqG9WEYl/swqz\nJ+ndCFoCb63FmNRjFTAw1D4tRGugCsp3dfOAwUQ8u4J5omPkzArRuINQDKBQn8DGKJb6bifGPFVh\nzMtOVz8Ep2LDVFX/C3wQaisPjatFF/ATQE899VRdsGCBqlpMm7S0tJo4NaqqhYWFmpOToykpKZqT\nk6NPPPGERiMnJ0fT0tI0Nze3Vn1FRUVNbJvc3FzNzc3VkpKSmvZly5ZpWlqapqSk6KBBg2roaE20\nRfyLAwdU//xn1VtuUb3iCtXBg1X791ft3j2QAbRmGdMGa7a34s/An0Fi+8/La/V/F62Clo6Dk/TZ\nxEVkL2YrckaobjxmaKyEJDfJBBH5OvBLLOrzm5ht0ThM/ZYLvKAWu2cl8DU3TInE1HlOVT8XY95s\noOiSSy454lxURzPGjh3LunXrmnXOqip45RUoLoZ//9vqDh2C3bvhn/+EF14wqUtr45hjYOBASE2F\n7t2tbNs2lksvXUfnznV/6ce7D5d4rwKIXx8g/BzvPtF+scZE0xHuF6579tmxXHTRurjtwf3hwyaB\n+eST2meSkhIp4WcRk8hVVEBlpUkAunUztVUwF9hzp06Ra6DOirW/hs43rCpLtK26Gt57byz9+6+L\nu2YidUfa3pxjDh+Gjz+mERiLhRmrH3Pnwl13NWbe9od4EpynnnoKWiibeFKoqBoD58m0C3OxbkzS\nyo6Gc4kEX5oNvAJ8HeO0J4X6rcECI/4J+B6wELgRuLW+yY80F1UyQtVUQ//+d6S8+y78/e9QVAQl\nJdFqoPrRuTOcdJKJv3v3NsYj2taiWzdjTtLT4YQToGfPSDn2WGuvzz6jVy/o379un7Fj4Xe/S5zW\njoixY+F//qfhfh0ZY8dCM/P5bQ5VYyI//jhSPvwwUgIV74cfwqJF8LWvReoPHTLGr6qq9tVloTmq\n4XNRtQOouYknNZztzRcwTywwacxuEUnBbIBqohiraqGIBHFrXgFuAd5S1WfahPijBFOmTEEVystr\nMyxBef/92PUHjkBTfcIJcPnlcOWVcNFFxngkaoTa3EgWSV198GfQMc9AJCKp7Nu3/r69ek2hAx5B\nu4FXUYlUA7vCKqpkhoiMwILuBb+5FXgQyy4+FQh+c76gLjGoiFyNBdF7EegBnAGUqGodEU1HVlGp\nmkTl5Zfh1VfNwLaiInYpLzcm5vDh5ls/PR2GDrWSkRFR5wwYAGecAccd13xreXh4eDQGbaGiSloG\nJ2RnE/ghz1fVuW1IUruA8+DahBkxd8KMiV9zUpti4L9V9fqoMXcAd6pqJ+f1lY8Fkfy0hlzLXd9s\noKioqOioUVFVV5vk5OOPjWnZtctKaaldX3/dmJU9exqrf08MnTpBv35w/PF1S79+kJUF2dlHv5eF\nh4dHciGkovI2OM0JtcjAjYkOnBRQcwO/QETWAl8lkvAzkOjsgzrJNgHUSX+CL2k1loSzFoPT2gjs\nVvbvN4PLDz6IMCNvvWVMymuvWX2gLw+YmaAcPNi8NPXqZQa38RiW6Lo+fdpOleTh4eFxtCJpGZwj\ngbNRmQBkqmpuW9PTgjgIPCciTwGXYExL8KqdC7wA3A086/r+CeiGMUPvUk/KipkzZzZZRVVVBTt2\nwD/+YdedO80+pbIyUgKGZv/+up4uzY3OnU39068fnHIKnHsunH02nHiiMSepqZHSq5dJZDw8PDyS\nCQ3EwWkRJK2KqqlwUooZGINTpKoXtDFJLQIRWY3t8dOq+pKITAEewqnywhIcx/C9DHwWi4FThjE8\nx0d7oh2JiqqsDL79bfjLXxrnLZQogiBd3bvXDdYVlN69zb4lMzNyPfnkxjMtK1euPKrtjY4Uyb5/\n8GcA/gySff9eRdXOoJb2YLMzTu7I6IwlzFwdkuBAJAVDWILzbcwAeQ0WLwdgd31u9o2V4Hz0EYwZ\nAy+9VD/RQfTWoHTpUsaxx8IJJ6TTs6fV9etnpX9/M8wdONDsV7rUSS7Rckj2f2zJvn/wZwD+DJJp\n/7RdbwwAACAASURBVG0hwfEMjkd96AZ8OcrIOAUgKhbOecB3gbeA0a5ukIjMCjytotHYODjf/W6E\nuenXDy65xGJDZGWZh9AppxjzEh3LZdCgUaxYsaZDxJHw8PDwOFrh4+B4tCf0d9ewkbECJ0IdI+Ol\nmLfVGa5NsYzicUWOGzeaB1IieOUVuO8+u+/RA556ymxcGsLEiRMpKytruKOHh4eHR4eDZ3BCEJEJ\nwHSgAMjAbG0yMLfpG7RuoslYc8zGEmOWAdlYcssFofZUN3+Q1mAksMSlPUgFJgETsRxPmzHmYSTG\nLAxX1Q+cK/YMLKHlMlWd0xgaGqA/oC8TyyX1koj8BssCXo1lGK92Z7JBREowNdVAEVkFbHX9DgKL\nReQmN1c+lm9rOcCcOSOAs7B8nNuBk7EUW1OAEndfipn0THDD4ec/r+Dpp1fx9a8v47bbbiM9PZ0b\nbriB4uJiJk6cyKpVqwAoLCykpKQEsCzkAAUFBQz2ohwPDw+PVodXUbUhXFycfCAdYz5KsWSWE7E3\n7BAsgF19cxRgiTE7uecRWDbvXRrJ0r0cCyw41/WZFZoiA2NMRjoaMrE0CRmYfcsaEdmFBeIbCcwH\nbhWR36nLEJ4gDfHoz8BsaEYAnwaOdeV2LCfVDe5czgRmh9Z8GRgInIBlWZ+EBf47wZ1fXyz9xUjg\ndVutAjgF+ACLIbgfyHLDfgXc46h6AbgJKOaKK/Lp3fsVFi36b0pKSliwYAGnnHIK06ZNY+3atTzy\nyCOcdNJJTJ06lfT0dD7/+c9TVlbGt771Lc4880yqq6spLm52O7YmoaKiot3Q0hZI9v2DPwPwZ5BM\n+8/KyuLOO++sVbd9+/Yg0F/3WGOOGC2RwfNoLVj+pFjZwze4+nBW7GpgS4x+74eeU12/xaG6vcC8\nqHGzQvcjose4+p2OhtNj9J3XGBrq2f9W4AfuPh/4EHgY40C+gIlbHnN0TCaSUXwNxpBVY5KnVCxD\nuQKrota42tX74osvvvjiiwJXt8Q73UtwYqMs6jlQE40C6pOCTIh6zonRZyuQJyJ71amNtLYhbhA7\npjxqXDEmXdoXqit11z6NpKEOnKt3NjDNVb2EeVFNwTymrsbUTu+69uuBU0WkENMvBZjoChjDsypq\nqfXAr4HrMOnUk6G2QITzPBGbHwF6A72A/wS2AMMx6dXPgN+Hxm/F9F1fd8/fwby7rgH+mcg5eHh4\neHi0Grpj0v/1LTG5Z3ASQyBDzKivkzq3aKfuGonZqYDZygSYgUlZCkRkBjBRVUuaSFfADNXMnyAN\nsZCNMRTlbp4HReRHmDTmd258BvAv1/8+TH+UDlzuxv0P8DiWVRzMyKYWVHWPiLyAMThlGop94Jgs\nBS5T1cp4hLp+AK9HjQf4KKgTkfdc0yvq1GkeHh4eHu0Kz7bUxJ7BSQwBI1FaXydnw7IaMxq+0dXV\n6qMWGG8oZoszASgSkRnaTFnME6EhDjJC193ufhQmzfoG5j01AwgiN18PnKpmHH2eq/sccAEmZVqJ\nSVyi6TsOuNA9prvAfwG+4K5fEZH6JC4Bg3Na1HiAHqG6wBPsLJcJ3cPDw8Oj/aBGgqOqe5p7cs/g\nJIZA+rG1gX4bgZ2q+ut4HUQkXc21erKIDMckLEtw3kXNgAZpiINiTB00EXjCeVMFqqbNwH5V3R1i\nlmaHpCK/xyQvTwGnYoxFvC/rZUTUYDFj5GDMUSK4w5UwzsEMnZsyn4eHh4dH6+MazN6zWeEZnMQw\nEdinqvfF6+DUJumYMXBQ1ydG1zycFERVn3BqqiUiMlBVdx8JkY2gIRYC5m26iGxS1UIRWYPZuiwG\nXhCR72OMi2C2PducKqyrG/tFzF5pNhFpTDR2BzfnnHMO/fr1q2m49NJL+dnPfoaIcM8993DhhRfW\ntN11112MHz+erKwsNm/eTF5eHrfffjtXXXVVTZ+cnBzOPvtsHnzwQQAWLVrEgw8+WGeu9oCZM2ey\ncOHCtiaj2aFqucIOHbLr4cN1r4cPQ37+TGbObJn9JyawbHzf5sbdd89k1qyO9x1oDI70DMxvoX6E\nP+Pozzt4Fqldwu3R9cF9p07QtatFQA+ujU2K21H/D8TC448/zvr1tU1tKisrg3Aeu1tiTc/g1IVg\nqpgnoEblMwdTyeDqAqYhzDwEaqyRLk5NOebyrUC2iEwDHgEmiUiBRrJwC1AaYm6Oi0NXX3fNAALJ\nSWZUn0RoWK0xUiioakXAbAGPiEgxZvQLlkRzNSYZCaQ6BWLinOuIGAN3x9zA/4VlIo/1+jgApjb7\n6U9/yrhx42o1Hjp0iPnz53PTTTcxcuRIsrOz2bRpE6NGjaqJgrl1q/FiqampNdGQy8vNJvvgwYM1\ndRdffDEPPPAAL774Ip/5zGcoKyurs15LI3jhBy/2w4ft5d+tWyrHH59dpz78HK+uOfrGqg+e67s2\n1KeqKtGTSeXaaxuXi6zjIZWrr/Zn0JHOoEsX6NYtUrp2jZTwc3D/z3+mcvfd2TX1nToZ85SSEmGk\nUlJg5Ei44oq23t2RITs7m9tuu61WXSiS8YGWWNMzOHWhQKmIbCWiZhmvqk9CTQTfIFBfhojMA5Y6\n9U0QJHC6q8sVkXIsfkyGYyIAdorIMowB6IvZugQxa/Ld3NNd7JpfO2ZluKOlQETy3Nig70gRmeb6\nznD1sWjIjMXc1GxcdbmI7MG8prKBQ67pUVUtEZE0R+9/Ad9y67yBxbgZgDFCm4C7sPg56ujNCHmK\nXWVrCd/4Rh4/+UkpWVmz3PoA8zj33OMoLV3Kxo2befbZMj71qfm8+upVXHUV/Pvfm9m2bT6qwp13\nLmXVqgz69RvByy/PQVXYubOUzMy5nHXWPFRvoHfvZdx332oefRTOOWcxS5dSs1bw6y/6PlZdVVWk\nhKUR0S/9WPfxcNpp8ds8PDyOPgR/9/v3Jz5mZQIK9GOOOfoZnLaAzyYegmMk8oFRqvpEW9PTlhCR\nhcCVmMqrEIvMNwy4FzMSfsEZGK8EvkZEihPgh6oay8g4Gyiy3J2pUa1TXEkGjAXWtTURDSIlBTp3\ntl+mDV0T6RNcN28ey1e+si5hkX6i/6Ya8++srf/1/fnPY7n88vb/HWhJNPYMVOOrmeL1j3UfPMcr\nDbWr2o+XTz6JXw4ejFyDUvcHT2L/B+bOhbvuarBbu0a8SMYu0J/PJu7RqjgFS8+gwCxMcnMNcJzW\nTrS5BrPHmQw8h32nDgGP1j/9QkxIdHQhJcXEyJ06xX6xx3oOv9yDsnUrfP7zdetj9a2vvrn7RtPb\nWJuCRDF2LNx7b8vMfbRg7FhYvLitqWhbJNsZBPZpAfNzzTWwdGnkuaoqwkBVV0fuTzqprSk/cvhk\nmx7tCZ2BTphU5kvAYKAL0CWcaNMZI+djAfsKsUB9f8S8m8bHm/zCC2fSq5dJcIJfYGPHTuGrX51S\nUxc26muruuA+YGqayyh15copTEkWYVUMRP+jS0b4M0i+Mwj+j3R3iQm+9a0ppKfXP6ajoC1yUXkV\nVQguj9OtwARtIG9TR4eIrAOuwCQ4eVh04acx0csAnIrK9Z2Gubn/BQvu19+N6xNt8xOoqIqKimqM\ngT08PDw8kg8hCU6LqKh88DMHZ38zjYhh7KwGhrRrhKL9NhWBN1dfx8h8hJ3NiU5FtTm0xklYWoaf\nYmqsakzy01D0ZA8PDw8PjxaBV1E5uLxQC9qajiOBYzjysGzeu7Cowk1FCpbq+zkReQqzCq4i8p2Z\ni6VquBtz8XsP86LqhjE372KpImIGHJw5cyapqbWNjGPpaD08PDw8jn54FZXHEcMxObuAIlVtMoMj\nIs8An8Uyhr/m7G6Kgf9W1euj+l4D3K+qXURkIJbe4UNgarSqz6uoPDw8PDzAq6jaPUQkvRnUQc2G\nUADBI0WQqDLIXi7hZxEZEtr3EOBNERnsAhYqFvQvSPTpEYXoXzLJhmTfP/gzAH8Gyb7/loZXUR05\nNmJJMzsiDlJbRVVNhCkOq6jOw75LL4jIRxgz9BEWbDBmvqlkV1GtXLkyafYaC8m+f/BnAP4Mkmn/\nbaGi8gzOEeD/s/fm8VWV1/7/+zlJGEMCQUUGNZNQ6lAIUdR68TIktteCioCiVjowaWtbWiChrb22\n31sZwu/FLVYF4u2tUuUCAVuu9Qok2DorJNFWBRUSQCZRMhCmADnr98d6ds4+J+ckARKSkP15vdZr\n7/3s9Yxnn7PXWWs9axljVhPIbH2h4TSaY2qCiHxojJkI/AmotvfnoqkgEJFMY8x24EprzhLgS1f0\n4jpYtGiRZ6Ly4MGDh3YCLw5OK4PNqO2kZTCo0+wSG8H3LtQ0A7rrCiDLybBt81U5qRScnFHzRaTA\n1f44VMsx3/LMQ3NFTbf3B6OakmQ071WeiGRHGGOC7auhjOehc4zURzTqPPykMeYKYJut8l2bKmIP\nsBhw1kKABLu9HOAKY8zzInJvyHx/BnDPPfewc+dO+vTpw7XXXgvA7bffzubNmwEoKSkhLS2NOXPm\n1Gp61qxZw/jxmgorIyOD+fPnM2jQIAByc3OZNm0aCxYsYObMNr0BzoMHDx4uOLSEBgcR8SgCoQkm\n57quZwIzXdfz0J1FXwupl4Ymvvyaq2wKauKZa6/vQrN+16AJLlcCm4FPXG2sd9UfYeuvdJUl236G\nu8pmWb7NjZhfxD6AtcBxYIMd43p7b7W973fWwq7Dm3b8I2zZXvd4Q+YrGRkZkp6eLqmpqeIgJSVF\ncnJyRESkoqJCevToIcYYSU1NlQkTJoiIyIIFC8Tn80l2dra4UVFREdRWa8fo0aNbeggtivY+fxFv\nDUS8NWjv8y8sLBRsMmhphne4p8GpH6PQHUkAiGpuwqkHQuPb5qICxvuuurk2EeZsY8xK0QjAyaj2\npYeI3B3Sxipcvj0isskYUwKMM8Ykijrzzrf9vOLiy7EBCxuDiH0A/4eaqXbb+e0FqlAhZRmaVXwM\n6mNzgyUBphtjCtGM4nGu8brny6RJkxg4cCCgasr8/HxKS0vp27cvRUXqTP/AAw/w+OOP85//+Z/0\n7t2boqIirr/+ekSE5557rlabA7B27Vpuu+222rqtHZWVlW1mrM2B9j5/8NYAvDVo7/PfunWrc9qp\nWTpoDqnpQiFUe+EHZkW472hwBrnKknBpakL4Q7U4U2z9sSF8gy3fejsG57gZ+BTVtDj9zAzTT4Ma\nnEb0kYcKd2L5/gbsBCbb+oJmEk9y8YXSLme8IfMPx+uRRx555FH7pHub4x3uaXDqxzT0pT/fal/G\ni0hxA3Xq85zd0ggeUNOToCkjqsIxGGNGWp6SBto6qz6sX83XCEQl/hOwgMAcBA3ml4Sas2aiGpt7\nUL+iFOB2sT5JLgjwO9TUdcJVfifwC3tvuS27HngCeAgVvBz0QVPwvg38EIhFhc0fnsH8PXjw4MFD\ny6ITkIj+wW5yeHFw6oFoTJkh6Ms4CSg0xkxpZPXkMGUVIceG6qY0wGMi9NMY1NuHiKyxp4757XJU\nK+QWWDqIyCY0ezjAw6gw8nEY3obwAmoG+y7Q1ZaNAt4hWLgB2GfLh6JpIjLwYu548ODBgwcXPA1O\nPTDGJFkh525jzAj0JboE9bGJBMegGk5L090e322g6xJUsLgbqCMkWO2Ko7k522jFDfXxbVSwm2OL\nhgHfcbMQyDX1Xaw2CNXijEa1P7XjDRGYfmIpEl4NuS6sh/dF1/kj9fB58ODBg4fWifuA55u6UU/A\nqR9ZwHTAccCdBixxOfk6qE0qKSKlxpgiYLCN7OsWHjLQSMD1CUgQ0EbMNsbkS/DW8iWokFVqi8YZ\nY+IkJGs3AWHqrPsQkeXGmDmo8PKnkDkLcMAKW8ds2SB0veahGqKdrvG665lly/5E//4DMQaM1RH9\n+79nkZ39CF27xtaWOffdfE75qFHDARg6dCjz5s1rYLqtCzNmzGDRokUtPYwWQ3ufP3hrAN4atPf5\nb926lfvvvx/Uv7PJ4Qk49WOCMWa+BNIfGKDE9aLfYcvGG2PK0bxNa9EdRltQQeY6qI2LMxV10nWE\nkVTq7sBCRCrtTqjZwEZjTD6qGRoFbJRArJ0sVJgossJXGaqRAUg2xsxFHZpDhZ9G9RGSguL7xpjV\ntp4jPHW389uOPqDDUWGmBphnjPG5x+ue79SpywB3JONdwD955RVDsGyWbKc0mLr4JZDNxo0PsnGj\nKszcglA44cjnU4qKChyjokBESdcmmEB5YmKgQwc9xsTovZoa8Pv1WFMTvt9wtH9/PBMnptUpd8YT\nFQXR0YFxtgV06gRduwZTairccw/07BnMGx8f3+4DPXpr4K1BY+bv/MbExJynQTUTGoiDc6JOhSaA\nJ+A0jO3GmGXoi7kHqoUBQHTr91Q0ezci8qA9llrhINcYs5mAY+44l3AyBZiMajTmG2OSxRX5V0Tm\nGGMOoY7OI1EfoNki8oKLJ8cKVlmoM3S+5b8LFTTWhBNuzqCP1x1WoC+wzRjzFVRwE1T6uB3NW5WG\nCkvTUEFmiJ3vC2Hma1Rg+U/XaCpRubAcVU6VEXBVykFlycSQGUwFslH/ZGdOAaGkteOTT1p6BOcH\nP/sZTJgAAweqsBYTA7t2wfPPqxAUG6vHTp2gY0e45JK6ApEHD20BIrBvH2zdCtu26XHv3oDwf+QI\n7N6tZdHR8OWXcOONgT9g1dVw9KjSsWN6rK6G3/wGHmnjBngvknErg4gkNIInrA+MFSxCY9u47+fS\ngKnKCjwR0x1YnqeBp0OKr6yvTmP6sD44ne3lC6gEMhYVXASN2rzQGLMC3TkFusvK0Ui9EyKM5aIC\nXxpQ2KNHMdHRY2qFkdOnK4iO7sG1124I0qQcP76TgwfzgDz69ZsZpFmpqNjC55+P48or62pcwmlh\nRPSfkEOO1qWmpq6mJ/T69Gk4dSqYHI2LWyMUmG/9VFWlP3ih5e4xORqhto7qali+vG75ffdFrpOS\nAjfdBGPGKHXo0Hzj8+DhbPHFF/DMM/DPf6pAs20bHI74lzI83n67YZ6jR89ufK0JXi4qD60JV6Fb\n+ATdAt4D+DYacXKCiy8PSEedfX8CLAIeRCMqR0R+fiAXVUVFBQkJCVRWVtKtWyhnIpWVU1i9ejWT\nJwffmT59NRMmTGPEiLObYEtizBhYt65+HkcgawsaKb8fTpwI/Ps8ehQqK+HPf4Y//hHKyxtsIgg7\ndigtX64anUmT4JvfhBtugM6dG67vwUNzY/t2GD4c9uw587qXXKLfmbIyPTqIigo28Xbposd+/Zpu\n3C0FT4PjoTXhX1BfGgBEpNj61KTZ/FUVIlIqGqF4HhrVeBvwY2CviLzR2I4KCgowxrBjx47a3FJu\nLFu2jGnTpgFQWlpKUlISJSUlFBYWsmTJkjr8bQGNySDsaIjaCjp0gLi44LJhw+C3v4XXX4fjx/XH\nvLoaNm2ayFVXqcr+6FE9VlerkPTpp1BYqNcABw9CTo5Shw6QnAwJCdC9u5q7fD41aX3969pfUlKw\nQ3prRXvJIl0f2uoa7NhRV7gxBq64Qk2xAwfCV76ix6Qk1fgeOaLCeb9+aooFWLFiIvdY/bdI2/G3\naysw0hb+Hno47zDGvAtcjWpxlqNpGx5AzVUA7zo+Q8aYe4HngPeBLqiJrFhE6njPOSaqYcOG1SbR\nPHbsGAUFBXTt2pUf/vCHZGSom1NJSQn5+fnMmTOHQYMGUVBQUHvPGEN+fj7Dhw9vriXw0IKoroZX\nX4XcXHjhBTURNhZdukBiYjD16wcXXwwXXaRCkTHQowf07t084/dwYaG6GjZuhNdeU83Na6+peQrg\n6qtVSzlwoD57HsIjkonq1VdfBRgiIk2es8ITcDyEhTHmDeBGdGfYLqu1KQL+ICLfD+F9BHhURKKM\nMbPQnV0+4BoR+SCENw0oLCwsDNo9sHPnTrKyssjP193r6enpZGRkBGUGr6ysZNSoUZSWljJ//ny+\n//2gYXi4QHHwIGzYAH/7m75Y9u9XH6amwJVXwqhRkJamglBSElx2mefz4wFOnoT8fFi1Sk2t4dxF\nrroKNm1Sk5OHM4fLRNUsAo5nomoGuAIEtmo0MM7P7dHxnjDua7eZypaLTR/hPKR+NAFnkIATCYmJ\niaxcubJenvj4eDZvDg1q3HrhmNM8nBsuuQTuv1/JwalTUFERcMbesUM1Pm++CSUlsHNnwMRVHz79\nVMkNnw/69g0IPImJahKLjVUN0Fe/qmaytmQ+9NB4FBfDk09CXp4+Y+EQHQ0ZGaq58YSb1ot2JeDY\nl/LdqHllbRO3nYRu156A7mk+2wjDzYozHOdJ4C1jzKtoJGM/gfQec9CIzAuBNy3vi0BHVBg6gO71\nDosZM2bUmqgchHNCO1OUlpaSl5fHjh07gvxzSktLGTJkCAsWLGByqLdyE8LRLq1atYqUlJQ2JZC1\nJcTEqMnJQd++6n/jwO9Xzc/OnUr796tJ4csvA3FFtm/XHSyh5i+/Hz77TOm118L336mTCjpXX610\n1VV6vOyytuH/095x+rRu4f7nP+GDD1Q7c+oUfPQRvBHGe7BbN7jjDhg7Fq69Fi6/XIUcD41HS+yi\nOm8mKhvxdg6BFAY7gDwRmRO5VpP2PwV9sSdhtzg3Qx9OZu3CSNvHWwMaM05jzCo09cI1IvKhMWYi\nNuGmjZ9Tq8Gx7X2EmrQq0EA2J4GLQ+PwRDJRNQUKCgpYunQpeXl5DBkyJEi4KC4uJj09nWnTpvHk\nk082ab+hKC0tJSUlpc4YPLQ+HDkCb72lwk5pqQpDpaVKhw6deXtxcQFhJzlZBZ5LL9UXanW1aoAG\nDfJ8NVoCIvDOOxp/aeVKFYDrQ2ws3H67xnDKzFSh1kPT4oIxUdlcRGuMMX506/FUEXnlPPafa4wp\nQ/MrNVcfpaYN/H1r5DijgWpglUuDA+DE03RrcH6AOiDnoQEHAXbWF2SwOTQ4I0eOZOTIkfjCbEUY\nPHgw5eXlxIVu80EFEqDJzEmNaWfFihVtdgdJU6C1zD82Vk0NGRl171VVqcCze7fGNqmq0gBtH36o\n//o//TR4iy8o31tvKUVCVJQKQF27riAzcyKJiboLrHt33UVWXq7C1d69uksnNhZGjNBdO91DErBU\nV8NLL8Gzz6o2YsgQ+Pa3NYL0m2/C++9r2/37K115JbWhGPx+FfBiYwO7d2pq9MXfrZuWh0JEx9ih\nQ9OY6Op7Dpy+jh7VoxOXqrxctWtffAF9+uhcnW3UJ07A+vXqN/Phh6plu+UWDb73/PMquDaEgQPh\n4Yd1HcOtQVOitXwPzgcuaA1ObYcBASclJLfR+eh7JLARjdbb5Boc24efVq7BgYbHaYxZC9xBXSfj\nRSLy0xDeDcC/otnAa9AM5X7CaMqaU4PjwOfznZH2JDU1lby8vLBb1JtrDGPGjGFdQ4FwLmBcCPM/\ncUIDu33wQTDt2tXYFsYAjV8Dn09f5JddptqEzz5T4evEGQa5791bzSv796tmKSoKevVS4eHAgUCA\nyT591BRz7JiacA4fVnLud+qkAle/fkqOWbC8PBC/yR1kM/QoAgcPjuHii9cF3Tt5MhDJN1SAbCp0\n7Ajf+IbGVbrmGl2TmBjVrCUnnz8z44XwPTgXXDAaHA9tDr3s0e1kLMClUMfJeCkqCF1p7wka+bjJ\nH9imxvjx42s1OB48nAk6dVJzU6hcfPiw+nfs3h3QNHTooFRaCu++q9qFM315+/3a5u7d4e/7fI1r\nc//+4OuaGtVwhGLfvvDlDk6cUIHowAHYsiUyX0OINJ9zhTHBQTJ9Pt0xN3Ei3HknhCiQPVyAaBMC\njk3uOA+r+bHF890ZsC1fPDA/hC9LRIojtBuPpheYgpquVjrOx/YFPgfNt9Qd9RfKjtBfgu2zUV9z\nW28CmnxpFVCACgmjUKFghIgctluup9n2l4Xp/0zXpd5xhsz5KtREtcAYU4j6Tp0m8My4TVTXAX5j\nzErAcf302zqbQub7Nqg5qaKigvj4eG688UZiYmKIjY3l3XffpaysjKlTpwZlCM/Ly2PZsmVkZWVR\nUlLC0qVLKSkpYdSoUeTm5tYxd4VizZo1LF26FGMM69evry0rLtZHIysrSxdv/nw2btzI3Llzqaio\noKioqDYGz/z588nPz2f8+PFBO74qKyvJysqirKwMYwzp6elhx1BcXMzcuXMpKSlh69atZGdnt7ks\n6B4aRlwcDB2qFAknTmhk5h/9SE1R5eVKnTurViQhQR2n+/ZVAWDjRg2WuGuXOkqDRri9/HI1S91/\nvzpZFxTA6tVqTrv+erjuOhW4PvkkmEC1Fj176k6h/ftVOOrXT8vLy5XPEc7i4wMUGxvQsnz5pdZ1\nCxJxcQEH3ND0J6HHigqNR+Qui46um7TV8X/x+9V8dtll6mS+Z4/6Tx08GEikO2AAjB+v6/HBB2qq\n69RJ/Wl69cJDC6ElTFSIyHkl9MVXAyQ2kj8N3Y3zNVfZFNvOXFdZMprV+gpXWZntK85ej7T1Zrp4\n1gN3hulzvet6hK23MqS/MmC4q2yW5dvcwJwGo8kw/bb/ucAgNNeTH/VjecpeJ6JCUA0w6CzXpcFx\nhpnzB6gw5J7zaeC/wsxnm21vpF2rkbbumjDzfROQ559/XtasWSPGGMnIyJDp06fLmjVrpLS0VMaP\nHy8+n0+Ki4tFRCQvL09SUlLE5/NJZmamTJ8+XXJzcyUzM1OMMZKamipuGGMkPT299rqoqEiysrLE\nGCOZmZlBvFlZWeLz+eS9994LKp82bVrQGERESkpKxBgjEyZMqC3bsWOH9OjRQzZt2lRbtmDBgjpj\nKCwsDOr7xhtvrNNWe8Lo0aNbeggtjrNdg2PHRMrKRPz+Jh5QGJw82Tie3btF9u1rHL8b7f05aO/z\nLywsFPuuSJNmkDfaggYnF30Rv+8UiDoMTwNmG2NWimboXgU8JSJuC/hcS2Fhdwpl2fpuODuInP42\nGWNKgHHGmERR36H5dlyvuPhyjDHzG5qQaNqD1Wg67BIJ7CR7z/YzEpjizMUYs9SO527AGWtj0HJC\nCgAAIABJREFU16Wx4wyaM7rl+6vAeGPM/wM6YLeN2zG5TVTxqAlrA7AG+JltIyXMfA8A+P1+EhMT\n6du3LwUFBfz4xz+md+/elJWVMWLECPLy8vjd737Hww8/TFJSEt/61rd4/PHHGTp0KHfccQcAaWlp\nVFZWsnnzZhYuXMgIV1KqY8eOUVQUsJB985vfZMGCBRw+fDio/MCBAwB89NFH1LiyW56wjg1bt27F\nb/X+VTa6XHl5eW0bs2fPZsCAAcTHx9eWjRw5ss4Ybr/9dhYsWFB7HRMTQ9++fcnLy+PFF1+kT58+\ntCdUVlYGfQ7tERfiGoSavxrChbgGZ4L2Pv+tW7c6p82zR605pKb6iDPQ4KBbuoM0Eq57tdoKF9+g\nBtpzNDiz0JdxHX5U2+BoVja4jpuBT1ENhdPfzAjzq1eDE9LP3JByR1sTF2YdnjrLdal3nBHm/E9U\nYyOoMPUUugV8kGucM20fb1q+Gnt06IUw8/1LCI9HHnnkkUftm+5tjxqc+rbZbHHxpKGLFCHuZB1M\nRU036QQ0Ig6SbVvjRCRsQHi7G0uAkkb2d65wAuYl2GNj1yXZnjc0zhTCzNkY86lt47e272SXtmsu\nut5JInKT5f01MNnWuQzV+ISiBLgP2AmcQH2IRqK7sI5anljgb+iON0e79QDwMPAQKmw66INuRXkb\n+KFrDbai2c/d2BLCh23zATumTxooDx3XdcCTwGzglTB9OWMYaed5C3AMDx48ePAAqrlJRP9UNzna\nSu7S5DBlFa5jcj184bAUdeZdZowJ3RvstJFCZCSjJpnG9tdcaKp1cQK3hM45A31GJqGaoWmue3OA\nu6z5bhgqAGXbvspRgel8wIm1s/c89edGP/Q56NcAX18XvwcPHjx4OB9ojSYq1JwxiICJ5dN6TDw/\nI2B6eipSeyEmqpmo1FinbeAuIph/XPeddlZGmF9Tm6ji3f2dxbrUO85wc7Z9zkIFlV80MJdTwN/t\n+ZtolORQp2zPROWRRx555FE4alcmqlwCW6WLgMHGmEES7AycgWoKlhHQRE01xuSLRk0Gah2J6yQf\nEpGd1iF3qXXIvdveyrfH2batAldbS9DdQKW2aJwxJk7qRuwNiTfatBCNRHwm69LQOOvMWUQqjTF5\n6Db6S+3cs0QkaF+fMeZBdOt4F2PMJtvW7HqGXwkaWbhbt2589NFHfPnll9x0003cdtttfOMb36Cq\nqorhw4czatSo2m3Uzz77LI8//jhPPPEE119/fW1jzzzzDM888wybNm2qLUtPT2fgwIEsX748qOP0\n9HSGDh3KE088UVu2ePFili9fXqfdZ599lsWLF/OLX/yCO++8E4B33nmHH/zgB7XjcsZpjOGVV14h\n1hX2ND09nX79+vHnP/85iM/pZ8aMGSxatIjHHnuMu+66iwEDBtSzZBcenPm3Z3hr4K1Be5r/yy+/\nXBuiw0FVVZUTqmNnc/TZkgJOD0ImZaPc5qLaC+dlPB71Z8jFJoa08V+mApPF+oxYYWUJsNq+/EvQ\nuDKzXG31cPcnuutoPLpTaIuI5NgX+3z0Jb3RGJOPmrNGARsdYcIYk4X6VRTZvsvQXU4AycaYuahG\nJFK6gp71rAuoqccRXMKZyxq7Lo0aJyrIzAqZ808s30rUP6YQSA0ZR397TEdNf5+hGp2OQJoxZjIa\nY8iZ72mAp59+mrS0NDIyMti0aROLFj3B9dertdDZVdCjR4/aaMcFBQWICK+88grTp08HoKSkhOXL\nl/Pf//3ftXwVNv3vyZMngyIlO+VffvllUPnXv/51nn32Wd5//32GDh1KaWkpY8eOxRjD4sWLefLJ\nJ7n88svZsWNHbRuFhYUUFRUxefJk5s+fT3Z2Nt/73vdYunQpCQkJtTFy9u7dy+rVq5kzZw6zZ88m\nJyeHhx56iFGjRrFv3z6mTp1KRkZGmwrVLqLZuk+c0NgiHTsGU4cOjYsCGx8f32yRrNsKvDVoW2tQ\nWgobNgQiOTcFysvjefvthueflqZRl9sy0tLS+PnPfx5U5opkfIbxuBuJ5lAL1WPa2YCaXxw6hO5M\nKgspfyykbhz6kt2M7uZ5ivA7oMZanhp7dMd+mYLGyamxfU625Utc/a4ksEtopuVz+O8M099kF896\n1Oz1KWoeqs8ENxIVTpw1cMYyyzWW9aiZbrBr3Wp5z3BdGjXOkDnvsyTAzfZ+GbqLbDDqXAxqUvvY\n8u2xbexANTWHUOHJPd8KQOLjC+WSSxYI+CxlSu/exXLLLUXyla9kiM/nk4SEBMnNzRURjS3j8/kk\nOztbhgwZIpmZmZKZmRkUf6aoqEgyMrSuw1taWir5+fm1sXV8Pp/k5ORIZWVlbb309HRJSEiQ6dOn\nixs5OTmSkJAgCQkJsnDhQhERSU1NlTlz5khpaWktX25urqSmptbG6SktLZXU1FRZuHBhEF9OTk4t\nX9euXWXt2rXS1vCTn4iomBOZOnQQ6dZN5KKLRPr2FUlOFrnqKpE77xT5j/8Q+ctfRIYNGy3795+f\nWC6tFe09BopI21mD/fv1eW7o2T9zGt0ovjlzWnoFmgfNHQfnvAk4HrUtAhahWjBBk2j+l72eaYWa\nmZZvheVxcow5FNZvh9odb8Psl9tNz9d+oW+4QWT7dqmFI+AUFBTIhYC28sPuRlmZCi9N+cM+cKDI\nypUiNTXaR1WVyNGjdft27l9IaIvPQFOjrazBuHFN9dyH/x60BwHn+eefl9GjRwfRsGHDmlXAaa0+\nOB5aHn3RtAuCCjU90C3TPUVkgosvDzVP3Y0GAYxGTVR/ra/x3r0XUVmZRteuGhq+Y0fN33PkiN5/\n+23N8TN3LkybVl9LHs4XVq3SEP2gKQCuvFKzWTeGjhwJnxRy61a4+24Nr3/ypJoBoqPh1ls1X9CH\nH8ILL2hKgF/+EmbO1ASRv/89vPgiTJoE3/nOeV0GD+0Ma9dCXp6eX3QRLFwYyL5+rli0CGbMaJjv\n6qubpr+WxMSJE+uY410mqmaBJ+B4iIRoXGEERKMRxwAx7ijGIrLGGDMPjQOzBngO9bmZQ8DXpw5e\nfFHtym74/Zo35jvfgR079KX48MPwxBOaV+dCQlvyu3Hw7LOB82XL6iaZrA9+P3z6KRQWao6j116b\nSFUVOMnWP/44wHv6NPz1r0puZGfDn/+s+ZF27NCyv/1NczU98sj5ywDdVGiLz0BT43yugd8P77+v\nwkJMTOPqlJfDD34QuF68WJN1NhWioyc2aXsegmFEzQYePATBGLMO+CYQBSxHnYO/A/wOjefyrogs\ntLyTUWfnv6NanytRAam7hDhZW0fywmHDhtVJkOlI+FVV+q/mv/7LfTcLyOGrX83j+uvH0qWLJt1L\nTYWBA+GaazTJn4fmwfbtqrEBfUH84x/nLlCIaBLJX/5SBZ2uXfVz3LNHyUF0tDp21vdTdfvtmrjx\nH//QZJCJiXDFFXpMTNQX2uefQ1kZXHKJlvXpo7xdugSSOvp8OtdPPlFBKzERkpI0sWNbE6A8BHDo\nEIwZo3+grrlGBeOEhAarcf/98Nxzev6tb8G6dd5zcLaIlGzz1VdfBRgiIk2es8ITcDyEhd1ePw64\nRkQ+NMZMBP4ELBCROW4tjjHmEeBREYmyGdDnodqfJNG8Xe5204DCwsLCBndPvPMO/PSn8OabObZJ\nJ3bhNNRqFoDPpxqh4cM1A3N0dDD16BHIlBwdrT9SHTvqC877wWoYjz4Kv/61ni9YALNmNW37lZUq\nsPp8+k/7tdfg1VdVSBk9Wk1VkybpDi6AW26BG2+E85WM/dJLVYt41VW6Uyw6WjNr9+2rws/hw6pZ\nOn1aX5wJCQEtQbgs2j6fPot9+uj5wYPw2Wd6r0sXFdZ79w6YQsrLdQ0uugiSk7Xtgwd1PU6e1B1t\nPh8cOKDZyZ3M4P366bp27Bi86+3YMTX7lZVp/ZoaHbubamq0zSuvhP79dd5Hj6qwcOqU8kRHq8DY\nrVv93yORyPf9fm23U6fAmtXUwPHjEBWl4/X5AhnMjx7V8VdXBzKiO20fO6Zr8Pnn+pn066dt3nGH\nmkMd3HQT5Odr9vZIWLEC7r1Xz+PidP37eaE6mxQuE5Un4Hg4fzDGrEU1OCXAq8Aw4CvAIhGZaQWg\nd0VkoRVqfozG1emCRvc9ADwiIk+HtNugBscNEf3XtHYtvP564AXXVOjYUX8gO3fWH+uYmLrCUaRy\n56XRuXPw0TmPjtYf6Kio4POGrs+EN1LdpvIRAP0MUlLUP8YYfRH37dtwvabGkSP6b/qKK9RHxxj4\nwx9gyhR9SYKO6+RJFTbaApxn6/jxuvdiY1WgOnJEX64OfD59xo6dx6QfUVEq4IQbJ+h4unQJCG/O\n0RFKqqtVQ5aQoIKh369CTGWlClqnT2s7HTpovVB/raioyNuz4+JU8Dt4MODD1xiMHq3PzunT+gco\nJUWfH58Pdu2Cr31Nxwfwpz/Bffc1vm0PdeFpcJoQxpgkVAORIiLTW3o8bQ1WwLkD1cLsshqbIlTA\n+WkI733A08AjqNNxKRo35wERWRvC22gNTjgcPKj/II8d0+PHH+uP/xtvwAcfnM1ML1w0hWDlvKS2\n2AxnGRkaC6Q14Z//VD+ctDT9Rw/6otu1C3buVPL7VQvTo4f+u9+5U4+ORsChU6fULDVggL5sS0sD\nvkMVjc1056FV4sorYf581QRWhc0yqH9akpNVkNu5U8vuvTdgpvLQtGhuDc4F6WRsk2FOQwWcwhYe\nTltFL3sst0eD7qi6FMBtogL2A8eBfNEI0YImUcuniXHJJUoOMjMD5198oWatI0eCVe2nTum/xD17\nVH3t96tWwhGSDh3Sf5gOr1tF33xYATSvd2FNTdPP4duh6UvPEitWrGgyB9NrrlFyw9F+XHVVk3SB\n36++Obt365qeOqXmnT179Lnr3l1NVdHRak4qKwv2Gwo9njwJb7+9gtOnJ3LyZMBXyOdTQevLL+Gj\nj1TAiopSh+7rrtO2P/lEeZKSVOsQG6saj9OnoVcv1UIYo2PbuzdgzqmuVr7qan2RX3yxai87dgwI\nt24NZVSU8n/8sY7l5Emtc9FFqrFx7h88qHTiRGBjs/Mdi45WzU2nTvq9PHRIhQufz9E0riAxcSI9\neui4jh7VdevaVbWgIipsnDoV7CvVtatqvnbvVofzigr9XejVSwXZSy/VdfnsM13DPn10593FF6s5\n7d/+TdsMRXV1sCnr8st1k0NzoSm/Bx7q4oLV4AAYY/xAoYhc19JjaWswxrwFDESTWDomqv7ACyIy\nIcRENQV1kJmLBiV8EM1DdU+YduuYqI5ZXfv3v//9VvVlFwm8zEL9E06dCrwwjh8PPjrnjpDk+Dc4\n5zU18Mc/jmHixHUR79d3fSa851LXMfs4GDFCdzZ16nTuaztmzBjWrVt37g21YTRmDY4eVWGgPl+R\ntoyWeg7efls1kY628vPPVVByyDGpvfwy3Hxz842jPX0PWsJEdUFqcDw0CfxopOSvhZioqgBCYuGM\nB/4VFYYcncpYY8xMZ6dVKBYtWlRrokpNTSUvL49BZ7Lv+DzAmMC/2abGG2/Ar37V9O02JZx/4o4D\nZ1P69XhoHLp2bekRXJi44YbIqQ/8fti/XzVAIW6CHs4BLREHx/vJ8hAJn9uj20RVe22MGWz9nEBz\nUO0SkSR7LsARVCCqF+PHj6e0tLTJBu2h6WBMwGHZE248tBf4fGrm84Sbto8297NljBlnjNlgjBlp\njJlijNlijCkzxqwyxjTqkTTGzDbGrDTGzLNtzQq5H2+MWWKMecoetxtjZrruTbH1Jhtjkuy5344l\nzvLNsvXKbCC8MxpDA+N3j2+DpcGufsvseAbZspGuMa6MsJZTbb2n7O0+qKDynDHmWeBNe+08M/OB\nF4wxW1AH4yjr+1Ro+U4DzxhjxlphaIs1Gc4FzaKbnp7OSy+9hN/vJzMzk2uvvZb33nMnRg+P4uJi\nJkyYQHp6OqmpqWRnZwfdz8vLIzMzk4KCApYtW0ZCQgIPPvhgxHtO8k7QpJzTp0/nwQcfJDMzs5a3\nofbdbXjw4MGDh2CsWLGCMWPGBNGMxoRxPge0KROVMeYuNCBKEvoSLUGTZY5HHYoHo0Hm6mtjPppH\nKcpej0QzaO9w7fjJBXaIyBzL4w66kgwMQbOLC5rpe7YtzwPyjDE7gI2WZwEwyxjzPxLIRN6YMUQa\nfzLq5zJSRHbZsjJgizGmh4jkGGNS0OSiAIhIgTGmBE2CGW4tS9BUDDuAUcaYscBVqDBzEIi1974C\nVFs/mlg0AWmpMeZvwC3AL0VkuDEmHQ36dxHq7F1i12ga+lkxdepUBg4cyOLFi1m+fDmLFy+mf//+\n+P3+2mzi4bB161Z+//vf84T1/Hv33Xd56KGHKCoqYt68eRQUFLB48WL27dtHXFwchw8fpnfv3vz1\nr39l4cKF/O53v6tz7//+7/8oKipi69atPPTQQyxdupT+/TVJ+tq1a8nIyGDSpEk8/PDDEdt/6aWX\n6h13KCorK8+I/0JDe58/eGsA3hq0p/kPGDCARx99NKhs69atjg9OE3j2hUFzJLhqTiKQcfv7IeVO\nxu2xrjI/sDkM35eu63jL95SrrAyYG1Jvput8ZGgdW+5kK78iDO/cMxlDPfPfAvwszJqcBuLs9Tw7\njkFh+lgZUi+ozHVvEyrA7QceRjOV70Qzk2+3c5gZwiu2Pb/r3D3vJOom5fTII4888qh9073NIS+0\nKQ1OCEpDrpeiGpMMoD4tyLiQ6/QwPFuALGNMmYjkAEiws2yZPYZGxihCX+LlrjInNF33MxxDHVif\nlzRUyKiFHWNOY9oIQQX6cK0Mc68UGI5uF/9fEXncaoqqUG3VDiDTGDMGGABUo8JQB+B14N+Arri0\nRlbbA7om3wZOoMLTA2giz08aGO8ANNfV2wS2rRvUGbob8FtgM3An8HNUa/RKSBuR7vUB1gF/BH4f\nps4vXPfqa9+DBw8ePDQOnYBEYH1zNN6WBZxQOHq+5PqYxOZGsiaaUQRitbgzk0xDNRTzjTHTgPEi\nUnyW43KEodr2GzmGcEhDX+rnI+TY28D37HmsNUttRjVFAvwG2IcKdKVAMRrobwpwLSrYXBuh7TIR\neRPAGOM4M28Ta8KLBCvgCXCriEQI1QXGGMctv1RCth5GuudymP48TB1BBZy+IlJUX/sePHjw4OGM\n8GZzNXwhCTiOIFFvMH/rw7IKWCIiD9qyIB6raRiC+uKMAwqNMdNEJLcpBtqYMURAsuu4synGUg86\nE9CQfBvVktT60AD/DmwQjYOzHbjN8kWhQs9PgCcjtJ1gjLkJ1eA4AQW/YoxpyOn9X+zxNmNMfdqe\ny+0xyQpmjbnnCDhpYer0cU7svfra9+DBgwcPjUOtBkdEDjV14xeSgONoP7Y0wLcR2C4hOZLcMMYk\niUbovdsYMwLVsCxBBZ6mQINjiIAiVOAYj/q9BMEYM6ghLcgZ4DgBAed/ReR120eJLSu0ws1dgIjI\nG8Abxpj3gGMEBJdwSAbeCClbEY4xAhrLGzYGTwP3MgnE8mnoXn3te/DgwYOHxuE+4PmmbvRCEnDG\nA+Ui8l+RGKwZIgl1knXKuodhzQKmA4jIJmumWmKMSZSQ7NhnijMYQzg4wttUY0y+iKxxtbGKgG/O\nIVQISQccgedcojnfYoy5H10Xx5w22xiTb9stsTvBngVeROdXb/SmwYMH061bN0pLS/nss8+45ppr\nuOeee/jGN74RsU5VVRXDhw/HGMMTTzzB9ddfX3vvscce46677mLAgAGsXbuWuXPnMn/+fEaMGBHU\nRn337r//fj7++GP+9Kc/MWDAgNryZ555hmeeeYZ169YRGxtbbxuNxYwZM1i0aNFZ1b0Q0N7nD94a\ngLcGDc1//35NUNqx43kcVDPh5ZdfZv36YFebqqoqiouLobksEs3hudycRJidP6hGoAzdtuyUdbd8\nn4bZSVRj25mCamZqgE9RASHetpXkqjc1pJ1RhOwQsuUbqbt7Kc093kaOIa6e+U+xvH5U4Fllx/t9\nF89ge/+Q5Z9n+3DKJlu++bZsbJh+5hPwcL/Ztrnd3pvrGsMBYKu9ft7e/xD1E/ITvPvM+UyksLBQ\nRESWLVsmxhiZPn26FBUVyZo1a6Q+ZGdni8/nE2OMZGRkSFZWlgwZMkSys7NreWbPni3GmLBt1Xev\npKREEhISJD09vbasvLxcUlJSZO3atY1qo7EYPXr0Wde9ENDe5y/irYGItwb1zb+6WuTaa0UGDBB5\n443zOKjziMLCQucdkybNIS80R6PNSQS2ic+1L/j1loa7eAYT2Dbu8Cbae5PtS/5TAtuc59myx+x1\nma33lBUMVrrqj7T91oQIC7Nc/a0HBoWMw807pZ4xzG3EGoxFHX5r7HF4GJ6Ztr1D2G3ltr/HUJun\nM4Ya9zhc46tyCTi/d63LCDuvx2w9P+pLUwOMsHyHgJOutseigp0jyMl3vvOd2oc8PT1dEhISZPr0\n6Q19H0REJCcnR1JTU8Xn80lqamqQ8LFs2TJJSEiovZeTk9Ooew4qKytlwoQJkp6eLtOnT5fp06dL\ncXHxGbXRGHg/7O17/iLeGoh4a1Df/H/9a31Dg0hamojffx4Hdp7Q3AJOm0u2aSP+zgMyRKSOH4qH\npoExZhFwO2puWgNUotvGnwSuJ5Bo81HU4djx13Fwh4j8JUy7dZJtOgiXq+RCRXtKshcO7X3+4K0B\neGsQaf7//CcMGaJJfaOiYPNmGDy4BQbYhPCSbXpoTegLXIwKLjPRSMf3AT1RjVgFgIg8aoy5D91S\nno8+U3vDCTduuJNtevDgwYMHxenT8N3vqnADkJ3d9oUbaJlkm56A4yESOgGOa9uv0fg3MZbmAO8S\n2EWUAXyMOjR/CkwwxqwRkbsiNT5jxoxz0uBUVsLu3VBdrRQVpZmXu3SBEyfg8OEAVVTArl3wySfw\n2Wda3+cLJJKMioLOnaFbN80g7Bzj46FHD3Xy699fKSoKSkqgsBD27oWDB+HQITh2TOn06bpjDY0A\nYAzs2zeRO+4Iz9MU56GJMn0+LRPRbMkB5Xcw+f3h60dFRa7jEDTM49CePRO57Tbtz++Hmpq66xZO\nuRxJ4dyaFNGNi/gAn38+kbP0Ub9g0FbW4NJLYcAAuOwy/b05elS/+85vgPO9CYeoKLjkEm1DBD7/\nHL74Qn8rPv98IhkZ+sw4VFGhvy8AAwfCI4+cnzk2NyJpcJoTbdFENR/1dxknDeRt8nD2MMasBe5A\nna132WSeRcAiEflpCO8Y4C+oj80g4AZU89NdbFBDF28aUHjTTYV07pxGbCz06qWCyd69KoBUV+uu\ngeho/bIfOqRCS/fuEBenPxAHDpyHRQhBp046zrKyhnk9ePDg4Vzg88Gbb8LQoS09kuaDS4Pjmais\n/81k9OU53xiTLMEpFDw0HZw4Nk7aCSc1wqUAVuCpEI0X9DXU2TjP0gY0UWcCECTgOHjzLGJXlpc3\nzNOcOHFCyYMHDx6aE8bAb35zYQs35wNtSsCRs8+55OHM4UOFk7eMMa8Cw9AdUI5dyW2mOgF8jsbA\n6YgKQwfQ7fQRghnOcDXlYCIwkejogKmnUyfo2VOPlZWq0UlIUHVxSoqakjp0UBPHkSNqJurcWTU9\nburdW+skJqpmyDGLOMdjx7R+VVXgWFmpQtXBg/DBB/Dee3pv8GC4/nq48kpVPffsqePo3BliYsLP\ntj5FqfteU507pp9QckxV4ch9z12npkYpUj03QeP4oqLCm9Ai4WzvefBwrqipUc3yxx9rXJrOndUc\n3rMn9O2rpqdI33uAkyf1N2T/fn3Oe/XS342YmMgm3I4dVVt8IcEzUZ0lbPC8QmC2nHl04DYBO8dx\nQIqITG8E7zmthzHmDeBGdBeVD1hg+/9SRC4O4b0P+KOIxBhjEtHcVEeBB0LNiI6JatOmQq67Lo3K\nSv3yHzkCffpAv3765fb71cnuQghw5cGDBw8e6sIzUTUO3VF1wAW5LcdGCZ6GzYvViCpNsR5OEsxf\nAS+hmcFBnY1DTVSDgQPGmNXA/1i+TgSiHtfBo4+GdzJOSVEnY5/vwhZuVqxY0W62xIdDe58/eGsA\n3hq0p/m3hAanxQP3NRVRT/TfRtZPwhW9uDUS6uey+Tytx1rb35/QwH+rUR+cA/b+KgJBCjeggf2O\nAActXw2u4IGudtNwRTJ2o6SkREpKSuqUX4jwApy17/mLeGsg4q1Be59/cwf6ayh7c5uBhOzWOQts\npK5TSJtFE6yH42T8kGgW9bn22rE2z0UDAAIsBXaJSKyIXGLLKtFdV41GRkZG80v0Hjx48OChXeBC\nMVGdE6xpJamlx9HK4EOD+S0wxhQSMHc5Lp1uJ+PrgBKo3enmR3dfpREm6znUjYOzZcsWDrTE3m8P\nHjx48NDsaAkT1QWhwTHG3GWM2WCMWe8qizfGTDXGbDHGjDXGDLbnfmPMSndd1IcEdOv5emPMINf9\nwcaYVbbudmPMvJC+x9m+R9r+yowxSxrbv6ud2caYlcaYeba9WS2xHu5mgFh0q/corACDmp5Ac2D9\n3BjjRwWZCmPMTOBuW7cHGvXY3f8SVDCiurqaX//616xbt45JkybRpUsXjDFkZWVx66238t57ThJ0\nWLBgAXfffTfZ2dlkZmaSkxPYSFdZWcmyZctIT09n7dq1FBcXk56ejs/n4+677w67PpWVlUyfPp0H\nH3yQzMxMMjMznYy2tSguLmbChAmkp6eTmppKdnZ2g+vuwYMHDx7CY+LEiaxbty6ImjuTfJvX4Fhn\n1+vQl/BG161k1Cl3MOqgWwLMtufjjTGbRWShiKwxxlyHBg+cLSLvu9pOQ5Nf3mqvRwD5xpgkEbnb\nCkfzUO1PCfpS34Em5ExqTP+23fmov0qUvR4JbDTG7JAzDGZ4ruth20hGY9vUAOss/ca2c8Qe89Gg\nfvdYvttt+y/b+x2w5izb3ga7Ln2BcR988AHp6em88sorJCUlcfPNN1NaWsp3v/td+vctnOvIAAAg\nAElEQVTvj9/vp6ioiMWLF7N8+XI2b94MQGJiIg899BDGGEaMGMG2bdv4wx/+QHFxMTk5OfTt25fJ\nkyezdu1aVq9eTe/evXnggQdqF2HPnj384Ac/YMmSJfTu3RuA4cOH144lNjaWrVu38vvf/54nnngC\ngHfffZeHHnqIoqIi5s0Lkm/PGpWVlRQVNfmmgTaD9j5/8NYAvDVo7/PfunWrc9qpWTpoDsee802o\n74wfWB9SPsWWz3WVJYXyokJKDTAopP72CGU1BLKLOyaZlWHG1dj+N6Dbr0Pn81RIe41yMm6C9VgN\n/APNHi5ANppZXYAPJOBkvMmuRREBx2Jx0dct7xYCGc3vDeHxyCOPPPKofdO9zSEbtHkNDoCIVJrw\n0b6coPo7XLylljehvjatJiQZNVs5UXwN6lsi9t5O1E9FgHBmnsb2Py6kXnp9Y2sI57IeNobOXQS0\nO/Ho1u8EYDpw3FadC0wFbkETba4GhgDfAX6H7rZ6w2pv0tAI1ADr0aSdO9EAgQ4eBh6w9z5xlTvb\n04/a43WosLWGgOPzCDROz38Af3bV3QJsBb5tr/ug2qh7Q/pwYwDwHPA2gejNBogDugG/Rc1zHjx4\n8ODh3NAJSETfC02OC0LAaSYkoy+3cSJS1Zwdid3xZE1eowjEj6lXCGsmpKDzLkGTaJYCk9AUDeLi\nmwNcZM/7oA7Hq4Gv2rIt9phm61Wc5XgcwWYEMBR4x17HnUVbX7Fjqe/z7Gt5ZgPHzqIPDx48ePDQ\nCuAJOJGRbI8paJbsZoPVcqwClojIg7asObusD0moxuKr6NwBCkTkdWPMNIdJRCZYh+tb0CSb/yKa\nlPMdoB8B4cDZneZovG5FNSSRsKKeexDQdmVacuMRS258lbrBEV9soA+A1xrB48GDBw8ezh33Ac83\ndaOegBMZJeiL/m7CCDjGmLtEZE2dWmeHjcB2aR1pJpzdUtegvjcLgFuMMffXU0eAVGPMfwN/A64n\nICAWoes4HvXZ2QkwePBgunXrxpEjR4iNjaW0tJQ9e/bw3HPPMWDAgNqGx4wZw2WXXVbr8AuQnp7O\nqFGjah1+CwoKyMrK4he/+AV33nlnEN/AgQNZvnw5EHAWHjt2LD//+c/rTGLbtm3s3buXrKwsJk2a\nxMMPP1yHp6CggJEjR9azFI3DjBkzmn0HQWtGe58/eGsA3hq0p/m//PLLrF8fbImqqqpydrDubJZO\nW9pBuKmI8E61d9nyyfU56xJwMh4RxlG3BhgZUn8J1vkYddytAcaGGVOD/RPeybc7YRyXQ8fdHOsR\nMu8dqPByM7r7SoBPXfVm2bIP0MScI1ATmwDHwrR3F65IxuPHj5fKykoREcnKyhKfzycFBQXioKSk\nRIwxkpmZWVtWXl4uxhiZMGFCbVleXp4YYyQ3N1fcMMZIenp67XVFRYUYY8Tn80leXl4QrzMWN09+\nfn4Qz7Rp06S4uFiaAu09gml7n7+ItwYi3hpEmv+RIyIlJSJvvy3yl7+IbNt2ngd2nuBFMm4EjDHd\n7WlyyC0nDkv3MLzdXXw7sFoGGx9mrIhUotoL0C3bG2yMmi1AuYg4Wp1UAsHvQtGY/h3H31HGmFnG\nmCmowCVAmjFmsjEmLsK4w+Jc1sPOO8uWXWaPV6KaLIBkY8wfjDHXEPAVGoDGzJlMwITU0Rgz2bbn\nmLZWo6kfGD58OLfeeitxcepKk5KSgoiwevVqiouLWbt2LQkJ6oKUn59PTk4Oubm5ZGdnY4yhqKiI\np59+msrKSg4dOgRARUXAzcc5d5fFx8ezdOlSAMaPH096ejoTJkwgISGhdizx8fFkZen0MzIyyMzM\nJDs7m/T0dHr06MGgQbUhkjx48ODhjCAC1dXwxRfw1luwezf86lfw0EMwfjxcfz1cdBHExkJyMtxw\nA9x+O6w9o2AhHmrRHFLT+SQ0tsoqVENQA8xEHVBHEtjS/SkwFtUmLHHxurdLbwYOUXdr9kxb32nn\nTte9KbaOc29myLga1b+rndo2UCHnELpTaDC6lby2HnabejOux0bgFCpoHUB3iZ1CdyG96BpnMeG3\n/f3NPUbb32bbj1x77bUyevToIEpOTpaEhASZPn16rYSfm5srCQkJkpqaKjk5OSKi2p6EhATJzs6W\n/Px8SUlJEZ/PJ6mpqbJmzRqpqKiQadOmic/nE5/PJ9nZ2UH/GtasWSPp6eni8/kkPT1dNm3aJKHI\nycmR1NTU2nbXrl1bh+dc4P1zbd/zF/HWQOTCWIPjx0X27BH5xz9EXn9dZNMmkZdeEsnNFfn5z0Um\nThS54QaRXr1EoqNFVMxxaHTIdXj68Y9bepbnjueff77Ob/6wYcOaVYNjRNwbYzx4UBhjVgHfRLdp\nJ6NBDN8CFonIHBefE+zwbns/GhWEbpCAlsvdbhpQWFhYSFraBZn8vVEYM2YM69ata+lhtBgizb+m\nRv/dfvkllJdDjx5w2WUQFwct53ffPGjvzwC03TX46CN44QVYtw7effdcWhqD/mdUGAP9+kFiIvTu\nDZdconTTTdAErn+tDkVFRQwZMgRgiIg0ecRDz8nYQyRE40rlISLFxpgYIMbGCKoQkVLRSNDzgFfQ\n2DTPoaaoOQTMWh5CMHHixJYeQpNCBI4dgyNH4Phx8PuVnP+g7vPTp+G66ybyyiuwb5+q6XfsgPff\nhw8+gBMn6rYfG6s//P36QefOKgjV1GhbNTXars9XPxkTfB0VBdHRkSkqSsnN36EDdO+ugleXLoH7\nDm/HjiqMdesWoJiYuvOBpn8GRNqeENhWvgd+vz6nGzbA00/D5rOIhNWnD/Tqpc9ybCxccQUcPTqR\nu+/W8osvhksv1WfIQ9PA0+B4CAtjzDpUgxMFLAdOEwji1w94VwKpHSYDucDfgYtRn51ooLuEZDV3\nNDjDhg0LSrYJ+mPX2n7wampg5044fFhf3N26wdVXt74XSXU1fP65nrtf5sboHPz+gFBQU6P8J04o\nHT8efH78uGpPvvxS5+0IKCdOQFWV0pEjdY/eT0l4dOyoQo6bOnSArl0DLzuHTp8OfB7OZxgbqy++\n3r3hqqvguuv0M1y3Dl56SYXDAwf0s7r6av23f8klsGsX7N2r/fTsqW0MGQJDh6pwVlKi9QYMUH8P\nY/QzLC/Xz7trV+jUKfhZP3FC73fvroJmW4bfr+sbChHYvx/efhteeQVefx22bQsveANccw2kpkJC\nAsTH6+fdoYMKLUlJSldcoWvZnhEp2earr74KzaTB8QQcD2FhTVTjgGtE5ENjzETUQXiBiMxxa3GM\nMY8Aj4pIlE0SOg/V/iSJyM6QdlvUROU4+R07BkePBsi5rqiAPXv039r770NRkb683Rg4EKZMUZVx\nz576Y+/846+qUkHjiy/0RXXqVIBOnw5Q6LVTdvx4QAsSqvkI1YIcO6b97dyp5Pef9+VsUhijL4oB\nA/QF3b07HDqkn8dnnykdP95wOx7OHBddpC/kXbuCn3djVBjq2lVf8Iddf1fi4lRouvRSrXvkSECo\nqq6Gkye1br9+0LevfkdOn9Y2e/bUPk+dgoMHobJSBbjERH2OP/oIPvlE++3fXwUEn0/vVVVBWZmO\npWdP1YxcdFHge7F7N3z8sbZ75ZXwta+pkNGli/b397/Dxo0q4HXvrs9a1676/T11SgXG0O98KAYN\ngkmT4I47dMwezg7NbaLyBBwPYWGMWYtqcEpQR+LBaCTgRSIy0wpA74rIQivU/BjdidUF3VV2AHhE\nQmL7OAJOv37D6N49nqiowD/EG26YyI03TqzVPISSU37iRGQBpTHXbV0QaA3w+QImmNjY4GPnzsFm\noVCKjlaezp31xXjFFXD55So4xsZG7lNEBdBTpwLmJcc05GgfHNNYJHLzOOatUEHTTQ6vowU7cULH\nUF6u526tmN+vApij5Tp8OHDuCLSOsHvyZOC5PFd06aLCQceOqmnwnu+mhc+nQtaAAfqMjh8P7dh9\n8KzhaXDaCGy+pnFAiohMb+nxNAeMMS+jUYcr0V1XU9GgfYtE5KchvPcBT6NRhPPQ9A5HgQckJBu6\nI+BocOGGfiVK0fRWCwiksjq/uPxy/THr1UtfyIWF8Fori3HcrZv++F5xhb7sQ1/koX4ijq9Ip05K\nnTsHzh3q0UP/FcfHBwSVzp0Dgkyo6cLD2aGmRgWdI0eUYmICn4dz//BhNSXt2qUaxS1bVEMyapRq\nEAYNCnwWVVXqH3L0qD4Pl12mgtgXX0BpKbzzjjrF+v2QkqKf8T/+oeVVVVrniiv0+Qj9Y+CYXXr0\nUAHvwAGlKlfik06dVGPTpYvOparq7DVvnTvrPM9WYHM0RuEQE6PmvKqqgLbV4U1KUs3P1VfDv/4r\n/Mu/qLbKQ9PDczJuZthdQNPQAHUQSJ5Zhr5hi4ClIlJq+Uda/nHUTQFwIaEbug7OV9tJPHkp1CYj\nrbDrsh9NwpkvIjuNMYImUcuv0+oZoQKVr87+ue/USdXPXbsGVO31XcfFqTr9ssvUXNKrV902t26F\nVav0h/vQIVWvO//iu3YNOAw6P/KhFB0NhYUr+PrXJ9ZxbO3SJSBAOJqJUA2WowVxxhwb2/aEjRUr\nVrQ6f6vzDWcN4uLqf4H27Kkv3RtvhHvuqb/Nbt1gxIi65b17w7XXakyVSDhbJ+WjR9Us26WLPvuh\nbYgETFtRUfo9OXRIfbzy81cwaZKuwd69KoSBakouv1y1XSUles8Yrd+li65JbKy2s2+fClzO96NX\nLxX4e/QIOK8fPKhCzMmTKhDecot+f5pqDc4W3vegeeFpcCyMMX4C+/Hft2V3oTuCQJNurg3hLxSR\n6877YM8DjDFvAQPRWDlfWOoPvCCah8ptopqCSiNz0Xg9D6JRmOv8HDsanGuuGUZUVHyttgEgPX0i\nQ4ZMDIoAcfz4YTp2jAvyQenYEY4dK6VLF0hMTIootHTpEt6JsDWgrW6PbSq09/mDtwbgrUF7mn9L\nmKjavQbHhQr0ZV4rv9st0ONQs0su0J7iSfpR7Y0AuwiYqKpAk226eMcD/wrsJZAAc6wxZqaz0yoU\nf/zjokY6GYf/a5uamkFeXh5eYGEPHjx4aP0It0vWZaJqFrTS/7etCgX22N0Yk9iC4zjf+Dzk2hH8\nykFNVNYXCWApsEtEkuy5AEc4F9tSPRg/fjylji7bgwcPHjx4CANPwGliGGNmG2NW2rxVG+wOI/f9\neGPMEmPMU/a43Rgz03Vviq032RiTZM/9xpgtxpg4yzfL1iuzQfbOaAz1jN0Z2yo0I/hpVLC5CE0n\n4Qd81v9mHfCqMWY7mg6ixPonbbPNdQEesILQFjuHlU5fM2bM4Jvf/CaJiYm1dOmll7JwYUDhs2bN\nGjIzM7n11luDymz2WbKysrj11lt57733WLNmDT6fD5/PV1vmIDc3F5/PF9S2Bw8ePHg4f1ixYgVj\nxowJohkzZjRrn56JqmE40Xh3hMZ0CYUxZj6aoynKXo9EE3XucPnv5Nq25liema4mktFtQ05G7hRg\nti3PA/KMMTvQPFGj0O1Fs4wx/+OkRWjkGMKNPRnYAtwlIq9YIWeMHceXdtz3olvB59l7FWg29ALU\nRwdgD+pcnIHuwjpu5zANNWUdBJg6dSp//OMfGT58OA8//DAAzz77LHv27KGoqIht27axYcMG8vPz\nGTp0KEVFqgxKSkri5ptvprS0lO9+97v0798fv99PUlISP/rRj3j88cfp06cPfr+/tk7//v3p168f\nI0aMqC1raVRWVraasbQE2vv8wVsD8NagPc1/wIABPProo0FlW7dudXxwmicMYnMkuGqLhO6aqgEG\n2et41O/Ej77gvxbC7wc2h5RtAL50XcdbvqdC+pkbUi80SWdQHVvuJMq8Igzv3DMZQ4T5rwbWu67n\noZGJHR+cp4CdqIAyCE3o6STcPEYgyabfkgAbXO0l2fL3XbweeeSRRx55dG9zvNc9DU5dFBjdJ1iG\naihmAbkSknIgAsaFXKeH4dkCZBljykQkB0CCHXHL7LEipF4RKiSUu8pK7LH7GY4hCNaX5i5U0+Lg\nQ+D7zlhE5EFjTCW6fXw+arrKMMbcDlSj2sBJwP9D/XduQpNvAiAa8RhUSLsPFZb+P2AosBh4NsLw\ntgBvAz90lT0MPGDb+SSE/+fAncBDaPZygCfs3I7WuxAePHjw4OF8ohOQCKxvjsY9AacuRojdJn6m\ncIQgu718FIE4MAkutmmolmW+MWYaMF5Eis9yrI4wVNt+I8cQimRUinYEJkRkuTHmV6j/TZTd3l0K\nXIMKUakETFSlaLTjKHQnVYpt5rMwfdWIyPN2jPeia/Ej4FuEWQsrFFWJawuhMcZxgN4mIRnLrb/R\nWGCsiCw1xsQDh0WklYXn8+DBgwcPwJvN1bAn4NTFWYd5sn4sq4AlIvKgLQvisZqMIahPyzig0Bgz\nTURyz37IZzaGMEhG553saieeQFbwnqiT8UuogJNiy504ONuB24Bvo0LOJajAFA5RVrDZCZwAvgf8\nEhXGCo0xvwVeCKnTzQpYDpzwe18xxoRzlH8HGGWMuQ24AXgnpL4HDx48eGh51GpwRORQk7fe0r4v\nrYUI8cFpBH84H5wduPxYXHwr3b4orvMR9n6Nq2wwIX41tnyVHV+cqyw+TPsNjiHMXEZG4kEFla32\n/K7QsdmyT13n69FYOX5gcphx7KDl7b0eeeSRRx61HvJ8cFozrB9LEuoM7JR1D8OaBUwHEJFN1ky1\nxBiTKA3s0mrCMYRiiz2OM8bEScDM5cS5udgYswT4rb2ebYzJF5EC4Dp0i/j/opqVl4GbiawJOwkQ\nFTUYkQNERV2JCIhATU0Cuvv8LxjTh44d4cSJdNRN5wlXE4uB5bbs+gjdDLfHoai/dGvDDGDRGdVw\n0jW4E1k66Rzc5e57EEgcKRJIcukkhjx9WqM+d+umaSROntT8Pz6fXoPmSHLyDXXsGEwxMYFcV06i\nyepqTT0QH688Tt9O5ua4OFi3bga33LKI6urAOGJjtU5MTCAb9eWXazbo5OTWG5X6bDFjxgwWLTqz\nZ+BCw4W0Bl98AW+9pfnq3n9f00ccP66pKSIj8u9Av34wc6bmwroQ8PLLL7N+fbCrTVVVlRP2Y2ez\ndNrSmpPWQlhNCuqD0xBvd8v/aRhtSg3qmDwFWGKvP0WzRcajmiK3FmdqSDujCK/B2UiIhgnNVlmr\neWnkGOIizGmW5duOanQGow7NYsv/gGpf5tlrP+o/s9XOqdpZO2CfrTczzJrt1nuFAj0ESqx4IwJL\nBVJd1+UCJqRMBJbZ8ukCRQJrQu6LwAIBn8DaMPdaA41uBWNoO/Pv3l3k3/5N5Le/Ffn730VOnJA2\nj9GjR7f0EFocF8IavPOOyL33ikRHN8/34FvfEtm+vaVn2TwoLCwU+65IE/E0OE0OV7JNsUVLjTFL\ngWUSZueUDXI33/InG2Pmosk4dxpjptp7U23ZdGNMBSpoJItIpfWH2W6MWYZqOXqgMWOcmDXzbNtT\nbeyap63jrJNCb74xJsvWdXhHGWMmW95ptjzcGFLCzQlARHKMMeWohmkD8E/Uibg7ukV8IbqTawPQ\nAd2pNBLNhnkIFa6cOVxim51mjClB4+Q4Y+0L+u9k3z7w+1OJi5uKzycYU07//hvp1An27y/gwIGl\nHD5sgBIGDFhI375TgThOn55CUdEyTpxYxcUXw1VXPUWHDoFkllFRcOrUVF54IZuJE+8MSljZGIr0\nU6Pr1DA1hu/tt2HoUD13sn47VFMT/ry+e/XxxcRoJmgIZK52EnvGxGgixMpKHYuTadzvVy0KqFal\ne3ddmxMn9F/p8eOB+27ExWlfFRWRMzmfDSoq4KWXlECTkd5wA3zve3DvvQFtlQcP5xOzZkG4+KEd\nO2pW9tjYYOraNXCMjoaVK2HixLq/Qfn5oOFh4MUXYfdueO+9tpdUt6XhJdv0EBbGmEXA7ajJaw0q\nyAwHnkTtQo6D8aPAv6PCi/vrd4eI/CVMu2lA4bBhw4iPjw+6Fy5XydmioKCAZcuWsXLlyoaZWwCt\nLcmeIxQ5ZikICGuRflT9fs327GRS79xZf7SdulVVKhA5bR48qFmhDx+GefPGkJOzji5dtF5MjApZ\nhw6paapLF+23qAjeeEPpiy/Cj+Pqq+Gxx2D06KZZi/OF1vYMtATa8hq8+v+zd+7xVVVX4v/uCwEE\nTAhoQbGUPBCtL/IQx2crJNh2FCuPMCi1D4GgU2d+aYGALX38OiMk+CsdWwcI9mG1UkiC1jr9CCY6\npVUrkIDVigpJ8MHDB5AQQQSS9ftj7XPvyc29eUBCEu7+fj77c+7ZZ5999t65cNZda+21NmpWco9z\nzoGZM+ErX4GxY1XIaY1o8xeB3/9eTVR79sAzz4AvoHuPpCuSbXa4SsiVM6OgTs2es/BI1GR1FM0Y\nnkZTM9sO4HrUTNUAvNNCv+mAVFRUSGeSm5sr5eXlnfqMU+FMUM2fCu2df2OjyJtvivzylyJf/7rI\nyJHSTC+Wmyvy6aedM97OINa/AyI9dw2OHxe57LLQd+/73xc5cqT9/bQ2//p6kd/85iQH2QNwJipH\nV9EP8H6D/BjNSxVny0JgE2q2AjWxvQlsQ4WdHGNMqYhMjtZ5Xl5eh2twampqSEpKorq6moqKClas\nWHHSfXU2HaWp6qm0d/7GwIUXavnWt7Tu+edh4UJ4+WU9X7kS/vEPKC1VZ+buTqx/B6DnrsFDD8Gr\nr+rnjAz40Y9Ozkza2vwHDoSvf739/XZHomlwOhNnonJExBizDvgqqql52/oeVQLLROQ7YW0nAn9A\nHZrHoLFnBBgkYT4/nomqoqKC9PSOC01TXl5Odna29wzKysq48cYbW7nL0dMRgd/8Bu6+u6nP0L/+\nK/zbv8HQoS3e7nC0m9274fOfV1MrhPzpHO2nsrKSjIwM6CQT1Rm28fLU8W2N7pacxvF5rwYvNYRB\nhZZhdhxpvrFcgZqyStCgfY22fUvRkzuUzMxMMjIyGDx4MEVFRe0WbmpqajppZI7OxBj45jfVH+L8\n87Wurk59ckaMgKwsWLIEtmxpbbuuw9E6770H48aFhJu77nLCTXfGaXAICg35QA6a6ftKX30FMF9E\nHu5u4+vkZ74EXIymXtgI3ABcCDwhIjk227jnaDwPDeiQiJq1DLAPWBS+bqfLybgt1NTUUFBQwNq1\na0lJSWHz5s2t3+TotuzbB9//Pvz2t+r8HE5ior6crrwSLrtMnZM/+1m3M8XROiKwfTvcfDN4v4VG\njFDB+dxzu3ZsPYWucDLulgKO3Wqcj8aE8aiyxzo0Z9JiOfkcTpGemWSfUeETcNLQIHgrReSejnpW\nR40vSjtv27u3drWo5uUAmjOqEp1PiyoLY8wLwNU0N1H9SkTuCmt7B/AbEYkzxoy0zzkM3Cki68La\nnrKJqrS0lMWLF1NZqf8eBg0axJAhQwB1mj9w4AC1tZqrtKysjHHjxkXtq6amhpSUFDIyMpyAc4aw\nezf87GdQXAxvv91y2/h4FXSSkmD4cC0XXggXX6waIX/gREdscOKEbsl+9VXYsQPeeEP9vPbsCbVJ\nSYHyct0K7jh5OttE1S2djEUj5JYbYxqxcV5E5HkA+wItQfMWrRSbb6kDnullu/bXbTXGJIb7kbQV\nz4TTmjBxsuOL0q4UKPWt3Y1ik4da4acYjUQ8JVz4CMNLaOk3UQXPrcBTa+eWBrxnjBkjItuMMYI6\nKZfRCUyePJnJkycTCAQwxvD8889zxRVXNGlz6NAhxo8f32pfSUldY5FcvXp1j3Ww7Ag6c/7Dh8PS\npVBYCFVV8OyzGlfkuec0no6fQ4fgxRe1tMTZZ8Pgweq8fOGFMHq0fu7VS7fGn312KHpzfHyoDBgQ\nXTiK9e8AdO0anDihoQv27IG33oLXX9ewBH/9ayhydyQuukiFG88keiq470Dn0i0FHB+1aAA57yWL\naEC9qag2Y7YxpkBOMcVBS5yscGN5Fk2o2RV4axf871VESo0xU1ABcRXQkoADmlbhJWOMZ6JqJOS3\n5d9JdTn6XdpkjDlin3kEDTYYIQxWx+6iCu8HID4+noKCgnb3dbqI9f/YTsf8jYHUVC13360+OK+9\npuXVV0OfW9PygL7w6uu1bXsUfYGA7oSJlEajvn41y5ZNJyGBYDFGX7zHjzdNsREI6D1e8Z8fPw5H\njmjMoV69NKbQ8eMqvNXXazyWs8/WcXj3esV/fvx4KC2HiPbTu7eWaJ+9VCGg9x48qMEk+/XTWEag\n50eOhP4mvXuHhME//Wk1JSXTqa9XYTA+XtsdPKjCaCCg/fTtG1lQ9IJ7BgKh9B6ffhq9+K8fORKK\n9dQaZ5+tvjY33KAO7IM7yLswlv4f6IpdVN1dwIlImDYjmc7KY3EKGGOK0SB53Y1yexzUSv6rE2jE\n4hwR+YcxZjrwGBrrBjQeTi2AiEywGcVHWXOWAB+JSEThBmDZsmUduosqEi2ZphyxR69emtcqTNnH\nxx+rWWv3bhVg3nhD/S0OHNAX4IkTKiwcOKDBBttj1W9sDDmkRsJZRTVKb3di6FD44hfh6qtVWzdq\nlJowXbTsUyPSD1ifiapT6JECjvXjADXBbIlwfT6QgfqCpAPPisjSsDYJaFqFwS30E0zjICI3hV2L\n+gx7X5ptWmCFsXwR2Wavp6EakGQ0FUKJiCxo7/g6EpuU00unkILujDoG3GuMOQx4W8Nvs+kplgGX\nGmMGow7FjVa4mWf7SDLGTBeR1WFzvhTgq1/9KmPGjAk+f8+ePRw7doxly5ZRVVXFggULyMnJOelY\nNgsWLGDOnDmMHDmySX1dXR35+fkcOHAAYwyZmZkR7/faAVRXV5Oens7ChQubaYu2bt3K4sWLqa6u\npra2lilTprBkSXdM7umIxsCBanIaPbr1tkePws6d8OabKrg0NKjmo75ez/2lrk6PH3+sgo740nKc\nOAF79+r93dAN8owhEGiaHLZPn9Dn/v1h2DA47zwVYC65RLd/Jyc7n6vOwGlwWp4h67EAACAASURB\nVMG+9KcRehFPjRBnpQBN8tjLno8HnrV5ndbZumRUYJjs8+2ZF9ZPGpopOws1NbX5GdYUdCWawHK+\n5wNj26ajDtI32fNxQJkxJklEprV1fKfANHus8rQ3dkxlNPXXqURzSh0UkYXGmAGosPeWXfMvevMG\n3gYO2fMKYCpqAhsePmfPyfi9997j6quvZs2aNZSWlpKfn09NTQ3FxcUcPHiQlJQUyss9ZVPLhDvK\nV1dXU1JSwpw5c5rVZ2ZmUlpaGtxGvnRpE7k3SEZGBnPmzGHu3LnU1dWRlJREYWEhKSkppKens2bN\nGiorK1m4cGEwQ+5zzz1HVlYWNTU13TZFhOPU6NdPnZIvvfTU+5o4EZ58UgUgTxiC5mYgY0LpMLwc\nY/7zuLiQGaehQYWnXr3UBDRgQEgAO3w4eu6yxka95+yz9Z5AIGQiCzeZ+c+9rfciOobERO3j6NGQ\nCWjAgFDqDRG9t65Oy3e/C489pvccOaJ1oP14vyWOHImc98zTrh07puOPJMT07lFvuDMbp8GJTrkx\nJtF+PogKDsVR/GO8LNgenuYjm5DPSQGw2RMeIJhsssB3vtUmipx/ks/wCP8tsBafX46IPGefM8Vn\nMmp1fO3FJxyuQHdUTfVdXmWf94qvbieqxck3xjwNPI0KOKm2vzR0N1utbWdQYbAUjXa8F9Vshc+5\nH8C5555LSUkJTz/9NElJSdx88808+OCDVFdXN9GAeDulWiItLa3J+aFDhzDG8Nprr3HgwIFg/fz5\n8xk9ejQJCQnBfj1H5CNHjgTrysrKqKmpYfjw4cG6O++8k5///Of87Gc/47zzzqOyspJbb72VwsLC\nJru5hg8fHpzX+S14IdbV1bVpbmcqsT5/0DXYtq35GkR6mbeE54MTzvvvN69rrZ+jR6Pn/ArHE8A8\nGhs1l9j+/U3bRXPYVYGnjg8+qOSDD5peO3JETYbt4eOP29e+OxDr/w62b9/ufezXKQ/ojPwPHVXQ\nF3ED+gIdgzq5NgBjWrgnHoj3nY+39y2350n2fG6EexvRF3143fr2PMPWLQkfKyoYNQLr0azc3nEz\nmuJgXHvH14a122/LDvuc74aN3Xve4rD7lwEfoJqy59GM4p+ipihQoWUuoW3oYp8nvvLtCHN+JayN\nK6644oorsV1u7wwZoqdocIzo9uNCVKNSbk06zTQ4Xp31g8kitFXZ83tPRhe0+mQH04ZnRMN79hQR\nifi7xpp5Tml8YYwL08yEE83T96+Al0sqICJ3G2PuBHobYyaJBvubhQYB/GegTkQGG2N+iybeTLB9\npOCbszFmCHAT6hh+1Pe824D70L/v822c2xbb90RUY+Tna+jfxau/Es2EHqn/LcB2e483lu8B/wU8\nauvGAg8B96CC4jhU0/YFdMeYw+FwONpHPzSZ8/rO6LxHpWoQdcStRB1zV0VqY4xJNsZsARJF5G7R\nuDB+klFzSvLJjqMNz4iG98yUVtqc0vjCaKu7XJPn2Tl5we2PWN+Zv9n+cq2J6l5gBvAiuitrBmqK\negHVNG2jbXPuDB6lqdBzATr2C9pw7xNoBOdvAgNsXRbwMirceP35jw6Hw+HoTnS1GaqNZha/mccz\nqTQAsyLcU0Vzk1IjsCbMnLTmFExULT6jBRPVZCKYg8Kut2t87Vm7KO289dwRVp8A/BLVkDyHmqhG\noqapBlSIedG23Wv7eAmNNF0HjIw0Z+B2ul4d6oorrrjiSvcpMW2iCiIaA2c2UASsMMY8K6HdQEno\nC3un195uf/bjOQRPMcbES3MzV3j7JrTxGX78ZivPlDXfGFMmGrHZ62MF6gBccyrjay92PSuBNC8S\nsa2vM8a8aZstEZENdpwrUS3NPwEp1kz3MZqc8ypgOioMefGJmszZ1vHYY4/xxBNPMHnyZEaPHs26\ndetYvHgxBQUFbY5fk5mZiTGGP/zhD1Edem+99VZ+97vfISLceOONwcjHAwcObNLPBRdcwJNPPhms\ny8/PZ9GiRU3a+amvrw/299BDDzF27Njgtfvvvz84r2jk5eWxbNmyNs3zTCTW5w9uDcCtQazPf/v2\n7cyYMQM6KZZddxdwBqHSXTKwzasUkYeNMTlY/xdjTIaI1KFaC4Asu626Fo1VI0C6MWYmqoHIRzUs\nlcaYXHuft3062cZ5WUzIhOc337T1GVWoSWSqMeYgmtNpnfUjmoduKy9DTW5ZaBwdL05Om8YXQfiJ\ntHZtibk5FRX8VqG+Kp7Q5uXfutIYMwmN5VNujKlFE23uMsbMQf2FPgIuQR2wewE3A89ZQakA9X15\nFjXzMGfOHIYNG8axY8cAeP311xERkpOT2x0AcPjw4c12UlVXV5Obm0u/fv244YYbACgoKGDBggV8\n61vfYuXKlQwePDi4nXv37t0UFxezcOFC1qxZQ3l5OcYYBg0KyZPJyclMmzYt+Kz8/HwKCwu55557\nyMrKIj09nbKyMrKzs1uNTpqQkNDpgQ67M7E+f3BrAG4NWpv/M89oclibaq9H00ocnKPNbugIusr8\n1IrZZDy646bBlh003+WTgO4O8q5PsvWzCO0amuszF+339wHMtG0aUAenkfb8u/bzeELmmAZ0x1C8\n7962PGOzrVseNva5vmfvAG6LsAYtjq+FtZscYe2CY2/hvnhgjR3zclveQYWk69DdUDtt2x8DX7Gf\n1wL/i2pxvL/BW2ieqmhzlqVLl4pHUVGRDB48WAKBgKSmpja5FomSkhLJzs6WQCAQLIMHD5bU1FRJ\nSUmRxMTEYP3dd9/d5N5Vq1ZJamqqBAIBmTBhgtTU1Ehqaqo88MADUlNTIyIitbW1kp2dLZmZmZKa\nmhocm1e8diIiS5cuDfaXmpoq69ata3HsHrfcckub2p2pxPr8RdwaiLg1aGn+774rAlq+8Y3TOKjT\nSEVFhWeiSpdOkCW6ZTZxR9djjPkauosoEY1tUwdMQgWoOagG5wFjzGrgX+xtQsip+SURuSZCv+lA\nxQ033NBhuag6msrKSoqLi1m8eHGT+l27dlFSUgLA3LlzT+kZEydO5KmnnjqlPnoysT5/cGsAbg1a\nmv/jj8Mdd+jn738ffvKT0ziwTiCaBmfjxo0QS9nEHd2CS9AtfIJqXxLRbdTpIpLja1cCZKKBAP8P\nGj/nbtQMF5XTkYvqZKitrSUzMzNiCPGRI0cya9YsiouLu2BkDocjlvjzn0Ofv/CFrhtHR9EVkYx7\n1DZxx2nlekLbxBGRrej3Jd0Yk2adrZHQFvmJwBvAvwMfisgLp3m8HYLne1NVVRXxelFRETk5ORGv\ntYfuoKnqSmJ9/uDWANwatDR/T8Dp3VsTfzrajzNROSJijNmEJsbsh8aUOQHcicaIAWuism1vB36H\nRinuD4wCtopIMxVNdzdR1dTUkJqaSkJCArNnzyY7OxtQp+WysjIWLlzYJEmow+FwdDT79mkSUFDh\n5sUXu3Y8HUFXmKicgOOIiDHmBeBqdPfX2zawXyXwKxG5K6ztIuBHItLL7ixbgmp7LhOR18LapgMV\nFRUV3dJEBeprk5+fT1mZ7nDPzMwkOzv7lP1uHA6Hoy2sXQvT7L7Z/Hzwpec7o/CZqJwPjuO04qXq\n85KKGv+5FXhqRcSL2yM2zYT3JW1EY+U0EXB6AiNHjnTZwB0OR5ehSg3lTPC/6SrOKAHH+oVMAVJE\nZE5Xj+cM4BjwkjFmI3ADKrR4flsLgU3AA2iqhmOoo3FfVBjaRyhmUDPy8vK6pYnK4XA4uhrP/yYQ\ngGuv7dqxdBStxMHpHDpj73lXFEJxa9qczsCVFtfTW8tL7Pl01OnYS7mQhpqvQCM7f4JmfB+J7rz6\nlAixd9DknlJRUSGxzOOPP97VQ+hSYn3+Im4NRNwaRJr/hx9KMP5NZmYXDOo00tlxcM4YDY5o2oNy\nY0xjV4/lDKE3KqSs9WlwAOLs0a/B+VfUAbkEDTIIsEtaiLQ8Z84c4uPj6d+/f7CuJQ1OTY1awpKS\nkk5yOp1Le8e3evXqmNZWxfr8wa0BnP41OHwY3nwTtm+Hqip15t23D44dg7g41Zh8+il88gn06wcX\nXADDh8PBg1BTA3v2wNGj2n7IELj8ci3XXguXXqr3t4dI8//LX0KfzyTzVFdocM4YAcfRKfRFIxb7\nnYwDANI0Fs7lwL+hGbgn2LpUY8xcsTutwtm7dy9FRUVt3pGUnZ0dDLLXHenu43M4zmSOHYMPP4SP\nPlIB5MQJaGjQcuwYbN4M//M/8PLLqhvpKPy7mwYPhhtugC9+UQWTSy/VLd7t5Uz1v+mKODhOwHFE\nY6g9+p2MBRgGzZyMV6LmqlH2mqCRj6N6xe/Zs6fNA5k6dWpQQ9Id6e7j62pE4IMP4O234Z139Bfz\njh0wf77+Wm5ogMZG6N8fBgyA1FTIyYG+fbt65F2DCBw6pC/mhobQy/rwYXjtNdi2Daqr9WW+fz+c\ndRaMGAHDhsGBA7q+9fW6pt7aNjRAr14wdCicf76usycAeMVr19AAffro3yMuDo4c0Wf37avaDH8Z\nOBDq6lTDsXcvvPcevP++tj9yRMfeq1eo9O7d9Py11yAvr2ndkSOqKdmzRz8fPx69HDumx4aG1te1\nIzBGNTtxcfo38nPgADz5pBav7dChWrx7+veH+PhQefNNKCzUeYvAK6+AF9jYGLjuutMzrzOVHiHg\nGGOmALOBAjTxZa49lgGzRBNtttbHfDQpZg3qB/KsiCz1XU+w/XvpBrKAFaLpCBKAHDQp5VqgHH2p\nZ6Ev8XEicshukc5FE1wWiciC9oyhlfH7x5diq/NFZKt97kI0wWa6iGyzO5ry7RiLRWRahLVMQbd0\nrxGRu8OuDbPPeMkY8zM73gbgemPMFmA0mrdqHJqg8x2b5X0R6rtzGHjEGDPc/3zbnsbGRiZMUGXP\nxRdfTEJCQkQJv7S0lK1bt+pk8/MBWLKkgCuuUM1PYWEhlZUVjByZxNatlYwfn813vqNBlEVg3boS\nfvnLIr773Xyqqqr4wQ8WMGlSDg8+uILa2joWLdI+d+2q5oor0vnOdxYSH58QvB/glVe28tOfLubt\nt6upq6vlllum8IMf6L7Np54qZcsWHV9enva1aFEBl1wypkkf4cejR2H3bs/SHrlNRxw7qo/GxtDn\n8OK/Bvpyq6nRl/Crr8LWrfrrOpw33mhe53HfffC978GXvqQv0bPOCl0LH2N7P5/sfeF9iEQWDiJ9\njlT34YewYYN+F+rqVGDZtAn++lcVFNrDSy+1r3134mc/O33P+vznYexYuPhiuPBCFdKGDdPvlydI\n9u2r54cPq0C+ezcMGgTJySoc9uqlfdXV6fd7yxZ1Cv7zn1XQ8xAJmcBawv631oyMDEhM7Jh5dwe6\nwkTV7ePgGGMmoy/cJFSgqQYqUGEjG6jyNAe2fSNQISJX+uoK0KSYvez5eDSz9RQRWWfr1tq+Ftrz\nuQBWwElDBZfZ9r5KNDFlMup3UoZmD/euFaI5mzIklCG81TG0sAbJqG/LeBF529YdQBOOJlrhagWa\naNT/zCQ7rmIRmRa2lqvQ9AvJqGCUb8ftXZuMCmpVInKhjV+zBfi1iNxljBln512MCoQJwBDU+bjM\nd+xl/1bz7VpeA7wAhl69HgcuRNeZiEflQTTW4O+C7ZvWb7bnm9AE6IWoHFVu2+wBbgMOoVa0j9F4\nhRPRTXd3AvX2vB64ALgIlf22A78AHgp7Rpa93tL4WiIPzWoRq8T6/KEj1qBXr5a1F4FAqHgCVvei\n5TXo3bv1EhenQsmgQVr69WuqEQoE4DOfgWuuUQGls2hsVL+eLVtUy7ZnjwqxBw+q8BSZ5vPv2xfG\njIF771VB7Exm+/btzJgxA+BaEen4cIad4bnc0QXNa9QA3BVW72XNnuSra7aLyrb7yHeeYNst99Ud\noHnG8rm+z+PD77H1O+0YPheh7eL2jKGF+W8BvhthTU4QynC+xI5jTIRnrAm7r0ldpGu2v8PADDTT\n+LvoTqmZtm0asMs+8yk03X0jqmH6KSqIPoAKTI3Aenvf7baNK6644oorrghwe2fIDj3CROWjJuzc\nMxNlAy1pQaaEnWdGaLMFyDfGHBBrNpKmDrJeTJfasPsq0Ze4TzlJtT0OaucYmmG1MOnATH+9HWOb\nzFth1KJfqEiR7PzXBqC7qB4Ffo6qNU4AdxljpgJXAMeBd9Ct4X1RQcagP0sAnhCRGmMMqDYIYD3w\nR+CfgTuAt9ow5ntRNUt4+wH2eNgerwSWo9nPvVTgtwH3AfOB51vp07t/nm07GlXL/I2QD5JBBb6z\ngf9E1UfRxudwOByO6PRD3x/rO6PznibghOM5sSa31EjsdmVroslCTScQeumCmqA2AAXGmFxgqmiC\nyZPBE4aC/bdxDJFIR1+s4YJVpyIijxpjfoBqgV5HhZc/i0gWhJyMUefi54wxO4AfA78F9gKvSYSE\nmyKy3xjzOirgvCHWnNYSxhgvqnLE9hHWtFFs2G9jjOeiXyO+UODGmBeBrwMXiMjvbd1gdK23ikil\nFS4FuElE6k92fA6Hw+GISqdl2urpAo4nSFS31Mj6sKxFnYbvtnVN2lhNQwbqfzIFqDDG5IrIqo4Y\naFvGEIVk33FXR4ylHWSjWrPbUM3FT33XFmITblpBYBMw17ZrRAXGZhhjhgCft6cXGWPaEjnC29EV\n3n446lNUgv7dPAZZnyGAEfaY5KsD9ePaDXzfGPMyqgWaA7wM1Nq219u2/2yMaUkzE218DofD4YhO\nUIMjIvs7uvOeLuB42o8trbR7FtgpIg9Ha2CMSRLd8jzN50C7gqYvzlOh1TFEoRIVGqYCz4VfNMaM\n6Qytgd21NdWebkSFneuBPwFI0zg4L6J5pzJRYaOviOyK0vVNwC328+oobaIRrf0iWzwmEIrH4xEx\nHo9lY9h5RRufG0575+NwOBwONe8/3tGd9nQBZypwUER+Ga2B1S4koc7AXt2gCE3z0V/wWJNLLrDC\nGDOyhZd1m2jHGCLhCW+zjTFlIlLq62MtId+c/agglAl4Ak9wJ1l7EZE6Y0wJuiXJyy81346h3DeG\n9WgeqlTgR7Y60RgzW0SKInS9y/tw2WWXkZiYGNxq/MUv3sT113+JTz/V2BbecfXqB9mw4VHmzHmI\nESPGcvw4vP/+bh566FZGjLiKm29+iGPH4OOP6/n9729k+PAs0tKWcOIEvPfeOl57bTGZmQWcf/64\n4I4SY+Dll/O55ppFDBw4kLg4jf3hHfv0gYaGeu6//0bA8O1vP8Tll48lLk53bvz61/dz002TSU0d\nze9+9yBPPPEoixc/REbG2CY7PLxdHOHk5eWxbFns7iKK9fmDWwNwaxBL83/mmWdYv76pq019fb0X\nBmRXZzyzJwk4BjV7PAdBk88C4K5gg5DQ4BcePDNWlo0XU4vGohEg3RgzE93qnGOMKZBQdmwDVPuE\nmyFRxuVFKkgmJFikhLVpyxjWSoTUBlbQyEW1ScXGmErUJJcFzPPd4/mfFBi1faX41iHLGDPTao9S\nCWUGDyf82rP2uAF1Mv4m8KwxpgzVLGWhjsZvoPuuVwGXoPuwFwFFEf4mR/Vg2L79WhoaZqNLPokX\nmnnseFwL/Jbly18BrkKtZuMBeOedTfz3f5fb7isAw+7dNezeXYnKv8cBYcuWZNSdyWMVUM7atYam\nX5dkYBq6SQy83fM//7m3NTwdXepsysu9mD06vvx8//gmBXsMBELbWb1jfX0Ct92WHjz3infuCVl9\n+7Z+7Khrffq0P9T8yZKQkEB6enrrDc9g3BrEzhqIaFDCTz7R4IVHjujnxsYE6urSm9R71/yfJ0zQ\nmFA9mfT0dO67774mdb5Ixkc745k9ScARoNoGmfNsdZNF5HkIOr16gfCSjTGLgZUisssGoCtA49is\nFJE5xphaNG5MshUiAHYaY4rQl3wiapbxYtYssX3PNsZUicjDVlgZZ8dSYIzJt/d6bYOChRVSlkQZ\nQ0ok4SY4cZFVxpj9qN+L53QcnLtts9UGElxon3O/iCywYy8Gyowxs1CNj9jxJns7xSJcu9V+9vr/\nljHmX1BhbTwwCvgOmoTzM+iOpn+x9wwAjlszl7cW3t+kWHu8mBMn1trel0ebumUWUIS6MPnbF6EC\nSBEq+65AhZVVaPiftfazse2qUTch0LiNxejmtxo7Lc+Pe6m9fyS6GWsIumGv3LYtRN2SWhuf0tio\n/7kdO9Z0Vu+808q0u4DevU9dqGrt2Lu3Bk97PEwh3VJIro6+1h2e9c478HALBuvuMK/OXqeaGvj5\nz0/Pszqiv4aG5sJHWz83RsmSOG5c5Ho/Awb0fAGnK+j2gf4ArCCxBMgWkWZ+KI6OxxizDLgVNa2V\noqkXbgT+GxhLyMF4NSHBxq/9+b6I/GeEftOBin79biAuLoFAIGTGueCC6SQnT6dvXw3W5T+2tc5/\nLS6OoPkrvPzjH5WsX1/MzJmL+fRTguW993bxwgslHD8OX/jC3CbXvHLihJbjx1s+htf5P+/ZM5FB\ng55qcs0rscFENHxSLOPWwK1B2+b/3e/CAy15EfYAokUy3qjJtzL8u1w7ip6kwXGcXoYD56KCy1xU\no3UHMCTMwbgE9fuZBryEfqeOA//TUucvvLCsy1TTtbW1jBmTSV1dHWefHX51JHfeOYvi4mJmzox0\nd8cwcWIo54wfTyDzND7HjoUEK+/zyR474p7YEcAcjpOjVy/NOeWVs86K/rm8HKZNa7lN//7w2c92\n9axOHZds09Gd6I2mWTDAl4AxQBwQZ3yJNkWk1BizBA2MV4oGxvsj6oMzOVrneXl5JCQkNKmL9A+g\nMygvL8cYQ1VVVcRs5kVFReTmRtzl3mFEm6cx+h/kWWc1zb/UXWhsDDmAn6wAdfw4VFZOJ9L/ay1F\nTujoa139rJdfns5VV3X/eXXmOr344nSuueb0PKsj7gkEWhdG4uKi9xvO6tXTOQ3/5XULXC6qKNg8\nTvNoQ94mR8dgjHkKuBnV4OSj0Xz/giZOuQBrorJtZ6LOLn9GkzgNtfcNCvct8kxUFRUVXabBqamp\nITU1lYSEBGbPnk12djYA1dXVlJWVsXDhwoiCj8PhcDg6Dp8Gp1NMVN0+KJn1v/E7v85t5RZHx+Dt\nGku0gswR9G8wzJqoyu32d4Dz0OB+P0HNWF7KhtaiNHcJSUlJVFVVkZ2dzapVq8jJyaGwsJC6ujrW\nrFnjhBuHw+E4A+j2JqpTyLnkODUCaPrtl4wxG4Eb0MSa3ndmIRq9+AF0i9/7wNOEYubsQ52PlxCB\nrjRRAYwcOZI1ayKl43I4HA5HR+NMVI6TxmpTpqBbzueE1VcA89sTRdkY8wJwNZpr6m3rd1MJ/EpE\n7gprewfwGxGJM8Zch5qyQCM3jwpr2+UmKofD4XB0PTFvojpVjDGzjDE7jTGNtjSzPxhjEowxK3xt\nNhtjJkXqrztiY90U2BLuujkITZjZXmnCSyDpZUk3/nNjTJrPRJUGvGfTRvyVUPycqLF9AEpLS5kz\nZw6BQCBYRo0aRWpqKqNGjWLChAmsWtVRmTK6F+G/ZGKNWJ8/uDUAtwaxPv/O5owXcERklYikEkrI\nWW6MiQ9rU2e1Hvlo6ocre5Izs4iUh23d9l/bivrR3HMSXR9DTVTLgUdR3xrvO7OQ0C6py1HT1SYb\nvNAThj4TreO8vDweeeQR9uzZw5AhQxARbr/9dnbs2MHOnTupqKggOTmZ3NxcrrzypDNOUFNTQ01N\nTesNTzOx/h9brM8f3BqAW4NYmv/q1auZOHFik5KXl9epz+z2PjgdSDUatG4QGsL2pghtKmk9cWeP\no6UoyS1wAugD5IjIP4wx04HHgE/t9cXY0L8iMsEYsxMYZc1ZngZnX7TOly0LxcHJycmhtLS0iXNv\nfHw8K1asYMuWLVRWVrJu3TomTWq/Ui07O5uSkpJ23+dwOByOjsPFwel8pqKB6bKMMYtFZGHY9QMR\n7olVeqPOw/caYyoImbi8KA9BJ2NjzGRArHAzj5Cmp1kYPQ+/k/GWLVtobGz0kq41ITMzk61bt7J5\n8+Z2CzhTp07tltobh8PhiDW6wsk41gScStQRtwTNjL3Fn507GjZhpJdTyUukWRCWVXsKmmeqwLZZ\ngiYnykcTH0215+VoYqMsO55xInLICga56NbqIhFZEDaG+ah/TQ0qbDxrd5i1NvbJtl8RkZt89VWo\nQOeZ7oxdGyHkxyN2rAvRLJQBdDcVYSax64B+xpj/tfcsQBM2DYg2rkganLS0tGbtqqqqAEhNTW12\nbevWrSxevJjq6mpqa2uZMmUKS5bopq3S0tKgwJSfnw9AQUFBUEtUWFhIRUUFSUlJVFZWkp2dzbx5\n86IN1+FwOByngNPgnAZEZJ0NHJgPrDXGpPgyhjfD7vopA24UkVds3Sw0q3aBiCy0QsQS1ARWjaY1\nqEKTUiahAkMWIQFpPiowlAAlVth41rYpBOYZY34vItvs8wqAuSLSy56Pt8+vaslXyO58utL2+2zY\n5Z1hAs88VMApFpFtxpgT9tIjqACTCmwErjTGrLHz9fxtvo1qbc5Hoxn3s/f2jzCsfgDbt28PVhw8\nqH7M7733HpWV6khfX1/Pr3/9a5577jmuuuoq0tLSgte8+3/xi1/w0EMPAbBp0ybuueceKisrWbJk\nCUlJSVx33XXU1NTwzW9+kwsvvJDGxkYqKyt58MEHefTRR9m8eTOgW8bvuecejDGMa0vmuw6grq6u\nyXxijVifP7g1ALcGsT5/33ugX0vtThoRiYkCbABG+s7Xoy/lHb66NGB92H0V4XW2fgsaF2aMPfdM\nM2sitB1vry0Pq99p+/hchLaLw8b+ke88IUp/jcDmsDqvbfi8xvk+D7JtPgLibd0yNKeUp5FZDuwC\nPrBjfhrNUfU/wMe2XYM9euXtCGtxe1gbV1xxxRVXYrvc3hnv/ZjT4HiIyE3WMTbZGLNGRKaFt7Hb\noNNQs1M4K22ZBmxDtRkCRIoe5/n21IbVV6IanoO+Os9kNMhXNyXsvswIGQbBDwAAIABJREFUz4iI\niNSZCIlVpGlW9lXo2PMl5JC8m5CG7yvAJ2gCzjfRzOI/Rc1lhegOq2tEZJTVbs22Y6yPMKT1aLTj\nXaiPD6g2aDzwX6gjM8CF6C6tyXYsdwN77LXRaM6rv6EaJLHHeNTv5z+BzcC9wJ32eW/5xuCZzg7b\n45WoAFeKOk87HA6Ho/PpB4xE3wsdTswKOJZs1JQ0xb6Yw3dQtRQ7Zksb2pwMnjAUTHPgCR3WFJaF\nmsyatDlZjDFZqBCxRUR+6btU4z0euAfdUbVYrFnLmr+usddfAm41xsywbf+BCjiftHc4vs9vocKG\nASYB/w181V4bbp87H00h0V48wWYccBXwsj2Pj9zc4XA4HD2NmBZwRKTGvuDLgBWoKSYSyRHqasOO\nnYYxJhl1UF4hInfbuo7qfiUqLEwNq/88Ic3I19CXvz/F9kJ7zQD/Afyzr90t9t5I3IRqXyLxf2yJ\nxGdRc6Gfv0RqGIHWgk14GrIJtjgcDofj9HEH8HhHdxrTAg6oqcbuUCpETVF+Z1zP+yuSlsYzIW3q\nxOF5PIs6Bbc51UJbsM7LScASEXk77PLrvs9/FI1Q7GcNKtxNBvqKyAvGmGtQQfE5orMLYN68xxgx\n4mIAfvWrfLZte45bb72XrKw78WQ3Y+Cjj3bzwx/eChgWLnyMz352NFu3lrNqVT433fR1brvt3ibt\nASoqysnIGE9p6YOsX/8oP/jBY4wYMRpjtM38+RMZOvSzLFjwEIEABAIwfXomY8dmce+9S2hshMbG\nSOvV/BguZ0a6FqlNYWEe+fnLWmwTqb4l2pt1pTOztPTurWXQIDjrrObX8/LyWLZsWecNoAfg1sCt\nQazPf/v27cyYMQPse6GjiSUBZzBN/VqCiMgDxpixhPm6WA1PJZBm0xBs813ORn1nOjWXgPUDSkId\nkr26iPNoZ7/JqGP0ARG5L+zaEpr6onzTmp/yrU/PClSQqUE1OAONMd8DLkGFnl62PtI4jwIsXVqE\n+j+DWrQaefLJD3nyyXBZ0rPGGe6/39timALk88wzv+WZZ2ag7jsec2wZAwwD4Mc/HkpIRq0B9vDh\nh5cwY4ZXp0q4l19O5OWXT1d+rARycs78XFy9ekFGBlx/PXzmMyHB5+DBBLZsSScuDvr0oclx8GC4\n+GIVjs5kEhISYj4f25m4BiLwwQewaxfU1MCHH8KAARAfD8eOwfvvw0cfQb9+cOBAAq+8ov8OevWC\nEyfg6FH9gZWaCpdcAkOHtu+HTnellTg4R5vd0AHEkoCTbMu2SBdFJMc6HYczFfW3WYU6o3oCxmxg\nps8pN5WmPiR+hkSpT/SNzRtXSlgbzycny27lrkW3nQuQboyZiZqvvBQKTV4LPmEo3MzmmaZywtpn\nAWIFmTrb3zdRP5Vddkv734E62+bvaKqGn6BC3wF0NxWoA/di1HcnLJryMkJCRzYa9HhE2BBLUKuh\nQYNPeySgu/wL7b1Ztq8ye+5FRE6xUyxGl7qGkDBUhiapH4RavgyqsHvYLolzx+kIGhpg0yYt4eTm\nNq/zc/75cOONMHUq3HSTvhAcju7EwYPw6KPw1lsqzOzapeVIOzwDv/Wtlq8PHgyzZoEN8dVjcXFw\nOgFfoLsEYJUx5kppHsHYIwt9cwaxWpwke+9mQs7FUyQUp2YWMBN9mxYYY5JF5AF7bTyhIIGzbeya\nh62w4gVdKTDG5KNvWa9tljFmpm2ba+tnAytFZI7N+TQLfYunoOY1ISRUrLT1ub76uUARKqh5z841\nxnjZx5PRXWO5xpivEfKjOYw64wrwFHApapp6ADVlXW7H7qlbQCXy7wOlzYUbGDEij8bGY9TX76Wu\nzrOOFTB4cAkiwtGjB+nXbzDnnZfDjTcuISFhpP17eH+Xxbz88hC2bVtJbW05CQk1fPGLhYwadZuv\n3SwefbSIurq1XHghZGUtp7ERXn21iL/+NZ9+/Yq4+OJcLr10BZs3D+KNN1ZxySVVXHttPIGA/moK\nPa/58WSvAWzYAFlZLbfx+mnPr7f2/tLrjL4bG/WX6LFj8I9/wOuvt35PJPbsgd/9Tkv//vBP/wTX\nXAOjR8OQIfoff1ycmhjPPReGDz+55zgcJ8Pu3XDddSrQdCYHzpD4+l0RydhIZxriHT0Wa6b6N3Qb\nXzKqAnkZuM8T3mw7L8jh06iD8DJ0S3eWiLwQod90oKKiouKMU023h4kTJ/LUU0919TBOCx9+CBUV\n8MknKvicOAFLl07k299+iuPH4fhxFYa84549Khht2wb1kQINRGHUKJgwAcaOhc9/Hi66CAYO7Lx5\nnSqx9B2IRk9dgwMH4IYb9Hvqp18/GDkSkpK0jBwJw4bpd7+uTgXyoUPhnHP0u75o0URmz34q+O8i\nLk77OHEC3ngDXntNn1FQAF/7WlfMtHPxaXAyRKTDIx6e8Rocx0lzPSFTEyKy1RgTQM1iaUCtiNSI\nSKkVhiYCbwD/DuyOJNw4QoSras9kzj0XvvSl8NrptLYEx45BWRkUF0N5Obz7bsvtd+zQYoNbA/DZ\nz6o/z4UXwogReh4XFxrXddepBqgriKXvQDR60hpUVsIzz8D+/fq99ISb5GT49a9VwB46tH3fp0OH\nWv93AJ27IeBMxmlwHBExxmxCTVH90EB+J9CgeU/YJpt8Zrjb0a3fr6DpGUYBW0WkmYrG0+DccMMN\nwWSbHpFstA6Hx7vvwt/+Bnv36i/ogwf1l25DA2zfDi++qOftITUV/v3f4c471QnU4Qhn1y5YuBB+\n//vm14YNgxdeUCHH0TLRTFQbN26ETtLgOAHHERFjzAvA1UCSaJbwNNQL91cicldY20XAj0Skl/Ut\nWoI6PV8mIq+FtXUmKkenUF+vLxvP72f7di21bYhUFRenJoevfAWmTFFtjyO2aWyEn/1MhZtjx5pf\nHzEC/vhHuPzy0z+2MwVnonJ0Fe/bo5dGwvjP/WYqWy/Wodr7kjYC/wQ0EXCiUVNTQ1JS0ikP2hG7\nnH22msL85jAR3ZZbUwNvv62OoV6cow0b4Dkbsen4cTWDlZfDd7+rws6UKerPc/nlkWP5OM5cPvwQ\nvvEN+NOfQnXnnAPf+56GPUhMVLNnnz5dNkRHG+iWAo7dtTQFSBGROa21d3Qax4CXjDEbgRtQocWz\nMC9Egxw+ALxo2z4N9EWFoX2Etrg3Iy8vj7i4OHbu3MmePXvo378/y5cvZ/r06dTU1JCRkUFhYSEz\nZ87svNm1g+44JkfrGKNmhGHD4Oqrm17Lz4e//x1WrYKnn266G2bjRi2gPhXDh8MFF0BKCnz5y6rp\nOdPj9MQq//u/cMcd6uzukZcHP/whhFnVHe2gK3ZRdXmW7wjZpsejcV2aZcZ25bT+Hby/wSX2fDrq\ndLzYnqeh5ivQQISfoAFoRqLbyT/FZiYP6zcdkIqKChERqa6uFmOMZGZmikdlZaUEAgG5++67pbvQ\nHcfk6DgaG0Vef13kJz8RuegikdAm/cild2+Ra68VufdekV//WuSVV0SOHevqWTjaS0ODyO7dIjt2\niFRVifzwhyLGhP7O554r8swzXT3KM5eKigovm3i6dMJ7rNv64BhjGoEKEbmyq8cSixhj1gFfRrOb\nexqci4BlIjLXGLMW1eCUotqcZ9HoxxvQbeJvicjoCP02czL+4x//SEJCQlCDA3Do0CHiu8jrs6ZG\nrW7hJrOOHNPq1atj2qG6O89fBF55Rf15Kir087vvqtmiJfr2De2kOfdcjdx87rkarwfUGbp//5BG\n6W9/W83s2dODu7oijePjjzXyc2smsg8/VDPcqFFqPvE4dEif2btb6uo773vQ2Khzj49XDVxjo5oo\nX301VF5/HXbu1C3ckRg/XoP4nXdehw8vSHf+d9DROCdjH07A6VqsgPNVmjsZLxOR7/ja7QQ+RKMr\n70a1PCmo9idffDFzbPtmTsaBQICMjAw2b958GmbWOqmpqZSUlDBmzJjWG58kPTX+R0fRE+f/6ae6\ni+sPf1Dn0p2R4p63i4nAUyQkaCj//v1VqDl+XMP1Hzyon0HNY6mpGt35M5/RWCkffaQpAf7+96bm\nNU/I2bFD+zBG/UeGDg0JV4GAXvv4Y40VlJiodfv3a33//vqsIUPUwfaTTzQ675Ejug69e6v/yYAB\n2veQISrA1daqYNHQoMXzd/KKSOgoAi+9NJGxY59qVh9+7v9cX68CXV2djvu883QM3vbsd9/VGDJH\njug4hw7Vth9/3La/Sq9e8OMfw4IF+rkz6Yn/DjoS52Ts6CqG2qPfyViwCZ6swPMfqHlqOXCOiIyy\n1wSoI+Rw3GOYOnVqUIPjcPjp2xe+8AUtP/2pblXfulXjo3jHXbtUAGgPdXVaWuK997S0hR07mp6L\nqEDw4YcaOK67cSrv97q6liMJnzihjuWRiIvT7d2pqepPJaKC3V13adRsR8/ntAo4xpgpaLqBAjQ6\nbq49lgGzRKRVjyOb+TsDTSyUDjwrIkt91xMIpS0waPqFFaIJNRPQRENTUR+TcjSlQRb6Mh4nIofs\nVudcNEFnkYgsaM8YWhm/f3xe3ql80UB681BzzyDUJrnN7kzKt2MsFpFpEdYyBd2avUZE7o5yba1Y\nh20rnCxE134QUOLN0Y5vGnAFmqLhl8aYK4HPoVoZ7zvzC8AzQf0rEG+MGYMmg2pEBaN0mmcWHwhw\n00030adPHxISEhARduzYEVTXlpaWsnLlSowxrF+/PnhjSUkJRUVF5OfnU1VVxYIFC8jJyWHFihUA\nbN26lcWLF1NdXU1tbS1TpkxhSVgCl7q6OvLz8zHGUFVVBUBBQQFpaWmUlpaydetW/YPk5wevjRkz\nJuqYAGpra1mwYEGTPvPz8xk/fnzwmWvWrKGoqIj77ruPpKQkNm7cSCAQYOrUqaxZswZHz2PwYDVj\njPflevVrGD74QI+eFqVXL722b5/u7HrySY10e+BASDtijL54+/ZV7cTgwXD4sGqL9u+PPI6zztKd\nPRdeqGaXrVtV6zJihEbT/eQTfea+fe0XvrojgYBqbBISdO3C1yUQUGfwESP0+t69qvG67LJQufxy\n1XRFMw86Op4z2skYzV20EzVhrEd/9c+0nxuBHWHtmzkZoy/sBt/5eNtukq9uLdYR1p7PBeZKyDF2\nhb1nPeozMgaYZOs22HFNQp1l19rxjmnPGFpYg2S7Bp/z1XnJKePt+YoIz0yyz1gTYS1XAGuAzcAO\nO/ZI196SkJPvel/f48L6TrPrIGhwv+W2zRpb97Lv3iW+v+cauxbj7LUt/r+Db/51+JyMCwsLmzgZ\nV1ZWSn5+vhhjZMKECUFntJKSEklJSZFAICC5ubmSk5MjmZmZMmrUKBFRZzV/+/LycjHGSE5OTrCu\nqqpKUlJSZNeuXcG6xMRECQQCUldXJyIi+fn5EggEZNu2bcE20cbkPTcxMbFJ+6KiIjHGyIIFC4L3\nZ2dnSyAQkAkTJsicOXPk6quvlpycHDHGyNKlSyXWuOWWW7p6CF1Oe9egtlbkrbdE/vpXkWefFdm6\nVeS990SOH2/a7vhxkaNHm9/f2Chy8KDIG2+IbN8usm+fyMcfi+zdq+evvaafjx4V2b9fz//8Z5GX\nXxZ59VV1wt2zR+TAAZEPPhB59111zP7LX0SeeELkj3/Usb3yita/8YaOt6pKpLpaZNcukXfe0fve\ne0/7mjDhFtm3T+T990U+/FDko4/02QcP6nzr6kTq63Wchw+LHDmijsF+jh7V+/fu1T4jzb27Euv/\nDjrbyfi0aXBEQ/onE9Im/NJeetgYswEYb4yZJCLrWugmjZDJBEKJL7MB774soMr33AdskklEtSTF\nqHajWkJJN7cZY6rRF/QsEXkbwBizEt2uPo1Qtu+2jCEaa4HlXv+WxbZ4RApL1mS7tW8tC4BEsVod\nD2NMSrRrdgxTfH09Z+c+xRgz0rdGnibmBTvH/qj2a4B9RhqawBTb7lbbb6kxpgLVfoX/PipA0zmM\n3b59O0BQy3HkyBEqK9Wi9eUvf5nCwkIOHToUrEtKSuLmm2/mwQcfpLq6uolmprKykltvvZXCwsJg\n+0GDBjF8+HBKSkp4+umnOf/885kxYwa33HIL+/fvZ7/92XfnnXfyi1/8gm3btjFw4ED27dsHwOuv\nv05DQzBTRcQxAdxxxx2MHj2ahoaGYH1GRgYXXXQRhYWFXH755YwePZqxY8dSVlbG+eefz6xZs8jL\ny2PGjBkUFxdTWlrKuHHjiCXq6uqarGMscrJrcNZZWhobVRP0/vut3xOJSBmv9+xpuj3ay+V17JiW\nSEET+/dvGhjRy6vUFo4erWP37o79Huzd26HddSqx/u/Aew+gEfM7ns6QmqIVYB76i39cWP1k9CW5\n3FcXSYMTj2/rMSHtif++DbZuXpQxpNnr4doFT1vj7z8pQv+tjiHKc72+xrTSztOK+DU4Cfi0LLZu\nlm3XTHMU7Zpv7uvtOnlHT/vjaV+8v8dhVLpegGpyBHjNt17P2edU2msN9uiVayPM/3dhbVxxxRVX\nXIntcnuP1uC0gifCtpjRQ0QOQTCDdRbquwOqLfDIRV/aBcaYXGCqiGw9yXF5mpNg/20cQyTS0T9k\nGwLHdxrJdgxTRKQteZo/RiXr36Pzm4PGuwHVOs0GvgB8CyhG/ZKmoVnF35OmCTe9Z68H/gfYBRy1\n17YA2wF/vtwtwN+Ab/vqbgPuA+YDz/vqx6HaoS8AEX6XNmkzEWjpN969aM6tO4C3wq6Fj2kcUAj8\nBvVJ8jMaFea89l7b/wCeDOszfO4Oh8MRC/RD3UHWt9LupOiiPLrN8ASJ6pYaGWOSjTFbUNPL3SJS\nGt5GNHVABvrCTQIqjDGzOmqgbRlDFJLDjl2B9+yUFluF+Cn6Hfk6qhUS37WFhJyMz0dj4hQDi1Df\nndwIzzbol7mjuSDseLJtTpbhEerqw44Oh8PhOJ10ExOVZ764qxUTVRU+B1lfO7/pJsn32XOg9TsF\nt8dEFck01OoYosy9RVMW1iRF55qoPNPT4ihjmBzWrhgVaq6L9DfxjfUdrOM0mrahqoX5v0TXq0Nd\nccUVV1zpPuWMNlFNBQ5KyPG4GTY/VRK6Q8iri5QNJh81pSDqQJsLrLAOtLtOZZDtGEMkPGfk2caY\nMr/mx0YF9hIc7Uc1HZmEHJs7KtihZ06bb8dQ7hvDCnTXlZ8K1HH4C8aYGS30GwBSjTG/ts+Yb4yZ\nLSJFvjbe/McCpKWlcfbZZwOwceNG+vXrx6JFi/iSzZSYmZnJVVddxUMPPRTsYN26dSxevJiCgoIm\nTrn19fXceOONGGN46KGHGDt2bPDa/fffz+TJkzn//PODbZYsWRJ0bgbd0r1o0SIGDhzIgw8+yKOP\nPtqsn2hjmjFjBm+++SaPPfYYo0eHAjc/8sgjPPLIIzz11FMMHDiQ8vJy8vPz+d73vsdtt91GXl4e\ny5YtIzMzk4svvphHH320heU98/DmH8u4NXBrEEvzf+aZZ5qF2Kivr/dCc+zqlId2gQYnXBORjJqo\nbvPVDSJs6zghLUaD7WcWoS3VO1ABIcH25dfizA7rJ4vIGpxnaa45SfePt41jaJZ/KYJmpRF94a+1\n4/VrrjwN037bfgmhre37gZm2XQFRtqe3cm2xbwwbbP9NtnTbNWsEPkKl6+uA6+3nHWHzEVSD8zHw\nA1v/DvBulL9/AyDLly9vsv06EAjIggULpK6uTg4ePCjGGElNTRU/8+fPF2OMlJaWSjgLFiyQQCAg\nxhjJzs6W/Px8ycjICG7VFtHt216bjIwMmTp1qiQmJsrDDz/cpI0xRubMmSOVlZXBZ0UbU3V1tQwe\nPLhJLq2DBw9KSkqKrFu3Lli3cuXKJlvCb7nllqh9xgKxvj1WxK2BiFuDWJ//GZWLygayW4I6W2aj\nL2yAJSLyvG2Thr6gvZ/YhcBKEdlljJlprx2wdQ8YY5agL9qVInKfMeYAKogUoZqQRDSQ3i4bNK8A\nFSJqbf3DvnGBaiDy7b3eOPxtPaEj0hiKJLT1PNoaTEL9V9JR5+r53tx9bebaNgD3i8j/M8bsQE1G\nRXbtlqCCYLU3DnvvrGjXwvr3gixW2zE8Ya+NR4MfJqHCSBzwJdTBNxcVfB4BfiIiNXa9zwZ6AVmi\nWrMqoLeIfC7C/P8vsAgC9O2bxaBBK/noo2wGDJjDWWdN5sSJKo4cWcknn6iCKz6+gAEDZvPJJ2uo\nq1uASC29eiUzYEAuZ589t0nf9fUPcPjwShoaqunVK5mEhELOOuu2Jm0++WQd9fWLOX68kri4dBIS\nCunb98YmbT744EpOnKimf/8cBg1aztGj5RHHFAhoXqrGxkPU1s7ixIlq+vTJBKB//1z69NFUD0eP\nllNbm0tDQ40dVwGHD6+iV6/PceTIKgAGDpxPQsJiYoX9+ycyZEjshqgHtwbg1qCt8x82DLZsabVZ\nj6OzUzV0lYCTLSLhEW4d3QhjzDI0tk0SmlCzDrgR+G/UzLTJCnergX9BpXDj6+L7IvKfEfpNByo0\nd2dC2NXptsQCmocodon1+YNbA3Br0Lb5Dx/e9lQd3ZWuSLbZXXxwHN2P4cC5qOAyF9WE3QEMEZEc\nX7sS1F9oGupA3Bs4jm4Fj8q55y6jT5/0Thh2z2D/fk1QGKvE+vzBrQG4NWjr/IcN6/yxdDbTp09v\nljndp8HpFJyA44hGb3xhBEQjHMcBcdaMWCsiNaJRlZegcWlK0dgvxaiJLTyKcpBnnoH02JVvWL16\nOtNjRVkVgVifP7g1ALcGsT7/zuZ0m6gKUEfTKdJySgZHF2OMeQr4Mupb8yga2+YbwH+hsWQ2+fx+\nZgKrgD+jWp9RqIA0SGxgRF+/6UDFDTfcQEJCUxNVJAnf4XA4HD2frjBRnTYBx/rfLKAF51dH98Fu\nXZ8CXCYi/zDGTAceAwpFZKFfi2OMWQT8SER6+fysAuhutl1h/aYDFRUVFaTHsgrH4XA4YpzOdjI+\nnck2lwJLT9fzHKdMb+BTYK0xZiPqFQyhBJoL0ejFD6ApF/YaYz5Gk3IaYB+6Jf/hSJ3n5eU5DY7D\n4XDECNE0OJ2J88FxtERf4Csi8rbV2FRi/XLCHI33AEPQNA0lQA26dfwAUVi2bJnT4DgcDkeM0BVO\nxt0lF5Wj+zHUHg/ao0F3VA0DjVdkIzuDJq/8BCizJilBk6iV4YhI+C+ZWCPW5w9uDcCtQazPv7Nx\nGhxHNALAIeAln4mqgdB3xm+iSkGDAJYYYzagwlBJuIOxn1g3Ua1evTpm5hqJWJ8/uDUAtwaxNH9n\nonJ0JxqBeOCKMBNVPTQzUU0FvgjsBibYuknGmLnRHMmdicrhcDhiB2eicnQn3rdHv4kqeB5moloJ\nvC0iSfazoLmpOtwr3uFwOByOtuA0OI6WOAoUG2OeBj6PanU8odhvosoC+hljfoTm2BJUEEoHIqbk\niHUTlcPhcMQSzkTl6E4YVJjJRv1rXgBuR7eOg2Ylr7WfZwCvAX8B/oAKQ/WogBNOP4DZs2dz8cUX\nN7tYWRkbSp+6urqYmWskYn3+4NYA3BrE0vxHjx7Nj370oyZ127dv9wL99euMZ57WSMaOnoNNv3A1\ncD1wH/A5NLLxf9is6mtRDU4N8BtgIKrhgZCW514R+UVYv7ej6RwcDofD4QC4Q0Qe7+hOnQbHEY3N\nwGT7+fcisssYcwDYAiEnYysIVQEDRGSUrdsJnA/8NUK/69GknbtQE5jD4XA4YpN+wEj0vdDhOA2O\nIyrGmBr0y3c36meTKCLj7bU01ERVgPrcXAusAd6wdUdE5IIuGLbD4XA4HE6D42gRb+fUIFSISfFd\n85yMq4E01EQ1wF7rAxyO2KExQ4CbcBoch8PhiHWCGhwR2d/RnTsNjiMixpjJaNLMFCDZZ6KaIiLP\nRWiXDGSLyHPGmHrgJRGZEKFf54PjcDgcDj/OB8dxWrkSTcGQCnzJGDMGNUmlG2MOYjOJi0ip9cP5\nAVBmjHkNOAZ8M0q/uwAee+yxiLuoYoW8vDyWLVvW1cPoMmJ9/uDWANwaxPr8t2/fzowZM8C+Fzoa\nJ+A4ojEaGIvujBoIPAZ8A02q6Y+BA7qV/AE0lcOlwOMisjtKv0cBLr744piOZJyQkODmH8PzB7cG\n4NYg1ufvo1PcFZyA44iGAA0iEoxPYIyJA+LC0jRgzVfZQDG6pbzMGLNGRKZF69wF+nM4HI7YwQX6\nc/QEmqX3MMZMRPNW1QEL0O/VVGPMrGgJN10uKofD4YgduiIXlRNwHNE4AWCM+SXwJ2A6ujPqU1uf\nhvXDAa4AGkXkbnvtXXQH1mA0I7nD4XA4HKcVJ+A4olGNamv6ooKKoFv6qux1vx/OUaDaGLMcOAcY\njjooZwEPR+o81k1UsTLPaMT6/MGtAbg1iKX5d4WJym0Td0TEGLMU+HcR6eOrawRyRWRVWNvxwFrA\n883ZgHrFzxORdWFt04GKiooKZ6JyOByOGMZnosoQkQ5PyuU0OI5oNAANYSaqo0ACNDVRiUi5MeZT\noAT1xQmgWp+yLhm5w+FwOGKeThdwjDFJwBQgRUTmdPbzHB1GMirk+E1UvdBt4uAzUdm/8V5gJ1CJ\nBv6riOZgHOssWLCAc845h02bNlFdXc20adOYN29ekzY1NTWUlJRQVVXFihUrumikDofD0XNps4Bj\nI9YuBDy7Qi3ghVb2HEoH2fMsG9F2PJCLCjgVHTJix+miN2rCnGHPVxljGoA4CCXbtPwrGuG4BsAY\nsxhIbKnzWPXByczM5L777mPSpEkAzJkzhwULFpCbm0t8fDwA5eXlrFy5kpKSkk7dYeBwOByni67w\nwUFE2lXQwG8NwBURrsWjWajHRbhnc3uf1Y4xJQFJndX/mTauNo59HfAJsALNKr7C/t1/GqHtBqAG\nFXr3otqeg8Dc8HVABWSpqKiQWGPlypUyePBgERF5/PHHg/Vbt26N2N4YI5mZmadlbKcb//xjFbcG\nbg1iff4VFRVi3xfp0gnvsWYxTdpBM9FL1CSRfwp9nizPYn1Duhld07WTAAAgAElEQVTddVxt4QRq\nnvq5iJQCf7b1wW3i1jSFaM4pT+g9z7Y7KCJepOOevA4dRklJCYMHDwZo8ktmzJgxXTWkLiP8l1ws\n4tbArUGsz7+z6XAfHPElYjwdGGOKUQ1Bt6K7jqsd9Eadiu81xlQQMk3G2aPfB2cyICLytjFmHqqx\nG2SMGQfcTYR1iEUTVXV1NYmJzS13NTU1DB48uNl6OBwOx5lCTzNRjYxwbUmU+ogmKiAN3V68BXVQ\nXRKhTQJqHlmOmkI2AGn22mR7XwOw3pYx9toU23Y8MBs4AKzw9TsoQr/jw547245tkh3rFjuXNa2s\nUdRxtTZv+9xZdjwzUeFgg33uFiDetptn7z0Qvm5hc59l7ztgn5nQlr8BaqI6HNZXI9Zs5bt/PrAd\njZuzxbtm+3okwjr8CyDx8fFijAmaZ8rKyiQ7O1uMMZKTkxNUYRYXF0t2draUlZXJypUrJTExUXJz\nc4PXKysrZerUqZKRkSEpKSmSn5/fkka0Cf6+i4qKJCMjQxITE2Xq1KlSW1vb5jEcPHhQcnNzZc6c\nOZKdnR1s6+GfWyAQkAkTJsg555wjKSkpYowRY4wsXbq02fiimahOZc7dhVtuuaWrh9DluDVwaxDr\n8+9sE9WpCDhJYfXJ9mXWJgEH1Qis952PCxcefH1+zld3wD7fe9EvIcwnKEzAWAGsQX2D3vI9+0DY\nPbPs8xdL6MW/wfdyXm7HuMa2m9vKOjUbV1vmbZ+7wtatBxYDY1Ahq9GOabk9H2mFkwZCgl24cLUc\nFZTW2/t3tGUstt9P0MB+DegW8GPAHuAt3zgbbNv/Beba+ycBW4HHw9fBPlMmT54sgUCgif9JdXV1\nEwGnpKREUlJSJBAISG5uruTk5EhmZqaMGjUq+I9jwoQJwfvLy/9/e+ceJVdZJfrf7k4nnWfnQQSF\nWSadZDAqjzRv7hiveSEKiOGhkDD3+kiCOl6Jk5CA18fMcpkHuLJGZAEJukSRLALBKyJDEmFmoshA\n6A7O6LRMIAQFAvLoTpo8Ov3Y94/9na7T1aeqm6Sqq7vO/q111jl1zldffXvnS9eu/e1v70d7GEi5\niPc9b948vfbaa3XDhg06b948FRGdOnVqn8cwbtw4feaZZ7r6Xr9+vYqIrly5sttnxg2W6A/b+vXr\ntaKiQjds2NBjjEkGzrHIPJBI+x92VdeBqusg7fIX28A5liWqp0Uk/npcGGhf2YR5BwBb2hKR3cDl\nIjJJVfeENrep6oux960KRzZdg1HVzSJSC6wBxmnPoo8bMIPrd7H3bBCRJcD1oVDkzrDMNAdoUNUb\nAETkBeAKMhW0e0OyXvcmd/S5i4Hd0ecCz4R2s4FFkU5E5I7Q36eAZ2KyrwY2qeoPwvvvFJGtwGwR\nma+WgC/nWID12BLUCUGG0zHj5tuqeqeIbMJKNDRh2Ys/HA6AzeH8A+CkLD1UA7S2tgLQ2NhIZ2cn\nAC0tLQA0NTXR0NDA5MmTueiii/je977H7t27Wb16dZcSGxoa+MQnPsHatWtpaLD8UGPHjuXEE0/k\n/vvv56GHHuI973lPrn+Trr5vueUWzjnnHC699FIA6urq2LdvHzt27ODmm29m1qxZecewYMECTj75\nZDo6OrrGccYZZ/C+972PtWvXcuqpp3LyySd3vefgwYM0NDSwb98+GhoaaG5uRlV58cUXu94fJ2of\ncSwyDyQi+dOM68B1kHb5Gxsbo8vqfO2OmndqEZHx4Lw36/4YYBd98OBgv/4jD8XW2HlH6GMWtjTT\nSWxpJ8d4Ig/B6Vn3F4X787PuR/2uSugr24tzWXj9+Xzy9HVcfZE7q92qrD4jb82YBHlui91bHtpl\n72aL5LmtD2NZBbwe+/eej3m94vKMAU7BlrN2AVdjRm60dHZ6th5ibfzwww8//PBDgasHmgenm2dC\nVfcHb0JfqA1CXa6qLYmdh8BVbOtxIclXH+DpPrQ5FnqV+yh4K5zH96Ft9FOhti9jEZHLyST2m4wZ\ndc+EZzOwf5uJwE8xb01F6HMi8O+q+oyIfDqr2y3AAuBCzNhZgC15AYzClrq2YUHMAJ8EbsRiff4l\n1s8szEP3YeBgH2RP4m+BLwNfxAy7iPcADwL/DvxdL2NYC/wI+H5W3ydjeon6AJtfjcA1CX18G/h/\nWX1kty+EzI7jOAOFaizUYksxOj+WbeI9UNWbw9JSb9SG85Q+tKnN0+ZYSOq3OetcrM/MJ3cxiYyh\n3X0cy1zMkJVwvST27AbM47UWmAb8EvsiFszIWUJxOSnrXEiiDMwv97H9iQn3WrLOhaCYMjuO45QV\nRSnVEH7da/RrP4Hd2Bfhp4AebYL3piG0uQLosfVcRE7P038+Ii9GkpcmysT81FH02xd6lVst50yx\niLw8T2NGXL6xXIPF34AZLOvjxquqXikiz2PLUZ/HdqC9KCIKDMlj6F6AeTYikhJBzAtHnFzxToVI\nJJGrFsLlxGKU8owhaby5nr2f5KzeXw9HNkntPXmG4zjlxAJsU0pBKVYtqvvIv8wTFWG8XkR+paqP\nRg9E5HbsC+eFcGtxaLM51mYT9qUapy9LNKjqCyLSAMxIMJLmYkGzG5LffVTEx9UXuYvJFVgCvh+I\nSJR0JedYVPUnIrI2qaOQ5G8y5qHQYNx8HTOGqkRklnbPiRTpYQ/Apz/9ae69916+9rWv8clPfhKA\nJ598ki996UvMmTOnK5j3gQceYNWqVaxZs4ZZs2Z1ddbS0sJHPvIRRIRbb72Vs88+u+vZd77zHS67\n7LJuwb1J/PjHP+aWW27p8f677rqLu+66i8ceeyzvGAAWLlzIs88+y913393t86I+HnzwQUaNGgVY\nmYbp06fzk5/8hKVLl7Ju3ToeffRRVqxY0U0PEfH2hZJ5oBDJn2ZcB66DtMvf2NjIwoULIXwvFJxj\nCDKekfCsFoufiG9FHkvW9uRwf1XoJ9r6vBrzLKyKtVkUa/M0FmT7FvC5hMDgKHB2fri/JtyfnzDO\nyVgdrR1Z43wO+GTs3mKytoTnkidPwHL2uKKg23xyzyE5yHgbPQOX6+i5vX55wr3aoLu4fHn/DYKe\nlEwwck3svTXhfifwLGbU7orNj61YEHK2Hv4e0Lq6OgW0qqpKTz31VJ06darOnj1bRUTHjx/ftW36\n+uuvVxHRzZs3azYrV67UiooKFRGdO3eurlixQs8444we27NzsXbt2h5brJ9//nkdN26cPvDAA133\n8o1h9+7dOn78+G7buZuamnTKlCnd+mhqauqSTTWzPXTNmjWJW8qj9tF29ULJPFBI+/ZYVdeBqusg\nTfLfc889evHFF3c7Zs6cGQUZF2WbuKh9WfVKWDZagm1TjmgOX5pRsc3IK3CHqn4xLFWtib1nbXi2\nJ/S5LPRZiy3fXK+qP8v63Plkinw2hDb/ktVmR+hjk6p+QUQWhS/rsaHfOzRTNiB6zxjMU1NLJrj4\nDs0E0c4G7sC+5HdjJSgeDfIsiuTRzDbuJJ11G1fsfk65w+euwYyBZmCF2rbs5UEmME/QCkzvkX6T\n2q7FvFJRUdTVCbrLN5a/YAHDnVg8yghVPS4WYDwbuBUzaCpUtVpEVmMGVpuqVmfrIei8fuLEelpb\nH6OlxXb8jx59I6NH/z2vvjqN4cOvYOTIxbS2bmPfvpWoNlNZWcvIkUsYPXpZNx23tNzMgQN30NGx\nm8rKWmpq1jJ8eHdPSC5aWm5i//6VjBp1Pa2t26iomBDGspJhwz4CwIEDG3odQ2fnfpqbF9Hevpuh\nQ88EYMSIJQwdaiUY2ttfoKVlDQcPmmNw5MjFtLfvYdSoZezfv4K2tp2IjGXcuA0MHz6fI0d2sn//\nClpbzak2atT1jBy5hCFDJh2zzAOFN9+8hAkTHiz1MEqK68B10Ff5TzgBnn6612aDjoaGhqig8Bmq\nWvD98n02cJzBQ8zAmatHWTojxOD8E5bfaDNWe2w+ttX8WuApVb1ZRDZi2YnBLPFod90Tqnp+Qr91\nQD3MpGd5qqvC0V/cBKzEHGOzemlbaC7BNmqllbTLD64DcB30Tf4TT4SXXir+aIpJrlIN27dvhyIZ\nOMWKwXEGPx/AtvAplqF4HLZLqk5Vr4y1ux84E3gIuA5Yh9WfWp6v84kT1zF0aLF24/eNlhbYvx+O\nOw6GDevfz37zTZgwofd25Ura5QfXAbgO+ir/CSf03magk1RrMObBKQpu4Di5+BC29ASAWoblCqAu\nWqJS1RfUMievxn6K/BH4CvCyqj6er/NHHoG60to33HQTrFwJ994Ls/rZgbNx41WUcV3RXkm7/OA6\nANdB2uUvNm7glCfHYUtFY3trmIcqoDJc/4OItGPenCHEKomH59/Etn7/DqtdNU1EGlQ1pwkzEKqJ\nv/HGG6gqzc3FSnuUm3Kumt4X0i4/uA7AdZAm+UtRTdxjcMqMEH+zkjwB1n3s53HgPKyo6ovBa9MA\n/FBVP5fV9uvAt1S1Mhb/UwGcoqq/z2pbB9TX19dTV0IXzk033cTq1atpbm6mtraWJUuWsGzZst7f\n6DiO4xSEYgcZuwenzFDVm7Do2WPltXD+hog8TCb6twkypRpUNcpXhIi8TKY4ZydwLtDNwIkotQdn\n+fLlLF+eN0zIcRzHKRCl8OC4geP0xjAsBUDk6ovKe8SXqXYD7cCLwC1Yfp1WMqUherBu3bqSenAc\nx3Gc/qMUQcYFrUXllBXHh/MXVXUDZrQomfINq7Dt4wB7gQOh7erQropM5mYni+xfMmkj7fKD6wBc\nB2mXv9i4B8fJRQVWdPIJEdmOJa7pIDNn4h6cKViywPtFZCu2RHW/qu7v0Wug1EtUpWbjxo2pkTWJ\ntMsPrgNwHaRJfl+icgYSnViphdOygoxbwIptxtpeAfxPLNtxVFhyvogsyxXg7EtUjuM46cGXqJyB\nRBRk3BTOEn8tIjNCwU2wkhYvqurkcK3A22QqtzuO4zhOv+IeHCcfh4G1IlJPpqhnUpDxWcDuUEer\nHjNwmsJ7EktFpH2JynEcJ034EpUzkGjHYm6uV9X9IX/N1djuKLAg4yhDXi2224pQ+6pSRHZiBk42\n1QCLFy9m+vTpPR42NKTD6bNv377UyJpE2uUH1wG4DtIk/8knn8y3vvWtbvcaGxujWlTVxfhMT/Tn\nJBLKL5yHeXEeAt4PXAh8O1Qs30Sm4OZjwEfCW6MJJcCXVfX7Wf1ejWU9dhzHcRyABap6T6E7dQ+O\nk4s/AJ8DJgBLVPUWEXkLeBoyQcYhDqcZeA6Yi20Nrw/Xv0nodwuwANiDGU+O4zhOOqkGJmHfCwXH\nPThOTkRkF7YF/FRgKLBKVS8Iz2Zghs1k4AVgJ/B3wCLgXcCforaO4ziO09+4B8dJRERqgPuwYOJr\nsC3jS2JNbiCzRPUc8PHQrhIzei7M0e8E4ALcg+M4jpN2ujw4qvpmoTt3D46TFxFR4EOqmrTchIhc\nBqxW1Wnh9RZsV9XlIeA4u73H4DiO4zhxPAbH6V9ieW4+LCILgRWqmr2vL75F/GtY3M25wEUkbxHf\nAzBjxgxGjx7d7cEFF1zARz/60cIJMIBZunQp69atK/UwSkba5QfXAbgOepNfFURyPh5UPPLII2zZ\n0j3UpqWlhZ07d0L4Xig0buA4+dgWzv+G1ZqqB6ZmtanFYnF+Blyqqo8Fr85VwFcT+jwMcOedd6Y6\nk3FNTY3Ln2L5wXUAroN88re3wymnwHnnwRVXwIWJi/6Dh7q6Om688cZu92KZjIsSruAGjpNIMFK6\n1i9VdaeIjBeRWVgSv2ZVfQGrJD4bGBl7+3iguBmcHMdxypjHH4c//tGOgwcHv4FTCtzAcXLxN1jA\nMMB1IvIZzFNTB5xNJovxYeBMzBh6VDL+1Gvzde6ZjB3HcXLz4IOZ60suKd04CoVnMnYGEicCEzHD\nZRkwDstfM4FYFmNV/ZaILAA+i+XAGQK8rKo/z9e5F9t0HMdJRjVj4FRWlof3phTFNt3AcXJRTSi/\nAPwDVrqhKhzxOlRgSf2eBZ4BdgFXishmVb0sV+dp9+CkRc5cpF1+cB2A6yCX/M8+C889Z9cf+hCM\nG9ePgyoSpfDg+DZxJxEReQC4FJisqi+GxH4NwDpV/WpW20uAnwO3A6dju6gUGKuq+7Pa1gH19fX1\n7sFxHMdJYO1aWLHCrr/7Xfhq0naNMiDmwTlDVQtelKui9yZOSjk+nJvCWTCj5QSwTMaxbeSnYZXG\n7wf+b7gWLNjYcRzHeQf84heZ64svLt04Bju+ROXkogLYDzwhItuBmVh18WjOxJepDgOvYUU5h2HG\nzavAHODOpM7TvkTlOI6TxBtvwG9/a9fvex9Mm1ba8RQKDzJ2BhKdWHmG07KWqFogU2wz8AowUVWr\nRGQSVptqNPBWrs49yNhxHKcnDz8MnZ12XQ67pyJKEWTsS1ROLl4L5/gSVdfrrCWqGcBLInK6qu7B\nlrKqsV1VTgLZv2TSRtrlB9cBpFcHra3Q1tZd/rY2y31zxx2Zdr48dWy4B8fJxxG6L1F1kjGK40tU\np2Jz6SkROYgZQweBxWR2WnUj7UtUGzduTI2sSaRdfnAdQPnp4MgR+PWvYetW+K//gl274C9/gRNO\ngJNOgsOHbXfU3r3WXmQjixdfRVubvTe+52fCBMtiXC74EpUzkGgHhgJXquofROQq4G6gNTyP58KZ\nFyqKTwvLWQq8oaqJxg34EpXjOIOTN9+EDRvgP/4D/vxneC34uisr4aWX4O23e76nqQkaG3veV01u\nLwI33GB9lgueB8cZSAzBgoe/LCL1WAZjsDw4EPPgRGUdgnGzHPP0jBWRWUkVxWHweXDa282t3N5u\nf3ySjoqK3M9yFcxThY6Oozs6O99Z+/Z2un4pxo/oXkdHRo5IlrY2++Pc1AQ1NfDXfw1Tp0J1dW45\nOjth2DBr8/bb9kd/796M/gD++79hzRpobrZnTU2W6+P4sHfvpZfsl++kSXDuuXDaaTB6tPU5fHjm\nXFWVGcORI9DSAiNG2LNyIpp/I0aUT/HF/kYV9u+3+VlZaa8PHep+tIafbxUVNpdefhlefdX0/u53\nw+9/D+vW2bO+UF1t3pvXXrP+weZ4ba19xn/+p3l2hg61uTx1KsybB3PnwoknFkcPpcI9OM5AQ1W1\nq+SCiCwmLFFlBRnHK4rXq2pl8OjUkVxRnOOOW8f48XV0dtJ1PPwwPPQQ3e4V64i+iPMdbW32B6+1\nNRP0dyzEjZ3OTvsDl+Y0VCtX9q3dnYn78IzKSvsSUbV6PRHDh5tBBvasstLuRceIEWY07N1rXz6d\nnTBkiB1VVd3PSfeqqmx+HDhgX1yVlZm20REZiZD5dz9yxMZ56JB99gc/aH1F/cafHzqUuY4Mw6FD\n7Qtz3LjufcfPSff68ky15/+RqJp13ICPG/Lxe9nvzz7ixnNlpZ2ffRZOPz1jfLe3J1+rwqhRZuQO\nG9Zz/Ekyxa+bm+GVV2yJqNDU1JgsHR02xtmz4eMfh/PPNyMl0k1zs/0bjx6dee8ll3QvyVDOuAfH\nGUi0A50ishB4EKsi/jZhiSrsqooKbp4LnINtC98cPD4tZLw+caoBHnggwV9b5qjGDZp92Ka0tFIY\n+Ts6zMjIJjIQBjb7+MMf3pkOjhyBP/3JjvJgH7/7Xd90cOBAZjmolFRWwic+AVdead6XXN7C11+3\nIx/79u2joSG9fwcaM+t21fnaHS2eydhJRETWAZcAtdhy1HuBC4Fvq+qdIrIJW6LajOW/eT/dg5AB\nvqyq38/q92rgp8WXwHEcxxkkLFDVewrdqRs4TiIhrmY1ZuBMUdU9IvIWMEtVn4m1m4UV4lytqtNE\nZBG2e2pKdtvQfgJwAbAHi/FxHMdx0kk1MAnYoqpvFrpzz4PjJKKqm8OlAKNCDakdkcES5cEJQcQN\nwMSwnPVFrPDmjmzjxnEcx3H6C4/BcRIRkRrgPmx56hosq/GSWJN4HpxtwMdj7S7G6lMlcQG+ROU4\njuNkWAAUfInKDRwnEVXdB9woIjcAv1DV32Q9vxK6lrJUVR8XkfOxiuKPYUtbexK63gNw9913M336\n9OIJMMBZunQp69atK/UwSkba5QfXAbgO0i5/Y2MjCxcuhOTvimPGDRwnJ7FSDB8Oy08rguETJ9oi\nvgwr2dAMVAIXkbxF/DDA+vXrB1UenEJTU1OT6kSHaZcfXAfgOuhN/i1b4JxzYOzYfhxUkeglD05R\n4jHdwHHysS2c/w04ANQDU7O2iNdiFcS/oapjAEKyv88CX83VsWcydhzHyc1f/gIXXmjb0j/72e41\nqgYjngfHGTCIyDXA+PDyOixxyYSwa+paMvE3HcCHw3s6yRTlfCJf/4Mtk7HjOE5/8vDDljervR3G\nj++9/UDHMxk7A4kPYFv4FFiGbQW/BqjLymJ8P3AmlgvnOmAd8AVgeb7O3YPjOI6Tm3iG40suKd04\nCkUpPDi+TdzJxYcw7wwAqroTmy910RbxcD/aTn4J8EfgK8Drqvp4P493UJF2T1Xa5QfXAbgOcsl/\n+LDF3wBMnAhnn92PgyojPNGfk4iIPAV8EPPi/AQr3fC3wM9Ck6eiauGx7MS/A0YA04CdqtrDRRPy\n6dTPnDnTl6gcx3ES+Od/ho99zK4/8xn44Q9LO55CkGuJavv27QBnqGrBa1b4EpWTizbMuJkcqoTP\nwAKHW1T1c1ltpwCdqnp6CDBeDcwQkQ+q6u+TOvclKsdxnGTiy1MXX1y6cRQSX6JyBhJRWbumcJb4\n6/gyVUBDNfHICu/EinA6juM4fUQVfvELux42DObOLe14BjPuwXHycQR4QkS2AzPpXkwznsn4t6Ht\nQ9iWcQFeBd7K1bHvonIcx+nJzp3w8st2PWsWjBpV2vEUilLsokJV/fCjxwFswgyaD4TXV2FBx6vC\n6xnY8hXAZOAQcDpWOE2BVmBMQr91gNbX12uaueeee0o9hJKSdvlVXQeqroMk+b/5TVXz46jedlv/\nj6k/qa+v1/B9UadF+B5zD46TiyGYkbIp5sEBqArnuAfnS1gA8v3A1vB8j6ruz9V52j04GzduTI2s\nSaRdfnAdQPnqoLMT/vxn2LXLEvYdfzycdJLtjnr+eXjhBaiogB/9aCOtrVfR1gYHD8ITT8Avf5np\n56KLSidDofE8OM5AYxjwMc0EGTcQlqi0ey6cU4H/A7wMzAv3porIMg07rbLxIGPHcQYrqtDUZEbM\nq6/avcpK2L3bEvQ9+ii8/Xbf+vrMZ5Lvn322GUXlgmcydgYSx4dzPMhYgRPAgozJlGu4A1uumhae\nKZb5uODb/pz+R9V+XVZX2x/xQtPSYl8W48Zl4g2amuD11+0P/MiRhf9MxzkaDh2C22+H7343EydT\naGpqYM4c+Md/LE7/acINHCcXFVjhzLUiUo/FzrSTmTPxJaqzgN3QVYeqEzOM6kguuMl11y1lzJga\nNKRhUoXLLruK+fOvorOTPh0dHX1rd7R9tbVBa2v3o70dRJKPioq+P9uzB2691T433xGNra9Hvvbt\n7SbTkSPJR0dHZqzReNvazNhoa4OhQ2HKFJg61YydOKrdxzBsmLV5+237Iti71/TX1mbtDx0y46W5\nGQ4cyPQzfHjmOZhBdcopcNppMHq09Vldbe3iZ1Xrq6XF7k2YYF8U0dgqK+1+dIwYYfrYuxdee83G\nPGSIHVVV3c9J96qqTJYDB2yslZWZttGRNB+OHMm85/XX4V//NdNfVZU9P3jQnmefW1vNCHz3u+0s\nYV9j9jnpXl+eqfb8P6Hacw7H5Yrfy35/9hGfW5WVdm5qgl//OjM329uTr1XN+B092uZWNO64DPmu\nm5ttHr76qo2lstL6PHSo+9Haau+rqLC5FL1nxAjT+/PPwyuvJP1F68673gXnnQfTptn7XnsNXnrJ\n/g9NnQq1tfYZq1bBtdfa/aoqe3bWWTYnyo1SLFF5oj8nERF5HFt6+t/ANlXdLyLtwF2alQdHRH4J\nnAzcjRk11wCPhvfdkNX2fOBxazq96HIMXJZiVS3SStrlB9cBDGYdzJgBf/VXlmm4osIMwhEjbGlp\n+nS71xtLly5l3brBKX8haGxsZOHChQD/Q1V/W+j+y9BOdArEU5hn5j6gVkSmEraNQ48lqvOBPwG/\nBn6OVR2vIBOQHGeSnRYWdfCDg+KtPQ8O0i4/uA5gsOpg5047jpVixqAMIiZh6UYKihs4Ti5+A1wK\nvBf4dDgfAZ4Oz28AnhKRF7AlqVPJ7KCKfrv8jJ5sARYAe4DDxRi44ziOMyioxoybLcXo3JeonJwE\n42USVh18DjBOVWeHZzOwGJ0lWE6cDwD3YgU31wFvqOqk/h+14ziO47gHx8lPFJo4FttBNSX2LAoy\nrsUMnVFAtN/lCFZ0s2eHIhOAC3APjuM4Ttrp8uCo6puF7tw9OE4iInIZVjRzClCrqntE5C3gclV9\nLNZuNebBmQPMVdXHROQV4GVVPSuh36jyuOM4juMALFDVewrdqXtwnFycBewFpgIfFZHTMU9N9tbv\nHcBlwArgVyLyJDAR+F85+t0DcPfddzN9enp3UaV990Ta5QfXAbgO0i5/bBfVnmL07waOk4tazDOj\nwCPAk9iW8QnxHVSqujl4cZ4E2oCzMe/Nthz9HgaYPn16qjMZ19TUuPwplh9cB+A6SLv8MYoSruAG\njpOLaqxUgwKXA+uxbd9VdE/yBzAXeBZ4BtgF/I2I3Kuqn8rVedprUTmO46QJr0XlDCTagTZVHRrd\nEEsPWpFVhwpsi/hQrDRDFJh8hYgsylVw02tROY7jpAevReUMJNoBROQHwMPAVcABrMJ4dqK/04BO\nVf1CePZnzNAZD+SsKO44juM4xaIPyaSdlLIbmx/DMENFsWWr58PzG7DgYrD1090icpuI3AeciAUo\nz+nXEQ8i0r4Ul3b5wXUAroO0y19sfJu4k4iI3AR8JWuJqhNYoqobstrOBjYB0dLVViwqfrmqPpDV\ntg6onzlzpsfgOI7jpIRcMTjbt28HOENVGwr9mW7gOImEnQIbW0gAAAVvSURBVFFfAe4hs0T1MeAb\nqnpz1hIVIffNcGAMmUrk782OwYkMnPr6eo/BcRzHSTGxGJyiGDi+ROXkohbooPsSVSUwITzvWqIS\nkcnYktRW4MbwvD5XgLHjOI7jFBsPMnZyMQTz8EVlvzeISAehQnjWTqovYRmOI2/OKmBcvs59m7jj\nOE56KMU2cV+ichIRkQeAC1R1ZOxeB/BPqvrVrLZbgcnRS6y8QxPwHVW9OautL1Fh/9nTbMylXX5w\nHYDrIO3y+xKVUyq6tomLyGUicj9Z28TD0hSqOg+YBzyKlWwAOC/buHEyZP+SSRtplx9cB+A6SLv8\nxcYNHCcX72SbOMA2YBUWu6NYYLLjOI7jlASPwXFyUQlUZsXgdBIyFcdjcELlccUKc9araoWIvCUi\ns+KVx+N4DI7jOE568FINzkCiA2gTkTGquj/EzhwGaqBHJuOzsG3hxAyaZiwvTqKB46UaHMdx0oOX\nanAGErWYcbJWROqBOuA5um8TjwpungucCWwN9aokHAcS+q0GaGxsLObYBzz79u2joaHgMXWDhrTL\nD64DcB2kXf7Y90B1Mfr3XVROIiHR3wxVvSB27zlgtareeQxtrwZ+WtTBO47jOIOJBap6T6E7dQ+O\nk4sddA8iBgs2fvoY224BFmClHA4f2xAdx3GcQUw1MAn7Xig47sFxciIiu7D8BFEMzqrIS5NQqiFn\nW8dxHMfpb9yD4+RjLt1jcJbEnsVjcHpr6ziO4zj9intwHMdxHMcpOzzRn+M4juM4ZYcbOI5TRKJy\nFo4DPh8cw+dB/+AGjtNviMhkEbk91La6XURqen/X4ENEnhORjlCc9PbY/Zzyl4NuwtjHZN07KpkH\noz6S5A/3UzEfRGR2TNZNhfi3Hkx6yCd/eF728yDoYGvIZL8l61n/zwFV9cOPfjmwRIHvDdczgOdK\nPaYiyDgbmPVO5R/MusGyWy8HOoFJhZB5MOmjF/lTMR+AydjOSbBtv88B96ZlHvRB/rKfB+H/wfys\nsX++lHOg5ErxIx0HlidnV9a9t3L9px+sB5b7ZxOwqK/yl4tusPIek45V5sGqj2z50zQfsscGLAJ2\nhOvLy30e5JM/TfMga6z3RmMt1RzwJSqnvzgLq1Ae5y1sS3k5cTvwJrAmuGknhfv55C8X3UjW66OV\nebDqI1t+SMl80J5FdacAvwrXZ1Lm86AX+SEl8yBCRBYDL8T0UpI54AaO01/UEgpyxmgmU9uqLFDV\nO1X1C5ib+nlgTXiUT/5y1c3Rylw2+kjxfJgBrArXaZwHcflTNQ9EZBHmsVkuIsvC7ZLMATdwnP5i\nNzA2695Y7D972aGq+4HFZH5p5JO/XHVztDKXnT7SNB9EZDmwIsgMKZsHCfJ3kYZ5oKobVHUesBJL\nCAslmgNu4Dj9xQ7MGo+Tq15VubCbzK+PfPKXq26OVuZy1UfZzwcRmQ3Uq+ozsdupmQc55M+m7OdB\nYD22nASlmgOlDkTyIz0HsAsYE67rgC2lHlOB5asBamKvFxELhssnfznohuRdREcl82DUR7b8aZsP\nwBxgduz1WDJBpmU/D3LIPztN8yBLztnAsmOV81h04LWonP6k3OtVnQncJyLbgG3A89o9+DCf/INW\nNyEvxWJAgctFZL1m3PNHK/Og0Uce+VMzH4LnYiugIgIWcK3AuNCkrOdBL/KfRQrmgVgB5vvCWO/F\nijHfHGvS73PAa1E5juM4jlN2eAyO4ziO4zhlhxs4juM4juOUHW7gOI7jOI5TdriB4ziO4zhO2eEG\njuM4juM4ZYcbOI7jOI7jlB1u4DiO4ziOU3a4geM4juM4TtnhBo7jOI7jOGWHGziO4ziO45QdbuA4\njuM4jlN2/H/V8jQhC2/10gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.close()\n", + "sigs = plot_signals + [None]#plot_signals[:-2] + plot_signals[-1:] + [None]\n", + "f,axarr = plt.subplots(len(sigs)+1,1,sharex=True,figsize=(5,5))#, squeeze=False)\n", + "for i,sig in enumerate(sigs):\n", + " print(sig)\n", + " if sig is None or (sig is not None and sig in importances.keys()):\n", + " ax = axarr[i]\n", + " ax.plot(importances[sig][0],importances[sig][1],linewidth=2.0)#,linestyle=lss[j],color=colors[j])\n", + " ax.set_ylim([0,1.3])\n", + " if sig is not None:\n", + " h = ax.set_ylabel(sig.description,size=fontsize)\n", + " h.set_rotation(0)\n", + "plt.show()\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "labels = dict([(sig,\"a\") for sig in plot_signals])#\"a\"]*100\n", + "T_min_warn = 30\n", + "P_thresh = 0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nSNDIcGefDVddFX5OBN57L7rAu21b9DW8IqrQf/ttDYEdyZlnBjS8AYG3K244ehoTao0OifReHKPM\n2HjqO+dWA2fF2/f06dPbNKF9kb4+PiOcWbNmneghdJumJtWOdiac+mn//s7DjnaHQYPiE079lJZ2\nYkK+Hm9O5mfL6NvYs2X0BvZcnVo4p0LomWfCFVeEnxPRie1YAu++fdHb3LVL01/+EnlmFsOHR9fw\n5uXpHHJvvRf06ZA+zrlpwM3AIiAHXTubA5QBc0SkNlC2lShhYpxzdwATgGrUbHadiCwJnE/32hc0\nBGohsExE7vbOzQCmo46N1gP3e2UqgIkictA5d7s3tixguYiUdGUMndyD4PhyvexiEan0+l2AWiHk\ni8gmb41xsTfG1SLim/4G72UucBewUkRuiXFule90ywvDs8C79xlAqX+N3vhmevW/513jCu86g/1P\n9drPRj8//zo2RVxvPlC+ePFi7r//fqqrqyksLARg0aJFjBs3DoDFixdTXl5OdnY2FRUVFBUVcfvt\nt7e1U1payvLlyykuLmb79u2UlJQwY8YMli1bRm1tLcXFxQBUVVWRn5/PggULSE9PD7v3lZWVLFy4\nkKqqKmpqapg2bRp33XUXAI8++ijFxcUxx2cYHXH0aHzCqX+u5lgjR8cgJSV+AXXECDU3OhWEVMMw\nDMMwNLrA9u3RBd733+96exkZ7bW71z8whabSJzj99OjvGBUVFUyYMAFggohUxGq7z2pqPSHoLlQI\nEjRMzDJUwJwGjAdiagi9NhYB80Uk0TueBKxzzm0XkTVesRWo46IFXpn5gSZyUGG0kJBQeYeXXwqU\neqa367wyi1HnSP/nC2txjiHW+HOAp4BJIvKml7cf2OicyxSRJc65XGCOX0dE1jvnqgiYA0fcyyog\n0ztf6Jy7Mca5iV7dfGChiFztHU8Eypxz2Z7AmkPo85jrtXGHtz/dObdBRO4WkUedc5cBtwN3BE2Y\nozFp0iT27dvHkiVLWLx4MZdeemnbueLiYu6++25avEV969evp6ioiNzcXG688UYeffRRSkpKqK6u\nJicnhwMHDpCbm8vTTz8NQH5+Prfccgvz58+ntraW7OxsFi9eTG5uLvn5+axcuZKKigoWLFjA2rVr\nAXj66acpLCykurqalStXMnXqVDZs2BB1fMapR319bME0muDaVXf98XLaaZ0Lp8FzKSm9Mw7DMAzD\n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\nAGbrf7vuI1cfo312AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fontsize= 15#25\n", + "lower_lim = 0# len(truth)-1000 #len(pred)\n", + "plt.close()\n", + "colors = [\"b\",\"k\"]*10\n", + "lss = [\"-\",\"--\"]*10\n", + "# f,axarr = plt.subplots(2,1,sharex=True,figsize=(5,5))#, squeeze=False)\n", + "# f,axarr = plt.subplots(len(plot_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False)\n", + "f,axarr = plt.subplots(len(plot_signals)+1,1,sharex=True,figsize=(10,10))#, squeeze=False)\n", + "truth = shot.ttd\n", + "xx = range(len(pred)) #list(reversed(range(len(pred))))\n", + "for i,sig in enumerate(plot_signals):\n", + " if sig is None:\n", + " continue\n", + " ax = axarr[i]\n", + " num_channels = sig.num_channels\n", + " sig_arr = shot.signals_dict[sig]\n", + " if num_channels == 1:\n", + "# ax = axarr[0]\n", + " ax.plot(xx,sig_arr[:,0]/np.max(sig_arr[:,0]),linewidth=2)#linestyle=lss[j],color=colors[j])\n", + " ax.plot(importances[sig][0],(importances[sig][1]),\"-r\")\n", + "# else:\n", + "# ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig])\n", + "# ax.plot([],linestyle=\"none\",label = labels[sig])\n", + " ax.set_ylim([0,1])\n", + " ax.set_yticks([0,0.5])\n", + "# if j == 0:\n", + " h = ax.set_ylabel(sig.description,size=fontsize)\n", + " h.set_rotation(0)\n", + " else:\n", + " ax.imshow(sig_arr[:,:].T, aspect='auto', label = labels[sig],cmap=\"inferno\" )\n", + " ax.set_ylim([0,num_channels])\n", + " ax.text(lower_lim+200, 40, labels[sig], bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize)\n", + " ax.set_yticks([0,num_channels/2])\n", + " ax.set_yticklabels([\"0\",\"0.5\"])\n", + " ax.set_ylabel(\"$\\\\rho$\",size=fontsize)\n", + " ax.legend(loc=\"best\",labelspacing=0.1,fontsize=fontsize,frameon=False)\n", + " ax.axvline(len(truth)-T_min_warn,color='r',linewidth=0.5)\n", + " plt.setp(ax.get_xticklabels(),visible=False)\n", + " plt.setp(ax.get_yticklabels(),fontsize=fontsize)\n", + " f.subplots_adjust(hspace=0)\n", + " #print(sig)\n", + " #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr)))\n", + "ax = axarr[-1] \n", + "# ax.semilogy((-truth+0.0001),label='ground truth')\n", + "# ax.plot(-prediction+0.0001,'g',label='neural net prediction')\n", + "# ax.axhline(-P_thresh_opt,color='k',label='trigger threshold')\n", + "nn = np.min(pred)\n", + "# ax.plot(xx,(truth+0.001)-nn,label='target',linewidth=2)\n", + "# ax.axhline(0.4,linestyle=\"--\",color='k',label='threshold')\n", + "# ax.axhline(P_thresh-nn,linestyle=\"--\",color='k',label='threshold')\n", + "ax.plot(xx,pred/np.max(pred),'b',label='RNN output',linewidth=2)\n", + "ax.plot(importances[None][0],importances[None][1],\"-r\")\n", + "# nn0D = np.min(pred0D)\n", + "# ax.plot(xx,pred0D-P_thresh0D,'g',label='RNN output [0D only]',linewidth=2)\n", + "ax.axhline(0,linestyle=\"--\",color='k',label='threshold')\n", + "# ax.axhline(P_thresh-nn,linestyle=\"--\",color='k',label='threshold')\n", + "ax.set_ylim([0,1.0])\n", + "# ax.set_yticks([0,1])\n", + "# if len(truth)-T_max_warn >= 0:\n", + "# ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time')\n", + "ax.axvline(len(truth)-T_min_warn,color='r',linewidth=0.5)#,label='min warning time')\n", + "ax.set_xlabel('T [ms]',size=fontsize)\n", + "# ax.axvline(2400)\n", + "ax.legend(loc = 'center left',fontsize=fontsize-5,labelspacing=0.1,frameon=False)\n", + "plt.setp(ax.get_yticklabels(),fontsize=fontsize)\n", + "plt.setp(ax.get_xticklabels(),fontsize=fontsize)\n", + "# plt.xlim(0,200)\n", + "plt.xlim([lower_lim,len(truth)])#len(truth)])\n", + "# plt.savefig(\"{}.png\".format(num),dpi=200,bbox_inches=\"tight\")\n", + "plt.show()\n", + "# ax.grid() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tryout metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "dat = np.load('./temp_data/signal_influence/signal_influence_results_2017-11-30-20-13-39.npz')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y_gold = dat['y_gold']\n", + "y_prime = dat['y_prime']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "idx = 4\n", + "plt.plot(y_gold[idx],\"--k\")\n", + "# plt.plot(y_prime[idx],\"-b\")\n", + "plt.plot(y_prime[-1],\"-g\")\n", + "plt.plot(t_range,differences,\"-r\")\n", + "\n", + "plt.ylim([-1,1])\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t_range = np.linspace(0,len(y_gold[0]),10,dtype=np.int)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 285, 571, 857, 1142, 1428, 1714, 1999, 2285, 2571])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_range" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def difference_metric(y_prime,y_prime_orig):\n", + " idx = np.argmax(y_prime_orig) \n", + " idxmin = np.argmin(y_prime_orig)\n", + " return (y_prime_orig[idx] - y_prime[idx])/(np.max(y_prime_orig) - np.min(y_prime_orig))\n", + "\n", + "\n", + "def get_importance_measure(y_prime,metric):\n", + " differences = [metric(y_prime[i],y_prime[-1]) for i in range(len(y_prime))]\n", + " return 1.0-np.array(differences)#/np.max(differences)\n", + "\n", + "def l2_metric(y_prime,y_prime_orig):\n", + " xx = (y_prime-y_prime_orig)\n", + " if np.all(xx == 0): return 0.0\n", + " idx = np.where(xx != 0)[0][0]\n", + " return np.mean(np.abs(xx[idx:]))\n", + " \n", + "# return np.max(y_prime_orig - y_prime)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "differences = get_importance_measure(y_prime,difference_metric)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.argmax(t_range)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda root]", + "language": "python", + "name": "conda-root-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 433c26ff6d7597170a5618e0285fca40d610825f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 17 Dec 2017 22:59:08 -0500 Subject: [PATCH 420/744] added 0D cross machine versions --- plasma/conf_parser.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 8c9418c2..1ded3a1a 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -126,6 +126,17 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = fully_defined_signals + elif params['paths']['data'] == 'jet_to_d3d_data_0D': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [d3d_full] + params['paths']['use_signals_dict'] = fully_defined_signals_0D + elif params['paths']['data'] == 'd3d_to_jet_data_0D': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = fully_defined_signals_0D + + + else: print("Unkown data set {}".format(params['paths']['data'])) exit(1) From b795753c898e6080b317a047b042d8802f2fe9b9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 17 Dec 2017 22:59:52 -0500 Subject: [PATCH 421/744] added 0D jet signals --- data/signals.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/data/signals.py b/data/signals.py index 57a8bd48..85b49fd6 100644 --- a/data/signals.py +++ b/data/signals.py @@ -213,14 +213,14 @@ def fetch_nstx_data(signal_path,shot_num,c): 'pradedge':pradedge,'pradtot':pradtot,'pin':pin, 'torquein':torquein, 'energydt':energydt,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, +#'tmamp1':tmamp1,'tmamp2':tmamp2,'tmfreq1':tmfreq1,'tmfreq2':tmfreq2,'pechin':pechin, # 'rho_profile_spatial':rho_profile_spatial,'etemp':etemp, -'etemp_profile':etemp_profile,'edens_profile':edens_profile, -'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, -'trot_profile':trot_profile,'pthm_profile':pthm_profile, -'neut_profile':neut_profile,'q_profile':q_profile, -'bootstrap_current_profile':bootstrap_current_profile, -'q_psi_profile':q_psi_profile} +'etemp_profile':etemp_profile,'edens_profile':edens_profile} +#'itemp_profile':itemp_profile,'zdens_profile':zdens_profile, +#'trot_profile':trot_profile,'pthm_profile':pthm_profile, +#'neut_profile':neut_profile,'q_profile':q_profile, +#'bootstrap_current_profile':bootstrap_current_profile, +#'q_psi_profile':q_psi_profile} #} #new signals are not downloaded yet @@ -236,6 +236,7 @@ def fetch_nstx_data(signal_path,shot_num,c): print(all_signals.values()) fully_defined_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machines(all_machines)} +fully_defined_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} d3d_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(d3d)} jet_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(jet)} jet_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} From 5890a1adcbd80331fa2c3ce9eab755c7ecfe35c1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 17 Dec 2017 23:00:31 -0500 Subject: [PATCH 422/744] script to compare performance of two trained models --- examples/compare_performance.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/compare_performance.py b/examples/compare_performance.py index 0a39ee92..498927f8 100644 --- a/examples/compare_performance.py +++ b/examples/compare_performance.py @@ -43,12 +43,20 @@ shots = analyzers[0].shot_list_test for shot in shots: - types = [analyzers[i].get_prediction_type_for_individual_shot(P_threshs[i],shot,mode='test') for i in range(len(analyzers))] - #if len(set(types)) > 1: - if types == ['TP','FN']: - print(shot.number) - print(types) - for i,analyzer in enumerate(analyzers): - analyzer.save_shot(shot,P_thresh_opt=P_threshs[i],extra_filename=['deep','shallow'][i]) + if all([(shot in analyzer.shot_list_test or shot in analyzer.shot_list_train) for analyzer in analyzers]): + types = [analyzers[i].get_prediction_type_for_individual_shot(P_threshs[i],shot,mode='test') for i in range(len(analyzers))] + #if len(set(types)) > 1: + if types == ['TP','late']: + if shot in analyzers[1].shot_list_test: + print("TEST") + else: + print("TRAIN") + print(shot.number) + print(types) + for i,analyzer in enumerate(analyzers): + analyzer.save_shot(shot,P_thresh_opt=P_threshs[i],extra_filename=['1D','0D'][i]) + else: + pass + #print("shot {} not in train or test shot list (must be in validation)".format(shot)) From d7f26de4bae84dab44934d66a138503c9c51f698 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 17 Dec 2017 23:01:15 -0500 Subject: [PATCH 423/744] signal importance through occlusion --- examples/simple_augmentation.py | 162 ++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 examples/simple_augmentation.py diff --git a/examples/simple_augmentation.py b/examples/simple_augmentation.py new file mode 100644 index 00000000..e6c05a78 --- /dev/null +++ b/examples/simple_augmentation.py @@ -0,0 +1,162 @@ +''' +######################################################### +This file trains a deep learning model to predict +disruptions on time series data from plasma discharges. + +Must run guarantee_preprocessed.py in order for this to work. + +Dependencies: +conf.py: configuration of model,training,paths, and data +model_builder.py: logic to construct the ML architecture +data_processing.py: classes to handle data processing + +Author: Julian Kates-Harbeck, jkatesharbeck@g.harvard.edu + +This work was supported by the DOE CSGF program. +######################################################### +''' + +from __future__ import print_function +import os +import sys +import time +import datetime +import random +import numpy as np +import copy +from functools import partial + +os.environ["PYTHONHASHSEED"] = "0" + +import matplotlib +matplotlib.use('Agg') + +from pprint import pprint +sys.setrecursionlimit(10000) + +from plasma.conf import conf +from plasma.models.loader import Loader +from plasma.primitives.shots import ShotList +from plasma.preprocessor.normalize import Normalizer +from plasma.preprocessor.augment import ByShotAugmentator +from plasma.preprocessor.preprocess import guarantee_preprocessed + +if conf['model']['shallow']: + print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + exit(1) +if conf['data']['normalizer'] == 'minmax': + from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer +elif conf['data']['normalizer'] == 'meanvar': + from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer +elif conf['data']['normalizer'] == 'var': + from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer +elif conf['data']['normalizer'] == 'averagevar': + from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer +else: + print('unkown normalizer. exiting') + exit(1) + +from mpi4py import MPI +comm = MPI.COMM_WORLD +task_index = comm.Get_rank() +num_workers = comm.Get_size() +NUM_GPUS = conf['num_gpus'] +MY_GPU = task_index % NUM_GPUS + +from plasma.models.mpi_runner import * + +np.random.seed(task_index) +random.seed(task_index) +if task_index == 0: + pprint(conf) + +only_predict = len(sys.argv) > 1 +custom_path = None +if only_predict: + custom_path = sys.argv[1] +print("predicting using path {}".format(custom_path)) + +assert(only_predict) +##################################################### +####################Normalization#################### +##################################################### +if task_index == 0: #make sure preprocessing has been run, and is saved as a file + shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +comm.Barrier() +shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) + + +def chunks(l, n): + """Yield successive n-sized chunks from l.""" + return[ l[i:i + n] for i in range(0, len(l), n)] + +def hide_signal_data(shot,t=0,sigs_to_hide=None): + for sig in shot.signals: + if sigs_to_hide is None or (sigs_to_hide is not None and sig in sigs_to_hide): + shot.signals_dict[sig][t:,:] = shot.signals_dict[sig][t,:] + +def create_shot_list_tmp(original_shot,time_points,sigs=None): + shot_list_tmp = ShotList() + T = len(original_shot.ttd) + t_range = np.linspace(0,T-1,time_points,dtype=np.int) + for t in t_range: + new_shot = copy.copy(original_shot) + assert(new_shot.augmentation_fn == None) + new_shot.augmentation_fn = partial(hide_signal_data,t = t,sigs_to_hide=sigs) + #new_shot.number = original_shot.number + shot_list_tmp.append(new_shot) + return shot_list_tmp,t_range + +def get_importance_measure(original_shot,loader,custom_path,metric,time_points=10,sig=None): + shot_list_tmp,t_range = create_shot_list_tmp(original_shot,time_points,sigs) + y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list_tmp,loader,custom_path) + shot_list_tmp.make_light() + return t_range,get_importance_measure_given_y_prime(y_prime,metric),y_prime[-1] + +def difference_metric(y_prime,y_prime_orig): + idx = np.argmax(y_prime_orig) + return (np.max(y_prime_orig) - y_prime[idx])/(np.max(y_prime_orig) - np.min(y_prime_orig)) + +def get_importance_measure_given_y_prime(y_prime,metric): + differences = [metric(y_prime[i],y_prime[-1]) for i in range(len(y_prime))] + return 1.0-np.array(differences)#/np.max(differences) + + +print("normalization",end='') +normalizer = Normalizer(conf) +normalizer.train() +normalizer = ByShotAugmentator(normalizer) +loader = Loader(conf,normalizer) +print("...done") + +# if not only_predict: +# mpi_train(conf,shot_list_train,shot_list_validate,loader) + +#load last model for testing +loader.set_inference_mode(True) +use_signals = copy.copy(conf['paths']['use_signals']) +use_signals.append(None) + + + +for shot in shot_list_test: + shot.augmentation_fn = None# partial(hide_signal_data,t = 0,sigs_to_hide = sigs_to_hide) + +print("All signals:") +y_prime,y_gold,disruptive,roc,loss = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) +print(roc) +print(loss) + +#for sigs_to_hide in [[s] for s in use_signals[:-3]] + [use_signals[-3:-1]] + [use_signals[-1]]: +for sigs_to_hide in [[s] for s in use_signals[:-3]] + [[s] for s in use_signals[-3:-1]] + [use_signals[-3:-1]]:# + [use_signals[-1]]: + for shot in shot_list_test: + shot.augmentation_fn = partial(hide_signal_data,t = 0,sigs_to_hide = sigs_to_hide) + print("Hiding: {}".format(sigs_to_hide)) + y_prime,y_gold,disruptive,roc,loss = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) + print(roc) + print(loss) + + + +if task_index == 0: + print('finished.') From c11a426e0b7ad595f8c932d2db506cc394ae4e91 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 22 Dec 2017 14:48:49 -0500 Subject: [PATCH 424/744] added fully defined signals 0D only --- data/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index 85b49fd6..13264366 100644 --- a/data/signals.py +++ b/data/signals.py @@ -236,7 +236,7 @@ def fetch_nstx_data(signal_path,shot_num,c): print(all_signals.values()) fully_defined_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machines(all_machines)} -fully_defined_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} +fully_defined_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( sig.is_defined_on_machines(all_machines) and sig.num_channels == 1) } d3d_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(d3d)} jet_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(jet)} jet_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} From 6bfb5f1120a7943e972facf2fe130ad5bf3e8061 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 24 Dec 2017 20:25:51 -0500 Subject: [PATCH 425/744] Jenkins test --- examples/jenkins.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index 9d9087e6..ac060b88 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -1,15 +1,21 @@ #!/bin/bash rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/processed_shots +rm -rf /tigress/alexeys/processed_shotlists +rm -rf /tigress/alexeys/normalization + ls ${PWD} -module load anaconda +echo "Jenkins test Python3.6" +export PYTHONHASHSEED=0 +module load anaconda3 +source activate PPPL_dev3 module load cudatoolkit/8.0 -module load openmpi/intel-17.0/2.1.0/64 intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 module load cudnn/cuda-8.0/6.0 -source activate PPPL - +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 export OMPI_MCA_btl="tcp,self,sm" echo $SLURM_NODELIST From 2249774974eceeb38f89cbd7f0dc334bc30985ca Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 24 Dec 2017 20:27:18 -0500 Subject: [PATCH 426/744] Tab-space insonsistency --- plasma/primitives/data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index d6139f66..d537038b 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -121,8 +121,8 @@ def load_data(self,prepath,shot,dtype='float32'): def fetch_data_basic(self,machine,shot_num,c,path=None): - if path is None: - path = self.get_path(machine) + if path is None: + path = self.get_path(machine) success = False mapping = None try: @@ -283,7 +283,7 @@ def get_channel_num(self,machine): def fetch_data(self,machine,shot_num,c): time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) - mapping = None #we are not interested in the whole profile + mapping = None #we are not interested in the whole profile channel_num = self.get_channel_num(machine) if channel_num is not None and success: if np.ndim(data) != 2: From b31baec830e08719003aedbf8938cfaf81005c1b Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Dec 2017 12:55:43 -0500 Subject: [PATCH 427/744] Notebooks belong in examples/notebooks --- .../notebooks/Analyze Hyperparameter Tuning.ipynb | 0 .../notebooks/Signal Influence.ipynb | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Analyze Hyperparameter Tuning.ipynb => examples/notebooks/Analyze Hyperparameter Tuning.ipynb (100%) rename Signal Influence.ipynb => examples/notebooks/Signal Influence.ipynb (100%) diff --git a/Analyze Hyperparameter Tuning.ipynb b/examples/notebooks/Analyze Hyperparameter Tuning.ipynb similarity index 100% rename from Analyze Hyperparameter Tuning.ipynb rename to examples/notebooks/Analyze Hyperparameter Tuning.ipynb diff --git a/Signal Influence.ipynb b/examples/notebooks/Signal Influence.ipynb similarity index 100% rename from Signal Influence.ipynb rename to examples/notebooks/Signal Influence.ipynb From 14bb70f2144414aa8d2efe8a518e77169843b1bc Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Dec 2017 12:56:59 -0500 Subject: [PATCH 428/744] Fix IndexError in Python3 -- floating point slice index --- plasma/primitives/data.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index d537038b..9085f8ee 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -1,3 +1,4 @@ +from __future__ import division import numpy as np import time import sys,os @@ -205,7 +206,7 @@ def load_data(self,prepath,shot,dtype='float32'): if np.ndim(data) == 1: data = np.expand_dims(data,axis=0) #_ = data[0,0] - T = data.shape[0]/2 #time is stored twice, once for mapping and once for signal + T = data.shape[0]//2 #time is stored twice, once for mapping and once for signal mapping = data[:T,1:] remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) t = data[:T,0] From 7ff580639af20ddb7f0f764ab9b711494ae9ecc1 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 25 Dec 2017 13:47:03 -0500 Subject: [PATCH 429/744] Trigger Jenkins build --- examples/jenkins.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index ac060b88..f442388e 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -5,7 +5,6 @@ rm -rf /tigress/alexeys/processed_shots rm -rf /tigress/alexeys/processed_shotlists rm -rf /tigress/alexeys/normalization - ls ${PWD} echo "Jenkins test Python3.6" From 1e25e7c4130665e51151df04b9679b717f35f7e6 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Dec 2017 14:59:57 -0500 Subject: [PATCH 430/744] Fix TypeError in layer definitions in Python3 --- plasma/models/builder.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 2e0fc0c0..29d47fb0 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -1,3 +1,4 @@ +from __future__ import division import keras from keras.models import Sequential, Model from keras.layers import Input @@ -139,20 +140,20 @@ def slicer_output_shape(input_shape,indices): for i in range(model_conf['num_conv_layers']): div_fac = 2**i - pre_rnn_1D = Convolution1D(num_conv_filters/div_fac,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) - pre_rnn_1D = Convolution1D(num_conv_filters/div_fac,1,padding='valid',activation='relu') (pre_rnn_1D) + pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) + pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,1,padding='valid',activation='relu') (pre_rnn_1D) pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) pre_rnn_1D = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) - pre_rnn_1D = Dense(dense_size/4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + pre_rnn_1D = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) else: pre_rnn = pre_rnn_input if model_conf['rnn_layers'] == 0 or model_conf['extra_dense_input']: pre_rnn = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size/2,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size/4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size//2,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) + pre_rnn = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) x_input = Input(batch_shape = batch_input_shape) From 45a797d1a1ef323df0e6703e3c48df5999e29396 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 25 Dec 2017 18:37:12 -0500 Subject: [PATCH 431/744] Restrict Jenkins build to 2 epochs --- examples/jenkins.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index f442388e..c3c33a25 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -17,5 +17,7 @@ module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 export OMPI_MCA_btl="tcp,self,sm" +sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml + echo $SLURM_NODELIST srun python mpi_learn.py From 4b88bf0f01093938e1d841742c1eda06fe50bbe1 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 25 Dec 2017 22:51:58 -0500 Subject: [PATCH 432/744] Trigger Jenkins build From ee385337702b7eac6bd3a69808e173d032dadcd0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 10:28:27 -0500 Subject: [PATCH 433/744] No longer in use --- examples/compare_batch_iterators.py | 75 ----------------------------- 1 file changed, 75 deletions(-) delete mode 100644 examples/compare_batch_iterators.py diff --git a/examples/compare_batch_iterators.py b/examples/compare_batch_iterators.py deleted file mode 100644 index ce57250f..00000000 --- a/examples/compare_batch_iterators.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python -from functools import partial -from itertools import tee - -class Loader(): - def example_batch_generator(self,n): - for batch in range(n): - yield batch - -class MPIModel(): - def __init__(self,batch_generator): - self.batch_iterator = batch_generator - - def train_epochs(self,M): - num_total = 8 - for epoch in range(M): - num_so_far = 0 - print ("Batch iter. summary: {}{}".format(self,self.batch_iterator)) - for batch in self.batch_iterator(): - num_so_far += 1 - - whatever=batch - print ("Next batch id: {}".format(batch)) - if num_so_far > num_total: break - print "+++++++" - - -class MPIModel_default(): - def __init__(self,batch_generator): - self.batch_iterator = batch_generator - - def train_epochs(self,M): - num_total = 8 #number of samples per epoch - batch_generator_func = self.batch_iterator() - - for iepoch in range(M): - #print ("Batch iter. summary: {}{} epoch: {}".format(self,self.batch_iterator,iepoch)) - num_so_far = 0 - - while num_so_far < num_total: - num_so_far += 1 - - try: - batch = batch_generator_func.next() - except StopIteration: - batch_generator_func = self.batch_iterator() - batch = batch_generator_func.next() - print ("Next batch id: {}".format(batch)) - - print "+++++++" - - - -def main(): - num_batches = 10 - epochs = 3 - - loader = Loader() - batch_generator = partial(loader.example_batch_generator,n=num_batches) - my_example_class = MPIModel(batch_generator) - my_example_class.train_epochs(epochs) - -def main_default(): - num_batches = 10 - epochs = 3 - - loader = Loader() - batch_generator = partial(loader.example_batch_generator,n=num_batches) - my_example_class = MPIModel_default(batch_generator) - my_example_class.train_epochs(epochs) - -if __name__=='__main__': - import timeit - #print min(timeit.Timer(setup=main).repeat(7, 1000)) - print min(timeit.Timer(setup=main_default).repeat(7, 1000)) From 81838b6350cd06d9635885eb7604c8b8090583c7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 12:00:33 -0500 Subject: [PATCH 434/744] PYTHONHASHSEED is not needed with hashlb md5 --- examples/guarantee_preprocessed.py | 2 -- examples/mpi_learn.py | 2 -- examples/signal_influence.py | 2 -- examples/simple_augmentation.py | 2 -- plasma/utils/batch_jobs.py | 4 ++-- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index 3f005f0e..67826ad0 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -11,8 +11,6 @@ pprint(conf) from plasma.preprocessor.preprocess import guarantee_preprocessed -os.environ["PYTHONHASHSEED"] = "0" - ##################################################### ####################PREPROCESSING#################### ##################################################### diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index e6fd6503..a965a86b 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -24,8 +24,6 @@ import random import numpy as np -os.environ["PYTHONHASHSEED"] = "0" - import matplotlib matplotlib.use('Agg') diff --git a/examples/signal_influence.py b/examples/signal_influence.py index 509af551..fc987177 100644 --- a/examples/signal_influence.py +++ b/examples/signal_influence.py @@ -26,8 +26,6 @@ import copy from functools import partial -os.environ["PYTHONHASHSEED"] = "0" - import matplotlib matplotlib.use('Agg') diff --git a/examples/simple_augmentation.py b/examples/simple_augmentation.py index e6c05a78..3afd19c9 100644 --- a/examples/simple_augmentation.py +++ b/examples/simple_augmentation.py @@ -26,8 +26,6 @@ import copy from functools import partial -os.environ["PYTHONHASHSEED"] = "0" - import matplotlib matplotlib.use('Agg') diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index f0bcea7f..a2c50a31 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -53,7 +53,7 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="f # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') - f.write('srun env PYTHONHASHSEED=0 python {}\n'.format(executable_name)) + f.write('srun python {}\n'.format(executable_name)) f.write('echo "done."') return filepath @@ -72,7 +72,7 @@ def create_pbs_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frn f.write('module load tensorflow\n') # f.write('rm $HOME/tigress/alexeys/model_checkpoints/*\n') f.write('cd {}\n'.format(subdir)) - f.write('aprun -n {} -N1 env PYTHONHASHSEED=0 env KERAS_HOME={} singularity exec $TENSORFLOW_CONTAINER python3 {}\n'.format(str(num_nodes),subdir,executable_name)) + f.write('aprun -n {} -N1 env KERAS_HOME={} singularity exec $TENSORFLOW_CONTAINER python3 {}\n'.format(str(num_nodes),subdir,executable_name)) f.write('echo "done."') return filepath From db55cbceeb3d73d8fade33b16982833c795e331c Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 12:01:12 -0500 Subject: [PATCH 435/744] Switch to hashlib.md5 hashing --- plasma/conf_parser.py | 3 ++- plasma/models/builder.py | 3 ++- plasma/models/shallow_runner.py | 6 ++++-- plasma/primitives/data.py | 3 ++- plasma/primitives/shots.py | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 1ded3a1a..42982ecd 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -6,6 +6,7 @@ import uuid import yaml +import hashlib def parameters(input_file): """Parse yaml file of configuration parameters.""" @@ -167,7 +168,7 @@ def parameters(input_file): return params def get_unique_signal_hash(signals): - return hash(tuple(sorted(signals))) + return int(hashlib.md5(''.join(tuple(map(lambda x: x.description, sorted(signals)))).encode('utf-8')).hexdigest(),16) #make sure 1D signals come last! This is necessary for model builder. def sort_by_channels(list_of_signals): diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 29d47fb0..0b223356 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -22,6 +22,7 @@ from copy import deepcopy from plasma.utils.downloading import makedirs_process_safe +import hashlib class LossHistory(Callback): def on_train_begin(self, logs=None): @@ -40,7 +41,7 @@ def get_unique_id(self): this_conf = deepcopy(self.conf) #don't make hash dependent on number of epochs. this_conf['training']['num_epochs'] = 0 - unique_id = hash(dill.dumps(this_conf)) + unique_id = int(hashlib.md5((dill.dumps(this_conf).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) return unique_id def get_0D_1D_indices(self): diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 140454cc..b9ccf883 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -29,6 +29,8 @@ from keras.utils.generic_utils import Progbar +import hashlib + debug_use_shots = 100000 model_filename = "saved_model.pkl" dataset_path = "dataset.npz" @@ -85,8 +87,8 @@ def load_shots(self,shot_list,is_inference=False,as_list=False,num_samples=np.In def get_save_prepath(self): prepath = self.loader.conf['paths']['processed_prepath'] use_signals = self.loader.conf['paths']['use_signals'] - identifying_tuple = tuple(sorted(use_signals)) - save_prepath = prepath + "shallow/use_signals_{}/".format(hash(identifying_tuple)) + identifying_tuple = ''.join(tuple(map(lambda x: x.description, sorted(use_signals)))).encode('utf-8') + save_prepath = prepath + "shallow/use_signals_{}/".format(int(hashlib.md5(identifying_tuple).hexdigest(),16)) return save_prepath def process(self,shot): diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 9085f8ee..c18dd1f4 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -184,7 +184,8 @@ def __lt__(self,other): return self.description.__lt__(other.description) def __hash__(self): - return self.description.__hash__() + import hashlib + return int(hashlib.md5(self.description.encode('utf-8')).hexdigest(),16) def __str__(self): return self.description diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 383ed7e6..09685093 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -323,8 +323,8 @@ def __eq__(self,other): return self.get_id_str().__eq__(other.get_id_str()) def __hash__(self): - return self.get_id_str().__hash__() - + import hashlib + return int(hashlib.md5(self.get_id_str().encode('utf-8')).hexdigest(),16) def __str__(self): string = 'number: {}\n'.format(self.number) From c15f05ebe6c61966f23e6023da2f9e86534ccecd Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 12:02:01 -0500 Subject: [PATCH 436/744] Full build integration chain for Python 2 and Python 3 --- examples/jenkins.sh | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/examples/jenkins.sh b/examples/jenkins.sh index c3c33a25..88b65a09 100644 --- a/examples/jenkins.sh +++ b/examples/jenkins.sh @@ -1,23 +1,38 @@ #!/bin/bash -rm /tigress/alexeys/model_checkpoints/* -rm -rf /tigress/alexeys/processed_shots -rm -rf /tigress/alexeys/processed_shotlists -rm -rf /tigress/alexeys/normalization +export OMPI_MCA_btl="tcp,self,sm" ls ${PWD} echo "Jenkins test Python3.6" -export PYTHONHASHSEED=0 +rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/processed_shots +rm -rf /tigress/alexeys/processed_shotlists +rm -rf /tigress/alexeys/normalization module load anaconda3 source activate PPPL_dev3 module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 -export OMPI_MCA_btl="tcp,self,sm" sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml echo $SLURM_NODELIST srun python mpi_learn.py + +echo "Jenkins test Python2.7" +rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/normalization + +source deactivate +module purge +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +echo $SLURM_NODELIST +srun python mpi_learn.py From 8bfac27b09a052b2860d8e4bd15997428ac3e656 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Tue, 26 Dec 2017 12:39:56 -0500 Subject: [PATCH 437/744] Trigger jenkins test From 47025539b3904642102d0c282b948c813296cc3a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 13:58:54 -0500 Subject: [PATCH 438/744] Refactor --- examples/jenkins.sh | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 examples/jenkins.sh diff --git a/examples/jenkins.sh b/examples/jenkins.sh deleted file mode 100644 index 88b65a09..00000000 --- a/examples/jenkins.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -export OMPI_MCA_btl="tcp,self,sm" - -ls ${PWD} - -echo "Jenkins test Python3.6" -rm /tigress/alexeys/model_checkpoints/* -rm -rf /tigress/alexeys/processed_shots -rm -rf /tigress/alexeys/processed_shotlists -rm -rf /tigress/alexeys/normalization -module load anaconda3 -source activate PPPL_dev3 -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 - -sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml - -echo $SLURM_NODELIST -srun python mpi_learn.py - -echo "Jenkins test Python2.7" -rm /tigress/alexeys/model_checkpoints/* -rm -rf /tigress/alexeys/normalization - -source deactivate -module purge -module load anaconda -source activate PPPL -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 - -echo $SLURM_NODELIST -srun python mpi_learn.py From ffc35915b695a032a999a0f72f870fc0dc5787ff Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 13:59:05 -0500 Subject: [PATCH 439/744] Refactor --- jenkins-ci/jenkins.sh | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 jenkins-ci/jenkins.sh diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh new file mode 100644 index 00000000..88b65a09 --- /dev/null +++ b/jenkins-ci/jenkins.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +export OMPI_MCA_btl="tcp,self,sm" + +ls ${PWD} + +echo "Jenkins test Python3.6" +rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/processed_shots +rm -rf /tigress/alexeys/processed_shotlists +rm -rf /tigress/alexeys/normalization +module load anaconda3 +source activate PPPL_dev3 +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml + +echo $SLURM_NODELIST +srun python mpi_learn.py + +echo "Jenkins test Python2.7" +rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/normalization + +source deactivate +module purge +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +echo $SLURM_NODELIST +srun python mpi_learn.py From 3da647581a3c81707ec17cd6194b3199e5b2dbaa Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 13:59:43 -0500 Subject: [PATCH 440/744] Refactor --- jenkins-ci/{jenkins.sh => jenkins3.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename jenkins-ci/{jenkins.sh => jenkins3.sh} (100%) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins3.sh similarity index 100% rename from jenkins-ci/jenkins.sh rename to jenkins-ci/jenkins3.sh From 02b5921425dee5c7204689a283acdcdf38aff862 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 14:00:12 -0500 Subject: [PATCH 441/744] Python3 only --- jenkins-ci/jenkins3.sh | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/jenkins-ci/jenkins3.sh b/jenkins-ci/jenkins3.sh index 88b65a09..699e78bc 100644 --- a/jenkins-ci/jenkins3.sh +++ b/jenkins-ci/jenkins3.sh @@ -20,19 +20,3 @@ sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml echo $SLURM_NODELIST srun python mpi_learn.py - -echo "Jenkins test Python2.7" -rm /tigress/alexeys/model_checkpoints/* -rm -rf /tigress/alexeys/normalization - -source deactivate -module purge -module load anaconda -source activate PPPL -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 - -echo $SLURM_NODELIST -srun python mpi_learn.py From 0f63dd240f0763ffa3ace4069f1780c19f423cf5 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 14:01:19 -0500 Subject: [PATCH 442/744] Python2 only --- jenkins-ci/jenkins2.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 jenkins-ci/jenkins2.sh diff --git a/jenkins-ci/jenkins2.sh b/jenkins-ci/jenkins2.sh new file mode 100644 index 00000000..87e3e282 --- /dev/null +++ b/jenkins-ci/jenkins2.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +ls ${PWD} + +echo "Jenkins test Python2.7" +rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/normalization + +source deactivate +module purge +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +echo $SLURM_NODELIST +srun python mpi_learn.py From d9d30b7683c98dca5fa404ed9fd4c21d54c062e0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 14:02:13 -0500 Subject: [PATCH 443/744] Adjust folder structure --- jenkins-ci/jenkins2.sh | 1 + jenkins-ci/jenkins3.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/jenkins-ci/jenkins2.sh b/jenkins-ci/jenkins2.sh index 87e3e282..201ee7f8 100644 --- a/jenkins-ci/jenkins2.sh +++ b/jenkins-ci/jenkins2.sh @@ -16,4 +16,5 @@ module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 echo $SLURM_NODELIST +cd examples srun python mpi_learn.py diff --git a/jenkins-ci/jenkins3.sh b/jenkins-ci/jenkins3.sh index 699e78bc..068e20ec 100644 --- a/jenkins-ci/jenkins3.sh +++ b/jenkins-ci/jenkins3.sh @@ -19,4 +19,5 @@ module load intel/17.0/64/17.0.4.196 sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml echo $SLURM_NODELIST +cd examples srun python mpi_learn.py From 9b973c94da4e3ab00b79efe3dc7bea195ba749c4 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Tue, 26 Dec 2017 14:28:42 -0500 Subject: [PATCH 444/744] Trigger jenkins test From a79e511fda749d8f34869bac0db07a51e4b3b515 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 17:40:03 -0500 Subject: [PATCH 445/744] Roll back to the single script option --- jenkins-ci/{jenkins3.sh => jenkins.sh} | 17 +++++++++++++++++ jenkins-ci/jenkins2.sh | 20 -------------------- 2 files changed, 17 insertions(+), 20 deletions(-) rename jenkins-ci/{jenkins3.sh => jenkins.sh} (59%) delete mode 100644 jenkins-ci/jenkins2.sh diff --git a/jenkins-ci/jenkins3.sh b/jenkins-ci/jenkins.sh similarity index 59% rename from jenkins-ci/jenkins3.sh rename to jenkins-ci/jenkins.sh index 068e20ec..b9a6d457 100644 --- a/jenkins-ci/jenkins3.sh +++ b/jenkins-ci/jenkins.sh @@ -21,3 +21,20 @@ sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml echo $SLURM_NODELIST cd examples srun python mpi_learn.py + +echo "Jenkins test Python2.7" +rm /tigress/alexeys/model_checkpoints/* +rm -rf /tigress/alexeys/normalization + +source deactivate +module purge +module load anaconda +source activate PPPL +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +echo $SLURM_NODELIST +cd examples +srun python mpi_learn.py diff --git a/jenkins-ci/jenkins2.sh b/jenkins-ci/jenkins2.sh deleted file mode 100644 index 201ee7f8..00000000 --- a/jenkins-ci/jenkins2.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -ls ${PWD} - -echo "Jenkins test Python2.7" -rm /tigress/alexeys/model_checkpoints/* -rm -rf /tigress/alexeys/normalization - -source deactivate -module purge -module load anaconda -source activate PPPL -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 - -echo $SLURM_NODELIST -cd examples -srun python mpi_learn.py From 09d2bda1a3dda7afe07e39eb24c57a200eb8d02c Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 17:41:54 -0500 Subject: [PATCH 446/744] Reinstall for each Python --- jenkins-ci/jenkins.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index b9a6d457..7941bc94 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -16,6 +16,8 @@ module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 +python setup.py install + sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml echo $SLURM_NODELIST @@ -35,6 +37,9 @@ module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 +cd .. +python setup.py install + echo $SLURM_NODELIST cd examples srun python mpi_learn.py From 65cb115c5da1a76754ced7fb1664e3063eee2a89 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 21:16:11 -0500 Subject: [PATCH 447/744] Add Jenkins Slurm methods --- plasma/utils/batch_jobs.py | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index a2c50a31..5ea2e03a 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -11,8 +11,6 @@ def generate_working_dirname(run_directory): s += "_{}".format(uuid.uuid4()) return run_directory + s - - def get_executable_name(conf): shallow = conf['model']['shallow'] if shallow: @@ -31,6 +29,36 @@ def start_slurm_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="an sp.Popen("sbatch "+script,shell=True) +def create_jenkins_script(subdir,num_nodes,executable_name,test_configuration,env_name="frnn",env_type="anaconda"): + filename = "jenkins_{}_{}.cmd".format(test_configuration[0],test_configuration[1]) #version of Python and the dataset + filepath = os.path.join(subdir,filename) + user = getpass.getuser() + with open(filepath,"w") as f: + f.write('#!/usr/bin/bash\n') + f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') + f.write('echo \"Jenkins test {}\"\n'.format(test_configuration[1])) + f.write('rm /tigress/alexeys/model_checkpoints/*\n') + f.write('rm -rf /tigress/alexeys/processed_shots\n') + f.write('rm -rf /tigress/alexeys/processed_shotlists\n') + f.write('rm -rf /tigress/alexeys/normalization\n') + f.write('module load {}\n'.format(env_type)) + f.write('source activate {}\n'.format(env_name)) + f.write('module load cudatoolkit/8.0\n') + f.write('module load cudnn/cuda-8.0/6.0\n') + f.write('module load openmpi/cuda-8.0/intel-17.0/2.1.0/64\n') + f.write('module load intel/17.0/64/17.0.4.196\n') + f.write('cd /home/alexeys/jenkins/workspace/FRNM/PPPL\n') + f.write('python setup.py install\n') + f.write('cd {}\n'.format(subdir)) + f.write('srun -N 2 -n 8 python {}\n'.format(executable_name)) + + return filepath + +def start_jenkins_job(subdir,num_nodes,executable_name,test_configuration,env_name,env_type): + os.system(" ".join(["cp -p",executable_name,subdir])) + script = create_jenkins_script(subdir,num_nodes,executable_name,test_configuration,env_name,env_type) + sp.Popen("sh "+script,shell=True) + def start_pbs_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="anaconda"): executable_name,use_mpi = get_executable_name(conf) os.system(" ".join(["cp -p",executable_name,subdir])) From ced42ed77577e588af5e9edb7caa99241b4aea52 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 21:16:30 -0500 Subject: [PATCH 448/744] Jenkins driver script --- jenkins-ci/run_jenkins.py | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 jenkins-ci/run_jenkins.py diff --git a/jenkins-ci/run_jenkins.py b/jenkins-ci/run_jenkins.py new file mode 100644 index 00000000..1cc1d36d --- /dev/null +++ b/jenkins-ci/run_jenkins.py @@ -0,0 +1,56 @@ +from plasma.utils.batch_jobs import generate_working_dirname,copy_files_to_environment,start_jenkins_job +import yaml +import sys,os,getpass +import plasma.conf + +num_nodes = 3 +test_matrix = [("Python3","jet_data"),("Python2","jet_data")] + +run_directory = "{}/{}/jenkins/".format(plasma.conf.conf['fs_path'],getpass.getuser()) +template_path = os.environ['PWD'] +conf_name = "conf.yaml" +executable_name = "mpi_learn.py" + +def generate_conf_file(test_configuration,template_path = "../",save_path = "./",conf_name="conf.yaml"): + assert(template_path != save_path) + with open(os.path.join(template_path,conf_name), 'r') as yaml_file: + conf = yaml.load(yaml_file) + conf['training']['num_epochs'] = 2 + conf['paths']['data'] = test_configuration[1] + if test_configuration[1] == "Python3": + conf['env']['name'] = "PPPL_dev3" + conf['env']['type'] = "anaconda3" + else: + conf['env']['name'] = "PPPL" + conf['env']['type'] = "anaconda" + + with open(os.path.join(save_path,conf_name), 'w') as outfile: + yaml.dump(conf, outfile, default_flow_style=False) + return conf + +working_directory = generate_working_dirname(run_directory) +os.makedirs(working_directory) + +os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) +os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) + +#os.chdir(working_directory) +#print("Going into {}".format(working_directory)) + +for ci in test_matrix: + subdir = working_directory + "/{}/".format(ci[0]) + os.makedirs(subdir) + copy_files_to_environment(subdir) + print("Making modified conf") + conf = generate_conf_file(ci,working_directory,subdir,conf_name) + print("Starting job") + if ci[1] == "Python3": + env_name = "PPPL_dev3" + env_type = "anaconda3" + else: + env_name = "PPPL" + env_type = "anaconda" + start_jenkins_job(subdir,num_nodes,executable_name,ci,env_name,env_type) + + +print("submitted jobs.") From 61fa87927ad20cb889197f4e9935f4989d99a62c Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Tue, 26 Dec 2017 21:19:27 -0500 Subject: [PATCH 449/744] Trigger jenkins test From 638539313e829e1442717e167eeebe36f5c26a53 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 21:22:41 -0500 Subject: [PATCH 450/744] Assigned based on half of num_nodes --- plasma/utils/batch_jobs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index 5ea2e03a..56203b97 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -1,3 +1,4 @@ +from __future__ import division from pprint import pprint import yaml import datetime @@ -50,7 +51,7 @@ def create_jenkins_script(subdir,num_nodes,executable_name,test_configuration,en f.write('cd /home/alexeys/jenkins/workspace/FRNM/PPPL\n') f.write('python setup.py install\n') f.write('cd {}\n'.format(subdir)) - f.write('srun -N 2 -n 8 python {}\n'.format(executable_name)) + f.write('srun -N {} -n {} python {}\n'.format(num_nodes//2, num_nodes//2*4, executable_name)) return filepath From acc988758e01da84989e37aafa4234e1bbb80dd7 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 21:23:17 -0500 Subject: [PATCH 451/744] Set num_nodes as in Jenkins project area --- jenkins-ci/run_jenkins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins-ci/run_jenkins.py b/jenkins-ci/run_jenkins.py index 1cc1d36d..57be2675 100644 --- a/jenkins-ci/run_jenkins.py +++ b/jenkins-ci/run_jenkins.py @@ -3,7 +3,7 @@ import sys,os,getpass import plasma.conf -num_nodes = 3 +num_nodes = 4 #Set in the Jenkins project area!! test_matrix = [("Python3","jet_data"),("Python2","jet_data")] run_directory = "{}/{}/jenkins/".format(plasma.conf.conf['fs_path'],getpass.getuser()) From 76caa749794185e3e9f99698fcefc5614adec960 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 21:37:03 -0500 Subject: [PATCH 452/744] Easier parsing with sed --- examples/conf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 1b308cd8..a71947fb 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,7 +10,7 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: 'jet_data' #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: jet_data #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" From 7d09aad76530898dac4aac192899bb6db645fb94 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 26 Dec 2017 21:39:42 -0500 Subject: [PATCH 453/744] Python based driver scripot for Jenkins --- jenkins-ci/jenkins.py | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 jenkins-ci/jenkins.py diff --git a/jenkins-ci/jenkins.py b/jenkins-ci/jenkins.py new file mode 100644 index 00000000..f7d4f252 --- /dev/null +++ b/jenkins-ci/jenkins.py @@ -0,0 +1,48 @@ +#!/bin/bash +from subprocess import Popen + +Popen("export OMPI_MCA_btl=\"tcp,self,sm\"",shell=True) + +Popen("echo \"Jenkins test Python3.6\"",shell=True) +Popen("rm /tigress/alexeys/model_checkpoints/*",shell=True) +Popen("rm -rf /tigress/alexeys/processed_shots",shell=True) +Popen("rm -rf /tigress/alexeys/processed_shotlists",shell=True) +Popen("rm -rf /tigress/alexeys/normalization",shell=True) +Popen("module load anaconda3",shell=True) +Popen("source activate PPPL_dev3",shell=True) +Popen("module load cudatoolkit/8.0",shell=True) +Popen("module load cudnn/cuda-8.0/6.0",shell=True) +Popen("module load openmpi/cuda-8.0/intel-17.0/2.1.0/64",shell=True) +Popen("module load intel/17.0/64/17.0.4.196",shell=True) + +Popen("python setup.py install",shell=True) + +Popen("sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml",shell=True) + +Popen("echo $SLURM_NODELIST",shell=True) +Popen("cd examples",shell=True) +Popen("srun python mpi_learn.py",shell=True).wait() + +Popen("echo \"Jenkins test Python2.7\"",shell=True) +Popen("rm /tigress/alexeys/model_checkpoints/*",shell=True) +Popen("rm -rf /tigress/alexeys/processed_shots",shell=True) +Popen("rm -rf /tigress/alexeys/processed_shotlists",shell=True) +Popen("rm -rf /tigress/alexeys/normalization",shell=True) + +Popen("source deactivate",shell=True) +Popen("module purge",shell=True) +Popen("module load anaconda",shell=True) +Popen("source activate PPPL",shell=True) +Popen("module load cudatoolkit/8.0",shell=True) +Popen("module load cudnn/cuda-8.0/6.0",shell=True) +Popen("module load openmpi/cuda-8.0/intel-17.0/2.1.0/64",shell=True) +Popen("module load intel/17.0/64/17.0.4.196",shell=True) + +Popen("cd ..",shell=True) +Popen("python setup.py install",shell=True) + +Popen("sed -i -e 's/data: jet_data/data: d3d_data/g' conf.yaml",shell=True) + +Popen("echo $SLURM_NODELIST",shell=True) +Popen("cd examples",shell=True) +Popen("srun python mpi_learn.py",shell=True).wait() From eff3c9be66668e0ddeae2b055702065faffdbeec Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 27 Dec 2017 11:54:42 -0500 Subject: [PATCH 454/744] Fix error in UnivariateSpline affecting edens_profile --- plasma/primitives/data.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index c18dd1f4..3e8136e8 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -226,8 +226,11 @@ def load_data(self,prepath,shot,dtype='float32'): sig_interp = np.zeros((timesteps,self.num_channels)) for i in range(timesteps): _,order = np.unique(mapping[i,:],return_index=True) #make sure the mapping is ordered and unique - f = UnivariateSpline(mapping[i,order],sig[i,order],s=0,k=1,ext=0) - sig_interp[i,:] = f(remapping) + if sig[i,order].shape[0] > 2: + f = UnivariateSpline(mapping[i,order],sig[i,order],s=0,k=1,ext=0) + sig_interp[i,:] = f(remapping) + else: + print('Signal {}, shot {} has not enough points for linear interpolation. dfitpack.error: (m>k) failed for hidden m: fpcurf0:m=1'.format(self.description,shot.number)) return t,sig_interp,True From 2aa248623fc1b66363705ac86e6f36f14b425df6 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 27 Dec 2017 11:55:38 -0500 Subject: [PATCH 455/744] Version 1.0 --- plasma/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/version.py b/plasma/version.py index 78235354..758ad1a2 100644 --- a/plasma/version.py +++ b/plasma/version.py @@ -1,6 +1,6 @@ import re -__version__ = "0.3.0" +__version__ = "1.0.0" version = __version__ From d13ee33f4301474eae56c77f26e12fc240703476 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Wed, 27 Dec 2017 11:59:51 -0500 Subject: [PATCH 456/744] return None,None,False in case of problem --- plasma/primitives/data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 3e8136e8..1354f506 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -231,6 +231,7 @@ def load_data(self,prepath,shot,dtype='float32'): sig_interp[i,:] = f(remapping) else: print('Signal {}, shot {} has not enough points for linear interpolation. dfitpack.error: (m>k) failed for hidden m: fpcurf0:m=1'.format(self.description,shot.number)) + return None,None,False return t,sig_interp,True From 6027021e93a407316e917331f9fea717dac34aea Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 28 Dec 2017 11:59:26 -0500 Subject: [PATCH 457/744] Add dedicated jenkins shotlists --- jenkins-ci/jenkins.py | 3 ++- jenkins-ci/jenkins.sh | 4 +++- plasma/conf_parser.py | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/jenkins-ci/jenkins.py b/jenkins-ci/jenkins.py index f7d4f252..f42c3a78 100644 --- a/jenkins-ci/jenkins.py +++ b/jenkins-ci/jenkins.py @@ -18,6 +18,7 @@ Popen("python setup.py install",shell=True) Popen("sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml",shell=True) +Popen("sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml",shell=True) Popen("echo $SLURM_NODELIST",shell=True) Popen("cd examples",shell=True) @@ -41,7 +42,7 @@ Popen("cd ..",shell=True) Popen("python setup.py install",shell=True) -Popen("sed -i -e 's/data: jet_data/data: d3d_data/g' conf.yaml",shell=True) +Popen("sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml",shell=True) Popen("echo $SLURM_NODELIST",shell=True) Popen("cd examples",shell=True) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 7941bc94..218b251c 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -19,6 +19,7 @@ module load intel/17.0/64/17.0.4.196 python setup.py install sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml +sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml echo $SLURM_NODELIST cd examples @@ -26,7 +27,6 @@ srun python mpi_learn.py echo "Jenkins test Python2.7" rm /tigress/alexeys/model_checkpoints/* -rm -rf /tigress/alexeys/normalization source deactivate module purge @@ -40,6 +40,8 @@ module load intel/17.0/64/17.0.4.196 cd .. python setup.py install +sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml + echo $SLURM_NODELIST cd examples srun python mpi_learn.py diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 42982ecd..15bf4dbe 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -70,12 +70,17 @@ def parameters(input_file): #shot lists jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') + + jenkins_jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['jenkins_CWall_clear.txt','jenkins_CFC_unint.txt'],'Subset of jet carbon wall data for Jenkins tests') + jenkins_jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['jenkins_ILW_unint.txt','jenkins_BeWall_clear.txt'],'Subset of jet iter like wall data for Jenkins tests') + jet_full = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') d3d_10000 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_10000.txt','d3d_disrupt_10000.txt'],'d3d data 10000 ND and D shots') d3d_1000 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_1000.txt','d3d_disrupt_1000.txt'],'d3d data 1000 ND and D shots') d3d_100 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_100.txt','d3d_disrupt_100.txt'],'d3d data 100 ND and D shots') d3d_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') + d3d_jenkins = ShotListFiles(d3d,params['paths']['shot_list_dir'],['jenkins_d3d_clear.txt','jenkins_d3d_disrupt.txt'],'Subset of d3d data for Jenkins test') d3d_jb_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') nstx_full = ShotListFiles(nstx,params['paths']['shot_list_dir'],['disrupt_nstx.txt'],'nstx shots (all are disruptive') @@ -96,6 +101,10 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = jet_signals + elif params['paths']['data'] == 'jenkins_jet': + params['paths']['shot_files'] = [jenkins_jet_carbon_wall] + params['paths']['shot_files_test'] = [jenkins_jet_iterlike_wall] + params['paths']['use_signals_dict'] = jet_signals elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] @@ -117,6 +126,12 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = d3d_signals + elif params['paths']['data'] == 'jenkins_d3d': + params['paths']['shot_files'] = [d3d_jenkins] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, +'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + #cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': From d194f50ddd267e6908953344a033ffe25dd7639e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 28 Dec 2017 12:15:10 -0500 Subject: [PATCH 458/744] Proper folder structure --- jenkins-ci/jenkins.py | 10 ++++++---- jenkins-ci/jenkins.sh | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/jenkins-ci/jenkins.py b/jenkins-ci/jenkins.py index f42c3a78..13685a03 100644 --- a/jenkins-ci/jenkins.py +++ b/jenkins-ci/jenkins.py @@ -17,11 +17,12 @@ Popen("python setup.py install",shell=True) +Popen("echo $SLURM_NODELIST",shell=True) +Popen("cd examples",shell=True) + Popen("sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml",shell=True) Popen("sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml",shell=True) -Popen("echo $SLURM_NODELIST",shell=True) -Popen("cd examples",shell=True) Popen("srun python mpi_learn.py",shell=True).wait() Popen("echo \"Jenkins test Python2.7\"",shell=True) @@ -42,8 +43,9 @@ Popen("cd ..",shell=True) Popen("python setup.py install",shell=True) -Popen("sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml",shell=True) - Popen("echo $SLURM_NODELIST",shell=True) Popen("cd examples",shell=True) + +Popen("sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml",shell=True) + Popen("srun python mpi_learn.py",shell=True).wait() diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 218b251c..1d6f5dbb 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -18,11 +18,11 @@ module load intel/17.0/64/17.0.4.196 python setup.py install +echo $SLURM_NODELIST +cd examples sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml -echo $SLURM_NODELIST -cd examples srun python mpi_learn.py echo "Jenkins test Python2.7" @@ -40,8 +40,8 @@ module load intel/17.0/64/17.0.4.196 cd .. python setup.py install -sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml - echo $SLURM_NODELIST cd examples +sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml + srun python mpi_learn.py From 574a77c327eff6a7b561b82689a39f65bd55cde4 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 28 Dec 2017 12:32:08 -0500 Subject: [PATCH 459/744] Proper folder structure --- jenkins-ci/jenkins.py | 1 + jenkins-ci/jenkins.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/jenkins-ci/jenkins.py b/jenkins-ci/jenkins.py index 13685a03..bb5f07a0 100644 --- a/jenkins-ci/jenkins.py +++ b/jenkins-ci/jenkins.py @@ -15,6 +15,7 @@ Popen("module load openmpi/cuda-8.0/intel-17.0/2.1.0/64",shell=True) Popen("module load intel/17.0/64/17.0.4.196",shell=True) +Popen("cd ..",shell=True) Popen("python setup.py install",shell=True) Popen("echo $SLURM_NODELIST",shell=True) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 1d6f5dbb..8e1000fa 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -16,6 +16,7 @@ module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 +cd .. python setup.py install echo $SLURM_NODELIST From 53626d31b4520ed0ce6aae4c8947dfd128bb6eb2 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 28 Dec 2017 12:46:32 -0500 Subject: [PATCH 460/744] Proper folder structure --- jenkins-ci/jenkins.py | 2 +- jenkins-ci/jenkins.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jenkins-ci/jenkins.py b/jenkins-ci/jenkins.py index bb5f07a0..38d6a4fe 100644 --- a/jenkins-ci/jenkins.py +++ b/jenkins-ci/jenkins.py @@ -15,7 +15,7 @@ Popen("module load openmpi/cuda-8.0/intel-17.0/2.1.0/64",shell=True) Popen("module load intel/17.0/64/17.0.4.196",shell=True) -Popen("cd ..",shell=True) +Popen("cd /home/alexeys/jenkins/workspace/FRNM/PPPL",shell=True) Popen("python setup.py install",shell=True) Popen("echo $SLURM_NODELIST",shell=True) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 8e1000fa..a84a7845 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -16,7 +16,7 @@ module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 -cd .. +cd /home/alexeys/jenkins/workspace/FRNM/PPPL python setup.py install echo $SLURM_NODELIST From 4527475e8eba394446fd35f5776f0e3066d87b48 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 28 Dec 2017 12:51:02 -0500 Subject: [PATCH 461/744] Debug --- jenkins-ci/jenkins.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index a84a7845..ce02f8e9 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -2,7 +2,7 @@ export OMPI_MCA_btl="tcp,self,sm" -ls ${PWD} +echo ${PWD} echo "Jenkins test Python3.6" rm /tigress/alexeys/model_checkpoints/* @@ -16,11 +16,16 @@ module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 module load intel/17.0/64/17.0.4.196 +echo ${PWD} cd /home/alexeys/jenkins/workspace/FRNM/PPPL +echo ${PWD} python setup.py install +echo ${PWD} echo $SLURM_NODELIST cd examples +echo ${PWD} +ls ${PWD} sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml From 2b85a83c886923a5f38402822d82bf2a4a8645a2 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Thu, 28 Dec 2017 12:52:37 -0500 Subject: [PATCH 462/744] Debug --- jenkins-ci/jenkins.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index ce02f8e9..234759f2 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -49,5 +49,4 @@ python setup.py install echo $SLURM_NODELIST cd examples sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml - srun python mpi_learn.py From 5fe9636742c813cef6daed42de2d26f9c13da9e5 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 28 Dec 2017 21:19:04 -0500 Subject: [PATCH 463/744] Don't trus latest anaconda for now, roll back to 4.4.0 --- jenkins-ci/jenkins.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 234759f2..584d2a54 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -9,7 +9,7 @@ rm /tigress/alexeys/model_checkpoints/* rm -rf /tigress/alexeys/processed_shots rm -rf /tigress/alexeys/processed_shotlists rm -rf /tigress/alexeys/normalization -module load anaconda3 +module load anaconda3/4.4.0 source activate PPPL_dev3 module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 @@ -36,7 +36,7 @@ rm /tigress/alexeys/model_checkpoints/* source deactivate module purge -module load anaconda +module load anaconda/4.4.0 source activate PPPL module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 From 1f92ec0bf8b0743cc77ad7d698214fa0f3a2f202 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Thu, 28 Dec 2017 21:43:17 -0500 Subject: [PATCH 464/744] Trigger jenkins build --- jenkins-ci/jenkins.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 584d2a54..9312a06e 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -21,7 +21,6 @@ cd /home/alexeys/jenkins/workspace/FRNM/PPPL echo ${PWD} python setup.py install -echo ${PWD} echo $SLURM_NODELIST cd examples echo ${PWD} From d3beb0956eb95401e796dd401e804414c12c0d6a Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Fri, 29 Dec 2017 09:41:23 -0500 Subject: [PATCH 465/744] Trigger jenkins test --- jenkins-ci/jenkins.sh | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 9312a06e..f0f4a8f3 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -31,21 +31,21 @@ sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml srun python mpi_learn.py echo "Jenkins test Python2.7" -rm /tigress/alexeys/model_checkpoints/* - -source deactivate -module purge -module load anaconda/4.4.0 -source activate PPPL -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 - -cd .. -python setup.py install - -echo $SLURM_NODELIST -cd examples -sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml -srun python mpi_learn.py +#rm /tigress/alexeys/model_checkpoints/* + +#source deactivate +#module purge +#module load anaconda/4.4.0 +#source activate PPPL +#module load cudatoolkit/8.0 +#module load cudnn/cuda-8.0/6.0 +#module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +#module load intel/17.0/64/17.0.4.196 + +#cd .. +#python setup.py install + +#echo $SLURM_NODELIST +#cd examples +#sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml +#srun python mpi_learn.py From 90ba457bca1a26541684b6bbc88537bfdb033535 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 09:59:36 -0500 Subject: [PATCH 466/744] Obsolete --- jenkins-ci/jenkins.py | 52 ------------------------------------------- 1 file changed, 52 deletions(-) delete mode 100644 jenkins-ci/jenkins.py diff --git a/jenkins-ci/jenkins.py b/jenkins-ci/jenkins.py deleted file mode 100644 index 38d6a4fe..00000000 --- a/jenkins-ci/jenkins.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -from subprocess import Popen - -Popen("export OMPI_MCA_btl=\"tcp,self,sm\"",shell=True) - -Popen("echo \"Jenkins test Python3.6\"",shell=True) -Popen("rm /tigress/alexeys/model_checkpoints/*",shell=True) -Popen("rm -rf /tigress/alexeys/processed_shots",shell=True) -Popen("rm -rf /tigress/alexeys/processed_shotlists",shell=True) -Popen("rm -rf /tigress/alexeys/normalization",shell=True) -Popen("module load anaconda3",shell=True) -Popen("source activate PPPL_dev3",shell=True) -Popen("module load cudatoolkit/8.0",shell=True) -Popen("module load cudnn/cuda-8.0/6.0",shell=True) -Popen("module load openmpi/cuda-8.0/intel-17.0/2.1.0/64",shell=True) -Popen("module load intel/17.0/64/17.0.4.196",shell=True) - -Popen("cd /home/alexeys/jenkins/workspace/FRNM/PPPL",shell=True) -Popen("python setup.py install",shell=True) - -Popen("echo $SLURM_NODELIST",shell=True) -Popen("cd examples",shell=True) - -Popen("sed -i -e 's/num_epochs: 1000/num_epochs: 2/g' conf.yaml",shell=True) -Popen("sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml",shell=True) - -Popen("srun python mpi_learn.py",shell=True).wait() - -Popen("echo \"Jenkins test Python2.7\"",shell=True) -Popen("rm /tigress/alexeys/model_checkpoints/*",shell=True) -Popen("rm -rf /tigress/alexeys/processed_shots",shell=True) -Popen("rm -rf /tigress/alexeys/processed_shotlists",shell=True) -Popen("rm -rf /tigress/alexeys/normalization",shell=True) - -Popen("source deactivate",shell=True) -Popen("module purge",shell=True) -Popen("module load anaconda",shell=True) -Popen("source activate PPPL",shell=True) -Popen("module load cudatoolkit/8.0",shell=True) -Popen("module load cudnn/cuda-8.0/6.0",shell=True) -Popen("module load openmpi/cuda-8.0/intel-17.0/2.1.0/64",shell=True) -Popen("module load intel/17.0/64/17.0.4.196",shell=True) - -Popen("cd ..",shell=True) -Popen("python setup.py install",shell=True) - -Popen("echo $SLURM_NODELIST",shell=True) -Popen("cd examples",shell=True) - -Popen("sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml",shell=True) - -Popen("srun python mpi_learn.py",shell=True).wait() From ea0b6b295353d005e04e67b3834434fb047c7927 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:05:58 -0500 Subject: [PATCH 467/744] Validate jenkins --- jenkins-ci/validate_jenkins.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 jenkins-ci/validate_jenkins.py diff --git a/jenkins-ci/validate_jenkins.py b/jenkins-ci/validate_jenkins.py new file mode 100644 index 00000000..6014fb2b --- /dev/null +++ b/jenkins-ci/validate_jenkins.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import mpi4py as mmm +print(mmm.__version__) + +import keras as kk +print(kk.__version__) + +import tensorflow as tf +print(tf.__version__) + +from mpi4py import MPI +import sys + +size = MPI.COMM_WORLD.Get_size() +rank = MPI.COMM_WORLD.Get_rank() +name = MPI.Get_processor_name() + +sys.stdout.write( + "Hello, World! I am process %d of %d on %s.\n" + % (rank, size, name)) From a2cd354fd7fbace3b7eb9fa57466ad5c2bf0c40e Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:06:18 -0500 Subject: [PATCH 468/744] Validate jenkins --- jenkins-ci/validate_jenkins.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 jenkins-ci/validate_jenkins.sh diff --git a/jenkins-ci/validate_jenkins.sh b/jenkins-ci/validate_jenkins.sh new file mode 100644 index 00000000..1d925ad2 --- /dev/null +++ b/jenkins-ci/validate_jenkins.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +export OMPI_MCA_btl="tcp,self,sm" + +module load anaconda3 +source activate PPPL_dev3 +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + +cd /home/alexeys/jenkins/workspace/FRNM/PPPL +python setup.py install + +echo `which python` +echo `which mpicc` + +echo ${PWD} +echo $SLURM_NODELIST + +cd examples +echo ${PWD} +ls ${PWD} + +srun python validate_jenkins.py From 47df24a26e528fff2ec0640577b0b5531d53673a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:14:56 -0500 Subject: [PATCH 469/744] Create new anaconda env every test --- jenkins-ci/validate_jenkins.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jenkins-ci/validate_jenkins.sh b/jenkins-ci/validate_jenkins.sh index 1d925ad2..37950a3f 100644 --- a/jenkins-ci/validate_jenkins.sh +++ b/jenkins-ci/validate_jenkins.sh @@ -2,8 +2,9 @@ export OMPI_MCA_btl="tcp,self,sm" -module load anaconda3 -source activate PPPL_dev3 +module load anaconda3/4.4.0 +conda create --yes --name jenkins3 --prefix /tigress/alexeys/jenkins --file requirements-travis.txt +source activate jenkins3 module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 From 7768b6861bc9c2b5e1dc433f2285a29e7b3a68a0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:23:46 -0500 Subject: [PATCH 470/744] Can't create named conda envs with a specific desitnation --- jenkins-ci/validate_jenkins.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins-ci/validate_jenkins.sh b/jenkins-ci/validate_jenkins.sh index 37950a3f..5d4ad87a 100644 --- a/jenkins-ci/validate_jenkins.sh +++ b/jenkins-ci/validate_jenkins.sh @@ -3,7 +3,7 @@ export OMPI_MCA_btl="tcp,self,sm" module load anaconda3/4.4.0 -conda create --yes --name jenkins3 --prefix /tigress/alexeys/jenkins --file requirements-travis.txt +conda create --yes --prefix /tigress/alexeys/jenkins/.conda/envs/jenkins3 --file requirements-travis.txt source activate jenkins3 module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 From 0edcd7240cf2d62769b012d83e9377044c28b76f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:33:19 -0500 Subject: [PATCH 471/744] Install path is the conda env name --- jenkins-ci/validate_jenkins.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jenkins-ci/validate_jenkins.sh b/jenkins-ci/validate_jenkins.sh index 5d4ad87a..4f68e122 100644 --- a/jenkins-ci/validate_jenkins.sh +++ b/jenkins-ci/validate_jenkins.sh @@ -3,8 +3,7 @@ export OMPI_MCA_btl="tcp,self,sm" module load anaconda3/4.4.0 -conda create --yes --prefix /tigress/alexeys/jenkins/.conda/envs/jenkins3 --file requirements-travis.txt -source activate jenkins3 +source activate /tigress/alexeys/jenkins/.conda/envs/jenkins3 module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 From 309e62cf132ce34436953f758702dcd7d2ab882c Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:41:29 -0500 Subject: [PATCH 472/744] Correct path --- jenkins-ci/validate_jenkins.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins-ci/validate_jenkins.sh b/jenkins-ci/validate_jenkins.sh index 4f68e122..f7d6b0d5 100644 --- a/jenkins-ci/validate_jenkins.sh +++ b/jenkins-ci/validate_jenkins.sh @@ -18,7 +18,7 @@ echo `which mpicc` echo ${PWD} echo $SLURM_NODELIST -cd examples +cd jenkins-ci echo ${PWD} ls ${PWD} From ea39f24677e7022ee3ab7b0e63befdce42e2aac0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 29 Dec 2017 10:52:33 -0500 Subject: [PATCH 473/744] Adjust anaconda env --- jenkins-ci/jenkins.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index f0f4a8f3..1fa10ffe 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -10,7 +10,7 @@ rm -rf /tigress/alexeys/processed_shots rm -rf /tigress/alexeys/processed_shotlists rm -rf /tigress/alexeys/normalization module load anaconda3/4.4.0 -source activate PPPL_dev3 +source activate /tigress/alexeys/jenkins/.conda/envs/jenkins3 module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 @@ -36,7 +36,7 @@ echo "Jenkins test Python2.7" #source deactivate #module purge #module load anaconda/4.4.0 -#source activate PPPL +#source activate /tigress/alexeys/jenkins/.conda/envs/jenkins2 #module load cudatoolkit/8.0 #module load cudnn/cuda-8.0/6.0 #module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 From 45014294abf3acbe846262c8932e83b6c4324b11 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Fri, 29 Dec 2017 10:58:35 -0500 Subject: [PATCH 474/744] Trigger jenkins test From 9e36e137c6269e3b25d722905fe92c7c2feb42dd Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Fri, 29 Dec 2017 12:17:41 -0500 Subject: [PATCH 475/744] Exclude bad nodes, trigger jenkins build From ff8227e2f307e77fa744af77a534ec3aa0d74db7 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 8 Jan 2018 14:49:14 -0500 Subject: [PATCH 476/744] Update PrincetonUTutorial.md --- docs/PrincetonUTutorial.md | 76 +++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index 04323b07..61f45d52 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -1,30 +1,57 @@ ## Tutorials +### Login to Tigergpu + +First, login to TigerGPU cluster headnode via ssh: +``` +ssh -XC @tigergpu.princeton.edu +``` + ### Sample usage on Tigergpu -First, create an isolated Anaconda environment and load CUDA drivers: +Next, check out the source code from github: ``` -module load anaconda3 -module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 -module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +git clone https://github.com/PPPLDeepLearning/plasma-python +cd plasma-python +``` + +After that, create an isolated Anaconda environment and load CUDA drivers: +``` +#cd plasma-python +module load anaconda3/4.4.0 conda create --name my_env --file requirements-travis.txt source activate my_env + +export OMPI_MCA_btl="tcp,self,sm" +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 ``` -Then install the plasma-python package: +and install the `plasma-python` package: ```bash #source activate my_env -git clone https://github.com/PPPLDeepLearning/plasma-python -cd plasma-python python setup.py install ``` Where `my_env` should contain the Python packages as per `requirements-travis.txt` file. +#### Common issue + +Common issue is Intel compiler mismatch in the `PATH` and what you use in the module. With the modules loaded as above, +you should see something like this: +``` +$ which mpicc +/usr/local/openmpi/cuda-8.0/2.1.0/intel170/x86_64/bin/mpicc +``` + +If you source activate the Anaconda environment after loading the openmpi, you would pick the MPI from Anaconda, which is not good and could lead to errors. + #### Location of the data on Tigress -The JET and D3D datasets containing multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions are located on /tigress filesystem on Princeton U clusters. +The JET and D3D datasets containing multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions are located on `/tigress/FRNN` filesystem on Princeton U clusters. Fo convenience, create following symbolic links: ```bash @@ -39,16 +66,22 @@ ln -s /tigress/FRNN/signal_data signal_data cd examples/ python guarantee_preprocessed.py ``` -This will preprocess the data and save it in `/tigress//processed_shots` and `/tigress//normalization` +This will preprocess the data and save it in `/tigress//processed_shots`, `/tigress//processed_shotlists` and `/tigress//normalization` +You would only have to run preprocessing once for each dataset. The dataset is specified in the config file `examples/conf.yaml`: +```yaml +paths: + data: jet_data_0D +``` +It take takes about 20 minutes to preprocess in parallel and can normally be done on the cluster headnode. #### Training and inference -Use Slurm scheduler to perform batch or interactive analysis on Tiger cluster. +Use Slurm scheduler to perform batch or interactive analysis on TigerGPU cluster. ##### Batch analysis -For batch analysis, make sure to allocate 1 process per GPU: +For batch analysis, make sure to allocate 1 MPI process per GPU. Save the following to slurm.cmd file (or make changes to the existing `examples/slurm.cmd`): ```bash #!/bin/bash @@ -58,15 +91,20 @@ For batch analysis, make sure to allocate 1 process per GPU: #SBATCH --ntasks-per-socket=2 #SBATCH --gres=gpu:4 #SBATCH -c 4 +#SBATCH --mem-per-cpu=0 -module load anaconda3 +module load anaconda3/4.4.0 source activate my_env -module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64 intel/17.0/64/17.0.2.174 -module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +export OMPI_MCA_btl="tcp,self,sm" +module load cudatoolkit/8.0 +module load cudnn/cuda-8.0/6.0 +module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 +module load intel/17.0/64/17.0.4.196 + srun python mpi_learn.py ``` -where X is the number of nodes for distibuted training. +where `X` is the number of nodes for distibuted training. Submit the job with: ```bash @@ -82,11 +120,11 @@ Optionally, add an email notification option in the Slurm about the job completi ##### Interactive analysis -Interactive option is preferred for debugging or running in the notebook, for all other case batch is preferred. +Interactive option is preferred for **debugging** or running in the **notebook**, for all other case batch is preferred. The workflow is to request an interactive session: ```bash -salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -t 0-6:00 +salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -c 4 --mem-per-cpu=0 -t 0-6:00 ``` where the number of GPUs is X * 4. @@ -104,7 +142,7 @@ Currently, FRNN is capable of working with JET and D3D data as well as cross-mac ```yaml paths: ... - data: 'jet_data' + data: 'jet_data_0D' ``` use `d3d_data` for D3D signals, use `jet_to_d3d_data` ir `d3d_to_jet_data` for cross-machine regime. @@ -116,6 +154,8 @@ paths: ``` if left empty `[]` will use all valid signals defined on a machine. Only use if need a custom set. +Other parameters configured in the conf.yaml include batch size, learning rate, neural network topology and special conditions foir hyperparameter sweeps. + ### Current signals and notations Signal name | Description From e839dadd201fc98b3759001d88a46e335e42d288 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Wed, 10 Jan 2018 00:08:54 -0500 Subject: [PATCH 477/744] Add Jenkins build status badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2e34803..9a96c8f5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# FRNN [![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master) +# FRNN [![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master) [![Build Status](https://jenkins.princeton.edu/buildStatus/icon?job=FRNM/PPPL)](https://jenkins.princeton.edu/job/FRNM/job/PPPL/) ## Package description From 6bddbf3f10850fce8be03d3607341c8c0d7edba9 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 10 Jan 2018 20:55:33 -0500 Subject: [PATCH 478/744] notebook updated --- Analyze Hyperparameter Tuning.ipynb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Analyze Hyperparameter Tuning.ipynb b/Analyze Hyperparameter Tuning.ipynb index b42cc3fc..d4c1de3c 100644 --- a/Analyze Hyperparameter Tuning.ipynb +++ b/Analyze Hyperparameter Tuning.ipynb @@ -124,16 +124,16 @@ }, { "cell_type": "code", - "execution_count": 626, + "execution_count": 631, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAF7CAYAAAATyMtCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X94XFd95/HPkU3ihI0ly5ASlm4tyVkSt7uxJZFueApt\nbEvhR0gX27GjwCZlG8cKhe26jS0ZaNNSii3ZQHeftv6Zp4XSKLZlh222C7YlN0C3C7ElOQ+UhCbS\nGEri/sC25BDi/JC++8e5I41Go9GM5se9M3q/nuc+I53763uPRpqvzj3nXGdmAgAAiKqKsAMAAABI\nh2QFAABEGskKAACINJIVAAAQaSQrAAAg0khWAABApJGsAACASJsfdgBR5JxbLOk2SWclXQ43GgAA\nSsoCSUskHTOz8/k4IMlKardJ+suwgwAAoIR9SNIj+TgQyUpqZyXpy1/+sm688caQQykNmzdv1he+\n8IWwwygZ1Fd2qK/sUF/Zo86yk66+nn76aX34wx+Wgs/SfCBZSe2yJN14442qr68PO5aSUFlZSV1l\ngfrKDvWVHeore9RZdjKsr7x1o6CDLQAAiDSSFQAAEGkkKwAAINJIVpAXLS0tYYdQUqiv7FBf2aG+\nskedZafY9eXMrKgnLAXOuXpJfX19fXS4AgAgC/39/WpoaJCkBjPrz8cxaVkBAACRRrICAAAijWQF\nAABEGskKAACINJIVAAAQaSQrAAAg0khWAABApJGsAACASCNZAQAAkUayAgAAIo1kBQAARBrJCgAA\niDSSFQAAEGkkKwAAINJIVgAAQKSRrAAAgEgjWQEAAJFGsgIAACKNZAUAAEQayQoAAIg0khUAABBp\nJCsAACDSSFYAAECkkawAAIBII1kBAACRRrICAAAijWQFAABEGskKAACINJIVAAAQaSQrAAAg0khW\nAABApJGsAACASCNZAQAAkUayAgAAIo1kBQAARBrJCgAAiDSSFQAAEGkkKwAAINJIVgAAQKSRrAAA\ngEgjWQEAAJFGsgIAACKNZAUAAEQayQoAAIg0khUAABBpJCsAACDSSFYAAECkkawAAIBII1kBAACR\nRrICAAAijWQFAABEGskKAACItLJOVpxzNc654865Mefcc865tWHHBAAAslPWyYqkvZK2SKqXNCjp\nkHNuebghAQCAbMwPO4BCCVpR7jezs0HRbc65MUmrJZ0JLTAAAJCVyLasOOeqnHM7nHNLZrO/mR1J\nSFTihiX15RgaAAAooki2rDjntkjaJqlS0qPTbFMpqUPSIkku2LbdzAam2b5W0nkz+5uCBA0AAAoi\nci0rQZ+SvZJOz7Bpv6QqM9tgZusldUrqTdMnZaukpvxFCgAAiiFyyYqZnTGzS5KGptvGOdchaYmk\njQn79Qb7HE6x/UZJx1PcFgIAABEXydtAGdgoacjMXkwqPyhph3NuuZmdkSTn3CpJg2Z2sthBAgAK\nZ/du6YknJr53burXqcpmWl+sfaISR7p9rr1W+q3fUuhKLllxzq2QVCXpRIrV/fL9VzZJesA5t1rS\nCkndzrmaYN1aSXuD1hsAQIkxk373d6XPfEZ617ukBQt8WeL6xNfZlOXrOMUoK+Sx6+pIVmarMXi9\nkGJdvKw2aFE5Lskk7UjYptvMdhYwPgBAgZhJ7e1SZ6e0c6f04INhR4RiKMVkpSp4HU6xLl5WG/Rh\niVyfHADA7Jj5//L/6I+k//E/pP/238KOCMVSislKqiSlIJ5++ulp1y1YsEDLli1Lu//3vvc9Xb58\nedr11113na677rpp17/88stpY5CkG2+8UVddddW068+dO6dz585Nu57rmMB1TOA6PK5jQtjXMTYm\nfe5zC/Too8v0p38qPfBA6mNE/Tqk8vh5SJldR96YWSQXSXskjUpanlS+StKYpN0p9lkRrDuV47nr\n5W8fTbssW7bMZrJs2bK0x3jooYfS7v/d73437f6S7Lvf/W7aYzz00ENcB9fBdXAdZXEd0jI7cKD0\nr6Ncfh7Lli2zRx55xD7wgQ9MWt797nfHt6m3POUEzhJ71ESIc26P/KifBgtG9gTlNfLP+TlsZhuS\n9lkl3/F2r5lNk3dndO56SX1f/vKXdeONN6bcZi5lxlyHx3VM4DomcB1eoa5jdFT69Kelv/5r6Q//\ncIG2bSvN60hUyj+PRNNdR39/vxoaGiT/+d2fNogMlVyyEqy7ID8b7fVJ5VvkO9Outhxmqo0nK319\nfaqvr5/tYQAAOXj9denee6WDB6UvfUm6++6wI0ImCpGslGoH1H3yI34WJpU3y8+pMutEBQAQvtde\n88nJoUNSVxeJylwX5WRl8XQrzKxdfrba/fGyYE6VlZLuLHxoAIBCefVVaf166StfkQ4flu7kr/qc\nF7nRQMGkbxskrQmKOpxzh83sQOJ2Zna9c263c+6gpIuSauQ78zxV3IgBAPly+bK0bp104oT02GPS\n+98fdkSIgsglK+afmjwgqT2DbWfdiRYAEC0vvyx98IPS178u/dVfSbfdFnZEiIrIJSsAgLnnpZek\nO+6QvvUtP/Jn5cqwI0KUkKwAAEL14ovS7bdLfX3SV78qvfvdYUeEqCFZAQCE5tIl6b3vlb7zHen4\ncemd7ww7IkQRyQoAIBTDw75fyve/L/X0SDffHHZEiCqSlTQ2b96syspKtbS0qKWlJexwAKBsXLgg\nNTVJZ89KJ09KzL9Z+rq6utTV1aWRkZG8HzuyM9iGiRlsAaBw/vVffaLy/PO+ReWmm8KOCPlUiBls\naVkBABTNP/+ztGqV9OMfS088If38z4cdEUoByQoAoCheeMEnKiMjPlG54YawI0KpIFkBABTcP/6j\nnzvl8mU/6dv118+8DxBHsgIAKKizZ32iMjYmfeMbUk1N2BGh1ET5QYYAgBI3OCj98i9LzvkWFRIV\nzAbJCgCgIP7hH3yicuWVPlH5uZ8LOyKUKpIVAEDePf20T1QWLvSJytveFnZEKGUkKwCAvPrOd3yi\n8uY3+1E/110XdkQodSQrAIC8OXNGuvVW6d/+Wz8z7bXXhh0RygHJCgAgL06f9qN+amqk3l7pTW8K\nOyKUC4Yup8GzgQAgM9/6ln8o4bJl0te+JlVWhh0Rio1nAxUZzwYCgMz97d9K73uff8bPX/+171SL\nuasQzwbiNhAAYNaeeEJ6z3ukhgbpq18lUUFhkKwAAGalp8e3qNxyi29R+Tf/JuyIUK5IVgAAWfva\n16Tbb5d+5Vekxx+Xrr467IhQzkhWAABZefxx6Vd/VWpulh57TFqwIOyIUO5IVgAAGTt6VFqzxreq\ndHf7qfSBQiNZAQBk5OBBaf16ae1a6dFHpSuuCDsizBUkKwCAGX35y9Ldd0stLf7rN7wh7Igwl5Cs\nAADS+vM/l+65R7r3Xv/1fKYTRZGRrAAAprVvn/SRj0gbN0oHDkjz5oUdEeYikhUAQEp//MfSpk3S\nxz4m7dkjVfCJgZDw1gMATPGFL0gf/7i0ebP0P/+n5FzYEWEuI1kBAEzS0SH91m9JbW3S5z5HooLw\n0U0qDZ66DGAuGB2VfvQjaXDQT5v/+c9Lv/M70u//PokKMsdTl4uMpy4DKDcvvyzFYj4hSV7OnpVe\nfdVvN2+e9OlPS5/4RKjhooQV4qnLtKwAQJm4cCF1MjI4KD3//MR2CxZItbVSXZ1/EGH867o6ackS\nZqVF9JCsAECJGBubuF2TvAwNScPDE9tWV08kIO9618TXdXXSddcxsgelhWQFACLm0iXpm9+Unntu\nckISi03crnFOetvbfPKxYoW0bt3khKSqKtxrAPKJZAUAIuKVV6Tdu6XPfEY6f97fjonfonnPeyYn\nI9yuwVxCsgIAIRsbkx55xI/A+eEPpV//dWnrVp+ocLsGIFkBgNCYSceOSe3t0lNPSR/8oPR//o90\n441hRwZECzk7AITg1Clp1Srpve+VrrlG+ru/k44eJVEBUiFZAYAievZZaf166eabpX/5F+nxx6Vv\nfEO65ZawIwOii2QFAIrgn/5J+uhHpWXLpP/3/6Q/+zN/6+f225klFpgJfVYAoIAuXZJ27fLP2Lny\nSmn7duk3fkO66qqwIwNKB8kKABTAK69Ie/dKf/AH0k9+Iv3mb/oHAy5aFHZkQOnJOVlxzq2R1CSp\nVtKQpNNm9nCuxwWAUjQ2Jj36qPSpT0k/+IH0X/+r9NBDfgI3ALMz62TFOVcp6bR8kpJ4x3WTc65T\n0n1m9liO8QFASTCTTpzwrSdnzkj/+T/7JxgzugfIXS4dbPdLqpPUK+nO4OtFwWuHpIedc7fmHCEA\nRNzp01JTk3TbbdIb3yj93/8rPfYYiQqQL7ncBlot6YSZ3ZZUPiKp0znXLWm3pL/J4Ryh2rx5syor\nK9XS0qKWlpawwwEQMc8952/3HDzoR/n81V8xugdzV1dXl7q6ujQyMpL3Yzszm92Ozp2WtMfMDqTZ\n5liKZCbynHP1kvr6+vpUX18fdjgAIuaf/1n69Kelffukt7zFf33PPdK8eWFHBoSvv79fDQ0NktRg\nZv35OGYut4H2SmqYYZvFyQXOuQdzOCcAhObFF31n2bo6/yyfz35W+od/kD7yERIVoJByuQ00JGmd\nc+7XJcVSrN8k6YRzbmVCWVVQviuH8wJAUb366sQw5EuX/DDk9naGIQPFkkuy0iZplXzflVScJJO0\nNUUZAETe2Jjvj/KpT0lnz0q/9mvS7/2e9LM/G3JgwByTS7KyT37Y8t4s9nmTpPtyOCdQNmKxmGpq\nasIOA9OID0MeGJDuuMN3nv35nw87KmBumnWyYmbdzjkzsyPZ7Oec+/FszwmUulgspo6ODh06dEh1\ndXU6depU2CEhSV+fv8XT0yO9853SN78p/dIvhR0VMLfl9CDDdImKc+4+59ySFPvszOWcQCmrqalR\nW1ubhoeHww4FSQYHpZYWqbFRev556Stfkf72b0lUgCjIZQbbgzNsslr+FtEnZnsOoBxx6yda/uVf\nfMfZPXukn/kZ6cAB6d57pfk8OQ2IjFx+He/McBuSFQCR8+KL0uc/75+IPG+e9JnPSB//uHT11WFH\nBiBZLslKj/ww5Asp1r1D0joza83h+ACQd6++Ku3f7ydyGxnxCcq2bVJ1ddiRAZhOLn1WOswsZmYj\nKZYeScPOud/OV6CIvpGREe3fv1/Nzc06cOCAYrGYmpubVVFRocbGRl26dEmStHPnTi1dulTV1dVq\nb2+fcpyBgQGtX79ejY2NWrp0acptOjs7tWHDBrW3t6u5uVk7d07uCjUyMqLW1lY98MADam1t1dKl\nS7Vr167x81dXV6uiokJnzpyRJPX29o7HumHDhvHjdHd3q7m5Wb29vdq3b5+qq6vV2jqRg2cSazyW\n9evXa8OGDVNiRXZeftkPI37ySemJJ7JbvvhFPy3+xz8uve99fkK3nTtJVICoy2U0UO8MmwxK2iHp\nc7M9Rzn76U+lZ54J59w33FCYpu6hoSH19fWpp6dHzjkNDg6qs7NTQ0NDWrdundatW6e6ujo1NTWp\np6dHW7du1c6dO3XXXXdp+fLlkvw0zdu2bdOxY8ckSSdPntTq1asVi8V08KDvJtXW1qZdu3ZpdHRU\nkk80mpqaVFdXpzVr1kiSNm7cqLq6Om3fvl2SxhMVSdqyZYsGBwe1f//+8bJVq1aptrZWdXV142VH\njhxRe3u7YrGYamtrdfHiRdXV1enkyZMZxzo0NKTGxkYdOXJEt97qn+tJsjJ7P/yh9Pa3S5cvz/4Y\nH/iA7zz7C7+Qv7gAFJiZzWqRtDzNcp+k85LOz/b4YS6S6iVZX1+fFUpfn5l/qHzxlwJelvX09Jhz\nzlpbWyeV19XVWUVFhZ09e3bKtu3t7ZO2GxgYSLlvLBYzM7OmpiZbvHjx+Prh4eEp51y0aNGk45qZ\n7dy5c/zrtrY2q6iomHSu+HHWr18/XtbZ2TmlLJtY161bZ83NzVP2dc5ZY2PjlHKk96Uv+ffw44+b\nPfWU2XPPZbf86EdhXwFQ/vr6+kx+Ath6y9Pnci59Vvo1/Wy08WeObp1m/Zx3ww1+Poewzl0o1UF7\nelVV1aTy+vp6xWIxLUqYn7y2tlaSxofxDgwMaGhoSG1tbTIzOedkZlq0aJGccxoaGtKSJUvU3d09\n6dinT5+eEkdjY6M6OjpUXV2tLVu2SJIefDD7x1JVVVXJOTfp1lCmsZqZjhw5os7OzqzPi9SefFK6\n/nr/ZGMAc0cuycqwpEPBa7LzknrMbCCH45e1q6+W5voDneOJzYULvo/24OCgnHPq7u7WNddcM+1+\nCxculORv0/T09Gj16tWTjiNJe/fuVXNzs9ra2rR3714dPnxYK1asyFvsQ0NDM8ba29sr59x4Uobc\nPfmk9Iu/GHYUAIotlw62282s1czaUyw75fusABmLxfzzMAcH07914v1ALl68qN27d2vt2rVTtqmp\nqVFfX5/uvPNOxWIxNTQ0TOqjkquhoaEZY423rsS3RW5eeUU6c0a6+eawIwFQbLNOVmzmmWi3pZrB\nFphObW2tzGy8c2qyo0ePSpKampq0ePFi3Xff9I+ZisViWrhwoQ4ePKgTJ05I0qRRPIWO9ciRI+Mt\nKkypnx9PPeWHHdOyAsw9MyYrzrka59ypLJdn5furTP2XF5hG/HZOZ2enensnDzZrbW1VbW2tYrHY\neAtMXKqp6zs6Osa/Xrlypfbu9c/bPHv2rCRp8eLFMrNJ/V2ySSpmirWurk6NjY2S/PDn+LDtmeLG\n9L79bemKK6Sbbgo7EgDFNmOyYmYxSXWSGrJY6uQ72Zb0pHCbN2/WHXfcoa6urrBDKRnnz59PWX7x\n4kVJmnRLJPkWSmVlpdra2iT51pPm5ma1t7ersbFRixYt0vLly8f7ufT09Gjnzp3av3+/2tvb5ZxT\nf3+/Dhw4oJGRER06dGhSUmNmqq2t1ZIlSyRNJBttbW3jx4h33O3p6dGBAwckSc8991x8hFjWsVZW\nVo4nTfX19ert7dXAwMD4XCxDQ0Patm1bykQGUz35pLR8uXTllWFHAiCVrq4u3XHHHdq8eXP+D57J\nkCFJeyTVJJVtkbQlzT47JC3J17ClYi4qwtDlctTT02MNDQ1WUVFh1dXVtn//fjPzw38rKiqsoqLC\nmpubbWBgwPr7+62pqWnKtmZ+iPHSpUutoqLCli5dakePHp10nv3791t1dbUtXbp0fDhyW1ubVVdX\n27Zt28zMD12uqKiw1tZW27Rpk61fv358OHHieaqrq626utp27dplZmZLly61bdu2WSwWs3379ll1\ndfV4HIlDnzONNR5vfJvm5maLxWK2dOlS27Vr15SYML3rrzf72MfCjgLATAoxdNlZiv8akznnasy3\nsCSWHTSzDWn2WSFph5ndNpskKkzOuXpJfX19faqf60N2gAi4cEFavFj6i7+QPvzhsKMBkE5/f78a\nGhokqcHM+vNxzIw62CYnKgGXoixRtfyTlwEgJ/GuRYwEAuamXIYuX3DO3ZpqhXNuoaS9khizCSBn\n3/62VFXlJ4QDMPfkMilcm6SYc+6UpBPyiUmtgicuB9tsyi08APCda2++WXIztecCKEu5PMhwxDnX\nKKlDUqd8Z5rEPyVtZnYgx/gAzHFmvmUlj9PkACgxubSsyMyGJN3pnKuRb1WplW9hOW1mI3mID8Ac\n94MfSP/6r/RXAeayXPqsSJKCWWprzKzXzPZLqpJUk+txAUDyrSoSyQowl+WUrDjnDso/A2hvvMzM\njkhqdc5tzzE2ANCTT0pLlkjXXht2JADCMuvbQM65HZLulL/tM2necDNrdc6dds49aWaP5RgjgBLz\n+uvSww9LIyPS6Ojk5fXXp5ZNt7z+uvSNb0jvfnfYVwQgTLn0WVknabWZnXTOHU+xvke+4y3JCjDH\nxDvELlwoveEN0vz50rx5U5dMyv/jf5Q2bgz7igCEKZdkZdjMTgZfp5oGt16+wy2AOeZHP/KvP/yh\nVFkZbiwASl8ufVYSJ3ybNPuBc26V/Oy1TAoHzEEvvCBdfbVvWQGAXOWSrGx3zh1zzi2XZM65a5xz\ny4OOtcflW1v2pj8EgHL0wgvSW9/KJG4A8iOXSeEGnHPbJHXL3+6Jd7KN/3nqMLNdOcYHoASdO+eT\nFQDIh1wnheuXtDR4wnLipHA9TAqHTMViMdXUMDVPOYm3rABAPuRrUrhFZnbEzHYGxXzyzFGxWEzV\n1dU6cCD9kxZisZhaW1tVXV2t9evXFySOnTt3qpU52kPxwgvSddeFHQWAcsGkcMir4eFhjYyMqL+/\nP+12NTU1amtr0/DwcNrtZqO3t1dtbW1qa2tTX19f3o+PmdGyAiCfmBQOebVixQpdvHhRCzMYBlKo\nWz+rVq3SqlWrVFGRc8MhZuHFF/1CsgIgX3L5ax6fFG6ppIsp1scnhcMck0migtl773ulqio/f0ll\npR8evHCh9O/+nfRP/xR2dL5zrUSyAiB/mBQOKCEvvywdOybddZdUXz95aPAnPyn9xV9IW7aEF5/k\nbwFJJCsA8ieXZCWTSeEGczg+StCRI0e0d+9eOed07NixSetGRkbU1tamCxcuyDmnxsbGlMcYGBjQ\n9u3bNTQ0pOHhYa1bt047duyYtE1nZ6f6+vpUU1Oj/v5+NTU1aUvYn9JF8Oyzkpn0sY9J73zn5HVP\nPil98YvSgw+GO79JPFmhgy2AfMklWdnunDsmqU3BpHCS6iRtkLRVZTAp3ObNm1VZWamWlha1tLTk\n/fjnzp3TuXibeQoLFizQsmXL0h7je9/7ni5fvjzt+uuuu07XFelTY2BgQKdOnVJPT4+ampomrRsa\nGlJjY6OOHDmiW2+9VZK0c+fOKcfo7+/Xtm3bxhOdkydPavXq1YrFYjp48KAkqa2tTbt27dLo6Kgk\n36G2qalJdXV1WrNmTSEvMXTPPONf3/72qevuvVd6//ulgQHf6hKWF16QrrnGLwDmjq6uLnV1dWlk\npAAzl5jZrBf5Wz3PSRqTNBosY8GyPZdjh7kE12V9fX1WSA899JDJJ3Upl2XLls14jGXLlqU9xkMP\nPVTQa0g2PDxszjlrbm6eVL5u3bopZWZmzjlrbGwc/76urs4GBgYmbVNXV2cVFRUWi8XMzKypqckW\nL1485Zytra1pj10Ofv/3zd785tTrXnvN7Gd+xuw3f7O4MSXbvNns7W8PNwYA4enr64t/BtVbnj6X\nmRQuRJs2bdIdd9wx7foFCxbMeIzDhw/P2LJSTJUpnloXi8V05MgRdXam7289MDCgoaEhtbW1yczk\nnJOZadGiRXLOaWhoSEuWLFF3d/ek/U6fPp3Xa4iyZ56Rbrgh9br586UPfcj3W9m50z/tONH3vied\nPy+NjUmPPSadPVuYGPv7pbq6whwbwNyUU7IiSc65NZKaNJGoXCBRyUw+btHMdJsoCoaGhuScU21t\n+v7Wg4ODcs6pu7tb16S5hxAfbXTkyBH19PRo9erVkqQLFy7kL+iI+v7309/iuece6fOfl772NekD\nH5gov3hR+oVf8P1dJN+nZeVK6aqr8h/jTTdJBbhrCmAOy2WelUpJp+WTlMTufJucc52S7jPmWIF8\nsmJmGhpK/xDuWCwmyScty5cvT3u89evXq7W1Vbt3785rrFE2NuZbVu6+e/ptbrrJL1/84uRk5Sc/\n8YnKgQPSL/2StGiRdO21hY8ZAPIhl3lW9st3qO2VnxyuTtKi4LVD0sPOuVtzjhAlL96icurUqRm3\nM7PxjrTJjh49KklqamrS4sWLdd999+U30Ih7/nnppz+d/jZQ3D33SI8/LiU2NL36qn+tqfGdc0lU\n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\ntCoYXlxNAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAF7CAYAAADiw5DPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl0XGeZ5/Hv68RLFluLk4akh2BJDiSZJrElA03THU5i\ny6EHAoO3IEgfeoi30MCMm8iyG6bD6enBlmxomBnwmjPTTYLiLUCGBmxLZuDQNGBLduiQBGJJDmSD\nxLbkbF4iPfPHe0sqlUq1V92q0u9zzj1Xuve9977vrWvXo/e+izMzRERERMI0KewMiIiIiCggERER\nkdApIBEREZHQKSARERGR0CkgERERkdApIBEREZHQKSARERGR0F0cdgaKkXNuJnAbcAI4G25uRERE\nSso0YBaw38xOpnqQApL4bgMeCDsTIiIiJeyjwDdSTayAJL4TAPfffz/XX399yFkJx5o1a/iHf/iH\nsLMRmoleftA9mOjlB90DlT+z8j/++OPceeedEHyXpkoBSXxnAa6//nrq6+vDzksoKioqJmzZQeUH\n3YOJXn7QPVD5sy5/Wk0e1KhVREREQqeAREREREKngERERERCp4BE4mpqago7C6Ga6OUH3YOJXn7Q\nPVD5C1t+Z2YFvWApcM7VA11dXV0TukGTiIhIurq7u2loaABoMLPuVI9TDYmIiIiETgGJiIiIhE4B\niYiIiIROAYmIiIiETgGJiIiIhE4BiYiIiIROAYmIiIiETgGJiIiIhE4BiYiIiIROAYmIiIiETgGJ\niIiIhE4BiYiIiIROAYmIiIiETgGJiIiIhE4BiYiIiIROAYmIiIiETgGJiIiIhE4BiYiIiIROAYmI\niIiETgGJiIiIhK6sAxLnXI1z7oBzbsg5d9w5tzjsPImIiMhYZR2QANuAZqAe6AF2O+fmhJslERER\niXVx2BnIl6A2ZKWZnQg23eacGwIWAMdCy5iIiIiMUbQ1JM65SufcRufcrEyON7N9UcFIRD/QlWXW\nREREJMeKsobEOdcMrAcqgAfHSVMBtAJVgAvSrjOzo+OkrwVOmtkP8pJpERERyVjR1ZAEbTy2AUeS\nJO0GKs3sDjNbBrQBnQnaiKwFGnOXUxEREcmVogtIzOyYmZ0BesdL45xrBWYBK6KO6wyO2RMn/Qrg\nQJxXOCIiIlIEii4gSdEKoNfMXorZvguoja4lcc7NB3rM7KFCZlBERERSV3IBiXNuLlCJf2UTqxvf\n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\nvTzQ5HoiIiKZyXRyPb2yERERkdApIBEREZHQKSARERGR0CkgERERkdApIBEREZHQKSARERGR0Ckg\nERERkdApIBEREZHQKSARERGR0CkgERERkdApIBEREZHQKSARERGR0CkgERERkdApIBEREZHQKSAR\nERGR0F0cdgaK2Zo1a6ioqKCpqYmmpqawsyMiIlK02tvbaW9vZ2BgIKPjnZnlOEulzzlXD3R1dXVR\nX18fdnZERERKRnd3Nw0NDQANZtad6nF6ZSMiIiKhU0AiIiIioVNAIiIiIqFTQCIiIiKhU0AiIiIi\noVNAIiIiIqFTQCIiIiKhU0AiIiIioVNAIiIiIqFTQCIiIiKhU0AiIiIioVNAIiIiIqFTQCIiIiKh\nU0AiIiIioVNAIiIiIqFTQCIiIiKhU0AiIiIioVNAIiIiIqFTQCIiIiKhU0AiIiIioVNAIiIiIqFT\nQCIiIiKhuzjsDBSzNWvWUFFRQVNTE01NTWFnR0REpGi1t7fT3t7OwMBARsc7M8txlkqfc64e6Orq\n6qK+vj7s7IiIiJSM7u5uGhoaABrMrDvV4/TKRkREREKngERERERCp4BEREREQqeAREREREKngERE\nRERCp4BEREREQqeAREREREKngERERERCp4BEREREQqeAREREREKngERERERCp4BEREREQqeARERE\nREKngERERERCp4BEREREQqeAREREREKngERERERCp4BEREREQqeAREREREKngERERERCp4BERERE\nQqeAREREREKngERERERCp4BEREREQqeAREREREKngERERERCd3HYGcgn51wF0AocB64AesxsR7i5\nEhERkVhlHZAQBCNmthnAOXfEOXfSzB4KOV8iIiISpWwDEudcLbASqIzavAtoAxSQiIiIFJGibUPi\nnKt0zm10zs3K8BQLADOzM1HbuoEa59yMbPMnIiIiuVOUAYlzrhnoBZoZXcMRnabCObfVObfLObfb\nObffOTc3Kkkt0B9z2KmofSIiIlIkii4gcc7NAbYBR5Ik7QYqzewOM1uGfxXTGRwfcSr+oSIiIlJM\nii4gMbNjwWuW3vHSOOdagVnAiqjjOoNj9gSbeoDqmEOrI9fIYZbLUnt7e9hZCNVELz/oHkz08oPu\ngcpf2PIXXUCSohVAr5m9FLN9F1Ab1JJ0AJUx7UXqSBDoyAj9Q5zY5Qfdg4leftA9UPkVkCQUtBOp\n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\nJQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -150,7 +150,7 @@ "if plot_ratio: #plot ratio of curves\n", " plt.semilogy(mm,tt/ttp,label=\"measured\")\n", " plt.axhline(100,color=\"k\",linestyle=\"--\",label=\"ideal\")\n", - " plt.ylim([10,200])\n", + " plt.ylim([1,200])\n", " plt.xlabel('Validation AUC achieved',size=15)\n", " plt.ylabel('Speedup',size=fontsize)\n", "else: #plot both curves\n", @@ -162,11 +162,12 @@ " plt.ylabel('T [seconds]',size=fontsize)\n", " plt.xlabel('Validation AUC achieved',size=15)\n", "\n", - "plt.xlim([0.8,0.861])\n", + "plt.xlim([0.5,0.861])\n", "plt.legend(frameon=False,loc=\"center left\",fontsize=fontsize)\n", "plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize)\n", "plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize)\n", "\n", + "plt.savefig(\"speedup.png\",bbox_inches=\"tight\")\n", "plt.show()\n" ] }, From e61732d9acadd5e2bf333954b48d4ac85f1b4727 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 10 Jan 2018 21:03:32 -0500 Subject: [PATCH 479/744] changed bleed in to sample until num disruptive shots have been sampled --- plasma/preprocessor/preprocess.py | 53 ++++++++++++++++++++----------- plasma/primitives/shots.py | 4 +++ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index f6dfde53..d8600bd6 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -150,28 +150,43 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): num = conf['data']['bleed_in'] new_shots = [] if num > 0: - print('applying bleed in with {} shots\n'.format(num)) + print('applying bleed in with {} disruptive shots\n'.format(num)) num_total = len(shot_list_test) num_d = shot_list_test.num_disruptive() num_nd = num_total - num_d - if num_d > 0: - for i in range(num): - s = shot_list_test.sample_single_class(True) - shot_list_train.append(s) - shot_list_validate.append(s) - if conf['data']['bleed_in_remove_from_test']: - shot_list_test.remove(s) - else: - print('No disruptive shots in test set, omitting bleed in') - if num_nd > 0: - for i in range(num): - s = shot_list_test.sample_single_class(False) - shot_list_train.append(s) - shot_list_validate.append(s) - if conf['data']['bleed_in_remove_from_test']: - shot_list_test.remove(s) - else: - print('No nondisruptive shots in test set, omitting bleed in') + assert(num_d >= num), "Not enough disruptive shots {} to cover bleed in {}".format(num_d,num) + num_sampled_d = 0 + num_sampled_nd = 0 + while num_sampled_d < num: + s = shot_list_test.sample_shot() + shot_list_train.append(s) + shot_list_validate.append(s) + if conf['data']['bleed_in_remove_from_test']: + shot_list_test.remove(s) + if s.is_disruptive: + num_sampled_d += 1 + else: + num_sampled_nd += 1 + print("Sampled {} shots, {} disruptive, {} nondisruptive".format(num_sampled_nd+num_sampled_d,num_sampled_d,num_sampled_nd)) + assert(num_sampled_d == num) + # if num_d > 0: + # for i in range(num): + # s = shot_list_test.sample_single_class(True) + # shot_list_train.append(s) + # shot_list_validate.append(s) + # if conf['data']['bleed_in_remove_from_test']: + # shot_list_test.remove(s) + # else: + # print('No disruptive shots in test set, omitting bleed in') + # if num_nd > 0: + # for i in range(num): + # s = shot_list_test.sample_single_class(False) + # shot_list_train.append(s) + # shot_list_validate.append(s) + # if conf['data']['bleed_in_remove_from_test']: + # shot_list_test.remove(s) + # else: + # print('No nondisruptive shots in test set, omitting bleed in') return shot_list_train,shot_list_validate,shot_list_test diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 09685093..e2865d72 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -166,6 +166,10 @@ def sample_weighted_given_arr(self,p): idx = np.random.choice(range(len(self.shots)),p=p) return self.shots[idx] + def sample_shot(self): + idx = np.random.choice(range(len(self.shots))) + return self.shots[idx] + def sample_weighted(self): p = np.array([shot.weight for shot in self.shots]) return self.sample_weighted_given_arr(p) From 0f3d9045b09f1d23c484fd87c89087509d551cb1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 10 Jan 2018 21:17:33 -0500 Subject: [PATCH 480/744] bleed in option of adding multiple times --- examples/conf.yaml | 1 + plasma/preprocessor/preprocess.py | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index a71947fb..d86e4118 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -18,6 +18,7 @@ paths: data: bleed_in: 0 #how many shots from the test sit to use in training? bleed_in_remove_from_test: True + bleed_in_equalize_sets: True signal_to_augment: None #'plasma current' #or None augmentation_mode: 'none' augment_during_training: False diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index d8600bd6..364c96a0 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -150,6 +150,7 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): num = conf['data']['bleed_in'] new_shots = [] if num > 0: + shot_list_bleed = ShotList() print('applying bleed in with {} disruptive shots\n'.format(num)) num_total = len(shot_list_test) num_d = shot_list_test.num_disruptive() @@ -159,8 +160,7 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): num_sampled_nd = 0 while num_sampled_d < num: s = shot_list_test.sample_shot() - shot_list_train.append(s) - shot_list_validate.append(s) + shot_list_bleed.append(s) if conf['data']['bleed_in_remove_from_test']: shot_list_test.remove(s) if s.is_disruptive: @@ -168,7 +168,20 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): else: num_sampled_nd += 1 print("Sampled {} shots, {} disruptive, {} nondisruptive".format(num_sampled_nd+num_sampled_d,num_sampled_d,num_sampled_nd)) + print("Before adding: training shots: {} validation shots: {}".format(len(shot_list_train,shot_list_validate))) assert(num_sampled_d == num) + num_to_sample = len(shot_list_bleed) + if conf['data']['bleed_in_equalize_sets']:#add bleed-in shots to training and validation set repeatedly + for shot_list_curr in [shot_list_train,shot_list_validate]: + for i in range(len(shot_list_curr)): + s = shot_list_bleed.sample_shot() + shot_list_curr.append(s) + else: #add each shot only once + for s in shot_list_bleed: + shot_list_train.append(s) + shot_list_validate.append(s) + print("After adding: training shots: {} validation shots: {}".format(len(shot_list_train,shot_list_validate))) + print("Added bleed in shots to training and validation sets") # if num_d > 0: # for i in range(num): # s = shot_list_test.sample_single_class(True) From ec4ed030434c3455b45ba41c462c16b55b604ed8 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 10 Jan 2018 21:21:23 -0500 Subject: [PATCH 481/744] bleed in --- plasma/preprocessor/preprocess.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 364c96a0..be3808c5 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -168,7 +168,7 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): else: num_sampled_nd += 1 print("Sampled {} shots, {} disruptive, {} nondisruptive".format(num_sampled_nd+num_sampled_d,num_sampled_d,num_sampled_nd)) - print("Before adding: training shots: {} validation shots: {}".format(len(shot_list_train,shot_list_validate))) + print("Before adding: training shots: {} validation shots: {}".format(len(shot_list_train),len(shot_list_validate))) assert(num_sampled_d == num) num_to_sample = len(shot_list_bleed) if conf['data']['bleed_in_equalize_sets']:#add bleed-in shots to training and validation set repeatedly @@ -180,7 +180,7 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): for s in shot_list_bleed: shot_list_train.append(s) shot_list_validate.append(s) - print("After adding: training shots: {} validation shots: {}".format(len(shot_list_train,shot_list_validate))) + print("After adding: training shots: {} validation shots: {}".format(len(shot_list_train),len(shot_list_validate))) print("Added bleed in shots to training and validation sets") # if num_d > 0: # for i in range(num): From 7d6fcb1cfbf368a8c255b0dbab4b1f0ec4d2a48c Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 Jan 2018 15:06:37 -0500 Subject: [PATCH 482/744] Option to apply batch norm between (most) linear and non-linear layers, bidirectional wrapper for lstm --- plasma/models/builder.py | 85 +++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 0b223356..da3274d7 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -2,8 +2,8 @@ import keras from keras.models import Sequential, Model from keras.layers import Input -from keras.layers.core import Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute -from keras.layers.recurrent import LSTM, SimpleRNN +from keras.layers.core import Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute, RepeatVector +from keras.layers import LSTM, SimpleRNN, Bidirectional, BatchNormalization from keras.layers.convolutional import Convolution1D from keras.layers.pooling import MaxPooling1D from keras.utils.data_utils import get_file @@ -12,7 +12,6 @@ from keras.callbacks import Callback from keras.regularizers import l1,l2,l1_l2 - import keras.backend as K import dill @@ -73,10 +72,12 @@ def get_0D_1D_indices(self): def build_model(self,predict,custom_batch_size=None): conf = self.conf model_conf = conf['model'] + use_bidirectional = model_conf['use_bidirectional'] rnn_size = model_conf['rnn_size'] rnn_type = model_conf['rnn_type'] regularization = model_conf['regularization'] dense_regularization = model_conf['dense_regularization'] + use_batch_norm = model_conf['use_batch_norm'] dropout_prob = model_conf['dropout_prob'] length = model_conf['length'] @@ -118,6 +119,7 @@ def build_model(self,predict,custom_batch_size=None): batch_shape_non_temporal=(batch_size,num_signals) indices_0d,indices_1d,num_0D,num_1D = self.get_0D_1D_indices() + def slicer(x,indices): return x[:,indices] @@ -130,10 +132,6 @@ def slicer_output_shape(input_shape,indices): pre_rnn_input = Input(shape=(num_signals,)) if num_1D > 0: - #pre_rnn_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) - #pre_rnn_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d))(pre_rnn_input) - #idx0D_tensor = K.variable(indices_0d) - #idx1D_tensor = K.variable(indices_1d) pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) pre_rnn_0D = Lambda(lambda x: x[:,:len(indices_0d)],output_shape=(len(indices_0d),))(pre_rnn_input)# slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) pre_rnn_1D = Reshape((num_1D,len(indices_1d)//num_1D)) (pre_rnn_1D) @@ -141,12 +139,40 @@ def slicer_output_shape(input_shape,indices): for i in range(model_conf['num_conv_layers']): div_fac = 2**i - pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) - pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,1,padding='valid',activation='relu') (pre_rnn_1D) + '''The first conv layer learns `num_conv_filters//div_fac` filters (aka kernels), + each of size `(size_conv_filters, num1D)``. Its output will have shape + (None, len(indices_1d)//num_1D - size_conv_filters + 1, num_conv_filters//div_fac), + i.e., for each position in the input spatial series (direction along radius), + the activation of each filter at that position.''' + + '''For i=1 first conv layer would get: + (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/pool_size-size_conv_filters+1,num_conv_filters//div_fac)''' + pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,size_conv_filters,padding='valid') (pre_rnn_1D) + if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + pre_rnn_1D = Activation('relu')(pre_rnn_1D) + + '''The output of the second conv layer will have shape + (None, len(indices_1d)//num_1D - size_conv_filters + 1, num_conv_filters//div_fac), + i.e., for each position in the input spatial series (direction along radius), + the activation of each filter at that position. + + for i=1 second layer would output + (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/pool_size-size_conv_filters+1,num_conv_filters//div_fac)''' + pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,1,padding='valid') (pre_rnn_1D) + if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + pre_rnn_1D = Activation('relu')(pre_rnn_1D) + '''Outputs (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/pool_size, num_conv_filters//div_fac) + + for i=1 pooling layer would output: + (None,((len(indices_1d)//num_1D- size_conv_filters + 1)/pool_size-size_conv_filters+1)/pool_size,num_conv_filters//div_fac)''' pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) pre_rnn_1D = Flatten() (pre_rnn_1D) - pre_rnn_1D = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) - pre_rnn_1D = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + pre_rnn_1D = Dense(dense_size,kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + pre_rnn_1D = Activation('relu')(pre_rnn_1D) + pre_rnn_1D = Dense(dense_size//4,kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) + if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + pre_rnn_1D = Activation('relu')(pre_rnn_1D) pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) else: pre_rnn = pre_rnn_input @@ -157,33 +183,22 @@ def slicer_output_shape(input_shape,indices): pre_rnn = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) + pre_rnn_model.summary() x_input = Input(batch_shape = batch_input_shape) x_in = TimeDistributed(pre_rnn_model) (x_input) -# x_input = Input(batch_shape=batch_input_shape) -# if num_1D > 0: -# x_0D = Lambda(lambda x: slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d)) (x_input) -# x_1D = Lambda(lambda x: slicer(x,indices_1d),lambda s: slicer_output_shape(s,indices_1d)) (x_input) -# -# x_1D = TimeDistributed(Reshape((num_1D,len(indices_1d)/num_1D))) (x_1D) -# for i in range(model_conf['num_conv_layers']): -# x_1D = TimeDistributed(Conv1D(num_conv_filters,size_conv_filters,activation='relu')) (x_1D) -# x_1D = TimeDistributed(MaxPooling1D(pool_size)) (x_1D) -# x_1D = TimeDistributed(Flatten()) (x_1D) -# x_in = TimeDistributed(Concatenate) ([x_0D,x_1D]) -# -# else: -# x_in = x_input - #x_in = TimeDistributed(Dense(100,activation='tanh')) (x_in) - #x_in = TimeDistributed(Dense(30,activation='tanh')) (x_in) - #x_in = TimeDistributed(Dense(2*(num_0D+num_1D)),activation='relu') (x_in) - # x = TimeDistributed(Dense(2*(num_0D+num_1D))) - # model.add(TimeDistributed(Dense(num_density_channels,bias=True),batch_input_shape=batch_input_shape)) - for _ in range(model_conf['rnn_layers']): - x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, - stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) - x_in = Dropout(dropout_prob) (x_in) + if use_bidirectional: + for _ in range(model_conf['rnn_layers']): + x_in = Bidirectional(rnn_model(rnn_size, return_sequences=return_sequences, + stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob)) (x_in) + x_in = Dropout(dropout_prob) (x_in) + else: + for _ in range(model_conf['rnn_layers']): + x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, + stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) + x_in = Dropout(dropout_prob) (x_in) if return_sequences: #x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) From e69eb5ccf19c769eff7b350152d230654f9e2ae9 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 Jan 2018 15:06:51 -0500 Subject: [PATCH 483/744] Batch norm and bidirectional flags --- examples/conf.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/conf.yaml b/examples/conf.yaml index d86e4118..f599ff51 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -52,6 +52,8 @@ data: floatx: 'float32' model: + use_bidirectional: false + use_batch_norm: false shallow: False shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training From 40bfabcfca9e77d53e90304bbdfacde8f84ef8d1 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 12 Jan 2018 15:07:04 -0500 Subject: [PATCH 484/744] Any Keras after 2.0.8 is good --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 59e70b94..ab3be99f 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras==2.0.6','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], + install_requires = ['keras>2.0.8','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From 2e58e488723caabc2e0f1747573363f0a2421f7f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 16 Jan 2018 12:05:08 -0500 Subject: [PATCH 485/744] Make etemp and edens not available for JET until understood missing data beyond run 73337 --- data/signals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index 13264366..b7af6c98 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,8 +137,8 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) From da6021cd25850b61f49a90db4c06499e299122c1 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Tue, 16 Jan 2018 14:14:49 -0500 Subject: [PATCH 486/744] Keep only paths profile is defined on --- data/signals.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index b7af6c98..3c3e6313 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,8 +137,11 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +#etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +#edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) + +etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) From aa3430d54034125b821871d7ed16e9e6ad2487e0 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 16 Jan 2018 14:18:42 -0500 Subject: [PATCH 487/744] Update signals.py --- data/signals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/signals.py b/data/signals.py index 3c3e6313..68fde894 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,8 +137,8 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -#etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -#edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +#etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +#edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) From dae8bf0c58c6b994ab305b7bf317ead95f6e8b15 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 Jan 2018 02:48:00 -0500 Subject: [PATCH 488/744] added option for partial multiplication factor in bleed in --- examples/conf.yaml | 15 ++++++++------- plasma/preprocessor/preprocess.py | 13 +++++++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index d86e4118..1d48aa12 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,15 +10,16 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: jet_data #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: jet_to_d3d_data #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" data: - bleed_in: 0 #how many shots from the test sit to use in training? + bleed_in: 5 #how many shots from the test sit to use in training? + bleed_in_repeat_fac: 10 bleed_in_remove_from_test: True - bleed_in_equalize_sets: True + bleed_in_equalize_sets: False signal_to_augment: None #'plasma current' #or None augmentation_mode: 'none' augment_during_training: False @@ -52,10 +53,10 @@ data: floatx: 'float32' model: - shallow: False + shallow: True shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training - type: "mlp" #"xgboost" #"xgboost" #"random_forest" "xgboost" + type: "xgboost" #"xgboost" #"xgboost" #"random_forest" "xgboost" n_estimators: 100 #for random forest max_depth: 3 #for random forest and xgboost (def = 3) C: 1.0 #for svm @@ -89,8 +90,8 @@ model: #have not found a difference yet optimizer: 'adam' clipnorm: 10.0 - regularization: 0.0 - dense_regularization: 0.01 + regularization: 0.001 + dense_regularization: 0.001 #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) lr: 0.00002 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 lr_decay: 0.97 #0.98 #0.9 diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index be3808c5..1d12f6c3 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -146,7 +146,7 @@ def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): - np.random.seed(1) + np.random.seed(2) num = conf['data']['bleed_in'] new_shots = [] if num > 0: @@ -170,13 +170,22 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): print("Sampled {} shots, {} disruptive, {} nondisruptive".format(num_sampled_nd+num_sampled_d,num_sampled_d,num_sampled_nd)) print("Before adding: training shots: {} validation shots: {}".format(len(shot_list_train),len(shot_list_validate))) assert(num_sampled_d == num) - num_to_sample = len(shot_list_bleed) if conf['data']['bleed_in_equalize_sets']:#add bleed-in shots to training and validation set repeatedly + print("Applying equalized bleed in") for shot_list_curr in [shot_list_train,shot_list_validate]: for i in range(len(shot_list_curr)): s = shot_list_bleed.sample_shot() shot_list_curr.append(s) + elif conf['data']['bleed_in_repeat_fac'] > 1: + repeat_fac = conf['data']['bleed_in_repeat_fac'] + print("Applying bleed in with repeat factor {}".format(repeat_fac)) + num_to_sample = int(round(repeat_fac*len(shot_list_bleed))) + for i in range(num_to_sample): + s = shot_list_bleed.sample_shot() + shot_list_train.append(s) + shot_list_validate.append(s) else: #add each shot only once + print("Applying bleed in without repetition") for s in shot_list_bleed: shot_list_train.append(s) shot_list_validate.append(s) From f6a770c9e88a36d78fd3568b09d2fa253579dad1 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 Jan 2018 02:48:34 -0500 Subject: [PATCH 489/744] added option for only fully defined signals --- plasma/conf_parser.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 15bf4dbe..8e7375c7 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -105,6 +105,17 @@ def parameters(input_file): params['paths']['shot_files'] = [jenkins_jet_carbon_wall] params['paths']['shot_files_test'] = [jenkins_jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals + elif params['paths']['data'] == 'jet_data_fully_defined': #jet data but with fully defined signals + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = fully_defined_signals + elif params['paths']['data'] == 'jet_data_fully_defined_0D': #jet data but with fully defined signals + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = fully_defined_signals_0D + + + elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] @@ -131,7 +142,14 @@ def parameters(input_file): params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, 'etemp_profile':etemp_profile ,'edens_profile':edens_profile} - + elif params['paths']['data'] == 'd3d_data_fully_defined': #jet data but with fully defined signals + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = fully_defined_signals + elif params['paths']['data'] == 'd3d_data_fully_defined_0D': #jet data but with fully defined signals + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = fully_defined_signals_0D #cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': From a3b081f32e04f05592aba928d61bc072345e1d59 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 Jan 2018 21:13:53 -0500 Subject: [PATCH 490/744] changed extrapolation value in profiles to boundary value, as it can lead to unphysical values if only part of the x regime is defined --- plasma/primitives/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 1354f506..fb19f466 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -227,7 +227,7 @@ def load_data(self,prepath,shot,dtype='float32'): for i in range(timesteps): _,order = np.unique(mapping[i,:],return_index=True) #make sure the mapping is ordered and unique if sig[i,order].shape[0] > 2: - f = UnivariateSpline(mapping[i,order],sig[i,order],s=0,k=1,ext=0) + f = UnivariateSpline(mapping[i,order],sig[i,order],s=0,k=1,ext=3) #ext = 0 is extrapolation, ext = 3 is boundary value. sig_interp[i,:] = f(remapping) else: print('Signal {}, shot {} has not enough points for linear interpolation. dfitpack.error: (m>k) failed for hidden m: fpcurf0:m=1'.format(self.description,shot.number)) From c3d9a4d8b6662ce1bd51b0c2c9c424059a5b43e4 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 24 Jan 2018 21:22:36 -0500 Subject: [PATCH 491/744] use full jet data (as opposed to just carbon wall) for cross-machine prediction. This gives more disruptive shots --- plasma/conf_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 8e7375c7..a131598d 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -153,7 +153,7 @@ def parameters(input_file): #cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': - params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [d3d_full] params['paths']['use_signals_dict'] = fully_defined_signals elif params['paths']['data'] == 'd3d_to_jet_data': @@ -161,7 +161,7 @@ def parameters(input_file): params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = fully_defined_signals elif params['paths']['data'] == 'jet_to_d3d_data_0D': - params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [d3d_full] params['paths']['use_signals_dict'] = fully_defined_signals_0D elif params['paths']['data'] == 'd3d_to_jet_data_0D': From 61dbe21a19089aa1d22a2f13da0263837bf3641f Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 25 Jan 2018 23:01:09 -0500 Subject: [PATCH 492/744] longer batch jobs by default --- plasma/utils/batch_jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index 56203b97..4ae45732 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -112,7 +112,7 @@ def create_slurm_header(num_nodes,use_mpi,idx): assert(num_nodes == 1) lines = [] lines.append('#!/bin/bash\n') - lines.append('#SBATCH -t 06:00:00\n') + lines.append('#SBATCH -t 20:00:00\n') lines.append('#SBATCH -N '+str(num_nodes)+'\n') if use_mpi: lines.append('#SBATCH --ntasks-per-node=4\n') From 68f881dbce982afb4ad18d6e9db4851adb15faee Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sun, 28 Jan 2018 19:48:30 -0500 Subject: [PATCH 493/744] added jet 1D signals only option --- data/signals.py | 7 ++++++- plasma/conf_parser.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/data/signals.py b/data/signals.py index 13264366..e0b79363 100644 --- a/data/signals.py +++ b/data/signals.py @@ -237,10 +237,15 @@ def fetch_nstx_data(signal_path,shot_num,c): fully_defined_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machines(all_machines)} fully_defined_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( sig.is_defined_on_machines(all_machines) and sig.num_channels == 1) } +fully_defined_signals_1D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( sig.is_defined_on_machines(all_machines) and sig.num_channels > 1) } + d3d_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(d3d)} +d3d_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(d3d) and sig.num_channels == 1)} +d3d_signals_1D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(d3d) and sig.num_channels > 1)} + jet_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(jet)} jet_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} - +jet_signals_1D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels > 1)} #['pcechpwrf'] #Total ECH Power Not always on! ### 0D EFIT signals ### diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index a131598d..1dea38b3 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -93,6 +93,10 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals_0D + elif params['paths']['data'] == 'jet_data_1D': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = jet_signals_1D elif params['paths']['data'] == 'jet_carbon_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] @@ -168,6 +172,14 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = fully_defined_signals_0D + elif params['paths']['data'] == 'jet_to_d3d_data_1D': + params['paths']['shot_files'] = [jet_full] + params['paths']['shot_files_test'] = [d3d_full] + params['paths']['use_signals_dict'] = fully_defined_signals_1D + elif params['paths']['data'] == 'd3d_to_jet_data_1D': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = fully_defined_signals_1D From 77e41a5d39a969615b3cb06f7a2ef1ea32e119a3 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Tue, 30 Jan 2018 12:55:55 -0500 Subject: [PATCH 494/744] Roll back to Keras 2.0.6. Need to investigate changes to model.stop_training in Keras 2.1.x --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ab3be99f..59e70b94 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras>2.0.8','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], + install_requires = ['keras==2.0.6','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From e22b32ebfba888f99ebb7d5328b43aa1be153152 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 1 Feb 2018 17:25:12 -0500 Subject: [PATCH 495/744] higher numbers of conv filters in tune hyperparams --- examples/tune_hyperparams.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index e8efd61e..56b8eb69 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -7,8 +7,8 @@ tunables = [] shallow = False -num_nodes = 2 -num_trials = 50 +num_nodes = 1 +num_trials = 20 t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) @@ -34,14 +34,20 @@ lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,4.0,16.0]) target = CategoricalHyperparam(['target'],['maxhinge','hinge','ttdinv','ttd']) - batch_size = CategoricalHyperparam(['training','batch_size'],[64,256,1024]) - dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.1,0.3,0.5]) - conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[5,10]) + #target = CategoricalHyperparam(['target'],['hinge','ttdinv','ttd']) + batch_size = CategoricalHyperparam(['training','batch_size'],[128,256]) + dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.01,0.05,0.1]) + conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[128,256]) conv_layers = IntegerHyperparam(['model','num_conv_layers'],2,4) - rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,4) - rnn_size = CategoricalHyperparam(['model','rnn_size'],[100,200,300]) - tunables = [lr,lr_decay,fac,target,batch_size,dropout_prob] - tunables += [conv_filters,conv_layers,rnn_layers,rnn_size] + rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,3) + rnn_size = CategoricalHyperparam(['model','rnn_size'],[128,256]) + dense_size = CategoricalHyperparam(['model','dense_size'],[128,256]) + extra_dense_input = CategoricalHyperparam(['model','extra_dense_input'],[False,True]) + equalize_classes = CategoricalHyperparam(['data','equalize_classes'],[False,True]) + #rnn_length = CategoricalHyperparam(['model','length'],[32,128]) + #tunables = [lr,lr_decay,fac,target,batch_size,dropout_prob] + tunables = [lr,lr_decay,fac,target,batch_size,equalize_classes,dropout_prob] + tunables += [conv_filters,conv_layers,rnn_layers,rnn_size,dense_size,extra_dense_input] tunables += [cut_ends,t_warn] From 8f4c7d1d85c3c109b5970ce484b8ea616fe132a3 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 5 Feb 2018 15:40:34 -0500 Subject: [PATCH 496/744] latest version of scaling plot notebook --- examples/notebooks/FRNN_scaling.ipynb | 450 ++++++++++++++------------ 1 file changed, 245 insertions(+), 205 deletions(-) diff --git a/examples/notebooks/FRNN_scaling.ipynb b/examples/notebooks/FRNN_scaling.ipynb index 52c09f0e..40109fd0 100644 --- a/examples/notebooks/FRNN_scaling.ipynb +++ b/examples/notebooks/FRNN_scaling.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -19,21 +19,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 13, + "execution_count": 212, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ + "import re\n", + "from os import listdir\n", + "from os.path import isfile, join\n", + "def plot_loss_vs_step(raw_path,ending='.out',save_path=False):\n", + " files = [join(raw_path,f) for f in listdir(raw_path) if (isfile(join(raw_path, f)) and ending in f)]\n", + " loss_arrays = [get_losses(open(f).read()) for f in files]\n", + " node_counts = np.array([get_num_gpus(open(f).read()) for f in files])\n", + " for (i,loss_arr) in enumerate(loss_arrays):\n", + " plt.semilogy(np.array(range(len(loss_arr)))*node_counts[i],loss_arr,label=r\"$N_{{GPU}} = {{{}}}$\".format(node_counts[i]))\n", + " plt.legend(loc=(1,0))\n", + " if save_path:\n", + " plt.savefig(save_path)\n", + "\n", + "def get_from_csv(f):\n", + " dat = np.genfromtxt(f,delimiter=',',names=True)\n", + " epochs = dat['epoch']\n", + " train_loss = dat['train_loss']\n", + " val_loss = dat['val_loss']\n", + " val_roc = dat['val_roc']\n", + " return epochs,train_loss,val_loss,val_roc\n", + "\n", "#regexes for parsing the log files\n", "def get_num_gpus(text):\n", " p = re.compile('\\[batch = \\d+ = \\d+\\*\\d+\\]')\n", @@ -54,6 +66,30 @@ " nums = [float(re.findall(r'\\d+.\\d+',match)[-1]) for match in matches]\n", " return nums[-1]\n", "\n", + "def get_effective_epoch(text):\n", + " p = re.compile(' \\[\\d+.\\d+\\/\\d+\\]')\n", + " matches = p.findall(text)\n", + " nums = [float(re.findall(r'\\d+.\\d+',match)[0]) for match in matches]\n", + " return nums\n", + "\n", + "def get_effective_epoch_and_loss(text):\n", + " p = re.compile(' \\[\\d+.\\d+\\/\\d+\\], ' + 'loss: \\d+\\.\\d+ \\[\\d+\\.\\d+\\]')\n", + " matches = p.findall(text)\n", + " e_eff = [float(re.findall(r'\\d+.\\d+',match)[0]) for match in matches]\n", + " e_eff = np.linspace(0,e_eff[-1],len(e_eff))\n", + " loss = np.array([float(re.findall(r'\\d+.\\d+',match)[-1]) for match in matches])\n", + " return e_eff,loss\n", + "\n", + "\n", + " \n", + "def get_epoch_size(text):\n", + " p = re.compile(' \\[\\d+.\\d+\\/\\d+\\]')\n", + " matches = p.findall(text)\n", + " nums = [float(re.findall(r'\\d+.\\d+',match)[0]) for match in matches]\n", + " epoch_size = float(re.findall(r'\\d+.\\d+',matches[0])[1])\n", + " return epoch_size\n", + " \n", + "\n", "def get_losses(text):\n", " p = re.compile('loss: \\d+\\.\\d+ \\[\\d+\\.\\d+\\]')\n", " #'loss: \\d+\\.\\d+ \\[\\d+\\.\\d+\\]'\n", @@ -67,7 +103,7 @@ "def get_execution_time(text):\n", " p = re.compile('Epoch \\d+.\\d+ finished \\(\\d+.\\d+ epochs passed\\) in \\d+.\\d+ seconds')\n", " #p = re.compile('Epoch 2 finished in \\d+.\\d+ seconds')\n", - " match = p.findall(text)[0]\n", + " match = p.findall(text)[1]\n", " execution_time = float(re.findall(r'\\d+\\.\\d',match)[-1])\n", " effective_epochs_passed = float(re.findall(r'\\d+\\.\\d',match)[-2])\n", " return execution_time/effective_epochs_passed\n", @@ -77,16 +113,161 @@ " return arr/arr[0]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot from CSV log files" + ] + }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 249, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "raw_path = './newtest/'\n", - "data_size = 'full' #'Titan' #full, large, medium\n", + "#only works if in the same order as the GPU counts!\n", + "csvfiles = [join(raw_path,f) for f in listdir(raw_path) if (isfile(join(raw_path, f)) and 'callback' in f)]\n", + "csvfiles = list(zip(*sorted(zip(node_counts,csvfiles)))[1])\n", + "f = csvfiles[0]\n", + "\n", + "\n", + "by_epoch_stats = [get_from_csv(f) for f in csvfiles]" + ] + }, + { + "cell_type": "code", + "execution_count": 251, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nkda+uIsbSimeiniKlftXcs+79xA+L5y5W+ay6utVeXe6+25jGWLMGCOeJTLS+PQ3MQkJCfb/9vIy\nVlQGDDBWVJKSjIshN2+G114zVl3yQ+sbf11AdrJrsQKix7xYSQuIHkuitXbbA4QCGe4c00wPhoOm\nk5KSdEnxt8//phvPaexQdu+9Wvfo4Z7x0zLS9Kp9q3TXuK7aa5KXph663lv19NOrns6/45YtWjdq\npLW3t9avvKJ1Wpp7DHIzXbp0cdtYR49qHRysdXS01pMna71mjdZnz7pt+AJxpxYzIHrMi5W0aC16\nzEpSUpIGNBCui/j561KAbV4opUKBZK11ARk0SiclHWALsGj7IgZ8NoBzL5wj4JYAwNi6iI+HlBT3\nznXy4km++PELtp3dRobOYO4jc/PvcPUqTJxoZMAND4f33oNGjdxrVDFJTU3F19fXLWP9+qtxZHrL\nFuM5f94or13bCOVp1gyGDIHy5d0ynRPu1GIGRI95sZIWED1mxRMBtkIJERkSiUaz5cSfCdrCwows\ntpcuuXeuYL9gBrQYwFsPv1Wgo3JdX6fvF4OZGV2ZXcvncf3iBWObaPp0yHAhKV0J4c7/oe+4A155\nxXAUf/vN+BksXgydO8Phw/DPfxYc5FscrPDHKTuix7xYSQuIHisizorJqHd7PSrcUsEpyFZrz4aL\n/Hb5Nw6dP8Q/vvkHTbcNJuCJn/ng/tu4PuYFzoQ34NgPa4t3b5HJUQrq1oU+fYyEvxs3wpkzBZ/q\nnjcPliyBAwc8G/8iCIJQmilTlMZKqU8LaFKhGLYIgE3ZiAyJZPOxzfayRo2MYNEdO4wYV08Q6BvI\nhv4bSMtIY+epnSQeSyT+7kQ+b/gtL7//E3e2eoAz41+g0ouvFJxH3yIURuaiRX/eFVmxonGwqnnz\nP7eR7rijRE0UBEGwBEVdWfm9gOcw8L47DbwZybqBOWul4pZbjKt8int8OTdGjRpVpPbeXt5EVIlg\naPOhfPDYByybeYyKKb9w8slHCZw4Hdq0MZYR/p+9M49vqkr///ukTdu0pXuhtGUXEVnKIpi6gCOK\nKx23EXUcN9zFbUaR+c4oOs4o7rujjijqqLiNftFRUL/zE8ShIBREVpVCoWWHlm5J2yTn98dJ0nRJ\nuqVNcjnv1+u+cnNzz7nPpzdpnjznOc9phYO1B3FJVzDM9ktH9XQ3y5erCMyiRaoab1ycmkr9619D\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "colors = ['b','g','r']\n", + "\n", + "for (i,loss_arr) in enumerate(loss_arrays):\n", + " by_epoch = by_epoch_stats[i]\n", + " epoch,t_loss,val_loss,val_roc = by_epoch\n", + " alpha = 1.0\n", + " if node_counts[i] == 4:\n", + " alpha = 0.4\n", + "# plt.semilogy(effective_epochs[i],np.array(range(len(loss_arr)))*node_counts[i],loss_arr,alpha=alpha,label=r\"$N_{{GPU}} = {{{}}}$\".format(node_counts[i]))\n", + " plt.plot(epoch,t_loss,color=colors[i],label=r\"$N_{{GPU}} = {{{}}}$\".format(node_counts[i]))\n", + " plt.plot(epoch,val_loss,'--',color=colors[i])\n", + "\n", + " \n", + "plt.plot([],[],'--k',label=\"Validation\")\n", + "plt.plot([],[],'-k',label=\"Train\")\n", + "plt.xlim([0,9])\n", + "plt.xlabel(\"Epoch\")\n", + "plt.ylabel(\"Loss\")\n", + "plt.legend(loc=\"best\")\n", + "plt.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot from CSV log files" + ] + }, + { + "cell_type": "code", + "execution_count": 246, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "a = effective_epochs_and_loss[0][1]\n", + "a\n", + "import pandas as pd\n", + "def get_rolling_mean(arr,N):\n", + " ret = np.zeros_like(arr)\n", + " cutoff=N-1\n", + " for i in range(cutoff):\n", + " ret[i] = np.mean(arr[:i])\n", + "# ret[:cutoff] = arr[:cutoff]\n", + " ret[cutoff:] = pd.rolling_mean(arr,N)[cutoff:]\n", + " return ret\n" + ] + }, + { + "cell_type": "code", + "execution_count": 250, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/julian/anaconda/lib/python2.7/site-packages/ipykernel/__main__.py:10: FutureWarning: pd.rolling_mean is deprecated for ndarrays and will be removed in a future version\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 250, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nJYm7+WIt5mX2MrYd2RbRa/RO701KQkrYz7t582ZvJaFnz54MGTKE559/nmuvvRYAu92O1Wpt8DwO\nhwNbMx+XmJuby7nnnst1110HwPHjxwFo3bq133Ft2rTx7osFzTvqUVYp3T2mGTZsWLSbEJck7uaL\ntZhvO7KN/s9HttqwccJGMk8P/+0C1q1bxw033OB9PG7cOEaPHs2+fftIS0sjNTW11nNef/11tmzZ\nQufOnUlJSSExMZH169czb948ANauXcvUqVPp1q0bV111FeXl5Xz55ZdMnTqVd999lwcffJDZs2cz\ncuRIOnbsyOOPP84bb7zBww8/zE033QSAy+Vi+PDhVLr/APbtgoLq6o/WmrZt25KbmxvwdX711Vcs\nWbKEDz/80Dto1pN81UzC7HY7Docj6BhGmyQpAVRJJUUIEed6p/dm44SNEb9GJOzbt49OnTp5Hw8f\nPpyJEyeyYMECBgwYwIABA7z7XC4XY8aMYdCgQX43gXz66afp0qWL9/HgwYNxOp1MnjyZiy++GDBm\n0UybNo177rmHQYMGcd9993mPHzFiBAMHDmTo0KHebRaLhbfffjssr7GkpIQJEybw1ltvceGFF3q3\nd+jQwfu6fJWWlpKWlhaWa5tBkpQApLtHCBHvUhJSIlLliIakpCRuvvlmcnJycDgcPPTQQ959jzzy\nCG3atOH222/3e86AAQNo27at93FxcTHbt2/3u1FkYWEhqamprF692i8ZAVi/fj0jRoyI0CuCO++8\nk6eeeorLLrsMgN27d9OjRw969OgBwKFDh0hPTweMykxRUZF33EoskCQlgAqbO0mR7p6IW7JkCddf\nf320mxF3JO7mk5ibY8+ePXTt2rXW9vHjxzN//nzWr1/vHa9x9OhRnnnmmTqn5l566aV+j/Pz8zn/\n/PO9Y1QOHjzI2rVrWbRoEaNHj2bWrFl+x5eVlZGUlOS3rWZ3T30a6u554oknGD16tDdBKSwsZM2a\nNfTo0YPu3bvTq1cvtm/fznnnnQfAtm3bqKysrJVINWeSpASwa81RsoDs998n+/LLo92cFi03N1d+\ncUeBxN18EnNzLFmyhEsuuaTW9oyMDDIzM8nIyPBuW7duHT169PDr1nnnnXdYtWoVdrudyZMn06tX\nLwDWrFlDeno6eXl5VFRUUFpayooVK0hISGDLli3eLiAPi6X2JNpwdPcsXryYjz76CJvNxsaNRnfc\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for (i,loss_arr) in enumerate(loss_arrays):\n", + " alpha = 1.0\n", + " to_plot = effective_epochs_and_loss[i][1]\n", + " if node_counts[i] == 4:\n", + " to_plot = get_rolling_mean(to_plot,15) #very noisy\n", + " alpha = 0.4\n", + "# plt.semilogy(effective_epochs[i],np.array(range(len(loss_arr)))*node_counts[i],loss_arr,alpha=alpha,label=r\"$N_{{GPU}} = {{{}}}$\".format(node_counts[i]))\n", + " plt.semilogy(effective_epochs_and_loss[i][0]/(epoch_lengths[i]),to_plot,alpha=alpha,label=r\"$N_{{GPU}} = {{{}}}$\".format(node_counts[i]))\n", + "plt.legend(loc=\"best\")#(1,0))\n", + "plt.xlim([1e-2,10])\n", + "plt.ylim([1e-3,1])\n", + "plt.grid()\n", + "plt.xlabel(\"Epoch\",size=12)\n", + "plt.ylabel(\"Training Loss\",size=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "raw_path = '../../plots/'#'./newtest/'\n", + "data_size = 'out' #full' #'Titan' #full, large, medium\n", "from os import listdir\n", "from os.path import isfile, join\n", "files = [join(raw_path,f) for f in listdir(raw_path) if (isfile(join(raw_path, f)) and data_size in f)]" @@ -94,7 +275,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 213, "metadata": { "collapsed": false }, @@ -103,7 +284,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[24]\n" + "[4, 20, 100]\n" ] } ], @@ -113,16 +294,19 @@ "print node_counts\n", "files = list(zip(*sorted(zip(node_counts,files)))[1])\n", "files\n", + "effective_epochs_and_loss =[get_effective_epoch_and_loss(open(f).read()) for f in files]\n", + "epoch_lengths = np.array([get_epoch_size(open(f).read()) for f in files])\n", "node_counts = np.array([get_num_gpus(open(f).read()) for f in files])\n", "sync_percentages =np.array([get_sync_percentages(open(f).read()) for f in files] )\n", "execution_times =np.array([get_execution_time(open(f).read()) for f in files])\n", + "# execution_times = [1.0]\n", "losses = np.array([get_loss(open(f).read()) for f in files])\n", "loss_arrays = [get_losses(open(f).read()) for f in files]" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 75, "metadata": { "collapsed": false }, @@ -140,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 135, "metadata": { "collapsed": false }, @@ -148,145 +332,21 @@ { "data": { "text/plain": [ - "array([ 1.04816, 0.50673, 0.23602, 0.17164, 0.044 , 0.01846,\n", - " 0.02425, 0.07086, 0.09969, 0.08962, 0.07535, 0.06142,\n", - " 0.05591, 0.04328, 0.04155, 0.03081, 0.02032, 0.02561,\n", - " 0.02532, 0.0284 , 0.02367, 0.02229, 0.03027, 0.03846,\n", - " 0.03265, 0.02961, 0.02874, 0.02642, 0.02517, 0.025 ,\n", - " 0.00921, 0.0066 , 0.01082, 0.01557, 0.01925, 0.02301,\n", - " 0.02304, 0.02865, 0.02527, 0.02474, 0.0197 , 0.02035,\n", - " 0.01216, 0.0123 , 0.01153, 0.01047, 0.01168, 0.01081,\n", - " 0.00954, 0.01401, 0.0133 , 0.01342, 0.01963, 0.02554,\n", - " 0.02259, 0.0245 , 0.02127, 0.0151 , 0.01591, 0.01684,\n", - " 0.00955, 0.00737, 0.00789, 0.00833, 0.0086 , 0.00934,\n", - " 0.008 , 0.01141, 0.01709, 0.02115, 0.01687, 0.01529,\n", - " 0.01554, 0.0189 , 0.0201 , 0.01489, 0.01229, 0.01499,\n", - " 0.0163 , 0.01706, 0.01684, 0.01251, 0.01564, 0.01953,\n", - " 0.01224, 0.01 , 0.01241, 0.02032, 0.02303, 0.02526,\n", - " 0.0211 , 0.02159, 0.02427, 0.02567, 0.0227 , 0.01473,\n", - " 0.01185, 0.01649, 0.01486, 0.01425, 0.01366, 0.01472,\n", - " 0.01539, 0.01652, 0.01775, 0.00824, 0.009 , 0.01205,\n", - " 0.01131, 0.01181, 0.01002, 0.01029, 0.01673, 0.02227,\n", - " 0.01955, 0.01977, 0.02003, 0.02144, 0.02421, 0.02628,\n", - " 0.00879, 0.00671, 0.00788, 0.00856, 0.01104, 0.01433,\n", - " 0.00918, 0.01297, 0.01917, 0.0205 , 0.01939, 0.02012,\n", - " 0.02601, 0.02989, 0.03163, 0.01821, 0.01749, 0.01772,\n", - " 0.01844, 0.02178, 0.0138 , 0.00715, 0.01114, 0.01614,\n", - " 0.01746, 0.01843, 0.02218, 0.02118, 0.02202, 0.02389,\n", - " 0.01489, 0.01337, 0.01188, 0.01162, 0.00661, 0.00702,\n", - " 0.00745, 0.01256, 0.01604, 0.01596, 0.01663, 0.02029,\n", - " 0.02053, 0.02274, 0.02519, 0.01717, 0.01711, 0.01866,\n", - " 0.01277, 0.01254, 0.00807, 0.00318, 0.00821, 0.01471,\n", - " 0.01518, 0.01532, 0.01388, 0.01509, 0.0159 , 0.01706,\n", - " 0.00685, 0.00792, 0.01146, 0.01458, 0.01866, 0.0194 ,\n", - " 0.02132, 0.02143, 0.02523, 0.02708, 0.02283, 0.02433,\n", - " 0.0211 , 0.0224 , 0.02065, 0.01788, 0.00929, 0.01031,\n", - " 0.00955, 0.01057, 0.01111, 0.00907, 0.01197, 0.01531,\n", - " 0.01402, 0.01537, 0.01722, 0.01651, 0.01623, 0.01745,\n", - " 0.01407, 0.01603, 0.01633, 0.01667, 0.01362, 0.01197,\n", - " 0.01303, 0.01609, 0.01403, 0.01173, 0.01244, 0.01301,\n", - " 0.01147, 0.01222, 0.01194, 0.00741, 0.00676, 0.00858,\n", - " 0.00679, 0.00742, 0.00772, 0.00949, 0.01163, 0.01442,\n", - " 0.0118 , 0.01185, 0.0116 , 0.00998, 0.00949, 0.00898,\n", - " 0.00692, 0.00736, 0.01123, 0.01449, 0.0176 , 0.02064,\n", - " 0.02227, 0.02488, 0.02731, 0.02573, 0.02009, 0.01921,\n", - " 0.01612, 0.01428, 0.01823, 0.01897, 0.01688, 0.01897,\n", - " 0.01593, 0.01784, 0.01968, 0.01895, 0.01713, 0.01414,\n", - " 0.01252, 0.01399, 0.01416, 0.0139 , 0.01545, 0.01264,\n", - " 0.00813, 0.01237, 0.01377, 0.01352, 0.01546, 0.01804,\n", - " 0.01897, 0.01859, 0.01627, 0.01238, 0.01222, 0.01269,\n", - " 0.01065, 0.0082 , 0.01024, 0.01234, 0.0092 , 0.00996,\n", - " 0.00789, 0.00928, 0.01124, 0.01253, 0.0117 , 0.0155 ,\n", - " 0.01731, 0.01777, 0.01871, 0.01825, 0.01719, 0.01816,\n", - " 0.01359, 0.01022, 0.01235, 0.01616, 0.01783, 0.02237,\n", - " 0.02038, 0.01956, 0.01787, 0.01633, 0.01175, 0.01032,\n", - " 0.00903, 0.00886, 0.01097, 0.00908, 0.01057, 0.0129 ,\n", - " 0.01519, 0.01734, 0.01195, 0.01263, 0.01511, 0.01728,\n", - " 0.0125 , 0.01178, 0.01326, 0.01412, 0.0153 , 0.01432,\n", - " 0.00872, 0.01072, 0.01293, 0.01349, 0.01042, 0.00954,\n", - " 0.01316, 0.01913, 0.02055, 0.01444, 0.01506, 0.01873,\n", - " 0.01856, 0.02205, 0.01669, 0.01574, 0.01831, 0.01909,\n", - " 0.01225, 0.01186, 0.0135 , 0.01187, 0.01645, 0.01636,\n", - " 0.01764, 0.02119, 0.02382, 0.02477, 0.02088, 0.02233,\n", - " 0.01276, 0.01427, 0.00863, 0.00889, 0.01219, 0.01422,\n", - " 0.01419, 0.01377, 0.0116 , 0.01341, 0.01562, 0.01946,\n", - " 0.01797, 0.02002, 0.02222, 0.02313, 0.02175, 0.01983,\n", - " 0.01343, 0.01282, 0.01085, 0.01083, 0.00957, 0.01189,\n", - " 0.01154, 0.01372, 0.01439, 0.01486, 0.01312, 0.01532,\n", - " 0.01685, 0.01685, 0.01815, 0.01651, 0.01426, 0.01444,\n", - " 0.01078, 0.01316, 0.00942, 0.00868, 0.00963, 0.01259,\n", - " 0.01156, 0.01316, 0.01156, 0.00928, 0.01273, 0.01548,\n", - " 0.01416, 0.01672, 0.01641, 0.01711, 0.01914, 0.02005,\n", - " 0.01421, 0.01478, 0.01284, 0.00926, 0.01021, 0.01135,\n", - " 0.01046, 0.00885, 0.01046, 0.01085, 0.01136, 0.01341,\n", - " 0.01335, 0.01794, 0.01694, 0.01519, 0.01548, 0.01655,\n", - " 0.01565, 0.01876, 0.01672, 0.01414, 0.0149 , 0.01593,\n", - " 0.01432, 0.01459, 0.0142 , 0.01369, 0.01116, 0.00959,\n", - " 0.01168, 0.01628, 0.01822, 0.01698, 0.01843, 0.02064,\n", - " 0.02327, 0.02276, 0.01851, 0.0158 , 0.01724, 0.01927,\n", - " 0.01469, 0.01532, 0.0099 , 0.01145, 0.01081, 0.01134,\n", - " 0.01419, 0.0195 , 0.02169, 0.02199, 0.02111, 0.02175,\n", - " 0.02103, 0.02286, 0.01475, 0.01652, 0.02084, 0.02156,\n", - " 0.01918, 0.02 , 0.02155, 0.0117 , 0.01052, 0.0114 ,\n", - " 0.00717, 0.00829, 0.00948, 0.0118 , 0.01753, 0.0201 ,\n", - " 0.01797, 0.01866, 0.01845, 0.01971, 0.02038, 0.01982,\n", - " 0.01534, 0.01584, 0.01613, 0.01668, 0.01073, 0.01189,\n", - " 0.01272, 0.01643, 0.01759, 0.01775, 0.01806, 0.01535,\n", - " 0.01642, 0.01686, 0.01551, 0.0142 , 0.01528, 0.01712,\n", - " 0.01977, 0.02154, 0.02471, 0.02318, 0.02011, 0.02283,\n", - " 0.01978, 0.02004, 0.01602, 0.01344, 0.01226, 0.01305,\n", - " 0.00992, 0.0104 , 0.00942, 0.01002, 0.0106 , 0.01396,\n", - " 0.01307, 0.01566, 0.02064, 0.02236, 0.02486, 0.02383,\n", - " 0.02147, 0.02158, 0.01913, 0.0123 , 0.01026, 0.01087,\n", - " 0.01193, 0.01014, 0.00819, 0.01018, 0.0116 , 0.01271,\n", - " 0.01186, 0.01232, 0.00937, 0.01078, 0.00854, 0.00815,\n", - " 0.00942, 0.01446, 0.01882, 0.0209 , 0.01972, 0.0214 ,\n", - " 0.01971, 0.02035, 0.02008, 0.01186, 0.00761, 0.00768,\n", - " 0.0067 , 0.00521, 0.0052 , 0.00456, 0.00606, 0.00605,\n", - " 0.00411, 0.0055 , 0.00907, 0.01308, 0.0161 , 0.01757,\n", - " 0.0149 , 0.01452, 0.01329, 0.01399, 0.01114, 0.00947,\n", - " 0.0115 , 0.01317, 0.014 , 0.01635, 0.01656, 0.01632,\n", - " 0.01956, 0.02112, 0.01707, 0.01909, 0.02521, 0.02495,\n", - " 0.02113, 0.01792, 0.01446, 0.01603, 0.0168 , 0.014 ,\n", - " 0.00572, 0.00666, 0.00767, 0.00917, 0.01245, 0.01354,\n", - " 0.01577, 0.01918, 0.02355, 0.02418, 0.02145, 0.02312,\n", - " 0.01922, 0.02056, 0.01905, 0.01542, 0.01349, 0.01301,\n", - " 0.01185, 0.01212, 0.00662, 0.00624, 0.00935, 0.01149,\n", - " 0.00933, 0.01044, 0.01115, 0.01209, 0.01365, 0.01331,\n", - " 0.01156, 0.01139, 0.01131, 0.013 , 0.01427, 0.01273,\n", - " 0.00812, 0.00803, 0.00904, 0.01081, 0.00836, 0.0089 ,\n", - " 0.01264, 0.01588, 0.01718, 0.0194 , 0.01791, 0.01612,\n", - " 0.01467, 0.01102, 0.00499, 0.00308, 0.00577, 0.00721,\n", - " 0.00873, 0.01101, 0.01232, 0.01494, 0.01712, 0.01915,\n", - " 0.0153 , 0.01596, 0.01585, 0.01247, 0.01412, 0.01264,\n", - " 0.01007, 0.00426, 0.00514, 0.00735, 0.00884, 0.01022,\n", - " 0.0107 , 0.01343, 0.01477, 0.01704, 0.0185 , 0.0171 ,\n", - " 0.01746, 0.0181 , 0.01054, 0.01263, 0.01483, 0.01582,\n", - " 0.01439, 0.01615, 0.01264, 0.01458, 0.01775, 0.01775,\n", - " 0.01582, 0.01464, 0.01613, 0.01627, 0.01873, 0.01709,\n", - " 0.01686, 0.01549, 0.01654, 0.01899, 0.0153 , 0.01168,\n", - " 0.01093, 0.01371, 0.01289, 0.01248, 0.01158, 0.00956,\n", - " 0.00743, 0.00948, 0.00978, 0.0119 , 0.01958, 0.02394,\n", - " 0.02435, 0.02716, 0.02882, 0.02844, 0.02613, 0.01909,\n", - " 0.01031, 0.00965, 0.00814, 0.00791, 0.00856, 0.00924,\n", - " 0.0102 , 0.01234, 0.01362, 0.01243, 0.01478, 0.0115 ,\n", - " 0.0095 , 0.00912, 0.01022, 0.0101 , 0.01257, 0.01402,\n", - " 0.01289, 0.01205, 0.01094, 0.01123, 0.01206, 0.01423,\n", - " 0.01087, 0.01244, 0.01347, 0.01233, 0.0133 , 0.01501])" + "array([ 2899., 2899., 2899.])" ] }, - "execution_count": 19, + "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "loss_arrays[-1]" + "epoch_lengths" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 78, "metadata": { "collapsed": false }, @@ -294,52 +354,18 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 22, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAo8AAAFnCAYAAADHb6MJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl8XGW5B/DfmzRd0iXplm5Q2lIoFLElKUsFitCrLELx\nCloDeJGCvSgoRq4oF2QToSpQVMSLUi0I5opewCJS9n2noQh0QUq60YVuSZs2bZPmvX88fXreOTln\n5kzmJDOT/L6fTz/TTCYzZ2bO8jvPuxxjrQURERERURQF2V4AIiIiIsofDI9EREREFBnDIxERERFF\nxvBIRERERJExPBIRERFRZAyPRERERBQZwyMRERERRcbwSERERESRMTwSERERUWQMj0REREQUGcMj\nEREREUWWM+HRGPOgMWazMeaBbC8LEREREQXLmfAI4HYAX8v2QhARERFRuJwJj9baFwA0ZHs5iIiI\niChczoRHIiIiIsp9GYdHY8zxxph5xpiPjTEtxphpAY+5xBhTa4xpNMa8Zow5MtPXJSIiIqKOF0fl\nsTeAhQC+BcD6f2mMmQ7gVgDXAjgCwDsAHjfGDIrhtYmIiIioA3XL9AmstfMBzAcAY4wJeEgVgLus\ntffufczFAL4AYAaAn/kea/b+C2WMGQjgZADLAezMZNmJiIi6mJ4ARgF43Fq7KcvLQnkq4/CYjDGm\nCEAFgJv0PmutNcY8BWCy77FPAvg0gN7GmJUAvmytfT3gaU8GcH/7LTUREVGndy6AP2V7ISg/tWt4\nBDAIQCGA9b771wMY595hrf1cxOdcDgD33XcfDj300EyXLydUVVVh9uzZ2V6MWHSm9wLw/eSyzvRe\nAL6fXNaZ3svixYtx3nnnAXuPpURt0d7hsT3sBIBDDz0U5eXl2V6WWJSUlPC95Ci+n9zVmd4LwPeT\nyzrTe3Gw2xe1WXtP1bMRwB4AQ3z3DwGwrp1fm4iIiIhi1q6VR2ttkzFmAYCpAOYB+wbVTAXwy0ye\nu6qqCiUlJaisrERlZWXmC0tERNRJVVdXo7q6GvX19dleFOoEMg6PxpjeAMbCGyU9xhgzAcBma+0q\nALcBmLs3RL4BGX1dDGBuJq87e/bsztiMQEREFDsttNTU1KCioiLbi0N5Lo7K4yQAz0LmeLSQOR0B\n4B4AM6y1D+yd0/EGSHP1QgAnW2s3xPDanUJnqpx2pvcC8P3kss70XgC+n1zWmd4LURyMta3m9c5p\nxphyAAsWLFjAyiMREVEanMpjhbW2JtvLQ/kpH0dbA2CfRyIioqjY55HixMojERFRF8HKI8Whvafq\nISIiIqJOhOGRiIiIiCJjn0ciIqJOjn0eKU7s80hERNRFsM8jxYHN1kREREQUGcMjEREREUXG8EhE\nREREkTE8EhEREVFkHG1NRETUyXG0NcWJo62JiIi6CI62pjiw2ZqIiIiIImN4JCIiIqLIGB6JiIiI\nKDKGRyIiIiKKjKOtiYiIOjmOtqY4cbQ1ERFRF8HR1hQHNlsTERERUWQMj0REREQUGcMjEREREUXG\n8EhEREREkTE8EhEREVFknKqHiIiok+NUPRQnTtVDRETURXCqHooDm62JiIiIKDKGRyIiIiKKjOGR\niIiIiCJjeCQiIiKiyBgeiYiIiCgyhkciIiIiiozhkYiIiIgiY3gkIiIiosh4hRkiIqJOjleYoTjx\nCjNERERdBK8wQ3FgszURERERRcbwSERERESRMTwSERERUWQMj0REREQUGcMjEREREUXG8EhERERE\nkTE8EhEREVFkDI9EREREFBnDIxERERFFxvBIRERERJExPBIRERFRZAyPRERERBRZt2wvQFtVVVWh\npKQElZWVqKyszPbiEBER5azq6mpUV1ejvr4+24tCnYCx1mZ7GdJijCkHsGDBggUoLy/P9uIQERHl\njZqaGlRUVABAhbW2JtvLQ/mJzdZEREREFBnDIxERERFFxvBIRERERJExPBIRERFRZAyPRERERBQZ\nwyMRERERRcbwSERERESRMTwSERERUWQMj0REREQUGcMjEREREUXG8EhEREREkTE8EhEREVFkDI9E\nREREFFlOhEdjzOnGmCXGmKXGmAuzvTxEREREFKxbthfAGFMI4FYAJwBoAFBjjHnQWrslu0tGRERE\nRH65UHk8CsB71tp11toGAI8C+HyWl4mIiIiIAuRCeBwO4GPn548BjMjSshARERFREhmFR2PM8caY\necaYj40xLcaYaQGPucQYU2uMaTTGvGaMOTKT1yQiIiKi7Mm08tgbwEIA3wJg/b80xkyH9Ge8FsAR\nAN4B8LgxZpDzsDUA9nN+HrH3PiIiIiLKMRmFR2vtfGvtNdbavwEwAQ+pAnCXtfZea+0SABcD2AFg\nhvOYNwAcZowZZozpA+AUAI9nslxERERE1D7arc+jMaYIQAWAp/U+a60F8BSAyc59ewBcDuA5ADUA\n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\nJCKitop6hZnOgvM8Upw4YIaIiLocnb+xq1QeieLE8EhERF1Owd6jX1epPBLFieGRiIi6HA2PWoEk\nougYHomIqMvR8GhtdpeDKB8xPBIRUZejFceWluwuB1E+YnikdnP00dleAiKiYFp53LMnu8tBlI/y\ndqoeym11dRzFSES5a9w4ud1vv+wuB1E+ytvwyEnCc1tJSbaXgIgo3BlnAEuXdp3LDnKScIqTsXnW\nW9gYUw5gwYIFCzhJOBERURqcScIrrLU12V4eyk/s80hEREREkTE8EhEREVFkedvnkYiIiNrsEGNM\ntpeBctNGa+3KZA9geCQiIuoi1q5di4KCArS0tNyf7WWh3FRQULDTGDMuWYBkeCQiIuoi6urq0NLS\ngvvuuw+HHnpotheHcszixYtx3nnn9QQwCADDIxEREYlDDz2UM5ZQm3HADBERERFFxvBIRERERJEx\nPBIRERFRZAyPRERERBQZwyMRERERRcbwSERERESR5W14rKqqwrRp01BdXZ3tRSEiIspp1dXVmDZt\nGm699dZsL0qHmDNnDk4//XR0794d06ZNS/jdRx99hKlTp6KgoAATJkzAnXfemaWlbJsdO3bguuuu\nw3e+8x1MmTIF559/PtavX5/0b2bOnIlXX301tmUw1trYnqwjGGPKASxYsGAB56giIiJKw/3334/z\nzjsPXeEY+uqrr+LBBx/E7bffjtraWuy3334Jvz/nnHPwpz/9KUtL13ZXXnklvvOd72DYsGEAgFNO\nOQWrVq3CwoULUVRU1Orxzz33HE466SQ899xzmDJlStLnrqmpQUVFBQBUWGtrwh6Xt5VHIiIiojCv\nvfYarrnmGgwZMgR33313wu82bNiAI488MktL1na7du3CHXfcgTlz5uy77/LLL8fixYsxb968wMc/\n88wziPs65gyPRERE1Ok0NDSgb9+++PrXv445c+bAbWl96aWXcOyxx2Zx6dpmz549GDRoELZv377v\nvgMOOAAAsGzZslaPv+OOO3DppZci7lZmhkciIiLqdLTaNmPGDKxZswZ///vf9/3urbfe0ubZvFJc\nXIza2lrcfPPN++5bvnw5AGD06NEJj33vvfcwZMgQlJWVxb4cvLY1ERERBdqxA1iypH1f45BDgOLi\neJ/zvffew/jx4wEAY8aMwWc/+1n89re/xRlnnAEAaGpqQmFhYcrnaW5uRrduuR2VqqurMW7cOHzx\n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\n", + "image/png": "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\n", "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "for (i,loss_arr) in enumerate(loss_arrays):\n", - " plt.semilogy(np.array(range(len(loss_arr)))*node_counts[i],loss_arr,label=r\"$N_{{GPU}} = {{{}}}$\".format(node_counts[i]))\n", - "plt.legend(loc=(1,0))" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -357,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 79, "metadata": { "collapsed": false }, @@ -365,18 +391,18 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 24, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAGPCAYAAABcTNrhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xt8zuX/wPHXdTNsaM5kYYsKk9N0kJIhJO4pqVaOUyjH\nVXw7OkWhcpbDt5w6TF9KbVRYJZH0bUvCVD8ZSZRDmkOMvX9/fGzfzQ7uzX3afb+fj8f9qPv6XPfn\n877vy71duz7v67qMiKCUUkop5Q9sng5AKaWUUspdtOOjlFJKKb+hHR+llFJK+Q3t+CillFLKb2jH\nRymllFJ+Qzs+SimllPIb2vFRSimllN/Qjo9SSiml/IZ2fJRSSinlN7Tjo5RSSim/oR0fpZRSSvkN\n7fgUgjEm2BjzX2NMsjFmmzHmYU/HpJRSSinHGd2k1HHGGAOUFpF/jDGBwA4gQkSOeTg0pZRSSjmg\npKcDKE7E6iX+c+Fp4IX/Gg+Fo5RSSqlC0ltdhXThdtdWYB/wsogc9XRMSimllHKM33R8jDG3GWPi\njTG/GWMyjDH2POoMNsbsMcacNsZ8bYy54eI6InJcRJoCYcBDxpiq7ohfKaWUUpfPbzo+QFlgK/AY\nkCuxyRhzP/AqMAZoBnwPrDHGVMnrZCLy54U6t7kqYKWUUko5l18mNxtjMoBuIhKfrexrYIuIDL/w\n3AC/AjNFZMqFsmrAKRE5YYwJBjYCD4jIjjyuURnoCKTyv7wgpZRSSl1aGSAUWCMiR5x5Yk1uBowx\nAUAE8GJmmYiIMSYRaJmtah1ggdUnwgAz8ur0XNAReNs1ESullFJ+4SHgHWeeUDs+lipACeDQReWH\ngOsyn4jIf7FugzkiFeCtt96iQYMGTgjx8sTGxjJt2jSvOF9hXutI3UvVKeh4fsfyKnf2Z3g5XBFL\nUc/p7Pa8VD1tT9ees7Cvc+V31FnlnqA/cy/vO5qSkkLPnj3hwu9SZ9KOj+v8A9CgQQOaN2/u6VgI\nDg52ahyXc77CvNaRupeqU9Dx/I7lVe7sz/ByuCKWop7T2e15qXranq49Z2Ff58rvqLPKPUF/5l7+\nd/QCp6eKaMfHchg4D1S/qLw6cPByThwbG0twcDDR0dFER0dfzqkui7OvfTnnK8xrHal7qToFHc/v\nWF7lBw9e1j8Fp3LFv6WintPZ7Xmpetqerj1nYV/nyu9oYct9uU395WduXFwccXFxHD9+/JJxFJUm\nN/+vLK/k5n1Yyc0vF+EazYGkpKQkr/kLRF2ekJAQfvvtN0+HoZxE29P3aJv6juTkZCIiIsDaHSHZ\nmef2mxEfY0xZoB7/W2n5amNME+CoiPwKTAUWG2OSgG+AWCAIWOyBcJUXuvAlVD5C29P3aJsqR/hN\nxwdoAXyOtYaPYK3ZA7AEiBGR/1xYs2c81i2urUDHC+v1KOXRW5XK+bQ9fY+2qXKEX97qcofMW12t\nW7f2ihwfpZTv2bdvH4cPH/Z0GEoVSZUqVahdu3aOsuw5Phs2bAAX3OrSjo+LaI6PUsqV9u3bR4MG\nDTh16pSnQ1GqSIKCgkhJScnV+QHN8VHKK/Tr149FixZ5OgzlJMW9PQ8fPsypU6e8Zq0wpQojc52e\nw4cP59nxcSXt+CjloA4dOng6BOVEvtKe3rJWmFLFhT9tUqrUZdEcLd+i7amUf9IRHxfzlgUMlVJK\nKW/njgUMtePjYtOmTdNhaKWUUsoBmYME2ZKbnU5vdSnloI0bN3o6BOVE2p5K+Sft+CjloClTpng6\nBOVE2p5K+Sft+CjloGXLlnk6BOVE2p7F19ixY7HZ9NeXKhrN8XExTW72HUFBQZ4OQTmRtmfxZYzB\n2ke6cObOnUtQUBB9+vRxQVTKGTS52QdocrNSyluISJE6DJ4+t7O89tprVK1aVTs+XkyTm5VSSl2W\ntLQ0xgwbRvuwMLrVqkX7sDDGDBtGWlqaV59bKVfRjo9SDho5cqSnQ1BO5A/tmZaWRveWLWk5Zw7r\nUlP58LffWJeaSss5c+jesuVldVBcee7sNm7cyA033EBgYCDXXHMNCxYsyFVn0aJFtGvXjurVq1Om\nTBnCw8OZN29ejjphYWHs2LGD9evXY7PZsNlstG3bFoBjx47x5JNP0rhxY8qXL09wcDCdO3dm27Zt\nTnkPyrvorS6lHOTu/WSUa/lDe77y7LM8npJCp4yMrDIDdMrIQFJSePW55xg7Y4bXnTvT9u3b6dix\nI9WqVWP8+PGkp6czduxYqlWrlqPevHnzaNSoEVFRUZQsWZKEhAQee+wxRIRHH30UgBkzZjBkyBDK\nly/Pc889h4hQvXp1AH755Rfi4+Pp0aMHYWFhHDp0iPnz59OmTRt27txJjRo1Lut9KC8jIvpwwQNo\nDkhSUpIopZSzJSUlyaV+xrQLDZUMEMnjkQHSPjS0yNd35bkzdevWTYKCgmT//v1ZZbt27ZKSJUuK\nzWbLKvvnn39yvbZTp05Sr169HGWNGjWSyMjIXHXPnj2bq2zv3r1SpkwZmTBhwuW8BZWPS/37zTwO\nNBcn/37WW10uFhsbi91uJy4uztOhKKX8iIhQNj2d/NKNDRCUnp75h5rXnDtTRkYGa9eu5e677yYk\nJCSr/LrrrqNjx4456pYuXTrr///++2+OHDlC69at+eWXXxy65RYQEJDjukePHiUoKIjrrruO5OTk\nIr8HVXhxcXHY7XZiY2Nddg291eVi3jCr6+BBqFYNdNkLpfyHMYaTAQEI5NlBEeBkQECRZmK58tyZ\n/vzzT06fPk29evVyHbvuuuv4+OOPs55v2rSJMWPG8PXXX3Pq1KkccR4/fpzy5csXeC0RYfr06cyd\nO5c9e/Zw/vz5rNdXqVKlyO9BFZ7O6lKXLSMD7rwTbr0Vvv/e09EUb7t27fJ0CMqJ/KE9W3Xtypp8\n/uL5xGbjVrvdK89dGLt376Z9+/YcPXqUadOm8dFHH5GYmJg1YpCRLQcpPxMnTuSJJ56gTZs2vP32\n26xdu5bExEQaNmzo0OtV8aIjPj7OZoPp02HQoHNERJRk+HAYNw7KlfN0ZMXPqFGjiI+P93QYykn8\noT2fnDiR7p99hlxIQjZYozGf2GxMa9CA9yZM8MpzA1StWpXAwEB+/vnnXMeyd1oTEhI4e/YsCQkJ\nOW6Jffrpp7lel98I1HvvvUfbtm1zzRj766+/qFq1alHfgvJSOuLjB6pW3cnp09fw0EMJzJ0LDRrA\nypVWFqJy3OzZsz0dgnIif2jP8uXL897mzWwZMoQOoaFEhYTQITSULUOG8N7mzZe8BeSpcwPYbDY6\nduzIBx98wP79+7PKU1JSWLt2bdbzkiWtv9+zj8wcP36cxYsX5zpn2bJl+euvv3KVlyhRIlc+0vLl\ny/ntt98u6z0o76QjPn6gQoUKNGoUztKldrp168nJkzO4555KdOkCs2ZBaKinIywe/GH6sz/xl/Ys\nX768Na18xgynr67synMDjBs3jk8++YRbb72Vxx57jPT0dGbPnk2jRo2y1tjp0KEDAQEBdOnShYED\nB5KWlsbrr79O9erVOXjwYI7zRUREMG/ePCZOnEi9evWoVq0akZGRdOnShRdeeIGYmBhuueUWfvjh\nB95++23q1q3r1PejvISzp4npwzuns2dkZMiSJUukQoUKUqNGDXnqqXgJCREJDBSZNEnkzBlPR6iU\nKgxHprP7gi+//FJuuOEGKVOmjNSrV08WLFggY8eOzTGdfdWqVdK0aVMJCgqSq6++Wl555RVZtGiR\n2Gw22bt3b1a9Q4cOSdeuXSU4OFhsNlvW1PYzZ87IyJEjJSQkRMqWLSutW7eWLVu2SGRkpLRt29bt\n79kfeHI6uxG93+ESxpjmQFJSUpLHZ3Vld+DAAQYOHMiqVau4//6eVKo0gwULKlG/PsybZyVBK6W8\nX+asF2/7GaOUIy717zfbrK4IEXHqmgKa4+Ni3raOT82aNYmPj2fJkiWsWbOK+PjGfPFFGuXKwW23\nQf/+cPiwp6P0TpMnT/Z0CMqJtD2V8j66jo8P8IZ1fC5mjKF37960a9eOdevW0apVeTZtgn//G556\nCj78EF5+Gfr2BS/fbNmtsq8Pooo/bU+lvI+u46NcKiQkhL59+wJQogQMGgQ//gidOkFMDLRpAzt3\nejRErzJu3DhPh6CcSNtTKf+kHR+VQ/Xq8NZbkJgIv/8OTZrAM8+A/nGslFLKF2jHR+WpXTvYtg2e\nfx6mToXwcPjoI09HpZRSSl0e7fiofP3668+kpsawceNRrrkG7roL7r0Xsq0l5lcOa9a3T9H2VMo/\nacdH5Wv37t2sXLmSrl3DGTw4nrg42LTJWvl5+nQ4d87TEbpXTEyMp0NQTqTtqZR/0o6PylenTp3Y\nvn07ERERdOsWxerVvfjqq6P07g2PPw433gjffOPpKN1n7Nixng5BOZG2p1L+STs+qkAhISEkJCSw\nePFiEhISuOWWcDp2jOfrr629vm6+GQYPhjy2v/E53rYsgbo82p5K+Sft+LiYty1gWBTGGPr06cOO\nHTuIiIggKiqK2bN7s2VLBlOnwtKl1u2vZct041OllFJF544FDLXj42LTpk0jPj6e6OhoT4dy2bKP\n/oSEhFCqlI0RIyAlBVq1guho6NgR/u//PB2pUkqp4ig6Opr4+HimTZvmsmtox0cVSuboz0svvZRV\ndtVVsGIFrFoFP/8MjRrB+PFw5owHA3WBN954w9MhKCfS9lTZLV68GJvNxr59+7LK2rRpQ2RkpAej\n8py+ffsSFhZWpNe2adOGtm3bOjki59GOj3Kau+6CHTsgNhZeeAEaN4bPP/d0VM6TnOzUffKUh2l7\nquyMMZiL9ugxxmCz+eevybw+j8K81pv5Z4sqlwkKgpdegq1boVo1aNsWeveGP/7wdGSXb86cOZ4O\nQTmRtqe6lHXr1rFmzRpPh6GcTDs+yulSU1PZvTueL76AhQth9WqoX9/aBDUjw9PRKaWUY0qWLEnJ\nkrqXt6/Rjo9yusWLFxMVFUWfPr2IijrKjz9CVBQMGAC33grff69Tv5RSBTtx4gQjRowgLCyMMmXK\nUL16dTp06MDWrVtz1NuyZQudO3emUqVKlCtXjiZNmjBz5sys4z/88AP9+vWjbt26BAYGcuWVV9K/\nf3+OHj16yRguzlX54osvsNlsLF++nIkTJ1KrVi0CAwNp3749u3fvzvX6OXPmULduXYKCgrj55pvZ\nuHGjw/kvNpuNYcOGsWLFCsLDwwkKCuKWW25h+/btAMyfP59rrrmGwMBAIiMjc+QmZVq+fDktWrQg\nKCiIqlWr0qtXLw4cOJCr3gcffECjRo0IDAykcePGfPDBB3nGJCJMnz49q26NGjUYNGgQfxWz9Uy0\nK6ucbsyYMYSFhTF8+HASExOZP38+M2dGkvH3IlYkdKZZ01BqXbGQBx/8iWemjKF8+fKeDlkp5WUG\nDhzI+++/z9ChQ2nQoAFHjhxh48aNpKSk0LRpU8C6FdW1a1dq1qzJiBEjqFGjBikpKaxevZphw4Zl\n1dmzZw8xMTHUqFGDHTt2MH/+fHbu3MnmzZsLjCG/XJVJkyZRokQJRo4cyfHjx5k8eTI9e/bMcb65\nc+cydOhQbr/9dh5//HFSU1Pp1q0bFStWpFatWg59Bhs2bCA+Pp7BgwcD8OKLL9KlSxdGjRrF3Llz\nGTx4MMeOHWPy5MnExMSQmJiY9drFixcTExPDTTfdxKRJkzh06BDTp0/nq6++4rvvvuOKK64AYO3a\ntdx77700atSISZMmceTIEfr168dVV12VK54BAwawdOlSYmJiGD58OHv27GHWrFls3bqVTZs2UaJE\nCYfel8eJiD5c8ACaA5KUlCT+av/+/XLXXXcJIFcGB8t/jJF/CJAJPCNlOCXVSJWmtR+Tv//+29Oh\nOqRr166eDkE5UXFvz6SkJCnMz5iTJ0WSklz7OHnSee+vQoUKMnTo0HyPnz9/XsLCwuTqq68u8GfI\nP//8k6ts2bJlYrPZZOPGjVllixcvFpvNJnv37s0qa9OmjURGRmY9X79+vRhjJDw8XM6dO5dVPnPm\nTLHZbLJjxw4RETl79qxUqVJFbr75Zjl//nxWvaVLl4oxJsc582OMkcDAQNm3b19W2YIFC8QYIzVr\n1pST2T7sZ555Jkfs6enpUr16dWnSpImcOXMmq97q1avFGCNjx47NKmvatKmEhIRIWlpaVlliYqIY\nYyQsLCyr7MsvvxRjjCxbtixHnGvXrhVjjMTFxeX7ueXlUv9+M48DzcXJv591xEe5TOa6P3d36MCn\niYkMA0qTzrO8yAMsYzBzWLNvDjc2+561nzfBwT+CPGbIkCGeDkE5kb+1565dEBHh2mskJYGzFsSu\nUKECW7Zs4ffff+fKK6/Mdfy7774jNTWVGTNmFDhqXLp06az/P3PmDCdOnOCmm25CREhOTqZVq1aF\nji0mJibH6MZtt92GiPDLL7/QsGFDvv32W44cOcLkyZNzzAp78MEHGTFihMPXad++fY7RoZtuugmA\ne++9l6CgoFzlv/zyC7Vr1+bbb7/ljz/+YPz48ZQqVSqrXufOnalfvz6rV69mzJgxHDx4kO+//55n\nnnmGcuXKZdVr164dDRs25NSpU1llK1asoEKFCrRr144jR45klTdr1oxy5crx+eef88ADDzj83jxJ\nOz7KpYwxnPi//2MXMBD4ELADdfmFj7mT/9CD3qmzaNjQWvtn6FDw1lzCDh06eDoE5UT+1p7161sd\nE1dfw1mmTJlC3759qVWrFhEREXTu3JnevXtnrS2ze/dujDGEh4cXeJ5jx44xduxY3n33Xf7INr3U\nGMPx48eLFNvFt6oqVqyYdS2AvXv3Yoyhbt26OeqVKFGC0NDQIl8nODgYINdtqODgYEQk1/Wvvfba\nXOesX78+mzZtyqoHUK9evVz1rrvuOr777rus5z///DN//fUX1apVy1XXGJPjs/V2XvorRvkKEaFs\nejohQAJwNtsxA9zPcpZU+4Gr79nJE08Yli6F+fOtDVCVUs4TFOS80Rh36NGjB61bt2blypWsXbuW\nV155hcmTJ7Ny5Uo6duxYqPN8/fXXjBo1iiZNmlCuXDkyMjLo2LEjGUWcZppfLos4ec+e/K7jrutn\nl5GRQfXq1XnnnXfyvE7VqlVddm1n01ldyqWMMZwMCECwOjqlLzouwNnS/zB7tmHLFjDmfxufFvGP\nMaWUj6hevTqDBg3i/fffZ8+ePVSuXJmJEycCULduXUQka5ZTXv766y8+++wznn76aUaPHk1UVBTt\n2rUr8orEjqpTpw4iwv9dtH/P+fPnSU1Ndem1s1//xx9/zHXsxx9/pE6dOln1wBrNyatednXr1uXI\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -396,7 +422,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 80, "metadata": { "collapsed": false }, @@ -404,18 +430,18 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 26, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\nyJTPhqtbt25s27aNn//85yXbnn32Wa6//voQo4Kjjz6abdu2MWTIkFDjCMp9993HypUrww4j7XYJ\nOwCRhmDGjBlhhyABUj4bnp07d1JYWEjz5s3Zddddy+1z95CiKq9iXI1Zs2bNaNasWdhhpJ16akRE\nImzmzJkccMABtGzZki5dujBu3Di+/vrrSu1mzJhBr169yMzM5IgjjmDJkiUcc8wxHHfccSVtduzY\nwR/+8AcOPfRQ2rdvT5s2bRgyZAgvv/xyuXOVHQtz55130rt3b1q2bMmKFSsqjanJyclh5syZAGRk\nZJCRkVHlH+M///nPJec5/PDDefPNN8vtP//882nbti2ffvopI0eOpG3btuyzzz4l53733Xc5/vjj\nadOmDd27d2f+/Pnljq9uTM3y5csZMWIEe+yxB23atOHggw/mrrvuqvFn/sMPP3DdddfRt29fWrVq\nRVZWFoMHD+bFF18s1+7DDz/kjDPOoGPHjmRmZtK/f3+uvfbakv3r16/n0ksvpX///mRmZpKVlcUZ\nZ5zBunXrarx+8c+j7Jiasjmp7WcJ8Nhjj7H//vvTqlUrDjroIBYsWNAoxumop0ZEJKImT57M9ddf\nz9ChQ7n00kv58MMPmTlzJm+++SavvfZaSfFwzz33cNlll3H00Udz5ZVXsnbtWkaNGsXuu+/Ovvvu\nW3K+LVu2cP/993PWWWdx4YUXsnXrVmbPns3w4cN5/fXXOeigg8pd//777+f777/noosuokWLFuyx\nxx7s3LmzXJuLL76Yf//73yxevJh58+ZV2Wszb948vvnmGy6++GLMjKlTp3LqqaeyZs2akvdgZhQW\nFnLSSSdx9NFHc8sttzBv3jwuu+wyWrduzTXXXMO5557Lqaeeyr333st5553HkUceSbdu3UquU3Fc\nygsvvMApp5zC3nvvza9//Ws6d+7MihUreOaZZ7j88sur/blPmjSJm2++mQsvvJDDDjuMLVu28Oab\nb5KXl8fxxx8PwDvvvMPgwYNp0aIFF110Ed26dWP16tU8/fTT3HDDDQC88cYbLFu2jLPOOot99tmH\ntWvXMnPmTI499lg++OADWrZsWW0M1Y2xSuRn+cwzz3DmmWdy8MEHc/PNN/PVV19xwQUX0KVLl4Y/\n7sjd9UryBQwEPDc310Wk8cjNzfWofnbnzJnjGRkZvm7dOnd3/+KLL7xFixZ+0kknlWs3Y8YMz8jI\n8Dlz5ri7+/bt2z0rK8uPOOII37lzZ0m7Bx980M3Mjz322JJthYWFvmPHjnLn+/rrr71z587+y1/+\nsmTb2rVr3cy8ffv2/uWXX5ZrX7xv7ty5JdvGjRvnGRkZld5TcdsOHTr4119/XbJ94cKFnpGR4c88\n80zJtvPPP98zMjJ86tSpJds2b97smZmZ3qxZM3/sscdKtn/44YduZn7dddeVbHv55Zc9IyPDX3nl\nFXd337lzp/fo0cN79uzpW7ZsqRRbTQ455BA/5ZRTamwzZMgQb9eunX/22WfVtvnuu+8qbVu+fLmb\nmT/00EPVxu4e/3n06NGj5PtkfpYHHnigd+3a1QsKCkq2vfrqq25m5c5Zndo+Z8X7gYEe8N9n9dSI\nALFYjIULF4YdhgQkqHwWFECqx1r27w+ZmcGfd/HixezYsYNf//rX5bb/6le/4uqrr+aZZ57hvPPO\n44033uDLL79k6tSp5WbLnH322ZWONTN22SX+Z8Pd2bx5Mzt37uTQQw+tcnD2aaedxh577FHv93Lm\nmWey2267lXw/ePBg3J01a9ZUanvBBReUfN2uXTv69evH6tWrOe2000q29+3bl/bt21d5fLG33nqL\ntWvXcuedd9K2bduk4m3fvj3vv/8+H3/8Mb179660Pz8/n3/+85+MHz+eLl26VHueFi1alHz9ww8/\nsGXLFnr27En79u3Jy8vjnHPOSSouqP1n+Z///If33nuPa6+9llatWpVrd+CBB7J169akr5lOKmpE\ngHHjxoUdggQoqHyuXAnZ2YGcqlq5uZCKBZCLx1307du33PbmzZvTs2fPkv3r16/HzOjVq1e5ds2a\nNaN79+6Vzjt37lxuv/12Vq5cyY4dO0q29+zZs1Lbqo6vi7K3wCBeNAB89dVX5ba3bNmSPffcs9y2\ndu3asc8++1Q6Z7t27SodX9bq1asxM/bff/+k473++usZNWoUffv25YADDmD48OH8/Oc/58ADDwQo\nKSBqO/d3333HjTfeyJw5c9iwYUPJrTkzq3JcVCJq+1kW/7uo+O8BoHfv3rz11lt1um66qKgRAYYO\nHRp2CBKgoPLZv3+86Eil/v1Te/4gPfTQQ+Tk5PCzn/2MiRMn0rFjR5o1a8aNN95YZa9H2f/Tr4/q\nZvEU/5GvrV2ixwdl8ODBrF69mr///e8sWrSI2bNnc8cddzBr1qykHrY6btw45s6dy/jx4zniiCNo\n164dZsbo0aMpLCysU2zp/lmkm4oaEZFqZGamphclHYoHwH744Yflekx27NjBJ598woknnljSzt35\n+OOPOfroo0va7dy5k7Vr13LwwQeXbHviiSfo1asXjz/+eLlr/eEPf6hXrA1x8GmvXr1wd957771y\nM8AS1b59e8477zzOO+88CgoKGDx4MJMnT2bMmDElvVrvvfdejed44oknOP/885k2bVrJtu+//57N\nmzcnHU+iiv/dfPzxx5X2VbWtodGUbhGRCDrhhBNo3rx5penH9913H1u2bGHkyJEAHHrooey55578\n+c9/Lvd//w899FCl2zNV/V/+8uXLWbp0ab1ibd26NRCfXdVQDBw4kB49evDHP/4x6Vs9mzZtKvd9\nZmYmvXv35vvvvwcgKyuLIUOGcP/99/Ppp59We55mzZpV6pG56667Ks0gC9Jee+3FAQccwIMPPkhB\nQUHJ9ldeeYV33303ZdcNinpqRIAFCxYwatSosMOQgCif8T+cv//977n++usZPnw4sViMlStXcs89\n93D44YeXDDJt3rw5kydP5vLLL+fYY4/ljDPOYO3atTzwwAP07t27XC/KyJEjefLJJxk1ahQnn3wy\na9asYdasWey///588803dY41Ozsbd+eyyy5j2LBhNGvWjNGjR9f7Z5CssrdgzIx77rmHWCzGIYcc\nQk5ODnvttRcrV67kgw8+4Lnnnqv2PPvttx/HHHMM2dnZ7LHHHrzxxhs8/vjj5aaB33XXXQwePJiB\nAwdy4YUX0qNHDz755BOeffbZknErI0eO5C9/+Qu77bYb++23H0uXLuXFF18kKyurxtjr68Ybb2TU\nqFEceeSR5OTksGnTJmbMmMGBBx5Yrzyng3pqRKDSQlzSuCmfcZMmTWL69Ol8+umnXHnllTz++ONc\nfPHFPP/88+V6XcaOHctdd93Fp59+yoQJE3j11VdZuHAh7dq1K7cWyvnnn89NN93EO++8wxVXXMEL\nL7zAvHnzyM7OrvLZQ9XdVqq4/Wc/+xmXX345zz//PL/4xS84++yzaz1PVdsTvV6ixw8dOpSXXnqJ\nfv36cfvtt/Ob3/yGf/zjH8RisSqvU+yKK65g3bp13HzzzVxxxRX885//5MYbb+TWW28taXPQQQex\nbNkyjj76aO69916uuOIK/va3v5Urxu+66y5+8Ytf8Ne//pXf/va3bNy4kcWLF9OmTZuE3nuiOam4\n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\nC8QpqtORAAAAAElFTkSuQmCC\n", + "image/png": "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\nRkQkl5nxU8WK7K+scOCnihWLteZLLK9dFGvWrKFjx458++23PPzww8yfP59FixYxYMAAIHjycjAj\nRozgtttuo3379syYMYOFCxeyaNEiTjjhhIjOF4kVDRQWAVatWsXxxx8fdhgSJSXJ528uuIAFEybQ\npZBfzv9OSuKs1NRixxXLa9epU4cqVarw2WefFXht1apVef8/b948du7cybx58/J1U7366qsFzttf\ngTV79mzOOeecAjOrvv/+e+rUqVPctyBSYnpSIwIMHjw47BAkikqSz9tHjGBM8+a8nJSU91TFgZeT\nkni4eXNuGz68VF47KSmJzp07M2fOHL788su89oyMDBYuXJj3/SGHBP+W3fuJyg8//MCTTz5Z4JpV\nq1bl+++/L9BeoUKFAt1kzz33HF999VWx4xeJBhU1IsD48ePDDkGiqCT5rF69OrOXLmV5nz50atSI\nC+vXp1OjRizv06fEU65jeW2Ae+65B3fnrLPOYvTo0YwYMYJzzjmHk046Ke+YTp06UbFiRbp168bE\niRMZNWoUp556at507b21bt2aDz/8kBEjRvDss8/y+uuvA9CtWzcWL15Mr169mDJlCv379+ePf/wj\nxx13XIniFymxaE+nKg9faEq3SJkUyZTufeXk5MQsnlhc+6233vLTTjvNK1eu7E2aNPHHHnvMhw0b\nlm9K94svvuinnHKKJycne+PGjf3BBx/0J554wpOSknz9+vV5x23atMkvuOACr1GjhiclJeVN796x\nY4cPGjTI69ev71WrVvV27dr58uXLvUOHDn7OOedE/T1J2RLmlG7zYo60L8/MrBWQlpaWRqtWrcIO\nR0QilJ6eTuvWrdFnVyR2DvY52/M60Nrdo7oGgLqfREREJCGoqBEBRo0aFXYIEkXKp0j5pKJGBMjK\nygo7BIki5VOkfFJRI0Iwa0QSh/IpUj6pqBEREZGEoKJGREREEoKKGhEgMzMz7BAkipRPkfJJRY0I\n0KtXr7BDkChSPkXKJxU1IsCwYcPCDkGiSPkUKZ9U1IiAVpdNMMqnSPmkokZEREQSgooaEZEE8OST\nT5KUlMSGDRvCDuWA1q9fT1JSEk899VTEx44ZMybmcb3xxhskJSXx5ptvxvxe0VZY7Ndddx0pKSkh\nRhUOFTUiwNSpU8MOQaKoPObTzDCzsMOIyL5xvvzyy6ViwcSy8vMrzL6xmxlJSeXvV3z5e8cihUhP\nj+pGsRIy5bP0atiwIT///DNXX311Xtv8+fO59957Q4wKzj77bH7++WfatWsXahzRMmXKFFatWhV2\nGHF3SNgBiJQGEyZMCDsEiSLls/TZvXs3OTk5VKxYkUMPPTTfa+4eUlT57RtXWVahQgUqVKgQdhhx\npyc1IiIJbOLEiZx00klUrlyZ+vXr06dPH3744YcCx02YMIHjjjuO5ORkzjjjDJYsWUL79u0555xz\n8o7Jzs7mL3/5C6eeeio1a9akWrVqtGvXjsWLF+e71t5jYcaOHUuTJk2oXLkyGRkZBcbU9OzZk4kT\nJwKQlJREUlJSob+MH3/88bzrnH766axYsSLf69dddx3Vq1dn48aNdOvWjerVq3PMMcfkXXvlypWc\ne+65VKtWjUaNGjFz5sx85+9vTM3y5cvp2rUrtWrVolq1apx88smMGzfugD/zXbt2cc8999C0aVOq\nVKlC7dq1adu2La+++mq+41avXs2ll17KkUceSXJyMscffzxDhgzJe33Dhg3ccsstHH/88SQnJ1O7\ndm0uvfRS1q9ff8D77/l57D2mZu+cHOxnCfDcc89x4oknUqVKFVq2bMmcOXPKxDgdPakREUlQw4YN\n495776VTp07ccsstrF69mokTJ7JixQrefvvtvOJh0qRJ9O3bl7PPPpuBAweybt06unfvzuGHH86x\nxx6bd72tW7cybdo0Lr/8cm688Ua2bdvG1KlT6dKlC++++y4tW7bMd/9p06axY8cObrrpJipVqkSt\nWrXYvXt3vmNuvvlm/vvf/7Jo0SJmzJhR6FObGTNm8OOPP3LzzTdjZowaNYqLL76YtWvX5r0HMyMn\nJ4fzzjuPs88+mwceeIAZM2bQt29fqlatyt13381VV13FxRdfzKOPPsq1117LmWeeScOGDfPus++4\nlFdeeYULLriAo48+mltvvZV69eqRkZHBSy+9RL9+/fb7cx86dCgjR47kxhtv5LTTTmPr1q2sWLGC\n9PR0zj33XAA+/PBD2rZtS6VKlbjpppto2LAha9as4cUXX2T48OEAvPfeeyxbtozLL7+cY445hnXr\n1jFx4kQ6dOjAJ598QuXKlfcbw/7GWEXys3zppZe47LLLOPnkkxk5ciTfffcd119/PfXr1y/9447c\nXV9F/AJaAZ6WluYiUnakpaV5on52n3zySU9KSvL169e7u/vmzZu9UqVKft555+U7bsKECZ6UlORP\nPvmku7vv3LnTa9eu7WeccYbv3r0777innnrKzcw7dOiQ15aTk+PZ2dn5rvfDDz94vXr1/A9/+ENe\n27p169zMvGbNmr5ly5Z8x+95bfr06Xltffr08aSkpALvac+xderU8R9++CGvfe7cuZ6UlOQvvfRS\nXtt1113nSUlJPmrUqLy277//3pOTk71ChQr+3HPP5bWvXr3azczvueeevLbFixd7UlKSv/HGG+7u\nvnv3bk9JSfHGjRv71q1bC8R2IKeccopfcMEFBzymXbt2XqNGDf/yyy/3e8z27dsLtC1fvtzNzJ9+\n+un9xu4e/DxSUlLyvi/Kz7JFixbeoEEDz8rKymt788033czyXXN/DvY52/M60Mqj/PtZT2pEgNTU\nVObOnRt2GBIl0cpnVhbEeqzl8cdDcnL0r7to0SKys7O59dZb87XfcMMN3HXXXbz00ktce+21vPfe\ne2zZsoVRo0blmy1zxRVXFDjXzDjkkODXhrvz/fffs3v3bk499dRCB2dfcskl1KpVq8Tv5bLLLuOw\nww7L+75t27a4O2vXri1w7PXXX5/3/zVq1KBZs2asWbOGSy65JK+9adOm1KxZs9Dz93j//fdZt24d\nY8eOpXr16kWKt2bNmnz88cd8/vnnNGnSpMDrmZmZvPXWWwwYMID69evv9zqVKlXK+/9du3axdetW\nGjduTM2aNUlPT+fKK68sUlxw8J/l119/zUcffcSQIUOoUqVKvuNatGjBtm3binzPeFJRIwL06dMn\n7BAkiqKVz1WroHXrqFxqv9LSIBYLIO8Zd9G0adN87RUrVqRx48Z5r2/YsAEz47jjjst3XIUKFWjU\nqFGB606fPp0xY8awatUqsrOz89obN25c4NjCzi+OvbvAICgaAL777rt87ZUrV+aII47I11ajRg2O\nOeaYAtesUaNGgfP3tmbNGsyME088scjx3nvvvXTv3p2mTZty0kkn0aVLF66++mpatGgBkFdAHOza\n27dv57777uPJJ5/kq6++yuuaM7NCx0VF4mA/yz1/Lvb98wDQpEkT3n///WLdN15U1IgAnTp1CjsE\niaJo5fP444OiI5aOPz6214+mp59+mp49e/K73/2OwYMHc+SRR1KhQgXuu+++Qp967P0v/ZLY3yye\nPb/kD3ZcpOdHS9u2bVmzZg3/+te/WLhwIVOnTuXhhx9m8uTJRdpstU+fPkyfPp0BAwZwxhlnUKNG\nDcyMHj16kJOTU6zY4v2ziDcVNSIi+5GcHJunKPGwZwDs6tWr8z0xyc7O5osvvuC3v/1t3nHuzuef\nf87ZZ5+dd9zu3btZt24dJ598cl7b7NmzOe6443j++efz3esvf/lLiWItjYNPjzvuONydjz76KN8M\nsEjVrFmTa6+9lmuvvZasrCzatm3LsGHD6NWrV95TrY8++uiA15g9ezbXXXcdo0ePzmvbsWMH33//\nfZHjidSePzeff/55gdcKayttNKVbRCQBdezYkYoVKxaYfjxlyhS2bt1Kt27dADj11FM54ogjePzx\nx/P96//pp58u0D1T2L/yly9fztKlS0sUa9WqVYFgdlVp0apVK1JSUvjb3/5W5K6eb7/9Nt/3ycnJ\nNGnShB07dgBQu3Zt2rVrx7Rp09i4ceN+r1OhQoUCT2TGjRtXYAZZNB111FGcdNJJPPXUU2RlZeW1\nv/HGG6xcuTJm940WPakRAebMmUP37t3DDkOiRPkMfnHeeeed3HvvvXTp0oXU1FRWrVrFpEmTOP30\n0/MGmVasWJFhw4bRr18/OnTowKWXXsq6det44oknaNKkSb6nKN26deOFF16ge/funH/++axdu5bJ\nkydz4okn8uOPPxY71tatW+Pu9O3bl86dO1OhQgV69OhR4p9BUe3dBWNmTJo0idTUVE455RR69uzJ\nUUcdxapVq/jkk094+eWX93udE044gfbt29O6dWtq1arFe++9x/PPP59vGvi4ceNo27YtrVq14sYb\nbyQlJYUvvviC+fPn541b6datG3//+9857LDDOOGEE1i6dCmvvvoqtWvXPmDsJXXffffRvXt3zjzz\nTHr27Mm3337LhAkTaNGiRYnyHA96UiMCBRbikrJN+QwMHTqU8ePHs3HjRgYOHMjzzz/PzTffzIIF\nC/I9denduzfjxo1j48aNDBo0iDfffJO5c+dSo0aNfGuhXHfdddx///18+OGH9O/fn1deeYUZM2bQ\nunXrQvce2l+30r7tv/vd7+jXrx8LFizgmmuu4YorrjjodQprj/R+kZ7fqVMnXn/9dZo1a8aYMWO4\n7bbbeO2110hNTS30Pnv079+f9evXM3LkSPr3789bb73Ffffdx4MPPph3TMuWLVm2bBlnn302jz76\nKP379+ef//xnvmJ83LhxXHPNNTzzzDPcfvvtbNq0iUWLFlGtWrWI3nukOdm3vVu3bsycOZPs7Gzu\nuOMOXnjhBaZNm0bTpk0PuDZOaWCJMjgonsysFZCWlpZGq7La4S5SDqWnp9O6dWv02T04d6dOnTpc\nfPHFTJ48OexwpBT49a9/zZFHHsmCBQsOeNzBPmd7Xgdau3tUN2pLyCc1ZtbbzL4ws5/NbJmZnXaQ\n4680sw/M7Ccz+6+ZTTWzki+uICJSBuwZ67G36dOn8+2339KhQ4cQIpIw7dq1q8C4ncWLF/Of//yn\n1P95SLgxNWbWA3gIuBF4FxgALDCzpu6eWcjxvwGmA/2BF4H6wGTgMeCSfY8XEUk0y5YtY8CAAfz+\n97/niCOOIC0tjWnTptGyZct8i9ZJ+fDVV1/RsWNHrrrqKo4++mgyMjKYPHkyRx99NDfddFPY4R1Q\nwhU1BEXMZHd/CsDMbgbOB3oBows5/gzgC3ffs63vejObDAyOR7AiImFr1KgRDRo04JFHHuHbb7+l\nVq1aeeNn9qwgLOXH4YcfzqmnnsrUqVPZvHkzVatW5YILLuD+++/n8MMPDzu8A0qoP61mVhFoDdy3\np83d3cwWAW32c9pSYISZnefuL5tZXeD3wEsxD1hKjZ49e/LEE0+EHYZEifJZNA0bNmTOnDlhhyGl\nxGGHHVZmB9sn2pia2kAFYNM+7ZuAeoWd4O7vAFcBz5rZTuBr4DtA6+aXI1pROLEonyLlU6IVNUVm\nZicAY4FhBLtvdwZSCMbVSDlx+eWXhx2CRJHyKVI+JVpRkwnsBuru014X+N9+zrkDeNvdx7j7R+7+\nCnAL0Cu3K2q/unbtSmpqar6vNm3aFHiMu3DhwkLXNejduzdTp07N15aenk5qaiqZmfnHNA8dOpRR\no0bla9uwYUPeglp7e+SRRxg0aFC+tqysLFJTU1myZEm+9pkzZ9KzZ88CsfXo0UPvQ+8jId+HiMTP\nzJkz83431qtXj9TUVAYMGBCz+yXcOjVmtgxY7u79c783YAMwzt0fKOT454Gd7n7FXm1tgCVAfXcv\nUAxpnRqRsknr1IjEntapia4xwA1mdo2ZHQ88CiQDTwKY2f1mNn2v4+cBF5vZzWaWkjvFeyxBYbS/\npzuSYPZ90iBlm/IpUj4l1OwnAHf/h5nVBu4l6Hb6AOjs7ptzD6kHHLvX8dPNrBrQG3gQ+B54laBb\nSsqJ0aNHc9ZZZ4UdhkTJwfKZkZERx2hEypcwP18J1/0UD+p+SjxZWVkkJyeHHYZEyf7yuWHDBpo3\nb55v92ERib7k5GQyMjJo0KBBgddi2f2UcE9qRIpDBU1i2V8+GzRoQEZGRoGBxiISXbVr1y60oIk1\nFTUiUq40aNAglL9sRST2EnGgsIiIiJRDKmpEoMD6K1K2KZ+JRzmVSKioEQF1RyQY5TPxKKcSCc1+\nKgbNfhIRESkeLb4nIiIichAqakRERCQhqKgRAW16mGCUz8SjnEokVNSIAIMHDw47BIki5TPxKKcS\nCRU1IsD48ePDDkGiSPlMPMqpREJFjQiaLppolM/Eo5xKJFTUiIiISEJQUSMiIiIJQUWNCDBq1Kiw\nQ5AoUj4Tj3IqkVBRIwJkZWWFHYJEkfKZeJRTiYS2SSgGbZMgIiJSPNomQUREROQgVNSIiIhIQlBR\nIwJkZmaGHYJEkfKZeJRTiYSKGhGgV69eYYcgUaR8Jh7lVCKhokYEGDZsWNghSBQpn4lHOZVIqKgR\nAc1iSzDKZ+JRTiUSKmpEREQkIYRW1JhZIzO7zsyqhhWDiIiIJI64FTVmVsXMau/53t3XAe8CQ8ys\nTbziECnM1KlTww5Bokj5TDzKqUQiLkWNmf0B+A7YZGb/M7PpZtYN+NTd7wSujEccIvuTnh7VRS0l\nZMpn4lFOJRJx2SbBzF4DJgE7gVbAeUBrgkLndaCOu7ePeSBRom0SREREiieW2yQcEs2LHcAKd38u\n9///BQw1s2OBS4BGwD1xikNEREQSVFSLmtyxMb8G3gY+9F8eA+WYWUV3z95zrLtvBB6O5v1FRESk\n/Ir2k5rjgPGAAz+a2XLgHWAVMMHMbnV37R8vIiIiURftgcKbgaeANsC9wE9Ab2Aa8AfgEzMbYWad\nNJVbSpPU1NSwQ5AoUj4Tj3IqkYj2k5oPgGx3f5dguvZDAGbWHDgLaAtcAdwJ7DKzD4A3gefdfVmU\nYxGJWJ8+fcIOQaJI+Uw8ymnJfPcd7NoFdeqEHUlsRfVJjbtvcvfXCmnPcPfH3f0ad08BGgDXASuA\nzsCMaMYhUlSdOnUKOwSJIuUz8SinxbN5M9x1FzRsCH/9a9jRxF68Zj9hZi2Bz909y92/BJ4xs3R3\nvyVeMYiIiJQHX38NDz4Ijz4KZtC7NwwcGHZUsRevxffuIOiOmr/PS3XNbGQ8YhAREUl0GzdCnz6Q\nkgJTp8Jtt8H69TBqFNStG3Z0sRevbRIOJ+humrl3o7u/AaSb2flxikOkUHPmzAk7BIki5TPxKKcH\ntnYt3HADHHcczJwJQ4bAunVw771wxBFhRxc/8SpqKrr7LHefvO8L7v4P4LdxikOkUDNnzjz4QVJm\nKJ+JRzkt3OrVcO210LQpzJ0LI0YExcyQIVCzZtjRxV+8ipojzOy4A7y+M05xiBTq2WefDTsEiSLl\nM/Eop/mtXAmXXQbNm8OiRfDQQ/DFFzBoEFSvHnZ04YlXUTMWWHSAbqZqcYpDRESkzEpLg4sugpYt\nYdkymDgx6Hrq3x+Sk8OOLnxxmf3k7ulmNgR4wcw+BeYQrGmzlWD9GhU1IiIi+7F0KQwfDvPnQ5Mm\nwSDgq6+GihXDjqx0iduUbnefYWYZwCjgLsByX3oFuCxecYiIiJQVb7wRrC/z6qtBV9PTT0OPHnBI\n3H57ly3x6n4Cgic27v5boC5wBtDY3Tu7+3fxjENkXz179gw7BIki5TPxlKecusMrr0C7dtC+PWRm\nwnPPwUcfwZVXqqA5kHitU9N27+/dPZNgF+918bi/yMFotdLEonwmnvKQU3d48UVo0wY6dYLt24MZ\nTe+/D5dcAklxfQxRNsXrR3RnIW1Hm9kEM+sWpxhE9uvyyy8POwSJIuUz8SRyTnNyYPZsaNUKLrgg\nGCezYAEsXx58b3bwa0ggJkWNmX1uZu+Z2UNm1p1fxs/kcfe17t4bONzMro1FHCIiIqXVrl3wzDPQ\nokXwJKZWLXj9dXjzzeBJjYqZoovVk5obgfcIFtWbDXQys9VmNsXMrjWzlD0HuvvfgZYxikNERKRU\nyc6GJ54IBv5eeSU0agRvvx0MBm7fXsVMScSkqHH319z9FndvCRwBfAw8DzQBJgKfm9mXZvZs7t5P\nJ8ciDpFILVmyJOwQJIqUz8STCDndsSPYYPJXv4JeveCkk2DFCnjpJTjzzLCjSwwxH1Pj7t8DX7n7\n3e7eHqgBnAk8lHtIE2BQrOMQOZDRo0eHHYJEkfKZeMpyTrOyYOxYaNwYbrkFzjgDPvwQ/vlPaN06\n7OgSS7wmhk3Z8z/uvgtYnvslUirMmjUr7BAkipTPxFMWc/rjjzBpEjz4IGzZEnQ13XUXNGsWdmSJ\nK14rCs/et83MGgK3AIvd/eV4xCGyP8laXzyhKJ+Jpyzl9IcfYPx4GDMGtm2D666DO+4IntRIbMVr\nnZqHcqdv/97M6gK4+3rgDiDHzP4W5fv1NrMvzOxnM1tmZqcd5PhDzWyEma0zs+1mttbMrotmTCIi\nkti2bIG//AUaNgxWAb78cvj8c3jsMRU08RKv7qctwDDgj4Cb2WfAG8CbwFqgQbRuZGY9CMbr3Ai8\nCwwAFpiKSPJRAAAgAElEQVRZ09xF/wrzHFAH6AmsAY4izqsti4hI2bRpU/BUZuLEYM2Zm2+G22+H\no44KO7LyJ16/uI8EOgO1ge7AXIJp3NMIiptojq8ZAEx296fcfRVwM5AF9CrsYDPrArQFurr76+6+\nwd2Xu/vSKMYkpdygQRqrnkiUz8RTGnP61Vdw662QkhIUNH36wLp18NBDKmjCEq8nNTvc/fXc/5+X\n+4WZ1QHGAk9F4yZmVhFoDdy3p83d3cwWAW32c9oFwArgT2Z2NfATQdH1Z3ffHo24pPRr0CBqDwul\nFFA+E09pyun69TByJEybBsnJMHgw9OsXLJ4n4YpXUdPQzGq4+w97N7r7ZjP7AzAcGBiF+9QGKgCb\n9mnfBOxvvHljgic12wmeItUGJgG1gOujEJOUAX379g07BIki5TPxlIacfv453H8/PPUU1KwJw4ZB\n795w2GFhRyZ7xKv7aQbwHzMrsCOZu2cBHqc4CpME5ABXuPsKd/83QYF1rZlVCjEuEREpBTIy4Kqr\ngqnY8+fDqFFBN9Odd6qgKW3iUtS4+zxgDDDfzNab2WNm1svMOuY+qflVlG6VCewG6u7TXhf4337O\n+ZpgccAf92rLINiv6pgD3axr166kpqbm+2rTpg1z5szJd9zChQtJTU0tcH7v3r2ZOnVqvrb09HRS\nU1PJzMw/pnno0KGMGjUqX9uGDRtITU1l1apV+dofeeSRAv3PWVlZpKamFliVc+bMmfTs2bNAbD16\n9ND70PvQ+9D7KNfv46abhtKixShOPDHYj2ncOHjjjQ0sXpzKxo1l532EmY+ZM2fm/W6sV68eqamp\nDBgwoMA50WLu8XtIYmatCbqaOhJ0EwGsBC5199VRuscyYLm798/93oANwDh3f6CQ428AHgaOzH1q\nhJldSLCtQzV331HIOa2AtLS0NFq1ahWNsCVkq1at4vjjjw87DIkS5TPxxDOn770Hw4fD3LnBIOA7\n74Rrr4VDD43L7RNeeno6rYOllFu7e3o0rx3Xacvunubu5xFMnz4dON7dT45WQZNrDHCDmV1jZscD\njwLJwJMAZna/mU3f6/hnCKacP2Fmzc2sHTAamFpYQSOJafDgwWGHIFGkfCaeeOR0yRLo0gVOPx1W\nrYInn4TVq+GGG1TQlBXxGigMgJlVBarkrhezIhb3cPd/mFlt4F6CbqcPgM7uvjn3kHrAsXsd/5OZ\n/RZ4hGBn8S3As8CfYxGflE7jx48POwSJIuUz8cQqp+7w2mvBk5nFi4NNJmfNgksugQoVDnq6lDJx\nKWrMrD7Bk5IOwbe2hWDBu9G5KwtHlbtPJNgNvLDXCnQAuvunBOvoSDlVmqaLSskpn4kn2jl1h5df\nDoqZpUuhVSt44QW48EJI0tKrZVa8UjeFYHXfWwjWkPkPwWJ4H5nZpXGKQUREyrmcHJgzB047Dc4/\nP2ibPx9WrICLLlJBU9bFq/vpE3e/e+8GM0sGrgYmmdkmd38jTrGIiEg5s3s3PP88jBgBK1dC+/aw\naBGccw6YhR2dREvUa9Lc6drXm1nTvZo9dxbSLw3uWe4+GTgN6B/tOESKYt/pjlK2KZ+Jp7g53bUL\n/v73YKzMZZfB0UfDW2/B66/DueeqoEk0RSpqzOwvZnaVmZ1qZtX2c9iFwGNAhpl9bWb/ACoC/zCz\nAuPH3X0tsK6IcYtEVVZWVtghSBQpn4mnqDnduROmTAkWzLvmGmjaFJYvh3//G846K0ZBSuiKtE6N\nmeUQrP67DdgK7CAoSHrnDrbFzFYA7YBTc//bjmDfparAZmBJ7td7BAviNQeucvceUXlHcaB1akRE\nSqft22Hq1GDV340bg1lMd98Np5wSdmSyRyzXqSnOmJo/uvtje74xs1rA3ns6DcxdxO7N3C/MrAK/\nFDlnA0OAwwm2J3gVuKFY0YuIiAA//QSTJ8MDD8A33wRdTXfdBSeeGHZkEk9FLWo27l3QALj7t/t8\n/+a+J7n7bmB57tcDALlryfzk7j8XMQYREREAtm6FCRNgzBj4/nu4+upgBeBfRWvzHSlTijpQeGO0\nbuzumSpopLTYd68UKduUz8Szb06/+w7uuQcaNQp2y77kEvjsM5g2TQVNeVbUomZnTKIQCVmvXr3C\nDkGiSPlMPHtyunlz0K3UsCGMHBkMAl6zBiZNCgocKd/iuk2CSGk1bNiwsEOQKFI+E0/v3sO4/fag\neDGD3r1h4ECoWzfsyKQ0KWpR08DMKrv79phEIxISzWJLLMpn4ti4EUaPhscfb0XlynDbbdC/Pxxx\nRNiRSWlU1KKmMfCNmS3hl9lN77r7rqJcxMxGu7u20RURkUKtXRt0Lz35JFSvDkOGQJ8+ULNm2JFJ\naVac7qdqQBd+2QByu5kt55ciZ2kEA4BPL8Z9RUQkwa1eDffdBzNmBE9jRoyAm28OChuRgynqQOGv\ngD8DC4GfAAOqAO1z218BvjOzd8xspJl1NbPDCrlO5eKHLBJ9U6dODTsEiSLls+xZuTJYW6Z582BP\npocegi++gEGDgoJGOZVIFLWoWePuI9y9C1CT4InL7cA84HuCIudQ4AxgUG77FjNLN7O/mdlFZtYA\naBi1dyASBenpUV3UUkKmfJYd6enB7tgtW8KyZTBxYtD11L8/JCfvfZxyKgdX1G0SXnP3cw7wegt+\n2RqhHbD3uPR8N3L3CkULtfTQNgkiIiWzbBn89a8wfz40aRJM077qKqhYMezIJNZK0zYJ+9vEEgB3\nXwmsBCYA5O7UvXeR02DPoUW8r4iIJIA33giKmVdfhRNOCMbOXHopHKIFRiQKitr9VL8oB7v7p+4+\nxd2vcfdGQApwdxHvKSIiZZg7LFwI7dpB+/aQmQnPPx+Mo7niChU0Ej1FLWqOMrPTinszd1/v7vcD\nXxT3GiIiUja4w7x5cMYZ0LlzsIP23Lnw/vtw8cWQVNTfQCIHUZw/UpPM7IDdUBH4poTni0RVampq\n2CFIFCmf4crJgdmzoVUrSE2FQw+FBQtg+XK44IJgReCiUk4lEkUtau4CKgErzayXmVUp5n21h5SU\nKn369Ak7BIki5TMcu3YFY2RatAg2mKxVC15/Hd58Ezp1Kl4xs4dyKpEoUlHj7iPdvQWQCjQBlpnZ\nVDMr6u4brxfxeJGY6tSpU9ghSBQpn/GVnQ1PPBGsMXPVVcHGku+8EwwGbt++ZMXMHsqpRKJYw7P2\nmuV0l5m1AbKLeP49xbmviIiUHjt2BMXMyJGwfj107w6zZkEwW1ck/ko85tzdl0YjEBERKRuysmDK\nlGCjyf/+N5iSPW9e0O0kEqaIu5/MrKmZaay6JKQ5c+aEHYJEkfIZGz/+CA88ACkpMHAgnHsuZGQE\nT2diXdAopxKJohQp/wC+MrMHc1cOFkkYM2fODDsEiSLlM7p++CHYWLJhQ7j7brjwQvj0U5g+HZo1\ni08MyqlEIuLuJ3c/xczOBq4BlpjZWmA6MMPdN8cqQJF4ePbZZ8MOQaJI+YyOLVvgb3+DRx4J1pj5\nwx9g8GBo0ODg50abciqRKOrspzfc/XqgHvAQ0BXYYGZzzex3ZqZdO0REyrhNm+BPfwpmMY0ZA9df\nH+yYPX58OAWNSKSKNUbG3X9296fdvRPwK+AdYATwtZlNKMmqwyIiEo6vvoJbbw3GzEyaBH36wLp1\n8NBDcNRRYUcncnAlHvjr7l/mrl/THDg/t/nfZpZhZneYWZH2ixIRkfhavx5uuQUaNw7GyfzpT0Ex\nc//9UKdO2NGJRC6qs5ncfbm79waOAv4MnAmsMbOFZnZFCVYgFompnj17hh2CRJHyGZnPPw+6lpo0\ngeeeg2HDggJn6NBgNeDSRDmVSMRkira773T35909FTgWmA8MAv6XuwJx21jcV6S4tFppYlE+D+yT\nT4KVf5s1g/nzYdSo4MnMnXfCYYeFHV3hlFOJhLl7/G5mdjLB7KkrgSzgKeApd18btyCiwMxaAWlp\naWm0atUq7HBERCLywQfB1OzZs6F+/aCb6frroYqeoUscpaen0zpYdrq1u6dH89pxXUzP3f/j7rcB\n9YF+wAnAR2b2ppldb2bV4xmPiEh58O67wW7Zv/41pKXB5MmwZk0wEFgFjSSSUFYIdvfd7v6iu18K\nHA08A1xPMHtqShgxiYgkmiVLoHNn+L//+2WxvE8/hRtugEMPDTs6kegLfdsDd//e3R919zOBVsAb\nYcck5c+SJUvCDkGiqDzn0/2X3bHbtg32Zpo1Cz7+GK65Bg4p8Y5/4SjPOZXIhV7U7M3dP3X3v4cd\nh5Q/o0ePDjsEiaLymE93ePll+M1voGNH2LYNXngB/vMf6NEDKlQIO8KSKY85laIrVUWNSFhmzZoV\ndggSReUpnzk5MGcOnHYadO0atM2fDytWwEUXQVKC/C1fnnIqxRe3P+5m1tLMkvdpi9NWaCIHlpyc\nfPCDpMwoD/ncvRuefRZOOSUoXqpXh0WL4O234bzzwCzsCKOrPORUSi4uRY2Z3QG8S7Bezd7qmdnI\neMQgIpIIdu2Cp56CE0+Eyy4Lti946y14/XU499zEK2ZEiiJeT2oOB64D8u0d7+5vAOlmdn5hJ4mI\nSGDnTpgyJVgw79proWlTWLYMFiyAs84KOzqR0iFeRU1Fd5/l7pP3fcHd/wH8Nk5xiBRq0KBBYYcg\nUZRI+dy+HSZMCLYyuOGGYK2Z99+HuXODqdrlRSLlVGInXkXNEWZ23AFe3xmnOEQK1aBBg7BDkChK\nhHxmZcHDDwebTPbrB+3awUcfwfPPB+NoyptEyKnEXryKmrHAogN0M1WLUxwiherbt2/YIUgUleV8\nbt0KI0dCo0YweHAw6HfVKnj66WAcTXlVlnMq8ROXZZjcPd3MhgAvmNmnwBzgA2ArcBYqakSknPvu\nOxg3DsaOhZ9+gl69gr2ZGjUKOzKRsiNua0u6+wwzywBGAXcBe8bovwJcFq84RERKk82bg26m8eMh\nOxtuugkGDQo2nBSRoon3hpbp7v5boC5wBtDY3Tu7+3fxjENkX6tWrQo7BImispDPr7+G228PnsSM\nGwd//COsWwd/+5sKmsKUhZxK+MLa0DIT+BjYEsb9RfY1ePDgsEOQKCrN+dy4Efr2hZQUePxxGDgQ\n1q+HUaOgbt2woyu9SnNOpfQIc2uzKsBAM8sBRrj7zyHGIuXc+PHjww5Boqg05nPtWrj//mCn7OrV\nYcgQ6NMHatYMO7KyoTTmVEqfuBQ1ZpYCDAWOAP4DzHX3d4G7zKw+MBy4LR6xiBRG00UTS2nK5+rV\ncN99MGMGHHEEjBgBN98cFDYSudKUUym94tX99CTBOJqKQE9gmZl9ZmZ3AbWAOnGKQ0QkLj76CC6/\nHJo3h1dfhTFj4IsvgkHAKmhEYiNeRU26u5/n7l3cvT7BIOF5QH+Cqd2bonkzM+ttZl+Y2c9mtszM\nTovwvN+YWbaZpUczHhEpP9LT4Xe/gxYtYOlSmDQJ1qwJFtDTnowisRWvombH3t+4+7vuPhCoB9R2\n96itf21mPYCHCLq7fk3Q3bXAzGof5LwawHRgUbRikbJj1KhRYYcgURRGPpctg/PPh9atYeVKmDYN\nPvssmKJdqVLcw0k4+oxKJOJV1HxgZr/bt9ED0Z7OPQCY7O5Pufsq4GYgC+h1kPMeBWYAy6Icj5QB\nWVlZYYcgURSvfLrD4sXQsSO0aRN0Lz39NGRkQM+eULFiXMIoF/QZlUjEq6h5AehlZsMO9sSkJMys\nItAaeHVPm7s7wdOXNgc4ryeQAtwTq9ikdLvnHqU+kcQ6n+6wcGGwH1OHDpCZCc89F4yjufJKOCTM\neaUJSp9RiUS8ipqZwOnAn4FNZvaxmU00s8vM7Kgo3qc2UIGCY3Q2EXR1FWBmvwLuA65095woxiIi\nCcYd5s2DM86Azp1hx45gt+z334dLLoGkUFb+EpE94vUR/NrdjwQOBy4E5gOnAn8HvjSzV+IURz5m\nlkTQ5TTU3dfsaQ4jFhEpvXJygt2xf/1rSE2FQw+FBQtg+XK44AIw/a0hUirEq6h5z8xGAKcA8919\nkLufTlDkXEBQWERDJrCbYPr43uoC/yvk+OoExdX43FlP2QRPk04xs51m1v5AN+vatSupqan5vtq0\nacOcOXPyHbdw4UJSU1MLnN+7d2+mTp2ary09PZ3U1FQyMzPztQ8dOrTAQLkNGzaQmppaYPnwRx55\nhEGD8o+9zsrKIjU1lSVLluRrnzlzJj179iwQW48ePcrV+8jMzEyI9wGJkY+Svo/MzMyovI+nn55J\nu3Y9Oekk+P3voXbtYAzN0Uf3ICtrTr5iRvmI7fvIzMxMiPcBiZGPSN/HzJkz83431qtXj9TUVAYM\nGFDgnGixYMhJbJnZTcChBLtxT3f3/8bwXsuA5e7eP/d7AzYA49z9gX2ONaD5PpfoDXQALgbWFbbS\nsZm1AtLS0tJo1apVDN6FxFtqaipz584NOwyJkpLmMzs7WCzvvvuCGUxduwYrALfZ78g8iTV9RhNH\neno6rVu3Bmjt7lFdQiVew9l+S9DtVAHoZ2ZvAW8Cb7r7h1G+1xjgSTNLA94lmA2VTLAAIGZ2P3C0\nu1+bO4j4k71PNrNvgO3unhHluKQUGzZsWNghSBQVN587dsCTT8LIkcHmkt27w8yZwTRtCZc+oxKJ\nuBQ17n6JmVUDzgTOyv0aCVQxs++Bt4E5wAx337H/K0V0r3/kzrC6l6Db6QOgs7tvzj2kHnBsSe4h\niUdP3BJLUfOZlQVTpsDo0fDf/8KllwYDgFu0iFGAUmT6jEok4tL9VOiNzQ4hmH59H0GR0RhYD1wU\ng6c3UaXuJ5HEsG0bPPooPPggbNkCV1wBd90Fxx8fdmQiiSuW3U+hTUB0913uvhw4D/gncBQwFXjR\nzLRzmYjEzA8/wPDh0KgR3H13MKNp9Wp46ikVNCJlWVyKGjPrYGZzzGy0mbXc+zV33wkkuftmd78P\nuAj4SzziEtlj31kEUrZNmTKl0PYtW+DPf4aGDYOi5vLL4fPP4fHH4bjj4hykFIk+oxKJeD2puRNY\nC3QD3jezT8xsjJndZGZ3sNdqv+6eBmyNU1wiQPA4VMq2bdu2MbRfPzqmpDDi1lvpmJLC0H792LZt\nG998A3/6U/BkZswYuP76YEuD8eOhgZ4Llwn6jEok4jX7KSN3A8uBZnYGcDlBt9PNwDpy92Uys/FA\nOrA9TnGJADBhwoSwQ5AS2LZtGxe3acPAjAyG5eRggP/0EzPG/5OTZpzG5p+v4pBDjL59YcAAqFMn\n7IilqPQZlUjEq6h5wsz+Bsxy92Xsf9PIU4FrgMFxiktEEsCDd9/NwIwMuuQEO52spwEjuYNp3otD\nv83i9NP/zQsvn0etWiEHKiIxFZfuJ3f/gKBQaWRmxxzg0DOBRu7+aDziEpHE8Pa8eXTOyeFzjqMX\nU2nC5zzPJQzlHr6kIRW/uUUFjUg5EM+9ZCu6+6wDHZC7oeS3cYpHRBKAu5OT1Yir+SszuZwj+YZR\n/ImbmExVsgBIzj4Md8e0SZNIQovX7KcbgK/N7Nbc7y8wsxfNbLyZpcQjBpEDKWxvFSn9PvgAfv97\n4/VvXuVN2jGW/nxBCot5OK+gceCnihVV0JRx+oxKJOI1+6kB0B74Z+6U7heAJkAWMNvMtDKEhKpP\nnz5hhyBF8O67wdoyv/41vP8+dDvnWSZYU/owgcrsYO9s/jspibP0C7HM02dUIhGvoqaqu6e7+3rg\nqtz7XunugwnWpRkYpzhECtWpU6ewQ5AILFkCnTvD//0ffPopTJ8eLJr3zJxuPHJCE15OSsKBTgRP\naF5OSuLh5s25bfjwkCOXktJnVCIRr6KmmpnVzt0Vuwvwv9z1aMgtdEq035OIJC53eO016NAB2rYN\n9maaNQs+/hiuuQYOOQSqV6/O7KVLWd6nD50aNeLC+vXp1KgRy/v0YfbSpVSvXj3styEicVCkgcJm\n9heCRfRWAavc/ccITx0FLAIqAs2Bu/d5XYvtiUg+7vDvf8Nf/wpLl0KrVvDCC3DhhZBUyD/Hqlev\nzrCxY2HsWA0KFimnivqkZhgwnaBA+cTMPjOzV8ys6YFOcvc1BNO17wTau/v9ALmDhe9Ai+1JyObM\nmRN2CJIrJwfmzIHTToOuXYPi5qWXYMUKuOiiwguaff3rX/+KfaASV/qMSiSK0/30R3ev6e4N3P1X\nQA9gzcFOcvcsd5/r7m/uez3gjWLEIRI1M2fODDuEcm/3bnj2WTjllKB4qVYNFi2Cd94JipuiPHhR\nPhOPciqRMHeP/GCz9e7eMIbxlAlm1gpIS0tLo1WrVmGHI1Km7doFzzwD990XDPrt1AmGDAnGz4hI\n4klPT6d169YArd09qpt6FfVJzcZo3lxEyq+dO2HKFGjWDK69Fpo2hWXLYMECFTQiUjxFXVF4Z0yi\nEJFyY/t2mDoVRo2CL7+Eiy+G2bODbicRkZKI5zYJIlKO/fQTTJ4MDzwA33wDl18Od90FJ5wQdmQi\nkiiK2v3UwMwqxyQSkRD17Nkz7BAS1tatcP/90KgR/OlPwaDfVavg6adjV9Aon4lHOZVIFPVJTWPg\nGzNbAryZ+/Wuu+8qykXMbHTuasIipYJWK42+776DceNg7NjgKU2vXkFR06hR7O+tfCYe5VQiUdTZ\nTzl7fbvnxO3Acn4pcpa6+88Huc5id29ftFBLD81+Etm/zZvh4Ydh/HjIzoabboJBg6B+/bAjE5HS\nIJazn4r6pOYr4FGgLcFietWAKgSbVZ6de0y2maXzS5GzxN33XTFYXVgiCebrr+HBB+HRR4M1ZW65\nBW67DerWDTsyESkvilrUrHH3EQBmlgS0AtoRFDRnAYcDhwJnAP8HDAJyzGwlQYHzBpAGlPu1bkQS\nxcaNwUymKVOgUiUYOBBuvRWOOCLsyESkvCnqQOG87id3z3H3Fe4+xt0vdPcjgJOBvsBzwDeAARWA\nU3Lbnwe+AI6MRvAi0bJkyZKwQyhz1q6FG2+E446DmTODBfPWrw/2agq7oFE+E49yKpEoalFT7UAv\nuvtKd5/g7j3c/SjgeOBG4GmChfss90ukVBk9enTYIZQZq1f/sljev/4FI0YExcyQIVCzZtjRBZTP\nxKOcSiSK2v1UpKF+7v4p8CkwBcDMGgJXAMOLeF+RmJo1a1bYIZR6K1cGBcw//gFHHw1jxsANN0CV\nKmFHVpDymXiUU4lEUZ/UHGVmpxX3Zu6+PneH7i+Kew2RWEhOTg47hFIrLS3YYLJly2Abg4kTYc0a\n6NevdBY0oHwmIuVUIlGcXbonmdkBu6Ei8E0JzxeRGFu6FM4/H049FT76CKZNg88+g5tvDgYEi4iU\nNkUtau4CKgErzayXmRX332naQ0qkFHKHxYuhY0c480z44otg5d+MDOjZEypWDDtCEZH9K1JR4+4j\n3b0FkAo0AZaZ2VQzK+pKFK8X8XiRmBo0aFDYIYTKPdgdu1076NABMjPhueeCJzRXXgmHlLFd4sp7\nPhORciqRKE73055ZTne5+8kEg4Czi3j+PcW5r0isNGjQIOwQQuEO8+bBGWdAly6wYwfMnQvvvw+X\nXAJJxfobInzlNZ+JTDmVSBRpmwQJaJsEKetycuCf/4Thw+GDD+Css+DPf4bf/jZYDVhEJFZiuU1C\nGf13mEjiiuU/NHbvhmeegRYtgicxRxwRjKF56y3o1EkFjYiUbSpqREqBbdu2MbRfPzqmpND92GPp\nmJLC0H792LZtW1Sun50NTzwBzZsHY2QaNYJ33oFFi+Dssw96uohImaCiRgRYtWpVaPfetm0bF7dp\nQ5sJE3hl3Tr+9dVXvLJuHW0mTODiNm1KVNjs2BFsMPmrX0GvXnDiibBiBbz0ErRpE8U3UcqEmU+J\nDeVUIqGiRgQYPHhwaPd+8O67GZiRQZecnLw9RAzokpPDgIwMHhoypMjXzMqCsWODfZluuSUYCPzh\nh8E4mqArO7GFmU+JDeVUIqGiRgQYP358aPd+e948OufkFPpal5wc3p47N+Jr/fgjPPAApKTAbbfB\nOefAJ5/ArFnBOJryIsx8SmwopxKJMrb6hEhshDVd1N2pmp29311eDUjOzsbdsQOM4v3hBxg/Hh5+\nGLZuheuugzvugMaNYxF16afpv4lHOZVIqKgRCZGZ8VPFijiFb1/vwE8VK+63oNmyJehmGjcOtm+H\nP/wBBg8G/f0vIuWRup9EQvabCy5gwX5Wuft3UhJnpaYWaN+0Cf70p2AW00MPwfXXB1sajB+vgkZE\nyi8VNSLAqFGjQrv37SNGMKZ5c15OSmLPCjUOvJyUxMPNm3Pb8OF5x371Fdx6azBmZtIk6NMH1q0L\nCpujjgoj+tIpzHxKbCinEgl1P4kAWVlZod27evXqzF66lIeGDGHM3LkkZ2eTVbEiv0lNZfbw4VSv\nXp1162DUqGCn7OTk4ClN375Qq1ZoYZdqYeZTYkM5lUhom4Ri0DYJEkt7Dwr+7DO4/374+9+hZk0Y\nOBB694bDDgs5SBGRYorlNgl6UiNSypgZn3wCI0YEU7GPPDJ4SnPTTVC1atjRiYiUXipqREqR//wn\n2GRy9mw45phgVtP110PlymFHJiJS+mmgsAiQmZkZ6v3few8uvBBOOQXS0+Gxx+Dzz4OuJhU0RRd2\nPiX6lFOJhIoaEaBXr16h3HfJEujSBU4/HVavhunTg//+4Q9w6KGhhJQQwsqnxI5yKpFQUSMCDBs2\nLG73codXX4UOHaBt22Ca9qxZ8PHHcM01cIg6hUssnvmU+FBOJRIqakQgLrPY3GH+fPjNb6Bjx2A7\ngxdeCMbR9OgBFSrEPIRyQ7MSE49yKpFQUSMSYzk5MGcOnHYanH9+UNy89BKsWAEXXQT7WUxYRESK\nSH+disTI7t3wj38Eg38vugiqV4dFi+Cdd6BrVzjA/pQiIlIMCVnUmFlvM/vCzH42s2VmdtoBjr3I\nzBaa2Tdm9oOZvWNmneIZr4Rv6tSpUbvWrl3BYnknnRR0Kx19NLz1Frz+Opx7roqZeIhmPqV0UE4l\nElIiTS4AABZvSURBVAlX1JhZD+AhYCjwa+A/wAIzq72fU9oBC4HzgFbA68A8Mzs5DuFKKZGeXvJF\nLXfuhClToFmzYMBv06awfDn8+99w1llRCFIiFo18SuminEokEm6bBDNbBix39/653xuwERjn7qMj\nvMZHwCx3H76f17VNguTZvh2mTg1W/f3yS7j4Yrj77qDbSURE8ovlNgkJ9aTGzCoCrYFX97R5ULUt\nAtpEeA0DqgPfxiJGSRw//QRjxgQ7Zv9/e3ceJkV17nH8+6qIgKhREMQFuEqIGjRCUFFB4oJLLm0S\nMbjEEAhJQAgGDahX7iXJgxFQ3MElRDH3MaOoCe6CIWhEWXRGI0ZwiY54UYkYFRQXhPf+UTXaM0zP\n1Mx0d02f+X2ep59hqk5VvT0v0/M+p06dM24cDBgAzz8Pd96pgkZEJA2hzYjRAdgWWFtj+1qgZ8Jz\nTADaAXPzGJcEZP16mDkzKmjefx/OPhsuugh69Eg7MhGRli20oqZJzOxM4L+BjLtrTm6p5r334Oqr\no9fGjTBiBFxwAXTrlnZkIiICgd1+AtYBm4FONbZ3At6u60AzOx24CTjN3RcludjJJ59MJpOp9urX\nrx/z5s2r1m7BggVkMpmtjh8zZsxWI/orKirIZDJbrXMyefJkpk2bVm3b6tWryWQyrFq1qtr2a6+9\nlgkTJlTbtnHjRjKZDIsXL662vaysjOHDh28V29ChQ1vU+8hkMjnfx4knZjj33HV07RqNmxk2DM45\nZzLduk2rVtA0h/cBYeSjqe8jk8kE8T4gjHzk431kMpkg3geEkY+k76OsrOyLv42dO3cmk8kwfvz4\nrY7Jl5YyUHg10UDhy3IccwYwGxjq7vcnuIYGCgdmwYIFDBpU/Un+t96CGTPg+uujx7DHjIHzzoNO\nNUtmaXZqy6eUNuU0HIUcKBzi7acrgDlmVg4sB8YDbYE5AGZ2KdDF3YfF358Z7xsHPGVmVX+yPnb3\n9cUNXdKS/WH5xhswfTr87nfQunVUyPziF7DbbikGKA2iP37hUU4lieCKGnefG89J8xui207PAie4\n+ztxk87A3lmH/IRocPHM+FXlVkDLwrYgr74KU6fCnDnR7L+TJsHYsbDLLmlHJiIiSQRX1AC4+yxg\nVo59w2t8/62iBCXN1qpVcOmlcNttUW/MlCkwenRU2IiISOkIbaCwSGIrVsDpp8MBB8B9981jxgx4\n7TWYOFEFTamrOdhSSp9yKkmoqJEWp7w8WmDyoINg6VKYNQuOPbaMc8+Ftm3Tjk7yoaysLO0QJM+U\nU0lCRY20GEuWwLe/Dd/8ZjTz7803w8svw6hRcOedd6QdnuTRHXcon6FRTiUJFTUSvMceg+OOgyOO\ngMrKaOzMypUwfDi0apV2dCIiki8qaiRI7rBgQbQe08CB8O67cNdd0TiaM8+E7YIcIi8i0rKpqJGg\nuMN998Hhh8MJJ0QraN97L1RURKtnb6P/8SIiwdJHvARhyxa4+27o3RsyGdh+e5g/H5Ytg8GDoxmB\n61LbVN9SupTP8CinkoSKGilpn38ejZHp1QuGDIFdd4VHH4XHH4dBg+ovZqpottKwKJ/hUU4lCRU1\nUpI2bYJbboH994cf/CBaKfvJJ2HhQjj66Iaf74wzzsh7jJIe5TM8yqkkoaJGSsqnn8INN0CPHjBi\nBHz96/D00/DAA9CvX9rRiYhImvQMiJSEjRth9uxoock334ShQ6MBwb16pR2ZiIg0F+qpkWbtww/h\nssuge/dotexjj43mmCkry29Bs3jx4vydTFKnfIZHOZUkVNRIs/TBB9HCkl27wsUXwymnwEsvwa23\nQs+e+b/e9OnT839SSY3yGR7lVJLQ7SdpVt59F666Cq69NppjZuTIaIHJffYp7HVvv/32wl5Aikr5\nDI9yKkmoqJFmYe1amDEjWlzSPVqP6Ze/hD32KM7122oly6Aon+FRTiUJFTWSV+6OJZ0cBlizJhr8\ne9NN0TpM48bB+PHQsWMBgxQRkSCpqJEm27BhA5dffDFP3Hcf7TZt4qNWrThy8GB+eckltG/fvtZj\nKith6tRorpm2beHCC+HnP48mzxMREWkMDRSWJtmwYQOn9utHv5kzeaSyknvWrOGRykr6zZzJqf36\nsWHDhmrtX3klml+mR49oWYNf/xpefx0mT063oJkwYUJ6F5e8Uz7Do5xKEipqpEkuv/hizlu5khO3\nbKHqppMBJ27ZwviVK5kxaRIAL7wQzfzbsyc89BBMmxb11lx4Iey0U1rRf2mfQo9ElqJSPsOjnEoS\n5u5px1ByzKw3UF5eXk7v3r3TDidVx3XvziOVldQ2isaBfl1OYu8jHuTuu2GvveCCC6KemjZtih2p\niIg0BxUVFfTp0wegj7tX5PPcGlMjjebutNu0qdaCZjl9mcIklr2Z4Z0K56abjB/+MFo9W0REpBB0\n+0kazcz4qFUrsvv6FnMkJ/Awh7Gcl/gqB3Q4n1WrjJEjVdCIiEhhqaiRJjly8GAetm1YyDEMZBH9\nWcybdOF2hnK59eK0Mz+nVau0o6zfqlWr0g5B8kj5DI9yKkmoqJFGc4eDjp7KGTuUcxwL2UB7/sx3\neJaD2Wmbu7jmgJ6cP2VK2mEmMnHixLRDkDxSPsOjnEoSKmqkwbZsgXnzoG9fGDKkLT179eLMzA18\npesQbtnzaU7s1pVlY8dy95IlOeepaW6uu+66tEOQPFI+w6OcShIaKCyJbd4Md90Fl1wCK1bAwIGw\ncCF861vbYjYKGNXgGYWbCz0uGhblMzzKqSShnhqp1+efwx/+AAceCKefDl26wOOPw6JFcMwxkF3D\nlGJBIyIiYVBRIzl99hnMnh1NmDdsWPR12TJ4+GE46qi0oxMREalORY1s5ZNPYOZM2G8/+OlPoXdv\neOYZuOceOPTQtKMrjGnTpqUdguSR8hke5VSS0Jga+cJHH8GNN8Jll8G//gVnnAH/9V9wwAFpR1Z4\nGzduTDsEySPlMzzKqSShZRIaIbRlEtavj3pmrrgC3n8fzj4bLrooWnRSREQkn7RMghTEe+/BNdfA\n1VdHvTQjRkRrM3XrlnZkIiIiDaeipgV65x248kq47jrYtAl+9jOYMAH23DPtyERERBpPA4VbkLfe\ngvPPj3pirrkGRo+Gykq46ioVNOvWrUs7BMkj5TM8yqkkoaKmBXjjDRg7Frp3jx7RPu88eP11mDYN\nOnVKO7rmYcSIEWmHIHmkfIZHOZUkdPspYK++ClOnwpw50L49TJoUFTe77JJ2ZM3Pr371q7RDkDxS\nPsOjnEoSKmoC9OKL8Nvfwm23wW67wZQp0a2mElmGKRUhPMUmX1I+w6OcShIqagLy/PNRATN3brSU\nwRVXwMiR0LZt2pGJiIgUnsbUBKCiAr73PejVC5YuhVmz4J//hHHjVNCIiEjLoaKmhG3eDKecAn36\nRKtm33wzvPwyjBoFrVunHV1p+f3vf592CJJHymd4lFNJQkVNCdt2Wzj44GjszMqVMHw4tGqVdlSl\nqaIir5NaSsqUz/Aop5KElklohNCWSRARESmWQi6ToJ4aERERCYKKGhEREQmCihoREREJgooaESCT\nyaQdguSR8hke5VSSUFEjAowdOzbtECSPlM/wKKeShIoaEWDQoEFphyB5pHyGRzmVJFTUiIiISBBU\n1IiIiEgQVNSIAPPmzUs7BMkj5TM8yqkkEWRRY2ZjzOw1M/vYzJaaWd962g80s3Iz+8TMXjKzYcWK\nVZqHadOmpR2C5JHyGR7lVJIIrqgxs6HADGAycAjwd2C+mXXI0b4bcD+wEDgYuBqYbWbHFyNeaR46\nduyYdgiSR8pneJRTSSK4ogYYD9zo7n9w91XAKGAjMCJH+9HAq+4+0d1fdPeZwF3xeURERKREBFXU\nmFkroA9RrwsAHq3Y+RegX47DDo/3Z5tfR/tmp6ysrNmcryHHJmlbX5u69ufal++fV74VIr7GnjPf\n+ayvnfJZ2HM29LhC/o6Waj5Bn7kN3VfMnAZV1AAdgG2BtTW2rwU65zimc472O5lZ6/yGVxj6BWvY\nvub+oVmqfwRV1NSuVPOZtL2KmnTPp8/c6rYr2pXCsgPAypUr044DgA8++ICKivyt3t6U8zXk2CRt\n62tT1/5c+2rbvnz58rz+DJsi3/lsyjnznc/62imfhT1nQ48r5O9oQ7eHnNOW9pmb9bdzh3qDbiCL\n7s6EIb79tBE41d3vzdo+B9jZ3b9byzGPAeXufl7Wth8BV7r7V3Jc50zgtvxGLyIi0qKc5e5/zOcJ\ng+qpcfdNZlYOHAvcC2BmFn9/TY7DlgAn1dg2KN6ey3zgLKAS+KQJIYuIiLQ0OwDdiP6W5lVQPTUA\nZvZ9YA7RU0/LiZ5iGgJ8zd3fMbNLgS7uPixu3w1YAcwCbiYqgK4CTnb3mgOIRUREpJkKqqcGwN3n\nxnPS/AboBDwLnODu78RNOgN7Z7WvNLNvA1cC44D/A36sgkZERKS0BNdTIyIiIi1TaI90i4iISAul\nokZERESCoKKmAMzsP81slZm9aGY/TjseaRoz+5OZ/dvM5qYdizSdme1lZovM7B9m9qyZDUk7Jmk8\nM9vZzJ4yswoze87MRqYdkzSdmbUxs0ozm96g4zSmJr/MbFvgBeBo4EOgAjjM3d9LNTBpNDMbALQH\nhrn799OOR5rGzDoDu7v7c2bWCSgHerj7xymHJo0QT9vR2t0/MbM2wD+APvrMLW1mNgXYF3jD3Scm\nPU49Nfl3KPC8u7/t7h8CDxDNeyMlyt3/RlSgSgDi383n4n+vBdYBu6YblTSWR6rmC2sTf7W04pGm\nM7P9gJ7AQw09VkVN/nUB1mR9vwbYM6VYRKQOZtYH2Mbd19TbWJqt+BbUs8Bq4DJ3/3faMUmTXA5c\nRCOKUxU1Wcysv5nda2ZrzGyLmWVqaTPGzF4zs4/NbKmZ9U0jVqmf8hmefObUzHYFbgV+Uui4pXb5\nyqe7f+Du3wC6A2eZWcdixC/V5SOf8TEvuvsrVZsaEoOKmuraEU3Wdw6w1WAjMxsKzAAmA4cAfwfm\nx5P9VXkT2Cvr+z3jbVJ8+cinNC95yamZbQ/8Gfituy8rdNCSU15/R+NJVv8O9C9UwFKnfOTzcOB0\nM3uVqMdmpJlNShyBu+tVywvYAmRqbFsKXJ31vRHNQDwxa9u2wIvAHsCOwErgK2m/n5b+amw+s/YN\nBO5M+33olZ+cAmXA/6T9HvRqej6B3YEd43/vTLTszYFpv5+W/mrqZ268fxgwvSHXVU9NQvEK4H2A\nhVXbPPqp/wXol7VtM3A+8CjRk0+Xu0bhNztJ8xm3fQS4AzjJzFab2WHFjFWSSZpTMzsSOA34jpk9\nEz8KfGCx45W6NeB3tCvwuJk9AzxG9EfzH8WMVerXkM/cpghu7acC6kDUC7O2xva1RKO0v+Du9wP3\nFykuaZyG5PP4YgUlTZIop+7+BPrsKwVJ8/kU0a0Mad4Sf+ZWcfdbG3oR9dSIiIhIEFTUJLcO2Ey0\n8ne2TsDbxQ9Hmkj5DI9yGhblMyxFyaeKmoTcfRPRzKPHVm2LZ7I8FngyrbikcZTP8CinYVE+w1Ks\nfOq+chYzawfsx5fPxf+HmR0M/Nvd3wCuAOaYWTmwHBgPtAXmpBCu1EP5DI9yGhblMyzNIp9pP/bV\nnF5E6zVtIeoiy37dnNXmHKAS+BhYAnwz7bj1Uj5byks5DeulfIb1ag751IKWIiIiEgSNqREREZEg\nqKgRERGRIKioERERkSCoqBEREZEgqKgRERGRIKioERERkSCoqBEREZEgqKgRERGRIKioERERkSCo\nqBEREZEgqKgRERGRIKioERERkSCoqBGRojCzjJktNrNnzexTM9tiZuvNbJcc7TuZ2RNm9mHcdouZ\nbTCzcjM7vtjxi0jzp1W6RaSozMyAd4Gd400T3P2KOtrvCrwE3A+MdvePCx+liJQiFTUiUlRmdjCw\nCPgM2B14xd2/Ws8xrwCHuPuGIoQoIiVKt59EpNj6A48CN8bf72tmg3I1NrNuwBoVNCJSHxU1IlJs\nA4C/AtcDm+JtY+pofzTwWKGDEpHSp6JGRIqtP/BXd38bmAsYcLKZ7Z2j/QBU1IhIAipqRKRozKwH\n0Vi+F+JNV8dftwFG5TjsCODJQscmIqVPRY2IFNMAovE0ALj708ASot6aH5vZdtmNzawL8J6eeBKR\nJFTUiEgxDSB68inbVfHXjsBptbRv8q0nM2vV1HOISPOnokZEiqlqkHC2PwFvxP8+p8a+o4G/1XdS\nM+trZrPiyfoWmNlcM5tsZjuYWVfglhrttzezB83slXhSvzXx9w+a2SIze8nM7jSz/c3su2b2VzP7\nKG77QnyNPbLOd7uZfRDvf83Mpjb4JyMiTaZ5akSkKMxsL2CJu281INjMJgJTAQe+4e4r4u3PAUfm\nepzbzHYDZgK9gInu/kDWvj7AL4BDgDJ3v6SW44cCfwROdfd5WdtbAWXAMXE8q81sKdDZ3bvliOU7\nwPfc/Yf1/jBEpCDUUyMixVLbracqvwOqxs2cA2BmHYBP6ihoegLLgHZAn+yCBsDdy4HlwP51XPeo\n+OviGsduIurd2YVorE9boHcd5wHoHr8PEUmJihoRKZacRY27vwf8L9GA4bPMbMe4/eO1tTezjsDD\nwHrg++7+SY5rPgh8RFT81OYoohmN19Wyb8f4a3uiJ7C2o+7xPYfVcR0RKQIVNSJSLP2pu6ej6vHu\ndsCPqHuQ8E3A3sBP63kyaj3whLtvrrnDzHYium2V63HxgUS3w56MY/Fc8cTrWW3v7p/VEYuIFJiK\nGhEpuHjsyw7uXpmrjbuvBB6Jvx1N1IuyVU+NmR0JnALMjx8Jr8uHwOQc+44g+gx8opZrdACGAovc\n/S6iAmeNu7+W41wHASvqiUVECkxFjYgUQ7X5aepwFdEtqK8B28W3pWoaTtRrckst+6px94/dfXmO\n3f35sifmC/EEgfcAC4DBZtYa6Evdt54SPaUlIoW1Xf1NRESa7DjqvvUEgLs/ZGYvAT3IXSQcHX99\ntIkx9Sdae+rn0d0jHNieaAzO+e6+FMDMBgCtqbuoOQINEhZJnYoaESkoMzsBGAY8m/CQa+NXriJi\nT2B9bYN7zex44AJgd6ANsAV4DRgcP9FU1W57ot6XJ919dD3x1DmeJtZGsx6LpE+3n0SkIMzsPjOr\nJHoCqQ1wvZmtMLOx9Rw6B3ib3D0164GNte1w90fc/TjgfGBf4HZ3PzG7oIn1Jep9SXLL6CDgXXd/\nubadZtYPqEhwHhEpMPXUiEhBuPvgRh73EdCljibLgJPMrF3ctjZHEPWuPJRjf9V4miRLMLQFai1o\nYuPjl4ikTD01IlJqriT67PpJbTvjx6uHEI2NeSrHOarG0yxJcL1ngA45rjUOWODuaxKcR0QKTEWN\niJQUd38UuBi4xMyGm9kXn2Pxo9g3AK8QjZepbX6aVkQ9ORV1TNqX7TqgnZmdlXWOHcxsMrC7u89u\n0hsSkbzR2k8iUpLMbCDRbZ+uwFrgfeBfwDXAauBQd388q31XYHbcfl9gA/A0cF32uk85rrUPMJ2o\nx+ZT4DPgBnefn993JSJNoaJGREREgqDbTyIiIhIEFTUiIiISBBU1IiIiEgQVNSIiIhIEFTUiIiIS\nBBU1IiIiEgQVNSIiIhIEFTUiIiISBBU1IiIiEgQVNSIiIhIEFTUiIiISBBU1IiIiEoT/BwROOZi3\nfm4AAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -438,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 81, "metadata": { "collapsed": false }, @@ -446,18 +472,18 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 27, + "execution_count": 81, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\nCSvJt3hw998BFwKXEDyg8EDgRHd/M9ukPzAob5dvEnSsvRp4LW/5ZXvFnBYzZ86krCzR/3mIiEiK\nJf0KCu5+DXBNM9smNfh8bLsE1QmYGcEdtba59tprKS8v56yzzipCVCIi0lnof5ElVtdccw0LFiwo\ndRiSIg07GkrHpnxKWCpQiqCYHY+T3KlZpBgqKytLHYLESPmUsFSgxGTz5s3MuOACThg6lAmDBnHC\n0KHMuOACNm/enOhjAyxfvpxDDz2Unj17st9++3HDDTc0anPTTTdx/PHH069fP3r06MEBBxzAdddd\nV6/N0KFDefbZZ3nggQcoKyujrKyM4447DoB33nmHCy+8kAMPPJDevXvTp08fxo8fz1NPPRXLd5D0\nWrhwYalDkBgpnxJW4vugdASbN2/mi2PH8p8rVzKzthYjeHDR3VdfzRfvv58/rFhB7969E3dsgGee\neYYTTzyRvn37cskll7Bt2zZmzpxJ375967W77rrr+OQnP8lpp51G165dWbJkCd/+9rdxd84991wA\nrrrqKqZOnUrv3r358Y9/jLvTr18wkOrll19m8eLFfPnLX2bo0KFs2LCB66+/nmOOOYbnnnuO/v37\nR/4OIiKSQu7eqRdgNOBVVVXelKqqKm9pu7v7T88/3/9cVuYOjZa7ysp8xgUXNLtva4p5bHf3CRMm\neHl5ua9bt27HulWrVnnXrl29rKxsx7otW7Y02vekk07y4cOH11v3yU9+0o899thGbbdu3dpo3erV\nq71Hjx5+6aWXFvIVWhQmfyIiEk3udyww2mP++6xbPDF4eMkSTqytbXLbSbW1PLx4cSKPXVtby9Kl\nS/nCF77AwIEDd6wfMWIEJ554Yr223bt33/H+vffe46233uKoo47i5ZdfDnWrqVu3bvXO+/bbb1Ne\nXs6IESOoro51bh8REUkBFSgFcnd6bdvW7CObDSjfti1S59ZiHhvgzTff5MMPP2T48OGNto0YUf95\njA8//DAnnHACO++8M7vuuit77rknP/rRjwDYtGlTq+dyd6688ko+8YlP0L17dyoqKujbty9PP/10\nqP2l82pq+m3puJRPCUsFSoHMjA+6daO5EsGBD7p1izSnSDGP3RYvvfQSJ5xwAm+//TZXXnkld911\nF/fee++OZzDUNnOFJ9+sWbP43ve+xzHHHMOtt97K0qVLuffee9l///1D7S+dl2YeTRflU8JSJ9kY\nHH7qqdx99dWc1MQf2r+UlXFEEw+HSsKx99xzT3r27MkLL7zQaFv+Q6eWLFnC1q1bWbJkSb1bQffd\nd1+j/Zorlv7whz9w3HHHNRoh9O6777LnnntG/QrSCZx++umlDkFipHxKWLqCEoMLZ83iilGj+HNZ\n2Y6rHQ78uayMK0eN4nuXXprIY5eVlXHiiSeyaNEi1q1bt2P9ypUrWbp06Y7PXbsGdWz+lY5NmzZx\n8803Nzpmr169ePfddxut79KlS6NbUbfffjvr16+PHL+IiKSXCpQY9O7dmz+sWMGjU6cybsgQThs4\nkHFDhvDo1KkFDwMu5rEBLr74YtydI444gjlz5jBr1iyOO+44PvnJT+5oM27cOLp168Ypp5zCNddc\nw+zZsznkkEN2DCHON2bMGJ566ilmzZrFwoULWbZsGQCnnHIKDzzwAJMnT+bXv/413/nOdzj33HPZ\nd999C4pfRERSKu5hQR1tIYZhxg3V1taGbttWxTj2Qw895Iceeqj36NHDhw8f7jfccIPPnDmz3jDj\nO++80w866CAvLy/3YcOG+S9+8Qu/6aabvKyszFevXr2j3YYNG/zUU0/1Pn36eFlZ2Y4hxx999JFP\nnz7dBw4c6L169fKjjjrKH330UT/22GP9uOOOi/075WiYccf30EMPlToEiZHymS7FHGZsHnEESFqY\n2WigqqqqitGjRzfaXl1dzZgxY2huuySb8tfxZTIZFhcwnF6SRflMl9zvWGCMu8c6Z4Ru8YhIot12\n222lDkFipHxKWCpQRCTRysvLSx2CxEj5lLBUoIiIiEjiqEARERGRxFGBIiKJNn369FKHIDFSPiUs\nFSgikmiDBw8udQgSI+VTwlKBIiKJdv7555c6BImR8ilhqUARERGRxFGBIiIiIomjAkVEEi3/ydrS\n8SmfEpYKFBFJtIsuuqjUIUiMlE8JSwWKlMzq1aspKyvjlltuafO+Dz74IGVlZfz1r38tQmSSJPPm\nzSt1CBIj5VPCUoEiHZaZlToEaQcalpouyqeEpQJFREREEkcFioiIiCSOCpRObubMmZSVlfHCCy9w\nxhlnsOuuu9K3b19++tOfArB27VomTJhAnz592Guvvbjiiivq7f/mm28yZcoU+vfvT8+ePTnooIOa\n7FOyadMmzj77bHbddVd22203Jk2axLvvvttkTM8//zxf+tKX2GOPPejZsyeHHnooS5Ysif/LS4cw\ne/bsUocgMVI+JSwVKJ1crh/HxIkTgeCXx2GHHcasWbP45S9/ybhx49h7772ZM2cO++23H9OnT2f5\n8uUAbNmyhaOPPppbb72Vr3/96/ziF79g11135eyzz2bu3Ln1zpPJZLj11ls588wzmTVrFuvWreOs\ns85q1I/k2Wef5bDDDuP555/nhz/8IVdccQU777wzEyZM4E9/+lM7/ItI0tTU1JQ6BImR8imhuXun\nXoDRgFdVVXlTqqqqvKXtHd3MmTPdzPzcc8/dsW779u0+aNAg79Kli1922WU71r/77rteXl7ukyZN\ncnf3X/7yl15WVuaVlZU72nz88cf+uc99znfZZRd///333d190aJFbmZ++eWX72hXW1vrRx11lJeV\nlfmCBQt2rD/++OP9oIMO8m3bttWL8/DDD/cRI0bs+PzAAw94WVmZP/jggy1+v7TnT0SklHK/Y4HR\nHvPf564lrI1SqaYGij0P0ciRUF4e3/HMjClTpuz4XFZWxiGHHMKf/vQnJk+evGN9nz59GDFiBC+/\n/DIAd911F/379+crX/nKjjZdunThggsu4Ktf/SoPPvgg48eP56677qJbt26cc8459c55/vnn89BD\nD+1Y984777Bs2TJ+9rOfsWnTpnoxjhs3josvvpjXX3+dvfbaK74vLyIiiaQCJWarVsGYMcU9R1UV\njB4d7zEbDv3r06cPPXr0YPfdd2+0/u233wZgzZo17Lfffo2ONWrUKNyd1atX72i31157Ud6gqhox\nYkS9zy+++CLuzk9+8hN+/OMfNzqumfGvf/1LBYqISCegAiVmI0cGBUSxzxG3Ll26hFoH5G6Nxa62\nthaACy+8kBNPPLHJNsOHDy/KuSW5Nm7cSEVFRanDkJgonxKWCpSYlZfHf3UjqfbZZx+efvrpRutX\nrlwJwJAhQ3a0u//++6mpqal3FaXhMzmGDRsGQLdu3TjuuOOKFLV0NJMnT2bx4sWlDkNionxKWBrF\nI5GNHz+eN954g4ULF+5Yt337dubOnUvv3r056qijdrTbtm0b11577Y52tbW1zJ07t94onj333JNj\njjmG66+/njfeeKPR+TZu3FjEbyNJNXPmzFKHIDFSPiUsXUGRyL71rW9x/fXXc/bZZ/P4448zZMgQ\nbr/9dlasWMFVV11Fr169ADj11FM5/PDD+cEPfsArr7zC/vvvzx133MHmzZsbHfPqq6/myCOP5FOf\n+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\n", + "image/png": "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\nvaTEfeON3U87zf2115KOrPCcddZZSYcgMVI+i1t5ebmv62fsF1984QftuKPfV1LiK8NNYl8Jfl9J\niR+0447+xRdfNOj6+T7/K6+84qWlpd6lSxcfO3asjx492jt27Oi77rqrl5SUrGr3gx/8wIcOHepX\nXXWVT5gwwQ855BA3M7/66qtXtbnrrru8U6dO3rNnT7/lllt8ypQpPnv2bHd3f/75532HHXbwP/3p\nT/73v//dL7roIu/UqZNvuumm/sEHHzToM9Rlfbmr3gbo5XH/fo77hMW2FUuBUt2CBe5//KN727Yh\ngwMGuN91l/t33yUdWWH429/+lnQIEiPls7it75fceaee6veVlIQfZrW2e0tKfORppzXo+vk+/6BB\ng7y0tNTfe++9VfvmzZvnG2ywQY0CZdmyZWsce8ghh3jXrl1r7Ntpp538gAMOWKPtt99+u8a+BQsW\neMuWLf2iiy5qyEeoU9IFih7xFKHOneHii8Pjn8mT4fPPQx+Vrl1hzBj45JOkI0zWqaeemnQIEiPl\nM92emDmTg9exevUTM2YU7PlXrlzJrFmz+MlPfsJWW221an+3bt04+OCDa7Rt0aLFqr9/8cUXfPrp\np/Tt25e333470qOm5s2b17ju4sWLKS0tpVu3blRUVOT8GQqZCpQi1rJlmDvlmWfCCKD99oORI8Po\nn2OPhaefVqdaESlc7muuXl1d9dWrC/H8n3zyCV9//TVdu3Zd471u3brVeP3EE09w4IEHstFGG7HJ\nJpvQrl07zjnnHACWLFmy3mu5O1dccQXf//73adGiBW3btmWLLbbglVdeiXR8MVKBkhK9e8OkSfD+\n+zB6dBiu3KcP9OoVOtmqU62IFJrqq1evTUNXr873+aN66623OPDAA1m8eDFXXHEF9957L7Nnz2b4\n8OFAuCOyPqNHj+bMM89k//33Z8qUKcyaNYvZs2fTs2fPSMcXIxUoKbP55nDWWfDGG3DvvWE00Mkn\nw5ZbwrBh8MorSUeYf/PmzUs6BImR8plutVevri6O1avzef527drRqlUr3njjjTXeq/7vdubMmXz7\n7bfMnDmTE088kUMOOYR+/frRsmXLNY6rq1j617/+Rb9+/bj++uv5+c9/zoEHHki/fv34/PPPc46/\n0KlASamSEjj0UJgxIwxRPv10uOMO2GUX2Gcf+Oc/YdmypKPMj7PPPjvpECRGyme65Xv16nyev6Sk\nhIMPPpjp06fz3nvvrdo/d+5cZs2ater1BhuEZe+q3+lYsmQJkyZNWuOcG2644VqLjmbNmq3xKOr2\n22/n/fffzzn+QqcCpQno3BkuvDB0qr399tB35Ve/gq22CjPVpu0/qOPHj086BImR8plu+V69Ot/n\nP//883F39tlnH8aOHcvo0aPp168fO+2006o2AwYMoHnz5hx22GFcffXVjBkzhj322IP27duvcb6y\nsjJefvllRo8ezbRp03j44YcBOOyww3jkkUcYOnQoN9xwA6effjonn3wy22+/fYPiL2hxDwsqto0i\nHGYch9dfdz/zTPfNNw8j7vr2dZ8yxf3rr5OOTETSJMpQ1epWrlyZ13jycf7HH3/ce/fu7S1btvSu\nXbv69ddf76NGjaoxzPjuu+/23XbbzUtLS3277bbzSy+91G+66SYvKSnxBQsWrGr30Ucf+eGHH+5t\n2rTxkpKSVUOOv/nmGx8xYoRvtdVWvuGGG3rfvn39mWee8QMOOMD79esX+2dyT36YsXkTH+ZhZr2A\n8vLycnr16pV0OI1u2TL497/huuvg0Udhs83CCKATT4SePZOOTkSKXUVFBWVlZTTVn7HFLEruqtoA\nZe4e63hnPeJp4lq2hKOOgkceCY96hg4N/VN23DH0VZk8GSork45SRESaGhUoskq3bnDJJfDee3Dr\nraF4Of546NgRfvc7KJa5gMaMGZN0CBIj5VOkaVKBImto0QIGD4bZs+Gtt+DUU+Guu6CsLMyrMmEC\nfPZZ0lHWrVK3fFJF+RRpmlSgyDpttx1cdBEsWBCGLHfuHIYsb7klHHMMPPQQFNocQeeff37SIUiM\nlE+RpkkFikSywQZw+OEwfXp4BHT++fD889C/P2y/PVxwASxcmHSUIiKSFipQpN46dICzzw6daufM\ngX79YOxY6NIFDjoIbrkFvv466ShFRKSYqUCRnJnB3nvDxInw4Yfhz2++CY9+OnaEk04KCxk29kj2\nRYsWNe4FJa+UT5GmSQWKxGKjjWDIEHjssbAO0LBhcM89sOeeYT6VMWPCQoaNYejQoY1zIWkUyqdI\n06QCRWLXtWvoWDt/PsyaFUb+jBoVOtgecghMnZrfuVVGjRqVv5NLo1M+RZomFSiSN82ahT4pU6aE\nR0DXXgtffglHHx0eAf361/D44/GPAtJslemifIo0TSpQpFG0aROmz58zJzwCOv30MM9K377hjsvI\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -476,16 +502,16 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAg0AAAFjCAYAAAC+DjgjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X+U3HV97/HXOyEKG2KUJmQDZANardFSMIvKClKqskAq\nX1GUZdFTmliu1uRo15J47tHeRA6WbhC4mOARrtsL3NYhtMebAj2ViMf2NlpEd4X2tontrYSFEAIr\ngoEJEJL3/WNm2J39+ZnZ736/M599Ps7Zk+x3vt+Z9zcvdufN98d7zN0FAAAwlTl5FwAAAJoDTQMA\nAAhC0wAAAILQNAAAgCA0DQAAIAhNAwAACELTAAAAgtA0AACAIEflXcB4zOzXJJ0vaY+kF/OtBgCA\npnK0pJMl3efuv0jziRuyaVCpYfjLvIsAAKCJfVzSt9J8wkZtGvZI0l/8xV9oxYoVOZci9fT06MYb\nb2yI56tl25B1p1pnsscnemy85Wn/G04HeZLnTD1n2nlOtR55zuxz1rrdTP6M1rJ8165d+sQnPiGV\n30vT1KhNw4uStGLFCq1cuTLvWrRw4cJU65jO89Wybci6U60z2eMTPTbe8rT/DaeDPMlzpp4z7Tyn\nWo88Z/Y5a91uJn9Ga11elvrp/bmbNm1K+zmn7ctf/vJSSZ/61Kc+paVLl+ZdjiTp1FNPbZjnq2Xb\nkHWnWmeyxyd6bPTyG2+8UVdeeeWUtWSFPGt7bLblOZ3nTDvPqdYjz5l9zlq3m8mf0dDl+/bt0623\n3ipJt27atGnflAXVwBrxUy7NbKWk/v7+/obpfjE9J554ovbu3Zt3GUgJecaFPOMyMDCg9vZ2SWp3\n94E0n5tbLpGJ8n/AiAR5xoU8EarmpsHM3mtmd5vZXjM7YmbJFOt/2Mx2mNlTZvacmf3QzDrrLxnN\nqLu7O+8SkCLyjAt5IlQ9RxrmS3pI0mckhZzbOEfSDkkXSlop6fuS7jGz0+p4bTQpfinFhTzjQp4I\nVfPdE+7+HUnfkSQzs4D1e0Yt+qKZfUjSRZIervX1AQBAPjK/pqHcaCyQ9EzWr438rF69Ou8SkCLy\njAt5IlQecxrWq3SK464cXhs56ezkMpaYkGdcyDPciy9Kjz0mDQ5Kjz5a+rPy9/XrpQsuyLvCmZVp\n02Bml0v6E0mJuw9l+drIF+dM40KecSHPEnfpF78Y2xCM/H7//uptWlultjZp+XLp6KPzqTtLmZ2e\n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\n", + "image/png": "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\nJJT/D/4qo+iCHdmnAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -498,6 +524,15 @@ "plt.ylim(0)\n", "plt.grid()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -520,11 +555,16 @@ "version": "2.7.12" }, "latex_envs": { + "LaTeX_envs_menu_present": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, - "eqNumInitial": 0 + "eqNumInitial": 0, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false } }, "nbformat": 4, From 5052845f461beda41a8ee451883353d5cec10d0b Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Feb 2018 19:20:45 -0500 Subject: [PATCH 497/744] added saving of ROC curves and accumulated disruptions --- examples/performance_analysis.py | 5 ++++- plasma/utils/performance.py | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 4729a286..31568581 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -34,7 +34,8 @@ #P_thresh_opt = 0.566#0.566#0.92# analyzer.compute_tradeoffs_and_print_from_training() linestyle="-" -analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test',linestyle=linestyle) +P_thresh_range,missed_range,fp_range = analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test',linestyle=linestyle) +np.savez('test_roc.npz',"P_thresh_range",P_thresh_range,"missed_range",missed_range,"fp_range",fp_range) analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train',linestyle=linestyle) analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') @@ -55,6 +56,8 @@ alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') analyzer.hist_alarms(disr_alarms,'disruptive alarms, P thresh = {}'.format(P_thresh_opt),save_figure=save_figure,linestyle=linestyle) +np.savez('disruptive_alarms_test.npz',"disr_alarms",disr_alarms,"P_thresh_opt",P_thresh_opt) + print('{} disruptive alarms'.format(len(disr_alarms))) print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) print('{} seconds median alarm time'.format(np.median(disr_alarms[disr_alarms > 0]))) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 43bd6b5a..35ec16a9 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -551,7 +551,7 @@ def compute_tradeoffs_and_print_from_training(self): def compute_tradeoffs_and_plot(self,mode,save_figure=True,plot_string='',linestyle="-"): correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = self.get_metrics_vs_p_thresh(mode) - self.tradeoff_plot(accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=save_figure,plot_string=plot_string,linestyle=linestyle) + return self.tradeoff_plot(accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=save_figure,plot_string=plot_string,linestyle=linestyle) def get_prediction_type(self,TP,FP,FN,TN,early,late): if TP: @@ -834,7 +834,9 @@ def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,sa plt.ylim([0,1]) if save_figure: plt.savefig(title_str + '_roc.png',bbox_inches='tight',dpi=200) + np.savez(title_str + '_roc.npz',"P_thresh_range",P_thresh_range,"missed_range",missed_range,"fp_range",fp_range) print('ROC area ({}) is {}'.format(plot_string,self.roc_from_missed_fp(missed_range,fp_range))) + return P_thresh_range,missed_range,fp_range def get_pred_truth_disr_by_shot(self,shot): if shot in self.shot_list_test: From b6c0f3d28c857da88e30baccf79f305d739c4578 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Feb 2018 19:22:31 -0500 Subject: [PATCH 498/744] recasting to shotlist --- plasma/utils/performance.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 43bd6b5a..7ac711cf 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -12,7 +12,7 @@ from plasma.preprocessor.normalize import VarNormalizer as Normalizer from plasma.conf import conf -from plasma.primitives.shots import Shot +from plasma.primitives.shots import Shot,ShotList class PerformanceAnalyzer(): def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_warn = None, verbose = False,pred_ttd=False,conf=None): @@ -342,8 +342,8 @@ def load_ith_file(self): self.pred_test = dat['y_prime_test'] self.truth_test = dat['y_gold_test'] self.disruptive_test = dat['disruptive_test'] - self.shot_list_test = dat['shot_list_test'][()] - self.shot_list_train = dat['shot_list_train'][()] + self.shot_list_test = ShotList(dat['shot_list_test'][()]) + self.shot_list_train = ShotList(dat['shot_list_train'][()]) self.saved_conf = dat['conf'][()] self.conf['data']['T_warning'] = self.saved_conf['data']['T_warning'] #all files must agree on T_warning due to output of truth vs. normalized shot ttd. for mode in ['test','train']: From 85d4b8b6fdfdfbbd7251b670d56bf72a1ae72c30 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 7 Feb 2018 04:33:55 -0500 Subject: [PATCH 499/744] backwards compatibility for normalizer (check if signal has is_positive attribute). Plotting options for performance analyzer --- plasma/preprocessor/normalize.py | 7 +- plasma/utils/performance.py | 146 ++++++++++++++++--------------- 2 files changed, 80 insertions(+), 73 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 06e9ed3d..032ea4fb 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -411,6 +411,7 @@ def get_individual_shot_file(prepath,shot_num,ext='.txt'): def apply_positivity(shot): for (i,sig) in enumerate(shot.signals): - if sig.is_strictly_positive: - #print ('Applying positivity constraint to {} signal'.format(sig.description)) - shot.signals_dict[sig]=np.clip(shot.signals_dict[sig],0,np.inf) + if hasattr(sig,"is_strictly_positive"): #backwards compatibility when this attribute didn't exist + if sig.is_strictly_positive: + #print ('Applying positivity constraint to {} signal'.format(sig.description)) + shot.signals_dict[sig]=np.clip(shot.signals_dict[sig],0,np.inf) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index cd5a45f7..eb02b3b2 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -656,78 +656,84 @@ def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None, if(shot.previously_saved(self.shots_dir)): shot.restore(self.shots_dir) - t_disrupt = shot.t_disrupt - is_disruptive = shot.is_disruptive - if normalize: - self.normalizer.apply(shot) + if shot.signals_dict is not None: #make sure shot was saved with data + t_disrupt = shot.t_disrupt + is_disruptive = shot.is_disruptive + if normalize: + self.normalizer.apply(shot) - use_signals = self.saved_conf['paths']['use_signals'] - fontsize= 15 - lower_lim = 0 #len(pred) - plt.close() - colors = ["b","k"] - lss = ["-","--"] - f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False) - plt.title(prediction_type) - assert(np.all(shot.ttd.flatten() == truth.flatten())) - xx = range(len(prediction)) #list(reversed(range(len(pred)))) - for i,sig in enumerate(use_signals): - ax = axarr[i] - num_channels = sig.num_channels - sig_arr = shot.signals_dict[sig] - if num_channels == 1: - # if j == 0: - ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j]) - # else: - # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) - ax.plot([],linestyle="none",label = sig.description)#labels[sig]) - if np.min(sig_arr[:,0]) < 0: - ax.set_ylim([-6,6]) - ax.set_yticks([-5,0,5]) + use_signals = self.saved_conf['paths']['use_signals'] + fontsize= 15 + lower_lim = 0 #len(pred) + plt.close() + colors = ["b","k"] + lss = ["-","--"] + f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False) + plt.title(prediction_type) + assert(np.all(shot.ttd.flatten() == truth.flatten())) + xx = range(len(prediction)) #list(reversed(range(len(pred)))) + for i,sig in enumerate(use_signals): + ax = axarr[i] + num_channels = sig.num_channels + sig_arr = shot.signals_dict[sig] + if num_channels == 1: + # if j == 0: + ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j]) + # else: + # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) + ax.plot([],linestyle="none",label = sig.description)#labels[sig]) + if np.min(sig_arr[:,0]) < 0: + ax.set_ylim([-6,6]) + ax.set_yticks([-5,0,5]) + # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) + ax.plot([],linestyle="none",label = sig.description)#labels[sig]) + if np.min(sig_arr[:,0]) < 0: + ax.set_ylim([-6,6]) + ax.set_yticks([-5,0,5]) + else: + ax.set_ylim([0,8]) + ax.set_yticks([0,5]) + # ax.set_ylabel(labels[sig],size=fontsize) else: - ax.set_ylim([0,8]) - ax.set_yticks([0,5]) - # ax.set_ylabel(labels[sig],size=fontsize) - else: - ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description,cmap="inferno" ) - ax.set_ylim([0,num_channels]) - ax.text(lower_lim+200, 45, sig.description, bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize-5) - ax.set_yticks([0,num_channels/2]) - ax.set_yticklabels(["0","0.5"]) - ax.set_ylabel("$\\rho$",size=fontsize) - ax.legend(loc="best",labelspacing=0.1,fontsize=fontsize,frameon=False) - ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5) - plt.setp(ax.get_xticklabels(),visible=False) + ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description,cmap="inferno" ) + ax.set_ylim([0,num_channels]) + ax.text(lower_lim+200, 45, sig.description, bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize-5) + ax.set_yticks([0,num_channels/2]) + ax.set_yticklabels(["0","0.5"]) + ax.set_ylabel("$\\rho$",size=fontsize) + ax.legend(loc="best",labelspacing=0.1,fontsize=fontsize,frameon=False) + ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5) + plt.setp(ax.get_xticklabels(),visible=False) + plt.setp(ax.get_yticklabels(),fontsize=fontsize) + f.subplots_adjust(hspace=0) + #print(sig) + #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) + ax = axarr[-1] + # ax.semilogy((-truth+0.0001),label='ground truth') + # ax.plot(-prediction+0.0001,'g',label='neural net prediction') + # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') + # nn = np.min(pred) + ax.plot(xx,truth,'g',label='target',linewidth=2) + # ax.axhline(0.4,linestyle="--",color='k',label='threshold') + ax.plot(xx,prediction,'b',label='RNN output',linewidth=2) + ax.axhline(P_thresh_opt,linestyle="--",color='k',label='threshold') + ax.set_ylim([-2,2]) + ax.set_yticks([-1,0,1]) + # if len(truth)-T_max_warn >= 0: + # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time') + ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5)#,label='min warning time') + ax.set_xlabel('T [ms]',size=fontsize) + # ax.axvline(2400) + ax.legend(loc = (0.5,0.7),fontsize=fontsize-5,labelspacing=0.1,frameon=False) plt.setp(ax.get_yticklabels(),fontsize=fontsize) - f.subplots_adjust(hspace=0) - #print(sig) - #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) - ax = axarr[-1] - # ax.semilogy((-truth+0.0001),label='ground truth') - # ax.plot(-prediction+0.0001,'g',label='neural net prediction') - # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') - # nn = np.min(pred) - ax.plot(xx,truth,'g',label='target',linewidth=2) - # ax.axhline(0.4,linestyle="--",color='k',label='threshold') - ax.plot(xx,prediction,'b',label='RNN output',linewidth=2) - ax.axhline(P_thresh_opt,linestyle="--",color='k',label='threshold') - ax.set_ylim([-2,2]) - ax.set_yticks([-1,0,1]) - # if len(truth)-T_max_warn >= 0: - # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time') - ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5)#,label='min warning time') - ax.set_xlabel('T [ms]',size=fontsize) - # ax.axvline(2400) - ax.legend(loc = (0.5,0.7),fontsize=fontsize-5,labelspacing=0.1,frameon=False) - plt.setp(ax.get_yticklabels(),fontsize=fontsize) - plt.setp(ax.get_xticklabels(),fontsize=fontsize) - # plt.xlim(0,200) - plt.xlim([lower_lim,len(truth)]) - # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") - if save_fig: - plt.savefig('sig_fig_{}{}.png'.format(shot.number,extra_filename),bbox_inches='tight') - np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=prediction,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) - #plt.show() + plt.setp(ax.get_xticklabels(),fontsize=fontsize) + # plt.xlim(0,200) + plt.xlim([lower_lim,len(truth)]) + # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") + if save_fig: + plt.savefig('sig_fig_{}{}.png'.format(shot.number,extra_filename),bbox_inches='tight') + np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=prediction,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) + #plt.show() else: print("Shot hasn't been processed") @@ -834,7 +840,7 @@ def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,sa plt.ylim([0,1]) if save_figure: plt.savefig(title_str + '_roc.png',bbox_inches='tight',dpi=200) - np.savez(title_str + '_roc.npz',"P_thresh_range",P_thresh_range,"missed_range",missed_range,"fp_range",fp_range) + #np.savez(title_str + '_roc.npz',"P_thresh_range",P_thresh_range,"missed_range",missed_range,"fp_range",fp_range) print('ROC area ({}) is {}'.format(plot_string,self.roc_from_missed_fp(missed_range,fp_range))) return P_thresh_range,missed_range,fp_range From 8ce98dc672ee733804c9293475471727da173215 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 9 Feb 2018 06:42:49 -0500 Subject: [PATCH 500/744] fixed bug where all workers had the same numpy random seed (it gets reset to 0 in preprocessor). Thus need to explicitly give each worker a different random seed right before training. --- examples/mpi_learn.py | 3 +++ plasma/models/mpi_runner.py | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index a965a86b..7bc4ce8b 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -86,6 +86,9 @@ loader = Loader(conf,normalizer) print("...done") +#ensure training has a separate random seed for every worker +np.random.seed(task_index) +random.seed(task_index) if not only_predict: mpi_train(conf,shot_list_train,shot_list_validate,loader) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 2fad6bc2..8dde8b55 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -20,6 +20,7 @@ import time import datetime import numpy as np +import random from functools import partial import socket @@ -170,7 +171,8 @@ def get_val(self): class MPIModel(): def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01,num_batches_minimum=100): - # random.seed(task_index) + random.seed(task_index) + np.random.seed(task_index) self.epoch = 0 self.num_so_far = 0 self.num_so_far_accum = 0 @@ -640,6 +642,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None): + loader.set_inference_mode(False) conf['num_workers'] = comm.Get_size() From 480e303555fc37ef8955035e8805f8df57d610ef Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 9 Feb 2018 12:46:36 +0100 Subject: [PATCH 501/744] not saving from within preprocessor class --- plasma/utils/performance.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 35ec16a9..faa42478 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -834,7 +834,6 @@ def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,sa plt.ylim([0,1]) if save_figure: plt.savefig(title_str + '_roc.png',bbox_inches='tight',dpi=200) - np.savez(title_str + '_roc.npz',"P_thresh_range",P_thresh_range,"missed_range",missed_range,"fp_range",fp_range) print('ROC area ({}) is {}'.format(plot_string,self.roc_from_missed_fp(missed_range,fp_range))) return P_thresh_range,missed_range,fp_range From dea576eadfa6d2b47d566980f9dd00118a7e53fa Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 9 Feb 2018 06:49:23 -0500 Subject: [PATCH 502/744] conf update --- examples/conf.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 1d48aa12..54a9880a 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -3,21 +3,21 @@ #will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' -target: 'maxhinge' #'maxhinge' #'maxhinge' #'binary' #'hinge' +target: 'hinge' #'maxhinge' #'maxhinge' #'binary' #'hinge' num_gpus: 4 paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: jet_to_d3d_data #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: jet_data #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" data: - bleed_in: 5 #how many shots from the test sit to use in training? - bleed_in_repeat_fac: 10 + bleed_in: 0 #how many shots from the test sit to use in training? + bleed_in_repeat_fac: 1 #how many times to repeat shots in training and validation? bleed_in_remove_from_test: True bleed_in_equalize_sets: False signal_to_augment: None #'plasma current' #or None @@ -53,7 +53,7 @@ data: floatx: 'float32' model: - shallow: True + shallow: False shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training type: "xgboost" #"xgboost" #"xgboost" #"random_forest" "xgboost" From b080734f892fba9e1adde63b9b7ebf6b63c81f90 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 9 Feb 2018 07:31:32 -0500 Subject: [PATCH 503/744] implemented randomized cutting of first batch_size shots in the buffer. This means shots end at random times even at the beginning of training, which removes the bias that for the first couple of training iterations the RNN would only be exposed to the beginnings of various shots. --- plasma/models/loader.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index d3751701..56ba0021 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -88,10 +88,15 @@ def training_batch_generator(self,shot_list): yield X[start:end],y[start:end],reset_states_now,num_so_far,num_total epoch += 1 - def fill_training_buffer(self,Xbuff,Ybuff,end_indices,shot): + def fill_training_buffer(self,Xbuff,Ybuff,end_indices,shot,is_first_fill=False): sig,res = self.get_signal_result_from_shot(shot) - sig_len = res.shape[0] length = self.conf['model']['length'] + if is_first_fill:#cut signal to random position + cut_idx = np.random.randint(res.shape[0]-length+1) + sig = sig[cut_idx:] + res = res[cut_idx:] + + sig_len = res.shape[0] sig_len = (sig_len // length)*length #make divisible by lenth assert(sig_len > 0) batch_idx = np.where(end_indices == 0)[0][0] @@ -157,8 +162,10 @@ def training_batch_generator_partial_reset(self,shot_list): num_total = len(shot_list) num_so_far = 0 returned = False + num_steps = 0 warmup_steps = self.conf['training']['batch_generator_warmup_steps'] - is_warmup_period = warmup_steps > 0 + is_warmup_period = num_steps < warmup_steps + is_first_fill = num_steps < batch_size while True: # the list of all shots shot_list.shuffle() @@ -174,11 +181,12 @@ def training_batch_generator_partial_reset(self,shot_list): X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) yield X,Y,batches_to_reset,num_so_far,num_total,is_warmup_period returned = True - warmup_steps -= 1 - is_warmup_period = warmup_steps > 0 + num_steps += 1 + is_warmup_period = num_steps < warmup_steps + is_first_fill = num_steps < batch_size batches_to_reset[:] = False - Xbuff,Ybuff,batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot) + Xbuff,Ybuff,batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot,is_first_fill) batches_to_reset[batch_idx] = True if returned and not is_warmup_period: num_so_far += 1 From e06bcb160698fd3cb3cd2d370a3897216f68e337 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 9 Feb 2018 07:42:44 -0500 Subject: [PATCH 504/744] removed print --- plasma/models/builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index da3274d7..e1913b85 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -183,7 +183,7 @@ def slicer_output_shape(input_shape,indices): pre_rnn = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) - pre_rnn_model.summary() + #pre_rnn_model.summary() x_input = Input(batch_shape = batch_input_shape) x_in = TimeDistributed(pre_rnn_model) (x_input) From e21f431881ff302a60ee66ec0b24a36a56219120 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 9 Feb 2018 08:01:45 -0500 Subject: [PATCH 505/744] modified printout to add walltime --- plasma/models/mpi_runner.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 8dde8b55..6a6c34f9 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -173,6 +173,7 @@ class MPIModel(): def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01,num_batches_minimum=100): random.seed(task_index) np.random.seed(task_index) + self.start_time = time.time() self.epoch = 0 self.num_so_far = 0 self.num_so_far_accum = 0 @@ -468,7 +469,7 @@ def train_epoch(self): loss_averager.add_val(curr_loss) ave_loss = loss_averager.get_val() eta = self.estimate_remaining_time(t0 - t_start,self.num_so_far-self.epoch*num_total,num_total) - write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | '.format(self.task_index,step,eta,1.0*self.num_so_far,num_total,ave_loss,curr_loss) + write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | walltime: {:.4f} | '.format(self.task_index,step,eta,1.0*self.num_so_far,num_total,ave_loss,curr_loss,time.time()-self.start_time) print_unique(write_str + write_str_0) step += 1 else: From 9aded7f49feeecc24a79c2ec9932c07a4a0beec3 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 23 Feb 2018 15:50:55 -0500 Subject: [PATCH 506/744] Add a config parameter to control loss scaling. Default is 1.0 --- examples/conf.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/conf.yaml b/examples/conf.yaml index c59d00d2..b7f8244b 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -54,6 +54,7 @@ data: floatx: 'float32' model: + loss_scale_factor: 1.0 use_bidirectional: false use_batch_norm: false shallow: False From d44a2f62cdb0534cbc9194292b107aad0e5e869a Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 23 Feb 2018 15:51:56 -0500 Subject: [PATCH 507/744] =?UTF-8?q?=20Unscale=20gradients=20by=20DUMMY=5FL?= =?UTF-8?q?R=20factor=20before=20subtracting,=20unscale=20loss=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plasma/models/mpi_runner.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 6a6c34f9..d70d80df 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -130,9 +130,6 @@ def __init__(self,lr): def get_deltas(self,raw_deltas): - if K.floatx() == "float16": - raw_deltas[:] = map(lambda w: w.astype(np.float32),raw_deltas) - if self.iterations == 0: self.m_list = [np.zeros_like(g) for g in raw_deltas] self.v_list = [np.zeros_like(g) for g in raw_deltas] @@ -150,9 +147,6 @@ def get_deltas(self,raw_deltas): self.iterations += 1 - if K.floatx() == "float16": - deltas[:] = map(lambda w: w.astype(np.float16),deltas) - return deltas @@ -258,10 +252,17 @@ def train_on_batch_and_get_deltas(self,X_batch,Y_batch,verbose=False): weights_after_update = self.model.get_weights() self.model.set_weights(weights_before_update) + + #unscale before subtracting + weights_before_update = multiply_params(weights_before_update,1.0/self.DUMMY_LR) + weights_after_update = multiply_params(weights_after_update,1.0/self.DUMMY_LR) deltas = subtract_params(weights_after_update,weights_before_update) - deltas = multiply_params(deltas,1.0/self.DUMMY_LR) - + + #unscale loss + if conf['model']['loss_scale_factor'] != 1.0: + deltas = multiply_params(deltas,1.0/conf['model']['loss_scale_factor']) + return deltas,loss From 210ede80982a2b324de0dd39dde9c21754be3f11 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 23 Feb 2018 15:52:39 -0500 Subject: [PATCH 508/744] Add loss scaling option to targets --- plasma/models/targets.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 0823f459..7f214702 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,6 +5,8 @@ from plasma.utils.evaluation import mae_np,mse_np,binary_crossentropy_np,hinge_np,squared_hinge_np import keras.backend as K +import plasma.conf + #Requirement: larger value must mean disruption more likely. class Target(object): activation = 'linear' @@ -12,7 +14,7 @@ class Target(object): @abc.abstractmethod def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @abc.abstractmethod def remapper(ttd,T_warning): @@ -29,7 +31,7 @@ class BinaryTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return binary_crossentropy_np(y_true,y_pred) + return conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): @@ -51,7 +53,7 @@ class TTDTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning): @@ -85,7 +87,6 @@ def remapper(ttd,T_warning): def threshold_range(T_warning): return np.logspace(-6,np.log10(T_warning),100) - class TTDLinearTarget(Target): activation = 'linear' @@ -93,7 +94,7 @@ class TTDLinearTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod @@ -128,7 +129,7 @@ def loss(y_true, y_pred): weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return weight_mask*squared_hinge(y_true,y_pred1) - return overall_fac*weight_mask*hinge(y_true,y_pred1) + return conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) @staticmethod def loss_np(y_true, y_pred): @@ -144,7 +145,7 @@ def loss_np(y_true, y_pred): weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances - return np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances + return conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances # def _loss_tensor_old(y_true, y_pred): @@ -174,7 +175,7 @@ class HingeTarget(Target): @staticmethod def loss_np(y_true, y_pred): - return hinge_np(y_true,y_pred) + return conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) #return squared_hinge_np(y_true,y_pred) @staticmethod @@ -188,4 +189,3 @@ def remapper(ttd,T_warning,as_array_of_shots=True): @staticmethod def threshold_range(T_warning): return np.concatenate((np.linspace(-2,-1.06,100),np.linspace(-1.06,-0.96,100),np.linspace(-0.96,2,50))) - From 151738c743d1bb1e404598a25bae323296d531d0 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Fri, 23 Feb 2018 15:53:40 -0500 Subject: [PATCH 509/744] Use scratch gpfs on Tigergpu - SSDs --- examples/slurm.cmd | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index 16af0d4f..1e22ad99 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -1,5 +1,5 @@ #!/bin/bash -#SBATCH -t 01:30:00 +#SBATCH -t 01:00:00 #SBATCH -N 3 #SBATCH --ntasks-per-node=4 #SBATCH --ntasks-per-socket=2 @@ -7,21 +7,19 @@ #SBATCH -c 4 #SBATCH --mem-per-cpu=0 -export PYTHONHASHSEED=0 -module load anaconda -source activate pppl +module load anaconda/4.4.0 +source activate PPPL module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 intel-mkl/2017.3/4/64 +module load intel/17.0/64/17.0.4.196 #remove checkpoints for a benchmark run -rm /tigress/$USER/model_checkpoints/* -rm /tigress/$USER/results/* -rm /tigress/$USER/csv_logs/* -rm /tigress/$USER/Graph/* -rm /tigress/$USER/normalization/* +rm /scratch/gpfs/$USER/model_checkpoints/* +rm /scratch/gpfs/$USER/results/* +rm /scratch/gpfs/$USER/csv_logs/* +rm /scratch/gpfs/$USER/Graph/* +rm /scratch/gpfs/$USER/normalization/* export OMPI_MCA_btl="tcp,self,sm" - srun python mpi_learn.py From ac7df4e3e8a5cb234c696484c75e36fd30ee6320 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Mar 2018 19:20:16 -0500 Subject: [PATCH 510/744] make normalizer resilient for when conf does not contain norm_stat_range --- plasma/preprocessor/normalize.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index f9f23ac0..794e7837 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -43,7 +43,9 @@ def __init__(self,conf): self.remapper = conf['data']['target'].remapper self.machines = set() self.inference_mode = False - self.bound = self.conf['data']['norm_stat_range'] + self.bound = np.Inf + if 'norm_stat_range' in self.conf['data']: + self.bound = self.conf['data']['norm_stat_range'] @abc.abstractmethod def __str__(self): @@ -193,7 +195,9 @@ def __init__(self,conf): Normalizer.__init__(self,conf) self.means = dict() self.stds = dict() - self.bound = self.conf['data']['norm_stat_range'] + self.bound = np.Inf + if 'norm_stat_range' in self.conf['data']: + self.bound = self.conf['data']['norm_stat_range'] def __str__(self): s = '' @@ -335,7 +339,9 @@ def __init__(self,conf): Normalizer.__init__(self,conf) self.minimums = None self.maximums = None - self.bound = self.conf['data']['norm_stat_range'] + self.bound = np.Inf + if 'norm_stat_range' in self.conf['data']: + self.bound = self.conf['data']['norm_stat_range'] def __str__(self): From 735e1c26a2e9269b14e35dfc31db1baac5d08c44 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Mar 2018 19:28:06 -0500 Subject: [PATCH 511/744] remove bidirectional RNN since it violates causality. Add resilience for when batch_normalization is not defined in the conf --- plasma/models/builder.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index e1913b85..f4e466b6 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -72,12 +72,13 @@ def get_0D_1D_indices(self): def build_model(self,predict,custom_batch_size=None): conf = self.conf model_conf = conf['model'] - use_bidirectional = model_conf['use_bidirectional'] rnn_size = model_conf['rnn_size'] rnn_type = model_conf['rnn_type'] regularization = model_conf['regularization'] dense_regularization = model_conf['dense_regularization'] - use_batch_norm = model_conf['use_batch_norm'] + use_batch_norm = False + if 'use_batch_norm' in model_conf: + use_batch_norm = model_conf['use_batch_norm'] dropout_prob = model_conf['dropout_prob'] length = model_conf['length'] @@ -187,12 +188,6 @@ def slicer_output_shape(input_shape,indices): x_input = Input(batch_shape = batch_input_shape) x_in = TimeDistributed(pre_rnn_model) (x_input) - if use_bidirectional: - for _ in range(model_conf['rnn_layers']): - x_in = Bidirectional(rnn_model(rnn_size, return_sequences=return_sequences, - stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob)) (x_in) - x_in = Dropout(dropout_prob) (x_in) else: for _ in range(model_conf['rnn_layers']): x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, From 76a566ecfade9cebcbfcc3c103c8c011b336856e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 6 Mar 2018 19:32:19 -0500 Subject: [PATCH 512/744] remove bidirectional RNN since it violates causality. Add resilience for when batch_normalization is not defined in the conf --- plasma/models/builder.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index f4e466b6..8d63aeb7 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -188,12 +188,11 @@ def slicer_output_shape(input_shape,indices): x_input = Input(batch_shape = batch_input_shape) x_in = TimeDistributed(pre_rnn_model) (x_input) - else: - for _ in range(model_conf['rnn_layers']): - x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, - stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) - x_in = Dropout(dropout_prob) (x_in) + for _ in range(model_conf['rnn_layers']): + x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, + stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) + x_in = Dropout(dropout_prob) (x_in) if return_sequences: #x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) From e42ba53176466995156c84ca08ee6f6fe7cdfd16 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 11 Mar 2018 05:12:03 -0400 Subject: [PATCH 513/744] After 2.0.6, keras Model does not have stop_training attribute. Only added in the callback --- plasma/models/mpi_runner.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index d70d80df..3f5bdf3b 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -185,6 +185,7 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No self.num_workers = comm.Get_size() self.task_index = comm.Get_rank() self.history = cbks.History() + self.model.stop_training = False if num_replicas is None or num_replicas < 1 or num_replicas > self.num_workers: self.num_replicas = self.num_workers else: @@ -736,7 +737,6 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non epoch_logs['train_loss'] = ave_loss best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']],best_so_far) - stop_training = False if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) print('Training Loss numpy: {:.3e}'.format(ave_loss)) @@ -747,8 +747,6 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('Training ROC: {:.4f}'.format(roc_area_train)) callbacks.on_epoch_end(int(round(e)), epoch_logs) - if hasattr(mpi_model.model,'stop_training'): - stop_training = mpi_model.model.stop_training if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving print("Not saving model weights") specific_builder.delete_model_weights(train_model,int(round(e))) @@ -759,7 +757,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non val_steps = 1 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) - stop_training = comm.bcast(stop_training,root=0) + stop_training = comm.bcast(mpi_model.model.stop_training,root=0) if stop_training: print("Stopping training due to early stopping") break From 7484c1192a8331b165a4d87d946dcb907187e437 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Sun, 11 Mar 2018 05:14:01 -0400 Subject: [PATCH 514/744] Relax Keras version requirement now --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 59e70b94..ab3be99f 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ download_url = "https://github.com/PPPLDeepLearning/plasma-python", #license = "Apache Software License v2", test_suite = "tests", - install_requires = ['keras==2.0.6','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], + install_requires = ['keras>2.0.8','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], tests_require = [], classifiers = ["Development Status :: 3 - Alpha", "Environment :: Console", From 5aa60ed6707b5103265056de33345dd9f0bb5423 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 12 Mar 2018 19:41:36 +0300 Subject: [PATCH 515/744] Import error in targets --- plasma/models/targets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 7f214702..0ce7a25c 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,7 +5,7 @@ from plasma.utils.evaluation import mae_np,mse_np,binary_crossentropy_np,hinge_np,squared_hinge_np import keras.backend as K -import plasma.conf +import plasma.conf as conf #Requirement: larger value must mean disruption more likely. class Target(object): From 541d98e24689ef5a1686db2c8515e20755de3ab2 Mon Sep 17 00:00:00 2001 From: Alexey Svyatkovskiy Date: Mon, 12 Mar 2018 19:59:00 +0300 Subject: [PATCH 516/744] Bug fix: proper plasma.conf import --- plasma/models/targets.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 0ce7a25c..c311a89f 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,7 +5,7 @@ from plasma.utils.evaluation import mae_np,mse_np,binary_crossentropy_np,hinge_np,squared_hinge_np import keras.backend as K -import plasma.conf as conf +import plasma.conf #Requirement: larger value must mean disruption more likely. class Target(object): @@ -14,7 +14,7 @@ class Target(object): @abc.abstractmethod def loss_np(y_true,y_pred): - return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + return plasma.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @abc.abstractmethod def remapper(ttd,T_warning): @@ -31,7 +31,7 @@ class BinaryTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) + return plasma.conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): @@ -53,7 +53,7 @@ class TTDTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + return plasma.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning): @@ -94,7 +94,7 @@ class TTDLinearTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + return plasma.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod @@ -129,7 +129,7 @@ def loss(y_true, y_pred): weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return weight_mask*squared_hinge(y_true,y_pred1) - return conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) + return plasma.conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) @staticmethod def loss_np(y_true, y_pred): @@ -145,7 +145,7 @@ def loss_np(y_true, y_pred): weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances - return conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances + return plasma.conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances # def _loss_tensor_old(y_true, y_pred): @@ -175,7 +175,7 @@ class HingeTarget(Target): @staticmethod def loss_np(y_true, y_pred): - return conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) + return plasma.conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) #return squared_hinge_np(y_true,y_pred) @staticmethod From 48e314d13201efb1af7cb7fb13d5f251406c8829 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 12 Mar 2018 15:29:02 -0400 Subject: [PATCH 517/744] Defer import causing a cyclic dependency until later. Only needed in Python 2 --- plasma/conf_parser.py | 14 +++++++------- plasma/models/targets.py | 23 ++++++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 1dea38b3..f5190d35 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -1,4 +1,3 @@ -import plasma.models.targets as t from plasma.primitives.shots import ShotListFiles from data.signals import * @@ -10,6 +9,7 @@ def parameters(input_file): """Parse yaml file of configuration parameters.""" + import plasma.models with open(input_file, 'r') as yaml_file: params = yaml.load(yaml_file) @@ -43,18 +43,18 @@ def parameters(input_file): #ensure shallow model has +1 -1 target. if params['model']['shallow'] or params['target'] == 'hinge': - params['data']['target'] = t.HingeTarget + params['data']['target'] = plasma.models.targets.HingeTarget elif params['target'] == 'maxhinge': t.MaxHingeTarget.fac = params['data']['positive_example_penalty'] - params['data']['target'] = t.MaxHingeTarget + params['data']['target'] = plasma.models.targets.MaxHingeTarget elif params['target'] == 'binary': - params['data']['target'] = t.BinaryTarget + params['data']['target'] = plasma.models.targets.BinaryTarget elif params['target'] == 'ttd': - params['data']['target'] = t.TTDTarget + params['data']['target'] = plasma.models.targets.TTDTarget elif params['target'] == 'ttdinv': - params['data']['target'] = t.TTDInvTarget + params['data']['target'] = plasma.models.targets.TTDInvTarget elif params['target'] == 'ttdlinear': - params['data']['target'] = t.TTDLinearTarget + params['data']['target'] = plasma.models.targets.TTDLinearTarget else: print('Unkown type of target. Exiting') exit(1) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index c311a89f..c409fa68 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,8 +5,6 @@ from plasma.utils.evaluation import mae_np,mse_np,binary_crossentropy_np,hinge_np,squared_hinge_np import keras.backend as K -import plasma.conf - #Requirement: larger value must mean disruption more likely. class Target(object): activation = 'linear' @@ -14,7 +12,8 @@ class Target(object): @abc.abstractmethod def loss_np(y_true,y_pred): - return plasma.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + import plasma.conf + return plasma.conf.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @abc.abstractmethod def remapper(ttd,T_warning): @@ -31,7 +30,8 @@ class BinaryTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return plasma.conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) + import plasma.conf + return plasma.conf.conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): @@ -53,7 +53,8 @@ class TTDTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return plasma.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + import plasma.conf + return plasma.conf.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning): @@ -94,7 +95,8 @@ class TTDLinearTarget(Target): @staticmethod def loss_np(y_true,y_pred): - return plasma.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + import plasma.conf + return plasma.conf.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod @@ -118,6 +120,7 @@ class MaxHingeTarget(Target): @staticmethod def loss(y_true, y_pred): + import plasma.conf fac = MaxHingeTarget.fac #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) @@ -129,10 +132,11 @@ def loss(y_true, y_pred): weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return weight_mask*squared_hinge(y_true,y_pred1) - return plasma.conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) + return plasma.conf.conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) @staticmethod def loss_np(y_true, y_pred): + import plasma.conf fac = MaxHingeTarget.fac #print(y_pred.shape) overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) @@ -145,7 +149,7 @@ def loss_np(y_true, y_pred): weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances - return plasma.conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances + return plasma.conf.conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances # def _loss_tensor_old(y_true, y_pred): @@ -175,7 +179,8 @@ class HingeTarget(Target): @staticmethod def loss_np(y_true, y_pred): - return plasma.conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) + import plasma.conf + return plasma.conf.conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) #return squared_hinge_np(y_true,y_pred) @staticmethod From d4270cd705181c24b17913a19582038d428b8d0f Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 12 Mar 2018 15:46:35 -0400 Subject: [PATCH 518/744] Defer import causing a cyclic dependency until later. Only needed in Python 2 --- plasma/conf_parser.py | 14 +++++++------- plasma/models/targets.py | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index f5190d35..b97b0ca7 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -9,7 +9,7 @@ def parameters(input_file): """Parse yaml file of configuration parameters.""" - import plasma.models + from plasma.models.targets import HingeTarget, MaxHingeTarget, BinaryTarget, TTDTarget, TTDInvTarget, TTDLinearTarget with open(input_file, 'r') as yaml_file: params = yaml.load(yaml_file) @@ -43,18 +43,18 @@ def parameters(input_file): #ensure shallow model has +1 -1 target. if params['model']['shallow'] or params['target'] == 'hinge': - params['data']['target'] = plasma.models.targets.HingeTarget + params['data']['target'] = HingeTarget elif params['target'] == 'maxhinge': t.MaxHingeTarget.fac = params['data']['positive_example_penalty'] - params['data']['target'] = plasma.models.targets.MaxHingeTarget + params['data']['target'] = MaxHingeTarget elif params['target'] == 'binary': - params['data']['target'] = plasma.models.targets.BinaryTarget + params['data']['target'] = BinaryTarget elif params['target'] == 'ttd': - params['data']['target'] = plasma.models.targets.TTDTarget + params['data']['target'] = TTDTarget elif params['target'] == 'ttdinv': - params['data']['target'] = plasma.models.targets.TTDInvTarget + params['data']['target'] = TTDInvTarget elif params['target'] == 'ttdlinear': - params['data']['target'] = plasma.models.targets.TTDLinearTarget + params['data']['target'] = TTDLinearTarget else: print('Unkown type of target. Exiting') exit(1) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index c409fa68..7aa3df6c 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -12,8 +12,8 @@ class Target(object): @abc.abstractmethod def loss_np(y_true,y_pred): - import plasma.conf - return plasma.conf.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + from plasma.conf import conf + return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @abc.abstractmethod def remapper(ttd,T_warning): @@ -30,8 +30,8 @@ class BinaryTarget(Target): @staticmethod def loss_np(y_true,y_pred): - import plasma.conf - return plasma.conf.conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) + from plasma.conf import conf + return conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning,as_array_of_shots=True): @@ -53,8 +53,8 @@ class TTDTarget(Target): @staticmethod def loss_np(y_true,y_pred): - import plasma.conf - return plasma.conf.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + from plasma.conf import conf + return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod def remapper(ttd,T_warning): @@ -95,8 +95,8 @@ class TTDLinearTarget(Target): @staticmethod def loss_np(y_true,y_pred): - import plasma.conf - return plasma.conf.conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + from plasma.conf import conf + return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) @staticmethod @@ -120,7 +120,7 @@ class MaxHingeTarget(Target): @staticmethod def loss(y_true, y_pred): - import plasma.conf + from plasma.conf import conf fac = MaxHingeTarget.fac #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) @@ -132,11 +132,11 @@ def loss(y_true, y_pred): weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return weight_mask*squared_hinge(y_true,y_pred1) - return plasma.conf.conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) + return conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) @staticmethod def loss_np(y_true, y_pred): - import plasma.conf + from plasma.conf import conf fac = MaxHingeTarget.fac #print(y_pred.shape) overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) @@ -149,7 +149,7 @@ def loss_np(y_true, y_pred): weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! weight_mask = fac*weight_mask + (1 - weight_mask) #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances - return plasma.conf.conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances + return conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances # def _loss_tensor_old(y_true, y_pred): @@ -179,8 +179,8 @@ class HingeTarget(Target): @staticmethod def loss_np(y_true, y_pred): - import plasma.conf - return plasma.conf.conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) + from plasma.conf import conf + return conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) #return squared_hinge_np(y_true,y_pred) @staticmethod From 66cf3f8ac69483e019da13ef2be8f210be44c737 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 12 Mar 2018 15:50:03 -0400 Subject: [PATCH 519/744] Fix t.MaxHingeTarget.fac -> MaxHingeTarget.fac --- plasma/conf_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index b97b0ca7..97ec81ae 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -45,7 +45,7 @@ def parameters(input_file): if params['model']['shallow'] or params['target'] == 'hinge': params['data']['target'] = HingeTarget elif params['target'] == 'maxhinge': - t.MaxHingeTarget.fac = params['data']['positive_example_penalty'] + MaxHingeTarget.fac = params['data']['positive_example_penalty'] params['data']['target'] = MaxHingeTarget elif params['target'] == 'binary': params['data']['target'] = BinaryTarget From 1d5cf00dc17d60276adaa27a103b87ddfa33ea8e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 19 Mar 2018 14:12:21 -0400 Subject: [PATCH 520/744] supporting logging of val and test roc values for various T_min_warn times --- examples/mpi_learn.py | 2 +- plasma/models/mpi_runner.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 7bc4ce8b..9b38cc07 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -90,7 +90,7 @@ np.random.seed(task_index) random.seed(task_index) if not only_predict: - mpi_train(conf,shot_list_train,shot_list_validate,loader) + mpi_train(conf,shot_list_train,shot_list_validate,loader,shot_list_test=shot_list_test) #load last model for testing loader.set_inference_mode(True) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 6a6c34f9..dbdcfbd4 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -23,6 +23,7 @@ import random from functools import partial +from copy import deepcopy import socket sys.setrecursionlimit(10000) import getpass @@ -642,7 +643,7 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): return y_prime,y_gold,disruptive,roc_area,loss -def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None): +def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None,shot_list_test=None): loader.set_inference_mode(False) conf['num_workers'] = comm.Get_size() @@ -730,6 +731,17 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.batch_iterator_func.__exit__() mpi_model.num_so_far_accum = mpi_model.num_so_far_indiv mpi_model.set_batch_iterator_func() + if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: + conf_curr = deepcopy(conf) + T_min_warn_orig = conf['data']['T_min_warn'] + for T_min_curr in conf_curr['callbacks']['monitor_times']: + conf_curr['data']['T_min_warn'] = T_min_curr + assert(conf['data']['T_min_warn'] == T_min_warn_orig) + if shot_list_test is not None: + _,_,_,roc_area_t,_ = mpi_make_predictions_and_evaluate(conf_curr,shot_list_test,loader) + epoch_logs['test_roc_{}'.format(T_min_curr)] = roc_area_t + _,_,_,roc_area_v,_ = mpi_make_predictions_and_evaluate(conf_curr,shot_list_validate,loader) + epoch_logs['val_roc_{}'.format(T_min_curr)] = roc_area_v epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss From 34f66b67549a44384d89a23fa9c4e596974000df Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 19 Mar 2018 15:52:09 -0400 Subject: [PATCH 521/744] modified performance analyzer to handle case where shot is shorter than T_min_warn --- plasma/utils/performance.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 7bbb9538..6abac58e 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -188,8 +188,11 @@ def get_threshold_arrays(self,preds,truths,disruptives): d_early_thresholds.append(-np.inf) else: d_early_thresholds.append(np.max(pred[early_indices])) - - d_correct_thresholds.append(np.max(pred[correct_indices])) + + if np.sum(correct_indices) == 0: + d_correct_thresholds.append(-np.inf) + else: + d_correct_thresholds.append(np.max(pred[correct_indices])) else: nd_thresholds.append(np.max(pred)) return np.array(d_early_thresholds), np.array(d_correct_thresholds),np.array(d_late_thresholds), np.array(nd_thresholds) From 8aa5c1ae7cd087cd0ca54cf2b643dbb0158d8916 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 20 Mar 2018 20:29:51 -0400 Subject: [PATCH 522/744] implemented more general hash that allows deep copies of the conf to maintain the hash --- plasma/models/builder.py | 14 ++++++++++---- plasma/models/mpi_runner.py | 1 + plasma/utils/downloading.py | 22 ++++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 8d63aeb7..82ef1144 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -19,7 +19,7 @@ import os,sys import numpy as np from copy import deepcopy -from plasma.utils.downloading import makedirs_process_safe +from plasma.utils.downloading import makedirs_process_safe,general_object_hash import hashlib @@ -31,18 +31,22 @@ def on_batch_end(self, batch, logs=None): self.losses.append(logs.get('loss')) + class ModelBuilder(object): def __init__(self,conf): self.conf = conf def get_unique_id(self): - num_epochs = self.conf['training']['num_epochs'] + #num_epochs = self.conf['training']['num_epochs'] this_conf = deepcopy(self.conf) - #don't make hash dependent on number of epochs. + #don't make hash dependent on number of epochs or T_min_warn as those can be modified this_conf['training']['num_epochs'] = 0 - unique_id = int(hashlib.md5((dill.dumps(this_conf).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + this_conf['data']['T_min_warn'] = 30 + #unique_id = int(hashlib.md5((dill.dumps(this_conf).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + unique_id = general_object_hash(this_conf) return unique_id + def get_0D_1D_indices(self): #make sure all 1D indices are contiguous in the end! use_signals = self.conf['paths']['use_signals'] @@ -270,6 +274,8 @@ def get_all_saved_files(self): self.ensure_save_directory() unique_id = self.get_unique_id() filenames = os.listdir(self.conf['paths']['model_save_path']) + print("All saved files with id {} and path {}".format(unique_id,self.conf['paths']['model_save_path'])) + print(filenames) epochs = [] for file in filenames: curr_id,epoch = self.extract_id_and_epoch_from_filename(file) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index dbdcfbd4..d4a4ea51 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -731,6 +731,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.batch_iterator_func.__exit__() mpi_model.num_so_far_accum = mpi_model.num_so_far_indiv mpi_model.set_batch_iterator_func() + if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: conf_curr = deepcopy(conf) T_min_warn_orig = conf['data']['T_min_warn'] diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 8980ebde..7cf2d48e 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -26,6 +26,8 @@ import os import errno +import dill,hashlib + # import gadata # from plasma.primitives.shots import ShotList @@ -34,6 +36,26 @@ #print("Importing numpy version"+np.__version__) +def general_object_hash(o): + """Makes a hash from a dictionary, list, tuple or set to any level, that contains + only other hashable types (including any lists, tuples, sets, and + dictionaries). Relies on dill for serialization""" + + if isinstance(o, (set, tuple, list)): + return tuple([make_hash(e) for e in o]) + + elif not isinstance(o, dict): + return myhash(o) + + new_o = deepcopy(o) + for k, v in new_o.items(): + new_o[k] = make_hash(v) + + return myhash(tuple(frozenset(sorted(new_o.items())))) + +def myhash(x): + return int(hashlib.md5((dill.dumps(x).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + def get_missing_value_array(): return np.array([-1.0]) From 375326a95488b73c67c461f9cee45fc1fb547636 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 20 Mar 2018 20:31:21 -0400 Subject: [PATCH 523/744] implemented more general hash that allows deep copies of the conf to maintain the hash --- plasma/utils/downloading.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 7cf2d48e..ad5e8a38 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -27,6 +27,7 @@ import errno import dill,hashlib +from copy import deepcopy # import gadata From 68eb2870853464bcafea1404ee05fa7e28a3df78 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 20 Mar 2018 21:22:58 -0400 Subject: [PATCH 524/744] whitespace --- plasma/models/builder.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 82ef1144..2cbf7eeb 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -274,8 +274,6 @@ def get_all_saved_files(self): self.ensure_save_directory() unique_id = self.get_unique_id() filenames = os.listdir(self.conf['paths']['model_save_path']) - print("All saved files with id {} and path {}".format(unique_id,self.conf['paths']['model_save_path'])) - print(filenames) epochs = [] for file in filenames: curr_id,epoch = self.extract_id_and_epoch_from_filename(file) From cfc36fe5c5ba4baa658b8fa2332c587180a1db1c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 20 Mar 2018 21:23:28 -0400 Subject: [PATCH 525/744] option for just a single profile --- plasma/conf_parser.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 1dea38b3..a13ca7e4 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -97,6 +97,14 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals_1D + elif params['paths']['data'] == 'jet_data_temp_profile': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = {'etemp_profile' : etemp_profile} + elif params['paths']['data'] == 'jet_data_dens_profile': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall] + params['paths']['use_signals_dict'] = {'edens_profile' : edens_profile} elif params['paths']['data'] == 'jet_carbon_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] @@ -154,6 +162,14 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = fully_defined_signals_0D + elif params['paths']['data'] == 'd3d_data_temp_profile': #jet data but with fully defined signals + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = {'etemp_profile' : etemp_profile}#fully_defined_signals_0D + elif params['paths']['data'] == 'd3d_data_dens_profile': #jet data but with fully defined signals + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = {'edens_profile' : edens_profile}#fully_defined_signals_0D #cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': From a6f58a10be65d1bbce0c848026ac9b686cb0b246 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Tue, 20 Mar 2018 21:35:25 -0400 Subject: [PATCH 526/744] small function naming bug --- plasma/utils/downloading.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index ad5e8a38..65a9bfa0 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -43,14 +43,14 @@ def general_object_hash(o): dictionaries). Relies on dill for serialization""" if isinstance(o, (set, tuple, list)): - return tuple([make_hash(e) for e in o]) + return tuple([general_object_hash(e) for e in o]) elif not isinstance(o, dict): return myhash(o) new_o = deepcopy(o) for k, v in new_o.items(): - new_o[k] = make_hash(v) + new_o[k] = general_object_hash(v) return myhash(tuple(frozenset(sorted(new_o.items())))) From 6d25d3712c0cc0e4eaeb7636982412bbac884197 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 21 Mar 2018 15:37:38 -0400 Subject: [PATCH 527/744] printing roc values to log --- plasma/models/mpi_runner.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index d4a4ea51..d96adda1 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -740,9 +740,11 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non assert(conf['data']['T_min_warn'] == T_min_warn_orig) if shot_list_test is not None: _,_,_,roc_area_t,_ = mpi_make_predictions_and_evaluate(conf_curr,shot_list_test,loader) - epoch_logs['test_roc_{}'.format(T_min_curr)] = roc_area_t + print_unique('epoch {}, test_roc_{} = {}'.format(int(round(e)),T_min_curr,roc_area_t)) + #epoch_logs['test_roc_{}'.format(T_min_curr)] = roc_area_t _,_,_,roc_area_v,_ = mpi_make_predictions_and_evaluate(conf_curr,shot_list_validate,loader) - epoch_logs['val_roc_{}'.format(T_min_curr)] = roc_area_v + print_unique('epoch {}, val_roc_{} = {}'.format(int(round(e)),T_min_curr,roc_area_v)) + #epoch_logs['val_roc_{}'.format(T_min_curr)] = roc_area_v epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss From 8bf886af0071ffd6dab35c72d37e09b563d03431 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Wed, 21 Mar 2018 22:01:20 -0400 Subject: [PATCH 528/744] adding support for pytorch model --- examples/learn.py | 4 +- plasma/models/loader.py | 129 +++++++++- plasma/models/torch_runner.py | 464 ++++++++++++++++++++++++++++++++++ 3 files changed, 589 insertions(+), 8 deletions(-) create mode 100644 plasma/models/torch_runner.py diff --git a/examples/learn.py b/examples/learn.py index 14eae8fb..a1b9a94a 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -33,7 +33,9 @@ from plasma.preprocessor.preprocess import Preprocessor, guarantee_preprocessed from plasma.models.loader import Loader -if conf['model']['shallow']: +if conf['model']['torch']: + from plasma.models.torch_runner import train, make_predictions_and_evaluate_gpu +elif conf['model']['shallow']: from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu else: from plasma.models.runner import train, make_predictions_and_evaluate_gpu diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 56ba0021..9c8e9d2b 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -133,7 +133,128 @@ def resize_buffer(self,buff,new_length): return new_buff + def inference_batch_generator_full_shot(self,shot_list): + """ + The method implements a training batch generator as a Python generator with a while-loop. + It iterates indefinitely over the data set and returns one mini-batch of data at a time. + + NOTE: Can be inefficient during distributed training because one process loading data will + cause all other processes to stall. + + Argument list: + - shot_list: + + Returns: + - One mini-batch of data and label as a Numpy array: X[start:end],y[start:end] + - reset_states_now: boolean flag indicating when to reset state during stateful RNN training + - num_so_far,num_total: number of samples generated so far and the total dataset size as per shot_list + """ + batch_size = self.conf['training']['pred_batch_size'] + sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) + Xbuff = np.empty((batch_size,) + sig.shape,dtype=self.conf['data']['floatx']) + Ybuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) + Maskbuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) + disr = np.empty(batch_size,dtype=bool) + # epoch = 0 + num_total = len(shot_list) + num_so_far = 0 + returned = False + num_steps = 0 + batch_idx = 0 + # warmup_steps = self.conf['training']['batch_generator_warmup_steps'] + # is_warmup_period = num_steps < warmup_steps + # is_first_fill = num_steps < batch_size + while True: + # the list of all shots + # shot_list.shuffle() + for i in range(num_total): + shot = shot_list.shots[i] + sig,res = self.get_signal_result_from_shot(shot) + sig_len = res.shape[0] + if sig_len > Xbuff.shape[1]: #resize buffer if needed + old_len = Xbuff.shape[1] + Xbuff = self.resize_buffer(Xbuff,sig_len) + Ybuff = self.resize_buffer(Ybuff,sig_len) + Maskbuff = self.resize_buffer(Maskbuff,sig_len) + Maskbuff[:,old_len:,:] = 0.0 + + Xbuff[batch_idx,:,:] = sig + Ybuff[batch_idx,:,:] = res + Maskbuff[batch_idx,:sig_len,:] = 1.0 + Maskbuff[batch_idx,sig_len:,:] = 0.0 + disr[batch_idx] = shot.is_disruptive_shot() + batch_idx += 1 + if batch_idx == batch_size: + num_so_far += batch_size + yield 1.0*Xbuff,1.0*Ybuff,1.0*Maskbuff,disr & True,num_so_far,num_total + batch_idx = 0 + + + + + def training_batch_generator_full_shot_partial_reset(self,shot_list): + """ + The method implements a training batch generator as a Python generator with a while-loop. + It iterates indefinitely over the data set and returns one mini-batch of data at a time. + NOTE: Can be inefficient during distributed training because one process loading data will + cause all other processes to stall. + + Argument list: + - shot_list: + + Returns: + - One mini-batch of data and label as a Numpy array: X[start:end],y[start:end] + - reset_states_now: boolean flag indicating when to reset state during stateful RNN training + - num_so_far,num_total: number of samples generated so far and the total dataset size as per shot_list + """ + batch_size = self.conf['training']['batch_size'] + sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) + Xbuff = np.empty((batch_size,) + sig.shape,dtype=self.conf['data']['floatx']) + Ybuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) + Maskbuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) + # epoch = 0 + num_total = len(shot_list) + num_so_far = 0 + returned = False + num_steps = 0 + batch_idx = 0 + # warmup_steps = self.conf['training']['batch_generator_warmup_steps'] + # is_warmup_period = num_steps < warmup_steps + # is_first_fill = num_steps < batch_size + while True: + # the list of all shots + shot_list.shuffle() + for i in range(num_total): + shot = self.sample_shot_from_list_given_index(shot_list,i) + sig,res = self.get_signal_result_from_shot(shot) + sig_len = res.shape[0] + if sig_len > Xbuff.shape[1]: #resize buffer if needed + old_len = Xbuff.shape[1] + Xbuff = self.resize_buffer(Xbuff,sig_len) + Ybuff = self.resize_buffer(Ybuff,sig_len) + Maskbuff = self.resize_buffer(Maskbuff,sig_len) + Maskbuff[:,old_len:,:] = 0.0 + + Xbuff[batch_idx,:,:] = sig + Ybuff[batch_idx,:,:] = res + Maskbuff[batch_idx,:sig_len,:] = 1.0 + Maskbuff[batch_idx,sig_len:,:] = 0.0 + batch_idx += 1 + if batch_idx == batch_size: + num_so_far += batch_size + yield 1.0*Xbuff,1.0*Ybuff,1.0*Maskbuff,num_so_far,num_total + batch_idx = 0 + + def sample_shot_from_list_given_index(self,shot_list,i): + if self.conf['training']['ranking_difficulty_fac'] == 1.0: + if self.conf['data']['equalize_classes']: + shot = shot_list.sample_equal_classes() + else: + shot = shot_list.shots[i] + else: #draw the shot weighted + shot = shot_list.sample_weighted() + return shot def training_batch_generator_partial_reset(self,shot_list): """ @@ -170,13 +291,7 @@ def training_batch_generator_partial_reset(self,shot_list): # the list of all shots shot_list.shuffle() for i in range(len(shot_list)): - if self.conf['training']['ranking_difficulty_fac'] == 1.0: - if self.conf['data']['equalize_classes']: - shot = shot_list.sample_equal_classes() - else: - shot = shot_list.shots[i] - else: #draw the shot weighted - shot = shot_list.sample_weighted() + shot = self.sample_shot_from_list_given_index(shot_list,i) while not np.any(end_indices == 0): X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) yield X,Y,batches_to_reset,num_so_far,num_total,is_warmup_period diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py new file mode 100644 index 00000000..08629fbe --- /dev/null +++ b/plasma/models/torch_runner.py @@ -0,0 +1,464 @@ +from __future__ import print_function +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt + +import numpy as np +import sys +if sys.version_info[0] < 3: + from itertools import imap + +#leading to import errors: +#from hyperopt import hp, STATUS_OK +#from hyperas.distributions import conditional + +import time +import datetime +import os +from functools import partial +import pathos.multiprocessing as mp +from xgboost import XGBClassifier +from sklearn.neural_network import MLPClassifier + +from plasma.conf import conf +from plasma.models.loader import Loader, ProcessGenerator +from plasma.utils.performance import PerformanceAnalyzer +from plasma.utils.evaluation import * +from plasma.utils.state_reset import reset_states +from plasma.utils.downloading import makedirs_process_safe + +from keras.utils.generic_utils import Progbar + +import hashlib + +import torch +import torch.nn as nn +from torch.autograd import Variable +import torch.optim as opt +from torch.nn.utils import weight_norm + +model_filename = 'torch_model.pt' + +class FTCN(nn.Module): + def __init__(self,n_scalars,n_profiles,profile_size,layer_sizes_spatial, + kernel_size_spatial,linear_size,output_size, + num_channels_tcn,kernel_size_temporal,dropout=0.1): + super(FTCN, self).__init__() + self.lin = InputBlock(n_scalars, n_profiles,profile_size, layer_sizes_spatial, kernel_size_spatial, linear_size, dropout) + self.input_layer = TimeDistributed(lin,batch_first=True) + self.tcn = TCN(linear_size, output_size, num_channels_tcn , kernel_size_temporal, dropout) + self.model = nn.Sequential(self.input_layer,self.tcn) + + def forward(self,x): + return self.model(x) + + +class InputBlock(nn.Module): + def __init__(self, n_scalars, n_profiles,profile_size, layer_sizes, kernel_size, linear_size, dropout=0.2): + super(InputBlock, self).__init__() + self.pooling_size = 2 + self.n_scalars = n_scalars + self.n_profiles = n_profiles + self.profile_size = profile_size + self.conv_output_size = profile_size + if self.n_profiles == 0: + self.net = None + self.conv_output_size = 0 + else: + self.layers = [] + for (i,layer_size) in enumerate(layer_sizes): + if i == 0: + input_size = n_profiles + else: + input_size = layer_sizes[i-1] + self.layers.append(weight_norm(nn.Conv1d(input_size, layer_size, kernel_size))) + self.layers.append(nn.ReLU()) + self.conv_output_size = calculate_conv_output_size(self.conv_output_size,0,1,1,kernel_size) + self.layers.append(nn.MaxPool1d(kernel_size=self.pooling_size)) + self.conv_output_size = calculate_conv_output_size(self.conv_output_size,0,1,self.pooling_size,self.pooling_size) + self.layers.append(nn.Dropout2d(dropout)) + self.net = nn.Sequential(*self.layers) + self.conv_output_size = self.conv_output_size*layer_sizes[-1] + self.linear_layers = [] + + print("Final feature size = {}".format(self.n_scalars + self.conv_output_size)) + self.linear_layers.append(nn.Linear(self.conv_output_size+self.n_scalars,linear_size)) + self.linear_layers.append(nn.ReLU()) + self.linear_layers.append(nn.Linear(linear_size,linear_size)) + self.linear_layers.append(nn.ReLU()) + print("Final output size = {}".format(linear_size)) + self.linear_net = nn.Sequential(*self.linear_layers) + +# def init_weights(self): +# self.conv1.weight.data.normal_(0, 0.01) +# self.conv2.weight.data.normal_(0, 0.01) +# if self.downsample is not None: +# self.downsample.weight.data.normal_(0, 0.01) + + def forward(self, x): + if self.n_profiles == 0: + full_features = x#x_scalars + else: + if self.n_scalars == 0: + x_profiles = x + else: + x_scalars = x[:,:n_scalars] + x_profiles = x[:,n_scalars:] + x_profiles = x_profiles.contiguous().view(x.size(0),self.n_profiles,self.profile_size) + profile_features = self.net(x_profiles).view(x.size(0),-1) + if self.n_scalars == 0: + full_features = profile_features + else: + full_features = torch.cat([x_scalars,profile_features],dim=1) + + out = self.linear_net(full_features) +# out = self.net(x) +# res = x if self.downsample is None else self.downsample(x) + return out + + +def calculate_conv_output_size(L_in,padding,dilation,stride,kernel_size): + return int(np.floor((L_in + 2*padding - dilation*(kernel_size-1) - 1)*1.0/stride + 1)) + + +class Chomp1d(nn.Module): + def __init__(self, chomp_size): + super(Chomp1d, self).__init__() + self.chomp_size = chomp_size + + def forward(self, x): + return x[:, :, :-self.chomp_size].contiguous() + + +class TemporalBlock(nn.Module): + def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2): + super(TemporalBlock, self).__init__() + self.conv1 = weight_norm(nn.Conv1d(n_inputs, n_outputs, kernel_size, + stride=stride, padding=padding, dilation=dilation)) + self.chomp1 = Chomp1d(padding) + self.relu1 = nn.ReLU() + self.dropout1 = nn.Dropout2d(dropout) + + self.conv2 = weight_norm(nn.Conv1d(n_outputs, n_outputs, kernel_size, + stride=stride, padding=padding, dilation=dilation)) + self.chomp2 = Chomp1d(padding) + self.relu2 = nn.ReLU() + self.dropout2 = nn.Dropout2d(dropout) + + self.net = nn.Sequential(self.conv1, self.chomp1, self.relu1, self.dropout1, + self.conv2, self.chomp2, self.relu2, self.dropout2) + self.downsample = nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None + self.relu = nn.ReLU() + self.init_weights() + + def init_weights(self): + self.conv1.weight.data.normal_(0, 0.01) + self.conv2.weight.data.normal_(0, 0.01) + if self.downsample is not None: + self.downsample.weight.data.normal_(0, 0.01) + + def forward(self, x): + out = self.net(x) + res = x if self.downsample is None else self.downsample(x) + return self.relu(out + res) + +#dimensions are batch,channels,length +class TemporalConvNet(nn.Module): + def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.2): + super(TemporalConvNet, self).__init__() + layers = [] + num_levels = len(num_channels) + for i in range(num_levels): + dilation_size = 2 ** i + in_channels = num_inputs if i == 0 else num_channels[i-1] + out_channels = num_channels[i] + layers += [TemporalBlock(in_channels, out_channels, kernel_size, stride=1, dilation=dilation_size, + padding=(kernel_size-1) * dilation_size, dropout=dropout)] + + self.network = nn.Sequential(*layers) + + def forward(self, x): + return self.network(x) + + +class TCN(nn.Module): + def __init__(self, input_size, output_size, num_channels, kernel_size, dropout): + super(TCN, self).__init__() + self.tcn = TemporalConvNet(input_size, num_channels, kernel_size, dropout=dropout) + self.linear = nn.Linear(num_channels[-1], output_size) +# self.sig = nn.Sigmoid() + + def forward(self, x): + # x needs to have dimension (N, C, L) in order to be passed into CNN + output = self.tcn(x.transpose(1, 2)).transpose(1, 2) + output = self.linear(output)#.transpose(1,2)).transpose(1,2) + return output +# return self.sig(output) + + + + +# def train(model,data_gen,lr=0.001,iters = 100): +# log_step = int(round(iters*0.1)) +# optimizer = opt.Adam(model.parameters(),lr = lr) +# model.train() +# total_loss = 0 +# count = 0 +# loss_fn = nn.MSELoss(size_average=False) +# for i in range(iters): +# x_,y_,mask_ = data_gen() +# # print(y) +# x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) +# # print(y) +# optimizer.zero_grad() +# # output = model(x.unsqueeze(0)).squeeze(0) +# output = model(x)#.unsqueeze(0)).squeeze(0) +# output_masked = torch.masked_select(output,mask) +# y_masked = torch.masked_select(y,mask) +# # print(y.shape,output.shape) +# loss = loss_fn(output_masked,y_masked) +# total_loss += loss.data[0] +# count += output.size(0) + +# # if args.clip > 0: +# # torch.nn.utils.clip_grad_norm(model.parameters(), args.clip) +# loss.backward() +# optimizer.step() +# if i > 0 and i % log_step == 0: +# cur_loss = total_loss / count +# print("Epoch {:2d} | lr {:.5f} | loss {:.5f}".format(0,lr, cur_loss)) +# total_loss = 0.0 +# count = 0 + + + + + + + + +class TimeDistributed(nn.Module): + def __init__(self, module, batch_first=False): + super(TimeDistributed, self).__init__() + self.module = module + self.batch_first = batch_first + + def forward(self, x): + + if len(x.size()) <= 2: + return self.module(x) + + # Squash samples and timesteps into a single axis + x_reshape = x.contiguous().view(-1, x.size(-1)) # (samples * timesteps, input_size) + + y = self.module(x_reshape) + + # We have to reshape Y + if self.batch_first: + y = y.contiguous().view(x.size(0), -1, y.size(-1)) # (samples, timesteps, output_size) + else: + y = y.view(-1, x.size(1), y.size(-1)) # (timesteps, samples, output_size) + + return y + +import keras.callbacks as cbks + + + + +def build_torch_model(conf): + dropout = conf['model']['dropout_prob'] +# dim = 10 + + # lin = nn.Linear(input_size,intermediate_dim) + n_scalars, n_profile, profile_size = get_signal_dimensions(conf) + dim = n_scalars+n_profiles*profile_size + input_size = dim + output_size = 1 + # intermediate_dim = 15 + + layer_sizes_spatial = [40,20,20] + kernel_size_spatial = 3 + linear_size = 10 + + num_channels_tcn = [3]*5 + kernel_size_temporal = 3 + model = FTCN(n_scalars,n_profiles,profile_size,layer_sizes_spatial, + kernel_size_spatial,linear_size,output_size,num_channels_tcn, + kernel_size_temporal,dropout) + + return model + +def get_signal_dimensions(conf): + #make sure all 1D indices are contiguous in the end! + use_signals = conf['paths']['use_signals'] + n_scalars = 0 + n_profiles = 0 + profile_size = 0 + is_1D_region = use_signals[0].num_channels > 1#do we have any 1D indices? + for sig in use_signals: + num_channels = sig.num_channels + if num_channels > 1: + profile_size = num_channels + num_1D += 1 + is_1D_region = True + else: + assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" + assert(num_channels == 1) + num_0D += 1 + is_1D_region = False + return n_scalars,n_profiles,profile_size + +def train_epoch(model,data_gen,loss_fn): + loss = 0 + total_loss = 0 + num_so_far = 0 + x_,y_,mask_,num_so_far_start,num_total = next(data_gen) + num_so_far = num_so_far_start + step = 0 + while True: + # print(y) + x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) + # print(y) + optimizer.zero_grad() + # output = model(x.unsqueeze(0)).squeeze(0) + output = model(x)#.unsqueeze(0)).squeeze(0) + output_masked = torch.masked_select(output,mask) + y_masked = torch.masked_select(y,mask) + # print(y.shape,output.shape) + loss = loss_fn(output_masked,y_masked) + total_loss += loss.data[0] + # count += output.size(0) + + # if args.clip > 0: + # torch.nn.utils.clip_grad_norm(model.parameters(), args.clip) + loss.backward() + optimizer.step() + step += 1 + if num_so_far-num_so_far_start >= num_total: + break + x_,y_,mask_,num_so_far_start,num_total = next(data_gen) + return step,loss,total_loss,num_so_far,1.0*num_so_far/num_total + + +def train(conf,shot_list_train,shot_list_validate,loader): + + np.random.seed(1) + + data_gen = ProcessGenerator(partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)) + + print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + + loader.set_inference_mode(False) + + train_model = build_torch_model(conf) + + #load the latest epoch we did. Returns -1 if none exist yet + # e = specific_builder.load_model_weights(train_model) + + num_epochs = conf['training']['num_epochs'] + lr_decay = conf['model']['lr_decay'] + batch_size = conf['training']['batch_size'] + lr = conf['model']['lr'] + clipnorm = conf['model']['clipnorm'] + e = 0 + # warmup_steps = conf['model']['warmup_steps'] + # num_batches_minimum = conf['training']['num_batches_minimum'] + + # if 'adam' in conf['model']['optimizer']: + # optimizer = MPIAdam(lr=lr) + # elif conf['model']['optimizer'] == 'sgd' or conf['model']['optimizer'] == 'tf_sgd': + # optimizer = MPISGD(lr=lr) + # elif 'momentum_sgd' in conf['model']['optimizer']: + # optimizer = MPIMomentumSGD(lr=lr) + # else: + # print("Optimizer not implemented yet") + # exit(1) + + print('{} epochs left to go'.format(num_epochs - 1 - e)) + + + if conf['callbacks']['mode'] == 'max': + best_so_far = -np.inf + cmp_fn = max + else: + best_so_far = np.inf + cmp_fn = min + optimizer = opt.Adam(model.parameters(),lr = lr) + model.train() + not_updated = 0 + total_loss = 0 + count = 0 + loss_fn = nn.MSELoss(size_average=False) + model_path = conf['paths']['model_save_path'] + model_filename #save_prepath + model_filename + makedirs_process_safe(conf['paths']['model_save_path']) + while e < num_epochs-1: + print_unique('\nEpoch {}/{}'.format(e,num_epochs)) + (step,ave_loss,curr_loss,num_so_far,effective_epochs) = train_epoch(model,data_gen,loss_fn) + e = effective_epochs + loader.verbose=False #True during the first iteration + # if task_index == 0: + # specific_builder.save_model_weights(train_model,int(round(e))) + model.save_state_dict(model_path) + _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) + + best_so_far = cmp_fn(roc_area,best_so_far) + + stop_training = False + print('=========Summary======== for epoch{}'.format(step)) + print('Training Loss numpy: {:.3e}'.format(ave_loss)) + print('Validation Loss: {:.3e}'.format(loss)) + print('Validation ROC: {:.4f}'.format(roc_area)) + + if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + print("No improvement, still saving model") + not_updated += 1 + else: + print("Saving model") + model.save_state_dict(model_path) + # specific_builder.delete_model_weights(train_model,int(round(e))) + if not_updated > patience: + print("Stopping training due to early stopping") + break + +def make_predictions(conf,shot_list,loader,custom_path=None): + generator = loader.inference_batch_generator_full_shot(shot_list) + inference_model = build_torch_model(conf) + + if custom_path == None: + model_path = conf['paths']['model_save_path'] + model_filename#save_prepath + model_filename + else: + model_path = custom_path + inference_model.load_state_dict(model_path) + #shot_list = shot_list.random_sublist(10) + + y_prime = [] + y_gold = [] + disruptive = [] + num_shots = len(shot_list) + + pbar = Progbar(num_shots) + while True: + x_,y_,mask_,disr_,num_so_far,num_total = next(generator) + x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) + output = model(x) + for batch_idx in range(x.shape[0]) + y_prime[batch_idx] += [output[batch_idx,:,:]] + y_gold += [y_[batch_idx,:,:]] + disruptive += [disr[batch_idx]] + pbar.add(1.0) + if len(disruptive) >= num_shots: + y_prime = y_prime[:num_shots] + y_gold = y_gold[:num_shots] + disruptive = disruptive[:num_shots] + break + return y_prime,y_gold,disruptive + +def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) + analyzer = PerformanceAnalyzer(conf=conf) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + return y_prime,y_gold,disruptive,roc_area,loss + From ad5de2f262f227ff32c45649de31a86aa883dd39 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 22 Mar 2018 02:01:56 -0400 Subject: [PATCH 529/744] added support for torch fully convolutional model. Temporal convolutions and spatial convolutions. TODO is to add multi GPU support and customizability via conf. Parameters currently hardcoded. --- plasma/models/builder.py | 3 +- plasma/models/loader.py | 51 ++++++++---- plasma/models/torch_runner.py | 146 +++++++++++++++++++--------------- 3 files changed, 120 insertions(+), 80 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 2cbf7eeb..28459936 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -273,7 +273,8 @@ def extract_id_and_epoch_from_filename(self,filename): def get_all_saved_files(self): self.ensure_save_directory() unique_id = self.get_unique_id() - filenames = os.listdir(self.conf['paths']['model_save_path']) + path = self.conf['paths']['model_save_path'] + filenames = [name for name in os.listdir(path) if os.path.isfile(os.path.join(path, name))] epochs = [] for file in filenames: curr_id,epoch = self.extract_id_and_epoch_from_filename(file) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 9c8e9d2b..248642e0 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -123,11 +123,13 @@ def shift_buffer(self,buff,length): buff[:,:-length,:] = buff[:,length:,:] - def resize_buffer(self,buff,new_length): + def resize_buffer(self,buff,new_length,dtype=None): + if dtype == None: + dtype = self.conf['data']['floatx'] old_length = buff.shape[1] batch_size = buff.shape[0] num_signals = buff.shape[2] - new_buff = np.empty((batch_size,new_length,num_signals),dtype=self.conf['data']['floatx']) + new_buff = np.zeros((batch_size,new_length,num_signals),dtype=dtype) new_buff[:,:old_length,:] = buff #print("Resizing buffer to new length {}".format(new_length)) return new_buff @@ -149,18 +151,20 @@ def inference_batch_generator_full_shot(self,shot_list): - reset_states_now: boolean flag indicating when to reset state during stateful RNN training - num_so_far,num_total: number of samples generated so far and the total dataset size as per shot_list """ - batch_size = self.conf['training']['pred_batch_size'] + batch_size = self.conf['model']['pred_batch_size'] sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) - Xbuff = np.empty((batch_size,) + sig.shape,dtype=self.conf['data']['floatx']) - Ybuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) - Maskbuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) - disr = np.empty(batch_size,dtype=bool) + Xbuff = np.zeros((batch_size,) + sig.shape,dtype=self.conf['data']['floatx']) + Ybuff = np.zeros((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) + Maskbuff = np.zeros((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) + disr = np.zeros(batch_size,dtype=bool) + lengths = np.zeros(batch_size,dtype=int) # epoch = 0 num_total = len(shot_list) num_so_far = 0 returned = False num_steps = 0 batch_idx = 0 + np.seterr(all='raise') # warmup_steps = self.conf['training']['batch_generator_warmup_steps'] # is_warmup_period = num_steps < warmup_steps # is_first_fill = num_steps < batch_size @@ -178,15 +182,29 @@ def inference_batch_generator_full_shot(self,shot_list): Maskbuff = self.resize_buffer(Maskbuff,sig_len) Maskbuff[:,old_len:,:] = 0.0 - Xbuff[batch_idx,:,:] = sig - Ybuff[batch_idx,:,:] = res + Xbuff[batch_idx,:,:] = 0.0 + Ybuff[batch_idx,:,:] = 0.0 + Maskbuff[batch_idx,:,:] = 0.0 + Xbuff[batch_idx,:sig_len,:] = sig + Ybuff[batch_idx,:sig_len,:] = res Maskbuff[batch_idx,:sig_len,:] = 1.0 - Maskbuff[batch_idx,sig_len:,:] = 0.0 disr[batch_idx] = shot.is_disruptive_shot() + lengths[batch_idx] = res.shape[0] batch_idx += 1 if batch_idx == batch_size: num_so_far += batch_size - yield 1.0*Xbuff,1.0*Ybuff,1.0*Maskbuff,disr & True,num_so_far,num_total + x1 = 1.0*Xbuff + try: + x2 = 1.0*Ybuff + except: + print(Ybuff[:100]) + print(Ybuff[-100:]) + print(Ybuff) + x3 = 1.0*Maskbuff + x4 = disr & True + x5 = 1*lengths + + yield x1,x2,x3,x4,x5,num_so_far,num_total batch_idx = 0 @@ -236,10 +254,13 @@ def training_batch_generator_full_shot_partial_reset(self,shot_list): Maskbuff = self.resize_buffer(Maskbuff,sig_len) Maskbuff[:,old_len:,:] = 0.0 - Xbuff[batch_idx,:,:] = sig - Ybuff[batch_idx,:,:] = res + Xbuff[batch_idx,:,:] = 0.0 + Ybuff[batch_idx,:,:] = 0.0 + Maskbuff[batch_idx,:,:] = 0.0 + + Xbuff[batch_idx,:sig_len,:] = sig + Ybuff[batch_idx,:sig_len,:] = res Maskbuff[batch_idx,:sig_len,:] = 1.0 - Maskbuff[batch_idx,sig_len:,:] = 0.0 batch_idx += 1 if batch_idx == batch_size: num_so_far += batch_size @@ -735,8 +756,10 @@ def __init__(self,generator): def fill_batch_queue(self): print("Starting process to fetch data") + count = 0 while True: self.queue.put(next(self.generator),True) + count += 1 def __next__(self): return self.queue.get(True) diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py index 08629fbe..3d7885ba 100644 --- a/plasma/models/torch_runner.py +++ b/plasma/models/torch_runner.py @@ -45,7 +45,7 @@ def __init__(self,n_scalars,n_profiles,profile_size,layer_sizes_spatial, num_channels_tcn,kernel_size_temporal,dropout=0.1): super(FTCN, self).__init__() self.lin = InputBlock(n_scalars, n_profiles,profile_size, layer_sizes_spatial, kernel_size_spatial, linear_size, dropout) - self.input_layer = TimeDistributed(lin,batch_first=True) + self.input_layer = TimeDistributed(self.lin,batch_first=True) self.tcn = TCN(linear_size, output_size, num_channels_tcn , kernel_size_temporal, dropout) self.model = nn.Sequential(self.input_layer,self.tcn) @@ -102,8 +102,8 @@ def forward(self, x): if self.n_scalars == 0: x_profiles = x else: - x_scalars = x[:,:n_scalars] - x_profiles = x[:,n_scalars:] + x_scalars = x[:,:self.n_scalars] + x_profiles = x[:,self.n_scalars:] x_profiles = x_profiles.contiguous().view(x.size(0),self.n_profiles,self.profile_size) profile_features = self.net(x_profiles).view(x.size(0),-1) if self.n_scalars == 0: @@ -271,18 +271,18 @@ def build_torch_model(conf): # dim = 10 # lin = nn.Linear(input_size,intermediate_dim) - n_scalars, n_profile, profile_size = get_signal_dimensions(conf) + n_scalars, n_profiles, profile_size = get_signal_dimensions(conf) dim = n_scalars+n_profiles*profile_size input_size = dim output_size = 1 # intermediate_dim = 15 - layer_sizes_spatial = [40,20,20] + layer_sizes_spatial = [6,3,3]#[40,20,20] kernel_size_spatial = 3 - linear_size = 10 + linear_size = 5 - num_channels_tcn = [3]*5 - kernel_size_temporal = 3 + num_channels_tcn = [10,5,3,3]#[3]*5 + kernel_size_temporal = 3 #3 model = FTCN(n_scalars,n_profiles,profile_size,layer_sizes_spatial, kernel_size_spatial,linear_size,output_size,num_channels_tcn, kernel_size_temporal,dropout) @@ -300,16 +300,68 @@ def get_signal_dimensions(conf): num_channels = sig.num_channels if num_channels > 1: profile_size = num_channels - num_1D += 1 + n_profiles += 1 is_1D_region = True else: assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" assert(num_channels == 1) - num_0D += 1 + n_scalars += 1 is_1D_region = False return n_scalars,n_profiles,profile_size -def train_epoch(model,data_gen,loss_fn): +def apply_model_to_np(model,x): + # return model(Variable(torch.from_numpy(x).float()).unsqueeze(0)).squeeze(0).data.numpy() + return model(Variable(torch.from_numpy(x).float())).data.numpy() + + + +def make_predictions(conf,shot_list,loader,custom_path=None): + generator = loader.inference_batch_generator_full_shot(shot_list) + inference_model = build_torch_model(conf) + + if custom_path == None: + model_path = get_model_path(conf) + else: + model_path = custom_path + inference_model.load_state_dict(torch.load(model_path)) + #shot_list = shot_list.random_sublist(10) + + y_prime = [] + y_gold = [] + disruptive = [] + num_shots = len(shot_list) + + pbar = Progbar(num_shots) + while True: + x,y,mask,disr,lengths,num_so_far,num_total = next(generator) + #x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) + output = apply_model_to_np(inference_model,x) + for batch_idx in range(x.shape[0]): + curr_length = lengths[batch_idx] + y_prime += [output[batch_idx,:curr_length,0]] + y_gold += [y[batch_idx,:curr_length,0]] + disruptive += [disr[batch_idx]] + pbar.add(1.0) + if len(disruptive) >= num_shots: + y_prime = y_prime[:num_shots] + y_gold = y_gold[:num_shots] + disruptive = disruptive[:num_shots] + break + return y_prime,y_gold,disruptive + +def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) + analyzer = PerformanceAnalyzer(conf=conf) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + return y_prime,y_gold,disruptive,roc_area,loss + + +def get_model_path(conf): + return conf['paths']['model_save_path'] + 'torch/' + model_filename #save_prepath + model_filename + + +def train_epoch(model,data_gen,optimizer,loss_fn): loss = 0 total_loss = 0 num_so_far = 0 @@ -335,17 +387,19 @@ def train_epoch(model,data_gen,loss_fn): loss.backward() optimizer.step() step += 1 + print("[{}] [{}/{}] loss: {:.3f}, ave_loss: {:.3f}".format(step,num_so_far-num_so_far_start,num_total,loss.data[0],total_loss/step)) if num_so_far-num_so_far_start >= num_total: break - x_,y_,mask_,num_so_far_start,num_total = next(data_gen) - return step,loss,total_loss,num_so_far,1.0*num_so_far/num_total + x_,y_,mask_,num_so_far,num_total = next(data_gen) + return step,loss.data[0],total_loss,num_so_far,1.0*num_so_far/num_total def train(conf,shot_list_train,shot_list_validate,loader): np.random.seed(1) - data_gen = ProcessGenerator(partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)) + #data_gen = ProcessGenerator(partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)()) + data_gen = partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)() print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) @@ -358,6 +412,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): # e = specific_builder.load_model_weights(train_model) num_epochs = conf['training']['num_epochs'] + patience = conf['callbacks']['patience'] lr_decay = conf['model']['lr_decay'] batch_size = conf['training']['batch_size'] lr = conf['model']['lr'] @@ -385,23 +440,25 @@ def train(conf,shot_list_train,shot_list_validate,loader): else: best_so_far = np.inf cmp_fn = min - optimizer = opt.Adam(model.parameters(),lr = lr) - model.train() + optimizer = opt.Adam(train_model.parameters(),lr = lr) + scheduler = opt.lr_scheduler.ExponentialLR(optimizer,lr_decay) + train_model.train() not_updated = 0 total_loss = 0 count = 0 - loss_fn = nn.MSELoss(size_average=False) - model_path = conf['paths']['model_save_path'] + model_filename #save_prepath + model_filename - makedirs_process_safe(conf['paths']['model_save_path']) + loss_fn = nn.MSELoss(size_average=True) + model_path = get_model_path(conf) + makedirs_process_safe(os.path.dirname(model_path)) while e < num_epochs-1: - print_unique('\nEpoch {}/{}'.format(e,num_epochs)) - (step,ave_loss,curr_loss,num_so_far,effective_epochs) = train_epoch(model,data_gen,loss_fn) + scheduler.step() + print('\nEpoch {}/{}'.format(e,num_epochs)) + (step,ave_loss,curr_loss,num_so_far,effective_epochs) = train_epoch(train_model,data_gen,optimizer,loss_fn) e = effective_epochs loader.verbose=False #True during the first iteration # if task_index == 0: # specific_builder.save_model_weights(train_model,int(round(e))) - model.save_state_dict(model_path) - _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) + torch.save(train_model.state_dict(),model_path) + _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) best_so_far = cmp_fn(roc_area,best_so_far) @@ -411,54 +468,13 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('Validation Loss: {:.3e}'.format(loss)) print('Validation ROC: {:.4f}'.format(roc_area)) - if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + if best_so_far != roc_area: #only save model weights if quantity we are tracking is improving print("No improvement, still saving model") not_updated += 1 else: print("Saving model") - model.save_state_dict(model_path) # specific_builder.delete_model_weights(train_model,int(round(e))) if not_updated > patience: print("Stopping training due to early stopping") break -def make_predictions(conf,shot_list,loader,custom_path=None): - generator = loader.inference_batch_generator_full_shot(shot_list) - inference_model = build_torch_model(conf) - - if custom_path == None: - model_path = conf['paths']['model_save_path'] + model_filename#save_prepath + model_filename - else: - model_path = custom_path - inference_model.load_state_dict(model_path) - #shot_list = shot_list.random_sublist(10) - - y_prime = [] - y_gold = [] - disruptive = [] - num_shots = len(shot_list) - - pbar = Progbar(num_shots) - while True: - x_,y_,mask_,disr_,num_so_far,num_total = next(generator) - x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) - output = model(x) - for batch_idx in range(x.shape[0]) - y_prime[batch_idx] += [output[batch_idx,:,:]] - y_gold += [y_[batch_idx,:,:]] - disruptive += [disr[batch_idx]] - pbar.add(1.0) - if len(disruptive) >= num_shots: - y_prime = y_prime[:num_shots] - y_gold = y_gold[:num_shots] - disruptive = disruptive[:num_shots] - break - return y_prime,y_gold,disruptive - -def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): - y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) - analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss - From bbfa51bb2054dbf28829fb2e71069e71b18f7c7a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 24 Mar 2018 17:26:54 -0400 Subject: [PATCH 530/744] fix bugs related to T_min warn becoming too large. performance computation was wrong when T_max_warn was smaller. Shots can't be cut if they are shorter than T_min_warn --- examples/tune_hyperparams.py | 10 ++++++---- plasma/preprocessor/normalize.py | 3 +++ plasma/utils/performance.py | 4 ++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 56b8eb69..0e60c39c 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -8,9 +8,9 @@ tunables = [] shallow = False num_nodes = 1 -num_trials = 20 +num_trials = 30 -t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) +t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,4.096,10.024]) cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) #for shallow if shallow: @@ -35,19 +35,21 @@ fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,4.0,16.0]) target = CategoricalHyperparam(['target'],['maxhinge','hinge','ttdinv','ttd']) #target = CategoricalHyperparam(['target'],['hinge','ttdinv','ttd']) - batch_size = CategoricalHyperparam(['training','batch_size'],[128,256]) + batch_size = CategoricalHyperparam(['training','batch_size'],[64,128]) dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.01,0.05,0.1]) - conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[128,256]) + conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[64,128,256]) conv_layers = IntegerHyperparam(['model','num_conv_layers'],2,4) rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,3) rnn_size = CategoricalHyperparam(['model','rnn_size'],[128,256]) dense_size = CategoricalHyperparam(['model','dense_size'],[128,256]) extra_dense_input = CategoricalHyperparam(['model','extra_dense_input'],[False,True]) equalize_classes = CategoricalHyperparam(['data','equalize_classes'],[False,True]) + t_min_warn = CategoricalHyperparam(['data','T_min_warn'],[30,70,200,500,1000]) #rnn_length = CategoricalHyperparam(['model','length'],[32,128]) #tunables = [lr,lr_decay,fac,target,batch_size,dropout_prob] tunables = [lr,lr_decay,fac,target,batch_size,equalize_classes,dropout_prob] tunables += [conv_filters,conv_layers,rnn_layers,rnn_size,dense_size,extra_dense_input] + tunables += [t_min_warn] tunables += [cut_ends,t_warn] diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 794e7837..dd6cd05f 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -141,6 +141,9 @@ def train_on_files(self,shot_files,use_shots,all_machines): def cut_end_of_shot(self,shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] if not self.inference_mode and cut_shot_ends: #only cut shots during training + if shot.ttd.shape[0] <= T_min_warn: + print("not cutting shot since T_min_warn is larger than length of shot") + return T_min_warn = self.conf['data']['T_min_warn'] for key in shot.signals_dict: shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 6abac58e..f09a06e3 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -25,6 +25,9 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ self.T_min_warn = T_min_warn_def if T_max_warn == None: self.T_max_warn = T_max_warn_def + if self.T_max_warn < self.T_min_warn: + print("T max warn is too small: need to increase artificially.") #computation of statistics is only correct if T_max_warn is larger than T_min_warn + self.T_max_warn = self.T_min_warn + 1 self.verbose = verbose self.results_dir = results_dir self.shots_dir = shots_dir @@ -293,6 +296,7 @@ def create_acceptable_region(self,truth,mode): else: print('Error Invalid Mode for acceptable region') exit(1) + assert(self.T_max_warn > self.T_min_warn) acceptable = np.zeros_like(truth,dtype=bool) if acceptable_timesteps > 0: From 932220257ae4c5a0c7b0eaf784fb6410c9bd20eb Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 24 Mar 2018 17:28:15 -0400 Subject: [PATCH 531/744] added functionality to compute multiple ROC values for different T_min values at once. Add option to use ProcessGenerator or not --- plasma/models/mpi_runner.py | 63 ++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index d96adda1..14d4a744 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -171,9 +171,10 @@ def get_val(self): class MPIModel(): - def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01,num_batches_minimum=100): + def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01,num_batches_minimum=100,conf=None): random.seed(task_index) np.random.seed(task_index) + self.conf = conf self.start_time = time.time() self.epoch = 0 self.num_so_far = 0 @@ -200,10 +201,14 @@ def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=No def set_batch_iterator_func(self): - self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + if self.conf is not None and 'use_process_generator' in conf['training'] and conf['training']['use_process_generator']: + self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + else: + self.batch_iterator_func = self.batch_iterator() def close(self): - self.batch_iterator_func.__exit__() + if hasattr(self.batch_iterator_func,'__exit__'): + self.batch_iterator_func.__exit__() def set_lr(self,lr): self.lr = lr @@ -642,6 +647,24 @@ def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) return y_prime,y_gold,disruptive,roc_area,loss +def mpi_make_predictions_and_evaluate_multiple_times(conf,shot_list,loader,times,custom_path=None): + y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader,custom_path) + areas = [] + losses = [] + for T_min_curr in times: + #if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: + conf_curr = deepcopy(conf) + T_min_warn_orig = conf['data']['T_min_warn'] + conf_curr['data']['T_min_warn'] = T_min_curr + assert(conf['data']['T_min_warn'] == T_min_warn_orig) + analyzer = PerformanceAnalyzer(conf=conf_curr) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + #shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + areas.append(roc_area) + losses.append(loss) + return areas,losses + def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None,shot_list_test=None): @@ -680,7 +703,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non #{}batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) print("warmup {}".format(warmup_steps)) - mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum) + mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum,conf=conf) mpi_model.compile(conf['model']['optimizer'],clipnorm,conf['data']['target'].loss) tensorboard = None @@ -709,6 +732,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non cmp_fn = min while e < num_epochs-1: + print_unique("begin epoch {} 0".format(e)) if task_index == 0: callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) @@ -733,18 +757,15 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non mpi_model.set_batch_iterator_func() if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: - conf_curr = deepcopy(conf) - T_min_warn_orig = conf['data']['T_min_warn'] - for T_min_curr in conf_curr['callbacks']['monitor_times']: - conf_curr['data']['T_min_warn'] = T_min_curr - assert(conf['data']['T_min_warn'] == T_min_warn_orig) - if shot_list_test is not None: - _,_,_,roc_area_t,_ = mpi_make_predictions_and_evaluate(conf_curr,shot_list_test,loader) - print_unique('epoch {}, test_roc_{} = {}'.format(int(round(e)),T_min_curr,roc_area_t)) - #epoch_logs['test_roc_{}'.format(T_min_curr)] = roc_area_t - _,_,_,roc_area_v,_ = mpi_make_predictions_and_evaluate(conf_curr,shot_list_validate,loader) - print_unique('epoch {}, val_roc_{} = {}'.format(int(round(e)),T_min_curr,roc_area_v)) - #epoch_logs['val_roc_{}'.format(T_min_curr)] = roc_area_v + times = conf['callbacks']['monitor_times'] + roc_areas,losses = mpi_make_predictions_and_evaluate_multiple_times(conf,shot_list_validate,loader,times) + for roc,t in zip(roc_areas,times): + print_unique('epoch {}, val_roc_{} = {}'.format(int(round(e)),t,roc)) + if shot_list_test is not None: + roc_areas,losses = mpi_make_predictions_and_evaluate_multiple_times(conf,shot_list_test,loader,times) + for roc,t in zip(roc_areas,times): + print_unique('epoch {}, test_roc_{} = {}'.format(int(round(e)),t,roc)) + epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss @@ -764,8 +785,12 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non if hasattr(mpi_model.model,'stop_training'): stop_training = mpi_model.model.stop_training if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving - print("Not saving model weights") - specific_builder.delete_model_weights(train_model,int(round(e))) + if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: + + print("No improvement, saving model weights anyways") + else: + print("Not saving model weights") + specific_builder.delete_model_weights(train_model,int(round(e))) #tensorboard if backend != 'theano': @@ -773,7 +798,9 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non val_steps = 1 tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) + print_unique("end epoch {} 0".format(e)) stop_training = comm.bcast(stop_training,root=0) + print_unique("end epoch {} 1".format(e)) if stop_training: print("Stopping training due to early stopping") break From 4054c035717551cbd859bdb5ca4318f344813daf Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 24 Mar 2018 17:31:37 -0400 Subject: [PATCH 532/744] fix small error in variable ordering --- plasma/preprocessor/normalize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index dd6cd05f..c0b679bf 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -141,10 +141,10 @@ def train_on_files(self,shot_files,use_shots,all_machines): def cut_end_of_shot(self,shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] if not self.inference_mode and cut_shot_ends: #only cut shots during training + T_min_warn = self.conf['data']['T_min_warn'] if shot.ttd.shape[0] <= T_min_warn: print("not cutting shot since T_min_warn is larger than length of shot") return - T_min_warn = self.conf['data']['T_min_warn'] for key in shot.signals_dict: shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] shot.ttd = shot.ttd[:-T_min_warn] From 4dc0edb338cf19262bddb2c05e5c2f1cb40bf9d6 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 24 Mar 2018 20:32:41 -0400 Subject: [PATCH 533/744] ensure shot is only cut if it remains longer than RNN length after cutting --- plasma/preprocessor/normalize.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index c0b679bf..4818c7aa 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -142,8 +142,8 @@ def cut_end_of_shot(self,shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] if not self.inference_mode and cut_shot_ends: #only cut shots during training T_min_warn = self.conf['data']['T_min_warn'] - if shot.ttd.shape[0] <= T_min_warn: - print("not cutting shot since T_min_warn is larger than length of shot") + if shot.ttd.shape[0] - T_min_warn <= max(self.conf['model']['length'],0): + print("not cutting shot since length of shot after cutting by T_min_warn would be shorter than RNN length") return for key in shot.signals_dict: shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] From c2e2ac68edbf3c366f96c38ee50efe0227e3b72c Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Sat, 24 Mar 2018 21:24:37 -0400 Subject: [PATCH 534/744] changed hash computation (removing enconding and decoding since there was a bug where it couldn't decode the dumps due to truncated unicode escape character \xXX --- plasma/utils/downloading.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 65a9bfa0..91f4e968 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -56,6 +56,8 @@ def general_object_hash(o): def myhash(x): return int(hashlib.md5((dill.dumps(x).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + #return int(hashlib.md5((dill.dumps(x))).hexdigest(),16) + #return int(hashlib.md5((dill.dumps(x))))#.decode('unicode_escape')).encode('utf-8')).hexdigest(),16) def get_missing_value_array(): From a083b949580eb2e02dad51c7a19498b908a1f353 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 5 Apr 2018 18:47:58 -0700 Subject: [PATCH 535/744] added support for multiple times to disruption ROC evaluation for shallow models --- examples/learn.py | 2 +- plasma/models/runner.py | 2 +- plasma/models/shallow_runner.py | 36 ++++++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/examples/learn.py b/examples/learn.py index a1b9a94a..29a7e1c2 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -93,7 +93,7 @@ ##################################################### #train(conf,shot_list_train,loader) if not only_predict: - p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) + p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader,shot_list_test)) p.start() p.join() diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 11f3ff3d..0a4506b3 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -24,7 +24,7 @@ backend = conf['model']['backend'] -def train(conf,shot_list_train,shot_list_validate,loader): +def train(conf,shot_list_train,shot_list_validate,loader,shot_list_test=None): loader.set_inference_mode(False) np.random.seed(1) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index b9ccf883..04c5db8a 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -15,6 +15,7 @@ import time import datetime import os +from copy import deepcopy from functools import partial import pathos.multiprocessing as mp from xgboost import XGBClassifier @@ -284,7 +285,7 @@ def build_callbacks(conf): return cbks.CallbackList(callbacks) -def train(conf,shot_list_train,shot_list_validate,loader): +def train(conf,shot_list_train,shot_list_validate,loader,shot_list_test=None): np.random.seed(1) @@ -367,6 +368,20 @@ def train(conf,shot_list_train,shot_list_validate,loader): Y_predv = model.predict(Xv) print("Validate") print(classification_report(Yv,Y_predv)) + + + if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: + times = conf['callbacks']['monitor_times'] + roc_areas,losses = make_predictions_and_evaluate_multiple_times(conf,shot_list_validate,loader,times) + for roc,t in zip(roc_areas,times): + print('val_roc_{} = {}'.format(t,roc)) + if shot_list_test is not None: + roc_areas,losses = make_predictions_and_evaluate_multiple_times(conf,shot_list_test,loader,times) + for roc,t in zip(roc_areas,times): + print('test_roc_{} = {}'.format(t,roc)) + + + #print(confusion_matrix(Y,Y_pred)) _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) # _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) @@ -378,6 +393,8 @@ def train(conf,shot_list_train,shot_list_validate,loader): epoch_logs['val_loss'] = loss # epoch_logs['train_roc'] = roc_area_train # epoch_logs['train_loss'] = loss_train + + callbacks.on_epoch_end(0, epoch_logs) @@ -432,3 +449,20 @@ def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) return y_prime,y_gold,disruptive,roc_area,loss +def make_predictions_and_evaluate_multiple_times(conf,shot_list,loader,times,custom_path=None): + y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) + areas = [] + losses = [] + for T_min_curr in times: + #if 'monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']: + conf_curr = deepcopy(conf) + T_min_warn_orig = conf['data']['T_min_warn'] + conf_curr['data']['T_min_warn'] = T_min_curr + assert(conf['data']['T_min_warn'] == T_min_warn_orig) + analyzer = PerformanceAnalyzer(conf=conf_curr) + roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) + #shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) + loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) + areas.append(roc_area) + losses.append(loss) + return areas,losses From 638306bed08eff51b7208cfe684f96f2299ef675 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 5 Apr 2018 21:50:00 -0400 Subject: [PATCH 536/744] added support for torch model --- examples/learn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/learn.py b/examples/learn.py index a1b9a94a..e4d74256 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -33,7 +33,7 @@ from plasma.preprocessor.preprocess import Preprocessor, guarantee_preprocessed from plasma.models.loader import Loader -if conf['model']['torch']: +if 'torch' in conf['model'].keys() and conf['model']['torch']: from plasma.models.torch_runner import train, make_predictions_and_evaluate_gpu elif conf['model']['shallow']: from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu From 46f2df9e11057d053821775a5bf3d68b875728e7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Thu, 5 Apr 2018 22:14:09 -0400 Subject: [PATCH 537/744] add conf with options for not using process generator, using torch model, and printing validation and test rocs during training --- examples/conf.yaml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index c59d00d2..398d3d12 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -10,7 +10,7 @@ paths: signal_prepath: '/signal_data/' #/signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: jet_data #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data + data: d3d_data_0D #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set executable: "mpi_learn.py" shallow_executable: "learn.py" @@ -54,9 +54,9 @@ data: floatx: 'float32' model: - use_bidirectional: false use_batch_norm: false - shallow: False + torch: False + shallow: True shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training type: "xgboost" #"xgboost" #"xgboost" #"random_forest" "xgboost" @@ -120,7 +120,8 @@ training: data_parallel: False hyperparam_tuning: False batch_generator_warmup_steps: 0 - num_batches_minimum: 200 #minimum number of batches per epoch + use_process_generator: False + num_batches_minimum: 20 #minimum number of batches per epoch ranking_difficulty_fac: 1.0 #how much to upweight incorrectly classified shots during training callbacks: list: ['earlystop'] @@ -129,6 +130,8 @@ callbacks: monitor: 'val_roc' patience: 5 write_grads: False + monitor_test: True + monitor_times: [30,70,200,500,1000] env: name: 'frnn' type: 'anaconda' From 2bff1ef9f46dfb0ce9a13c0cd10fa9686dc25928 Mon Sep 17 00:00:00 2001 From: ASvyatkovskiy Date: Mon, 6 Aug 2018 01:14:32 -0400 Subject: [PATCH 538/744] Do not broadcast weights after all-reduce --- plasma/models/mpi_runner.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 3f5bdf3b..90753403 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -338,11 +338,7 @@ def set_new_weights(self,deltas,num_replicas=None): self.optimizer.set_lr(effective_lr) global_deltas = self.optimizer.get_deltas(global_deltas) - if self.comm.rank == 0: - new_weights = self.get_new_weights(global_deltas) - else: - new_weights = None - new_weights = self.comm.bcast(new_weights,root=0) + new_weights = self.get_new_weights(global_deltas) self.model.set_weights(new_weights) def build_callbacks(self,conf,callbacks_list): From ea5b3e62aef6f3f19ccc4bb3e31b71c311513285 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 6 Aug 2018 11:25:11 +0200 Subject: [PATCH 539/744] Update mpi_runner.py Ensure all ranks have equal weights to begin with by broadcasting weights after compilation of the model. --- plasma/models/mpi_runner.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 90753403..35181d68 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -226,7 +226,16 @@ def compile(self,optimizer,clipnorm,loss='mse'): else: print("Optimizer not implemented yet") exit(1) - self.model.compile(optimizer=optimizer_class,loss=loss) + self.model.compile(optimizer=optimizer_class,loss=loss) + self.ensure_equal_weights() + + def ensure_equal_weights(self): + if task_index == 0: + new_weights = self.model.get_weights() + else: + new_weights = None + nw = comm.bcast(new_weights,root=0) + self.model.set_weights(nw) From 68ac282350568fe6e162c80bda388f769ef8215a Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 12 Nov 2018 03:12:05 -0500 Subject: [PATCH 540/744] added later JET campaign shot lists --- data/shot_lists/jet/ILW_clear_full.txt | 10425 +++++++++++++++++++++++ data/shot_lists/jet/ILW_clear_late.txt | 7201 ++++++++++++++++ data/shot_lists/jet/ILW_unint_full.txt | 626 ++ data/shot_lists/jet/ILW_unint_late.txt | 380 + 4 files changed, 18632 insertions(+) create mode 100644 data/shot_lists/jet/ILW_clear_full.txt create mode 100644 data/shot_lists/jet/ILW_clear_late.txt create mode 100644 data/shot_lists/jet/ILW_unint_full.txt create mode 100644 data/shot_lists/jet/ILW_unint_late.txt diff --git a/data/shot_lists/jet/ILW_clear_full.txt b/data/shot_lists/jet/ILW_clear_full.txt new file mode 100644 index 00000000..b6b95ad3 --- /dev/null +++ b/data/shot_lists/jet/ILW_clear_full.txt @@ -0,0 +1,10425 @@ +80128 -1.000000 +80129 -1.000000 +80130 -1.000000 +80131 -1.000000 +80132 -1.000000 +80133 -1.000000 +80134 -1.000000 +80135 -1.000000 +80136 -1.000000 +80137 -1.000000 +80138 -1.000000 +80139 -1.000000 +80140 -1.000000 +80141 -1.000000 +80142 -1.000000 +80143 -1.000000 +80144 -1.000000 +80145 -1.000000 +80146 -1.000000 +80147 -1.000000 +80148 -1.000000 +80149 -1.000000 +80150 -1.000000 +80151 -1.000000 +80152 -1.000000 +80153 -1.000000 +80154 -1.000000 +80155 -1.000000 +80156 -1.000000 +80157 -1.000000 +80158 -1.000000 +80159 -1.000000 +80160 -1.000000 +80161 -1.000000 +80162 -1.000000 +80163 -1.000000 +80164 -1.000000 +80165 -1.000000 +80166 -1.000000 +80167 -1.000000 +80168 -1.000000 +80169 -1.000000 +80170 -1.000000 +80171 -1.000000 +80172 -1.000000 +80173 -1.000000 +80174 -1.000000 +80175 -1.000000 +80176 -1.000000 +80177 -1.000000 +80178 -1.000000 +80179 -1.000000 +80180 -1.000000 +80182 -1.000000 +80183 -1.000000 +80184 -1.000000 +80185 -1.000000 +80186 -1.000000 +80187 -1.000000 +80188 -1.000000 +80189 -1.000000 +80190 -1.000000 +80191 -1.000000 +80192 -1.000000 +80193 -1.000000 +80194 -1.000000 +80196 -1.000000 +80197 -1.000000 +80198 -1.000000 +80199 -1.000000 +80200 -1.000000 +80201 -1.000000 +80202 -1.000000 +80203 -1.000000 +80204 -1.000000 +80205 -1.000000 +80206 -1.000000 +80207 -1.000000 +80208 -1.000000 +80209 -1.000000 +80210 -1.000000 +80211 -1.000000 +80212 -1.000000 +80213 -1.000000 +80214 -1.000000 +80215 -1.000000 +80216 -1.000000 +80217 -1.000000 +80218 -1.000000 +80219 -1.000000 +80220 -1.000000 +80221 -1.000000 +80222 -1.000000 +80223 -1.000000 +80224 -1.000000 +80225 -1.000000 +80226 -1.000000 +80227 -1.000000 +80228 -1.000000 +80229 -1.000000 +80230 -1.000000 +80231 -1.000000 +80232 -1.000000 +80233 -1.000000 +80234 -1.000000 +80235 -1.000000 +80236 -1.000000 +80237 -1.000000 +80238 -1.000000 +80239 -1.000000 +80240 -1.000000 +80241 -1.000000 +80242 -1.000000 +80243 -1.000000 +80244 -1.000000 +80245 -1.000000 +80246 -1.000000 +80247 -1.000000 +80248 -1.000000 +80249 -1.000000 +80250 -1.000000 +80251 -1.000000 +80252 -1.000000 +80253 -1.000000 +80254 -1.000000 +80255 -1.000000 +80256 -1.000000 +80257 -1.000000 +80258 -1.000000 +80259 -1.000000 +80260 -1.000000 +80261 -1.000000 +80262 -1.000000 +80263 -1.000000 +80264 -1.000000 +80265 -1.000000 +80266 -1.000000 +80267 -1.000000 +80268 -1.000000 +80269 -1.000000 +80270 -1.000000 +80271 -1.000000 +80272 -1.000000 +80273 -1.000000 +80274 -1.000000 +80275 -1.000000 +80276 -1.000000 +80277 -1.000000 +80278 -1.000000 +80279 -1.000000 +80280 -1.000000 +80281 -1.000000 +80282 -1.000000 +80283 -1.000000 +80284 -1.000000 +80285 -1.000000 +80286 -1.000000 +80287 -1.000000 +80288 -1.000000 +80289 -1.000000 +80290 -1.000000 +80291 -1.000000 +80292 -1.000000 +80293 -1.000000 +80294 -1.000000 +80295 -1.000000 +80296 -1.000000 +80297 -1.000000 +80298 -1.000000 +80299 -1.000000 +80300 -1.000000 +80301 -1.000000 +80302 -1.000000 +80303 -1.000000 +80304 -1.000000 +80305 -1.000000 +80306 -1.000000 +80307 -1.000000 +80308 -1.000000 +80309 -1.000000 +80310 -1.000000 +80311 -1.000000 +80312 -1.000000 +80313 -1.000000 +80314 -1.000000 +80315 -1.000000 +80316 -1.000000 +80317 -1.000000 +80318 -1.000000 +80319 -1.000000 +80320 -1.000000 +80321 -1.000000 +80322 -1.000000 +80323 -1.000000 +80324 -1.000000 +80325 -1.000000 +80326 -1.000000 +80327 -1.000000 +80328 -1.000000 +80329 -1.000000 +80330 -1.000000 +80332 -1.000000 +80333 -1.000000 +80334 -1.000000 +80335 -1.000000 +80336 -1.000000 +80337 -1.000000 +80338 -1.000000 +80339 -1.000000 +80340 -1.000000 +80341 -1.000000 +80342 -1.000000 +80343 -1.000000 +80344 -1.000000 +80345 -1.000000 +80346 -1.000000 +80347 -1.000000 +80348 -1.000000 +80349 -1.000000 +80350 -1.000000 +80351 -1.000000 +80352 -1.000000 +80353 -1.000000 +80354 -1.000000 +80355 -1.000000 +80356 -1.000000 +80357 -1.000000 +80358 -1.000000 +80359 -1.000000 +80360 -1.000000 +80361 -1.000000 +80362 -1.000000 +80363 -1.000000 +80364 -1.000000 +80365 -1.000000 +80366 -1.000000 +80367 -1.000000 +80368 -1.000000 +80369 -1.000000 +80370 -1.000000 +80371 -1.000000 +80372 -1.000000 +80373 -1.000000 +80374 -1.000000 +80375 -1.000000 +80376 -1.000000 +80377 -1.000000 +80378 -1.000000 +80379 -1.000000 +80380 -1.000000 +80381 -1.000000 +80382 -1.000000 +80383 -1.000000 +80384 -1.000000 +80385 -1.000000 +80386 -1.000000 +80387 -1.000000 +80388 -1.000000 +80389 -1.000000 +80390 -1.000000 +80391 -1.000000 +80392 -1.000000 +80393 -1.000000 +80394 -1.000000 +80395 -1.000000 +80396 -1.000000 +80397 -1.000000 +80398 -1.000000 +80399 -1.000000 +80400 -1.000000 +80401 -1.000000 +80402 -1.000000 +80403 -1.000000 +80404 -1.000000 +80405 -1.000000 +80407 -1.000000 +80408 -1.000000 +80409 -1.000000 +80410 -1.000000 +80411 -1.000000 +80412 -1.000000 +80413 -1.000000 +80414 -1.000000 +80415 -1.000000 +80416 -1.000000 +80417 -1.000000 +80418 -1.000000 +80419 -1.000000 +80420 -1.000000 +80421 -1.000000 +80422 -1.000000 +80423 -1.000000 +80424 -1.000000 +80425 -1.000000 +80426 -1.000000 +80427 -1.000000 +80428 -1.000000 +80429 -1.000000 +80430 -1.000000 +80431 -1.000000 +80432 -1.000000 +80433 -1.000000 +80434 -1.000000 +80435 -1.000000 +80436 -1.000000 +80437 -1.000000 +80438 -1.000000 +80439 -1.000000 +80440 -1.000000 +80441 -1.000000 +80442 -1.000000 +80443 -1.000000 +80444 -1.000000 +80445 -1.000000 +80446 -1.000000 +80447 -1.000000 +80448 -1.000000 +80449 -1.000000 +80450 -1.000000 +80451 -1.000000 +80452 -1.000000 +80453 -1.000000 +80454 -1.000000 +80455 -1.000000 +80456 -1.000000 +80457 -1.000000 +80458 -1.000000 +80459 -1.000000 +80460 -1.000000 +80461 -1.000000 +80462 -1.000000 +80463 -1.000000 +80464 -1.000000 +80465 -1.000000 +80466 -1.000000 +80467 -1.000000 +80468 -1.000000 +80469 -1.000000 +80470 -1.000000 +80471 -1.000000 +80472 -1.000000 +80473 -1.000000 +80474 -1.000000 +80475 -1.000000 +80476 -1.000000 +80477 -1.000000 +80478 -1.000000 +80479 -1.000000 +80480 -1.000000 +80481 -1.000000 +80482 -1.000000 +80483 -1.000000 +80484 -1.000000 +80485 -1.000000 +80486 -1.000000 +80488 -1.000000 +80489 -1.000000 +80490 -1.000000 +80491 -1.000000 +80492 -1.000000 +80493 -1.000000 +80494 -1.000000 +80495 -1.000000 +80496 -1.000000 +80497 -1.000000 +80498 -1.000000 +80499 -1.000000 +80500 -1.000000 +80501 -1.000000 +80502 -1.000000 +80503 -1.000000 +80504 -1.000000 +80505 -1.000000 +80506 -1.000000 +80507 -1.000000 +80508 -1.000000 +80509 -1.000000 +80510 -1.000000 +80513 -1.000000 +80514 -1.000000 +80515 -1.000000 +80516 -1.000000 +80517 -1.000000 +80518 -1.000000 +80519 -1.000000 +80520 -1.000000 +80521 -1.000000 +80522 -1.000000 +80523 -1.000000 +80524 -1.000000 +80525 -1.000000 +80526 -1.000000 +80527 -1.000000 +80528 -1.000000 +80529 -1.000000 +80530 -1.000000 +80531 -1.000000 +80532 -1.000000 +80533 -1.000000 +80534 -1.000000 +80535 -1.000000 +80536 -1.000000 +80537 -1.000000 +80538 -1.000000 +80539 -1.000000 +80540 -1.000000 +80541 -1.000000 +80542 -1.000000 +80543 -1.000000 +80544 -1.000000 +80545 -1.000000 +80546 -1.000000 +80547 -1.000000 +80548 -1.000000 +80549 -1.000000 +80550 -1.000000 +80551 -1.000000 +80552 -1.000000 +80553 -1.000000 +80554 -1.000000 +80555 -1.000000 +80556 -1.000000 +80557 -1.000000 +80558 -1.000000 +80559 -1.000000 +80560 -1.000000 +80561 -1.000000 +80562 -1.000000 +80563 -1.000000 +80564 -1.000000 +80565 -1.000000 +80566 -1.000000 +80567 -1.000000 +80568 -1.000000 +80569 -1.000000 +80570 -1.000000 +80571 -1.000000 +80572 -1.000000 +80573 -1.000000 +80574 -1.000000 +80575 -1.000000 +80576 -1.000000 +80577 -1.000000 +80578 -1.000000 +80579 -1.000000 +80580 -1.000000 +80581 -1.000000 +80582 -1.000000 +80583 -1.000000 +80584 -1.000000 +80585 -1.000000 +80586 -1.000000 +80587 -1.000000 +80588 -1.000000 +80589 -1.000000 +80590 -1.000000 +80591 -1.000000 +80592 -1.000000 +80593 -1.000000 +80594 -1.000000 +80595 -1.000000 +80596 -1.000000 +80597 -1.000000 +80598 -1.000000 +80599 -1.000000 +80600 -1.000000 +80601 -1.000000 +80602 -1.000000 +80603 -1.000000 +80604 -1.000000 +80606 -1.000000 +80607 -1.000000 +80608 -1.000000 +80610 -1.000000 +80611 -1.000000 +80612 -1.000000 +80613 -1.000000 +80614 -1.000000 +80615 -1.000000 +80616 -1.000000 +80617 -1.000000 +80619 -1.000000 +80620 -1.000000 +80621 -1.000000 +80622 -1.000000 +80623 -1.000000 +80624 -1.000000 +80625 -1.000000 +80626 -1.000000 +80627 -1.000000 +80628 -1.000000 +80629 -1.000000 +80630 -1.000000 +80631 -1.000000 +80632 -1.000000 +80633 -1.000000 +80634 -1.000000 +80635 -1.000000 +80636 -1.000000 +80637 -1.000000 +80638 -1.000000 +80639 -1.000000 +80640 -1.000000 +80641 -1.000000 +80642 -1.000000 +80643 -1.000000 +80644 -1.000000 +80645 -1.000000 +80646 -1.000000 +80647 -1.000000 +80648 -1.000000 +80649 -1.000000 +80650 -1.000000 +80651 -1.000000 +80653 -1.000000 +80654 -1.000000 +80655 -1.000000 +80656 -1.000000 +80657 -1.000000 +80658 -1.000000 +80659 -1.000000 +80660 -1.000000 +80661 -1.000000 +80662 -1.000000 +80663 -1.000000 +80664 -1.000000 +80665 -1.000000 +80666 -1.000000 +80667 -1.000000 +80668 -1.000000 +80669 -1.000000 +80670 -1.000000 +80671 -1.000000 +80672 -1.000000 +80673 -1.000000 +80674 -1.000000 +80675 -1.000000 +80676 -1.000000 +80677 -1.000000 +80678 -1.000000 +80679 -1.000000 +80680 -1.000000 +80681 -1.000000 +80682 -1.000000 +80683 -1.000000 +80684 -1.000000 +80685 -1.000000 +80686 -1.000000 +80687 -1.000000 +80688 -1.000000 +80689 -1.000000 +80690 -1.000000 +80691 -1.000000 +80692 -1.000000 +80693 -1.000000 +80694 -1.000000 +80695 -1.000000 +80696 -1.000000 +80698 -1.000000 +80699 -1.000000 +80700 -1.000000 +80701 -1.000000 +80702 -1.000000 +80703 -1.000000 +80704 -1.000000 +80705 -1.000000 +80707 -1.000000 +80709 -1.000000 +80710 -1.000000 +80711 -1.000000 +80712 -1.000000 +80713 -1.000000 +80714 -1.000000 +80715 -1.000000 +80716 -1.000000 +80717 -1.000000 +80718 -1.000000 +80719 -1.000000 +80720 -1.000000 +80721 -1.000000 +80722 -1.000000 +80723 -1.000000 +80724 -1.000000 +80725 -1.000000 +80726 -1.000000 +80727 -1.000000 +80728 -1.000000 +80729 -1.000000 +80730 -1.000000 +80731 -1.000000 +80732 -1.000000 +80733 -1.000000 +80734 -1.000000 +80735 -1.000000 +80736 -1.000000 +80737 -1.000000 +80738 -1.000000 +80739 -1.000000 +80740 -1.000000 +80741 -1.000000 +80742 -1.000000 +80743 -1.000000 +80744 -1.000000 +80745 -1.000000 +80746 -1.000000 +80747 -1.000000 +80748 -1.000000 +80750 -1.000000 +80751 -1.000000 +80752 -1.000000 +80753 -1.000000 +80754 -1.000000 +80755 -1.000000 +80756 -1.000000 +80757 -1.000000 +80758 -1.000000 +80759 -1.000000 +80760 -1.000000 +80761 -1.000000 +80762 -1.000000 +80765 -1.000000 +80766 -1.000000 +80767 -1.000000 +80768 -1.000000 +80769 -1.000000 +80770 -1.000000 +80771 -1.000000 +80775 -1.000000 +80776 -1.000000 +80777 -1.000000 +80778 -1.000000 +80779 -1.000000 +80780 -1.000000 +80781 -1.000000 +80782 -1.000000 +80783 -1.000000 +80784 -1.000000 +80785 -1.000000 +80786 -1.000000 +80787 -1.000000 +80788 -1.000000 +80789 -1.000000 +80790 -1.000000 +80791 -1.000000 +80792 -1.000000 +80793 -1.000000 +80794 -1.000000 +80795 -1.000000 +80796 -1.000000 +80797 -1.000000 +80798 -1.000000 +80799 -1.000000 +80800 -1.000000 +80801 -1.000000 +80802 -1.000000 +80803 -1.000000 +80804 -1.000000 +80805 -1.000000 +80806 -1.000000 +80807 -1.000000 +80808 -1.000000 +80809 -1.000000 +80810 -1.000000 +80811 -1.000000 +80812 -1.000000 +80813 -1.000000 +80814 -1.000000 +80815 -1.000000 +80816 -1.000000 +80817 -1.000000 +80820 -1.000000 +80828 -1.000000 +80829 -1.000000 +80830 -1.000000 +80831 -1.000000 +80832 -1.000000 +80833 -1.000000 +80834 -1.000000 +80835 -1.000000 +80836 -1.000000 +80837 -1.000000 +80838 -1.000000 +80839 -1.000000 +80840 -1.000000 +80841 -1.000000 +80842 -1.000000 +80843 -1.000000 +80844 -1.000000 +80845 -1.000000 +80846 -1.000000 +80849 -1.000000 +80850 -1.000000 +80851 -1.000000 +80852 -1.000000 +80854 -1.000000 +80855 -1.000000 +80856 -1.000000 +80857 -1.000000 +80858 -1.000000 +80859 -1.000000 +80860 -1.000000 +80861 -1.000000 +80862 -1.000000 +80863 -1.000000 +80864 -1.000000 +80865 -1.000000 +80866 -1.000000 +80867 -1.000000 +80868 -1.000000 +80869 -1.000000 +80870 -1.000000 +80871 -1.000000 +80872 -1.000000 +80873 -1.000000 +80875 -1.000000 +80876 -1.000000 +80877 -1.000000 +80878 -1.000000 +80879 -1.000000 +80880 -1.000000 +80881 -1.000000 +80882 -1.000000 +80883 -1.000000 +80884 -1.000000 +80885 -1.000000 +80886 -1.000000 +80887 -1.000000 +80888 -1.000000 +80889 -1.000000 +80890 -1.000000 +80891 -1.000000 +80892 -1.000000 +80893 -1.000000 +80894 -1.000000 +80895 -1.000000 +80896 -1.000000 +80897 -1.000000 +80898 -1.000000 +80899 -1.000000 +80900 -1.000000 +80901 -1.000000 +80902 -1.000000 +80903 -1.000000 +80904 -1.000000 +80905 -1.000000 +80906 -1.000000 +80907 -1.000000 +80908 -1.000000 +80909 -1.000000 +80910 -1.000000 +80911 -1.000000 +80912 -1.000000 +80913 -1.000000 +80914 -1.000000 +80915 -1.000000 +80916 -1.000000 +80917 -1.000000 +80918 -1.000000 +80919 -1.000000 +80920 -1.000000 +80921 -1.000000 +80922 -1.000000 +80923 -1.000000 +80924 -1.000000 +80925 -1.000000 +80926 -1.000000 +80927 -1.000000 +80928 -1.000000 +80929 -1.000000 +80930 -1.000000 +80931 -1.000000 +80932 -1.000000 +80933 -1.000000 +80934 -1.000000 +80935 -1.000000 +80936 -1.000000 +80937 -1.000000 +80938 -1.000000 +80939 -1.000000 +80940 -1.000000 +80941 -1.000000 +80942 -1.000000 +80943 -1.000000 +80944 -1.000000 +80945 -1.000000 +80946 -1.000000 +80948 -1.000000 +80949 -1.000000 +80950 -1.000000 +80951 -1.000000 +80952 -1.000000 +80953 -1.000000 +80954 -1.000000 +80955 -1.000000 +80956 -1.000000 +80957 -1.000000 +80958 -1.000000 +80959 -1.000000 +80960 -1.000000 +80961 -1.000000 +80963 -1.000000 +80964 -1.000000 +80965 -1.000000 +80966 -1.000000 +80967 -1.000000 +80968 -1.000000 +80969 -1.000000 +80970 -1.000000 +80971 -1.000000 +80973 -1.000000 +80975 -1.000000 +80977 -1.000000 +80978 -1.000000 +80979 -1.000000 +80980 -1.000000 +80981 -1.000000 +80982 -1.000000 +80983 -1.000000 +80984 -1.000000 +80985 -1.000000 +80986 -1.000000 +80987 -1.000000 +80988 -1.000000 +80989 -1.000000 +80990 -1.000000 +80991 -1.000000 +80992 -1.000000 +80993 -1.000000 +80994 -1.000000 +80995 -1.000000 +80996 -1.000000 +80998 -1.000000 +80999 -1.000000 +81000 -1.000000 +81001 -1.000000 +81002 -1.000000 +81003 -1.000000 +81004 -1.000000 +81005 -1.000000 +81006 -1.000000 +81007 -1.000000 +81009 -1.000000 +81010 -1.000000 +81011 -1.000000 +81012 -1.000000 +81013 -1.000000 +81014 -1.000000 +81015 -1.000000 +81016 -1.000000 +81018 -1.000000 +81019 -1.000000 +81020 -1.000000 +81021 -1.000000 +81022 -1.000000 +81023 -1.000000 +81025 -1.000000 +81026 -1.000000 +81027 -1.000000 +81028 -1.000000 +81029 -1.000000 +81030 -1.000000 +81031 -1.000000 +81032 -1.000000 +81033 -1.000000 +81034 -1.000000 +81035 -1.000000 +81036 -1.000000 +81037 -1.000000 +81038 -1.000000 +81039 -1.000000 +81040 -1.000000 +81041 -1.000000 +81042 -1.000000 +81043 -1.000000 +81044 -1.000000 +81045 -1.000000 +81046 -1.000000 +81047 -1.000000 +81048 -1.000000 +81049 -1.000000 +81050 -1.000000 +81051 -1.000000 +81052 -1.000000 +81053 -1.000000 +81054 -1.000000 +81055 -1.000000 +81056 -1.000000 +81057 -1.000000 +81058 -1.000000 +81059 -1.000000 +81060 -1.000000 +81061 -1.000000 +81062 -1.000000 +81063 -1.000000 +81064 -1.000000 +81065 -1.000000 +81066 -1.000000 +81067 -1.000000 +81068 -1.000000 +81069 -1.000000 +81070 -1.000000 +81071 -1.000000 +81072 -1.000000 +81073 -1.000000 +81074 -1.000000 +81075 -1.000000 +81076 -1.000000 +81077 -1.000000 +81078 -1.000000 +81079 -1.000000 +81080 -1.000000 +81081 -1.000000 +81082 -1.000000 +81083 -1.000000 +81084 -1.000000 +81085 -1.000000 +81086 -1.000000 +81087 -1.000000 +81088 -1.000000 +81089 -1.000000 +81090 -1.000000 +81091 -1.000000 +81092 -1.000000 +81093 -1.000000 +81094 -1.000000 +81095 -1.000000 +81096 -1.000000 +81097 -1.000000 +81098 -1.000000 +81099 -1.000000 +81100 -1.000000 +81101 -1.000000 +81102 -1.000000 +81103 -1.000000 +81104 -1.000000 +81105 -1.000000 +81106 -1.000000 +81107 -1.000000 +81108 -1.000000 +81109 -1.000000 +81110 -1.000000 +81111 -1.000000 +81112 -1.000000 +81113 -1.000000 +81114 -1.000000 +81115 -1.000000 +81116 -1.000000 +81117 -1.000000 +81118 -1.000000 +81119 -1.000000 +81120 -1.000000 +81121 -1.000000 +81122 -1.000000 +81123 -1.000000 +81124 -1.000000 +81125 -1.000000 +81126 -1.000000 +81127 -1.000000 +81128 -1.000000 +81129 -1.000000 +81130 -1.000000 +81131 -1.000000 +81132 -1.000000 +81133 -1.000000 +81134 -1.000000 +81135 -1.000000 +81138 -1.000000 +81139 -1.000000 +81140 -1.000000 +81141 -1.000000 +81143 -1.000000 +81146 -1.000000 +81147 -1.000000 +81148 -1.000000 +81149 -1.000000 +81150 -1.000000 +81151 -1.000000 +81152 -1.000000 +81153 -1.000000 +81154 -1.000000 +81155 -1.000000 +81156 -1.000000 +81157 -1.000000 +81158 -1.000000 +81160 -1.000000 +81164 -1.000000 +81165 -1.000000 +81166 -1.000000 +81167 -1.000000 +81168 -1.000000 +81169 -1.000000 +81170 -1.000000 +81171 -1.000000 +81172 -1.000000 +81173 -1.000000 +81174 -1.000000 +81175 -1.000000 +81176 -1.000000 +81177 -1.000000 +81178 -1.000000 +81179 -1.000000 +81180 -1.000000 +81181 -1.000000 +81182 -1.000000 +81183 -1.000000 +81184 -1.000000 +81185 -1.000000 +81189 -1.000000 +81190 -1.000000 +81192 -1.000000 +81194 -1.000000 +81195 -1.000000 +81196 -1.000000 +81198 -1.000000 +81199 -1.000000 +81201 -1.000000 +81202 -1.000000 +81204 -1.000000 +81205 -1.000000 +81206 -1.000000 +81207 -1.000000 +81208 -1.000000 +81209 -1.000000 +81210 -1.000000 +81211 -1.000000 +81212 -1.000000 +81213 -1.000000 +81214 -1.000000 +81215 -1.000000 +81216 -1.000000 +81217 -1.000000 +81218 -1.000000 +81219 -1.000000 +81220 -1.000000 +81221 -1.000000 +81222 -1.000000 +81223 -1.000000 +81224 -1.000000 +81225 -1.000000 +81226 -1.000000 +81227 -1.000000 +81229 -1.000000 +81230 -1.000000 +81231 -1.000000 +81232 -1.000000 +81233 -1.000000 +81234 -1.000000 +81235 -1.000000 +81236 -1.000000 +81237 -1.000000 +81238 -1.000000 +81239 -1.000000 +81240 -1.000000 +81241 -1.000000 +81242 -1.000000 +81243 -1.000000 +81244 -1.000000 +81245 -1.000000 +81246 -1.000000 +81247 -1.000000 +81248 -1.000000 +81249 -1.000000 +81250 -1.000000 +81251 -1.000000 +81252 -1.000000 +81253 -1.000000 +81254 -1.000000 +81255 -1.000000 +81256 -1.000000 +81257 -1.000000 +81258 -1.000000 +81259 -1.000000 +81260 -1.000000 +81261 -1.000000 +81262 -1.000000 +81263 -1.000000 +81264 -1.000000 +81265 -1.000000 +81266 -1.000000 +81267 -1.000000 +81268 -1.000000 +81269 -1.000000 +81270 -1.000000 +81271 -1.000000 +81272 -1.000000 +81273 -1.000000 +81274 -1.000000 +81275 -1.000000 +81276 -1.000000 +81277 -1.000000 +81278 -1.000000 +81279 -1.000000 +81280 -1.000000 +81281 -1.000000 +81282 -1.000000 +81283 -1.000000 +81284 -1.000000 +81285 -1.000000 +81286 -1.000000 +81287 -1.000000 +81288 -1.000000 +81289 -1.000000 +81290 -1.000000 +81291 -1.000000 +81292 -1.000000 +81293 -1.000000 +81294 -1.000000 +81295 -1.000000 +81296 -1.000000 +81297 -1.000000 +81298 -1.000000 +81299 -1.000000 +81300 -1.000000 +81301 -1.000000 +81302 -1.000000 +81303 -1.000000 +81304 -1.000000 +81305 -1.000000 +81306 -1.000000 +81307 -1.000000 +81309 -1.000000 +81310 -1.000000 +81311 -1.000000 +81314 -1.000000 +81315 -1.000000 +81316 -1.000000 +81317 -1.000000 +81318 -1.000000 +81319 -1.000000 +81320 -1.000000 +81321 -1.000000 +81322 -1.000000 +81323 -1.000000 +81324 -1.000000 +81325 -1.000000 +81326 -1.000000 +81327 -1.000000 +81328 -1.000000 +81329 -1.000000 +81330 -1.000000 +81331 -1.000000 +81332 -1.000000 +81333 -1.000000 +81334 -1.000000 +81335 -1.000000 +81336 -1.000000 +81337 -1.000000 +81338 -1.000000 +81339 -1.000000 +81340 -1.000000 +81341 -1.000000 +81342 -1.000000 +81343 -1.000000 +81344 -1.000000 +81345 -1.000000 +81346 -1.000000 +81347 -1.000000 +81348 -1.000000 +81349 -1.000000 +81350 -1.000000 +81351 -1.000000 +81352 -1.000000 +81353 -1.000000 +81354 -1.000000 +81355 -1.000000 +81356 -1.000000 +81357 -1.000000 +81358 -1.000000 +81359 -1.000000 +81360 -1.000000 +81361 -1.000000 +81362 -1.000000 +81363 -1.000000 +81364 -1.000000 +81365 -1.000000 +81366 -1.000000 +81367 -1.000000 +81368 -1.000000 +81369 -1.000000 +81370 -1.000000 +81371 -1.000000 +81372 -1.000000 +81373 -1.000000 +81374 -1.000000 +81375 -1.000000 +81376 -1.000000 +81377 -1.000000 +81378 -1.000000 +81379 -1.000000 +81380 -1.000000 +81381 -1.000000 +81382 -1.000000 +81383 -1.000000 +81384 -1.000000 +81385 -1.000000 +81386 -1.000000 +81387 -1.000000 +81388 -1.000000 +81389 -1.000000 +81390 -1.000000 +81391 -1.000000 +81392 -1.000000 +81393 -1.000000 +81394 -1.000000 +81395 -1.000000 +81396 -1.000000 +81397 -1.000000 +81398 -1.000000 +81399 -1.000000 +81400 -1.000000 +81401 -1.000000 +81402 -1.000000 +81403 -1.000000 +81404 -1.000000 +81405 -1.000000 +81406 -1.000000 +81407 -1.000000 +81408 -1.000000 +81409 -1.000000 +81410 -1.000000 +81411 -1.000000 +81412 -1.000000 +81413 -1.000000 +81414 -1.000000 +81415 -1.000000 +81416 -1.000000 +81417 -1.000000 +81418 -1.000000 +81419 -1.000000 +81420 -1.000000 +81421 -1.000000 +81423 -1.000000 +81424 -1.000000 +81425 -1.000000 +81426 -1.000000 +81427 -1.000000 +81428 -1.000000 +81429 -1.000000 +81430 -1.000000 +81431 -1.000000 +81432 -1.000000 +81433 -1.000000 +81434 -1.000000 +81435 -1.000000 +81436 -1.000000 +81437 -1.000000 +81439 -1.000000 +81440 -1.000000 +81441 -1.000000 +81442 -1.000000 +81443 -1.000000 +81444 -1.000000 +81445 -1.000000 +81446 -1.000000 +81447 -1.000000 +81448 -1.000000 +81449 -1.000000 +81450 -1.000000 +81451 -1.000000 +81452 -1.000000 +81453 -1.000000 +81454 -1.000000 +81455 -1.000000 +81456 -1.000000 +81457 -1.000000 +81458 -1.000000 +81459 -1.000000 +81460 -1.000000 +81461 -1.000000 +81462 -1.000000 +81463 -1.000000 +81464 -1.000000 +81465 -1.000000 +81466 -1.000000 +81467 -1.000000 +81470 -1.000000 +81471 -1.000000 +81472 -1.000000 +81473 -1.000000 +81474 -1.000000 +81475 -1.000000 +81476 -1.000000 +81477 -1.000000 +81478 -1.000000 +81479 -1.000000 +81480 -1.000000 +81481 -1.000000 +81482 -1.000000 +81483 -1.000000 +81484 -1.000000 +81485 -1.000000 +81486 -1.000000 +81487 -1.000000 +81488 -1.000000 +81489 -1.000000 +81490 -1.000000 +81492 -1.000000 +81493 -1.000000 +81494 -1.000000 +81495 -1.000000 +81496 -1.000000 +81497 -1.000000 +81498 -1.000000 +81499 -1.000000 +81500 -1.000000 +81501 -1.000000 +81503 -1.000000 +81504 -1.000000 +81505 -1.000000 +81506 -1.000000 +81507 -1.000000 +81508 -1.000000 +81509 -1.000000 +81510 -1.000000 +81511 -1.000000 +81512 -1.000000 +81513 -1.000000 +81514 -1.000000 +81515 -1.000000 +81518 -1.000000 +81519 -1.000000 +81523 -1.000000 +81524 -1.000000 +81525 -1.000000 +81527 -1.000000 +81528 -1.000000 +81532 -1.000000 +81533 -1.000000 +81534 -1.000000 +81535 -1.000000 +81536 -1.000000 +81537 -1.000000 +81541 -1.000000 +81546 -1.000000 +81551 -1.000000 +81552 -1.000000 +81553 -1.000000 +81560 -1.000000 +81562 -1.000000 +81563 -1.000000 +81564 -1.000000 +81575 -1.000000 +81576 -1.000000 +81577 -1.000000 +81587 -1.000000 +81588 -1.000000 +81589 -1.000000 +81590 -1.000000 +81591 -1.000000 +81592 -1.000000 +81593 -1.000000 +81594 -1.000000 +81595 -1.000000 +81596 -1.000000 +81597 -1.000000 +81598 -1.000000 +81599 -1.000000 +81600 -1.000000 +81601 -1.000000 +81602 -1.000000 +81603 -1.000000 +81604 -1.000000 +81605 -1.000000 +81606 -1.000000 +81607 -1.000000 +81608 -1.000000 +81609 -1.000000 +81611 -1.000000 +81613 -1.000000 +81614 -1.000000 +81615 -1.000000 +81616 -1.000000 +81617 -1.000000 +81618 -1.000000 +81619 -1.000000 +81620 -1.000000 +81621 -1.000000 +81622 -1.000000 +81623 -1.000000 +81624 -1.000000 +81625 -1.000000 +81626 -1.000000 +81627 -1.000000 +81629 -1.000000 +81630 -1.000000 +81631 -1.000000 +81632 -1.000000 +81633 -1.000000 +81634 -1.000000 +81635 -1.000000 +81636 -1.000000 +81639 -1.000000 +81641 -1.000000 +81642 -1.000000 +81644 -1.000000 +81645 -1.000000 +81646 -1.000000 +81647 -1.000000 +81648 -1.000000 +81649 -1.000000 +81650 -1.000000 +81651 -1.000000 +81652 -1.000000 +81653 -1.000000 +81654 -1.000000 +81655 -1.000000 +81656 -1.000000 +81657 -1.000000 +81658 -1.000000 +81659 -1.000000 +81660 -1.000000 +81661 -1.000000 +81662 -1.000000 +81663 -1.000000 +81664 -1.000000 +81665 -1.000000 +81666 -1.000000 +81668 -1.000000 +81669 -1.000000 +81670 -1.000000 +81671 -1.000000 +81672 -1.000000 +81673 -1.000000 +81674 -1.000000 +81675 -1.000000 +81676 -1.000000 +81677 -1.000000 +81678 -1.000000 +81679 -1.000000 +81680 -1.000000 +81681 -1.000000 +81682 -1.000000 +81683 -1.000000 +81684 -1.000000 +81685 -1.000000 +81686 -1.000000 +81687 -1.000000 +81688 -1.000000 +81689 -1.000000 +81690 -1.000000 +81691 -1.000000 +81692 -1.000000 +81693 -1.000000 +81694 -1.000000 +81695 -1.000000 +81696 -1.000000 +81697 -1.000000 +81698 -1.000000 +81699 -1.000000 +81700 -1.000000 +81701 -1.000000 +81702 -1.000000 +81703 -1.000000 +81704 -1.000000 +81705 -1.000000 +81706 -1.000000 +81707 -1.000000 +81708 -1.000000 +81709 -1.000000 +81710 -1.000000 +81711 -1.000000 +81712 -1.000000 +81713 -1.000000 +81715 -1.000000 +81716 -1.000000 +81717 -1.000000 +81718 -1.000000 +81719 -1.000000 +81720 -1.000000 +81721 -1.000000 +81722 -1.000000 +81723 -1.000000 +81724 -1.000000 +81725 -1.000000 +81726 -1.000000 +81728 -1.000000 +81729 -1.000000 +81730 -1.000000 +81732 -1.000000 +81733 -1.000000 +81734 -1.000000 +81735 -1.000000 +81736 -1.000000 +81737 -1.000000 +81738 -1.000000 +81739 -1.000000 +81740 -1.000000 +81741 -1.000000 +81742 -1.000000 +81743 -1.000000 +81744 -1.000000 +81745 -1.000000 +81746 -1.000000 +81747 -1.000000 +81748 -1.000000 +81750 -1.000000 +81751 -1.000000 +81752 -1.000000 +81753 -1.000000 +81754 -1.000000 +81755 -1.000000 +81756 -1.000000 +81757 -1.000000 +81758 -1.000000 +81759 -1.000000 +81760 -1.000000 +81761 -1.000000 +81762 -1.000000 +81763 -1.000000 +81764 -1.000000 +81767 -1.000000 +81768 -1.000000 +81769 -1.000000 +81770 -1.000000 +81771 -1.000000 +81772 -1.000000 +81773 -1.000000 +81774 -1.000000 +81775 -1.000000 +81776 -1.000000 +81777 -1.000000 +81778 -1.000000 +81779 -1.000000 +81780 -1.000000 +81783 -1.000000 +81784 -1.000000 +81785 -1.000000 +81786 -1.000000 +81787 -1.000000 +81790 -1.000000 +81791 -1.000000 +81792 -1.000000 +81793 -1.000000 +81794 -1.000000 +81795 -1.000000 +81796 -1.000000 +81797 -1.000000 +81798 -1.000000 +81800 -1.000000 +81802 -1.000000 +81805 -1.000000 +81806 -1.000000 +81807 -1.000000 +81808 -1.000000 +81809 -1.000000 +81810 -1.000000 +81811 -1.000000 +81812 -1.000000 +81813 -1.000000 +81814 -1.000000 +81815 -1.000000 +81816 -1.000000 +81817 -1.000000 +81818 -1.000000 +81822 -1.000000 +81825 -1.000000 +81828 -1.000000 +81829 -1.000000 +81830 -1.000000 +81831 -1.000000 +81832 -1.000000 +81835 -1.000000 +81836 -1.000000 +81837 -1.000000 +81838 -1.000000 +81839 -1.000000 +81840 -1.000000 +81841 -1.000000 +81842 -1.000000 +81843 -1.000000 +81844 -1.000000 +81845 -1.000000 +81846 -1.000000 +81847 -1.000000 +81848 -1.000000 +81849 -1.000000 +81850 -1.000000 +81851 -1.000000 +81852 -1.000000 +81853 -1.000000 +81854 -1.000000 +81855 -1.000000 +81856 -1.000000 +81857 -1.000000 +81858 -1.000000 +81859 -1.000000 +81860 -1.000000 +81861 -1.000000 +81862 -1.000000 +81863 -1.000000 +81864 -1.000000 +81865 -1.000000 +81866 -1.000000 +81868 -1.000000 +81869 -1.000000 +81870 -1.000000 +81871 -1.000000 +81872 -1.000000 +81873 -1.000000 +81874 -1.000000 +81875 -1.000000 +81876 -1.000000 +81877 -1.000000 +81878 -1.000000 +81879 -1.000000 +81880 -1.000000 +81881 -1.000000 +81882 -1.000000 +81883 -1.000000 +81884 -1.000000 +81885 -1.000000 +81886 -1.000000 +81887 -1.000000 +81888 -1.000000 +81889 -1.000000 +81890 -1.000000 +81891 -1.000000 +81892 -1.000000 +81893 -1.000000 +81894 -1.000000 +81895 -1.000000 +81896 -1.000000 +81897 -1.000000 +81898 -1.000000 +81899 -1.000000 +81900 -1.000000 +81901 -1.000000 +81902 -1.000000 +81903 -1.000000 +81904 -1.000000 +81905 -1.000000 +81906 -1.000000 +81907 -1.000000 +81908 -1.000000 +81909 -1.000000 +81910 -1.000000 +81911 -1.000000 +81912 -1.000000 +81913 -1.000000 +81915 -1.000000 +81917 -1.000000 +81918 -1.000000 +81919 -1.000000 +81920 -1.000000 +81931 -1.000000 +81935 -1.000000 +81936 -1.000000 +81937 -1.000000 +81938 -1.000000 +81939 -1.000000 +81940 -1.000000 +81941 -1.000000 +81942 -1.000000 +81943 -1.000000 +81944 -1.000000 +81945 -1.000000 +81946 -1.000000 +81947 -1.000000 +81948 -1.000000 +81949 -1.000000 +81950 -1.000000 +81951 -1.000000 +81952 -1.000000 +81954 -1.000000 +81955 -1.000000 +81956 -1.000000 +81957 -1.000000 +81958 -1.000000 +81959 -1.000000 +81960 -1.000000 +81961 -1.000000 +81962 -1.000000 +81963 -1.000000 +81964 -1.000000 +81965 -1.000000 +81966 -1.000000 +81967 -1.000000 +81968 -1.000000 +81969 -1.000000 +81970 -1.000000 +81971 -1.000000 +81972 -1.000000 +81973 -1.000000 +81974 -1.000000 +81975 -1.000000 +81976 -1.000000 +81977 -1.000000 +81979 -1.000000 +81980 -1.000000 +81981 -1.000000 +81982 -1.000000 +81984 -1.000000 +81986 -1.000000 +81987 -1.000000 +81988 -1.000000 +81989 -1.000000 +81991 -1.000000 +81993 -1.000000 +81994 -1.000000 +81995 -1.000000 +81996 -1.000000 +81997 -1.000000 +81998 -1.000000 +81999 -1.000000 +82000 -1.000000 +82002 -1.000000 +82003 -1.000000 +82006 -1.000000 +82007 -1.000000 +82008 -1.000000 +82009 -1.000000 +82010 -1.000000 +82011 -1.000000 +82014 -1.000000 +82017 -1.000000 +82018 -1.000000 +82019 -1.000000 +82020 -1.000000 +82021 -1.000000 +82022 -1.000000 +82026 -1.000000 +82027 -1.000000 +82028 -1.000000 +82029 -1.000000 +82030 -1.000000 +82031 -1.000000 +82032 -1.000000 +82033 -1.000000 +82035 -1.000000 +82036 -1.000000 +82037 -1.000000 +82038 -1.000000 +82039 -1.000000 +82040 -1.000000 +82041 -1.000000 +82042 -1.000000 +82043 -1.000000 +82044 -1.000000 +82045 -1.000000 +82046 -1.000000 +82047 -1.000000 +82048 -1.000000 +82049 -1.000000 +82050 -1.000000 +82051 -1.000000 +82052 -1.000000 +82053 -1.000000 +82054 -1.000000 +82055 -1.000000 +82056 -1.000000 +82057 -1.000000 +82058 -1.000000 +82059 -1.000000 +82060 -1.000000 +82061 -1.000000 +82062 -1.000000 +82063 -1.000000 +82064 -1.000000 +82065 -1.000000 +82066 -1.000000 +82067 -1.000000 +82068 -1.000000 +82069 -1.000000 +82070 -1.000000 +82071 -1.000000 +82072 -1.000000 +82073 -1.000000 +82074 -1.000000 +82075 -1.000000 +82076 -1.000000 +82077 -1.000000 +82078 -1.000000 +82079 -1.000000 +82080 -1.000000 +82081 -1.000000 +82082 -1.000000 +82083 -1.000000 +82084 -1.000000 +82085 -1.000000 +82086 -1.000000 +82087 -1.000000 +82088 -1.000000 +82089 -1.000000 +82090 -1.000000 +82091 -1.000000 +82092 -1.000000 +82093 -1.000000 +82094 -1.000000 +82095 -1.000000 +82096 -1.000000 +82097 -1.000000 +82098 -1.000000 +82099 -1.000000 +82100 -1.000000 +82101 -1.000000 +82102 -1.000000 +82103 -1.000000 +82104 -1.000000 +82105 -1.000000 +82106 -1.000000 +82107 -1.000000 +82108 -1.000000 +82109 -1.000000 +82110 -1.000000 +82111 -1.000000 +82112 -1.000000 +82113 -1.000000 +82114 -1.000000 +82115 -1.000000 +82116 -1.000000 +82117 -1.000000 +82118 -1.000000 +82119 -1.000000 +82120 -1.000000 +82121 -1.000000 +82122 -1.000000 +82123 -1.000000 +82124 -1.000000 +82125 -1.000000 +82126 -1.000000 +82127 -1.000000 +82128 -1.000000 +82129 -1.000000 +82130 -1.000000 +82131 -1.000000 +82132 -1.000000 +82133 -1.000000 +82134 -1.000000 +82135 -1.000000 +82136 -1.000000 +82137 -1.000000 +82138 -1.000000 +82139 -1.000000 +82141 -1.000000 +82142 -1.000000 +82143 -1.000000 +82144 -1.000000 +82145 -1.000000 +82146 -1.000000 +82147 -1.000000 +82148 -1.000000 +82149 -1.000000 +82150 -1.000000 +82151 -1.000000 +82152 -1.000000 +82153 -1.000000 +82154 -1.000000 +82155 -1.000000 +82156 -1.000000 +82158 -1.000000 +82159 -1.000000 +82160 -1.000000 +82161 -1.000000 +82162 -1.000000 +82163 -1.000000 +82164 -1.000000 +82165 -1.000000 +82166 -1.000000 +82167 -1.000000 +82168 -1.000000 +82169 -1.000000 +82170 -1.000000 +82171 -1.000000 +82172 -1.000000 +82173 -1.000000 +82174 -1.000000 +82175 -1.000000 +82176 -1.000000 +82177 -1.000000 +82178 -1.000000 +82179 -1.000000 +82180 -1.000000 +82181 -1.000000 +82182 -1.000000 +82183 -1.000000 +82184 -1.000000 +82185 -1.000000 +82186 -1.000000 +82187 -1.000000 +82188 -1.000000 +82189 -1.000000 +82190 -1.000000 +82191 -1.000000 +82192 -1.000000 +82193 -1.000000 +82194 -1.000000 +82195 -1.000000 +82197 -1.000000 +82198 -1.000000 +82199 -1.000000 +82200 -1.000000 +82201 -1.000000 +82202 -1.000000 +82203 -1.000000 +82204 -1.000000 +82205 -1.000000 +82206 -1.000000 +82207 -1.000000 +82208 -1.000000 +82209 -1.000000 +82210 -1.000000 +82211 -1.000000 +82212 -1.000000 +82213 -1.000000 +82214 -1.000000 +82215 -1.000000 +82216 -1.000000 +82217 -1.000000 +82219 -1.000000 +82220 -1.000000 +82221 -1.000000 +82222 -1.000000 +82223 -1.000000 +82224 -1.000000 +82225 -1.000000 +82226 -1.000000 +82227 -1.000000 +82228 -1.000000 +82229 -1.000000 +82230 -1.000000 +82231 -1.000000 +82232 -1.000000 +82233 -1.000000 +82234 -1.000000 +82235 -1.000000 +82236 -1.000000 +82237 -1.000000 +82238 -1.000000 +82239 -1.000000 +82240 -1.000000 +82241 -1.000000 +82242 -1.000000 +82243 -1.000000 +82244 -1.000000 +82245 -1.000000 +82247 -1.000000 +82251 -1.000000 +82252 -1.000000 +82253 -1.000000 +82254 -1.000000 +82255 -1.000000 +82256 -1.000000 +82260 -1.000000 +82261 -1.000000 +82262 -1.000000 +82263 -1.000000 +82264 -1.000000 +82265 -1.000000 +82266 -1.000000 +82267 -1.000000 +82268 -1.000000 +82269 -1.000000 +82270 -1.000000 +82271 -1.000000 +82272 -1.000000 +82273 -1.000000 +82274 -1.000000 +82275 -1.000000 +82276 -1.000000 +82277 -1.000000 +82278 -1.000000 +82279 -1.000000 +82280 -1.000000 +82282 -1.000000 +82283 -1.000000 +82284 -1.000000 +82285 -1.000000 +82286 -1.000000 +82287 -1.000000 +82288 -1.000000 +82289 -1.000000 +82290 -1.000000 +82291 -1.000000 +82292 -1.000000 +82293 -1.000000 +82294 -1.000000 +82295 -1.000000 +82297 -1.000000 +82298 -1.000000 +82300 -1.000000 +82301 -1.000000 +82302 -1.000000 +82303 -1.000000 +82305 -1.000000 +82306 -1.000000 +82308 -1.000000 +82309 -1.000000 +82310 -1.000000 +82315 -1.000000 +82316 -1.000000 +82317 -1.000000 +82319 -1.000000 +82321 -1.000000 +82322 -1.000000 +82323 -1.000000 +82324 -1.000000 +82325 -1.000000 +82326 -1.000000 +82327 -1.000000 +82328 -1.000000 +82329 -1.000000 +82330 -1.000000 +82331 -1.000000 +82332 -1.000000 +82335 -1.000000 +82341 -1.000000 +82343 -1.000000 +82344 -1.000000 +82345 -1.000000 +82346 -1.000000 +82347 -1.000000 +82348 -1.000000 +82349 -1.000000 +82350 -1.000000 +82351 -1.000000 +82352 -1.000000 +82353 -1.000000 +82354 -1.000000 +82355 -1.000000 +82356 -1.000000 +82357 -1.000000 +82358 -1.000000 +82359 -1.000000 +82360 -1.000000 +82361 -1.000000 +82362 -1.000000 +82363 -1.000000 +82364 -1.000000 +82365 -1.000000 +82366 -1.000000 +82367 -1.000000 +82368 -1.000000 +82369 -1.000000 +82370 -1.000000 +82371 -1.000000 +82372 -1.000000 +82373 -1.000000 +82374 -1.000000 +82375 -1.000000 +82376 -1.000000 +82377 -1.000000 +82378 -1.000000 +82379 -1.000000 +82380 -1.000000 +82381 -1.000000 +82382 -1.000000 +82383 -1.000000 +82384 -1.000000 +82385 -1.000000 +82386 -1.000000 +82387 -1.000000 +82388 -1.000000 +82389 -1.000000 +82391 -1.000000 +82392 -1.000000 +82394 -1.000000 +82395 -1.000000 +82396 -1.000000 +82397 -1.000000 +82398 -1.000000 +82399 -1.000000 +82400 -1.000000 +82401 -1.000000 +82402 -1.000000 +82403 -1.000000 +82404 -1.000000 +82405 -1.000000 +82406 -1.000000 +82407 -1.000000 +82408 -1.000000 +82410 -1.000000 +82411 -1.000000 +82412 -1.000000 +82413 -1.000000 +82414 -1.000000 +82416 -1.000000 +82417 -1.000000 +82418 -1.000000 +82419 -1.000000 +82420 -1.000000 +82421 -1.000000 +82422 -1.000000 +82423 -1.000000 +82424 -1.000000 +82425 -1.000000 +82426 -1.000000 +82427 -1.000000 +82428 -1.000000 +82429 -1.000000 +82430 -1.000000 +82431 -1.000000 +82432 -1.000000 +82433 -1.000000 +82434 -1.000000 +82435 -1.000000 +82436 -1.000000 +82437 -1.000000 +82438 -1.000000 +82439 -1.000000 +82440 -1.000000 +82441 -1.000000 +82442 -1.000000 +82443 -1.000000 +82444 -1.000000 +82445 -1.000000 +82446 -1.000000 +82447 -1.000000 +82448 -1.000000 +82449 -1.000000 +82450 -1.000000 +82451 -1.000000 +82452 -1.000000 +82453 -1.000000 +82454 -1.000000 +82455 -1.000000 +82456 -1.000000 +82457 -1.000000 +82458 -1.000000 +82459 -1.000000 +82461 -1.000000 +82462 -1.000000 +82463 -1.000000 +82464 -1.000000 +82467 -1.000000 +82468 -1.000000 +82469 -1.000000 +82471 -1.000000 +82472 -1.000000 +82474 -1.000000 +82475 -1.000000 +82476 -1.000000 +82477 -1.000000 +82478 -1.000000 +82479 -1.000000 +82480 -1.000000 +82481 -1.000000 +82482 -1.000000 +82483 -1.000000 +82484 -1.000000 +82485 -1.000000 +82486 -1.000000 +82487 -1.000000 +82488 -1.000000 +82489 -1.000000 +82490 -1.000000 +82491 -1.000000 +82492 -1.000000 +82493 -1.000000 +82494 -1.000000 +82496 -1.000000 +82497 -1.000000 +82498 -1.000000 +82501 -1.000000 +82503 -1.000000 +82505 -1.000000 +82506 -1.000000 +82507 -1.000000 +82508 -1.000000 +82509 -1.000000 +82510 -1.000000 +82511 -1.000000 +82512 -1.000000 +82513 -1.000000 +82514 -1.000000 +82515 -1.000000 +82516 -1.000000 +82517 -1.000000 +82518 -1.000000 +82519 -1.000000 +82520 -1.000000 +82521 -1.000000 +82522 -1.000000 +82523 -1.000000 +82524 -1.000000 +82525 -1.000000 +82526 -1.000000 +82527 -1.000000 +82528 -1.000000 +82529 -1.000000 +82530 -1.000000 +82531 -1.000000 +82532 -1.000000 +82533 -1.000000 +82534 -1.000000 +82535 -1.000000 +82536 -1.000000 +82537 -1.000000 +82538 -1.000000 +82539 -1.000000 +82540 -1.000000 +82541 -1.000000 +82542 -1.000000 +82543 -1.000000 +82544 -1.000000 +82545 -1.000000 +82546 -1.000000 +82547 -1.000000 +82548 -1.000000 +82549 -1.000000 +82550 -1.000000 +82552 -1.000000 +82557 -1.000000 +82558 -1.000000 +82559 -1.000000 +82560 -1.000000 +82561 -1.000000 +82562 -1.000000 +82563 -1.000000 +82564 -1.000000 +82565 -1.000000 +82566 -1.000000 +82567 -1.000000 +82568 -1.000000 +82570 -1.000000 +82571 -1.000000 +82573 -1.000000 +82574 -1.000000 +82575 -1.000000 +82576 -1.000000 +82579 -1.000000 +82580 -1.000000 +82581 -1.000000 +82582 -1.000000 +82583 -1.000000 +82584 -1.000000 +82585 -1.000000 +82586 -1.000000 +82587 -1.000000 +82588 -1.000000 +82591 -1.000000 +82592 -1.000000 +82593 -1.000000 +82594 -1.000000 +82595 -1.000000 +82596 -1.000000 +82597 -1.000000 +82598 -1.000000 +82599 -1.000000 +82600 -1.000000 +82601 -1.000000 +82602 -1.000000 +82603 -1.000000 +82604 -1.000000 +82605 -1.000000 +82606 -1.000000 +82607 -1.000000 +82608 -1.000000 +82609 -1.000000 +82610 -1.000000 +82611 -1.000000 +82612 -1.000000 +82613 -1.000000 +82614 -1.000000 +82615 -1.000000 +82616 -1.000000 +82617 -1.000000 +82618 -1.000000 +82619 -1.000000 +82620 -1.000000 +82621 -1.000000 +82622 -1.000000 +82623 -1.000000 +82624 -1.000000 +82625 -1.000000 +82626 -1.000000 +82627 -1.000000 +82628 -1.000000 +82629 -1.000000 +82630 -1.000000 +82631 -1.000000 +82632 -1.000000 +82633 -1.000000 +82634 -1.000000 +82635 -1.000000 +82636 -1.000000 +82637 -1.000000 +82638 -1.000000 +82639 -1.000000 +82640 -1.000000 +82641 -1.000000 +82642 -1.000000 +82643 -1.000000 +82644 -1.000000 +82645 -1.000000 +82646 -1.000000 +82647 -1.000000 +82648 -1.000000 +82649 -1.000000 +82650 -1.000000 +82651 -1.000000 +82653 -1.000000 +82655 -1.000000 +82656 -1.000000 +82658 -1.000000 +82659 -1.000000 +82660 -1.000000 +82661 -1.000000 +82662 -1.000000 +82663 -1.000000 +82664 -1.000000 +82665 -1.000000 +82666 -1.000000 +82667 -1.000000 +82668 -1.000000 +82670 -1.000000 +82671 -1.000000 +82672 -1.000000 +82675 -1.000000 +82676 -1.000000 +82677 -1.000000 +82678 -1.000000 +82679 -1.000000 +82680 -1.000000 +82681 -1.000000 +82682 -1.000000 +82683 -1.000000 +82684 -1.000000 +82685 -1.000000 +82686 -1.000000 +82688 -1.000000 +82689 -1.000000 +82690 -1.000000 +82691 -1.000000 +82692 -1.000000 +82693 -1.000000 +82694 -1.000000 +82695 -1.000000 +82696 -1.000000 +82697 -1.000000 +82699 -1.000000 +82700 -1.000000 +82701 -1.000000 +82702 -1.000000 +82703 -1.000000 +82704 -1.000000 +82705 -1.000000 +82706 -1.000000 +82707 -1.000000 +82708 -1.000000 +82709 -1.000000 +82710 -1.000000 +82711 -1.000000 +82712 -1.000000 +82713 -1.000000 +82714 -1.000000 +82715 -1.000000 +82716 -1.000000 +82717 -1.000000 +82718 -1.000000 +82719 -1.000000 +82720 -1.000000 +82721 -1.000000 +82722 -1.000000 +82723 -1.000000 +82724 -1.000000 +82725 -1.000000 +82726 -1.000000 +82727 -1.000000 +82728 -1.000000 +82729 -1.000000 +82733 -1.000000 +82734 -1.000000 +82735 -1.000000 +82736 -1.000000 +82737 -1.000000 +82738 -1.000000 +82739 -1.000000 +82740 -1.000000 +82741 -1.000000 +82742 -1.000000 +82743 -1.000000 +82744 -1.000000 +82745 -1.000000 +82746 -1.000000 +82747 -1.000000 +82748 -1.000000 +82749 -1.000000 +82750 -1.000000 +82751 -1.000000 +82755 -1.000000 +82757 -1.000000 +82759 -1.000000 +82760 -1.000000 +82761 -1.000000 +82762 -1.000000 +82763 -1.000000 +82764 -1.000000 +82765 -1.000000 +82766 -1.000000 +82767 -1.000000 +82768 -1.000000 +82769 -1.000000 +82770 -1.000000 +82771 -1.000000 +82772 -1.000000 +82773 -1.000000 +82774 -1.000000 +82776 -1.000000 +82777 -1.000000 +82778 -1.000000 +82779 -1.000000 +82781 -1.000000 +82782 -1.000000 +82783 -1.000000 +82784 -1.000000 +82785 -1.000000 +82786 -1.000000 +82787 -1.000000 +82788 -1.000000 +82789 -1.000000 +82790 -1.000000 +82791 -1.000000 +82792 -1.000000 +82793 -1.000000 +82794 -1.000000 +82795 -1.000000 +82796 -1.000000 +82798 -1.000000 +82799 -1.000000 +82800 -1.000000 +82801 -1.000000 +82802 -1.000000 +82803 -1.000000 +82804 -1.000000 +82805 -1.000000 +82806 -1.000000 +82808 -1.000000 +82809 -1.000000 +82812 -1.000000 +82814 -1.000000 +82815 -1.000000 +82816 -1.000000 +82818 -1.000000 +82823 -1.000000 +82832 -1.000000 +82833 -1.000000 +82834 -1.000000 +82835 -1.000000 +82836 -1.000000 +82837 -1.000000 +82838 -1.000000 +82839 -1.000000 +82840 -1.000000 +82841 -1.000000 +82842 -1.000000 +82843 -1.000000 +82844 -1.000000 +82845 -1.000000 +82846 -1.000000 +82847 -1.000000 +82848 -1.000000 +82849 -1.000000 +82850 -1.000000 +82854 -1.000000 +82855 -1.000000 +82856 -1.000000 +82857 -1.000000 +82859 -1.000000 +82860 -1.000000 +82863 -1.000000 +82864 -1.000000 +82865 -1.000000 +82866 -1.000000 +82868 -1.000000 +82869 -1.000000 +82870 -1.000000 +82871 -1.000000 +82872 -1.000000 +82873 -1.000000 +82875 -1.000000 +82877 -1.000000 +82878 -1.000000 +82879 -1.000000 +82880 -1.000000 +82881 -1.000000 +82882 -1.000000 +82883 -1.000000 +82884 -1.000000 +82885 -1.000000 +82886 -1.000000 +82887 -1.000000 +82888 -1.000000 +82889 -1.000000 +82890 -1.000000 +82891 -1.000000 +82892 -1.000000 +82894 -1.000000 +82895 -1.000000 +82897 -1.000000 +82898 -1.000000 +82899 -1.000000 +82900 -1.000000 +82901 -1.000000 +82902 -1.000000 +82903 -1.000000 +82904 -1.000000 +82906 -1.000000 +82907 -1.000000 +82908 -1.000000 +82909 -1.000000 +82910 -1.000000 +82911 -1.000000 +82912 -1.000000 +82913 -1.000000 +82914 -1.000000 +82915 -1.000000 +82916 -1.000000 +82917 -1.000000 +82918 -1.000000 +82919 -1.000000 +82920 -1.000000 +82921 -1.000000 +82922 -1.000000 +82923 -1.000000 +82924 -1.000000 +82925 -1.000000 +82926 -1.000000 +82928 -1.000000 +82929 -1.000000 +82930 -1.000000 +82931 -1.000000 +82935 -1.000000 +82936 -1.000000 +82944 -1.000000 +82945 -1.000000 +82946 -1.000000 +82947 -1.000000 +82948 -1.000000 +82949 -1.000000 +82950 -1.000000 +82951 -1.000000 +82952 -1.000000 +82953 -1.000000 +82954 -1.000000 +82957 -1.000000 +82958 -1.000000 +82959 -1.000000 +82961 -1.000000 +82964 -1.000000 +82965 -1.000000 +82966 -1.000000 +82967 -1.000000 +82968 -1.000000 +82969 -1.000000 +82970 -1.000000 +82971 -1.000000 +82972 -1.000000 +82973 -1.000000 +82974 -1.000000 +82975 -1.000000 +82977 -1.000000 +82978 -1.000000 +82979 -1.000000 +82982 -1.000000 +82983 -1.000000 +82984 -1.000000 +82985 -1.000000 +82986 -1.000000 +82987 -1.000000 +82988 -1.000000 +82989 -1.000000 +82990 -1.000000 +82991 -1.000000 +82992 -1.000000 +82993 -1.000000 +82994 -1.000000 +82995 -1.000000 +82996 -1.000000 +82997 -1.000000 +82998 -1.000000 +82999 -1.000000 +83000 -1.000000 +83001 -1.000000 +83002 -1.000000 +83003 -1.000000 +83004 -1.000000 +83005 -1.000000 +83006 -1.000000 +83007 -1.000000 +83008 -1.000000 +83009 -1.000000 +83010 -1.000000 +83011 -1.000000 +83012 -1.000000 +83013 -1.000000 +83014 -1.000000 +83015 -1.000000 +83016 -1.000000 +83017 -1.000000 +83018 -1.000000 +83019 -1.000000 +83020 -1.000000 +83021 -1.000000 +83022 -1.000000 +83023 -1.000000 +83024 -1.000000 +83025 -1.000000 +83026 -1.000000 +83027 -1.000000 +83028 -1.000000 +83029 -1.000000 +83030 -1.000000 +83031 -1.000000 +83032 -1.000000 +83033 -1.000000 +83034 -1.000000 +83035 -1.000000 +83036 -1.000000 +83043 -1.000000 +83044 -1.000000 +83046 -1.000000 +83049 -1.000000 +83050 -1.000000 +83052 -1.000000 +83055 -1.000000 +83056 -1.000000 +83057 -1.000000 +83058 -1.000000 +83059 -1.000000 +83060 -1.000000 +83061 -1.000000 +83062 -1.000000 +83063 -1.000000 +83064 -1.000000 +83066 -1.000000 +83067 -1.000000 +83068 -1.000000 +83069 -1.000000 +83070 -1.000000 +83071 -1.000000 +83072 -1.000000 +83073 -1.000000 +83074 -1.000000 +83075 -1.000000 +83076 -1.000000 +83077 -1.000000 +83078 -1.000000 +83079 -1.000000 +83080 -1.000000 +83081 -1.000000 +83082 -1.000000 +83084 -1.000000 +83085 -1.000000 +83086 -1.000000 +83087 -1.000000 +83088 -1.000000 +83089 -1.000000 +83090 -1.000000 +83091 -1.000000 +83092 -1.000000 +83093 -1.000000 +83094 -1.000000 +83095 -1.000000 +83096 -1.000000 +83097 -1.000000 +83098 -1.000000 +83099 -1.000000 +83100 -1.000000 +83101 -1.000000 +83102 -1.000000 +83103 -1.000000 +83104 -1.000000 +83105 -1.000000 +83106 -1.000000 +83107 -1.000000 +83108 -1.000000 +83109 -1.000000 +83110 -1.000000 +83111 -1.000000 +83112 -1.000000 +83113 -1.000000 +83114 -1.000000 +83115 -1.000000 +83116 -1.000000 +83117 -1.000000 +83118 -1.000000 +83119 -1.000000 +83120 -1.000000 +83121 -1.000000 +83122 -1.000000 +83123 -1.000000 +83124 -1.000000 +83125 -1.000000 +83126 -1.000000 +83127 -1.000000 +83128 -1.000000 +83129 -1.000000 +83130 -1.000000 +83131 -1.000000 +83132 -1.000000 +83133 -1.000000 +83134 -1.000000 +83135 -1.000000 +83136 -1.000000 +83138 -1.000000 +83139 -1.000000 +83140 -1.000000 +83142 -1.000000 +83145 -1.000000 +83149 -1.000000 +83150 -1.000000 +83151 -1.000000 +83152 -1.000000 +83155 -1.000000 +83156 -1.000000 +83157 -1.000000 +83158 -1.000000 +83159 -1.000000 +83160 -1.000000 +83161 -1.000000 +83162 -1.000000 +83163 -1.000000 +83164 -1.000000 +83166 -1.000000 +83167 -1.000000 +83170 -1.000000 +83172 -1.000000 +83173 -1.000000 +83174 -1.000000 +83176 -1.000000 +83178 -1.000000 +83181 -1.000000 +83182 -1.000000 +83184 -1.000000 +83189 -1.000000 +83190 -1.000000 +83192 -1.000000 +83193 -1.000000 +83194 -1.000000 +83195 -1.000000 +83196 -1.000000 +83197 -1.000000 +83198 -1.000000 +83199 -1.000000 +83200 -1.000000 +83201 -1.000000 +83202 -1.000000 +83203 -1.000000 +83204 -1.000000 +83205 -1.000000 +83206 -1.000000 +83207 -1.000000 +83208 -1.000000 +83211 -1.000000 +83212 -1.000000 +83213 -1.000000 +83214 -1.000000 +83215 -1.000000 +83217 -1.000000 +83218 -1.000000 +83219 -1.000000 +83220 -1.000000 +83221 -1.000000 +83222 -1.000000 +83223 -1.000000 +83224 -1.000000 +83225 -1.000000 +83226 -1.000000 +83228 -1.000000 +83229 -1.000000 +83234 -1.000000 +83235 -1.000000 +83236 -1.000000 +83237 -1.000000 +83239 -1.000000 +83242 -1.000000 +83243 -1.000000 +83246 -1.000000 +83247 -1.000000 +83248 -1.000000 +83249 -1.000000 +83251 -1.000000 +83252 -1.000000 +83253 -1.000000 +83255 -1.000000 +83262 -1.000000 +83263 -1.000000 +83264 -1.000000 +83265 -1.000000 +83266 -1.000000 +83267 -1.000000 +83268 -1.000000 +83269 -1.000000 +83270 -1.000000 +83271 -1.000000 +83272 -1.000000 +83273 -1.000000 +83274 -1.000000 +83275 -1.000000 +83277 -1.000000 +83278 -1.000000 +83279 -1.000000 +83280 -1.000000 +83281 -1.000000 +83282 -1.000000 +83283 -1.000000 +83284 -1.000000 +83285 -1.000000 +83286 -1.000000 +83287 -1.000000 +83288 -1.000000 +83289 -1.000000 +83290 -1.000000 +83291 -1.000000 +83292 -1.000000 +83293 -1.000000 +83294 -1.000000 +83296 -1.000000 +83297 -1.000000 +83298 -1.000000 +83299 -1.000000 +83300 -1.000000 +83301 -1.000000 +83302 -1.000000 +83303 -1.000000 +83304 -1.000000 +83306 -1.000000 +83307 -1.000000 +83309 -1.000000 +83310 -1.000000 +83311 -1.000000 +83315 -1.000000 +83316 -1.000000 +83318 -1.000000 +83319 -1.000000 +83320 -1.000000 +83321 -1.000000 +83322 -1.000000 +83323 -1.000000 +83325 -1.000000 +83327 -1.000000 +83328 -1.000000 +83329 -1.000000 +83332 -1.000000 +83334 -1.000000 +83336 -1.000000 +83339 -1.000000 +83342 -1.000000 +83343 -1.000000 +83344 -1.000000 +83345 -1.000000 +83347 -1.000000 +83348 -1.000000 +83349 -1.000000 +83350 -1.000000 +83351 -1.000000 +83353 -1.000000 +83354 -1.000000 +83355 -1.000000 +83357 -1.000000 +83358 -1.000000 +83361 -1.000000 +83364 -1.000000 +83365 -1.000000 +83368 -1.000000 +83369 -1.000000 +83371 -1.000000 +83372 -1.000000 +83373 -1.000000 +83374 -1.000000 +83375 -1.000000 +83376 -1.000000 +83377 -1.000000 +83378 -1.000000 +83379 -1.000000 +83380 -1.000000 +83382 -1.000000 +83383 -1.000000 +83385 -1.000000 +83386 -1.000000 +83387 -1.000000 +83388 -1.000000 +83389 -1.000000 +83391 -1.000000 +83392 -1.000000 +83393 -1.000000 +83394 -1.000000 +83395 -1.000000 +83396 -1.000000 +83397 -1.000000 +83398 -1.000000 +83399 -1.000000 +83401 -1.000000 +83402 -1.000000 +83405 -1.000000 +83406 -1.000000 +83407 -1.000000 +83408 -1.000000 +83409 -1.000000 +83410 -1.000000 +83412 -1.000000 +83414 -1.000000 +83415 -1.000000 +83416 -1.000000 +83418 -1.000000 +83419 -1.000000 +83420 -1.000000 +83421 -1.000000 +83422 -1.000000 +83424 -1.000000 +83426 -1.000000 +83427 -1.000000 +83428 -1.000000 +83429 -1.000000 +83430 -1.000000 +83431 -1.000000 +83437 -1.000000 +83439 -1.000000 +83440 -1.000000 +83441 -1.000000 +83442 -1.000000 +83443 -1.000000 +83445 -1.000000 +83446 -1.000000 +83447 -1.000000 +83448 -1.000000 +83449 -1.000000 +83450 -1.000000 +83451 -1.000000 +83452 -1.000000 +83454 -1.000000 +83455 -1.000000 +83456 -1.000000 +83457 -1.000000 +83458 -1.000000 +83459 -1.000000 +83460 -1.000000 +83461 -1.000000 +83462 -1.000000 +83463 -1.000000 +83464 -1.000000 +83465 -1.000000 +83466 -1.000000 +83467 -1.000000 +83468 -1.000000 +83469 -1.000000 +83470 -1.000000 +83471 -1.000000 +83472 -1.000000 +83473 -1.000000 +83474 -1.000000 +83475 -1.000000 +83476 -1.000000 +83477 -1.000000 +83478 -1.000000 +83479 -1.000000 +83481 -1.000000 +83483 -1.000000 +83484 -1.000000 +83485 -1.000000 +83486 -1.000000 +83487 -1.000000 +83488 -1.000000 +83489 -1.000000 +83490 -1.000000 +83491 -1.000000 +83492 -1.000000 +83493 -1.000000 +83494 -1.000000 +83495 -1.000000 +83496 -1.000000 +83498 -1.000000 +83499 -1.000000 +83500 -1.000000 +83501 -1.000000 +83502 -1.000000 +83503 -1.000000 +83505 -1.000000 +83506 -1.000000 +83507 -1.000000 +83508 -1.000000 +83509 -1.000000 +83510 -1.000000 +83511 -1.000000 +83512 -1.000000 +83513 -1.000000 +83516 -1.000000 +83517 -1.000000 +83520 -1.000000 +83523 -1.000000 +83524 -1.000000 +83525 -1.000000 +83527 -1.000000 +83528 -1.000000 +83529 -1.000000 +83530 -1.000000 +83532 -1.000000 +83534 -1.000000 +83535 -1.000000 +83536 -1.000000 +83537 -1.000000 +83538 -1.000000 +83539 -1.000000 +83540 -1.000000 +83541 -1.000000 +83542 -1.000000 +83543 -1.000000 +83546 -1.000000 +83547 -1.000000 +83548 -1.000000 +83549 -1.000000 +83550 -1.000000 +83551 -1.000000 +83552 -1.000000 +83553 -1.000000 +83554 -1.000000 +83555 -1.000000 +83556 -1.000000 +83558 -1.000000 +83559 -1.000000 +83560 -1.000000 +83561 -1.000000 +83562 -1.000000 +83563 -1.000000 +83565 -1.000000 +83569 -1.000000 +83573 -1.000000 +83574 -1.000000 +83576 -1.000000 +83577 -1.000000 +83578 -1.000000 +83579 -1.000000 +83580 -1.000000 +83581 -1.000000 +83582 -1.000000 +83583 -1.000000 +83584 -1.000000 +83585 -1.000000 +83586 -1.000000 +83587 -1.000000 +83588 -1.000000 +83589 -1.000000 +83590 -1.000000 +83591 -1.000000 +83592 -1.000000 +83593 -1.000000 +83594 -1.000000 +83595 -1.000000 +83596 -1.000000 +83597 -1.000000 +83599 -1.000000 +83600 -1.000000 +83602 -1.000000 +83603 -1.000000 +83604 -1.000000 +83605 -1.000000 +83606 -1.000000 +83607 -1.000000 +83608 -1.000000 +83609 -1.000000 +83610 -1.000000 +83612 -1.000000 +83613 -1.000000 +83614 -1.000000 +83616 -1.000000 +83617 -1.000000 +83621 -1.000000 +83622 -1.000000 +83623 -1.000000 +83624 -1.000000 +83625 -1.000000 +83626 -1.000000 +83627 -1.000000 +83628 -1.000000 +83629 -1.000000 +83630 -1.000000 +83631 -1.000000 +83632 -1.000000 +83634 -1.000000 +83636 -1.000000 +83637 -1.000000 +83638 -1.000000 +83639 -1.000000 +83640 -1.000000 +83641 -1.000000 +83642 -1.000000 +83643 -1.000000 +83644 -1.000000 +83645 -1.000000 +83646 -1.000000 +83647 -1.000000 +83648 -1.000000 +83649 -1.000000 +83650 -1.000000 +83651 -1.000000 +83652 -1.000000 +83653 -1.000000 +83654 -1.000000 +83655 -1.000000 +83656 -1.000000 +83657 -1.000000 +83658 -1.000000 +83659 -1.000000 +83660 -1.000000 +83661 -1.000000 +83662 -1.000000 +83663 -1.000000 +83664 -1.000000 +83665 -1.000000 +83666 -1.000000 +83667 -1.000000 +83668 -1.000000 +83669 -1.000000 +83670 -1.000000 +83671 -1.000000 +83672 -1.000000 +83673 -1.000000 +83674 -1.000000 +83675 -1.000000 +83676 -1.000000 +83677 -1.000000 +83678 -1.000000 +83679 -1.000000 +83680 -1.000000 +83682 -1.000000 +83683 -1.000000 +83684 -1.000000 +83685 -1.000000 +83686 -1.000000 +83687 -1.000000 +83688 -1.000000 +83689 -1.000000 +83690 -1.000000 +83691 -1.000000 +83692 -1.000000 +83693 -1.000000 +83694 -1.000000 +83695 -1.000000 +83696 -1.000000 +83697 -1.000000 +83699 -1.000000 +83700 -1.000000 +83701 -1.000000 +83702 -1.000000 +83703 -1.000000 +83704 -1.000000 +83705 -1.000000 +83706 -1.000000 +83707 -1.000000 +83708 -1.000000 +83709 -1.000000 +83710 -1.000000 +83711 -1.000000 +83712 -1.000000 +83713 -1.000000 +83714 -1.000000 +83715 -1.000000 +83716 -1.000000 +83717 -1.000000 +83718 -1.000000 +83719 -1.000000 +83720 -1.000000 +83721 -1.000000 +83722 -1.000000 +83723 -1.000000 +83724 -1.000000 +83725 -1.000000 +83726 -1.000000 +83727 -1.000000 +83728 -1.000000 +83729 -1.000000 +83731 -1.000000 +83732 -1.000000 +83733 -1.000000 +83734 -1.000000 +83735 -1.000000 +83736 -1.000000 +83737 -1.000000 +83738 -1.000000 +83739 -1.000000 +83740 -1.000000 +83741 -1.000000 +83742 -1.000000 +83743 -1.000000 +83744 -1.000000 +83745 -1.000000 +83746 -1.000000 +83747 -1.000000 +83748 -1.000000 +83749 -1.000000 +83750 -1.000000 +83751 -1.000000 +83752 -1.000000 +83753 -1.000000 +83754 -1.000000 +83755 -1.000000 +83756 -1.000000 +83757 -1.000000 +83758 -1.000000 +83759 -1.000000 +83760 -1.000000 +83761 -1.000000 +83762 -1.000000 +83763 -1.000000 +83764 -1.000000 +83765 -1.000000 +83766 -1.000000 +83767 -1.000000 +83768 -1.000000 +83769 -1.000000 +83770 -1.000000 +83771 -1.000000 +83772 -1.000000 +83773 -1.000000 +83774 -1.000000 +83775 -1.000000 +83776 -1.000000 +83777 -1.000000 +83778 -1.000000 +83779 -1.000000 +83780 -1.000000 +83781 -1.000000 +83782 -1.000000 +83783 -1.000000 +83784 -1.000000 +83785 -1.000000 +83786 -1.000000 +83787 -1.000000 +83788 -1.000000 +83789 -1.000000 +83790 -1.000000 +83791 -1.000000 +83792 -1.000000 +83793 -1.000000 +83794 -1.000000 +83795 -1.000000 +83796 -1.000000 +83797 -1.000000 +83798 -1.000000 +83799 -1.000000 +83800 -1.000000 +83801 -1.000000 +83802 -1.000000 +83803 -1.000000 +83804 -1.000000 +83805 -1.000000 +83806 -1.000000 +83807 -1.000000 +83808 -1.000000 +83809 -1.000000 +83810 -1.000000 +83811 -1.000000 +83812 -1.000000 +83813 -1.000000 +83814 -1.000000 +83815 -1.000000 +83816 -1.000000 +83817 -1.000000 +83818 -1.000000 +83819 -1.000000 +83820 -1.000000 +83821 -1.000000 +83822 -1.000000 +83823 -1.000000 +83824 -1.000000 +83825 -1.000000 +83826 -1.000000 +83827 -1.000000 +83828 -1.000000 +83829 -1.000000 +83830 -1.000000 +83831 -1.000000 +83832 -1.000000 +83833 -1.000000 +83834 -1.000000 +83835 -1.000000 +83836 -1.000000 +83837 -1.000000 +83838 -1.000000 +83839 -1.000000 +83840 -1.000000 +83841 -1.000000 +83842 -1.000000 +83843 -1.000000 +83844 -1.000000 +83845 -1.000000 +83846 -1.000000 +83847 -1.000000 +83848 -1.000000 +83849 -1.000000 +83850 -1.000000 +83851 -1.000000 +83852 -1.000000 +83853 -1.000000 +83854 -1.000000 +83855 -1.000000 +83856 -1.000000 +83857 -1.000000 +83858 -1.000000 +83859 -1.000000 +83860 -1.000000 +83861 -1.000000 +83862 -1.000000 +83863 -1.000000 +83864 -1.000000 +83865 -1.000000 +83866 -1.000000 +83867 -1.000000 +83868 -1.000000 +83869 -1.000000 +83870 -1.000000 +83871 -1.000000 +83872 -1.000000 +83873 -1.000000 +83874 -1.000000 +83875 -1.000000 +83876 -1.000000 +83877 -1.000000 +83878 -1.000000 +83879 -1.000000 +83880 -1.000000 +83881 -1.000000 +83882 -1.000000 +83883 -1.000000 +83884 -1.000000 +83885 -1.000000 +83886 -1.000000 +83887 -1.000000 +83888 -1.000000 +83889 -1.000000 +83890 -1.000000 +83891 -1.000000 +83892 -1.000000 +83893 -1.000000 +83894 -1.000000 +83895 -1.000000 +83896 -1.000000 +83897 -1.000000 +83898 -1.000000 +83899 -1.000000 +83900 -1.000000 +83901 -1.000000 +83902 -1.000000 +83903 -1.000000 +83904 -1.000000 +83905 -1.000000 +83906 -1.000000 +83907 -1.000000 +83908 -1.000000 +83909 -1.000000 +83910 -1.000000 +83911 -1.000000 +83912 -1.000000 +83913 -1.000000 +83914 -1.000000 +83915 -1.000000 +83916 -1.000000 +83917 -1.000000 +83918 -1.000000 +83919 -1.000000 +83920 -1.000000 +83921 -1.000000 +83922 -1.000000 +83923 -1.000000 +83924 -1.000000 +83925 -1.000000 +83926 -1.000000 +83927 -1.000000 +83928 -1.000000 +83929 -1.000000 +83930 -1.000000 +83931 -1.000000 +83932 -1.000000 +83933 -1.000000 +83934 -1.000000 +83935 -1.000000 +83936 -1.000000 +83937 -1.000000 +83938 -1.000000 +83939 -1.000000 +83940 -1.000000 +83941 -1.000000 +83942 -1.000000 +83943 -1.000000 +83944 -1.000000 +83945 -1.000000 +83946 -1.000000 +83947 -1.000000 +83948 -1.000000 +83949 -1.000000 +83950 -1.000000 +83951 -1.000000 +83952 -1.000000 +83953 -1.000000 +83954 -1.000000 +83955 -1.000000 +83956 -1.000000 +83957 -1.000000 +83958 -1.000000 +83959 -1.000000 +83960 -1.000000 +83961 -1.000000 +83962 -1.000000 +83963 -1.000000 +83964 -1.000000 +83965 -1.000000 +83966 -1.000000 +83967 -1.000000 +83968 -1.000000 +83969 -1.000000 +83970 -1.000000 +83971 -1.000000 +83972 -1.000000 +83973 -1.000000 +83974 -1.000000 +83975 -1.000000 +83976 -1.000000 +83977 -1.000000 +83978 -1.000000 +83979 -1.000000 +83981 -1.000000 +83983 -1.000000 +83984 -1.000000 +83985 -1.000000 +83986 -1.000000 +83988 -1.000000 +83989 -1.000000 +83990 -1.000000 +83991 -1.000000 +83992 -1.000000 +83993 -1.000000 +83994 -1.000000 +83995 -1.000000 +83996 -1.000000 +83997 -1.000000 +83998 -1.000000 +84000 -1.000000 +84001 -1.000000 +84002 -1.000000 +84003 -1.000000 +84004 -1.000000 +84005 -1.000000 +84006 -1.000000 +84007 -1.000000 +84008 -1.000000 +84009 -1.000000 +84010 -1.000000 +84011 -1.000000 +84012 -1.000000 +84013 -1.000000 +84014 -1.000000 +84015 -1.000000 +84016 -1.000000 +84017 -1.000000 +84018 -1.000000 +84019 -1.000000 +84020 -1.000000 +84021 -1.000000 +84022 -1.000000 +84023 -1.000000 +84024 -1.000000 +84025 -1.000000 +84026 -1.000000 +84027 -1.000000 +84028 -1.000000 +84029 -1.000000 +84030 -1.000000 +84032 -1.000000 +84033 -1.000000 +84034 -1.000000 +84035 -1.000000 +84037 -1.000000 +84038 -1.000000 +84039 -1.000000 +84040 -1.000000 +84041 -1.000000 +84042 -1.000000 +84043 -1.000000 +84044 -1.000000 +84045 -1.000000 +84046 -1.000000 +84047 -1.000000 +84048 -1.000000 +84049 -1.000000 +84050 -1.000000 +84052 -1.000000 +84053 -1.000000 +84055 -1.000000 +84056 -1.000000 +84057 -1.000000 +84058 -1.000000 +84059 -1.000000 +84060 -1.000000 +84061 -1.000000 +84062 -1.000000 +84063 -1.000000 +84064 -1.000000 +84065 -1.000000 +84066 -1.000000 +84067 -1.000000 +84068 -1.000000 +84069 -1.000000 +84070 -1.000000 +84071 -1.000000 +84072 -1.000000 +84073 -1.000000 +84074 -1.000000 +84075 -1.000000 +84076 -1.000000 +84078 -1.000000 +84080 -1.000000 +84081 -1.000000 +84082 -1.000000 +84083 -1.000000 +84084 -1.000000 +84085 -1.000000 +84086 -1.000000 +84087 -1.000000 +84088 -1.000000 +84089 -1.000000 +84090 -1.000000 +84091 -1.000000 +84092 -1.000000 +84093 -1.000000 +84094 -1.000000 +84095 -1.000000 +84096 -1.000000 +84097 -1.000000 +84098 -1.000000 +84099 -1.000000 +84100 -1.000000 +84101 -1.000000 +84102 -1.000000 +84103 -1.000000 +84104 -1.000000 +84105 -1.000000 +84106 -1.000000 +84107 -1.000000 +84108 -1.000000 +84109 -1.000000 +84110 -1.000000 +84111 -1.000000 +84112 -1.000000 +84113 -1.000000 +84114 -1.000000 +84116 -1.000000 +84117 -1.000000 +84118 -1.000000 +84119 -1.000000 +84120 -1.000000 +84121 -1.000000 +84122 -1.000000 +84123 -1.000000 +84124 -1.000000 +84125 -1.000000 +84126 -1.000000 +84127 -1.000000 +84128 -1.000000 +84129 -1.000000 +84130 -1.000000 +84131 -1.000000 +84132 -1.000000 +84133 -1.000000 +84134 -1.000000 +84135 -1.000000 +84136 -1.000000 +84137 -1.000000 +84138 -1.000000 +84139 -1.000000 +84140 -1.000000 +84141 -1.000000 +84144 -1.000000 +84145 -1.000000 +84146 -1.000000 +84147 -1.000000 +84148 -1.000000 +84149 -1.000000 +84150 -1.000000 +84151 -1.000000 +84152 -1.000000 +84153 -1.000000 +84154 -1.000000 +84155 -1.000000 +84156 -1.000000 +84157 -1.000000 +84159 -1.000000 +84174 -1.000000 +84175 -1.000000 +84176 -1.000000 +84177 -1.000000 +84178 -1.000000 +84179 -1.000000 +84181 -1.000000 +84182 -1.000000 +84183 -1.000000 +84184 -1.000000 +84185 -1.000000 +84186 -1.000000 +84187 -1.000000 +84188 -1.000000 +84189 -1.000000 +84190 -1.000000 +84191 -1.000000 +84192 -1.000000 +84193 -1.000000 +84194 -1.000000 +84195 -1.000000 +84196 -1.000000 +84197 -1.000000 +84198 -1.000000 +84199 -1.000000 +84200 -1.000000 +84201 -1.000000 +84202 -1.000000 +84203 -1.000000 +84204 -1.000000 +84205 -1.000000 +84206 -1.000000 +84207 -1.000000 +84208 -1.000000 +84209 -1.000000 +84210 -1.000000 +84211 -1.000000 +84212 -1.000000 +84213 -1.000000 +84214 -1.000000 +84215 -1.000000 +84216 -1.000000 +84217 -1.000000 +84218 -1.000000 +84219 -1.000000 +84220 -1.000000 +84221 -1.000000 +84222 -1.000000 +84223 -1.000000 +84224 -1.000000 +84225 -1.000000 +84226 -1.000000 +84227 -1.000000 +84228 -1.000000 +84229 -1.000000 +84230 -1.000000 +84231 -1.000000 +84232 -1.000000 +84233 -1.000000 +84234 -1.000000 +84235 -1.000000 +84236 -1.000000 +84237 -1.000000 +84238 -1.000000 +84239 -1.000000 +84240 -1.000000 +84241 -1.000000 +84242 -1.000000 +84243 -1.000000 +84244 -1.000000 +84245 -1.000000 +84246 -1.000000 +84247 -1.000000 +84248 -1.000000 +84249 -1.000000 +84250 -1.000000 +84251 -1.000000 +84252 -1.000000 +84253 -1.000000 +84254 -1.000000 +84255 -1.000000 +84256 -1.000000 +84257 -1.000000 +84258 -1.000000 +84259 -1.000000 +84260 -1.000000 +84261 -1.000000 +84262 -1.000000 +84263 -1.000000 +84264 -1.000000 +84265 -1.000000 +84266 -1.000000 +84267 -1.000000 +84268 -1.000000 +84269 -1.000000 +84270 -1.000000 +84272 -1.000000 +84273 -1.000000 +84274 -1.000000 +84276 -1.000000 +84277 -1.000000 +84278 -1.000000 +84279 -1.000000 +84280 -1.000000 +84281 -1.000000 +84282 -1.000000 +84283 -1.000000 +84284 -1.000000 +84285 -1.000000 +84286 -1.000000 +84287 -1.000000 +84288 -1.000000 +84289 -1.000000 +84290 -1.000000 +84291 -1.000000 +84292 -1.000000 +84293 -1.000000 +84294 -1.000000 +84295 -1.000000 +84296 -1.000000 +84297 -1.000000 +84298 -1.000000 +84299 -1.000000 +84300 -1.000000 +84301 -1.000000 +84302 -1.000000 +84303 -1.000000 +84304 -1.000000 +84305 -1.000000 +84306 -1.000000 +84307 -1.000000 +84309 -1.000000 +84310 -1.000000 +84311 -1.000000 +84312 -1.000000 +84313 -1.000000 +84314 -1.000000 +84316 -1.000000 +84317 -1.000000 +84318 -1.000000 +84319 -1.000000 +84320 -1.000000 +84321 -1.000000 +84325 -1.000000 +84326 -1.000000 +84327 -1.000000 +84329 -1.000000 +84330 -1.000000 +84331 -1.000000 +84332 -1.000000 +84333 -1.000000 +84334 -1.000000 +84335 -1.000000 +84336 -1.000000 +84337 -1.000000 +84338 -1.000000 +84339 -1.000000 +84340 -1.000000 +84341 -1.000000 +84342 -1.000000 +84343 -1.000000 +84344 -1.000000 +84345 -1.000000 +84346 -1.000000 +84347 -1.000000 +84348 -1.000000 +84349 -1.000000 +84350 -1.000000 +84351 -1.000000 +84353 -1.000000 +84354 -1.000000 +84355 -1.000000 +84356 -1.000000 +84357 -1.000000 +84358 -1.000000 +84359 -1.000000 +84360 -1.000000 +84361 -1.000000 +84362 -1.000000 +84363 -1.000000 +84364 -1.000000 +84365 -1.000000 +84366 -1.000000 +84367 -1.000000 +84368 -1.000000 +84369 -1.000000 +84370 -1.000000 +84371 -1.000000 +84372 -1.000000 +84373 -1.000000 +84374 -1.000000 +84375 -1.000000 +84376 -1.000000 +84377 -1.000000 +84378 -1.000000 +84379 -1.000000 +84380 -1.000000 +84381 -1.000000 +84382 -1.000000 +84383 -1.000000 +84384 -1.000000 +84385 -1.000000 +84386 -1.000000 +84387 -1.000000 +84388 -1.000000 +84389 -1.000000 +84390 -1.000000 +84391 -1.000000 +84392 -1.000000 +84393 -1.000000 +84394 -1.000000 +84395 -1.000000 +84396 -1.000000 +84397 -1.000000 +84398 -1.000000 +84399 -1.000000 +84400 -1.000000 +84401 -1.000000 +84402 -1.000000 +84403 -1.000000 +84404 -1.000000 +84405 -1.000000 +84406 -1.000000 +84407 -1.000000 +84409 -1.000000 +84410 -1.000000 +84411 -1.000000 +84412 -1.000000 +84413 -1.000000 +84414 -1.000000 +84415 -1.000000 +84416 -1.000000 +84417 -1.000000 +84418 -1.000000 +84419 -1.000000 +84420 -1.000000 +84421 -1.000000 +84422 -1.000000 +84423 -1.000000 +84424 -1.000000 +84425 -1.000000 +84426 -1.000000 +84427 -1.000000 +84429 -1.000000 +84430 -1.000000 +84431 -1.000000 +84432 -1.000000 +84434 -1.000000 +84436 -1.000000 +84437 -1.000000 +84438 -1.000000 +84439 -1.000000 +84440 -1.000000 +84441 -1.000000 +84442 -1.000000 +84443 -1.000000 +84444 -1.000000 +84445 -1.000000 +84446 -1.000000 +84447 -1.000000 +84448 -1.000000 +84449 -1.000000 +84450 -1.000000 +84451 -1.000000 +84452 -1.000000 +84453 -1.000000 +84454 -1.000000 +84455 -1.000000 +84456 -1.000000 +84457 -1.000000 +84458 -1.000000 +84459 -1.000000 +84460 -1.000000 +84461 -1.000000 +84463 -1.000000 +84466 -1.000000 +84468 -1.000000 +84469 -1.000000 +84470 -1.000000 +84471 -1.000000 +84472 -1.000000 +84473 -1.000000 +84474 -1.000000 +84475 -1.000000 +84476 -1.000000 +84477 -1.000000 +84478 -1.000000 +84479 -1.000000 +84480 -1.000000 +84481 -1.000000 +84482 -1.000000 +84483 -1.000000 +84484 -1.000000 +84485 -1.000000 +84486 -1.000000 +84487 -1.000000 +84488 -1.000000 +84489 -1.000000 +84490 -1.000000 +84491 -1.000000 +84492 -1.000000 +84493 -1.000000 +84495 -1.000000 +84496 -1.000000 +84497 -1.000000 +84498 -1.000000 +84499 -1.000000 +84500 -1.000000 +84501 -1.000000 +84502 -1.000000 +84503 -1.000000 +84504 -1.000000 +84505 -1.000000 +84506 -1.000000 +84507 -1.000000 +84508 -1.000000 +84509 -1.000000 +84510 -1.000000 +84511 -1.000000 +84512 -1.000000 +84513 -1.000000 +84514 -1.000000 +84515 -1.000000 +84516 -1.000000 +84518 -1.000000 +84521 -1.000000 +84522 -1.000000 +84523 -1.000000 +84525 -1.000000 +84526 -1.000000 +84527 -1.000000 +84528 -1.000000 +84529 -1.000000 +84530 -1.000000 +84531 -1.000000 +84532 -1.000000 +84534 -1.000000 +84535 -1.000000 +84536 -1.000000 +84537 -1.000000 +84538 -1.000000 +84539 -1.000000 +84540 -1.000000 +84541 -1.000000 +84542 -1.000000 +84543 -1.000000 +84544 -1.000000 +84545 -1.000000 +84546 -1.000000 +84547 -1.000000 +84548 -1.000000 +84549 -1.000000 +84550 -1.000000 +84551 -1.000000 +84552 -1.000000 +84555 -1.000000 +84556 -1.000000 +84558 -1.000000 +84559 -1.000000 +84560 -1.000000 +84561 -1.000000 +84562 -1.000000 +84563 -1.000000 +84564 -1.000000 +84565 -1.000000 +84566 -1.000000 +84567 -1.000000 +84568 -1.000000 +84569 -1.000000 +84570 -1.000000 +84571 -1.000000 +84572 -1.000000 +84573 -1.000000 +84574 -1.000000 +84575 -1.000000 +84576 -1.000000 +84577 -1.000000 +84578 -1.000000 +84579 -1.000000 +84580 -1.000000 +84582 -1.000000 +84583 -1.000000 +84584 -1.000000 +84585 -1.000000 +84586 -1.000000 +84587 -1.000000 +84589 -1.000000 +84590 -1.000000 +84591 -1.000000 +84592 -1.000000 +84596 -1.000000 +84597 -1.000000 +84598 -1.000000 +84599 -1.000000 +84601 -1.000000 +84602 -1.000000 +84603 -1.000000 +84604 -1.000000 +84605 -1.000000 +84606 -1.000000 +84607 -1.000000 +84608 -1.000000 +84609 -1.000000 +84610 -1.000000 +84611 -1.000000 +84615 -1.000000 +84616 -1.000000 +84617 -1.000000 +84618 -1.000000 +84619 -1.000000 +84621 -1.000000 +84622 -1.000000 +84623 -1.000000 +84624 -1.000000 +84625 -1.000000 +84626 -1.000000 +84627 -1.000000 +84629 -1.000000 +84630 -1.000000 +84631 -1.000000 +84632 -1.000000 +84633 -1.000000 +84634 -1.000000 +84635 -1.000000 +84636 -1.000000 +84637 -1.000000 +84638 -1.000000 +84641 -1.000000 +84642 -1.000000 +84643 -1.000000 +84644 -1.000000 +84645 -1.000000 +84646 -1.000000 +84647 -1.000000 +84649 -1.000000 +84650 -1.000000 +84651 -1.000000 +84652 -1.000000 +84653 -1.000000 +84654 -1.000000 +84659 -1.000000 +84660 -1.000000 +84661 -1.000000 +84662 -1.000000 +84663 -1.000000 +84664 -1.000000 +84665 -1.000000 +84666 -1.000000 +84667 -1.000000 +84668 -1.000000 +84669 -1.000000 +84670 -1.000000 +84672 -1.000000 +84673 -1.000000 +84678 -1.000000 +84680 -1.000000 +84682 -1.000000 +84683 -1.000000 +84684 -1.000000 +84685 -1.000000 +84686 -1.000000 +84687 -1.000000 +84688 -1.000000 +84689 -1.000000 +84692 -1.000000 +84693 -1.000000 +84694 -1.000000 +84697 -1.000000 +84698 -1.000000 +84699 -1.000000 +84700 -1.000000 +84701 -1.000000 +84702 -1.000000 +84703 -1.000000 +84704 -1.000000 +84705 -1.000000 +84706 -1.000000 +84708 -1.000000 +84709 -1.000000 +84712 -1.000000 +84713 -1.000000 +84714 -1.000000 +84717 -1.000000 +84718 -1.000000 +84719 -1.000000 +84720 -1.000000 +84721 -1.000000 +84722 -1.000000 +84723 -1.000000 +84724 -1.000000 +84725 -1.000000 +84726 -1.000000 +84727 -1.000000 +84728 -1.000000 +84729 -1.000000 +84730 -1.000000 +84731 -1.000000 +84732 -1.000000 +84733 -1.000000 +84734 -1.000000 +84735 -1.000000 +84736 -1.000000 +84737 -1.000000 +84738 -1.000000 +84739 -1.000000 +84740 -1.000000 +84741 -1.000000 +84742 -1.000000 +84743 -1.000000 +84744 -1.000000 +84745 -1.000000 +84746 -1.000000 +84749 -1.000000 +84750 -1.000000 +84751 -1.000000 +84753 -1.000000 +84755 -1.000000 +84756 -1.000000 +84757 -1.000000 +84758 -1.000000 +84759 -1.000000 +84760 -1.000000 +84761 -1.000000 +84762 -1.000000 +84765 -1.000000 +84767 -1.000000 +84768 -1.000000 +84769 -1.000000 +84770 -1.000000 +84772 -1.000000 +84773 -1.000000 +84774 -1.000000 +84776 -1.000000 +84777 -1.000000 +84778 -1.000000 +84779 -1.000000 +84780 -1.000000 +84781 -1.000000 +84782 -1.000000 +84784 -1.000000 +84785 -1.000000 +84786 -1.000000 +84787 -1.000000 +84788 -1.000000 +84789 -1.000000 +84790 -1.000000 +84791 -1.000000 +84792 -1.000000 +84793 -1.000000 +84794 -1.000000 +84795 -1.000000 +84796 -1.000000 +84797 -1.000000 +84798 -1.000000 +84799 -1.000000 +84800 -1.000000 +84801 -1.000000 +84802 -1.000000 +84803 -1.000000 +84804 -1.000000 +84805 -1.000000 +84806 -1.000000 +84807 -1.000000 +84809 -1.000000 +84810 -1.000000 +84811 -1.000000 +84812 -1.000000 +84813 -1.000000 +84814 -1.000000 +84815 -1.000000 +84816 -1.000000 +84817 -1.000000 +84821 -1.000000 +84822 -1.000000 +84823 -1.000000 +84824 -1.000000 +84825 -1.000000 +84830 -1.000000 +84831 -1.000000 +84833 -1.000000 +84834 -1.000000 +84835 -1.000000 +84836 -1.000000 +84840 -1.000000 +84842 -1.000000 +84843 -1.000000 +84844 -1.000000 +84845 -1.000000 +84847 -1.000000 +84848 -1.000000 +84849 -1.000000 +84850 -1.000000 +84851 -1.000000 +84852 -1.000000 +84854 -1.000000 +84855 -1.000000 +84856 -1.000000 +84859 -1.000000 +84863 -1.000000 +84864 -1.000000 +84866 -1.000000 +84868 -1.000000 +84871 -1.000000 +84872 -1.000000 +84873 -1.000000 +84874 -1.000000 +84875 -1.000000 +84876 -1.000000 +84877 -1.000000 +84879 -1.000000 +84880 -1.000000 +84881 -1.000000 +84882 -1.000000 +84883 -1.000000 +84884 -1.000000 +84889 -1.000000 +84890 -1.000000 +84892 -1.000000 +84895 -1.000000 +84896 -1.000000 +84897 -1.000000 +84900 -1.000000 +84902 -1.000000 +84903 -1.000000 +84904 -1.000000 +84905 -1.000000 +84906 -1.000000 +84907 -1.000000 +84908 -1.000000 +84909 -1.000000 +84910 -1.000000 +84911 -1.000000 +84913 -1.000000 +84914 -1.000000 +84915 -1.000000 +84916 -1.000000 +84917 -1.000000 +84918 -1.000000 +84919 -1.000000 +84920 -1.000000 +84921 -1.000000 +84922 -1.000000 +84923 -1.000000 +84924 -1.000000 +84925 -1.000000 +84926 -1.000000 +84927 -1.000000 +84928 -1.000000 +84929 -1.000000 +84930 -1.000000 +84931 -1.000000 +84932 -1.000000 +84934 -1.000000 +84936 -1.000000 +84938 -1.000000 +84939 -1.000000 +84940 -1.000000 +84941 -1.000000 +84944 -1.000000 +84945 -1.000000 +84948 -1.000000 +84949 -1.000000 +84951 -1.000000 +84952 -1.000000 +84953 -1.000000 +84954 -1.000000 +84956 -1.000000 +84958 -1.000000 +84959 -1.000000 +84961 -1.000000 +84963 -1.000000 +84964 -1.000000 +84966 -1.000000 +84967 -1.000000 +84968 -1.000000 +84969 -1.000000 +84970 -1.000000 +84971 -1.000000 +84972 -1.000000 +84973 -1.000000 +84974 -1.000000 +84975 -1.000000 +84976 -1.000000 +84977 -1.000000 +84978 -1.000000 +84979 -1.000000 +84980 -1.000000 +84981 -1.000000 +84982 -1.000000 +84992 -1.000000 +84997 -1.000000 +85001 -1.000000 +85002 -1.000000 +85003 -1.000000 +85004 -1.000000 +85006 -1.000000 +85007 -1.000000 +85008 -1.000000 +85009 -1.000000 +85010 -1.000000 +85011 -1.000000 +85012 -1.000000 +85014 -1.000000 +85015 -1.000000 +85016 -1.000000 +85017 -1.000000 +85018 -1.000000 +85022 -1.000000 +85023 -1.000000 +85025 -1.000000 +85026 -1.000000 +85028 -1.000000 +85029 -1.000000 +85030 -1.000000 +85031 -1.000000 +85032 -1.000000 +85034 -1.000000 +85035 -1.000000 +85036 -1.000000 +85037 -1.000000 +85038 -1.000000 +85039 -1.000000 +85040 -1.000000 +85041 -1.000000 +85042 -1.000000 +85043 -1.000000 +85044 -1.000000 +85045 -1.000000 +85046 -1.000000 +85047 -1.000000 +85049 -1.000000 +85050 -1.000000 +85051 -1.000000 +85052 -1.000000 +85054 -1.000000 +85056 -1.000000 +85057 -1.000000 +85059 -1.000000 +85063 -1.000000 +85064 -1.000000 +85065 -1.000000 +85066 -1.000000 +85068 -1.000000 +85069 -1.000000 +85075 -1.000000 +85079 -1.000000 +85080 -1.000000 +85081 -1.000000 +85082 -1.000000 +85083 -1.000000 +85084 -1.000000 +85085 -1.000000 +85086 -1.000000 +85087 -1.000000 +85088 -1.000000 +85089 -1.000000 +85090 -1.000000 +85091 -1.000000 +85092 -1.000000 +85093 -1.000000 +85094 -1.000000 +85095 -1.000000 +85096 -1.000000 +85097 -1.000000 +85098 -1.000000 +85099 -1.000000 +85100 -1.000000 +85101 -1.000000 +85102 -1.000000 +85105 -1.000000 +85107 -1.000000 +85109 -1.000000 +85110 -1.000000 +85111 -1.000000 +85112 -1.000000 +85113 -1.000000 +85114 -1.000000 +85115 -1.000000 +85116 -1.000000 +85117 -1.000000 +85118 -1.000000 +85119 -1.000000 +85120 -1.000000 +85121 -1.000000 +85122 -1.000000 +85123 -1.000000 +85124 -1.000000 +85125 -1.000000 +85126 -1.000000 +85127 -1.000000 +85128 -1.000000 +85129 -1.000000 +85130 -1.000000 +85131 -1.000000 +85132 -1.000000 +85133 -1.000000 +85134 -1.000000 +85135 -1.000000 +85136 -1.000000 +85137 -1.000000 +85138 -1.000000 +85139 -1.000000 +85140 -1.000000 +85141 -1.000000 +85142 -1.000000 +85143 -1.000000 +85144 -1.000000 +85145 -1.000000 +85146 -1.000000 +85147 -1.000000 +85148 -1.000000 +85149 -1.000000 +85150 -1.000000 +85151 -1.000000 +85152 -1.000000 +85153 -1.000000 +85154 -1.000000 +85155 -1.000000 +85156 -1.000000 +85157 -1.000000 +85158 -1.000000 +85159 -1.000000 +85160 -1.000000 +85161 -1.000000 +85163 -1.000000 +85166 -1.000000 +85167 -1.000000 +85169 -1.000000 +85172 -1.000000 +85173 -1.000000 +85174 -1.000000 +85175 -1.000000 +85178 -1.000000 +85180 -1.000000 +85181 -1.000000 +85183 -1.000000 +85184 -1.000000 +85186 -1.000000 +85194 -1.000000 +85195 -1.000000 +85196 -1.000000 +85197 -1.000000 +85198 -1.000000 +85199 -1.000000 +85201 -1.000000 +85203 -1.000000 +85205 -1.000000 +85206 -1.000000 +85207 -1.000000 +85208 -1.000000 +85209 -1.000000 +85213 -1.000000 +85214 -1.000000 +85215 -1.000000 +85216 -1.000000 +85217 -1.000000 +85218 -1.000000 +85219 -1.000000 +85220 -1.000000 +85221 -1.000000 +85223 -1.000000 +85224 -1.000000 +85225 -1.000000 +85226 -1.000000 +85227 -1.000000 +85228 -1.000000 +85230 -1.000000 +85231 -1.000000 +85232 -1.000000 +85233 -1.000000 +85234 -1.000000 +85235 -1.000000 +85237 -1.000000 +85242 -1.000000 +85243 -1.000000 +85244 -1.000000 +85245 -1.000000 +85246 -1.000000 +85247 -1.000000 +85248 -1.000000 +85249 -1.000000 +85250 -1.000000 +85254 -1.000000 +85255 -1.000000 +85256 -1.000000 +85260 -1.000000 +85261 -1.000000 +85262 -1.000000 +85263 -1.000000 +85264 -1.000000 +85265 -1.000000 +85266 -1.000000 +85268 -1.000000 +85269 -1.000000 +85270 -1.000000 +85271 -1.000000 +85272 -1.000000 +85273 -1.000000 +85274 -1.000000 +85276 -1.000000 +85277 -1.000000 +85278 -1.000000 +85279 -1.000000 +85280 -1.000000 +85281 -1.000000 +85282 -1.000000 +85283 -1.000000 +85284 -1.000000 +85288 -1.000000 +85289 -1.000000 +85296 -1.000000 +85297 -1.000000 +85298 -1.000000 +85299 -1.000000 +85301 -1.000000 +85302 -1.000000 +85303 -1.000000 +85304 -1.000000 +85305 -1.000000 +85306 -1.000000 +85307 -1.000000 +85308 -1.000000 +85309 -1.000000 +85310 -1.000000 +85311 -1.000000 +85312 -1.000000 +85313 -1.000000 +85314 -1.000000 +85315 -1.000000 +85316 -1.000000 +85319 -1.000000 +85320 -1.000000 +85321 -1.000000 +85322 -1.000000 +85323 -1.000000 +85324 -1.000000 +85325 -1.000000 +85326 -1.000000 +85327 -1.000000 +85328 -1.000000 +85329 -1.000000 +85330 -1.000000 +85331 -1.000000 +85332 -1.000000 +85333 -1.000000 +85334 -1.000000 +85335 -1.000000 +85336 -1.000000 +85337 -1.000000 +85338 -1.000000 +85339 -1.000000 +85340 -1.000000 +85341 -1.000000 +85342 -1.000000 +85343 -1.000000 +85344 -1.000000 +85345 -1.000000 +85346 -1.000000 +85347 -1.000000 +85348 -1.000000 +85349 -1.000000 +85350 -1.000000 +85351 -1.000000 +85352 -1.000000 +85353 -1.000000 +85354 -1.000000 +85355 -1.000000 +85356 -1.000000 +85357 -1.000000 +85358 -1.000000 +85361 -1.000000 +85364 -1.000000 +85365 -1.000000 +85366 -1.000000 +85367 -1.000000 +85368 -1.000000 +85369 -1.000000 +85370 -1.000000 +85371 -1.000000 +85372 -1.000000 +85373 -1.000000 +85374 -1.000000 +85375 -1.000000 +85376 -1.000000 +85378 -1.000000 +85380 -1.000000 +85381 -1.000000 +85388 -1.000000 +85389 -1.000000 +85391 -1.000000 +85392 -1.000000 +85393 -1.000000 +85394 -1.000000 +85398 -1.000000 +85399 -1.000000 +85400 -1.000000 +85402 -1.000000 +85403 -1.000000 +85405 -1.000000 +85406 -1.000000 +85407 -1.000000 +85412 -1.000000 +85415 -1.000000 +85416 -1.000000 +85418 -1.000000 +85419 -1.000000 +85420 -1.000000 +85423 -1.000000 +85425 -1.000000 +85428 -1.000000 +85431 -1.000000 +85432 -1.000000 +85433 -1.000000 +85435 -1.000000 +85436 -1.000000 +85437 -1.000000 +85438 -1.000000 +85439 -1.000000 +85441 -1.000000 +85444 -1.000000 +85458 -1.000000 +85459 -1.000000 +85461 -1.000000 +85462 -1.000000 +85463 -1.000000 +85464 -1.000000 +85465 -1.000000 +85466 -1.000000 +85468 -1.000000 +85469 -1.000000 +85470 -1.000000 +85471 -1.000000 +85474 -1.000000 +85475 -1.000000 +85476 -1.000000 +85477 -1.000000 +85478 -1.000000 +85479 -1.000000 +85480 -1.000000 +85481 -1.000000 +85485 -1.000000 +85486 -1.000000 +85487 -1.000000 +85488 -1.000000 +85489 -1.000000 +85490 -1.000000 +85491 -1.000000 +85492 -1.000000 +85493 -1.000000 +85494 -1.000000 +85495 -1.000000 +85496 -1.000000 +85497 -1.000000 +85498 -1.000000 +85499 -1.000000 +85500 -1.000000 +85501 -1.000000 +85502 -1.000000 +85503 -1.000000 +85504 -1.000000 +85505 -1.000000 +85506 -1.000000 +85507 -1.000000 +85508 -1.000000 +85509 -1.000000 +85510 -1.000000 +85511 -1.000000 +85512 -1.000000 +85513 -1.000000 +85514 -1.000000 +85515 -1.000000 +85516 -1.000000 +85517 -1.000000 +85518 -1.000000 +85519 -1.000000 +85520 -1.000000 +85521 -1.000000 +85522 -1.000000 +85523 -1.000000 +85524 -1.000000 +85525 -1.000000 +85526 -1.000000 +85527 -1.000000 +85528 -1.000000 +85529 -1.000000 +85530 -1.000000 +85531 -1.000000 +85532 -1.000000 +85533 -1.000000 +85534 -1.000000 +85535 -1.000000 +85536 -1.000000 +85537 -1.000000 +85538 -1.000000 +85539 -1.000000 +85540 -1.000000 +85541 -1.000000 +85542 -1.000000 +85543 -1.000000 +85544 -1.000000 +85545 -1.000000 +85546 -1.000000 +85547 -1.000000 +85548 -1.000000 +85549 -1.000000 +85550 -1.000000 +85552 -1.000000 +85553 -1.000000 +85555 -1.000000 +85556 -1.000000 +85557 -1.000000 +85558 -1.000000 +85559 -1.000000 +85560 -1.000000 +85561 -1.000000 +85562 -1.000000 +85563 -1.000000 +85564 -1.000000 +85565 -1.000000 +85566 -1.000000 +85567 -1.000000 +85568 -1.000000 +85569 -1.000000 +85570 -1.000000 +85571 -1.000000 +85572 -1.000000 +85573 -1.000000 +85574 -1.000000 +85575 -1.000000 +85576 -1.000000 +85577 -1.000000 +85578 -1.000000 +85579 -1.000000 +85580 -1.000000 +85581 -1.000000 +85582 -1.000000 +85583 -1.000000 +85584 -1.000000 +85585 -1.000000 +85586 -1.000000 +85587 -1.000000 +85588 -1.000000 +85589 -1.000000 +85590 -1.000000 +85591 -1.000000 +85592 -1.000000 +85594 -1.000000 +85595 -1.000000 +85596 -1.000000 +85597 -1.000000 +85598 -1.000000 +85599 -1.000000 +85600 -1.000000 +85601 -1.000000 +85602 -1.000000 +85604 -1.000000 +85606 -1.000000 +85607 -1.000000 +85608 -1.000000 +85609 -1.000000 +85610 -1.000000 +85611 -1.000000 +85612 -1.000000 +85613 -1.000000 +85614 -1.000000 +85615 -1.000000 +85616 -1.000000 +85617 -1.000000 +85618 -1.000000 +85619 -1.000000 +85620 -1.000000 +85621 -1.000000 +85622 -1.000000 +85623 -1.000000 +85624 -1.000000 +85625 -1.000000 +85626 -1.000000 +85627 -1.000000 +85628 -1.000000 +85629 -1.000000 +85630 -1.000000 +85631 -1.000000 +85632 -1.000000 +85633 -1.000000 +85634 -1.000000 +85635 -1.000000 +85636 -1.000000 +85637 -1.000000 +85638 -1.000000 +85639 -1.000000 +85640 -1.000000 +85641 -1.000000 +85642 -1.000000 +85644 -1.000000 +85645 -1.000000 +85646 -1.000000 +85647 -1.000000 +85648 -1.000000 +85649 -1.000000 +85650 -1.000000 +85651 -1.000000 +85652 -1.000000 +85653 -1.000000 +85654 -1.000000 +85655 -1.000000 +85656 -1.000000 +85657 -1.000000 +85658 -1.000000 +85659 -1.000000 +85660 -1.000000 +85661 -1.000000 +85662 -1.000000 +85663 -1.000000 +85664 -1.000000 +85665 -1.000000 +85666 -1.000000 +85667 -1.000000 +85668 -1.000000 +85670 -1.000000 +85671 -1.000000 +85672 -1.000000 +85673 -1.000000 +85676 -1.000000 +85677 -1.000000 +85678 -1.000000 +85679 -1.000000 +85680 -1.000000 +85681 -1.000000 +85682 -1.000000 +85683 -1.000000 +85684 -1.000000 +85685 -1.000000 +85686 -1.000000 +85687 -1.000000 +85688 -1.000000 +85689 -1.000000 +85690 -1.000000 +85691 -1.000000 +85692 -1.000000 +85693 -1.000000 +85694 -1.000000 +85695 -1.000000 +85696 -1.000000 +85697 -1.000000 +85698 -1.000000 +85699 -1.000000 +85700 -1.000000 +85701 -1.000000 +85702 -1.000000 +85703 -1.000000 +85704 -1.000000 +85705 -1.000000 +85706 -1.000000 +85707 -1.000000 +85708 -1.000000 +85709 -1.000000 +85710 -1.000000 +85711 -1.000000 +85712 -1.000000 +85713 -1.000000 +85714 -1.000000 +85715 -1.000000 +85716 -1.000000 +85717 -1.000000 +85718 -1.000000 +85719 -1.000000 +85721 -1.000000 +85723 -1.000000 +85724 -1.000000 +85725 -1.000000 +85726 -1.000000 +85728 -1.000000 +85729 -1.000000 +85730 -1.000000 +85731 -1.000000 +85732 -1.000000 +85733 -1.000000 +85734 -1.000000 +85735 -1.000000 +85736 -1.000000 +85737 -1.000000 +85738 -1.000000 +85739 -1.000000 +85740 -1.000000 +85741 -1.000000 +85742 -1.000000 +85743 -1.000000 +85744 -1.000000 +85745 -1.000000 +85746 -1.000000 +85747 -1.000000 +85748 -1.000000 +85749 -1.000000 +85750 -1.000000 +85751 -1.000000 +85752 -1.000000 +85754 -1.000000 +85755 -1.000000 +85756 -1.000000 +85757 -1.000000 +85758 -1.000000 +85759 -1.000000 +85760 -1.000000 +85761 -1.000000 +85762 -1.000000 +85764 -1.000000 +85765 -1.000000 +85766 -1.000000 +85768 -1.000000 +85769 -1.000000 +85770 -1.000000 +85772 -1.000000 +85773 -1.000000 +85775 -1.000000 +85776 -1.000000 +85777 -1.000000 +85781 -1.000000 +85782 -1.000000 +85783 -1.000000 +85784 -1.000000 +85785 -1.000000 +85786 -1.000000 +85787 -1.000000 +85788 -1.000000 +85789 -1.000000 +85790 -1.000000 +85791 -1.000000 +85793 -1.000000 +85794 -1.000000 +85795 -1.000000 +85796 -1.000000 +85797 -1.000000 +85798 -1.000000 +85799 -1.000000 +85800 -1.000000 +85802 -1.000000 +85810 -1.000000 +85811 -1.000000 +85812 -1.000000 +85813 -1.000000 +85814 -1.000000 +85815 -1.000000 +85816 -1.000000 +85817 -1.000000 +85818 -1.000000 +85819 -1.000000 +85820 -1.000000 +85821 -1.000000 +85822 -1.000000 +85826 -1.000000 +85827 -1.000000 +85828 -1.000000 +85829 -1.000000 +85830 -1.000000 +85831 -1.000000 +85832 -1.000000 +85833 -1.000000 +85834 -1.000000 +85835 -1.000000 +85836 -1.000000 +85837 -1.000000 +85838 -1.000000 +85839 -1.000000 +85840 -1.000000 +85841 -1.000000 +85842 -1.000000 +85844 -1.000000 +85845 -1.000000 +85846 -1.000000 +85847 -1.000000 +85849 -1.000000 +85850 -1.000000 +85851 -1.000000 +85852 -1.000000 +85853 -1.000000 +85854 -1.000000 +85855 -1.000000 +85856 -1.000000 +85859 -1.000000 +85860 -1.000000 +85862 -1.000000 +85863 -1.000000 +85864 -1.000000 +85866 -1.000000 +85868 -1.000000 +85870 -1.000000 +85871 -1.000000 +85872 -1.000000 +85873 -1.000000 +85874 -1.000000 +85875 -1.000000 +85876 -1.000000 +85877 -1.000000 +85878 -1.000000 +85879 -1.000000 +85880 -1.000000 +85881 -1.000000 +85884 -1.000000 +85885 -1.000000 +85886 -1.000000 +85887 -1.000000 +85889 -1.000000 +85890 -1.000000 +85891 -1.000000 +85892 -1.000000 +85893 -1.000000 +85894 -1.000000 +85895 -1.000000 +85896 -1.000000 +85897 -1.000000 +85898 -1.000000 +85899 -1.000000 +85900 -1.000000 +85901 -1.000000 +85902 -1.000000 +85903 -1.000000 +85904 -1.000000 +85905 -1.000000 +85906 -1.000000 +85907 -1.000000 +85908 -1.000000 +85909 -1.000000 +85910 -1.000000 +85911 -1.000000 +85912 -1.000000 +85913 -1.000000 +85914 -1.000000 +85915 -1.000000 +85916 -1.000000 +85917 -1.000000 +85918 -1.000000 +85919 -1.000000 +85920 -1.000000 +85921 -1.000000 +85922 -1.000000 +85923 -1.000000 +85924 -1.000000 +85926 -1.000000 +85927 -1.000000 +85928 -1.000000 +85929 -1.000000 +85930 -1.000000 +85931 -1.000000 +85932 -1.000000 +85933 -1.000000 +85934 -1.000000 +85935 -1.000000 +85936 -1.000000 +85937 -1.000000 +85945 -1.000000 +85949 -1.000000 +85950 -1.000000 +85951 -1.000000 +85952 -1.000000 +85953 -1.000000 +85954 -1.000000 +85955 -1.000000 +85956 -1.000000 +85957 -1.000000 +85960 -1.000000 +85961 -1.000000 +85962 -1.000000 +85963 -1.000000 +85965 -1.000000 +85966 -1.000000 +85979 -1.000000 +85980 -1.000000 +85981 -1.000000 +85982 -1.000000 +85983 -1.000000 +85984 -1.000000 +85985 -1.000000 +85986 -1.000000 +85987 -1.000000 +85988 -1.000000 +85989 -1.000000 +85990 -1.000000 +85991 -1.000000 +85992 -1.000000 +85993 -1.000000 +85994 -1.000000 +85995 -1.000000 +85996 -1.000000 +85997 -1.000000 +85998 -1.000000 +85999 -1.000000 +86000 -1.000000 +86001 -1.000000 +86002 -1.000000 +86003 -1.000000 +86004 -1.000000 +86005 -1.000000 +86006 -1.000000 +86007 -1.000000 +86008 -1.000000 +86009 -1.000000 +86010 -1.000000 +86011 -1.000000 +86012 -1.000000 +86013 -1.000000 +86014 -1.000000 +86015 -1.000000 +86016 -1.000000 +86017 -1.000000 +86018 -1.000000 +86019 -1.000000 +86020 -1.000000 +86021 -1.000000 +86022 -1.000000 +86023 -1.000000 +86024 -1.000000 +86025 -1.000000 +86026 -1.000000 +86027 -1.000000 +86028 -1.000000 +86029 -1.000000 +86030 -1.000000 +86031 -1.000000 +86032 -1.000000 +86033 -1.000000 +86034 -1.000000 +86035 -1.000000 +86036 -1.000000 +86037 -1.000000 +86038 -1.000000 +86039 -1.000000 +86040 -1.000000 +86041 -1.000000 +86042 -1.000000 +86043 -1.000000 +86044 -1.000000 +86045 -1.000000 +86046 -1.000000 +86047 -1.000000 +86048 -1.000000 +86049 -1.000000 +86050 -1.000000 +86051 -1.000000 +86052 -1.000000 +86053 -1.000000 +86054 -1.000000 +86055 -1.000000 +86056 -1.000000 +86057 -1.000000 +86058 -1.000000 +86059 -1.000000 +86060 -1.000000 +86061 -1.000000 +86062 -1.000000 +86063 -1.000000 +86064 -1.000000 +86065 -1.000000 +86066 -1.000000 +86067 -1.000000 +86068 -1.000000 +86069 -1.000000 +86070 -1.000000 +86071 -1.000000 +86072 -1.000000 +86073 -1.000000 +86074 -1.000000 +86075 -1.000000 +86076 -1.000000 +86077 -1.000000 +86078 -1.000000 +86079 -1.000000 +86080 -1.000000 +86081 -1.000000 +86082 -1.000000 +86083 -1.000000 +86084 -1.000000 +86085 -1.000000 +86086 -1.000000 +86087 -1.000000 +86088 -1.000000 +86089 -1.000000 +86090 -1.000000 +86091 -1.000000 +86092 -1.000000 +86093 -1.000000 +86094 -1.000000 +86095 -1.000000 +86096 -1.000000 +86097 -1.000000 +86098 -1.000000 +86099 -1.000000 +86100 -1.000000 +86101 -1.000000 +86103 -1.000000 +86104 -1.000000 +86105 -1.000000 +86106 -1.000000 +86107 -1.000000 +86108 -1.000000 +86109 -1.000000 +86110 -1.000000 +86111 -1.000000 +86112 -1.000000 +86113 -1.000000 +86114 -1.000000 +86115 -1.000000 +86116 -1.000000 +86117 -1.000000 +86118 -1.000000 +86119 -1.000000 +86120 -1.000000 +86121 -1.000000 +86122 -1.000000 +86123 -1.000000 +86124 -1.000000 +86125 -1.000000 +86126 -1.000000 +86127 -1.000000 +86128 -1.000000 +86130 -1.000000 +86132 -1.000000 +86133 -1.000000 +86134 -1.000000 +86135 -1.000000 +86136 -1.000000 +86137 -1.000000 +86138 -1.000000 +86139 -1.000000 +86141 -1.000000 +86142 -1.000000 +86143 -1.000000 +86144 -1.000000 +86145 -1.000000 +86146 -1.000000 +86147 -1.000000 +86148 -1.000000 +86149 -1.000000 +86150 -1.000000 +86151 -1.000000 +86152 -1.000000 +86154 -1.000000 +86155 -1.000000 +86156 -1.000000 +86157 -1.000000 +86158 -1.000000 +86159 -1.000000 +86160 -1.000000 +86161 -1.000000 +86162 -1.000000 +86163 -1.000000 +86164 -1.000000 +86165 -1.000000 +86166 -1.000000 +86167 -1.000000 +86168 -1.000000 +86169 -1.000000 +86170 -1.000000 +86171 -1.000000 +86172 -1.000000 +86173 -1.000000 +86174 -1.000000 +86175 -1.000000 +86176 -1.000000 +86177 -1.000000 +86178 -1.000000 +86179 -1.000000 +86180 -1.000000 +86181 -1.000000 +86182 -1.000000 +86183 -1.000000 +86184 -1.000000 +86185 -1.000000 +86186 -1.000000 +86187 -1.000000 +86188 -1.000000 +86189 -1.000000 +86190 -1.000000 +86191 -1.000000 +86192 -1.000000 +86193 -1.000000 +86194 -1.000000 +86195 -1.000000 +86196 -1.000000 +86197 -1.000000 +86198 -1.000000 +86199 -1.000000 +86200 -1.000000 +86201 -1.000000 +86202 -1.000000 +86203 -1.000000 +86204 -1.000000 +86205 -1.000000 +86206 -1.000000 +86207 -1.000000 +86208 -1.000000 +86209 -1.000000 +86210 -1.000000 +86211 -1.000000 +86212 -1.000000 +86213 -1.000000 +86214 -1.000000 +86215 -1.000000 +86216 -1.000000 +86217 -1.000000 +86218 -1.000000 +86219 -1.000000 +86220 -1.000000 +86221 -1.000000 +86222 -1.000000 +86223 -1.000000 +86224 -1.000000 +86225 -1.000000 +86226 -1.000000 +86227 -1.000000 +86228 -1.000000 +86229 -1.000000 +86230 -1.000000 +86231 -1.000000 +86232 -1.000000 +86233 -1.000000 +86234 -1.000000 +86235 -1.000000 +86236 -1.000000 +86237 -1.000000 +86238 -1.000000 +86239 -1.000000 +86240 -1.000000 +86241 -1.000000 +86242 -1.000000 +86243 -1.000000 +86244 -1.000000 +86245 -1.000000 +86246 -1.000000 +86247 -1.000000 +86248 -1.000000 +86249 -1.000000 +86250 -1.000000 +86251 -1.000000 +86252 -1.000000 +86253 -1.000000 +86254 -1.000000 +86255 -1.000000 +86256 -1.000000 +86257 -1.000000 +86258 -1.000000 +86259 -1.000000 +86260 -1.000000 +86261 -1.000000 +86262 -1.000000 +86263 -1.000000 +86264 -1.000000 +86265 -1.000000 +86267 -1.000000 +86269 -1.000000 +86270 -1.000000 +86271 -1.000000 +86272 -1.000000 +86273 -1.000000 +86274 -1.000000 +86275 -1.000000 +86276 -1.000000 +86277 -1.000000 +86279 -1.000000 +86281 -1.000000 +86282 -1.000000 +86283 -1.000000 +86284 -1.000000 +86285 -1.000000 +86286 -1.000000 +86287 -1.000000 +86294 -1.000000 +86295 -1.000000 +86296 -1.000000 +86297 -1.000000 +86298 -1.000000 +86299 -1.000000 +86301 -1.000000 +86302 -1.000000 +86303 -1.000000 +86304 -1.000000 +86305 -1.000000 +86307 -1.000000 +86309 -1.000000 +86310 -1.000000 +86311 -1.000000 +86312 -1.000000 +86314 -1.000000 +86316 -1.000000 +86318 -1.000000 +86320 -1.000000 +86322 -1.000000 +86323 -1.000000 +86324 -1.000000 +86325 -1.000000 +86326 -1.000000 +86327 -1.000000 +86328 -1.000000 +86329 -1.000000 +86330 -1.000000 +86331 -1.000000 +86332 -1.000000 +86333 -1.000000 +86334 -1.000000 +86335 -1.000000 +86336 -1.000000 +86338 -1.000000 +86339 -1.000000 +86340 -1.000000 +86341 -1.000000 +86342 -1.000000 +86343 -1.000000 +86344 -1.000000 +86345 -1.000000 +86346 -1.000000 +86347 -1.000000 +86349 -1.000000 +86351 -1.000000 +86352 -1.000000 +86353 -1.000000 +86354 -1.000000 +86355 -1.000000 +86356 -1.000000 +86357 -1.000000 +86358 -1.000000 +86359 -1.000000 +86361 -1.000000 +86364 -1.000000 +86365 -1.000000 +86366 -1.000000 +86367 -1.000000 +86368 -1.000000 +86369 -1.000000 +86370 -1.000000 +86371 -1.000000 +86372 -1.000000 +86373 -1.000000 +86374 -1.000000 +86375 -1.000000 +86376 -1.000000 +86377 -1.000000 +86379 -1.000000 +86380 -1.000000 +86382 -1.000000 +86384 -1.000000 +86385 -1.000000 +86386 -1.000000 +86387 -1.000000 +86388 -1.000000 +86389 -1.000000 +86390 -1.000000 +86391 -1.000000 +86392 -1.000000 +86393 -1.000000 +86394 -1.000000 +86395 -1.000000 +86396 -1.000000 +86397 -1.000000 +86398 -1.000000 +86399 -1.000000 +86400 -1.000000 +86401 -1.000000 +86402 -1.000000 +86403 -1.000000 +86404 -1.000000 +86405 -1.000000 +86406 -1.000000 +86407 -1.000000 +86409 -1.000000 +86410 -1.000000 +86411 -1.000000 +86412 -1.000000 +86413 -1.000000 +86414 -1.000000 +86416 -1.000000 +86417 -1.000000 +86418 -1.000000 +86419 -1.000000 +86420 -1.000000 +86421 -1.000000 +86422 -1.000000 +86423 -1.000000 +86424 -1.000000 +86425 -1.000000 +86427 -1.000000 +86428 -1.000000 +86429 -1.000000 +86431 -1.000000 +86432 -1.000000 +86433 -1.000000 +86434 -1.000000 +86435 -1.000000 +86436 -1.000000 +86437 -1.000000 +86438 -1.000000 +86439 -1.000000 +86440 -1.000000 +86441 -1.000000 +86442 -1.000000 +86443 -1.000000 +86444 -1.000000 +86445 -1.000000 +86447 -1.000000 +86450 -1.000000 +86451 -1.000000 +86452 -1.000000 +86453 -1.000000 +86454 -1.000000 +86456 -1.000000 +86457 -1.000000 +86458 -1.000000 +86459 -1.000000 +86460 -1.000000 +86461 -1.000000 +86462 -1.000000 +86463 -1.000000 +86464 -1.000000 +86465 -1.000000 +86466 -1.000000 +86469 -1.000000 +86470 -1.000000 +86471 -1.000000 +86472 -1.000000 +86473 -1.000000 +86474 -1.000000 +86475 -1.000000 +86476 -1.000000 +86477 -1.000000 +86478 -1.000000 +86479 -1.000000 +86480 -1.000000 +86481 -1.000000 +86482 -1.000000 +86483 -1.000000 +86484 -1.000000 +86485 -1.000000 +86486 -1.000000 +86487 -1.000000 +86488 -1.000000 +86489 -1.000000 +86490 -1.000000 +86491 -1.000000 +86492 -1.000000 +86493 -1.000000 +86494 -1.000000 +86495 -1.000000 +86496 -1.000000 +86497 -1.000000 +86498 -1.000000 +86499 -1.000000 +86500 -1.000000 +86501 -1.000000 +86502 -1.000000 +86503 -1.000000 +86504 -1.000000 +86505 -1.000000 +86506 -1.000000 +86507 -1.000000 +86508 -1.000000 +86509 -1.000000 +86510 -1.000000 +86511 -1.000000 +86512 -1.000000 +86513 -1.000000 +86514 -1.000000 +86515 -1.000000 +86516 -1.000000 +86517 -1.000000 +86518 -1.000000 +86519 -1.000000 +86520 -1.000000 +86521 -1.000000 +86522 -1.000000 +86526 -1.000000 +86528 -1.000000 +86529 -1.000000 +86530 -1.000000 +86531 -1.000000 +86532 -1.000000 +86533 -1.000000 +86535 -1.000000 +86536 -1.000000 +86537 -1.000000 +86538 -1.000000 +86539 -1.000000 +86540 -1.000000 +86541 -1.000000 +86543 -1.000000 +86546 -1.000000 +86547 -1.000000 +86548 -1.000000 +86549 -1.000000 +86551 -1.000000 +86552 -1.000000 +86555 -1.000000 +86556 -1.000000 +86557 -1.000000 +86560 -1.000000 +86561 -1.000000 +86563 -1.000000 +86564 -1.000000 +86565 -1.000000 +86566 -1.000000 +86567 -1.000000 +86568 -1.000000 +86569 -1.000000 +86570 -1.000000 +86571 -1.000000 +86572 -1.000000 +86573 -1.000000 +86574 -1.000000 +86575 -1.000000 +86576 -1.000000 +86577 -1.000000 +86578 -1.000000 +86579 -1.000000 +86581 -1.000000 +86584 -1.000000 +86589 -1.000000 +86590 -1.000000 +86593 -1.000000 +86594 -1.000000 +86595 -1.000000 +86596 -1.000000 +86597 -1.000000 +86598 -1.000000 +86599 -1.000000 +86600 -1.000000 +86605 -1.000000 +86606 -1.000000 +86607 -1.000000 +86609 -1.000000 +86610 -1.000000 +86611 -1.000000 +86612 -1.000000 +86613 -1.000000 +86616 -1.000000 +86618 -1.000000 +86621 -1.000000 +86623 -1.000000 +86625 -1.000000 +86631 -1.000000 +86633 -1.000000 +86634 -1.000000 +86637 -1.000000 +86638 -1.000000 +86639 -1.000000 +86640 -1.000000 +86641 -1.000000 +86642 -1.000000 +86643 -1.000000 +86645 -1.000000 +86647 -1.000000 +86648 -1.000000 +86649 -1.000000 +86650 -1.000000 +86651 -1.000000 +86652 -1.000000 +86653 -1.000000 +86654 -1.000000 +86656 -1.000000 +86657 -1.000000 +86662 -1.000000 +86663 -1.000000 +86665 -1.000000 +86666 -1.000000 +86667 -1.000000 +86668 -1.000000 +86669 -1.000000 +86671 -1.000000 +86672 -1.000000 +86673 -1.000000 +86675 -1.000000 +86676 -1.000000 +86677 -1.000000 +86679 -1.000000 +86680 -1.000000 +86681 -1.000000 +86682 -1.000000 +86683 -1.000000 +86684 -1.000000 +86685 -1.000000 +86687 -1.000000 +86689 -1.000000 +86690 -1.000000 +86697 -1.000000 +86700 -1.000000 +86703 -1.000000 +86704 -1.000000 +86705 -1.000000 +86706 -1.000000 +86707 -1.000000 +86708 -1.000000 +86709 -1.000000 +86710 -1.000000 +86711 -1.000000 +86713 -1.000000 +86715 -1.000000 +86717 -1.000000 +86718 -1.000000 +86719 -1.000000 +86720 -1.000000 +86723 -1.000000 +86724 -1.000000 +86725 -1.000000 +86727 -1.000000 +86728 -1.000000 +86729 -1.000000 +86730 -1.000000 +86731 -1.000000 +86732 -1.000000 +86733 -1.000000 +86734 -1.000000 +86735 -1.000000 +86736 -1.000000 +86737 -1.000000 +86738 -1.000000 +86739 -1.000000 +86740 -1.000000 +86741 -1.000000 +86742 -1.000000 +86743 -1.000000 +86744 -1.000000 +86745 -1.000000 +86746 -1.000000 +86747 -1.000000 +86748 -1.000000 +86749 -1.000000 +86751 -1.000000 +86752 -1.000000 +86753 -1.000000 +86754 -1.000000 +86755 -1.000000 +86756 -1.000000 +86757 -1.000000 +86758 -1.000000 +86759 -1.000000 +86760 -1.000000 +86761 -1.000000 +86762 -1.000000 +86763 -1.000000 +86764 -1.000000 +86765 -1.000000 +86766 -1.000000 +86767 -1.000000 +86768 -1.000000 +86769 -1.000000 +86770 -1.000000 +86771 -1.000000 +86772 -1.000000 +86773 -1.000000 +86774 -1.000000 +86775 -1.000000 +86778 -1.000000 +86779 -1.000000 +86780 -1.000000 +86781 -1.000000 +86782 -1.000000 +86783 -1.000000 +86784 -1.000000 +86785 -1.000000 +86786 -1.000000 +86787 -1.000000 +86788 -1.000000 +86789 -1.000000 +86790 -1.000000 +86791 -1.000000 +86792 -1.000000 +86794 -1.000000 +86795 -1.000000 +86797 -1.000000 +86800 -1.000000 +86803 -1.000000 +86804 -1.000000 +86805 -1.000000 +86806 -1.000000 +86807 -1.000000 +86808 -1.000000 +86809 -1.000000 +86810 -1.000000 +86811 -1.000000 +86812 -1.000000 +86813 -1.000000 +86814 -1.000000 +86815 -1.000000 +86816 -1.000000 +86817 -1.000000 +86818 -1.000000 +86820 -1.000000 +86821 -1.000000 +86822 -1.000000 +86823 -1.000000 +86824 -1.000000 +86825 -1.000000 +86827 -1.000000 +86828 -1.000000 +86829 -1.000000 +86830 -1.000000 +86831 -1.000000 +86833 -1.000000 +86834 -1.000000 +86835 -1.000000 +86837 -1.000000 +86838 -1.000000 +86839 -1.000000 +86840 -1.000000 +86841 -1.000000 +86842 -1.000000 +86843 -1.000000 +86844 -1.000000 +86846 -1.000000 +86847 -1.000000 +86849 -1.000000 +86850 -1.000000 +86851 -1.000000 +86852 -1.000000 +86853 -1.000000 +86854 -1.000000 +86862 -1.000000 +86868 -1.000000 +86869 -1.000000 +86870 -1.000000 +86872 -1.000000 +86873 -1.000000 +86876 -1.000000 +86888 -1.000000 +86890 -1.000000 +86891 -1.000000 +86892 -1.000000 +86893 -1.000000 +86895 -1.000000 +86897 -1.000000 +86900 -1.000000 +86901 -1.000000 +86902 -1.000000 +86903 -1.000000 +86905 -1.000000 +86906 -1.000000 +86907 -1.000000 +86908 -1.000000 +86909 -1.000000 +86910 -1.000000 +86912 -1.000000 +86913 -1.000000 +86915 -1.000000 +86917 -1.000000 +86918 -1.000000 +86919 -1.000000 +86921 -1.000000 +86922 -1.000000 +86923 -1.000000 +86928 -1.000000 +86930 -1.000000 +86931 -1.000000 +86932 -1.000000 +86934 -1.000000 +86936 -1.000000 +86941 -1.000000 +86942 -1.000000 +86943 -1.000000 +86944 -1.000000 +86945 -1.000000 +86946 -1.000000 +86947 -1.000000 +86948 -1.000000 +86950 -1.000000 +86952 -1.000000 +86954 -1.000000 +86955 -1.000000 +86957 -1.000000 +86958 -1.000000 +86960 -1.000000 +86962 -1.000000 +86963 -1.000000 +86964 -1.000000 +86965 -1.000000 +86966 -1.000000 +86967 -1.000000 +86968 -1.000000 +86970 -1.000000 +86971 -1.000000 +86972 -1.000000 +86973 -1.000000 +86974 -1.000000 +86975 -1.000000 +86976 -1.000000 +86977 -1.000000 +86978 -1.000000 +86979 -1.000000 +86980 -1.000000 +86981 -1.000000 +86982 -1.000000 +86983 -1.000000 +86984 -1.000000 +86985 -1.000000 +86987 -1.000000 +86988 -1.000000 +86989 -1.000000 +86990 -1.000000 +86992 -1.000000 +86994 -1.000000 +86995 -1.000000 +86996 -1.000000 +86997 -1.000000 +86998 -1.000000 +86999 -1.000000 +87000 -1.000000 +87001 -1.000000 +87002 -1.000000 +87003 -1.000000 +87004 -1.000000 +87005 -1.000000 +87006 -1.000000 +87007 -1.000000 +87009 -1.000000 +87010 -1.000000 +87012 -1.000000 +87013 -1.000000 +87016 -1.000000 +87017 -1.000000 +87018 -1.000000 +87019 -1.000000 +87020 -1.000000 +87021 -1.000000 +87022 -1.000000 +87024 -1.000000 +87028 -1.000000 +87029 -1.000000 +87030 -1.000000 +87031 -1.000000 +87032 -1.000000 +87033 -1.000000 +87034 -1.000000 +87035 -1.000000 +87036 -1.000000 +87037 -1.000000 +87038 -1.000000 +87039 -1.000000 +87041 -1.000000 +87042 -1.000000 +87044 -1.000000 +87045 -1.000000 +87046 -1.000000 +87047 -1.000000 +87048 -1.000000 +87049 -1.000000 +87052 -1.000000 +87053 -1.000000 +87054 -1.000000 +87055 -1.000000 +87057 -1.000000 +87058 -1.000000 +87059 -1.000000 +87060 -1.000000 +87062 -1.000000 +87063 -1.000000 +87064 -1.000000 +87067 -1.000000 +87069 -1.000000 +87070 -1.000000 +87071 -1.000000 +87072 -1.000000 +87073 -1.000000 +87075 -1.000000 +87076 -1.000000 +87077 -1.000000 +87078 -1.000000 +87079 -1.000000 +87080 -1.000000 +87081 -1.000000 +87082 -1.000000 +87083 -1.000000 +87084 -1.000000 +87085 -1.000000 +87086 -1.000000 +87087 -1.000000 +87088 -1.000000 +87089 -1.000000 +87090 -1.000000 +87091 -1.000000 +87092 -1.000000 +87093 -1.000000 +87094 -1.000000 +87095 -1.000000 +87096 -1.000000 +87097 -1.000000 +87098 -1.000000 +87099 -1.000000 +87100 -1.000000 +87102 -1.000000 +87103 -1.000000 +87104 -1.000000 +87105 -1.000000 +87106 -1.000000 +87107 -1.000000 +87108 -1.000000 +87109 -1.000000 +87110 -1.000000 +87111 -1.000000 +87112 -1.000000 +87113 -1.000000 +87114 -1.000000 +87115 -1.000000 +87116 -1.000000 +87117 -1.000000 +87118 -1.000000 +87120 -1.000000 +87121 -1.000000 +87122 -1.000000 +87123 -1.000000 +87124 -1.000000 +87137 -1.000000 +87139 -1.000000 +87140 -1.000000 +87141 -1.000000 +87143 -1.000000 +87144 -1.000000 +87145 -1.000000 +87157 -1.000000 +87158 -1.000000 +87159 -1.000000 +87160 -1.000000 +87161 -1.000000 +87162 -1.000000 +87163 -1.000000 +87164 -1.000000 +87165 -1.000000 +87166 -1.000000 +87167 -1.000000 +87168 -1.000000 +87169 -1.000000 +87170 -1.000000 +87172 -1.000000 +87173 -1.000000 +87174 -1.000000 +87176 -1.000000 +87177 -1.000000 +87178 -1.000000 +87179 -1.000000 +87180 -1.000000 +87181 -1.000000 +87182 -1.000000 +87183 -1.000000 +87185 -1.000000 +87186 -1.000000 +87187 -1.000000 +87188 -1.000000 +87190 -1.000000 +87191 -1.000000 +87192 -1.000000 +87193 -1.000000 +87194 -1.000000 +87195 -1.000000 +87196 -1.000000 +87199 -1.000000 +87200 -1.000000 +87206 -1.000000 +87207 -1.000000 +87208 -1.000000 +87215 -1.000000 +87217 -1.000000 +87218 -1.000000 +87220 -1.000000 +87221 -1.000000 +87224 -1.000000 +87225 -1.000000 +87227 -1.000000 +87229 -1.000000 +87230 -1.000000 +87231 -1.000000 +87233 -1.000000 +87234 -1.000000 +87235 -1.000000 +87236 -1.000000 +87237 -1.000000 +87238 -1.000000 +87239 -1.000000 +87240 -1.000000 +87241 -1.000000 +87242 -1.000000 +87245 -1.000000 +87246 -1.000000 +87247 -1.000000 +87249 -1.000000 +87250 -1.000000 +87251 -1.000000 +87252 -1.000000 +87256 -1.000000 +87257 -1.000000 +87258 -1.000000 +87259 -1.000000 +87260 -1.000000 +87261 -1.000000 +87262 -1.000000 +87263 -1.000000 +87264 -1.000000 +87265 -1.000000 +87266 -1.000000 +87267 -1.000000 +87269 -1.000000 +87270 -1.000000 +87271 -1.000000 +87272 -1.000000 +87273 -1.000000 +87274 -1.000000 +87275 -1.000000 +87276 -1.000000 +87277 -1.000000 +87278 -1.000000 +87279 -1.000000 +87280 -1.000000 +87281 -1.000000 +87282 -1.000000 +87283 -1.000000 +87284 -1.000000 +87285 -1.000000 +87286 -1.000000 +87288 -1.000000 +87289 -1.000000 +87290 -1.000000 +87291 -1.000000 +87292 -1.000000 +87294 -1.000000 +87295 -1.000000 +87297 -1.000000 +87298 -1.000000 +87301 -1.000000 +87302 -1.000000 +87303 -1.000000 +87304 -1.000000 +87307 -1.000000 +87308 -1.000000 +87309 -1.000000 +87310 -1.000000 +87311 -1.000000 +87312 -1.000000 +87313 -1.000000 +87314 -1.000000 +87315 -1.000000 +87316 -1.000000 +87317 -1.000000 +87319 -1.000000 +87320 -1.000000 +87321 -1.000000 +87322 -1.000000 +87323 -1.000000 +87324 -1.000000 +87327 -1.000000 +87330 -1.000000 +87331 -1.000000 +87332 -1.000000 +87333 -1.000000 +87335 -1.000000 +87336 -1.000000 +87337 -1.000000 +87338 -1.000000 +87339 -1.000000 +87340 -1.000000 +87341 -1.000000 +87342 -1.000000 +87343 -1.000000 +87344 -1.000000 +87345 -1.000000 +87346 -1.000000 +87347 -1.000000 +87348 -1.000000 +87349 -1.000000 +87350 -1.000000 +87351 -1.000000 +87352 -1.000000 +87353 -1.000000 +87354 -1.000000 +87357 -1.000000 +87359 -1.000000 +87360 -1.000000 +87361 -1.000000 +87362 -1.000000 +87363 -1.000000 +87364 -1.000000 +87365 -1.000000 +87366 -1.000000 +87367 -1.000000 +87368 -1.000000 +87369 -1.000000 +87370 -1.000000 +87371 -1.000000 +87372 -1.000000 +87373 -1.000000 +87374 -1.000000 +87375 -1.000000 +87376 -1.000000 +87378 -1.000000 +87379 -1.000000 +87380 -1.000000 +87381 -1.000000 +87382 -1.000000 +87383 -1.000000 +87384 -1.000000 +87386 -1.000000 +87388 -1.000000 +87389 -1.000000 +87390 -1.000000 +87391 -1.000000 +87392 -1.000000 +87393 -1.000000 +87394 -1.000000 +87395 -1.000000 +87396 -1.000000 +87397 -1.000000 +87398 -1.000000 +87399 -1.000000 +87400 -1.000000 +87401 -1.000000 +87403 -1.000000 +87404 -1.000000 +87405 -1.000000 +87406 -1.000000 +87407 -1.000000 +87408 -1.000000 +87409 -1.000000 +87410 -1.000000 +87411 -1.000000 +87413 -1.000000 +87414 -1.000000 +87415 -1.000000 +87416 -1.000000 +87417 -1.000000 +87418 -1.000000 +87419 -1.000000 +87420 -1.000000 +87421 -1.000000 +87422 -1.000000 +87423 -1.000000 +87424 -1.000000 +87425 -1.000000 +87426 -1.000000 +87427 -1.000000 +87428 -1.000000 +87429 -1.000000 +87430 -1.000000 +87431 -1.000000 +87432 -1.000000 +87433 -1.000000 +87436 -1.000000 +87438 -1.000000 +87440 -1.000000 +87442 -1.000000 +87445 -1.000000 +87446 -1.000000 +87447 -1.000000 +87448 -1.000000 +87449 -1.000000 +87450 -1.000000 +87451 -1.000000 +87452 -1.000000 +87453 -1.000000 +87454 -1.000000 +87455 -1.000000 +87456 -1.000000 +87457 -1.000000 +87458 -1.000000 +87459 -1.000000 +87460 -1.000000 +87461 -1.000000 +87462 -1.000000 +87463 -1.000000 +87464 -1.000000 +87465 -1.000000 +87466 -1.000000 +87467 -1.000000 +87468 -1.000000 +87469 -1.000000 +87470 -1.000000 +87471 -1.000000 +87472 -1.000000 +87474 -1.000000 +87476 -1.000000 +87479 -1.000000 +87481 -1.000000 +87482 -1.000000 +87483 -1.000000 +87485 -1.000000 +87486 -1.000000 +87488 -1.000000 +87489 -1.000000 +87492 -1.000000 +87497 -1.000000 +87499 -1.000000 +87500 -1.000000 +87501 -1.000000 +87504 -1.000000 +87505 -1.000000 +87506 -1.000000 +87508 -1.000000 +87511 -1.000000 +87512 -1.000000 +87513 -1.000000 +87514 -1.000000 +87517 -1.000000 +87519 -1.000000 +87520 -1.000000 +87523 -1.000000 +87524 -1.000000 +87527 -1.000000 +87528 -1.000000 +87529 -1.000000 +87533 -1.000000 +87535 -1.000000 +87536 -1.000000 +87537 -1.000000 +87538 -1.000000 +87539 -1.000000 +87551 -1.000000 +87554 -1.000000 +87556 -1.000000 +87557 -1.000000 +87558 -1.000000 +87559 -1.000000 +87560 -1.000000 +87561 -1.000000 +87562 -1.000000 +87563 -1.000000 +87564 -1.000000 +87565 -1.000000 +87566 -1.000000 +87567 -1.000000 +87568 -1.000000 +87570 -1.000000 +87584 -1.000000 +87585 -1.000000 +87586 -1.000000 +87587 -1.000000 +87588 -1.000000 +87590 -1.000000 +87591 -1.000000 +87592 -1.000000 +87593 -1.000000 +87594 -1.000000 +87595 -1.000000 +87596 -1.000000 +87597 -1.000000 +87598 -1.000000 +87603 -1.000000 +87604 -1.000000 +87605 -1.000000 +87606 -1.000000 +87607 -1.000000 +87608 -1.000000 +87609 -1.000000 +87610 -1.000000 +87611 -1.000000 +87612 -1.000000 +87613 -1.000000 +87614 -1.000000 +87615 -1.000000 +87616 -1.000000 +87617 -1.000000 +87618 -1.000000 +87619 -1.000000 +87620 -1.000000 +87621 -1.000000 +87622 -1.000000 +87623 -1.000000 +87624 -1.000000 +87625 -1.000000 +87626 -1.000000 +87627 -1.000000 +87628 -1.000000 +87629 -1.000000 +87630 -1.000000 +87631 -1.000000 +87632 -1.000000 +87633 -1.000000 +87634 -1.000000 +87635 -1.000000 +87636 -1.000000 +87637 -1.000000 +87638 -1.000000 +87639 -1.000000 +87641 -1.000000 +87642 -1.000000 +87645 -1.000000 +87646 -1.000000 +87648 -1.000000 +87650 -1.000000 +87651 -1.000000 +87652 -1.000000 +87653 -1.000000 +87654 -1.000000 +87655 -1.000000 +87656 -1.000000 +87657 -1.000000 +87658 -1.000000 +87659 -1.000000 +87660 -1.000000 +87661 -1.000000 +87662 -1.000000 +87663 -1.000000 +87664 -1.000000 +87665 -1.000000 +87666 -1.000000 +87667 -1.000000 +87668 -1.000000 +87669 -1.000000 +87670 -1.000000 +87671 -1.000000 +87672 -1.000000 +87673 -1.000000 +87674 -1.000000 +87675 -1.000000 +87676 -1.000000 +87677 -1.000000 +87678 -1.000000 +87679 -1.000000 +87680 -1.000000 +87681 -1.000000 +87682 -1.000000 +87683 -1.000000 +87684 -1.000000 +87685 -1.000000 +87686 -1.000000 +87687 -1.000000 +87688 -1.000000 +87689 -1.000000 +87690 -1.000000 +87691 -1.000000 +87692 -1.000000 +87693 -1.000000 +87694 -1.000000 +87695 -1.000000 +87696 -1.000000 +87698 -1.000000 +87699 -1.000000 +87700 -1.000000 +87701 -1.000000 +87703 -1.000000 +87704 -1.000000 +87705 -1.000000 +87706 -1.000000 +87707 -1.000000 +87708 -1.000000 +87709 -1.000000 +87710 -1.000000 +87711 -1.000000 +87712 -1.000000 +87715 -1.000000 +87716 -1.000000 +87717 -1.000000 +87718 -1.000000 +87721 -1.000000 +87723 -1.000000 +87724 -1.000000 +87725 -1.000000 +87727 -1.000000 +87729 -1.000000 +87730 -1.000000 +87731 -1.000000 +87732 -1.000000 +87733 -1.000000 +87734 -1.000000 +87735 -1.000000 +87736 -1.000000 +87737 -1.000000 +87738 -1.000000 +87739 -1.000000 +87741 -1.000000 +87742 -1.000000 +87744 -1.000000 +87745 -1.000000 +87747 -1.000000 +87748 -1.000000 +87749 -1.000000 +87750 -1.000000 +87752 -1.000000 +87753 -1.000000 +87754 -1.000000 +87755 -1.000000 +87756 -1.000000 +87758 -1.000000 +87759 -1.000000 +87760 -1.000000 +87761 -1.000000 +87762 -1.000000 +87763 -1.000000 +87764 -1.000000 +87765 -1.000000 +87766 -1.000000 +87767 -1.000000 +87768 -1.000000 +87769 -1.000000 +87770 -1.000000 +87771 -1.000000 +87772 -1.000000 +87773 -1.000000 +87774 -1.000000 +87775 -1.000000 +87776 -1.000000 +87777 -1.000000 +87778 -1.000000 +87779 -1.000000 +87780 -1.000000 +87781 -1.000000 +87783 -1.000000 +87784 -1.000000 +87785 -1.000000 +87786 -1.000000 +87788 -1.000000 +87789 -1.000000 +87792 -1.000000 +87793 -1.000000 +87794 -1.000000 +87795 -1.000000 +87799 -1.000000 +87800 -1.000000 +87801 -1.000000 +87802 -1.000000 +87803 -1.000000 +87805 -1.000000 +87806 -1.000000 +87807 -1.000000 +87808 -1.000000 +87809 -1.000000 +87810 -1.000000 +87814 -1.000000 +87815 -1.000000 +87816 -1.000000 +87817 -1.000000 +87818 -1.000000 +87819 -1.000000 +87823 -1.000000 +87825 -1.000000 +87829 -1.000000 +87830 -1.000000 +87831 -1.000000 +87833 -1.000000 +87834 -1.000000 +87835 -1.000000 +87836 -1.000000 +87837 -1.000000 +87838 -1.000000 +87839 -1.000000 +87840 -1.000000 +87841 -1.000000 +87842 -1.000000 +87843 -1.000000 +87844 -1.000000 +87845 -1.000000 +87846 -1.000000 +87847 -1.000000 +87849 -1.000000 +87850 -1.000000 +87851 -1.000000 +87852 -1.000000 +87853 -1.000000 +87854 -1.000000 +87855 -1.000000 +87858 -1.000000 +87860 -1.000000 +87862 -1.000000 +87865 -1.000000 +87866 -1.000000 +87867 -1.000000 +87868 -1.000000 +87869 -1.000000 +87870 -1.000000 +87871 -1.000000 +87872 -1.000000 +87873 -1.000000 +87874 -1.000000 +87875 -1.000000 +87876 -1.000000 +87877 -1.000000 +87879 -1.000000 +87880 -1.000000 +87881 -1.000000 +87882 -1.000000 +87883 -1.000000 +87884 -1.000000 +87885 -1.000000 +87886 -1.000000 +87887 -1.000000 +87888 -1.000000 +87889 -1.000000 +87890 -1.000000 +87891 -1.000000 +87892 -1.000000 +87893 -1.000000 +87894 -1.000000 +87895 -1.000000 +87896 -1.000000 +87897 -1.000000 +87898 -1.000000 +87899 -1.000000 +87900 -1.000000 +87901 -1.000000 +87902 -1.000000 +87903 -1.000000 +87904 -1.000000 +87905 -1.000000 +87906 -1.000000 +87907 -1.000000 +87908 -1.000000 +87909 -1.000000 +87910 -1.000000 +87911 -1.000000 +87912 -1.000000 +87913 -1.000000 +87914 -1.000000 +87915 -1.000000 +87916 -1.000000 +87917 -1.000000 +87918 -1.000000 +87919 -1.000000 +87920 -1.000000 +87921 -1.000000 +87922 -1.000000 +87923 -1.000000 +87924 -1.000000 +87925 -1.000000 +87926 -1.000000 +87927 -1.000000 +87928 -1.000000 +87929 -1.000000 +87930 -1.000000 +87931 -1.000000 +87932 -1.000000 +87933 -1.000000 +87934 -1.000000 +87935 -1.000000 +87936 -1.000000 +87943 -1.000000 +87944 -1.000000 +87945 -1.000000 +87946 -1.000000 +87947 -1.000000 +87948 -1.000000 +87949 -1.000000 +87950 -1.000000 +87951 -1.000000 +87952 -1.000000 +87953 -1.000000 +87954 -1.000000 +87955 -1.000000 +87956 -1.000000 +87957 -1.000000 +87958 -1.000000 +87959 -1.000000 +87960 -1.000000 +87961 -1.000000 +87962 -1.000000 +87963 -1.000000 +87964 -1.000000 +87965 -1.000000 +87966 -1.000000 +87967 -1.000000 +87968 -1.000000 +87969 -1.000000 +87970 -1.000000 +87971 -1.000000 +87972 -1.000000 +87973 -1.000000 +87974 -1.000000 +87975 -1.000000 +87976 -1.000000 +87977 -1.000000 +87978 -1.000000 +87979 -1.000000 +87980 -1.000000 +87981 -1.000000 +87982 -1.000000 +87983 -1.000000 +87984 -1.000000 +87985 -1.000000 +87986 -1.000000 +87987 -1.000000 +87988 -1.000000 +87989 -1.000000 +87990 -1.000000 +87991 -1.000000 +87992 -1.000000 +87993 -1.000000 +87994 -1.000000 +87995 -1.000000 +87996 -1.000000 +87997 -1.000000 +87998 -1.000000 +87999 -1.000000 +88000 -1.000000 +88001 -1.000000 +88002 -1.000000 +88003 -1.000000 +88004 -1.000000 +88005 -1.000000 +88006 -1.000000 +88007 -1.000000 +88008 -1.000000 +88009 -1.000000 +88010 -1.000000 +88011 -1.000000 +88012 -1.000000 +88013 -1.000000 +88014 -1.000000 +88015 -1.000000 +88016 -1.000000 +88017 -1.000000 +88018 -1.000000 +88019 -1.000000 +88020 -1.000000 +88021 -1.000000 +88022 -1.000000 +88023 -1.000000 +88024 -1.000000 +88025 -1.000000 +88026 -1.000000 +88027 -1.000000 +88028 -1.000000 +88029 -1.000000 +88030 -1.000000 +88031 -1.000000 +88032 -1.000000 +88033 -1.000000 +88034 -1.000000 +88035 -1.000000 +88036 -1.000000 +88037 -1.000000 +88038 -1.000000 +88039 -1.000000 +88040 -1.000000 +88041 -1.000000 +88042 -1.000000 +88043 -1.000000 +88044 -1.000000 +88045 -1.000000 +88046 -1.000000 +88047 -1.000000 +88048 -1.000000 +88049 -1.000000 +88050 -1.000000 +88051 -1.000000 +88052 -1.000000 +88053 -1.000000 +88054 -1.000000 +88055 -1.000000 +88056 -1.000000 +88057 -1.000000 +88058 -1.000000 +88059 -1.000000 +88060 -1.000000 +88061 -1.000000 +88062 -1.000000 +88063 -1.000000 +88064 -1.000000 +88065 -1.000000 +88066 -1.000000 +88067 -1.000000 +88068 -1.000000 +88069 -1.000000 +88070 -1.000000 +88071 -1.000000 +88072 -1.000000 +88073 -1.000000 +88074 -1.000000 +88075 -1.000000 +88076 -1.000000 +88077 -1.000000 +88078 -1.000000 +88079 -1.000000 +88080 -1.000000 +88081 -1.000000 +88082 -1.000000 +88083 -1.000000 +88084 -1.000000 +88085 -1.000000 +88086 -1.000000 +88087 -1.000000 +88088 -1.000000 +88089 -1.000000 +88090 -1.000000 +88091 -1.000000 +88092 -1.000000 +88093 -1.000000 +88094 -1.000000 +88095 -1.000000 +88096 -1.000000 +88097 -1.000000 +88099 -1.000000 +88100 -1.000000 +88101 -1.000000 +88102 -1.000000 +88103 -1.000000 +88104 -1.000000 +88105 -1.000000 +88106 -1.000000 +88107 -1.000000 +88108 -1.000000 +88109 -1.000000 +88110 -1.000000 +88111 -1.000000 +88112 -1.000000 +88113 -1.000000 +88114 -1.000000 +88115 -1.000000 +88116 -1.000000 +88117 -1.000000 +88118 -1.000000 +88119 -1.000000 +88120 -1.000000 +88121 -1.000000 +88122 -1.000000 +88123 -1.000000 +88124 -1.000000 +88125 -1.000000 +88126 -1.000000 +88127 -1.000000 +88128 -1.000000 +88129 -1.000000 +88130 -1.000000 +88131 -1.000000 +88132 -1.000000 +88133 -1.000000 +88134 -1.000000 +88135 -1.000000 +88136 -1.000000 +88137 -1.000000 +88138 -1.000000 +88139 -1.000000 +88140 -1.000000 +88141 -1.000000 +88142 -1.000000 +88143 -1.000000 +88144 -1.000000 +88145 -1.000000 +88146 -1.000000 +88147 -1.000000 +88148 -1.000000 +88149 -1.000000 +88150 -1.000000 +88151 -1.000000 +88152 -1.000000 +88153 -1.000000 +88154 -1.000000 +88155 -1.000000 +88156 -1.000000 +88157 -1.000000 +88158 -1.000000 +88159 -1.000000 +88160 -1.000000 +88161 -1.000000 +88162 -1.000000 +88163 -1.000000 +88164 -1.000000 +88165 -1.000000 +88166 -1.000000 +88167 -1.000000 +88168 -1.000000 +88169 -1.000000 +88170 -1.000000 +88171 -1.000000 +88172 -1.000000 +88173 -1.000000 +88174 -1.000000 +88175 -1.000000 +88176 -1.000000 +88177 -1.000000 +88178 -1.000000 +88179 -1.000000 +88180 -1.000000 +88181 -1.000000 +88183 -1.000000 +88184 -1.000000 +88185 -1.000000 +88186 -1.000000 +88187 -1.000000 +88188 -1.000000 +88193 -1.000000 +88194 -1.000000 +88195 -1.000000 +88196 -1.000000 +88198 -1.000000 +88199 -1.000000 +88200 -1.000000 +88201 -1.000000 +88202 -1.000000 +88203 -1.000000 +88204 -1.000000 +88205 -1.000000 +88206 -1.000000 +88207 -1.000000 +88208 -1.000000 +88209 -1.000000 +88210 -1.000000 +88211 -1.000000 +88212 -1.000000 +88213 -1.000000 +88214 -1.000000 +88215 -1.000000 +88216 -1.000000 +88217 -1.000000 +88218 -1.000000 +88219 -1.000000 +88221 -1.000000 +88222 -1.000000 +88223 -1.000000 +88224 -1.000000 +88225 -1.000000 +88226 -1.000000 +88227 -1.000000 +88228 -1.000000 +88229 -1.000000 +88230 -1.000000 +88231 -1.000000 +88232 -1.000000 +88233 -1.000000 +88234 -1.000000 +88235 -1.000000 +88236 -1.000000 +88237 -1.000000 +88240 -1.000000 +88241 -1.000000 +88242 -1.000000 +88243 -1.000000 +88244 -1.000000 +88245 -1.000000 +88246 -1.000000 +88247 -1.000000 +88248 -1.000000 +88249 -1.000000 +88250 -1.000000 +88251 -1.000000 +88252 -1.000000 +88253 -1.000000 +88254 -1.000000 +88255 -1.000000 +88256 -1.000000 +88257 -1.000000 +88259 -1.000000 +88260 -1.000000 +88261 -1.000000 +88262 -1.000000 +88263 -1.000000 +88264 -1.000000 +88265 -1.000000 +88266 -1.000000 +88267 -1.000000 +88268 -1.000000 +88269 -1.000000 +88270 -1.000000 +88271 -1.000000 +88272 -1.000000 +88273 -1.000000 +88274 -1.000000 +88275 -1.000000 +88276 -1.000000 +88277 -1.000000 +88278 -1.000000 +88279 -1.000000 +88280 -1.000000 +88281 -1.000000 +88282 -1.000000 +88283 -1.000000 +88284 -1.000000 +88285 -1.000000 +88286 -1.000000 +88287 -1.000000 +88288 -1.000000 +88289 -1.000000 +88290 -1.000000 +88291 -1.000000 +88292 -1.000000 +88293 -1.000000 +88294 -1.000000 +88295 -1.000000 +88296 -1.000000 +88297 -1.000000 +88298 -1.000000 +88299 -1.000000 +88300 -1.000000 +88301 -1.000000 +88302 -1.000000 +88303 -1.000000 +88304 -1.000000 +88305 -1.000000 +88306 -1.000000 +88307 -1.000000 +88308 -1.000000 +88309 -1.000000 +88310 -1.000000 +88311 -1.000000 +88312 -1.000000 +88313 -1.000000 +88314 -1.000000 +88315 -1.000000 +88316 -1.000000 +88317 -1.000000 +88318 -1.000000 +88319 -1.000000 +88320 -1.000000 +88321 -1.000000 +88322 -1.000000 +88323 -1.000000 +88324 -1.000000 +88325 -1.000000 +88326 -1.000000 +88327 -1.000000 +88328 -1.000000 +88329 -1.000000 +88332 -1.000000 +88333 -1.000000 +88334 -1.000000 +88335 -1.000000 +88336 -1.000000 +88337 -1.000000 +88338 -1.000000 +88339 -1.000000 +88340 -1.000000 +88341 -1.000000 +88342 -1.000000 +88343 -1.000000 +88344 -1.000000 +88345 -1.000000 +88346 -1.000000 +88347 -1.000000 +88348 -1.000000 +88349 -1.000000 +88350 -1.000000 +88351 -1.000000 +88352 -1.000000 +88353 -1.000000 +88354 -1.000000 +88355 -1.000000 +88356 -1.000000 +88357 -1.000000 +88358 -1.000000 +88359 -1.000000 +88360 -1.000000 +88361 -1.000000 +88362 -1.000000 +88363 -1.000000 +88364 -1.000000 +88365 -1.000000 +88366 -1.000000 +88368 -1.000000 +88369 -1.000000 +88370 -1.000000 +88371 -1.000000 +88372 -1.000000 +88373 -1.000000 +88374 -1.000000 +88375 -1.000000 +88376 -1.000000 +88377 -1.000000 +88378 -1.000000 +88379 -1.000000 +88380 -1.000000 +88381 -1.000000 +88382 -1.000000 +88383 -1.000000 +88384 -1.000000 +88385 -1.000000 +88386 -1.000000 +88387 -1.000000 +88388 -1.000000 +88389 -1.000000 +88391 -1.000000 +88392 -1.000000 +88393 -1.000000 +88394 -1.000000 +88395 -1.000000 +88396 -1.000000 +88397 -1.000000 +88398 -1.000000 +88399 -1.000000 +88400 -1.000000 +88401 -1.000000 +88402 -1.000000 +88403 -1.000000 +88404 -1.000000 +88405 -1.000000 +88406 -1.000000 +88407 -1.000000 +88408 -1.000000 +88409 -1.000000 +88410 -1.000000 +88411 -1.000000 +88412 -1.000000 +88413 -1.000000 +88414 -1.000000 +88415 -1.000000 +88416 -1.000000 +88417 -1.000000 +88418 -1.000000 +88419 -1.000000 +88421 -1.000000 +88422 -1.000000 +88423 -1.000000 +88424 -1.000000 +88425 -1.000000 +88426 -1.000000 +88427 -1.000000 +88428 -1.000000 +88429 -1.000000 +88430 -1.000000 +88431 -1.000000 +88432 -1.000000 +88433 -1.000000 +88434 -1.000000 +88435 -1.000000 +88436 -1.000000 +88437 -1.000000 +88438 -1.000000 +88439 -1.000000 +88440 -1.000000 +88441 -1.000000 +88442 -1.000000 +88443 -1.000000 +88444 -1.000000 +88445 -1.000000 +88446 -1.000000 +88447 -1.000000 +88448 -1.000000 +88449 -1.000000 +88450 -1.000000 +88451 -1.000000 +88452 -1.000000 +88453 -1.000000 +88454 -1.000000 +88455 -1.000000 +88456 -1.000000 +88457 -1.000000 +88458 -1.000000 +88459 -1.000000 +88460 -1.000000 +88461 -1.000000 +88462 -1.000000 +88463 -1.000000 +88464 -1.000000 +88465 -1.000000 +88466 -1.000000 +88467 -1.000000 +88468 -1.000000 +88469 -1.000000 +88472 -1.000000 +88473 -1.000000 +88474 -1.000000 +88475 -1.000000 +88476 -1.000000 +88477 -1.000000 +88478 -1.000000 +88479 -1.000000 +88480 -1.000000 +88481 -1.000000 +88482 -1.000000 +88483 -1.000000 +88485 -1.000000 +88486 -1.000000 +88487 -1.000000 +88488 -1.000000 +88489 -1.000000 +88490 -1.000000 +88491 -1.000000 +88493 -1.000000 +88495 -1.000000 +88496 -1.000000 +88497 -1.000000 +88500 -1.000000 +88501 -1.000000 +88502 -1.000000 +88503 -1.000000 +88504 -1.000000 +88505 -1.000000 +88506 -1.000000 +88507 -1.000000 +88508 -1.000000 +88509 -1.000000 +88510 -1.000000 +88512 -1.000000 +88513 -1.000000 +88514 -1.000000 +88515 -1.000000 +88516 -1.000000 +88517 -1.000000 +88518 -1.000000 +88519 -1.000000 +88521 -1.000000 +88524 -1.000000 +88525 -1.000000 +88526 -1.000000 +88527 -1.000000 +88528 -1.000000 +88529 -1.000000 +88530 -1.000000 +88531 -1.000000 +88532 -1.000000 +88533 -1.000000 +88534 -1.000000 +88536 -1.000000 +88537 -1.000000 +88538 -1.000000 +88539 -1.000000 +88540 -1.000000 +88541 -1.000000 +88542 -1.000000 +88543 -1.000000 +88544 -1.000000 +88545 -1.000000 +88546 -1.000000 +88548 -1.000000 +88549 -1.000000 +88551 -1.000000 +88552 -1.000000 +88553 -1.000000 +88554 -1.000000 +88555 -1.000000 +88556 -1.000000 +88557 -1.000000 +88558 -1.000000 +88559 -1.000000 +88560 -1.000000 +88561 -1.000000 +88562 -1.000000 +88563 -1.000000 +88564 -1.000000 +88565 -1.000000 +88566 -1.000000 +88567 -1.000000 +88568 -1.000000 +88569 -1.000000 +88570 -1.000000 +88571 -1.000000 +88572 -1.000000 +88573 -1.000000 +88574 -1.000000 +88575 -1.000000 +88576 -1.000000 +88578 -1.000000 +88579 -1.000000 +88580 -1.000000 +88581 -1.000000 +88582 -1.000000 +88583 -1.000000 +88584 -1.000000 +88585 -1.000000 +88586 -1.000000 +88587 -1.000000 +88588 -1.000000 +88589 -1.000000 +88590 -1.000000 +88591 -1.000000 +88592 -1.000000 +88593 -1.000000 +88594 -1.000000 +88595 -1.000000 +88596 -1.000000 +88597 -1.000000 +88598 -1.000000 +88599 -1.000000 +88600 -1.000000 +88601 -1.000000 +88602 -1.000000 +88603 -1.000000 +88604 -1.000000 +88605 -1.000000 +88606 -1.000000 +88607 -1.000000 +88608 -1.000000 +88609 -1.000000 +88611 -1.000000 +88612 -1.000000 +88614 -1.000000 +88615 -1.000000 +88616 -1.000000 +88617 -1.000000 +88618 -1.000000 +88619 -1.000000 +88620 -1.000000 +88621 -1.000000 +88622 -1.000000 +88623 -1.000000 +88624 -1.000000 +88625 -1.000000 +88626 -1.000000 +88628 -1.000000 +88629 -1.000000 +88630 -1.000000 +88631 -1.000000 +88633 -1.000000 +88634 -1.000000 +88635 -1.000000 +88636 -1.000000 +88637 -1.000000 +88638 -1.000000 +88639 -1.000000 +88640 -1.000000 +88641 -1.000000 +88642 -1.000000 +88643 -1.000000 +88644 -1.000000 +88645 -1.000000 +88646 -1.000000 +88647 -1.000000 +88648 -1.000000 +88649 -1.000000 +88650 -1.000000 +88651 -1.000000 +88652 -1.000000 +88653 -1.000000 +88654 -1.000000 +88656 -1.000000 +88657 -1.000000 +88658 -1.000000 +88659 -1.000000 +88660 -1.000000 +88661 -1.000000 +88662 -1.000000 +88663 -1.000000 +88665 -1.000000 +88666 -1.000000 +88669 -1.000000 +88670 -1.000000 +88671 -1.000000 +88672 -1.000000 +88673 -1.000000 +88674 -1.000000 +88675 -1.000000 +88676 -1.000000 +88677 -1.000000 +88679 -1.000000 +88680 -1.000000 +88681 -1.000000 +88682 -1.000000 +88685 -1.000000 +88686 -1.000000 +88688 -1.000000 +88689 -1.000000 +88690 -1.000000 +88691 -1.000000 +88693 -1.000000 +88695 -1.000000 +88697 -1.000000 +88699 -1.000000 +88701 -1.000000 +88705 -1.000000 +88706 -1.000000 +88707 -1.000000 +88708 -1.000000 +88712 -1.000000 +88713 -1.000000 +88714 -1.000000 +88715 -1.000000 +88716 -1.000000 +88717 -1.000000 +88718 -1.000000 +88719 -1.000000 +88720 -1.000000 +88721 -1.000000 +88722 -1.000000 +88723 -1.000000 +88724 -1.000000 +88725 -1.000000 +88726 -1.000000 +88727 -1.000000 +88728 -1.000000 +88729 -1.000000 +88730 -1.000000 +88731 -1.000000 +88732 -1.000000 +88734 -1.000000 +88735 -1.000000 +88737 -1.000000 +88738 -1.000000 +88739 -1.000000 +88740 -1.000000 +88741 -1.000000 +88742 -1.000000 +88743 -1.000000 +88744 -1.000000 +88746 -1.000000 +88748 -1.000000 +88749 -1.000000 +88750 -1.000000 +88752 -1.000000 +88753 -1.000000 +88754 -1.000000 +88755 -1.000000 +88756 -1.000000 +88757 -1.000000 +88758 -1.000000 +88759 -1.000000 +88760 -1.000000 +88761 -1.000000 +88762 -1.000000 +88763 -1.000000 +88764 -1.000000 +88765 -1.000000 +88766 -1.000000 +88767 -1.000000 +88768 -1.000000 +88769 -1.000000 +88770 -1.000000 +88771 -1.000000 +88772 -1.000000 +88773 -1.000000 +88774 -1.000000 +88775 -1.000000 +88776 -1.000000 +88777 -1.000000 +88778 -1.000000 +88779 -1.000000 +88780 -1.000000 +88781 -1.000000 +88782 -1.000000 +88783 -1.000000 +88784 -1.000000 +88785 -1.000000 +88786 -1.000000 +88787 -1.000000 +88788 -1.000000 +88789 -1.000000 +88790 -1.000000 +88791 -1.000000 +88792 -1.000000 +88793 -1.000000 +88794 -1.000000 +88795 -1.000000 +88796 -1.000000 +88797 -1.000000 +88798 -1.000000 +88799 -1.000000 +88800 -1.000000 +88801 -1.000000 +88802 -1.000000 +88803 -1.000000 +88804 -1.000000 +88805 -1.000000 +88806 -1.000000 +88807 -1.000000 +88808 -1.000000 +88809 -1.000000 +88810 -1.000000 +88811 -1.000000 +88812 -1.000000 +88814 -1.000000 +88815 -1.000000 +88816 -1.000000 +88817 -1.000000 +88818 -1.000000 +88819 -1.000000 +88820 -1.000000 +88821 -1.000000 +88822 -1.000000 +88823 -1.000000 +88824 -1.000000 +88826 -1.000000 +88827 -1.000000 +88828 -1.000000 +88829 -1.000000 +88830 -1.000000 +88831 -1.000000 +88832 -1.000000 +88833 -1.000000 +88834 -1.000000 +88835 -1.000000 +88836 -1.000000 +88837 -1.000000 +88838 -1.000000 +88839 -1.000000 +88840 -1.000000 +88841 -1.000000 +88842 -1.000000 +88843 -1.000000 +88844 -1.000000 +88845 -1.000000 +88847 -1.000000 +88848 -1.000000 +88850 -1.000000 +88851 -1.000000 +88852 -1.000000 +88853 -1.000000 +88854 -1.000000 +88855 -1.000000 +88856 -1.000000 +88858 -1.000000 +88859 -1.000000 +88860 -1.000000 +88861 -1.000000 +88862 -1.000000 +88863 -1.000000 +88864 -1.000000 +88865 -1.000000 +88866 -1.000000 +88867 -1.000000 +88868 -1.000000 +88869 -1.000000 +88870 -1.000000 +88871 -1.000000 +88872 -1.000000 +88873 -1.000000 +88874 -1.000000 +88876 -1.000000 +88877 -1.000000 +88881 -1.000000 +88882 -1.000000 +88883 -1.000000 +88884 -1.000000 +88889 -1.000000 +88890 -1.000000 +88891 -1.000000 +88892 -1.000000 +88893 -1.000000 +88895 -1.000000 +88896 -1.000000 +88897 -1.000000 +88898 -1.000000 +88899 -1.000000 +88900 -1.000000 +88901 -1.000000 +88902 -1.000000 +88903 -1.000000 +88904 -1.000000 +88905 -1.000000 +88906 -1.000000 +88907 -1.000000 +88909 -1.000000 +88910 -1.000000 +88911 -1.000000 +88912 -1.000000 +88913 -1.000000 +88914 -1.000000 +88915 -1.000000 +88916 -1.000000 +88917 -1.000000 +88918 -1.000000 +88919 -1.000000 +88920 -1.000000 +88921 -1.000000 +88922 -1.000000 +88923 -1.000000 +88924 -1.000000 +88925 -1.000000 +88926 -1.000000 +88927 -1.000000 +88928 -1.000000 +88929 -1.000000 +88930 -1.000000 +88931 -1.000000 +88932 -1.000000 +88933 -1.000000 +88934 -1.000000 +88935 -1.000000 +88936 -1.000000 +88937 -1.000000 +88938 -1.000000 +88939 -1.000000 +88940 -1.000000 +88941 -1.000000 +88942 -1.000000 +88943 -1.000000 +88944 -1.000000 +88945 -1.000000 +88946 -1.000000 +88947 -1.000000 +88948 -1.000000 +88949 -1.000000 +88950 -1.000000 +88951 -1.000000 +88952 -1.000000 +88953 -1.000000 +88954 -1.000000 +88955 -1.000000 +88956 -1.000000 +88957 -1.000000 +88958 -1.000000 +88959 -1.000000 +88960 -1.000000 +88961 -1.000000 +88962 -1.000000 +88963 -1.000000 +88964 -1.000000 +88965 -1.000000 +88966 -1.000000 +88967 -1.000000 +88968 -1.000000 +88969 -1.000000 +88970 -1.000000 +88972 -1.000000 +88973 -1.000000 +88974 -1.000000 +88975 -1.000000 +88976 -1.000000 +88977 -1.000000 +88978 -1.000000 +88979 -1.000000 +88980 -1.000000 +88981 -1.000000 +88982 -1.000000 +88983 -1.000000 +88984 -1.000000 +88985 -1.000000 +88986 -1.000000 +88987 -1.000000 +88988 -1.000000 +88989 -1.000000 +88992 -1.000000 +88993 -1.000000 +88995 -1.000000 +88996 -1.000000 +88997 -1.000000 +88998 -1.000000 +88999 -1.000000 +89000 -1.000000 +89001 -1.000000 +89002 -1.000000 +89003 -1.000000 +89004 -1.000000 +89005 -1.000000 +89006 -1.000000 +89007 -1.000000 +89008 -1.000000 +89012 -1.000000 +89014 -1.000000 +89018 -1.000000 +89019 -1.000000 +89020 -1.000000 +89021 -1.000000 +89022 -1.000000 +89023 -1.000000 +89024 -1.000000 +89025 -1.000000 +89026 -1.000000 +89027 -1.000000 +89028 -1.000000 +89029 -1.000000 +89030 -1.000000 +89031 -1.000000 +89032 -1.000000 +89033 -1.000000 +89034 -1.000000 +89035 -1.000000 +89036 -1.000000 +89037 -1.000000 +89038 -1.000000 +89039 -1.000000 +89040 -1.000000 +89042 -1.000000 +89043 -1.000000 +89044 -1.000000 +89045 -1.000000 +89046 -1.000000 +89047 -1.000000 +89048 -1.000000 +89049 -1.000000 +89050 -1.000000 +89052 -1.000000 +89054 -1.000000 +89055 -1.000000 +89056 -1.000000 +89057 -1.000000 +89058 -1.000000 +89059 -1.000000 +89060 -1.000000 +89061 -1.000000 +89062 -1.000000 +89063 -1.000000 +89066 -1.000000 +89067 -1.000000 +89072 -1.000000 +89073 -1.000000 +89074 -1.000000 +89078 -1.000000 +89079 -1.000000 +89080 -1.000000 +89081 -1.000000 +89082 -1.000000 +89085 -1.000000 +89086 -1.000000 +89087 -1.000000 +89089 -1.000000 +89090 -1.000000 +89091 -1.000000 +89092 -1.000000 +89093 -1.000000 +89094 -1.000000 +89095 -1.000000 +89096 -1.000000 +89097 -1.000000 +89098 -1.000000 +89099 -1.000000 +89100 -1.000000 +89101 -1.000000 +89102 -1.000000 +89103 -1.000000 +89104 -1.000000 +89105 -1.000000 +89106 -1.000000 +89107 -1.000000 +89109 -1.000000 +89110 -1.000000 +89113 -1.000000 +89114 -1.000000 +89115 -1.000000 +89116 -1.000000 +89117 -1.000000 +89118 -1.000000 +89119 -1.000000 +89120 -1.000000 +89121 -1.000000 +89122 -1.000000 +89123 -1.000000 +89124 -1.000000 +89125 -1.000000 +89126 -1.000000 +89128 -1.000000 +89129 -1.000000 +89131 -1.000000 +89132 -1.000000 +89133 -1.000000 +89134 -1.000000 +89135 -1.000000 +89136 -1.000000 +89137 -1.000000 +89138 -1.000000 +89139 -1.000000 +89140 -1.000000 +89141 -1.000000 +89143 -1.000000 +89144 -1.000000 +89145 -1.000000 +89146 -1.000000 +89147 -1.000000 +89148 -1.000000 +89150 -1.000000 +89151 -1.000000 +89152 -1.000000 +89153 -1.000000 +89154 -1.000000 +89155 -1.000000 +89156 -1.000000 +89157 -1.000000 +89158 -1.000000 +89159 -1.000000 +89161 -1.000000 +89162 -1.000000 +89163 -1.000000 +89164 -1.000000 +89165 -1.000000 +89166 -1.000000 +89167 -1.000000 +89168 -1.000000 +89169 -1.000000 +89170 -1.000000 +89171 -1.000000 +89173 -1.000000 +89175 -1.000000 +89176 -1.000000 +89177 -1.000000 +89178 -1.000000 +89179 -1.000000 +89181 -1.000000 +89184 -1.000000 +89188 -1.000000 +89189 -1.000000 +89190 -1.000000 +89193 -1.000000 +89196 -1.000000 +89197 -1.000000 +89198 -1.000000 +89199 -1.000000 +89200 -1.000000 +89201 -1.000000 +89202 -1.000000 +89203 -1.000000 +89204 -1.000000 +89205 -1.000000 +89206 -1.000000 +89207 -1.000000 +89208 -1.000000 +89209 -1.000000 +89215 -1.000000 +89216 -1.000000 +89217 -1.000000 +89218 -1.000000 +89220 -1.000000 +89221 -1.000000 +89222 -1.000000 +89224 -1.000000 +89225 -1.000000 +89227 -1.000000 +89228 -1.000000 +89229 -1.000000 +89230 -1.000000 +89231 -1.000000 +89232 -1.000000 +89233 -1.000000 +89234 -1.000000 +89235 -1.000000 +89236 -1.000000 +89237 -1.000000 +89238 -1.000000 +89240 -1.000000 +89241 -1.000000 +89242 -1.000000 +89243 -1.000000 +89244 -1.000000 +89246 -1.000000 +89249 -1.000000 +89250 -1.000000 +89251 -1.000000 +89252 -1.000000 +89253 -1.000000 +89254 -1.000000 +89255 -1.000000 +89256 -1.000000 +89257 -1.000000 +89259 -1.000000 +89260 -1.000000 +89263 -1.000000 +89264 -1.000000 +89266 -1.000000 +89267 -1.000000 +89268 -1.000000 +89269 -1.000000 +89270 -1.000000 +89271 -1.000000 +89272 -1.000000 +89273 -1.000000 +89276 -1.000000 +89277 -1.000000 +89278 -1.000000 +89279 -1.000000 +89280 -1.000000 +89281 -1.000000 +89282 -1.000000 +89283 -1.000000 +89284 -1.000000 +89285 -1.000000 +89286 -1.000000 +89287 -1.000000 +89289 -1.000000 +89290 -1.000000 +89292 -1.000000 +89293 -1.000000 +89294 -1.000000 +89295 -1.000000 +89296 -1.000000 +89297 -1.000000 +89298 -1.000000 +89299 -1.000000 +89300 -1.000000 +89301 -1.000000 +89302 -1.000000 +89303 -1.000000 +89304 -1.000000 +89305 -1.000000 +89306 -1.000000 +89307 -1.000000 +89308 -1.000000 +89309 -1.000000 +89310 -1.000000 +89311 -1.000000 +89312 -1.000000 +89313 -1.000000 +89314 -1.000000 +89315 -1.000000 +89316 -1.000000 +89318 -1.000000 +89322 -1.000000 +89323 -1.000000 +89324 -1.000000 +89326 -1.000000 +89327 -1.000000 +89328 -1.000000 +89329 -1.000000 +89330 -1.000000 +89331 -1.000000 +89332 -1.000000 +89334 -1.000000 +89335 -1.000000 +89336 -1.000000 +89337 -1.000000 +89339 -1.000000 +89341 -1.000000 +89342 -1.000000 +89343 -1.000000 +89344 -1.000000 +89345 -1.000000 +89346 -1.000000 +89347 -1.000000 +89348 -1.000000 +89349 -1.000000 +89350 -1.000000 +89351 -1.000000 +89352 -1.000000 +89353 -1.000000 +89354 -1.000000 +89355 -1.000000 +89356 -1.000000 +89357 -1.000000 +89358 -1.000000 +89359 -1.000000 +89360 -1.000000 +89361 -1.000000 +89362 -1.000000 +89363 -1.000000 +89364 -1.000000 +89365 -1.000000 +89367 -1.000000 +89368 -1.000000 +89369 -1.000000 +89370 -1.000000 +89372 -1.000000 +89374 -1.000000 +89375 -1.000000 +89376 -1.000000 +89377 -1.000000 +89378 -1.000000 +89379 -1.000000 +89380 -1.000000 +89381 -1.000000 +89382 -1.000000 +89383 -1.000000 +89384 -1.000000 +89385 -1.000000 +89386 -1.000000 +89387 -1.000000 +89388 -1.000000 +89389 -1.000000 +89391 -1.000000 +89392 -1.000000 +89393 -1.000000 +89394 -1.000000 +89395 -1.000000 +89396 -1.000000 +89397 -1.000000 +89398 -1.000000 +89399 -1.000000 +89400 -1.000000 +89401 -1.000000 +89402 -1.000000 +89403 -1.000000 +89404 -1.000000 +89405 -1.000000 +89406 -1.000000 +89407 -1.000000 +89408 -1.000000 +89409 -1.000000 +89410 -1.000000 +89411 -1.000000 +89412 -1.000000 +89413 -1.000000 +89414 -1.000000 +89415 -1.000000 +89416 -1.000000 +89417 -1.000000 +89419 -1.000000 +89423 -1.000000 +89424 -1.000000 +89426 -1.000000 +89427 -1.000000 +89428 -1.000000 +89433 -1.000000 +89435 -1.000000 +89442 -1.000000 +89443 -1.000000 +89444 -1.000000 +89445 -1.000000 +89446 -1.000000 +89447 -1.000000 +89449 -1.000000 +89452 -1.000000 +89454 -1.000000 +89455 -1.000000 +89459 -1.000000 +89460 -1.000000 +89461 -1.000000 +89462 -1.000000 +89464 -1.000000 +89465 -1.000000 +89467 -1.000000 +89468 -1.000000 +89469 -1.000000 +89471 -1.000000 +89473 -1.000000 +89474 -1.000000 +89475 -1.000000 +89476 -1.000000 +89477 -1.000000 +89478 -1.000000 +89479 -1.000000 +89480 -1.000000 +89481 -1.000000 +89482 -1.000000 +89483 -1.000000 +89484 -1.000000 +89485 -1.000000 +89486 -1.000000 +89487 -1.000000 +89488 -1.000000 +89489 -1.000000 +89490 -1.000000 +89491 -1.000000 +89492 -1.000000 +89493 -1.000000 +89494 -1.000000 +89495 -1.000000 +89496 -1.000000 +89497 -1.000000 +89498 -1.000000 +89499 -1.000000 +89500 -1.000000 +89501 -1.000000 +89502 -1.000000 +89503 -1.000000 +89504 -1.000000 +89505 -1.000000 +89506 -1.000000 +89507 -1.000000 +89508 -1.000000 +89509 -1.000000 +89510 -1.000000 +89511 -1.000000 +89512 -1.000000 +89513 -1.000000 +89514 -1.000000 +89516 -1.000000 +89517 -1.000000 +89518 -1.000000 +89520 -1.000000 +89521 -1.000000 +89522 -1.000000 +89523 -1.000000 +89524 -1.000000 +89525 -1.000000 +89526 -1.000000 +89527 -1.000000 +89528 -1.000000 +89529 -1.000000 +89530 -1.000000 +89531 -1.000000 +89532 -1.000000 +89533 -1.000000 +89534 -1.000000 +89535 -1.000000 +89536 -1.000000 +89537 -1.000000 +89538 -1.000000 +89539 -1.000000 +89540 -1.000000 +89541 -1.000000 +89542 -1.000000 +89543 -1.000000 +89544 -1.000000 +89545 -1.000000 +89546 -1.000000 +89547 -1.000000 +89548 -1.000000 +89549 -1.000000 +89550 -1.000000 +89551 -1.000000 +89552 -1.000000 +89553 -1.000000 +89554 -1.000000 +89555 -1.000000 +89556 -1.000000 +89557 -1.000000 +89558 -1.000000 +89559 -1.000000 +89560 -1.000000 +89561 -1.000000 +89562 -1.000000 +89563 -1.000000 +89564 -1.000000 +89565 -1.000000 +89566 -1.000000 +89567 -1.000000 +89568 -1.000000 +89569 -1.000000 +89570 -1.000000 +89571 -1.000000 +89572 -1.000000 +89573 -1.000000 +89574 -1.000000 +89575 -1.000000 +89576 -1.000000 +89577 -1.000000 +89578 -1.000000 +89579 -1.000000 +89580 -1.000000 +89581 -1.000000 +89582 -1.000000 +89583 -1.000000 +89584 -1.000000 +89585 -1.000000 +89586 -1.000000 +89587 -1.000000 +89588 -1.000000 +89589 -1.000000 +89590 -1.000000 +89591 -1.000000 +89592 -1.000000 +89593 -1.000000 +89594 -1.000000 +89595 -1.000000 +89597 -1.000000 +89598 -1.000000 +89599 -1.000000 +89601 -1.000000 +89602 -1.000000 +89605 -1.000000 +89606 -1.000000 +89608 -1.000000 +89609 -1.000000 +89611 -1.000000 +89612 -1.000000 +89613 -1.000000 +89614 -1.000000 +89616 -1.000000 +89617 -1.000000 +89618 -1.000000 +89619 -1.000000 +89620 -1.000000 +89621 -1.000000 +89622 -1.000000 +89623 -1.000000 +89624 -1.000000 +89625 -1.000000 +89626 -1.000000 +89627 -1.000000 +89628 -1.000000 +89629 -1.000000 +89630 -1.000000 +89632 -1.000000 +89633 -1.000000 +89634 -1.000000 +89636 -1.000000 +89637 -1.000000 +89638 -1.000000 +89639 -1.000000 +89641 -1.000000 +89642 -1.000000 +89643 -1.000000 +89644 -1.000000 +89645 -1.000000 +89646 -1.000000 +89647 -1.000000 +89648 -1.000000 +89649 -1.000000 +89650 -1.000000 +89651 -1.000000 +89652 -1.000000 +89653 -1.000000 +89654 -1.000000 +89655 -1.000000 +89656 -1.000000 +89658 -1.000000 +89661 -1.000000 +89662 -1.000000 +89663 -1.000000 +89664 -1.000000 +89665 -1.000000 +89666 -1.000000 +89669 -1.000000 +89670 -1.000000 +89671 -1.000000 +89672 -1.000000 +89673 -1.000000 +89674 -1.000000 +89675 -1.000000 +89676 -1.000000 +89677 -1.000000 +89678 -1.000000 +89679 -1.000000 +89680 -1.000000 +89681 -1.000000 +89682 -1.000000 +89683 -1.000000 +89684 -1.000000 +89685 -1.000000 +89686 -1.000000 +89687 -1.000000 +89688 -1.000000 +89689 -1.000000 +89690 -1.000000 +89691 -1.000000 +89692 -1.000000 +89693 -1.000000 +89694 -1.000000 +89695 -1.000000 +89696 -1.000000 +89697 -1.000000 +89698 -1.000000 +89699 -1.000000 +89700 -1.000000 +89701 -1.000000 +89702 -1.000000 +89703 -1.000000 +89704 -1.000000 +89705 -1.000000 +89707 -1.000000 +89708 -1.000000 +89709 -1.000000 +89710 -1.000000 +89711 -1.000000 +89712 -1.000000 +89713 -1.000000 +89714 -1.000000 +89715 -1.000000 +89716 -1.000000 +89717 -1.000000 +89718 -1.000000 +89719 -1.000000 +89720 -1.000000 +89721 -1.000000 +89722 -1.000000 +89723 -1.000000 +89724 -1.000000 +89725 -1.000000 +89726 -1.000000 +89727 -1.000000 +89728 -1.000000 +89729 -1.000000 +89730 -1.000000 +89731 -1.000000 +89732 -1.000000 +89734 -1.000000 +89735 -1.000000 +89736 -1.000000 +89737 -1.000000 +89738 -1.000000 +89739 -1.000000 +89740 -1.000000 +89741 -1.000000 +89742 -1.000000 +89743 -1.000000 +89746 -1.000000 +89747 -1.000000 +89748 -1.000000 +89749 -1.000000 +89750 -1.000000 +89751 -1.000000 +89752 -1.000000 +89754 -1.000000 +89756 -1.000000 +89757 -1.000000 +89758 -1.000000 +89759 -1.000000 +89767 -1.000000 +89775 -1.000000 +89776 -1.000000 +89777 -1.000000 +89778 -1.000000 +89779 -1.000000 +89781 -1.000000 +89783 -1.000000 +89784 -1.000000 +89786 -1.000000 +89787 -1.000000 +89788 -1.000000 +89789 -1.000000 +89790 -1.000000 +89791 -1.000000 +89792 -1.000000 +89793 -1.000000 +89794 -1.000000 +89807 -1.000000 +89808 -1.000000 +89809 -1.000000 +89810 -1.000000 +89811 -1.000000 +89812 -1.000000 +89813 -1.000000 +89814 -1.000000 +89815 -1.000000 +89818 -1.000000 +89819 -1.000000 +89820 -1.000000 +89821 -1.000000 +89822 -1.000000 +89823 -1.000000 +89824 -1.000000 +89825 -1.000000 +89826 -1.000000 +89827 -1.000000 +89828 -1.000000 +89829 -1.000000 +89830 -1.000000 +89831 -1.000000 +89832 -1.000000 +89833 -1.000000 +89834 -1.000000 +89835 -1.000000 +89836 -1.000000 +89837 -1.000000 +89838 -1.000000 +89839 -1.000000 +89840 -1.000000 +89841 -1.000000 +89842 -1.000000 +89844 -1.000000 +89845 -1.000000 +89846 -1.000000 +89847 -1.000000 +89848 -1.000000 +89849 -1.000000 +89850 -1.000000 +89851 -1.000000 +89852 -1.000000 +89853 -1.000000 +89854 -1.000000 +89855 -1.000000 +89856 -1.000000 +89857 -1.000000 +89858 -1.000000 +89859 -1.000000 +89860 -1.000000 +89861 -1.000000 +89862 -1.000000 +89863 -1.000000 +89865 -1.000000 +89866 -1.000000 +89867 -1.000000 +89868 -1.000000 +89869 -1.000000 +89871 -1.000000 +89872 -1.000000 +89873 -1.000000 +89874 -1.000000 +89875 -1.000000 +89876 -1.000000 +89877 -1.000000 +89878 -1.000000 +89879 -1.000000 +89880 -1.000000 +89881 -1.000000 +89882 -1.000000 +89883 -1.000000 +89884 -1.000000 +89886 -1.000000 +89887 -1.000000 +89888 -1.000000 +89889 -1.000000 +89890 -1.000000 +89891 -1.000000 +89893 -1.000000 +89894 -1.000000 +89895 -1.000000 +89896 -1.000000 +89897 -1.000000 +89898 -1.000000 +89899 -1.000000 +89900 -1.000000 +89901 -1.000000 +89902 -1.000000 +89903 -1.000000 +89905 -1.000000 +89906 -1.000000 +89907 -1.000000 +89908 -1.000000 +89909 -1.000000 +89910 -1.000000 +89911 -1.000000 +89912 -1.000000 +89913 -1.000000 +89914 -1.000000 +89916 -1.000000 +89917 -1.000000 +89918 -1.000000 +89919 -1.000000 +89920 -1.000000 +89921 -1.000000 +89922 -1.000000 +89923 -1.000000 +89924 -1.000000 +89925 -1.000000 +89926 -1.000000 +89927 -1.000000 +89928 -1.000000 +89929 -1.000000 +89930 -1.000000 +89931 -1.000000 +89932 -1.000000 +89933 -1.000000 +89934 -1.000000 +89935 -1.000000 +89936 -1.000000 +89937 -1.000000 +89938 -1.000000 +89939 -1.000000 +89940 -1.000000 +89941 -1.000000 +89942 -1.000000 +89943 -1.000000 +89944 -1.000000 +89945 -1.000000 +89946 -1.000000 +89947 -1.000000 +89948 -1.000000 +89949 -1.000000 +89951 -1.000000 +89952 -1.000000 +89953 -1.000000 +89954 -1.000000 +89955 -1.000000 +89956 -1.000000 +89957 -1.000000 +89958 -1.000000 +89959 -1.000000 +89960 -1.000000 +89961 -1.000000 +89962 -1.000000 +89963 -1.000000 +89964 -1.000000 +89965 -1.000000 +89966 -1.000000 +89967 -1.000000 +89968 -1.000000 +89969 -1.000000 +89970 -1.000000 +89971 -1.000000 +89972 -1.000000 +89973 -1.000000 +89974 -1.000000 +89975 -1.000000 +89976 -1.000000 +89977 -1.000000 +89978 -1.000000 +89979 -1.000000 +89980 -1.000000 +89981 -1.000000 +89982 -1.000000 +89983 -1.000000 +89984 -1.000000 +89985 -1.000000 +89986 -1.000000 +89987 -1.000000 +89988 -1.000000 +89989 -1.000000 +89990 -1.000000 +89991 -1.000000 +89992 -1.000000 +89993 -1.000000 +89994 -1.000000 +89995 -1.000000 +89996 -1.000000 +89997 -1.000000 +89999 -1.000000 +90000 -1.000000 +90001 -1.000000 +90002 -1.000000 +90003 -1.000000 +90004 -1.000000 +90005 -1.000000 +90006 -1.000000 +90007 -1.000000 +90008 -1.000000 +90009 -1.000000 +90010 -1.000000 +90011 -1.000000 +90012 -1.000000 +90013 -1.000000 +90014 -1.000000 +90015 -1.000000 +90016 -1.000000 +90017 -1.000000 +90018 -1.000000 +90019 -1.000000 +90020 -1.000000 +90021 -1.000000 +90022 -1.000000 +90023 -1.000000 +90024 -1.000000 +90025 -1.000000 +90026 -1.000000 +90027 -1.000000 +90028 -1.000000 +90029 -1.000000 +90030 -1.000000 +90032 -1.000000 +90033 -1.000000 +90034 -1.000000 +90035 -1.000000 +90036 -1.000000 +90038 -1.000000 +90039 -1.000000 +90040 -1.000000 +90041 -1.000000 +90042 -1.000000 +90043 -1.000000 +90044 -1.000000 +90045 -1.000000 +90046 -1.000000 +90050 -1.000000 +90051 -1.000000 +90052 -1.000000 +90053 -1.000000 +90054 -1.000000 +90055 -1.000000 +90056 -1.000000 +90057 -1.000000 +90058 -1.000000 +90059 -1.000000 +90060 -1.000000 +90061 -1.000000 +90062 -1.000000 +90063 -1.000000 +90064 -1.000000 +90065 -1.000000 +90066 -1.000000 +90067 -1.000000 +90068 -1.000000 +90069 -1.000000 +90070 -1.000000 +90071 -1.000000 +90072 -1.000000 +90073 -1.000000 +90074 -1.000000 +90075 -1.000000 +90076 -1.000000 +90077 -1.000000 +90078 -1.000000 +90079 -1.000000 +90080 -1.000000 +90081 -1.000000 +90082 -1.000000 +90083 -1.000000 +90084 -1.000000 +90085 -1.000000 +90086 -1.000000 +90087 -1.000000 +90088 -1.000000 +90089 -1.000000 +90090 -1.000000 +90091 -1.000000 +90092 -1.000000 +90093 -1.000000 +90094 -1.000000 +90095 -1.000000 +90096 -1.000000 +90097 -1.000000 +90098 -1.000000 +90099 -1.000000 +90102 -1.000000 +90103 -1.000000 +90104 -1.000000 +90105 -1.000000 +90106 -1.000000 +90107 -1.000000 +90108 -1.000000 +90109 -1.000000 +90110 -1.000000 +90111 -1.000000 +90113 -1.000000 +90115 -1.000000 +90116 -1.000000 +90117 -1.000000 +90118 -1.000000 +90119 -1.000000 +90120 -1.000000 +90127 -1.000000 +90128 -1.000000 +90130 -1.000000 +90131 -1.000000 +90132 -1.000000 +90133 -1.000000 +90134 -1.000000 +90135 -1.000000 +90136 -1.000000 +90137 -1.000000 +90139 -1.000000 +90140 -1.000000 +90141 -1.000000 +90142 -1.000000 +90143 -1.000000 +90144 -1.000000 +90145 -1.000000 +90146 -1.000000 +90147 -1.000000 +90148 -1.000000 +90149 -1.000000 +90151 -1.000000 +90152 -1.000000 +90154 -1.000000 +90155 -1.000000 +90156 -1.000000 +90157 -1.000000 +90158 -1.000000 +90159 -1.000000 +90160 -1.000000 +90161 -1.000000 +90163 -1.000000 +90165 -1.000000 +90166 -1.000000 +90167 -1.000000 +90168 -1.000000 +90169 -1.000000 +90170 -1.000000 +90171 -1.000000 +90172 -1.000000 +90173 -1.000000 +90174 -1.000000 +90175 -1.000000 +90176 -1.000000 +90177 -1.000000 +90178 -1.000000 +90179 -1.000000 +90180 -1.000000 +90181 -1.000000 +90182 -1.000000 +90183 -1.000000 +90184 -1.000000 +90185 -1.000000 +90186 -1.000000 +90187 -1.000000 +90189 -1.000000 +90190 -1.000000 +90192 -1.000000 +90193 -1.000000 +90194 -1.000000 +90195 -1.000000 +90196 -1.000000 +90197 -1.000000 +90198 -1.000000 +90199 -1.000000 +90200 -1.000000 +90201 -1.000000 +90202 -1.000000 +90203 -1.000000 +90204 -1.000000 +90205 -1.000000 +90206 -1.000000 +90207 -1.000000 +90208 -1.000000 +90209 -1.000000 +90211 -1.000000 +90212 -1.000000 +90213 -1.000000 +90214 -1.000000 +90215 -1.000000 +90216 -1.000000 +90217 -1.000000 +90220 -1.000000 +90221 -1.000000 +90222 -1.000000 +90223 -1.000000 +90224 -1.000000 +90227 -1.000000 +90228 -1.000000 +90229 -1.000000 +90230 -1.000000 +90231 -1.000000 +90232 -1.000000 +90233 -1.000000 +90234 -1.000000 +90235 -1.000000 +90236 -1.000000 +90237 -1.000000 +90238 -1.000000 +90239 -1.000000 +90240 -1.000000 +90241 -1.000000 +90242 -1.000000 +90243 -1.000000 +90244 -1.000000 +90245 -1.000000 +90247 -1.000000 +90248 -1.000000 +90249 -1.000000 +90251 -1.000000 +90255 -1.000000 +90256 -1.000000 +90257 -1.000000 +90258 -1.000000 +90259 -1.000000 +90260 -1.000000 +90261 -1.000000 +90262 -1.000000 +90263 -1.000000 +90264 -1.000000 +90265 -1.000000 +90266 -1.000000 +90267 -1.000000 +90270 -1.000000 +90271 -1.000000 +90272 -1.000000 +90273 -1.000000 +90274 -1.000000 +90275 -1.000000 +90277 -1.000000 +90278 -1.000000 +90279 -1.000000 +90280 -1.000000 +90282 -1.000000 +90283 -1.000000 +90284 -1.000000 +90285 -1.000000 +90286 -1.000000 +90287 -1.000000 +90288 -1.000000 +90289 -1.000000 +90291 -1.000000 +90292 -1.000000 +90293 -1.000000 +90294 -1.000000 +90295 -1.000000 +90296 -1.000000 +90297 -1.000000 +90298 -1.000000 +90308 -1.000000 +90313 -1.000000 +90314 -1.000000 +90315 -1.000000 +90316 -1.000000 +90317 -1.000000 +90318 -1.000000 +90321 -1.000000 +90323 -1.000000 +90324 -1.000000 +90325 -1.000000 +90326 -1.000000 +90327 -1.000000 +90328 -1.000000 +90329 -1.000000 +90331 -1.000000 +90332 -1.000000 +90338 -1.000000 +90339 -1.000000 +90340 -1.000000 +90341 -1.000000 +90342 -1.000000 +90343 -1.000000 +90344 -1.000000 +90345 -1.000000 +90348 -1.000000 +90349 -1.000000 +90350 -1.000000 +90351 -1.000000 +90352 -1.000000 +90353 -1.000000 +90354 -1.000000 +90355 -1.000000 +90356 -1.000000 +90360 -1.000000 +90361 -1.000000 +90363 -1.000000 +90364 -1.000000 +90365 -1.000000 +90366 -1.000000 +90372 -1.000000 +90373 -1.000000 +90374 -1.000000 +90375 -1.000000 +90376 -1.000000 +90377 -1.000000 +90379 -1.000000 +90380 -1.000000 +90381 -1.000000 +90382 -1.000000 +90383 -1.000000 +90385 -1.000000 +90398 -1.000000 +90399 -1.000000 +90400 -1.000000 +90401 -1.000000 +90402 -1.000000 +90403 -1.000000 +90405 -1.000000 +90406 -1.000000 +90407 -1.000000 +90408 -1.000000 +90409 -1.000000 +90410 -1.000000 +90411 -1.000000 +90413 -1.000000 +90414 -1.000000 +90415 -1.000000 +90416 -1.000000 +90417 -1.000000 +90418 -1.000000 +90419 -1.000000 +90421 -1.000000 +90422 -1.000000 +90423 -1.000000 +90424 -1.000000 +90425 -1.000000 +90426 -1.000000 +90427 -1.000000 +90428 -1.000000 +90429 -1.000000 +90430 -1.000000 +90431 -1.000000 +90432 -1.000000 +90435 -1.000000 +90436 -1.000000 +90437 -1.000000 +90438 -1.000000 +90439 -1.000000 +90440 -1.000000 +90441 -1.000000 +90442 -1.000000 +90443 -1.000000 +90446 -1.000000 +90447 -1.000000 +90448 -1.000000 +90449 -1.000000 +90450 -1.000000 +90451 -1.000000 +90452 -1.000000 +90453 -1.000000 +90454 -1.000000 +90455 -1.000000 +90456 -1.000000 +90457 -1.000000 +90458 -1.000000 +90459 -1.000000 +90460 -1.000000 +90462 -1.000000 +90463 -1.000000 +90465 -1.000000 +90466 -1.000000 +90468 -1.000000 +90471 -1.000000 +90472 -1.000000 +90473 -1.000000 +90474 -1.000000 +90475 -1.000000 +90476 -1.000000 +90477 -1.000000 +90478 -1.000000 +90479 -1.000000 +90480 -1.000000 +90481 -1.000000 +90482 -1.000000 +90483 -1.000000 +90484 -1.000000 +90485 -1.000000 +90486 -1.000000 +90487 -1.000000 +90488 -1.000000 +90489 -1.000000 +90490 -1.000000 +90491 -1.000000 +90492 -1.000000 +90493 -1.000000 +90494 -1.000000 +90496 -1.000000 +90497 -1.000000 +90498 -1.000000 +90499 -1.000000 +90500 -1.000000 +90501 -1.000000 +90502 -1.000000 +90503 -1.000000 +90504 -1.000000 +90505 -1.000000 +90506 -1.000000 +90507 -1.000000 +90508 -1.000000 +90509 -1.000000 +90510 -1.000000 +90511 -1.000000 +90514 -1.000000 +90515 -1.000000 +90516 -1.000000 +90517 -1.000000 +90518 -1.000000 +90519 -1.000000 +90520 -1.000000 +90521 -1.000000 +90522 -1.000000 +90523 -1.000000 +90524 -1.000000 +90525 -1.000000 +90526 -1.000000 +90527 -1.000000 +90528 -1.000000 +90530 -1.000000 +90531 -1.000000 +90534 -1.000000 +90535 -1.000000 +90536 -1.000000 +90537 -1.000000 +90538 -1.000000 +90539 -1.000000 +90540 -1.000000 +90541 -1.000000 +90542 -1.000000 +90543 -1.000000 +90545 -1.000000 +90546 -1.000000 +90547 -1.000000 +90549 -1.000000 +90550 -1.000000 +90551 -1.000000 +90552 -1.000000 +90553 -1.000000 +90554 -1.000000 +90555 -1.000000 +90556 -1.000000 +90557 -1.000000 +90558 -1.000000 +90559 -1.000000 +90560 -1.000000 +90561 -1.000000 +90562 -1.000000 +90563 -1.000000 +90564 -1.000000 +90565 -1.000000 +90566 -1.000000 +90567 -1.000000 +90568 -1.000000 +90569 -1.000000 +90570 -1.000000 +90571 -1.000000 +90572 -1.000000 +90573 -1.000000 +90574 -1.000000 +90575 -1.000000 +90576 -1.000000 +90577 -1.000000 +90578 -1.000000 +90580 -1.000000 +90581 -1.000000 +90582 -1.000000 +90583 -1.000000 +90584 -1.000000 +90586 -1.000000 +90587 -1.000000 +90588 -1.000000 +90589 -1.000000 +90590 -1.000000 +90591 -1.000000 +90592 -1.000000 +90593 -1.000000 +90597 -1.000000 +90604 -1.000000 +90605 -1.000000 +90608 -1.000000 +90609 -1.000000 +90610 -1.000000 +90622 -1.000000 +90626 -1.000000 +90627 -1.000000 +90628 -1.000000 +90629 -1.000000 +90630 -1.000000 +90631 -1.000000 +90632 -1.000000 +90633 -1.000000 +90634 -1.000000 +90635 -1.000000 +90636 -1.000000 +90637 -1.000000 +90638 -1.000000 +90640 -1.000000 +90642 -1.000000 +90645 -1.000000 +90646 -1.000000 +90647 -1.000000 +90649 -1.000000 +90650 -1.000000 +90651 -1.000000 +90652 -1.000000 +90653 -1.000000 +90654 -1.000000 +90655 -1.000000 +90656 -1.000000 +90657 -1.000000 +90658 -1.000000 +90660 -1.000000 +90661 -1.000000 +90662 -1.000000 +90663 -1.000000 +90664 -1.000000 +90665 -1.000000 +90666 -1.000000 +90667 -1.000000 +90668 -1.000000 +90669 -1.000000 +90670 -1.000000 +90671 -1.000000 +90672 -1.000000 +90674 -1.000000 +90677 -1.000000 +90678 -1.000000 +90682 -1.000000 +90683 -1.000000 +90697 -1.000000 +90698 -1.000000 +90702 -1.000000 +90703 -1.000000 +90704 -1.000000 +90705 -1.000000 +90708 -1.000000 +90711 -1.000000 +90712 -1.000000 +90713 -1.000000 +90714 -1.000000 +90715 -1.000000 +90716 -1.000000 +90717 -1.000000 +90718 -1.000000 +90719 -1.000000 +90722 -1.000000 +90725 -1.000000 +90726 -1.000000 +90728 -1.000000 +90730 -1.000000 +90731 -1.000000 +90732 -1.000000 +90733 -1.000000 +90734 -1.000000 +90735 -1.000000 +90736 -1.000000 +90737 -1.000000 +90738 -1.000000 +90739 -1.000000 +90740 -1.000000 +90741 -1.000000 +90742 -1.000000 +90743 -1.000000 +90744 -1.000000 +90745 -1.000000 +90746 -1.000000 +90747 -1.000000 +90748 -1.000000 +90749 -1.000000 +90750 -1.000000 +90751 -1.000000 +90752 -1.000000 +90753 -1.000000 +90754 -1.000000 +90755 -1.000000 +90757 -1.000000 +90758 -1.000000 +90759 -1.000000 +90760 -1.000000 +90761 -1.000000 +90762 -1.000000 +90763 -1.000000 +90764 -1.000000 +90765 -1.000000 +90766 -1.000000 +90767 -1.000000 +90768 -1.000000 +90769 -1.000000 +90770 -1.000000 +90771 -1.000000 +90772 -1.000000 +90773 -1.000000 +90774 -1.000000 +90775 -1.000000 +90776 -1.000000 +90777 -1.000000 +90778 -1.000000 +90779 -1.000000 +90780 -1.000000 +90781 -1.000000 +90782 -1.000000 +90783 -1.000000 +90784 -1.000000 +90785 -1.000000 +90786 -1.000000 +90788 -1.000000 +90789 -1.000000 +90790 -1.000000 +90791 -1.000000 +90793 -1.000000 +90794 -1.000000 +90795 -1.000000 +90796 -1.000000 +90797 -1.000000 +90798 -1.000000 +90799 -1.000000 +90800 -1.000000 +90801 -1.000000 +90802 -1.000000 +90803 -1.000000 +90804 -1.000000 +90805 -1.000000 +90806 -1.000000 +90807 -1.000000 +90808 -1.000000 +90809 -1.000000 +90810 -1.000000 +90811 -1.000000 +90812 -1.000000 +90813 -1.000000 +90814 -1.000000 +90815 -1.000000 +90816 -1.000000 +90817 -1.000000 +90818 -1.000000 +90819 -1.000000 +90820 -1.000000 +90821 -1.000000 +90822 -1.000000 +90823 -1.000000 +90824 -1.000000 +90825 -1.000000 +90826 -1.000000 +90827 -1.000000 +90828 -1.000000 +90829 -1.000000 +90830 -1.000000 +90831 -1.000000 +90832 -1.000000 +90833 -1.000000 +90834 -1.000000 +90835 -1.000000 +90836 -1.000000 +90837 -1.000000 +90838 -1.000000 +90839 -1.000000 +90840 -1.000000 +90841 -1.000000 +90842 -1.000000 +90843 -1.000000 +90844 -1.000000 +90845 -1.000000 +90846 -1.000000 +90847 -1.000000 +90848 -1.000000 +90849 -1.000000 +90850 -1.000000 +90851 -1.000000 +90852 -1.000000 +90853 -1.000000 +90854 -1.000000 +90855 -1.000000 +90856 -1.000000 +90857 -1.000000 +90858 -1.000000 +90859 -1.000000 +90860 -1.000000 +90861 -1.000000 +90862 -1.000000 +90863 -1.000000 +90864 -1.000000 +90865 -1.000000 +90866 -1.000000 +90867 -1.000000 +90868 -1.000000 +90869 -1.000000 +90870 -1.000000 +90871 -1.000000 +90872 -1.000000 +90873 -1.000000 +90874 -1.000000 +90875 -1.000000 +90876 -1.000000 +90877 -1.000000 +90878 -1.000000 +90879 -1.000000 +90880 -1.000000 +90881 -1.000000 +90882 -1.000000 +90883 -1.000000 +90884 -1.000000 +90885 -1.000000 +90886 -1.000000 +90888 -1.000000 +90889 -1.000000 +90890 -1.000000 +90891 -1.000000 +90892 -1.000000 +90893 -1.000000 +90894 -1.000000 +90895 -1.000000 +90896 -1.000000 +90897 -1.000000 +90898 -1.000000 +90899 -1.000000 +90901 -1.000000 +90902 -1.000000 +90903 -1.000000 +90905 -1.000000 +90906 -1.000000 +90907 -1.000000 +90908 -1.000000 +90909 -1.000000 +90910 -1.000000 +90911 -1.000000 +90912 -1.000000 +90913 -1.000000 +90914 -1.000000 +90915 -1.000000 +90916 -1.000000 +90917 -1.000000 +90918 -1.000000 +90919 -1.000000 +90920 -1.000000 +90921 -1.000000 +90922 -1.000000 +90923 -1.000000 +90925 -1.000000 +90926 -1.000000 +90927 -1.000000 +90928 -1.000000 +90929 -1.000000 +90930 -1.000000 +90931 -1.000000 +90932 -1.000000 +90933 -1.000000 +90934 -1.000000 +90935 -1.000000 +90936 -1.000000 +90937 -1.000000 +90938 -1.000000 +90939 -1.000000 +90940 -1.000000 +90941 -1.000000 +90942 -1.000000 +90943 -1.000000 +90944 -1.000000 +90945 -1.000000 +90946 -1.000000 +90947 -1.000000 +90948 -1.000000 +90949 -1.000000 +90950 -1.000000 +90952 -1.000000 +90954 -1.000000 +90955 -1.000000 +90956 -1.000000 +90957 -1.000000 +90958 -1.000000 +90959 -1.000000 +90960 -1.000000 +90961 -1.000000 +90962 -1.000000 +90963 -1.000000 +90964 -1.000000 +90967 -1.000000 +90968 -1.000000 +90969 -1.000000 +90970 -1.000000 +90971 -1.000000 +90972 -1.000000 +90973 -1.000000 +90974 -1.000000 +90975 -1.000000 +90976 -1.000000 +90977 -1.000000 +90978 -1.000000 +90979 -1.000000 +90980 -1.000000 +90981 -1.000000 +90983 -1.000000 +90984 -1.000000 +90986 -1.000000 +90987 -1.000000 +90988 -1.000000 +90989 -1.000000 +90990 -1.000000 +90991 -1.000000 +90992 -1.000000 +90993 -1.000000 +90994 -1.000000 +90995 -1.000000 +90996 -1.000000 +90997 -1.000000 +90998 -1.000000 +90999 -1.000000 +91000 -1.000000 +91001 -1.000000 +91002 -1.000000 +91003 -1.000000 +91004 -1.000000 +91005 -1.000000 +91007 -1.000000 +91008 -1.000000 +91009 -1.000000 +91010 -1.000000 +91011 -1.000000 +91012 -1.000000 +91014 -1.000000 +91015 -1.000000 +91016 -1.000000 +91017 -1.000000 +91018 -1.000000 +91019 -1.000000 +91020 -1.000000 +91021 -1.000000 +91022 -1.000000 +91023 -1.000000 +91027 -1.000000 +91034 -1.000000 +91041 -1.000000 +91043 -1.000000 +91044 -1.000000 +91045 -1.000000 +91046 -1.000000 +91047 -1.000000 +91048 -1.000000 +91049 -1.000000 +91050 -1.000000 +91051 -1.000000 +91052 -1.000000 +91053 -1.000000 +91054 -1.000000 +91055 -1.000000 +91056 -1.000000 +91057 -1.000000 +91058 -1.000000 +91059 -1.000000 +91060 -1.000000 +91061 -1.000000 +91062 -1.000000 +91063 -1.000000 +91064 -1.000000 +91065 -1.000000 +91066 -1.000000 +91070 -1.000000 +91075 -1.000000 +91083 -1.000000 +91084 -1.000000 +91085 -1.000000 +91086 -1.000000 +91087 -1.000000 +91089 -1.000000 +91097 -1.000000 +91099 -1.000000 +91100 -1.000000 +91101 -1.000000 +91102 -1.000000 +91104 -1.000000 +91105 -1.000000 +91106 -1.000000 +91107 -1.000000 +91108 -1.000000 +91109 -1.000000 +91110 -1.000000 +91111 -1.000000 +91112 -1.000000 +91113 -1.000000 +91114 -1.000000 +91115 -1.000000 +91116 -1.000000 +91117 -1.000000 +91118 -1.000000 +91119 -1.000000 +91120 -1.000000 +91121 -1.000000 +91122 -1.000000 +91123 -1.000000 +91124 -1.000000 +91125 -1.000000 +91126 -1.000000 +91127 -1.000000 +91128 -1.000000 +91129 -1.000000 +91130 -1.000000 +91131 -1.000000 +91133 -1.000000 +91134 -1.000000 +91135 -1.000000 +91136 -1.000000 +91137 -1.000000 +91138 -1.000000 +91139 -1.000000 +91140 -1.000000 +91141 -1.000000 +91142 -1.000000 +91143 -1.000000 +91144 -1.000000 +91145 -1.000000 +91146 -1.000000 +91147 -1.000000 +91148 -1.000000 +91149 -1.000000 +91150 -1.000000 +91151 -1.000000 +91152 -1.000000 +91153 -1.000000 +91154 -1.000000 +91155 -1.000000 +91156 -1.000000 +91157 -1.000000 +91158 -1.000000 +91159 -1.000000 +91160 -1.000000 +91161 -1.000000 +91162 -1.000000 +91163 -1.000000 +91164 -1.000000 +91165 -1.000000 +91166 -1.000000 +91167 -1.000000 +91168 -1.000000 +91169 -1.000000 +91170 -1.000000 +91171 -1.000000 +91172 -1.000000 +91173 -1.000000 +91174 -1.000000 +91175 -1.000000 +91176 -1.000000 +91177 -1.000000 +91178 -1.000000 +91179 -1.000000 +91180 -1.000000 +91181 -1.000000 +91182 -1.000000 +91183 -1.000000 +91184 -1.000000 +91185 -1.000000 +91186 -1.000000 +91187 -1.000000 +91188 -1.000000 +91189 -1.000000 +91190 -1.000000 +91191 -1.000000 +91192 -1.000000 +91193 -1.000000 +91194 -1.000000 +91195 -1.000000 +91196 -1.000000 +91197 -1.000000 +91198 -1.000000 +91199 -1.000000 +91200 -1.000000 +91201 -1.000000 +91202 -1.000000 +91203 -1.000000 +91204 -1.000000 +91205 -1.000000 +91206 -1.000000 +91207 -1.000000 +91208 -1.000000 +91209 -1.000000 +91210 -1.000000 +91211 -1.000000 +91212 -1.000000 +91213 -1.000000 +91214 -1.000000 +91215 -1.000000 +91216 -1.000000 +91217 -1.000000 +91218 -1.000000 +91219 -1.000000 +91220 -1.000000 +91221 -1.000000 +91222 -1.000000 +91223 -1.000000 +91224 -1.000000 +91225 -1.000000 +91226 -1.000000 +91227 -1.000000 +91228 -1.000000 +91229 -1.000000 +91230 -1.000000 +91231 -1.000000 +91232 -1.000000 +91233 -1.000000 +91234 -1.000000 +91235 -1.000000 +91236 -1.000000 +91237 -1.000000 +91238 -1.000000 +91239 -1.000000 +91240 -1.000000 +91241 -1.000000 +91242 -1.000000 +91244 -1.000000 +91245 -1.000000 +91246 -1.000000 +91247 -1.000000 +91248 -1.000000 +91249 -1.000000 +91250 -1.000000 +91251 -1.000000 +91252 -1.000000 +91253 -1.000000 +91254 -1.000000 +91255 -1.000000 +91256 -1.000000 +91257 -1.000000 +91258 -1.000000 +91259 -1.000000 +91260 -1.000000 +91261 -1.000000 +91262 -1.000000 +91263 -1.000000 +91264 -1.000000 +91265 -1.000000 +91267 -1.000000 +91268 -1.000000 +91270 -1.000000 +91271 -1.000000 +91272 -1.000000 +91273 -1.000000 +91274 -1.000000 +91275 -1.000000 +91276 -1.000000 +91277 -1.000000 +91279 -1.000000 +91280 -1.000000 +91281 -1.000000 +91282 -1.000000 +91283 -1.000000 +91286 -1.000000 +91287 -1.000000 +91288 -1.000000 +91289 -1.000000 +91290 -1.000000 +91295 -1.000000 +91296 -1.000000 +91297 -1.000000 +91298 -1.000000 +91299 -1.000000 +91301 -1.000000 +91303 -1.000000 +91304 -1.000000 +91305 -1.000000 +91306 -1.000000 +91307 -1.000000 +91308 -1.000000 +91309 -1.000000 +91310 -1.000000 +91311 -1.000000 +91312 -1.000000 +91313 -1.000000 +91314 -1.000000 +91315 -1.000000 +91316 -1.000000 +91317 -1.000000 +91318 -1.000000 +91319 -1.000000 +91320 -1.000000 +91321 -1.000000 +91322 -1.000000 +91323 -1.000000 +91324 -1.000000 +91325 -1.000000 +91326 -1.000000 +91327 -1.000000 +91328 -1.000000 +91329 -1.000000 +91330 -1.000000 +91331 -1.000000 +91332 -1.000000 +91333 -1.000000 +91335 -1.000000 +91336 -1.000000 +91337 -1.000000 +91341 -1.000000 +91343 -1.000000 +91344 -1.000000 +91345 -1.000000 +91346 -1.000000 +91347 -1.000000 +91348 -1.000000 +91349 -1.000000 +91350 -1.000000 +91351 -1.000000 +91352 -1.000000 +91353 -1.000000 +91354 -1.000000 +91356 -1.000000 +91357 -1.000000 +91359 -1.000000 +91360 -1.000000 +91361 -1.000000 +91362 -1.000000 +91363 -1.000000 +91364 -1.000000 +91365 -1.000000 +91366 -1.000000 +91367 -1.000000 +91368 -1.000000 +91369 -1.000000 +91370 -1.000000 +91371 -1.000000 +91372 -1.000000 +91373 -1.000000 +91374 -1.000000 +91375 -1.000000 +91376 -1.000000 +91377 -1.000000 +91378 -1.000000 +91379 -1.000000 +91380 -1.000000 +91381 -1.000000 +91382 -1.000000 +91383 -1.000000 +91384 -1.000000 +91385 -1.000000 +91386 -1.000000 +91387 -1.000000 +91389 -1.000000 +91390 -1.000000 +91391 -1.000000 +91392 -1.000000 +91393 -1.000000 +91394 -1.000000 +91395 -1.000000 +91396 -1.000000 +91397 -1.000000 +91398 -1.000000 +91399 -1.000000 +91400 -1.000000 +91401 -1.000000 +91402 -1.000000 +91403 -1.000000 +91404 -1.000000 +91405 -1.000000 +91406 -1.000000 +91408 -1.000000 +91409 -1.000000 +91410 -1.000000 +91411 -1.000000 +91412 -1.000000 +91413 -1.000000 +91414 -1.000000 +91415 -1.000000 +91416 -1.000000 +91417 -1.000000 +91418 -1.000000 +91419 -1.000000 +91420 -1.000000 +91421 -1.000000 +91422 -1.000000 +91423 -1.000000 +91424 -1.000000 +91425 -1.000000 +91426 -1.000000 +91428 -1.000000 +91430 -1.000000 +91431 -1.000000 +91432 -1.000000 +91433 -1.000000 +91434 -1.000000 +91435 -1.000000 +91436 -1.000000 +91437 -1.000000 +91438 -1.000000 +91439 -1.000000 +91440 -1.000000 +91441 -1.000000 +91442 -1.000000 +91444 -1.000000 +91447 -1.000000 +91448 -1.000000 +91449 -1.000000 +91450 -1.000000 +91451 -1.000000 +91452 -1.000000 +91453 -1.000000 +91454 -1.000000 +91455 -1.000000 +91456 -1.000000 +91457 -1.000000 +91458 -1.000000 +91459 -1.000000 +91460 -1.000000 +91461 -1.000000 +91462 -1.000000 +91464 -1.000000 +91465 -1.000000 +91466 -1.000000 +91467 -1.000000 +91468 -1.000000 +91469 -1.000000 +91470 -1.000000 +91471 -1.000000 +91472 -1.000000 +91473 -1.000000 +91474 -1.000000 +91475 -1.000000 +91476 -1.000000 +91477 -1.000000 +91478 -1.000000 +91479 -1.000000 +91480 -1.000000 +91481 -1.000000 +91482 -1.000000 +91483 -1.000000 +91484 -1.000000 +91485 -1.000000 +91486 -1.000000 +91487 -1.000000 +91488 -1.000000 +91489 -1.000000 +91490 -1.000000 +91491 -1.000000 +91492 -1.000000 +91493 -1.000000 +91494 -1.000000 +91495 -1.000000 +91496 -1.000000 +91498 -1.000000 +91499 -1.000000 +91500 -1.000000 +91501 -1.000000 +91502 -1.000000 +91503 -1.000000 +91504 -1.000000 +91505 -1.000000 +91507 -1.000000 +91508 -1.000000 +91510 -1.000000 +91511 -1.000000 +91512 -1.000000 +91513 -1.000000 +91514 -1.000000 +91515 -1.000000 +91516 -1.000000 +91517 -1.000000 +91518 -1.000000 +91519 -1.000000 +91520 -1.000000 +91521 -1.000000 +91523 -1.000000 +91524 -1.000000 +91525 -1.000000 +91526 -1.000000 +91527 -1.000000 +91528 -1.000000 +91529 -1.000000 +91530 -1.000000 +91531 -1.000000 +91532 -1.000000 +91533 -1.000000 +91535 -1.000000 +91536 -1.000000 +91537 -1.000000 +91538 -1.000000 +91539 -1.000000 +91540 -1.000000 +91542 -1.000000 +91543 -1.000000 +91544 -1.000000 +91545 -1.000000 +91546 -1.000000 +91547 -1.000000 +91548 -1.000000 +91549 -1.000000 +91550 -1.000000 +91551 -1.000000 +91552 -1.000000 +91553 -1.000000 +91554 -1.000000 +91555 -1.000000 +91556 -1.000000 +91557 -1.000000 +91558 -1.000000 +91559 -1.000000 +91560 -1.000000 +91561 -1.000000 +91562 -1.000000 +91563 -1.000000 +91564 -1.000000 +91565 -1.000000 +91566 -1.000000 +91567 -1.000000 +91568 -1.000000 +91569 -1.000000 +91571 -1.000000 +91573 -1.000000 +91574 -1.000000 +91575 -1.000000 +91576 -1.000000 +91577 -1.000000 +91578 -1.000000 +91579 -1.000000 +91580 -1.000000 +91581 -1.000000 +91582 -1.000000 +91583 -1.000000 +91584 -1.000000 +91585 -1.000000 +91587 -1.000000 +91588 -1.000000 +91590 -1.000000 +91591 -1.000000 +91592 -1.000000 +91593 -1.000000 +91594 -1.000000 +91595 -1.000000 +91596 -1.000000 +91597 -1.000000 +91599 -1.000000 +91600 -1.000000 +91601 -1.000000 +91602 -1.000000 +91603 -1.000000 +91604 -1.000000 +91605 -1.000000 +91606 -1.000000 +91607 -1.000000 +91608 -1.000000 +91609 -1.000000 +91610 -1.000000 +91611 -1.000000 +91612 -1.000000 +91613 -1.000000 +91614 -1.000000 +91616 -1.000000 +91617 -1.000000 +91618 -1.000000 +91619 -1.000000 +91620 -1.000000 +91621 -1.000000 +91622 -1.000000 +91623 -1.000000 +91624 -1.000000 +91625 -1.000000 +91626 -1.000000 +91630 -1.000000 +91631 -1.000000 +91632 -1.000000 +91633 -1.000000 +91634 -1.000000 +91635 -1.000000 +91637 -1.000000 +91638 -1.000000 +91639 -1.000000 +91640 -1.000000 +91643 -1.000000 +91644 -1.000000 +91645 -1.000000 +91646 -1.000000 +91647 -1.000000 +91648 -1.000000 +91649 -1.000000 +91650 -1.000000 +91652 -1.000000 +91653 -1.000000 +91654 -1.000000 +91655 -1.000000 +91656 -1.000000 +91658 -1.000000 +91659 -1.000000 +91660 -1.000000 +91661 -1.000000 +91662 -1.000000 +91663 -1.000000 +91664 -1.000000 +91665 -1.000000 +91666 -1.000000 +91667 -1.000000 +91668 -1.000000 +91669 -1.000000 +91670 -1.000000 +91671 -1.000000 +91672 -1.000000 +91673 -1.000000 +91674 -1.000000 +91675 -1.000000 +91676 -1.000000 +91679 -1.000000 +91680 -1.000000 +91682 -1.000000 +91683 -1.000000 +91684 -1.000000 +91685 -1.000000 +91686 -1.000000 +91687 -1.000000 +91688 -1.000000 +91689 -1.000000 +91690 -1.000000 +91691 -1.000000 +91692 -1.000000 +91693 -1.000000 +91694 -1.000000 +91695 -1.000000 +91697 -1.000000 +91698 -1.000000 +91699 -1.000000 +91700 -1.000000 +91701 -1.000000 +91702 -1.000000 +91703 -1.000000 +91705 -1.000000 +91706 -1.000000 +91708 -1.000000 +91710 -1.000000 +91711 -1.000000 +91712 -1.000000 +91713 -1.000000 +91714 -1.000000 +91715 -1.000000 +91716 -1.000000 +91717 -1.000000 +91718 -1.000000 +91719 -1.000000 +91720 -1.000000 +91721 -1.000000 +91722 -1.000000 +91723 -1.000000 +91724 -1.000000 +91725 -1.000000 +91726 -1.000000 +91729 -1.000000 +91730 -1.000000 +91731 -1.000000 +91732 -1.000000 +91733 -1.000000 +91734 -1.000000 +91735 -1.000000 +91736 -1.000000 +91737 -1.000000 +91738 -1.000000 +91739 -1.000000 +91740 -1.000000 +91741 -1.000000 +91742 -1.000000 +91743 -1.000000 +91744 -1.000000 +91745 -1.000000 +91746 -1.000000 +91747 -1.000000 +91748 -1.000000 +91749 -1.000000 +91750 -1.000000 +91751 -1.000000 +91752 -1.000000 +91753 -1.000000 +91754 -1.000000 +91755 -1.000000 +91756 -1.000000 +91757 -1.000000 +91758 -1.000000 +91759 -1.000000 +91760 -1.000000 +91761 -1.000000 +91762 -1.000000 +91763 -1.000000 +91764 -1.000000 +91765 -1.000000 +91766 -1.000000 +91767 -1.000000 +91768 -1.000000 +91769 -1.000000 +91770 -1.000000 +91771 -1.000000 +91772 -1.000000 +91773 -1.000000 +91774 -1.000000 +91775 -1.000000 +91776 -1.000000 +91777 -1.000000 +91778 -1.000000 +91779 -1.000000 +91780 -1.000000 +91781 -1.000000 +91782 -1.000000 +91783 -1.000000 +91784 -1.000000 +91785 -1.000000 +91786 -1.000000 +91787 -1.000000 +91788 -1.000000 +91789 -1.000000 +91790 -1.000000 +91791 -1.000000 +91792 -1.000000 +91794 -1.000000 +91795 -1.000000 +91797 -1.000000 +91798 -1.000000 +91799 -1.000000 +91800 -1.000000 +91801 -1.000000 +91802 -1.000000 +91803 -1.000000 +91804 -1.000000 +91805 -1.000000 +91806 -1.000000 +91807 -1.000000 +91808 -1.000000 +91809 -1.000000 +91810 -1.000000 +91811 -1.000000 +91812 -1.000000 +91813 -1.000000 +91814 -1.000000 +91815 -1.000000 +91816 -1.000000 +91817 -1.000000 +91818 -1.000000 +91819 -1.000000 +91821 -1.000000 +91822 -1.000000 +91823 -1.000000 +91824 -1.000000 +91825 -1.000000 +91827 -1.000000 +91828 -1.000000 +91829 -1.000000 +91830 -1.000000 +91831 -1.000000 +91833 -1.000000 +91834 -1.000000 +91835 -1.000000 +91836 -1.000000 +91837 -1.000000 +91838 -1.000000 +91839 -1.000000 +91840 -1.000000 +91841 -1.000000 +91842 -1.000000 +91844 -1.000000 +91845 -1.000000 +91846 -1.000000 +91847 -1.000000 +91848 -1.000000 +91849 -1.000000 +91850 -1.000000 +91851 -1.000000 +91852 -1.000000 +91853 -1.000000 +91854 -1.000000 +91855 -1.000000 +91856 -1.000000 +91857 -1.000000 +91858 -1.000000 +91859 -1.000000 +91860 -1.000000 +91861 -1.000000 +91862 -1.000000 +91863 -1.000000 +91864 -1.000000 +91865 -1.000000 +91866 -1.000000 +91867 -1.000000 +91868 -1.000000 +91869 -1.000000 +91870 -1.000000 +91871 -1.000000 +91872 -1.000000 +91873 -1.000000 +91874 -1.000000 +91875 -1.000000 +91876 -1.000000 +91877 -1.000000 +91878 -1.000000 +91879 -1.000000 +91880 -1.000000 +91881 -1.000000 +91882 -1.000000 +91883 -1.000000 +91884 -1.000000 +91885 -1.000000 +91886 -1.000000 +91887 -1.000000 +91890 -1.000000 +91891 -1.000000 +91892 -1.000000 +91893 -1.000000 +91894 -1.000000 +91895 -1.000000 +91896 -1.000000 +91897 -1.000000 +91898 -1.000000 +91899 -1.000000 +91900 -1.000000 +91901 -1.000000 +91902 -1.000000 +91903 -1.000000 +91904 -1.000000 +91905 -1.000000 +91906 -1.000000 +91908 -1.000000 +91909 -1.000000 +91910 -1.000000 +91911 -1.000000 +91912 -1.000000 +91913 -1.000000 +91914 -1.000000 +91915 -1.000000 +91916 -1.000000 +91917 -1.000000 +91918 -1.000000 +91919 -1.000000 +91920 -1.000000 +91921 -1.000000 +91922 -1.000000 +91923 -1.000000 +91925 -1.000000 +91926 -1.000000 +91927 -1.000000 +91928 -1.000000 +91929 -1.000000 +91930 -1.000000 +91931 -1.000000 +91932 -1.000000 +91933 -1.000000 +91934 -1.000000 +91935 -1.000000 +91936 -1.000000 +91937 -1.000000 +91938 -1.000000 +91939 -1.000000 +91940 -1.000000 +91941 -1.000000 +91942 -1.000000 +91943 -1.000000 +91944 -1.000000 +91945 -1.000000 +91946 -1.000000 +91947 -1.000000 +91948 -1.000000 +91949 -1.000000 +91950 -1.000000 +91951 -1.000000 +91952 -1.000000 +91953 -1.000000 +91954 -1.000000 +91955 -1.000000 +91956 -1.000000 +91957 -1.000000 +91958 -1.000000 +91959 -1.000000 +91960 -1.000000 +91961 -1.000000 +91962 -1.000000 +91964 -1.000000 +91965 -1.000000 +91966 -1.000000 +91967 -1.000000 +91968 -1.000000 +91969 -1.000000 +91973 -1.000000 +91974 -1.000000 +91975 -1.000000 +91976 -1.000000 +91978 -1.000000 +91979 -1.000000 +91980 -1.000000 +91982 -1.000000 +91984 -1.000000 +91985 -1.000000 +91986 -1.000000 +91987 -1.000000 +91988 -1.000000 +91996 -1.000000 +91999 -1.000000 +92000 -1.000000 +92002 -1.000000 +92004 -1.000000 +92005 -1.000000 +92007 -1.000000 +92011 -1.000000 +92023 -1.000000 +92024 -1.000000 +92025 -1.000000 +92026 -1.000000 +92027 -1.000000 +92028 -1.000000 +92029 -1.000000 +92030 -1.000000 +92032 -1.000000 +92039 -1.000000 +92041 -1.000000 +92042 -1.000000 +92046 -1.000000 +92048 -1.000000 +92051 -1.000000 +92052 -1.000000 +92053 -1.000000 +92055 -1.000000 +92058 -1.000000 +92060 -1.000000 +92061 -1.000000 +92062 -1.000000 +92063 -1.000000 +92064 -1.000000 +92065 -1.000000 +92066 -1.000000 +92067 -1.000000 +92068 -1.000000 +92071 -1.000000 +92073 -1.000000 +92074 -1.000000 +92075 -1.000000 +92076 -1.000000 +92078 -1.000000 +92079 -1.000000 +92083 -1.000000 +92084 -1.000000 +92085 -1.000000 +92086 -1.000000 +92089 -1.000000 +92090 -1.000000 +92091 -1.000000 +92092 -1.000000 +92093 -1.000000 +92094 -1.000000 +92095 -1.000000 +92096 -1.000000 +92097 -1.000000 +92102 -1.000000 +92103 -1.000000 +92104 -1.000000 +92106 -1.000000 +92108 -1.000000 +92109 -1.000000 +92110 -1.000000 +92111 -1.000000 +92112 -1.000000 +92114 -1.000000 +92115 -1.000000 +92117 -1.000000 +92118 -1.000000 +92119 -1.000000 +92121 -1.000000 +92122 -1.000000 +92126 -1.000000 +92127 -1.000000 +92128 -1.000000 +92130 -1.000000 +92131 -1.000000 +92133 -1.000000 +92137 -1.000000 +92138 -1.000000 +92139 -1.000000 +92141 -1.000000 +92142 -1.000000 +92143 -1.000000 +92145 -1.000000 +92146 -1.000000 +92147 -1.000000 +92148 -1.000000 +92149 -1.000000 +92150 -1.000000 +92151 -1.000000 +92154 -1.000000 +92155 -1.000000 +92158 -1.000000 +92159 -1.000000 +92160 -1.000000 +92161 -1.000000 +92162 -1.000000 +92163 -1.000000 +92164 -1.000000 +92166 -1.000000 +92167 -1.000000 +92168 -1.000000 +92169 -1.000000 +92170 -1.000000 +92171 -1.000000 +92172 -1.000000 +92173 -1.000000 +92175 -1.000000 +92177 -1.000000 +92178 -1.000000 +92179 -1.000000 +92180 -1.000000 +92183 -1.000000 +92184 -1.000000 +92187 -1.000000 +92191 -1.000000 +92193 -1.000000 +92194 -1.000000 +92195 -1.000000 +92196 -1.000000 +92198 -1.000000 +92200 -1.000000 +92201 -1.000000 +92202 -1.000000 +92203 -1.000000 +92204 -1.000000 +92206 -1.000000 +92207 -1.000000 +92209 -1.000000 +92216 -1.000000 +92218 -1.000000 +92219 -1.000000 +92222 -1.000000 +92223 -1.000000 +92224 -1.000000 +92228 -1.000000 +92232 -1.000000 +92234 -1.000000 +92237 -1.000000 +92242 -1.000000 +92243 -1.000000 +92244 -1.000000 +92245 -1.000000 +92247 -1.000000 +92248 -1.000000 +92249 -1.000000 +92250 -1.000000 +92251 -1.000000 +92252 -1.000000 +92254 -1.000000 +92255 -1.000000 +92256 -1.000000 +92257 -1.000000 +92259 -1.000000 +92260 -1.000000 +92261 -1.000000 +92262 -1.000000 +92263 -1.000000 +92265 -1.000000 +92266 -1.000000 +92268 -1.000000 +92272 -1.000000 +92273 -1.000000 +92274 -1.000000 +92275 -1.000000 +92276 -1.000000 +92277 -1.000000 +92279 -1.000000 +92280 -1.000000 +92281 -1.000000 +92282 -1.000000 +92283 -1.000000 +92284 -1.000000 +92285 -1.000000 +92286 -1.000000 +92290 -1.000000 +92291 -1.000000 +92292 -1.000000 +92293 -1.000000 +92294 -1.000000 +92295 -1.000000 +92298 -1.000000 +92301 -1.000000 +92302 -1.000000 +92303 -1.000000 +92304 -1.000000 +92306 -1.000000 +92307 -1.000000 +92310 -1.000000 +92314 -1.000000 +92315 -1.000000 +92316 -1.000000 +92318 -1.000000 +92319 -1.000000 +92320 -1.000000 +92321 -1.000000 +92322 -1.000000 +92323 -1.000000 +92324 -1.000000 +92326 -1.000000 +92327 -1.000000 +92328 -1.000000 +92329 -1.000000 +92330 -1.000000 +92331 -1.000000 +92332 -1.000000 +92333 -1.000000 +92334 -1.000000 +92335 -1.000000 +92336 -1.000000 +92337 -1.000000 +92338 -1.000000 +92339 -1.000000 +92340 -1.000000 +92341 -1.000000 +92342 -1.000000 +92343 -1.000000 +92344 -1.000000 +92345 -1.000000 +92346 -1.000000 +92347 -1.000000 +92348 -1.000000 +92350 -1.000000 +92351 -1.000000 +92352 -1.000000 +92353 -1.000000 +92354 -1.000000 +92355 -1.000000 +92369 -1.000000 +92370 -1.000000 +92371 -1.000000 +92373 -1.000000 +92374 -1.000000 +92379 -1.000000 +92380 -1.000000 +92382 -1.000000 +92383 -1.000000 +92385 -1.000000 +92386 -1.000000 +92387 -1.000000 +92388 -1.000000 +92390 -1.000000 +92391 -1.000000 +92392 -1.000000 +92396 -1.000000 +92397 -1.000000 +92400 -1.000000 +92401 -1.000000 +92403 -1.000000 +92405 -1.000000 +92406 -1.000000 +92407 -1.000000 +92409 -1.000000 +92411 -1.000000 +92412 -1.000000 +92416 -1.000000 +92417 -1.000000 +92418 -1.000000 +92419 -1.000000 +92420 -1.000000 +92421 -1.000000 +92423 -1.000000 +92425 -1.000000 +92426 -1.000000 +92428 -1.000000 +92429 -1.000000 +92430 -1.000000 +92431 -1.000000 +92434 -1.000000 +92436 -1.000000 +92438 -1.000000 +92439 -1.000000 +92440 -1.000000 +92441 -1.000000 +92442 -1.000000 +92443 -1.000000 +92444 -1.000000 +92445 -1.000000 +92446 -1.000000 +92450 -1.000000 +92451 -1.000000 +92455 -1.000000 +92463 -1.000000 +92464 -1.000000 +92465 -1.000000 +92467 -1.000000 +92468 -1.000000 +92469 -1.000000 +92470 -1.000000 +92471 -1.000000 +92472 -1.000000 +92473 -1.000000 +92474 -1.000000 +92475 -1.000000 +92476 -1.000000 +92478 -1.000000 +92479 -1.000000 +92480 -1.000000 +92481 -1.000000 +92482 -1.000000 +92483 -1.000000 +92484 -1.000000 +92485 -1.000000 +92486 -1.000000 +92487 -1.000000 +92488 -1.000000 +92489 -1.000000 +92490 -1.000000 +92491 -1.000000 +92492 -1.000000 +92493 -1.000000 +92494 -1.000000 +92495 -1.000000 +92496 -1.000000 +92498 -1.000000 +92499 -1.000000 +92501 -1.000000 +92502 -1.000000 +92503 -1.000000 diff --git a/data/shot_lists/jet/ILW_clear_late.txt b/data/shot_lists/jet/ILW_clear_late.txt new file mode 100644 index 00000000..6f66467a --- /dev/null +++ b/data/shot_lists/jet/ILW_clear_late.txt @@ -0,0 +1,7201 @@ +83794 -1.000000 +83795 -1.000000 +83796 -1.000000 +83797 -1.000000 +83798 -1.000000 +83799 -1.000000 +83800 -1.000000 +83801 -1.000000 +83802 -1.000000 +83803 -1.000000 +83804 -1.000000 +83805 -1.000000 +83806 -1.000000 +83807 -1.000000 +83808 -1.000000 +83809 -1.000000 +83810 -1.000000 +83811 -1.000000 +83812 -1.000000 +83813 -1.000000 +83814 -1.000000 +83815 -1.000000 +83816 -1.000000 +83817 -1.000000 +83818 -1.000000 +83819 -1.000000 +83820 -1.000000 +83821 -1.000000 +83822 -1.000000 +83823 -1.000000 +83824 -1.000000 +83825 -1.000000 +83826 -1.000000 +83827 -1.000000 +83828 -1.000000 +83829 -1.000000 +83830 -1.000000 +83831 -1.000000 +83832 -1.000000 +83833 -1.000000 +83834 -1.000000 +83835 -1.000000 +83836 -1.000000 +83837 -1.000000 +83838 -1.000000 +83839 -1.000000 +83840 -1.000000 +83841 -1.000000 +83842 -1.000000 +83843 -1.000000 +83844 -1.000000 +83845 -1.000000 +83846 -1.000000 +83847 -1.000000 +83848 -1.000000 +83849 -1.000000 +83850 -1.000000 +83851 -1.000000 +83852 -1.000000 +83853 -1.000000 +83854 -1.000000 +83855 -1.000000 +83856 -1.000000 +83857 -1.000000 +83858 -1.000000 +83859 -1.000000 +83860 -1.000000 +83861 -1.000000 +83862 -1.000000 +83863 -1.000000 +83864 -1.000000 +83865 -1.000000 +83866 -1.000000 +83867 -1.000000 +83868 -1.000000 +83869 -1.000000 +83870 -1.000000 +83871 -1.000000 +83872 -1.000000 +83873 -1.000000 +83874 -1.000000 +83875 -1.000000 +83876 -1.000000 +83877 -1.000000 +83878 -1.000000 +83879 -1.000000 +83880 -1.000000 +83881 -1.000000 +83882 -1.000000 +83883 -1.000000 +83884 -1.000000 +83885 -1.000000 +83886 -1.000000 +83887 -1.000000 +83888 -1.000000 +83889 -1.000000 +83890 -1.000000 +83891 -1.000000 +83892 -1.000000 +83893 -1.000000 +83894 -1.000000 +83895 -1.000000 +83896 -1.000000 +83897 -1.000000 +83898 -1.000000 +83899 -1.000000 +83900 -1.000000 +83901 -1.000000 +83902 -1.000000 +83903 -1.000000 +83904 -1.000000 +83905 -1.000000 +83906 -1.000000 +83907 -1.000000 +83908 -1.000000 +83909 -1.000000 +83910 -1.000000 +83911 -1.000000 +83912 -1.000000 +83913 -1.000000 +83914 -1.000000 +83915 -1.000000 +83916 -1.000000 +83917 -1.000000 +83918 -1.000000 +83919 -1.000000 +83920 -1.000000 +83921 -1.000000 +83922 -1.000000 +83923 -1.000000 +83924 -1.000000 +83925 -1.000000 +83926 -1.000000 +83927 -1.000000 +83928 -1.000000 +83929 -1.000000 +83930 -1.000000 +83931 -1.000000 +83932 -1.000000 +83933 -1.000000 +83934 -1.000000 +83935 -1.000000 +83936 -1.000000 +83937 -1.000000 +83938 -1.000000 +83939 -1.000000 +83940 -1.000000 +83941 -1.000000 +83942 -1.000000 +83943 -1.000000 +83944 -1.000000 +83945 -1.000000 +83946 -1.000000 +83947 -1.000000 +83948 -1.000000 +83949 -1.000000 +83950 -1.000000 +83951 -1.000000 +83952 -1.000000 +83953 -1.000000 +83954 -1.000000 +83955 -1.000000 +83956 -1.000000 +83957 -1.000000 +83958 -1.000000 +83959 -1.000000 +83960 -1.000000 +83961 -1.000000 +83962 -1.000000 +83963 -1.000000 +83964 -1.000000 +83965 -1.000000 +83966 -1.000000 +83967 -1.000000 +83968 -1.000000 +83969 -1.000000 +83970 -1.000000 +83971 -1.000000 +83972 -1.000000 +83973 -1.000000 +83974 -1.000000 +83975 -1.000000 +83976 -1.000000 +83977 -1.000000 +83978 -1.000000 +83979 -1.000000 +83981 -1.000000 +83983 -1.000000 +83984 -1.000000 +83985 -1.000000 +83986 -1.000000 +83988 -1.000000 +83989 -1.000000 +83990 -1.000000 +83991 -1.000000 +83992 -1.000000 +83993 -1.000000 +83994 -1.000000 +83995 -1.000000 +83996 -1.000000 +83997 -1.000000 +83998 -1.000000 +84000 -1.000000 +84001 -1.000000 +84002 -1.000000 +84003 -1.000000 +84004 -1.000000 +84005 -1.000000 +84006 -1.000000 +84007 -1.000000 +84008 -1.000000 +84009 -1.000000 +84010 -1.000000 +84011 -1.000000 +84012 -1.000000 +84013 -1.000000 +84014 -1.000000 +84015 -1.000000 +84016 -1.000000 +84017 -1.000000 +84018 -1.000000 +84019 -1.000000 +84020 -1.000000 +84021 -1.000000 +84022 -1.000000 +84023 -1.000000 +84024 -1.000000 +84025 -1.000000 +84026 -1.000000 +84027 -1.000000 +84028 -1.000000 +84029 -1.000000 +84030 -1.000000 +84032 -1.000000 +84033 -1.000000 +84034 -1.000000 +84035 -1.000000 +84037 -1.000000 +84038 -1.000000 +84039 -1.000000 +84040 -1.000000 +84041 -1.000000 +84042 -1.000000 +84043 -1.000000 +84044 -1.000000 +84045 -1.000000 +84046 -1.000000 +84047 -1.000000 +84048 -1.000000 +84049 -1.000000 +84050 -1.000000 +84052 -1.000000 +84053 -1.000000 +84055 -1.000000 +84056 -1.000000 +84057 -1.000000 +84058 -1.000000 +84059 -1.000000 +84060 -1.000000 +84061 -1.000000 +84062 -1.000000 +84063 -1.000000 +84064 -1.000000 +84065 -1.000000 +84066 -1.000000 +84067 -1.000000 +84068 -1.000000 +84069 -1.000000 +84070 -1.000000 +84071 -1.000000 +84072 -1.000000 +84073 -1.000000 +84074 -1.000000 +84075 -1.000000 +84076 -1.000000 +84078 -1.000000 +84080 -1.000000 +84081 -1.000000 +84082 -1.000000 +84083 -1.000000 +84084 -1.000000 +84085 -1.000000 +84086 -1.000000 +84087 -1.000000 +84088 -1.000000 +84089 -1.000000 +84090 -1.000000 +84091 -1.000000 +84092 -1.000000 +84093 -1.000000 +84094 -1.000000 +84095 -1.000000 +84096 -1.000000 +84097 -1.000000 +84098 -1.000000 +84099 -1.000000 +84100 -1.000000 +84101 -1.000000 +84102 -1.000000 +84103 -1.000000 +84104 -1.000000 +84105 -1.000000 +84106 -1.000000 +84107 -1.000000 +84108 -1.000000 +84109 -1.000000 +84110 -1.000000 +84111 -1.000000 +84112 -1.000000 +84113 -1.000000 +84114 -1.000000 +84116 -1.000000 +84117 -1.000000 +84118 -1.000000 +84119 -1.000000 +84120 -1.000000 +84121 -1.000000 +84122 -1.000000 +84123 -1.000000 +84124 -1.000000 +84125 -1.000000 +84126 -1.000000 +84127 -1.000000 +84128 -1.000000 +84129 -1.000000 +84130 -1.000000 +84131 -1.000000 +84132 -1.000000 +84133 -1.000000 +84134 -1.000000 +84135 -1.000000 +84136 -1.000000 +84137 -1.000000 +84138 -1.000000 +84139 -1.000000 +84140 -1.000000 +84141 -1.000000 +84144 -1.000000 +84145 -1.000000 +84146 -1.000000 +84147 -1.000000 +84148 -1.000000 +84149 -1.000000 +84150 -1.000000 +84151 -1.000000 +84152 -1.000000 +84153 -1.000000 +84154 -1.000000 +84155 -1.000000 +84156 -1.000000 +84157 -1.000000 +84159 -1.000000 +84174 -1.000000 +84175 -1.000000 +84176 -1.000000 +84177 -1.000000 +84178 -1.000000 +84179 -1.000000 +84181 -1.000000 +84182 -1.000000 +84183 -1.000000 +84184 -1.000000 +84185 -1.000000 +84186 -1.000000 +84187 -1.000000 +84188 -1.000000 +84189 -1.000000 +84190 -1.000000 +84191 -1.000000 +84192 -1.000000 +84193 -1.000000 +84194 -1.000000 +84195 -1.000000 +84196 -1.000000 +84197 -1.000000 +84198 -1.000000 +84199 -1.000000 +84200 -1.000000 +84201 -1.000000 +84202 -1.000000 +84203 -1.000000 +84204 -1.000000 +84205 -1.000000 +84206 -1.000000 +84207 -1.000000 +84208 -1.000000 +84209 -1.000000 +84210 -1.000000 +84211 -1.000000 +84212 -1.000000 +84213 -1.000000 +84214 -1.000000 +84215 -1.000000 +84216 -1.000000 +84217 -1.000000 +84218 -1.000000 +84219 -1.000000 +84220 -1.000000 +84221 -1.000000 +84222 -1.000000 +84223 -1.000000 +84224 -1.000000 +84225 -1.000000 +84226 -1.000000 +84227 -1.000000 +84228 -1.000000 +84229 -1.000000 +84230 -1.000000 +84231 -1.000000 +84232 -1.000000 +84233 -1.000000 +84234 -1.000000 +84235 -1.000000 +84236 -1.000000 +84237 -1.000000 +84238 -1.000000 +84239 -1.000000 +84240 -1.000000 +84241 -1.000000 +84242 -1.000000 +84243 -1.000000 +84244 -1.000000 +84245 -1.000000 +84246 -1.000000 +84247 -1.000000 +84248 -1.000000 +84249 -1.000000 +84250 -1.000000 +84251 -1.000000 +84252 -1.000000 +84253 -1.000000 +84254 -1.000000 +84255 -1.000000 +84256 -1.000000 +84257 -1.000000 +84258 -1.000000 +84259 -1.000000 +84260 -1.000000 +84261 -1.000000 +84262 -1.000000 +84263 -1.000000 +84264 -1.000000 +84265 -1.000000 +84266 -1.000000 +84267 -1.000000 +84268 -1.000000 +84269 -1.000000 +84270 -1.000000 +84272 -1.000000 +84273 -1.000000 +84274 -1.000000 +84276 -1.000000 +84277 -1.000000 +84278 -1.000000 +84279 -1.000000 +84280 -1.000000 +84281 -1.000000 +84282 -1.000000 +84283 -1.000000 +84284 -1.000000 +84285 -1.000000 +84286 -1.000000 +84287 -1.000000 +84288 -1.000000 +84289 -1.000000 +84290 -1.000000 +84291 -1.000000 +84292 -1.000000 +84293 -1.000000 +84294 -1.000000 +84295 -1.000000 +84296 -1.000000 +84297 -1.000000 +84298 -1.000000 +84299 -1.000000 +84300 -1.000000 +84301 -1.000000 +84302 -1.000000 +84303 -1.000000 +84304 -1.000000 +84305 -1.000000 +84306 -1.000000 +84307 -1.000000 +84309 -1.000000 +84310 -1.000000 +84311 -1.000000 +84312 -1.000000 +84313 -1.000000 +84314 -1.000000 +84316 -1.000000 +84317 -1.000000 +84318 -1.000000 +84319 -1.000000 +84320 -1.000000 +84321 -1.000000 +84325 -1.000000 +84326 -1.000000 +84327 -1.000000 +84329 -1.000000 +84330 -1.000000 +84331 -1.000000 +84332 -1.000000 +84333 -1.000000 +84334 -1.000000 +84335 -1.000000 +84336 -1.000000 +84337 -1.000000 +84338 -1.000000 +84339 -1.000000 +84340 -1.000000 +84341 -1.000000 +84342 -1.000000 +84343 -1.000000 +84344 -1.000000 +84345 -1.000000 +84346 -1.000000 +84347 -1.000000 +84348 -1.000000 +84349 -1.000000 +84350 -1.000000 +84351 -1.000000 +84353 -1.000000 +84354 -1.000000 +84355 -1.000000 +84356 -1.000000 +84357 -1.000000 +84358 -1.000000 +84359 -1.000000 +84360 -1.000000 +84361 -1.000000 +84362 -1.000000 +84363 -1.000000 +84364 -1.000000 +84365 -1.000000 +84366 -1.000000 +84367 -1.000000 +84368 -1.000000 +84369 -1.000000 +84370 -1.000000 +84371 -1.000000 +84372 -1.000000 +84373 -1.000000 +84374 -1.000000 +84375 -1.000000 +84376 -1.000000 +84377 -1.000000 +84378 -1.000000 +84379 -1.000000 +84380 -1.000000 +84381 -1.000000 +84382 -1.000000 +84383 -1.000000 +84384 -1.000000 +84385 -1.000000 +84386 -1.000000 +84387 -1.000000 +84388 -1.000000 +84389 -1.000000 +84390 -1.000000 +84391 -1.000000 +84392 -1.000000 +84393 -1.000000 +84394 -1.000000 +84395 -1.000000 +84396 -1.000000 +84397 -1.000000 +84398 -1.000000 +84399 -1.000000 +84400 -1.000000 +84401 -1.000000 +84402 -1.000000 +84403 -1.000000 +84404 -1.000000 +84405 -1.000000 +84406 -1.000000 +84407 -1.000000 +84409 -1.000000 +84410 -1.000000 +84411 -1.000000 +84412 -1.000000 +84413 -1.000000 +84414 -1.000000 +84415 -1.000000 +84416 -1.000000 +84417 -1.000000 +84418 -1.000000 +84419 -1.000000 +84420 -1.000000 +84421 -1.000000 +84422 -1.000000 +84423 -1.000000 +84424 -1.000000 +84425 -1.000000 +84426 -1.000000 +84427 -1.000000 +84429 -1.000000 +84430 -1.000000 +84431 -1.000000 +84432 -1.000000 +84434 -1.000000 +84436 -1.000000 +84437 -1.000000 +84438 -1.000000 +84439 -1.000000 +84440 -1.000000 +84441 -1.000000 +84442 -1.000000 +84443 -1.000000 +84444 -1.000000 +84445 -1.000000 +84446 -1.000000 +84447 -1.000000 +84448 -1.000000 +84449 -1.000000 +84450 -1.000000 +84451 -1.000000 +84452 -1.000000 +84453 -1.000000 +84454 -1.000000 +84455 -1.000000 +84456 -1.000000 +84457 -1.000000 +84458 -1.000000 +84459 -1.000000 +84460 -1.000000 +84461 -1.000000 +84463 -1.000000 +84466 -1.000000 +84468 -1.000000 +84469 -1.000000 +84470 -1.000000 +84471 -1.000000 +84472 -1.000000 +84473 -1.000000 +84474 -1.000000 +84475 -1.000000 +84476 -1.000000 +84477 -1.000000 +84478 -1.000000 +84479 -1.000000 +84480 -1.000000 +84481 -1.000000 +84482 -1.000000 +84483 -1.000000 +84484 -1.000000 +84485 -1.000000 +84486 -1.000000 +84487 -1.000000 +84488 -1.000000 +84489 -1.000000 +84490 -1.000000 +84491 -1.000000 +84492 -1.000000 +84493 -1.000000 +84495 -1.000000 +84496 -1.000000 +84497 -1.000000 +84498 -1.000000 +84499 -1.000000 +84500 -1.000000 +84501 -1.000000 +84502 -1.000000 +84503 -1.000000 +84504 -1.000000 +84505 -1.000000 +84506 -1.000000 +84507 -1.000000 +84508 -1.000000 +84509 -1.000000 +84510 -1.000000 +84511 -1.000000 +84512 -1.000000 +84513 -1.000000 +84514 -1.000000 +84515 -1.000000 +84516 -1.000000 +84518 -1.000000 +84521 -1.000000 +84522 -1.000000 +84523 -1.000000 +84525 -1.000000 +84526 -1.000000 +84527 -1.000000 +84528 -1.000000 +84529 -1.000000 +84530 -1.000000 +84531 -1.000000 +84532 -1.000000 +84534 -1.000000 +84535 -1.000000 +84536 -1.000000 +84537 -1.000000 +84538 -1.000000 +84539 -1.000000 +84540 -1.000000 +84541 -1.000000 +84542 -1.000000 +84543 -1.000000 +84544 -1.000000 +84545 -1.000000 +84546 -1.000000 +84547 -1.000000 +84548 -1.000000 +84549 -1.000000 +84550 -1.000000 +84551 -1.000000 +84552 -1.000000 +84555 -1.000000 +84556 -1.000000 +84558 -1.000000 +84559 -1.000000 +84560 -1.000000 +84561 -1.000000 +84562 -1.000000 +84563 -1.000000 +84564 -1.000000 +84565 -1.000000 +84566 -1.000000 +84567 -1.000000 +84568 -1.000000 +84569 -1.000000 +84570 -1.000000 +84571 -1.000000 +84572 -1.000000 +84573 -1.000000 +84574 -1.000000 +84575 -1.000000 +84576 -1.000000 +84577 -1.000000 +84578 -1.000000 +84579 -1.000000 +84580 -1.000000 +84582 -1.000000 +84583 -1.000000 +84584 -1.000000 +84585 -1.000000 +84586 -1.000000 +84587 -1.000000 +84589 -1.000000 +84590 -1.000000 +84591 -1.000000 +84592 -1.000000 +84596 -1.000000 +84597 -1.000000 +84598 -1.000000 +84599 -1.000000 +84601 -1.000000 +84602 -1.000000 +84603 -1.000000 +84604 -1.000000 +84605 -1.000000 +84606 -1.000000 +84607 -1.000000 +84608 -1.000000 +84609 -1.000000 +84610 -1.000000 +84611 -1.000000 +84615 -1.000000 +84616 -1.000000 +84617 -1.000000 +84618 -1.000000 +84619 -1.000000 +84621 -1.000000 +84622 -1.000000 +84623 -1.000000 +84624 -1.000000 +84625 -1.000000 +84626 -1.000000 +84627 -1.000000 +84629 -1.000000 +84630 -1.000000 +84631 -1.000000 +84632 -1.000000 +84633 -1.000000 +84634 -1.000000 +84635 -1.000000 +84636 -1.000000 +84637 -1.000000 +84638 -1.000000 +84641 -1.000000 +84642 -1.000000 +84643 -1.000000 +84644 -1.000000 +84645 -1.000000 +84646 -1.000000 +84647 -1.000000 +84649 -1.000000 +84650 -1.000000 +84651 -1.000000 +84652 -1.000000 +84653 -1.000000 +84654 -1.000000 +84659 -1.000000 +84660 -1.000000 +84661 -1.000000 +84662 -1.000000 +84663 -1.000000 +84664 -1.000000 +84665 -1.000000 +84666 -1.000000 +84667 -1.000000 +84668 -1.000000 +84669 -1.000000 +84670 -1.000000 +84672 -1.000000 +84673 -1.000000 +84678 -1.000000 +84680 -1.000000 +84682 -1.000000 +84683 -1.000000 +84684 -1.000000 +84685 -1.000000 +84686 -1.000000 +84687 -1.000000 +84688 -1.000000 +84689 -1.000000 +84692 -1.000000 +84693 -1.000000 +84694 -1.000000 +84697 -1.000000 +84698 -1.000000 +84699 -1.000000 +84700 -1.000000 +84701 -1.000000 +84702 -1.000000 +84703 -1.000000 +84704 -1.000000 +84705 -1.000000 +84706 -1.000000 +84708 -1.000000 +84709 -1.000000 +84712 -1.000000 +84713 -1.000000 +84714 -1.000000 +84717 -1.000000 +84718 -1.000000 +84719 -1.000000 +84720 -1.000000 +84721 -1.000000 +84722 -1.000000 +84723 -1.000000 +84724 -1.000000 +84725 -1.000000 +84726 -1.000000 +84727 -1.000000 +84728 -1.000000 +84729 -1.000000 +84730 -1.000000 +84731 -1.000000 +84732 -1.000000 +84733 -1.000000 +84734 -1.000000 +84735 -1.000000 +84736 -1.000000 +84737 -1.000000 +84738 -1.000000 +84739 -1.000000 +84740 -1.000000 +84741 -1.000000 +84742 -1.000000 +84743 -1.000000 +84744 -1.000000 +84745 -1.000000 +84746 -1.000000 +84749 -1.000000 +84750 -1.000000 +84751 -1.000000 +84753 -1.000000 +84755 -1.000000 +84756 -1.000000 +84757 -1.000000 +84758 -1.000000 +84759 -1.000000 +84760 -1.000000 +84761 -1.000000 +84762 -1.000000 +84765 -1.000000 +84767 -1.000000 +84768 -1.000000 +84769 -1.000000 +84770 -1.000000 +84772 -1.000000 +84773 -1.000000 +84774 -1.000000 +84776 -1.000000 +84777 -1.000000 +84778 -1.000000 +84779 -1.000000 +84780 -1.000000 +84781 -1.000000 +84782 -1.000000 +84784 -1.000000 +84785 -1.000000 +84786 -1.000000 +84787 -1.000000 +84788 -1.000000 +84789 -1.000000 +84790 -1.000000 +84791 -1.000000 +84792 -1.000000 +84793 -1.000000 +84794 -1.000000 +84795 -1.000000 +84796 -1.000000 +84797 -1.000000 +84798 -1.000000 +84799 -1.000000 +84800 -1.000000 +84801 -1.000000 +84802 -1.000000 +84803 -1.000000 +84804 -1.000000 +84805 -1.000000 +84806 -1.000000 +84807 -1.000000 +84809 -1.000000 +84810 -1.000000 +84811 -1.000000 +84812 -1.000000 +84813 -1.000000 +84814 -1.000000 +84815 -1.000000 +84816 -1.000000 +84817 -1.000000 +84821 -1.000000 +84822 -1.000000 +84823 -1.000000 +84824 -1.000000 +84825 -1.000000 +84830 -1.000000 +84831 -1.000000 +84833 -1.000000 +84834 -1.000000 +84835 -1.000000 +84836 -1.000000 +84840 -1.000000 +84842 -1.000000 +84843 -1.000000 +84844 -1.000000 +84845 -1.000000 +84847 -1.000000 +84848 -1.000000 +84849 -1.000000 +84850 -1.000000 +84851 -1.000000 +84852 -1.000000 +84854 -1.000000 +84855 -1.000000 +84856 -1.000000 +84859 -1.000000 +84863 -1.000000 +84864 -1.000000 +84866 -1.000000 +84868 -1.000000 +84871 -1.000000 +84872 -1.000000 +84873 -1.000000 +84874 -1.000000 +84875 -1.000000 +84876 -1.000000 +84877 -1.000000 +84879 -1.000000 +84880 -1.000000 +84881 -1.000000 +84882 -1.000000 +84883 -1.000000 +84884 -1.000000 +84889 -1.000000 +84890 -1.000000 +84892 -1.000000 +84895 -1.000000 +84896 -1.000000 +84897 -1.000000 +84900 -1.000000 +84902 -1.000000 +84903 -1.000000 +84904 -1.000000 +84905 -1.000000 +84906 -1.000000 +84907 -1.000000 +84908 -1.000000 +84909 -1.000000 +84910 -1.000000 +84911 -1.000000 +84913 -1.000000 +84914 -1.000000 +84915 -1.000000 +84916 -1.000000 +84917 -1.000000 +84918 -1.000000 +84919 -1.000000 +84920 -1.000000 +84921 -1.000000 +84922 -1.000000 +84923 -1.000000 +84924 -1.000000 +84925 -1.000000 +84926 -1.000000 +84927 -1.000000 +84928 -1.000000 +84929 -1.000000 +84930 -1.000000 +84931 -1.000000 +84932 -1.000000 +84934 -1.000000 +84936 -1.000000 +84938 -1.000000 +84939 -1.000000 +84940 -1.000000 +84941 -1.000000 +84944 -1.000000 +84945 -1.000000 +84948 -1.000000 +84949 -1.000000 +84951 -1.000000 +84952 -1.000000 +84953 -1.000000 +84954 -1.000000 +84956 -1.000000 +84958 -1.000000 +84959 -1.000000 +84961 -1.000000 +84963 -1.000000 +84964 -1.000000 +84966 -1.000000 +84967 -1.000000 +84968 -1.000000 +84969 -1.000000 +84970 -1.000000 +84971 -1.000000 +84972 -1.000000 +84973 -1.000000 +84974 -1.000000 +84975 -1.000000 +84976 -1.000000 +84977 -1.000000 +84978 -1.000000 +84979 -1.000000 +84980 -1.000000 +84981 -1.000000 +84982 -1.000000 +84992 -1.000000 +84997 -1.000000 +85001 -1.000000 +85002 -1.000000 +85003 -1.000000 +85004 -1.000000 +85006 -1.000000 +85007 -1.000000 +85008 -1.000000 +85009 -1.000000 +85010 -1.000000 +85011 -1.000000 +85012 -1.000000 +85014 -1.000000 +85015 -1.000000 +85016 -1.000000 +85017 -1.000000 +85018 -1.000000 +85022 -1.000000 +85023 -1.000000 +85025 -1.000000 +85026 -1.000000 +85028 -1.000000 +85029 -1.000000 +85030 -1.000000 +85031 -1.000000 +85032 -1.000000 +85034 -1.000000 +85035 -1.000000 +85036 -1.000000 +85037 -1.000000 +85038 -1.000000 +85039 -1.000000 +85040 -1.000000 +85041 -1.000000 +85042 -1.000000 +85043 -1.000000 +85044 -1.000000 +85045 -1.000000 +85046 -1.000000 +85047 -1.000000 +85049 -1.000000 +85050 -1.000000 +85051 -1.000000 +85052 -1.000000 +85054 -1.000000 +85056 -1.000000 +85057 -1.000000 +85059 -1.000000 +85063 -1.000000 +85064 -1.000000 +85065 -1.000000 +85066 -1.000000 +85068 -1.000000 +85069 -1.000000 +85075 -1.000000 +85079 -1.000000 +85080 -1.000000 +85081 -1.000000 +85082 -1.000000 +85083 -1.000000 +85084 -1.000000 +85085 -1.000000 +85086 -1.000000 +85087 -1.000000 +85088 -1.000000 +85089 -1.000000 +85090 -1.000000 +85091 -1.000000 +85092 -1.000000 +85093 -1.000000 +85094 -1.000000 +85095 -1.000000 +85096 -1.000000 +85097 -1.000000 +85098 -1.000000 +85099 -1.000000 +85100 -1.000000 +85101 -1.000000 +85102 -1.000000 +85105 -1.000000 +85107 -1.000000 +85109 -1.000000 +85110 -1.000000 +85111 -1.000000 +85112 -1.000000 +85113 -1.000000 +85114 -1.000000 +85115 -1.000000 +85116 -1.000000 +85117 -1.000000 +85118 -1.000000 +85119 -1.000000 +85120 -1.000000 +85121 -1.000000 +85122 -1.000000 +85123 -1.000000 +85124 -1.000000 +85125 -1.000000 +85126 -1.000000 +85127 -1.000000 +85128 -1.000000 +85129 -1.000000 +85130 -1.000000 +85131 -1.000000 +85132 -1.000000 +85133 -1.000000 +85134 -1.000000 +85135 -1.000000 +85136 -1.000000 +85137 -1.000000 +85138 -1.000000 +85139 -1.000000 +85140 -1.000000 +85141 -1.000000 +85142 -1.000000 +85143 -1.000000 +85144 -1.000000 +85145 -1.000000 +85146 -1.000000 +85147 -1.000000 +85148 -1.000000 +85149 -1.000000 +85150 -1.000000 +85151 -1.000000 +85152 -1.000000 +85153 -1.000000 +85154 -1.000000 +85155 -1.000000 +85156 -1.000000 +85157 -1.000000 +85158 -1.000000 +85159 -1.000000 +85160 -1.000000 +85161 -1.000000 +85163 -1.000000 +85166 -1.000000 +85167 -1.000000 +85169 -1.000000 +85172 -1.000000 +85173 -1.000000 +85174 -1.000000 +85175 -1.000000 +85178 -1.000000 +85180 -1.000000 +85181 -1.000000 +85183 -1.000000 +85184 -1.000000 +85186 -1.000000 +85194 -1.000000 +85195 -1.000000 +85196 -1.000000 +85197 -1.000000 +85198 -1.000000 +85199 -1.000000 +85201 -1.000000 +85203 -1.000000 +85205 -1.000000 +85206 -1.000000 +85207 -1.000000 +85208 -1.000000 +85209 -1.000000 +85213 -1.000000 +85214 -1.000000 +85215 -1.000000 +85216 -1.000000 +85217 -1.000000 +85218 -1.000000 +85219 -1.000000 +85220 -1.000000 +85221 -1.000000 +85223 -1.000000 +85224 -1.000000 +85225 -1.000000 +85226 -1.000000 +85227 -1.000000 +85228 -1.000000 +85230 -1.000000 +85231 -1.000000 +85232 -1.000000 +85233 -1.000000 +85234 -1.000000 +85235 -1.000000 +85237 -1.000000 +85242 -1.000000 +85243 -1.000000 +85244 -1.000000 +85245 -1.000000 +85246 -1.000000 +85247 -1.000000 +85248 -1.000000 +85249 -1.000000 +85250 -1.000000 +85254 -1.000000 +85255 -1.000000 +85256 -1.000000 +85260 -1.000000 +85261 -1.000000 +85262 -1.000000 +85263 -1.000000 +85264 -1.000000 +85265 -1.000000 +85266 -1.000000 +85268 -1.000000 +85269 -1.000000 +85270 -1.000000 +85271 -1.000000 +85272 -1.000000 +85273 -1.000000 +85274 -1.000000 +85276 -1.000000 +85277 -1.000000 +85278 -1.000000 +85279 -1.000000 +85280 -1.000000 +85281 -1.000000 +85282 -1.000000 +85283 -1.000000 +85284 -1.000000 +85288 -1.000000 +85289 -1.000000 +85296 -1.000000 +85297 -1.000000 +85298 -1.000000 +85299 -1.000000 +85301 -1.000000 +85302 -1.000000 +85303 -1.000000 +85304 -1.000000 +85305 -1.000000 +85306 -1.000000 +85307 -1.000000 +85308 -1.000000 +85309 -1.000000 +85310 -1.000000 +85311 -1.000000 +85312 -1.000000 +85313 -1.000000 +85314 -1.000000 +85315 -1.000000 +85316 -1.000000 +85319 -1.000000 +85320 -1.000000 +85321 -1.000000 +85322 -1.000000 +85323 -1.000000 +85324 -1.000000 +85325 -1.000000 +85326 -1.000000 +85327 -1.000000 +85328 -1.000000 +85329 -1.000000 +85330 -1.000000 +85331 -1.000000 +85332 -1.000000 +85333 -1.000000 +85334 -1.000000 +85335 -1.000000 +85336 -1.000000 +85337 -1.000000 +85338 -1.000000 +85339 -1.000000 +85340 -1.000000 +85341 -1.000000 +85342 -1.000000 +85343 -1.000000 +85344 -1.000000 +85345 -1.000000 +85346 -1.000000 +85347 -1.000000 +85348 -1.000000 +85349 -1.000000 +85350 -1.000000 +85351 -1.000000 +85352 -1.000000 +85353 -1.000000 +85354 -1.000000 +85355 -1.000000 +85356 -1.000000 +85357 -1.000000 +85358 -1.000000 +85361 -1.000000 +85364 -1.000000 +85365 -1.000000 +85366 -1.000000 +85367 -1.000000 +85368 -1.000000 +85369 -1.000000 +85370 -1.000000 +85371 -1.000000 +85372 -1.000000 +85373 -1.000000 +85374 -1.000000 +85375 -1.000000 +85376 -1.000000 +85378 -1.000000 +85380 -1.000000 +85381 -1.000000 +85388 -1.000000 +85389 -1.000000 +85391 -1.000000 +85392 -1.000000 +85393 -1.000000 +85394 -1.000000 +85398 -1.000000 +85399 -1.000000 +85400 -1.000000 +85402 -1.000000 +85403 -1.000000 +85405 -1.000000 +85406 -1.000000 +85407 -1.000000 +85412 -1.000000 +85415 -1.000000 +85416 -1.000000 +85418 -1.000000 +85419 -1.000000 +85420 -1.000000 +85423 -1.000000 +85425 -1.000000 +85428 -1.000000 +85431 -1.000000 +85432 -1.000000 +85433 -1.000000 +85435 -1.000000 +85436 -1.000000 +85437 -1.000000 +85438 -1.000000 +85439 -1.000000 +85441 -1.000000 +85444 -1.000000 +85458 -1.000000 +85459 -1.000000 +85461 -1.000000 +85462 -1.000000 +85463 -1.000000 +85464 -1.000000 +85465 -1.000000 +85466 -1.000000 +85468 -1.000000 +85469 -1.000000 +85470 -1.000000 +85471 -1.000000 +85474 -1.000000 +85475 -1.000000 +85476 -1.000000 +85477 -1.000000 +85478 -1.000000 +85479 -1.000000 +85480 -1.000000 +85481 -1.000000 +85485 -1.000000 +85486 -1.000000 +85487 -1.000000 +85488 -1.000000 +85489 -1.000000 +85490 -1.000000 +85491 -1.000000 +85492 -1.000000 +85493 -1.000000 +85494 -1.000000 +85495 -1.000000 +85496 -1.000000 +85497 -1.000000 +85498 -1.000000 +85499 -1.000000 +85500 -1.000000 +85501 -1.000000 +85502 -1.000000 +85503 -1.000000 +85504 -1.000000 +85505 -1.000000 +85506 -1.000000 +85507 -1.000000 +85508 -1.000000 +85509 -1.000000 +85510 -1.000000 +85511 -1.000000 +85512 -1.000000 +85513 -1.000000 +85514 -1.000000 +85515 -1.000000 +85516 -1.000000 +85517 -1.000000 +85518 -1.000000 +85519 -1.000000 +85520 -1.000000 +85521 -1.000000 +85522 -1.000000 +85523 -1.000000 +85524 -1.000000 +85525 -1.000000 +85526 -1.000000 +85527 -1.000000 +85528 -1.000000 +85529 -1.000000 +85530 -1.000000 +85531 -1.000000 +85532 -1.000000 +85533 -1.000000 +85534 -1.000000 +85535 -1.000000 +85536 -1.000000 +85537 -1.000000 +85538 -1.000000 +85539 -1.000000 +85540 -1.000000 +85541 -1.000000 +85542 -1.000000 +85543 -1.000000 +85544 -1.000000 +85545 -1.000000 +85546 -1.000000 +85547 -1.000000 +85548 -1.000000 +85549 -1.000000 +85550 -1.000000 +85552 -1.000000 +85553 -1.000000 +85555 -1.000000 +85556 -1.000000 +85557 -1.000000 +85558 -1.000000 +85559 -1.000000 +85560 -1.000000 +85561 -1.000000 +85562 -1.000000 +85563 -1.000000 +85564 -1.000000 +85565 -1.000000 +85566 -1.000000 +85567 -1.000000 +85568 -1.000000 +85569 -1.000000 +85570 -1.000000 +85571 -1.000000 +85572 -1.000000 +85573 -1.000000 +85574 -1.000000 +85575 -1.000000 +85576 -1.000000 +85577 -1.000000 +85578 -1.000000 +85579 -1.000000 +85580 -1.000000 +85581 -1.000000 +85582 -1.000000 +85583 -1.000000 +85584 -1.000000 +85585 -1.000000 +85586 -1.000000 +85587 -1.000000 +85588 -1.000000 +85589 -1.000000 +85590 -1.000000 +85591 -1.000000 +85592 -1.000000 +85594 -1.000000 +85595 -1.000000 +85596 -1.000000 +85597 -1.000000 +85598 -1.000000 +85599 -1.000000 +85600 -1.000000 +85601 -1.000000 +85602 -1.000000 +85604 -1.000000 +85606 -1.000000 +85607 -1.000000 +85608 -1.000000 +85609 -1.000000 +85610 -1.000000 +85611 -1.000000 +85612 -1.000000 +85613 -1.000000 +85614 -1.000000 +85615 -1.000000 +85616 -1.000000 +85617 -1.000000 +85618 -1.000000 +85619 -1.000000 +85620 -1.000000 +85621 -1.000000 +85622 -1.000000 +85623 -1.000000 +85624 -1.000000 +85625 -1.000000 +85626 -1.000000 +85627 -1.000000 +85628 -1.000000 +85629 -1.000000 +85630 -1.000000 +85631 -1.000000 +85632 -1.000000 +85633 -1.000000 +85634 -1.000000 +85635 -1.000000 +85636 -1.000000 +85637 -1.000000 +85638 -1.000000 +85639 -1.000000 +85640 -1.000000 +85641 -1.000000 +85642 -1.000000 +85644 -1.000000 +85645 -1.000000 +85646 -1.000000 +85647 -1.000000 +85648 -1.000000 +85649 -1.000000 +85650 -1.000000 +85651 -1.000000 +85652 -1.000000 +85653 -1.000000 +85654 -1.000000 +85655 -1.000000 +85656 -1.000000 +85657 -1.000000 +85658 -1.000000 +85659 -1.000000 +85660 -1.000000 +85661 -1.000000 +85662 -1.000000 +85663 -1.000000 +85664 -1.000000 +85665 -1.000000 +85666 -1.000000 +85667 -1.000000 +85668 -1.000000 +85670 -1.000000 +85671 -1.000000 +85672 -1.000000 +85673 -1.000000 +85676 -1.000000 +85677 -1.000000 +85678 -1.000000 +85679 -1.000000 +85680 -1.000000 +85681 -1.000000 +85682 -1.000000 +85683 -1.000000 +85684 -1.000000 +85685 -1.000000 +85686 -1.000000 +85687 -1.000000 +85688 -1.000000 +85689 -1.000000 +85690 -1.000000 +85691 -1.000000 +85692 -1.000000 +85693 -1.000000 +85694 -1.000000 +85695 -1.000000 +85696 -1.000000 +85697 -1.000000 +85698 -1.000000 +85699 -1.000000 +85700 -1.000000 +85701 -1.000000 +85702 -1.000000 +85703 -1.000000 +85704 -1.000000 +85705 -1.000000 +85706 -1.000000 +85707 -1.000000 +85708 -1.000000 +85709 -1.000000 +85710 -1.000000 +85711 -1.000000 +85712 -1.000000 +85713 -1.000000 +85714 -1.000000 +85715 -1.000000 +85716 -1.000000 +85717 -1.000000 +85718 -1.000000 +85719 -1.000000 +85721 -1.000000 +85723 -1.000000 +85724 -1.000000 +85725 -1.000000 +85726 -1.000000 +85728 -1.000000 +85729 -1.000000 +85730 -1.000000 +85731 -1.000000 +85732 -1.000000 +85733 -1.000000 +85734 -1.000000 +85735 -1.000000 +85736 -1.000000 +85737 -1.000000 +85738 -1.000000 +85739 -1.000000 +85740 -1.000000 +85741 -1.000000 +85742 -1.000000 +85743 -1.000000 +85744 -1.000000 +85745 -1.000000 +85746 -1.000000 +85747 -1.000000 +85748 -1.000000 +85749 -1.000000 +85750 -1.000000 +85751 -1.000000 +85752 -1.000000 +85754 -1.000000 +85755 -1.000000 +85756 -1.000000 +85757 -1.000000 +85758 -1.000000 +85759 -1.000000 +85760 -1.000000 +85761 -1.000000 +85762 -1.000000 +85764 -1.000000 +85765 -1.000000 +85766 -1.000000 +85768 -1.000000 +85769 -1.000000 +85770 -1.000000 +85772 -1.000000 +85773 -1.000000 +85775 -1.000000 +85776 -1.000000 +85777 -1.000000 +85781 -1.000000 +85782 -1.000000 +85783 -1.000000 +85784 -1.000000 +85785 -1.000000 +85786 -1.000000 +85787 -1.000000 +85788 -1.000000 +85789 -1.000000 +85790 -1.000000 +85791 -1.000000 +85793 -1.000000 +85794 -1.000000 +85795 -1.000000 +85796 -1.000000 +85797 -1.000000 +85798 -1.000000 +85799 -1.000000 +85800 -1.000000 +85802 -1.000000 +85810 -1.000000 +85811 -1.000000 +85812 -1.000000 +85813 -1.000000 +85814 -1.000000 +85815 -1.000000 +85816 -1.000000 +85817 -1.000000 +85818 -1.000000 +85819 -1.000000 +85820 -1.000000 +85821 -1.000000 +85822 -1.000000 +85826 -1.000000 +85827 -1.000000 +85828 -1.000000 +85829 -1.000000 +85830 -1.000000 +85831 -1.000000 +85832 -1.000000 +85833 -1.000000 +85834 -1.000000 +85835 -1.000000 +85836 -1.000000 +85837 -1.000000 +85838 -1.000000 +85839 -1.000000 +85840 -1.000000 +85841 -1.000000 +85842 -1.000000 +85844 -1.000000 +85845 -1.000000 +85846 -1.000000 +85847 -1.000000 +85849 -1.000000 +85850 -1.000000 +85851 -1.000000 +85852 -1.000000 +85853 -1.000000 +85854 -1.000000 +85855 -1.000000 +85856 -1.000000 +85859 -1.000000 +85860 -1.000000 +85862 -1.000000 +85863 -1.000000 +85864 -1.000000 +85866 -1.000000 +85868 -1.000000 +85870 -1.000000 +85871 -1.000000 +85872 -1.000000 +85873 -1.000000 +85874 -1.000000 +85875 -1.000000 +85876 -1.000000 +85877 -1.000000 +85878 -1.000000 +85879 -1.000000 +85880 -1.000000 +85881 -1.000000 +85884 -1.000000 +85885 -1.000000 +85886 -1.000000 +85887 -1.000000 +85889 -1.000000 +85890 -1.000000 +85891 -1.000000 +85892 -1.000000 +85893 -1.000000 +85894 -1.000000 +85895 -1.000000 +85896 -1.000000 +85897 -1.000000 +85898 -1.000000 +85899 -1.000000 +85900 -1.000000 +85901 -1.000000 +85902 -1.000000 +85903 -1.000000 +85904 -1.000000 +85905 -1.000000 +85906 -1.000000 +85907 -1.000000 +85908 -1.000000 +85909 -1.000000 +85910 -1.000000 +85911 -1.000000 +85912 -1.000000 +85913 -1.000000 +85914 -1.000000 +85915 -1.000000 +85916 -1.000000 +85917 -1.000000 +85918 -1.000000 +85919 -1.000000 +85920 -1.000000 +85921 -1.000000 +85922 -1.000000 +85923 -1.000000 +85924 -1.000000 +85926 -1.000000 +85927 -1.000000 +85928 -1.000000 +85929 -1.000000 +85930 -1.000000 +85931 -1.000000 +85932 -1.000000 +85933 -1.000000 +85934 -1.000000 +85935 -1.000000 +85936 -1.000000 +85937 -1.000000 +85945 -1.000000 +85949 -1.000000 +85950 -1.000000 +85951 -1.000000 +85952 -1.000000 +85953 -1.000000 +85954 -1.000000 +85955 -1.000000 +85956 -1.000000 +85957 -1.000000 +85960 -1.000000 +85961 -1.000000 +85962 -1.000000 +85963 -1.000000 +85965 -1.000000 +85966 -1.000000 +85979 -1.000000 +85980 -1.000000 +85981 -1.000000 +85982 -1.000000 +85983 -1.000000 +85984 -1.000000 +85985 -1.000000 +85986 -1.000000 +85987 -1.000000 +85988 -1.000000 +85989 -1.000000 +85990 -1.000000 +85991 -1.000000 +85992 -1.000000 +85993 -1.000000 +85994 -1.000000 +85995 -1.000000 +85996 -1.000000 +85997 -1.000000 +85998 -1.000000 +85999 -1.000000 +86000 -1.000000 +86001 -1.000000 +86002 -1.000000 +86003 -1.000000 +86004 -1.000000 +86005 -1.000000 +86006 -1.000000 +86007 -1.000000 +86008 -1.000000 +86009 -1.000000 +86010 -1.000000 +86011 -1.000000 +86012 -1.000000 +86013 -1.000000 +86014 -1.000000 +86015 -1.000000 +86016 -1.000000 +86017 -1.000000 +86018 -1.000000 +86019 -1.000000 +86020 -1.000000 +86021 -1.000000 +86022 -1.000000 +86023 -1.000000 +86024 -1.000000 +86025 -1.000000 +86026 -1.000000 +86027 -1.000000 +86028 -1.000000 +86029 -1.000000 +86030 -1.000000 +86031 -1.000000 +86032 -1.000000 +86033 -1.000000 +86034 -1.000000 +86035 -1.000000 +86036 -1.000000 +86037 -1.000000 +86038 -1.000000 +86039 -1.000000 +86040 -1.000000 +86041 -1.000000 +86042 -1.000000 +86043 -1.000000 +86044 -1.000000 +86045 -1.000000 +86046 -1.000000 +86047 -1.000000 +86048 -1.000000 +86049 -1.000000 +86050 -1.000000 +86051 -1.000000 +86052 -1.000000 +86053 -1.000000 +86054 -1.000000 +86055 -1.000000 +86056 -1.000000 +86057 -1.000000 +86058 -1.000000 +86059 -1.000000 +86060 -1.000000 +86061 -1.000000 +86062 -1.000000 +86063 -1.000000 +86064 -1.000000 +86065 -1.000000 +86066 -1.000000 +86067 -1.000000 +86068 -1.000000 +86069 -1.000000 +86070 -1.000000 +86071 -1.000000 +86072 -1.000000 +86073 -1.000000 +86074 -1.000000 +86075 -1.000000 +86076 -1.000000 +86077 -1.000000 +86078 -1.000000 +86079 -1.000000 +86080 -1.000000 +86081 -1.000000 +86082 -1.000000 +86083 -1.000000 +86084 -1.000000 +86085 -1.000000 +86086 -1.000000 +86087 -1.000000 +86088 -1.000000 +86089 -1.000000 +86090 -1.000000 +86091 -1.000000 +86092 -1.000000 +86093 -1.000000 +86094 -1.000000 +86095 -1.000000 +86096 -1.000000 +86097 -1.000000 +86098 -1.000000 +86099 -1.000000 +86100 -1.000000 +86101 -1.000000 +86103 -1.000000 +86104 -1.000000 +86105 -1.000000 +86106 -1.000000 +86107 -1.000000 +86108 -1.000000 +86109 -1.000000 +86110 -1.000000 +86111 -1.000000 +86112 -1.000000 +86113 -1.000000 +86114 -1.000000 +86115 -1.000000 +86116 -1.000000 +86117 -1.000000 +86118 -1.000000 +86119 -1.000000 +86120 -1.000000 +86121 -1.000000 +86122 -1.000000 +86123 -1.000000 +86124 -1.000000 +86125 -1.000000 +86126 -1.000000 +86127 -1.000000 +86128 -1.000000 +86130 -1.000000 +86132 -1.000000 +86133 -1.000000 +86134 -1.000000 +86135 -1.000000 +86136 -1.000000 +86137 -1.000000 +86138 -1.000000 +86139 -1.000000 +86141 -1.000000 +86142 -1.000000 +86143 -1.000000 +86144 -1.000000 +86145 -1.000000 +86146 -1.000000 +86147 -1.000000 +86148 -1.000000 +86149 -1.000000 +86150 -1.000000 +86151 -1.000000 +86152 -1.000000 +86154 -1.000000 +86155 -1.000000 +86156 -1.000000 +86157 -1.000000 +86158 -1.000000 +86159 -1.000000 +86160 -1.000000 +86161 -1.000000 +86162 -1.000000 +86163 -1.000000 +86164 -1.000000 +86165 -1.000000 +86166 -1.000000 +86167 -1.000000 +86168 -1.000000 +86169 -1.000000 +86170 -1.000000 +86171 -1.000000 +86172 -1.000000 +86173 -1.000000 +86174 -1.000000 +86175 -1.000000 +86176 -1.000000 +86177 -1.000000 +86178 -1.000000 +86179 -1.000000 +86180 -1.000000 +86181 -1.000000 +86182 -1.000000 +86183 -1.000000 +86184 -1.000000 +86185 -1.000000 +86186 -1.000000 +86187 -1.000000 +86188 -1.000000 +86189 -1.000000 +86190 -1.000000 +86191 -1.000000 +86192 -1.000000 +86193 -1.000000 +86194 -1.000000 +86195 -1.000000 +86196 -1.000000 +86197 -1.000000 +86198 -1.000000 +86199 -1.000000 +86200 -1.000000 +86201 -1.000000 +86202 -1.000000 +86203 -1.000000 +86204 -1.000000 +86205 -1.000000 +86206 -1.000000 +86207 -1.000000 +86208 -1.000000 +86209 -1.000000 +86210 -1.000000 +86211 -1.000000 +86212 -1.000000 +86213 -1.000000 +86214 -1.000000 +86215 -1.000000 +86216 -1.000000 +86217 -1.000000 +86218 -1.000000 +86219 -1.000000 +86220 -1.000000 +86221 -1.000000 +86222 -1.000000 +86223 -1.000000 +86224 -1.000000 +86225 -1.000000 +86226 -1.000000 +86227 -1.000000 +86228 -1.000000 +86229 -1.000000 +86230 -1.000000 +86231 -1.000000 +86232 -1.000000 +86233 -1.000000 +86234 -1.000000 +86235 -1.000000 +86236 -1.000000 +86237 -1.000000 +86238 -1.000000 +86239 -1.000000 +86240 -1.000000 +86241 -1.000000 +86242 -1.000000 +86243 -1.000000 +86244 -1.000000 +86245 -1.000000 +86246 -1.000000 +86247 -1.000000 +86248 -1.000000 +86249 -1.000000 +86250 -1.000000 +86251 -1.000000 +86252 -1.000000 +86253 -1.000000 +86254 -1.000000 +86255 -1.000000 +86256 -1.000000 +86257 -1.000000 +86258 -1.000000 +86259 -1.000000 +86260 -1.000000 +86261 -1.000000 +86262 -1.000000 +86263 -1.000000 +86264 -1.000000 +86265 -1.000000 +86267 -1.000000 +86269 -1.000000 +86270 -1.000000 +86271 -1.000000 +86272 -1.000000 +86273 -1.000000 +86274 -1.000000 +86275 -1.000000 +86276 -1.000000 +86277 -1.000000 +86279 -1.000000 +86281 -1.000000 +86282 -1.000000 +86283 -1.000000 +86284 -1.000000 +86285 -1.000000 +86286 -1.000000 +86287 -1.000000 +86294 -1.000000 +86295 -1.000000 +86296 -1.000000 +86297 -1.000000 +86298 -1.000000 +86299 -1.000000 +86301 -1.000000 +86302 -1.000000 +86303 -1.000000 +86304 -1.000000 +86305 -1.000000 +86307 -1.000000 +86309 -1.000000 +86310 -1.000000 +86311 -1.000000 +86312 -1.000000 +86314 -1.000000 +86316 -1.000000 +86318 -1.000000 +86320 -1.000000 +86322 -1.000000 +86323 -1.000000 +86324 -1.000000 +86325 -1.000000 +86326 -1.000000 +86327 -1.000000 +86328 -1.000000 +86329 -1.000000 +86330 -1.000000 +86331 -1.000000 +86332 -1.000000 +86333 -1.000000 +86334 -1.000000 +86335 -1.000000 +86336 -1.000000 +86338 -1.000000 +86339 -1.000000 +86340 -1.000000 +86341 -1.000000 +86342 -1.000000 +86343 -1.000000 +86344 -1.000000 +86345 -1.000000 +86346 -1.000000 +86347 -1.000000 +86349 -1.000000 +86351 -1.000000 +86352 -1.000000 +86353 -1.000000 +86354 -1.000000 +86355 -1.000000 +86356 -1.000000 +86357 -1.000000 +86358 -1.000000 +86359 -1.000000 +86361 -1.000000 +86364 -1.000000 +86365 -1.000000 +86366 -1.000000 +86367 -1.000000 +86368 -1.000000 +86369 -1.000000 +86370 -1.000000 +86371 -1.000000 +86372 -1.000000 +86373 -1.000000 +86374 -1.000000 +86375 -1.000000 +86376 -1.000000 +86377 -1.000000 +86379 -1.000000 +86380 -1.000000 +86382 -1.000000 +86384 -1.000000 +86385 -1.000000 +86386 -1.000000 +86387 -1.000000 +86388 -1.000000 +86389 -1.000000 +86390 -1.000000 +86391 -1.000000 +86392 -1.000000 +86393 -1.000000 +86394 -1.000000 +86395 -1.000000 +86396 -1.000000 +86397 -1.000000 +86398 -1.000000 +86399 -1.000000 +86400 -1.000000 +86401 -1.000000 +86402 -1.000000 +86403 -1.000000 +86404 -1.000000 +86405 -1.000000 +86406 -1.000000 +86407 -1.000000 +86409 -1.000000 +86410 -1.000000 +86411 -1.000000 +86412 -1.000000 +86413 -1.000000 +86414 -1.000000 +86416 -1.000000 +86417 -1.000000 +86418 -1.000000 +86419 -1.000000 +86420 -1.000000 +86421 -1.000000 +86422 -1.000000 +86423 -1.000000 +86424 -1.000000 +86425 -1.000000 +86427 -1.000000 +86428 -1.000000 +86429 -1.000000 +86431 -1.000000 +86432 -1.000000 +86433 -1.000000 +86434 -1.000000 +86435 -1.000000 +86436 -1.000000 +86437 -1.000000 +86438 -1.000000 +86439 -1.000000 +86440 -1.000000 +86441 -1.000000 +86442 -1.000000 +86443 -1.000000 +86444 -1.000000 +86445 -1.000000 +86447 -1.000000 +86450 -1.000000 +86451 -1.000000 +86452 -1.000000 +86453 -1.000000 +86454 -1.000000 +86456 -1.000000 +86457 -1.000000 +86458 -1.000000 +86459 -1.000000 +86460 -1.000000 +86461 -1.000000 +86462 -1.000000 +86463 -1.000000 +86464 -1.000000 +86465 -1.000000 +86466 -1.000000 +86469 -1.000000 +86470 -1.000000 +86471 -1.000000 +86472 -1.000000 +86473 -1.000000 +86474 -1.000000 +86475 -1.000000 +86476 -1.000000 +86477 -1.000000 +86478 -1.000000 +86479 -1.000000 +86480 -1.000000 +86481 -1.000000 +86482 -1.000000 +86483 -1.000000 +86484 -1.000000 +86485 -1.000000 +86486 -1.000000 +86487 -1.000000 +86488 -1.000000 +86489 -1.000000 +86490 -1.000000 +86491 -1.000000 +86492 -1.000000 +86493 -1.000000 +86494 -1.000000 +86495 -1.000000 +86496 -1.000000 +86497 -1.000000 +86498 -1.000000 +86499 -1.000000 +86500 -1.000000 +86501 -1.000000 +86502 -1.000000 +86503 -1.000000 +86504 -1.000000 +86505 -1.000000 +86506 -1.000000 +86507 -1.000000 +86508 -1.000000 +86509 -1.000000 +86510 -1.000000 +86511 -1.000000 +86512 -1.000000 +86513 -1.000000 +86514 -1.000000 +86515 -1.000000 +86516 -1.000000 +86517 -1.000000 +86518 -1.000000 +86519 -1.000000 +86520 -1.000000 +86521 -1.000000 +86522 -1.000000 +86526 -1.000000 +86528 -1.000000 +86529 -1.000000 +86530 -1.000000 +86531 -1.000000 +86532 -1.000000 +86533 -1.000000 +86535 -1.000000 +86536 -1.000000 +86537 -1.000000 +86538 -1.000000 +86539 -1.000000 +86540 -1.000000 +86541 -1.000000 +86543 -1.000000 +86546 -1.000000 +86547 -1.000000 +86548 -1.000000 +86549 -1.000000 +86551 -1.000000 +86552 -1.000000 +86555 -1.000000 +86556 -1.000000 +86557 -1.000000 +86560 -1.000000 +86561 -1.000000 +86563 -1.000000 +86564 -1.000000 +86565 -1.000000 +86566 -1.000000 +86567 -1.000000 +86568 -1.000000 +86569 -1.000000 +86570 -1.000000 +86571 -1.000000 +86572 -1.000000 +86573 -1.000000 +86574 -1.000000 +86575 -1.000000 +86576 -1.000000 +86577 -1.000000 +86578 -1.000000 +86579 -1.000000 +86581 -1.000000 +86584 -1.000000 +86589 -1.000000 +86590 -1.000000 +86593 -1.000000 +86594 -1.000000 +86595 -1.000000 +86596 -1.000000 +86597 -1.000000 +86598 -1.000000 +86599 -1.000000 +86600 -1.000000 +86605 -1.000000 +86606 -1.000000 +86607 -1.000000 +86609 -1.000000 +86610 -1.000000 +86611 -1.000000 +86612 -1.000000 +86613 -1.000000 +86616 -1.000000 +86618 -1.000000 +86621 -1.000000 +86623 -1.000000 +86625 -1.000000 +86631 -1.000000 +86633 -1.000000 +86634 -1.000000 +86637 -1.000000 +86638 -1.000000 +86639 -1.000000 +86640 -1.000000 +86641 -1.000000 +86642 -1.000000 +86643 -1.000000 +86645 -1.000000 +86647 -1.000000 +86648 -1.000000 +86649 -1.000000 +86650 -1.000000 +86651 -1.000000 +86652 -1.000000 +86653 -1.000000 +86654 -1.000000 +86656 -1.000000 +86657 -1.000000 +86662 -1.000000 +86663 -1.000000 +86665 -1.000000 +86666 -1.000000 +86667 -1.000000 +86668 -1.000000 +86669 -1.000000 +86671 -1.000000 +86672 -1.000000 +86673 -1.000000 +86675 -1.000000 +86676 -1.000000 +86677 -1.000000 +86679 -1.000000 +86680 -1.000000 +86681 -1.000000 +86682 -1.000000 +86683 -1.000000 +86684 -1.000000 +86685 -1.000000 +86687 -1.000000 +86689 -1.000000 +86690 -1.000000 +86697 -1.000000 +86700 -1.000000 +86703 -1.000000 +86704 -1.000000 +86705 -1.000000 +86706 -1.000000 +86707 -1.000000 +86708 -1.000000 +86709 -1.000000 +86710 -1.000000 +86711 -1.000000 +86713 -1.000000 +86715 -1.000000 +86717 -1.000000 +86718 -1.000000 +86719 -1.000000 +86720 -1.000000 +86723 -1.000000 +86724 -1.000000 +86725 -1.000000 +86727 -1.000000 +86728 -1.000000 +86729 -1.000000 +86730 -1.000000 +86731 -1.000000 +86732 -1.000000 +86733 -1.000000 +86734 -1.000000 +86735 -1.000000 +86736 -1.000000 +86737 -1.000000 +86738 -1.000000 +86739 -1.000000 +86740 -1.000000 +86741 -1.000000 +86742 -1.000000 +86743 -1.000000 +86744 -1.000000 +86745 -1.000000 +86746 -1.000000 +86747 -1.000000 +86748 -1.000000 +86749 -1.000000 +86751 -1.000000 +86752 -1.000000 +86753 -1.000000 +86754 -1.000000 +86755 -1.000000 +86756 -1.000000 +86757 -1.000000 +86758 -1.000000 +86759 -1.000000 +86760 -1.000000 +86761 -1.000000 +86762 -1.000000 +86763 -1.000000 +86764 -1.000000 +86765 -1.000000 +86766 -1.000000 +86767 -1.000000 +86768 -1.000000 +86769 -1.000000 +86770 -1.000000 +86771 -1.000000 +86772 -1.000000 +86773 -1.000000 +86774 -1.000000 +86775 -1.000000 +86778 -1.000000 +86779 -1.000000 +86780 -1.000000 +86781 -1.000000 +86782 -1.000000 +86783 -1.000000 +86784 -1.000000 +86785 -1.000000 +86786 -1.000000 +86787 -1.000000 +86788 -1.000000 +86789 -1.000000 +86790 -1.000000 +86791 -1.000000 +86792 -1.000000 +86794 -1.000000 +86795 -1.000000 +86797 -1.000000 +86800 -1.000000 +86803 -1.000000 +86804 -1.000000 +86805 -1.000000 +86806 -1.000000 +86807 -1.000000 +86808 -1.000000 +86809 -1.000000 +86810 -1.000000 +86811 -1.000000 +86812 -1.000000 +86813 -1.000000 +86814 -1.000000 +86815 -1.000000 +86816 -1.000000 +86817 -1.000000 +86818 -1.000000 +86820 -1.000000 +86821 -1.000000 +86822 -1.000000 +86823 -1.000000 +86824 -1.000000 +86825 -1.000000 +86827 -1.000000 +86828 -1.000000 +86829 -1.000000 +86830 -1.000000 +86831 -1.000000 +86833 -1.000000 +86834 -1.000000 +86835 -1.000000 +86837 -1.000000 +86838 -1.000000 +86839 -1.000000 +86840 -1.000000 +86841 -1.000000 +86842 -1.000000 +86843 -1.000000 +86844 -1.000000 +86846 -1.000000 +86847 -1.000000 +86849 -1.000000 +86850 -1.000000 +86851 -1.000000 +86852 -1.000000 +86853 -1.000000 +86854 -1.000000 +86862 -1.000000 +86868 -1.000000 +86869 -1.000000 +86870 -1.000000 +86872 -1.000000 +86873 -1.000000 +86876 -1.000000 +86888 -1.000000 +86890 -1.000000 +86891 -1.000000 +86892 -1.000000 +86893 -1.000000 +86895 -1.000000 +86897 -1.000000 +86900 -1.000000 +86901 -1.000000 +86902 -1.000000 +86903 -1.000000 +86905 -1.000000 +86906 -1.000000 +86907 -1.000000 +86908 -1.000000 +86909 -1.000000 +86910 -1.000000 +86912 -1.000000 +86913 -1.000000 +86915 -1.000000 +86917 -1.000000 +86918 -1.000000 +86919 -1.000000 +86921 -1.000000 +86922 -1.000000 +86923 -1.000000 +86928 -1.000000 +86930 -1.000000 +86931 -1.000000 +86932 -1.000000 +86934 -1.000000 +86936 -1.000000 +86941 -1.000000 +86942 -1.000000 +86943 -1.000000 +86944 -1.000000 +86945 -1.000000 +86946 -1.000000 +86947 -1.000000 +86948 -1.000000 +86950 -1.000000 +86952 -1.000000 +86954 -1.000000 +86955 -1.000000 +86957 -1.000000 +86958 -1.000000 +86960 -1.000000 +86962 -1.000000 +86963 -1.000000 +86964 -1.000000 +86965 -1.000000 +86966 -1.000000 +86967 -1.000000 +86968 -1.000000 +86970 -1.000000 +86971 -1.000000 +86972 -1.000000 +86973 -1.000000 +86974 -1.000000 +86975 -1.000000 +86976 -1.000000 +86977 -1.000000 +86978 -1.000000 +86979 -1.000000 +86980 -1.000000 +86981 -1.000000 +86982 -1.000000 +86983 -1.000000 +86984 -1.000000 +86985 -1.000000 +86987 -1.000000 +86988 -1.000000 +86989 -1.000000 +86990 -1.000000 +86992 -1.000000 +86994 -1.000000 +86995 -1.000000 +86996 -1.000000 +86997 -1.000000 +86998 -1.000000 +86999 -1.000000 +87000 -1.000000 +87001 -1.000000 +87002 -1.000000 +87003 -1.000000 +87004 -1.000000 +87005 -1.000000 +87006 -1.000000 +87007 -1.000000 +87009 -1.000000 +87010 -1.000000 +87012 -1.000000 +87013 -1.000000 +87016 -1.000000 +87017 -1.000000 +87018 -1.000000 +87019 -1.000000 +87020 -1.000000 +87021 -1.000000 +87022 -1.000000 +87024 -1.000000 +87028 -1.000000 +87029 -1.000000 +87030 -1.000000 +87031 -1.000000 +87032 -1.000000 +87033 -1.000000 +87034 -1.000000 +87035 -1.000000 +87036 -1.000000 +87037 -1.000000 +87038 -1.000000 +87039 -1.000000 +87041 -1.000000 +87042 -1.000000 +87044 -1.000000 +87045 -1.000000 +87046 -1.000000 +87047 -1.000000 +87048 -1.000000 +87049 -1.000000 +87052 -1.000000 +87053 -1.000000 +87054 -1.000000 +87055 -1.000000 +87057 -1.000000 +87058 -1.000000 +87059 -1.000000 +87060 -1.000000 +87062 -1.000000 +87063 -1.000000 +87064 -1.000000 +87067 -1.000000 +87069 -1.000000 +87070 -1.000000 +87071 -1.000000 +87072 -1.000000 +87073 -1.000000 +87075 -1.000000 +87076 -1.000000 +87077 -1.000000 +87078 -1.000000 +87079 -1.000000 +87080 -1.000000 +87081 -1.000000 +87082 -1.000000 +87083 -1.000000 +87084 -1.000000 +87085 -1.000000 +87086 -1.000000 +87087 -1.000000 +87088 -1.000000 +87089 -1.000000 +87090 -1.000000 +87091 -1.000000 +87092 -1.000000 +87093 -1.000000 +87094 -1.000000 +87095 -1.000000 +87096 -1.000000 +87097 -1.000000 +87098 -1.000000 +87099 -1.000000 +87100 -1.000000 +87102 -1.000000 +87103 -1.000000 +87104 -1.000000 +87105 -1.000000 +87106 -1.000000 +87107 -1.000000 +87108 -1.000000 +87109 -1.000000 +87110 -1.000000 +87111 -1.000000 +87112 -1.000000 +87113 -1.000000 +87114 -1.000000 +87115 -1.000000 +87116 -1.000000 +87117 -1.000000 +87118 -1.000000 +87120 -1.000000 +87121 -1.000000 +87122 -1.000000 +87123 -1.000000 +87124 -1.000000 +87137 -1.000000 +87139 -1.000000 +87140 -1.000000 +87141 -1.000000 +87143 -1.000000 +87144 -1.000000 +87145 -1.000000 +87157 -1.000000 +87158 -1.000000 +87159 -1.000000 +87160 -1.000000 +87161 -1.000000 +87162 -1.000000 +87163 -1.000000 +87164 -1.000000 +87165 -1.000000 +87166 -1.000000 +87167 -1.000000 +87168 -1.000000 +87169 -1.000000 +87170 -1.000000 +87172 -1.000000 +87173 -1.000000 +87174 -1.000000 +87176 -1.000000 +87177 -1.000000 +87178 -1.000000 +87179 -1.000000 +87180 -1.000000 +87181 -1.000000 +87182 -1.000000 +87183 -1.000000 +87185 -1.000000 +87186 -1.000000 +87187 -1.000000 +87188 -1.000000 +87190 -1.000000 +87191 -1.000000 +87192 -1.000000 +87193 -1.000000 +87194 -1.000000 +87195 -1.000000 +87196 -1.000000 +87199 -1.000000 +87200 -1.000000 +87206 -1.000000 +87207 -1.000000 +87208 -1.000000 +87215 -1.000000 +87217 -1.000000 +87218 -1.000000 +87220 -1.000000 +87221 -1.000000 +87224 -1.000000 +87225 -1.000000 +87227 -1.000000 +87229 -1.000000 +87230 -1.000000 +87231 -1.000000 +87233 -1.000000 +87234 -1.000000 +87235 -1.000000 +87236 -1.000000 +87237 -1.000000 +87238 -1.000000 +87239 -1.000000 +87240 -1.000000 +87241 -1.000000 +87242 -1.000000 +87245 -1.000000 +87246 -1.000000 +87247 -1.000000 +87249 -1.000000 +87250 -1.000000 +87251 -1.000000 +87252 -1.000000 +87256 -1.000000 +87257 -1.000000 +87258 -1.000000 +87259 -1.000000 +87260 -1.000000 +87261 -1.000000 +87262 -1.000000 +87263 -1.000000 +87264 -1.000000 +87265 -1.000000 +87266 -1.000000 +87267 -1.000000 +87269 -1.000000 +87270 -1.000000 +87271 -1.000000 +87272 -1.000000 +87273 -1.000000 +87274 -1.000000 +87275 -1.000000 +87276 -1.000000 +87277 -1.000000 +87278 -1.000000 +87279 -1.000000 +87280 -1.000000 +87281 -1.000000 +87282 -1.000000 +87283 -1.000000 +87284 -1.000000 +87285 -1.000000 +87286 -1.000000 +87288 -1.000000 +87289 -1.000000 +87290 -1.000000 +87291 -1.000000 +87292 -1.000000 +87294 -1.000000 +87295 -1.000000 +87297 -1.000000 +87298 -1.000000 +87301 -1.000000 +87302 -1.000000 +87303 -1.000000 +87304 -1.000000 +87307 -1.000000 +87308 -1.000000 +87309 -1.000000 +87310 -1.000000 +87311 -1.000000 +87312 -1.000000 +87313 -1.000000 +87314 -1.000000 +87315 -1.000000 +87316 -1.000000 +87317 -1.000000 +87319 -1.000000 +87320 -1.000000 +87321 -1.000000 +87322 -1.000000 +87323 -1.000000 +87324 -1.000000 +87327 -1.000000 +87330 -1.000000 +87331 -1.000000 +87332 -1.000000 +87333 -1.000000 +87335 -1.000000 +87336 -1.000000 +87337 -1.000000 +87338 -1.000000 +87339 -1.000000 +87340 -1.000000 +87341 -1.000000 +87342 -1.000000 +87343 -1.000000 +87344 -1.000000 +87345 -1.000000 +87346 -1.000000 +87347 -1.000000 +87348 -1.000000 +87349 -1.000000 +87350 -1.000000 +87351 -1.000000 +87352 -1.000000 +87353 -1.000000 +87354 -1.000000 +87357 -1.000000 +87359 -1.000000 +87360 -1.000000 +87361 -1.000000 +87362 -1.000000 +87363 -1.000000 +87364 -1.000000 +87365 -1.000000 +87366 -1.000000 +87367 -1.000000 +87368 -1.000000 +87369 -1.000000 +87370 -1.000000 +87371 -1.000000 +87372 -1.000000 +87373 -1.000000 +87374 -1.000000 +87375 -1.000000 +87376 -1.000000 +87378 -1.000000 +87379 -1.000000 +87380 -1.000000 +87381 -1.000000 +87382 -1.000000 +87383 -1.000000 +87384 -1.000000 +87386 -1.000000 +87388 -1.000000 +87389 -1.000000 +87390 -1.000000 +87391 -1.000000 +87392 -1.000000 +87393 -1.000000 +87394 -1.000000 +87395 -1.000000 +87396 -1.000000 +87397 -1.000000 +87398 -1.000000 +87399 -1.000000 +87400 -1.000000 +87401 -1.000000 +87403 -1.000000 +87404 -1.000000 +87405 -1.000000 +87406 -1.000000 +87407 -1.000000 +87408 -1.000000 +87409 -1.000000 +87410 -1.000000 +87411 -1.000000 +87413 -1.000000 +87414 -1.000000 +87415 -1.000000 +87416 -1.000000 +87417 -1.000000 +87418 -1.000000 +87419 -1.000000 +87420 -1.000000 +87421 -1.000000 +87422 -1.000000 +87423 -1.000000 +87424 -1.000000 +87425 -1.000000 +87426 -1.000000 +87427 -1.000000 +87428 -1.000000 +87429 -1.000000 +87430 -1.000000 +87431 -1.000000 +87432 -1.000000 +87433 -1.000000 +87436 -1.000000 +87438 -1.000000 +87440 -1.000000 +87442 -1.000000 +87445 -1.000000 +87446 -1.000000 +87447 -1.000000 +87448 -1.000000 +87449 -1.000000 +87450 -1.000000 +87451 -1.000000 +87452 -1.000000 +87453 -1.000000 +87454 -1.000000 +87455 -1.000000 +87456 -1.000000 +87457 -1.000000 +87458 -1.000000 +87459 -1.000000 +87460 -1.000000 +87461 -1.000000 +87462 -1.000000 +87463 -1.000000 +87464 -1.000000 +87465 -1.000000 +87466 -1.000000 +87467 -1.000000 +87468 -1.000000 +87469 -1.000000 +87470 -1.000000 +87471 -1.000000 +87472 -1.000000 +87474 -1.000000 +87476 -1.000000 +87479 -1.000000 +87481 -1.000000 +87482 -1.000000 +87483 -1.000000 +87485 -1.000000 +87486 -1.000000 +87488 -1.000000 +87489 -1.000000 +87492 -1.000000 +87497 -1.000000 +87499 -1.000000 +87500 -1.000000 +87501 -1.000000 +87504 -1.000000 +87505 -1.000000 +87506 -1.000000 +87508 -1.000000 +87511 -1.000000 +87512 -1.000000 +87513 -1.000000 +87514 -1.000000 +87517 -1.000000 +87519 -1.000000 +87520 -1.000000 +87523 -1.000000 +87524 -1.000000 +87527 -1.000000 +87528 -1.000000 +87529 -1.000000 +87533 -1.000000 +87535 -1.000000 +87536 -1.000000 +87537 -1.000000 +87538 -1.000000 +87539 -1.000000 +87551 -1.000000 +87554 -1.000000 +87556 -1.000000 +87557 -1.000000 +87558 -1.000000 +87559 -1.000000 +87560 -1.000000 +87561 -1.000000 +87562 -1.000000 +87563 -1.000000 +87564 -1.000000 +87565 -1.000000 +87566 -1.000000 +87567 -1.000000 +87568 -1.000000 +87570 -1.000000 +87584 -1.000000 +87585 -1.000000 +87586 -1.000000 +87587 -1.000000 +87588 -1.000000 +87590 -1.000000 +87591 -1.000000 +87592 -1.000000 +87593 -1.000000 +87594 -1.000000 +87595 -1.000000 +87596 -1.000000 +87597 -1.000000 +87598 -1.000000 +87603 -1.000000 +87604 -1.000000 +87605 -1.000000 +87606 -1.000000 +87607 -1.000000 +87608 -1.000000 +87609 -1.000000 +87610 -1.000000 +87611 -1.000000 +87612 -1.000000 +87613 -1.000000 +87614 -1.000000 +87615 -1.000000 +87616 -1.000000 +87617 -1.000000 +87618 -1.000000 +87619 -1.000000 +87620 -1.000000 +87621 -1.000000 +87622 -1.000000 +87623 -1.000000 +87624 -1.000000 +87625 -1.000000 +87626 -1.000000 +87627 -1.000000 +87628 -1.000000 +87629 -1.000000 +87630 -1.000000 +87631 -1.000000 +87632 -1.000000 +87633 -1.000000 +87634 -1.000000 +87635 -1.000000 +87636 -1.000000 +87637 -1.000000 +87638 -1.000000 +87639 -1.000000 +87641 -1.000000 +87642 -1.000000 +87645 -1.000000 +87646 -1.000000 +87648 -1.000000 +87650 -1.000000 +87651 -1.000000 +87652 -1.000000 +87653 -1.000000 +87654 -1.000000 +87655 -1.000000 +87656 -1.000000 +87657 -1.000000 +87658 -1.000000 +87659 -1.000000 +87660 -1.000000 +87661 -1.000000 +87662 -1.000000 +87663 -1.000000 +87664 -1.000000 +87665 -1.000000 +87666 -1.000000 +87667 -1.000000 +87668 -1.000000 +87669 -1.000000 +87670 -1.000000 +87671 -1.000000 +87672 -1.000000 +87673 -1.000000 +87674 -1.000000 +87675 -1.000000 +87676 -1.000000 +87677 -1.000000 +87678 -1.000000 +87679 -1.000000 +87680 -1.000000 +87681 -1.000000 +87682 -1.000000 +87683 -1.000000 +87684 -1.000000 +87685 -1.000000 +87686 -1.000000 +87687 -1.000000 +87688 -1.000000 +87689 -1.000000 +87690 -1.000000 +87691 -1.000000 +87692 -1.000000 +87693 -1.000000 +87694 -1.000000 +87695 -1.000000 +87696 -1.000000 +87698 -1.000000 +87699 -1.000000 +87700 -1.000000 +87701 -1.000000 +87703 -1.000000 +87704 -1.000000 +87705 -1.000000 +87706 -1.000000 +87707 -1.000000 +87708 -1.000000 +87709 -1.000000 +87710 -1.000000 +87711 -1.000000 +87712 -1.000000 +87715 -1.000000 +87716 -1.000000 +87717 -1.000000 +87718 -1.000000 +87721 -1.000000 +87723 -1.000000 +87724 -1.000000 +87725 -1.000000 +87727 -1.000000 +87729 -1.000000 +87730 -1.000000 +87731 -1.000000 +87732 -1.000000 +87733 -1.000000 +87734 -1.000000 +87735 -1.000000 +87736 -1.000000 +87737 -1.000000 +87738 -1.000000 +87739 -1.000000 +87741 -1.000000 +87742 -1.000000 +87744 -1.000000 +87745 -1.000000 +87747 -1.000000 +87748 -1.000000 +87749 -1.000000 +87750 -1.000000 +87752 -1.000000 +87753 -1.000000 +87754 -1.000000 +87755 -1.000000 +87756 -1.000000 +87758 -1.000000 +87759 -1.000000 +87760 -1.000000 +87761 -1.000000 +87762 -1.000000 +87763 -1.000000 +87764 -1.000000 +87765 -1.000000 +87766 -1.000000 +87767 -1.000000 +87768 -1.000000 +87769 -1.000000 +87770 -1.000000 +87771 -1.000000 +87772 -1.000000 +87773 -1.000000 +87774 -1.000000 +87775 -1.000000 +87776 -1.000000 +87777 -1.000000 +87778 -1.000000 +87779 -1.000000 +87780 -1.000000 +87781 -1.000000 +87783 -1.000000 +87784 -1.000000 +87785 -1.000000 +87786 -1.000000 +87788 -1.000000 +87789 -1.000000 +87792 -1.000000 +87793 -1.000000 +87794 -1.000000 +87795 -1.000000 +87799 -1.000000 +87800 -1.000000 +87801 -1.000000 +87802 -1.000000 +87803 -1.000000 +87805 -1.000000 +87806 -1.000000 +87807 -1.000000 +87808 -1.000000 +87809 -1.000000 +87810 -1.000000 +87814 -1.000000 +87815 -1.000000 +87816 -1.000000 +87817 -1.000000 +87818 -1.000000 +87819 -1.000000 +87823 -1.000000 +87825 -1.000000 +87829 -1.000000 +87830 -1.000000 +87831 -1.000000 +87833 -1.000000 +87834 -1.000000 +87835 -1.000000 +87836 -1.000000 +87837 -1.000000 +87838 -1.000000 +87839 -1.000000 +87840 -1.000000 +87841 -1.000000 +87842 -1.000000 +87843 -1.000000 +87844 -1.000000 +87845 -1.000000 +87846 -1.000000 +87847 -1.000000 +87849 -1.000000 +87850 -1.000000 +87851 -1.000000 +87852 -1.000000 +87853 -1.000000 +87854 -1.000000 +87855 -1.000000 +87858 -1.000000 +87860 -1.000000 +87862 -1.000000 +87865 -1.000000 +87866 -1.000000 +87867 -1.000000 +87868 -1.000000 +87869 -1.000000 +87870 -1.000000 +87871 -1.000000 +87872 -1.000000 +87873 -1.000000 +87874 -1.000000 +87875 -1.000000 +87876 -1.000000 +87877 -1.000000 +87879 -1.000000 +87880 -1.000000 +87881 -1.000000 +87882 -1.000000 +87883 -1.000000 +87884 -1.000000 +87885 -1.000000 +87886 -1.000000 +87887 -1.000000 +87888 -1.000000 +87889 -1.000000 +87890 -1.000000 +87891 -1.000000 +87892 -1.000000 +87893 -1.000000 +87894 -1.000000 +87895 -1.000000 +87896 -1.000000 +87897 -1.000000 +87898 -1.000000 +87899 -1.000000 +87900 -1.000000 +87901 -1.000000 +87902 -1.000000 +87903 -1.000000 +87904 -1.000000 +87905 -1.000000 +87906 -1.000000 +87907 -1.000000 +87908 -1.000000 +87909 -1.000000 +87910 -1.000000 +87911 -1.000000 +87912 -1.000000 +87913 -1.000000 +87914 -1.000000 +87915 -1.000000 +87916 -1.000000 +87917 -1.000000 +87918 -1.000000 +87919 -1.000000 +87920 -1.000000 +87921 -1.000000 +87922 -1.000000 +87923 -1.000000 +87924 -1.000000 +87925 -1.000000 +87926 -1.000000 +87927 -1.000000 +87928 -1.000000 +87929 -1.000000 +87930 -1.000000 +87931 -1.000000 +87932 -1.000000 +87933 -1.000000 +87934 -1.000000 +87935 -1.000000 +87936 -1.000000 +87943 -1.000000 +87944 -1.000000 +87945 -1.000000 +87946 -1.000000 +87947 -1.000000 +87948 -1.000000 +87949 -1.000000 +87950 -1.000000 +87951 -1.000000 +87952 -1.000000 +87953 -1.000000 +87954 -1.000000 +87955 -1.000000 +87956 -1.000000 +87957 -1.000000 +87958 -1.000000 +87959 -1.000000 +87960 -1.000000 +87961 -1.000000 +87962 -1.000000 +87963 -1.000000 +87964 -1.000000 +87965 -1.000000 +87966 -1.000000 +87967 -1.000000 +87968 -1.000000 +87969 -1.000000 +87970 -1.000000 +87971 -1.000000 +87972 -1.000000 +87973 -1.000000 +87974 -1.000000 +87975 -1.000000 +87976 -1.000000 +87977 -1.000000 +87978 -1.000000 +87979 -1.000000 +87980 -1.000000 +87981 -1.000000 +87982 -1.000000 +87983 -1.000000 +87984 -1.000000 +87985 -1.000000 +87986 -1.000000 +87987 -1.000000 +87988 -1.000000 +87989 -1.000000 +87990 -1.000000 +87991 -1.000000 +87992 -1.000000 +87993 -1.000000 +87994 -1.000000 +87995 -1.000000 +87996 -1.000000 +87997 -1.000000 +87998 -1.000000 +87999 -1.000000 +88000 -1.000000 +88001 -1.000000 +88002 -1.000000 +88003 -1.000000 +88004 -1.000000 +88005 -1.000000 +88006 -1.000000 +88007 -1.000000 +88008 -1.000000 +88009 -1.000000 +88010 -1.000000 +88011 -1.000000 +88012 -1.000000 +88013 -1.000000 +88014 -1.000000 +88015 -1.000000 +88016 -1.000000 +88017 -1.000000 +88018 -1.000000 +88019 -1.000000 +88020 -1.000000 +88021 -1.000000 +88022 -1.000000 +88023 -1.000000 +88024 -1.000000 +88025 -1.000000 +88026 -1.000000 +88027 -1.000000 +88028 -1.000000 +88029 -1.000000 +88030 -1.000000 +88031 -1.000000 +88032 -1.000000 +88033 -1.000000 +88034 -1.000000 +88035 -1.000000 +88036 -1.000000 +88037 -1.000000 +88038 -1.000000 +88039 -1.000000 +88040 -1.000000 +88041 -1.000000 +88042 -1.000000 +88043 -1.000000 +88044 -1.000000 +88045 -1.000000 +88046 -1.000000 +88047 -1.000000 +88048 -1.000000 +88049 -1.000000 +88050 -1.000000 +88051 -1.000000 +88052 -1.000000 +88053 -1.000000 +88054 -1.000000 +88055 -1.000000 +88056 -1.000000 +88057 -1.000000 +88058 -1.000000 +88059 -1.000000 +88060 -1.000000 +88061 -1.000000 +88062 -1.000000 +88063 -1.000000 +88064 -1.000000 +88065 -1.000000 +88066 -1.000000 +88067 -1.000000 +88068 -1.000000 +88069 -1.000000 +88070 -1.000000 +88071 -1.000000 +88072 -1.000000 +88073 -1.000000 +88074 -1.000000 +88075 -1.000000 +88076 -1.000000 +88077 -1.000000 +88078 -1.000000 +88079 -1.000000 +88080 -1.000000 +88081 -1.000000 +88082 -1.000000 +88083 -1.000000 +88084 -1.000000 +88085 -1.000000 +88086 -1.000000 +88087 -1.000000 +88088 -1.000000 +88089 -1.000000 +88090 -1.000000 +88091 -1.000000 +88092 -1.000000 +88093 -1.000000 +88094 -1.000000 +88095 -1.000000 +88096 -1.000000 +88097 -1.000000 +88099 -1.000000 +88100 -1.000000 +88101 -1.000000 +88102 -1.000000 +88103 -1.000000 +88104 -1.000000 +88105 -1.000000 +88106 -1.000000 +88107 -1.000000 +88108 -1.000000 +88109 -1.000000 +88110 -1.000000 +88111 -1.000000 +88112 -1.000000 +88113 -1.000000 +88114 -1.000000 +88115 -1.000000 +88116 -1.000000 +88117 -1.000000 +88118 -1.000000 +88119 -1.000000 +88120 -1.000000 +88121 -1.000000 +88122 -1.000000 +88123 -1.000000 +88124 -1.000000 +88125 -1.000000 +88126 -1.000000 +88127 -1.000000 +88128 -1.000000 +88129 -1.000000 +88130 -1.000000 +88131 -1.000000 +88132 -1.000000 +88133 -1.000000 +88134 -1.000000 +88135 -1.000000 +88136 -1.000000 +88137 -1.000000 +88138 -1.000000 +88139 -1.000000 +88140 -1.000000 +88141 -1.000000 +88142 -1.000000 +88143 -1.000000 +88144 -1.000000 +88145 -1.000000 +88146 -1.000000 +88147 -1.000000 +88148 -1.000000 +88149 -1.000000 +88150 -1.000000 +88151 -1.000000 +88152 -1.000000 +88153 -1.000000 +88154 -1.000000 +88155 -1.000000 +88156 -1.000000 +88157 -1.000000 +88158 -1.000000 +88159 -1.000000 +88160 -1.000000 +88161 -1.000000 +88162 -1.000000 +88163 -1.000000 +88164 -1.000000 +88165 -1.000000 +88166 -1.000000 +88167 -1.000000 +88168 -1.000000 +88169 -1.000000 +88170 -1.000000 +88171 -1.000000 +88172 -1.000000 +88173 -1.000000 +88174 -1.000000 +88175 -1.000000 +88176 -1.000000 +88177 -1.000000 +88178 -1.000000 +88179 -1.000000 +88180 -1.000000 +88181 -1.000000 +88183 -1.000000 +88184 -1.000000 +88185 -1.000000 +88186 -1.000000 +88187 -1.000000 +88188 -1.000000 +88193 -1.000000 +88194 -1.000000 +88195 -1.000000 +88196 -1.000000 +88198 -1.000000 +88199 -1.000000 +88200 -1.000000 +88201 -1.000000 +88202 -1.000000 +88203 -1.000000 +88204 -1.000000 +88205 -1.000000 +88206 -1.000000 +88207 -1.000000 +88208 -1.000000 +88209 -1.000000 +88210 -1.000000 +88211 -1.000000 +88212 -1.000000 +88213 -1.000000 +88214 -1.000000 +88215 -1.000000 +88216 -1.000000 +88217 -1.000000 +88218 -1.000000 +88219 -1.000000 +88221 -1.000000 +88222 -1.000000 +88223 -1.000000 +88224 -1.000000 +88225 -1.000000 +88226 -1.000000 +88227 -1.000000 +88228 -1.000000 +88229 -1.000000 +88230 -1.000000 +88231 -1.000000 +88232 -1.000000 +88233 -1.000000 +88234 -1.000000 +88235 -1.000000 +88236 -1.000000 +88237 -1.000000 +88240 -1.000000 +88241 -1.000000 +88242 -1.000000 +88243 -1.000000 +88244 -1.000000 +88245 -1.000000 +88246 -1.000000 +88247 -1.000000 +88248 -1.000000 +88249 -1.000000 +88250 -1.000000 +88251 -1.000000 +88252 -1.000000 +88253 -1.000000 +88254 -1.000000 +88255 -1.000000 +88256 -1.000000 +88257 -1.000000 +88259 -1.000000 +88260 -1.000000 +88261 -1.000000 +88262 -1.000000 +88263 -1.000000 +88264 -1.000000 +88265 -1.000000 +88266 -1.000000 +88267 -1.000000 +88268 -1.000000 +88269 -1.000000 +88270 -1.000000 +88271 -1.000000 +88272 -1.000000 +88273 -1.000000 +88274 -1.000000 +88275 -1.000000 +88276 -1.000000 +88277 -1.000000 +88278 -1.000000 +88279 -1.000000 +88280 -1.000000 +88281 -1.000000 +88282 -1.000000 +88283 -1.000000 +88284 -1.000000 +88285 -1.000000 +88286 -1.000000 +88287 -1.000000 +88288 -1.000000 +88289 -1.000000 +88290 -1.000000 +88291 -1.000000 +88292 -1.000000 +88293 -1.000000 +88294 -1.000000 +88295 -1.000000 +88296 -1.000000 +88297 -1.000000 +88298 -1.000000 +88299 -1.000000 +88300 -1.000000 +88301 -1.000000 +88302 -1.000000 +88303 -1.000000 +88304 -1.000000 +88305 -1.000000 +88306 -1.000000 +88307 -1.000000 +88308 -1.000000 +88309 -1.000000 +88310 -1.000000 +88311 -1.000000 +88312 -1.000000 +88313 -1.000000 +88314 -1.000000 +88315 -1.000000 +88316 -1.000000 +88317 -1.000000 +88318 -1.000000 +88319 -1.000000 +88320 -1.000000 +88321 -1.000000 +88322 -1.000000 +88323 -1.000000 +88324 -1.000000 +88325 -1.000000 +88326 -1.000000 +88327 -1.000000 +88328 -1.000000 +88329 -1.000000 +88332 -1.000000 +88333 -1.000000 +88334 -1.000000 +88335 -1.000000 +88336 -1.000000 +88337 -1.000000 +88338 -1.000000 +88339 -1.000000 +88340 -1.000000 +88341 -1.000000 +88342 -1.000000 +88343 -1.000000 +88344 -1.000000 +88345 -1.000000 +88346 -1.000000 +88347 -1.000000 +88348 -1.000000 +88349 -1.000000 +88350 -1.000000 +88351 -1.000000 +88352 -1.000000 +88353 -1.000000 +88354 -1.000000 +88355 -1.000000 +88356 -1.000000 +88357 -1.000000 +88358 -1.000000 +88359 -1.000000 +88360 -1.000000 +88361 -1.000000 +88362 -1.000000 +88363 -1.000000 +88364 -1.000000 +88365 -1.000000 +88366 -1.000000 +88368 -1.000000 +88369 -1.000000 +88370 -1.000000 +88371 -1.000000 +88372 -1.000000 +88373 -1.000000 +88374 -1.000000 +88375 -1.000000 +88376 -1.000000 +88377 -1.000000 +88378 -1.000000 +88379 -1.000000 +88380 -1.000000 +88381 -1.000000 +88382 -1.000000 +88383 -1.000000 +88384 -1.000000 +88385 -1.000000 +88386 -1.000000 +88387 -1.000000 +88388 -1.000000 +88389 -1.000000 +88391 -1.000000 +88392 -1.000000 +88393 -1.000000 +88394 -1.000000 +88395 -1.000000 +88396 -1.000000 +88397 -1.000000 +88398 -1.000000 +88399 -1.000000 +88400 -1.000000 +88401 -1.000000 +88402 -1.000000 +88403 -1.000000 +88404 -1.000000 +88405 -1.000000 +88406 -1.000000 +88407 -1.000000 +88408 -1.000000 +88409 -1.000000 +88410 -1.000000 +88411 -1.000000 +88412 -1.000000 +88413 -1.000000 +88414 -1.000000 +88415 -1.000000 +88416 -1.000000 +88417 -1.000000 +88418 -1.000000 +88419 -1.000000 +88421 -1.000000 +88422 -1.000000 +88423 -1.000000 +88424 -1.000000 +88425 -1.000000 +88426 -1.000000 +88427 -1.000000 +88428 -1.000000 +88429 -1.000000 +88430 -1.000000 +88431 -1.000000 +88432 -1.000000 +88433 -1.000000 +88434 -1.000000 +88435 -1.000000 +88436 -1.000000 +88437 -1.000000 +88438 -1.000000 +88439 -1.000000 +88440 -1.000000 +88441 -1.000000 +88442 -1.000000 +88443 -1.000000 +88444 -1.000000 +88445 -1.000000 +88446 -1.000000 +88447 -1.000000 +88448 -1.000000 +88449 -1.000000 +88450 -1.000000 +88451 -1.000000 +88452 -1.000000 +88453 -1.000000 +88454 -1.000000 +88455 -1.000000 +88456 -1.000000 +88457 -1.000000 +88458 -1.000000 +88459 -1.000000 +88460 -1.000000 +88461 -1.000000 +88462 -1.000000 +88463 -1.000000 +88464 -1.000000 +88465 -1.000000 +88466 -1.000000 +88467 -1.000000 +88468 -1.000000 +88469 -1.000000 +88472 -1.000000 +88473 -1.000000 +88474 -1.000000 +88475 -1.000000 +88476 -1.000000 +88477 -1.000000 +88478 -1.000000 +88479 -1.000000 +88480 -1.000000 +88481 -1.000000 +88482 -1.000000 +88483 -1.000000 +88485 -1.000000 +88486 -1.000000 +88487 -1.000000 +88488 -1.000000 +88489 -1.000000 +88490 -1.000000 +88491 -1.000000 +88493 -1.000000 +88495 -1.000000 +88496 -1.000000 +88497 -1.000000 +88500 -1.000000 +88501 -1.000000 +88502 -1.000000 +88503 -1.000000 +88504 -1.000000 +88505 -1.000000 +88506 -1.000000 +88507 -1.000000 +88508 -1.000000 +88509 -1.000000 +88510 -1.000000 +88512 -1.000000 +88513 -1.000000 +88514 -1.000000 +88515 -1.000000 +88516 -1.000000 +88517 -1.000000 +88518 -1.000000 +88519 -1.000000 +88521 -1.000000 +88524 -1.000000 +88525 -1.000000 +88526 -1.000000 +88527 -1.000000 +88528 -1.000000 +88529 -1.000000 +88530 -1.000000 +88531 -1.000000 +88532 -1.000000 +88533 -1.000000 +88534 -1.000000 +88536 -1.000000 +88537 -1.000000 +88538 -1.000000 +88539 -1.000000 +88540 -1.000000 +88541 -1.000000 +88542 -1.000000 +88543 -1.000000 +88544 -1.000000 +88545 -1.000000 +88546 -1.000000 +88548 -1.000000 +88549 -1.000000 +88551 -1.000000 +88552 -1.000000 +88553 -1.000000 +88554 -1.000000 +88555 -1.000000 +88556 -1.000000 +88557 -1.000000 +88558 -1.000000 +88559 -1.000000 +88560 -1.000000 +88561 -1.000000 +88562 -1.000000 +88563 -1.000000 +88564 -1.000000 +88565 -1.000000 +88566 -1.000000 +88567 -1.000000 +88568 -1.000000 +88569 -1.000000 +88570 -1.000000 +88571 -1.000000 +88572 -1.000000 +88573 -1.000000 +88574 -1.000000 +88575 -1.000000 +88576 -1.000000 +88578 -1.000000 +88579 -1.000000 +88580 -1.000000 +88581 -1.000000 +88582 -1.000000 +88583 -1.000000 +88584 -1.000000 +88585 -1.000000 +88586 -1.000000 +88587 -1.000000 +88588 -1.000000 +88589 -1.000000 +88590 -1.000000 +88591 -1.000000 +88592 -1.000000 +88593 -1.000000 +88594 -1.000000 +88595 -1.000000 +88596 -1.000000 +88597 -1.000000 +88598 -1.000000 +88599 -1.000000 +88600 -1.000000 +88601 -1.000000 +88602 -1.000000 +88603 -1.000000 +88604 -1.000000 +88605 -1.000000 +88606 -1.000000 +88607 -1.000000 +88608 -1.000000 +88609 -1.000000 +88611 -1.000000 +88612 -1.000000 +88614 -1.000000 +88615 -1.000000 +88616 -1.000000 +88617 -1.000000 +88618 -1.000000 +88619 -1.000000 +88620 -1.000000 +88621 -1.000000 +88622 -1.000000 +88623 -1.000000 +88624 -1.000000 +88625 -1.000000 +88626 -1.000000 +88628 -1.000000 +88629 -1.000000 +88630 -1.000000 +88631 -1.000000 +88633 -1.000000 +88634 -1.000000 +88635 -1.000000 +88636 -1.000000 +88637 -1.000000 +88638 -1.000000 +88639 -1.000000 +88640 -1.000000 +88641 -1.000000 +88642 -1.000000 +88643 -1.000000 +88644 -1.000000 +88645 -1.000000 +88646 -1.000000 +88647 -1.000000 +88648 -1.000000 +88649 -1.000000 +88650 -1.000000 +88651 -1.000000 +88652 -1.000000 +88653 -1.000000 +88654 -1.000000 +88656 -1.000000 +88657 -1.000000 +88658 -1.000000 +88659 -1.000000 +88660 -1.000000 +88661 -1.000000 +88662 -1.000000 +88663 -1.000000 +88665 -1.000000 +88666 -1.000000 +88669 -1.000000 +88670 -1.000000 +88671 -1.000000 +88672 -1.000000 +88673 -1.000000 +88674 -1.000000 +88675 -1.000000 +88676 -1.000000 +88677 -1.000000 +88679 -1.000000 +88680 -1.000000 +88681 -1.000000 +88682 -1.000000 +88685 -1.000000 +88686 -1.000000 +88688 -1.000000 +88689 -1.000000 +88690 -1.000000 +88691 -1.000000 +88693 -1.000000 +88695 -1.000000 +88697 -1.000000 +88699 -1.000000 +88701 -1.000000 +88705 -1.000000 +88706 -1.000000 +88707 -1.000000 +88708 -1.000000 +88712 -1.000000 +88713 -1.000000 +88714 -1.000000 +88715 -1.000000 +88716 -1.000000 +88717 -1.000000 +88718 -1.000000 +88719 -1.000000 +88720 -1.000000 +88721 -1.000000 +88722 -1.000000 +88723 -1.000000 +88724 -1.000000 +88725 -1.000000 +88726 -1.000000 +88727 -1.000000 +88728 -1.000000 +88729 -1.000000 +88730 -1.000000 +88731 -1.000000 +88732 -1.000000 +88734 -1.000000 +88735 -1.000000 +88737 -1.000000 +88738 -1.000000 +88739 -1.000000 +88740 -1.000000 +88741 -1.000000 +88742 -1.000000 +88743 -1.000000 +88744 -1.000000 +88746 -1.000000 +88748 -1.000000 +88749 -1.000000 +88750 -1.000000 +88752 -1.000000 +88753 -1.000000 +88754 -1.000000 +88755 -1.000000 +88756 -1.000000 +88757 -1.000000 +88758 -1.000000 +88759 -1.000000 +88760 -1.000000 +88761 -1.000000 +88762 -1.000000 +88763 -1.000000 +88764 -1.000000 +88765 -1.000000 +88766 -1.000000 +88767 -1.000000 +88768 -1.000000 +88769 -1.000000 +88770 -1.000000 +88771 -1.000000 +88772 -1.000000 +88773 -1.000000 +88774 -1.000000 +88775 -1.000000 +88776 -1.000000 +88777 -1.000000 +88778 -1.000000 +88779 -1.000000 +88780 -1.000000 +88781 -1.000000 +88782 -1.000000 +88783 -1.000000 +88784 -1.000000 +88785 -1.000000 +88786 -1.000000 +88787 -1.000000 +88788 -1.000000 +88789 -1.000000 +88790 -1.000000 +88791 -1.000000 +88792 -1.000000 +88793 -1.000000 +88794 -1.000000 +88795 -1.000000 +88796 -1.000000 +88797 -1.000000 +88798 -1.000000 +88799 -1.000000 +88800 -1.000000 +88801 -1.000000 +88802 -1.000000 +88803 -1.000000 +88804 -1.000000 +88805 -1.000000 +88806 -1.000000 +88807 -1.000000 +88808 -1.000000 +88809 -1.000000 +88810 -1.000000 +88811 -1.000000 +88812 -1.000000 +88814 -1.000000 +88815 -1.000000 +88816 -1.000000 +88817 -1.000000 +88818 -1.000000 +88819 -1.000000 +88820 -1.000000 +88821 -1.000000 +88822 -1.000000 +88823 -1.000000 +88824 -1.000000 +88826 -1.000000 +88827 -1.000000 +88828 -1.000000 +88829 -1.000000 +88830 -1.000000 +88831 -1.000000 +88832 -1.000000 +88833 -1.000000 +88834 -1.000000 +88835 -1.000000 +88836 -1.000000 +88837 -1.000000 +88838 -1.000000 +88839 -1.000000 +88840 -1.000000 +88841 -1.000000 +88842 -1.000000 +88843 -1.000000 +88844 -1.000000 +88845 -1.000000 +88847 -1.000000 +88848 -1.000000 +88850 -1.000000 +88851 -1.000000 +88852 -1.000000 +88853 -1.000000 +88854 -1.000000 +88855 -1.000000 +88856 -1.000000 +88858 -1.000000 +88859 -1.000000 +88860 -1.000000 +88861 -1.000000 +88862 -1.000000 +88863 -1.000000 +88864 -1.000000 +88865 -1.000000 +88866 -1.000000 +88867 -1.000000 +88868 -1.000000 +88869 -1.000000 +88870 -1.000000 +88871 -1.000000 +88872 -1.000000 +88873 -1.000000 +88874 -1.000000 +88876 -1.000000 +88877 -1.000000 +88881 -1.000000 +88882 -1.000000 +88883 -1.000000 +88884 -1.000000 +88889 -1.000000 +88890 -1.000000 +88891 -1.000000 +88892 -1.000000 +88893 -1.000000 +88895 -1.000000 +88896 -1.000000 +88897 -1.000000 +88898 -1.000000 +88899 -1.000000 +88900 -1.000000 +88901 -1.000000 +88902 -1.000000 +88903 -1.000000 +88904 -1.000000 +88905 -1.000000 +88906 -1.000000 +88907 -1.000000 +88909 -1.000000 +88910 -1.000000 +88911 -1.000000 +88912 -1.000000 +88913 -1.000000 +88914 -1.000000 +88915 -1.000000 +88916 -1.000000 +88917 -1.000000 +88918 -1.000000 +88919 -1.000000 +88920 -1.000000 +88921 -1.000000 +88922 -1.000000 +88923 -1.000000 +88924 -1.000000 +88925 -1.000000 +88926 -1.000000 +88927 -1.000000 +88928 -1.000000 +88929 -1.000000 +88930 -1.000000 +88931 -1.000000 +88932 -1.000000 +88933 -1.000000 +88934 -1.000000 +88935 -1.000000 +88936 -1.000000 +88937 -1.000000 +88938 -1.000000 +88939 -1.000000 +88940 -1.000000 +88941 -1.000000 +88942 -1.000000 +88943 -1.000000 +88944 -1.000000 +88945 -1.000000 +88946 -1.000000 +88947 -1.000000 +88948 -1.000000 +88949 -1.000000 +88950 -1.000000 +88951 -1.000000 +88952 -1.000000 +88953 -1.000000 +88954 -1.000000 +88955 -1.000000 +88956 -1.000000 +88957 -1.000000 +88958 -1.000000 +88959 -1.000000 +88960 -1.000000 +88961 -1.000000 +88962 -1.000000 +88963 -1.000000 +88964 -1.000000 +88965 -1.000000 +88966 -1.000000 +88967 -1.000000 +88968 -1.000000 +88969 -1.000000 +88970 -1.000000 +88972 -1.000000 +88973 -1.000000 +88974 -1.000000 +88975 -1.000000 +88976 -1.000000 +88977 -1.000000 +88978 -1.000000 +88979 -1.000000 +88980 -1.000000 +88981 -1.000000 +88982 -1.000000 +88983 -1.000000 +88984 -1.000000 +88985 -1.000000 +88986 -1.000000 +88987 -1.000000 +88988 -1.000000 +88989 -1.000000 +88992 -1.000000 +88993 -1.000000 +88995 -1.000000 +88996 -1.000000 +88997 -1.000000 +88998 -1.000000 +88999 -1.000000 +89000 -1.000000 +89001 -1.000000 +89002 -1.000000 +89003 -1.000000 +89004 -1.000000 +89005 -1.000000 +89006 -1.000000 +89007 -1.000000 +89008 -1.000000 +89012 -1.000000 +89014 -1.000000 +89018 -1.000000 +89019 -1.000000 +89020 -1.000000 +89021 -1.000000 +89022 -1.000000 +89023 -1.000000 +89024 -1.000000 +89025 -1.000000 +89026 -1.000000 +89027 -1.000000 +89028 -1.000000 +89029 -1.000000 +89030 -1.000000 +89031 -1.000000 +89032 -1.000000 +89033 -1.000000 +89034 -1.000000 +89035 -1.000000 +89036 -1.000000 +89037 -1.000000 +89038 -1.000000 +89039 -1.000000 +89040 -1.000000 +89042 -1.000000 +89043 -1.000000 +89044 -1.000000 +89045 -1.000000 +89046 -1.000000 +89047 -1.000000 +89048 -1.000000 +89049 -1.000000 +89050 -1.000000 +89052 -1.000000 +89054 -1.000000 +89055 -1.000000 +89056 -1.000000 +89057 -1.000000 +89058 -1.000000 +89059 -1.000000 +89060 -1.000000 +89061 -1.000000 +89062 -1.000000 +89063 -1.000000 +89066 -1.000000 +89067 -1.000000 +89072 -1.000000 +89073 -1.000000 +89074 -1.000000 +89078 -1.000000 +89079 -1.000000 +89080 -1.000000 +89081 -1.000000 +89082 -1.000000 +89085 -1.000000 +89086 -1.000000 +89087 -1.000000 +89089 -1.000000 +89090 -1.000000 +89091 -1.000000 +89092 -1.000000 +89093 -1.000000 +89094 -1.000000 +89095 -1.000000 +89096 -1.000000 +89097 -1.000000 +89098 -1.000000 +89099 -1.000000 +89100 -1.000000 +89101 -1.000000 +89102 -1.000000 +89103 -1.000000 +89104 -1.000000 +89105 -1.000000 +89106 -1.000000 +89107 -1.000000 +89109 -1.000000 +89110 -1.000000 +89113 -1.000000 +89114 -1.000000 +89115 -1.000000 +89116 -1.000000 +89117 -1.000000 +89118 -1.000000 +89119 -1.000000 +89120 -1.000000 +89121 -1.000000 +89122 -1.000000 +89123 -1.000000 +89124 -1.000000 +89125 -1.000000 +89126 -1.000000 +89128 -1.000000 +89129 -1.000000 +89131 -1.000000 +89132 -1.000000 +89133 -1.000000 +89134 -1.000000 +89135 -1.000000 +89136 -1.000000 +89137 -1.000000 +89138 -1.000000 +89139 -1.000000 +89140 -1.000000 +89141 -1.000000 +89143 -1.000000 +89144 -1.000000 +89145 -1.000000 +89146 -1.000000 +89147 -1.000000 +89148 -1.000000 +89150 -1.000000 +89151 -1.000000 +89152 -1.000000 +89153 -1.000000 +89154 -1.000000 +89155 -1.000000 +89156 -1.000000 +89157 -1.000000 +89158 -1.000000 +89159 -1.000000 +89161 -1.000000 +89162 -1.000000 +89163 -1.000000 +89164 -1.000000 +89165 -1.000000 +89166 -1.000000 +89167 -1.000000 +89168 -1.000000 +89169 -1.000000 +89170 -1.000000 +89171 -1.000000 +89173 -1.000000 +89175 -1.000000 +89176 -1.000000 +89177 -1.000000 +89178 -1.000000 +89179 -1.000000 +89181 -1.000000 +89184 -1.000000 +89188 -1.000000 +89189 -1.000000 +89190 -1.000000 +89193 -1.000000 +89196 -1.000000 +89197 -1.000000 +89198 -1.000000 +89199 -1.000000 +89200 -1.000000 +89201 -1.000000 +89202 -1.000000 +89203 -1.000000 +89204 -1.000000 +89205 -1.000000 +89206 -1.000000 +89207 -1.000000 +89208 -1.000000 +89209 -1.000000 +89215 -1.000000 +89216 -1.000000 +89217 -1.000000 +89218 -1.000000 +89220 -1.000000 +89221 -1.000000 +89222 -1.000000 +89224 -1.000000 +89225 -1.000000 +89227 -1.000000 +89228 -1.000000 +89229 -1.000000 +89230 -1.000000 +89231 -1.000000 +89232 -1.000000 +89233 -1.000000 +89234 -1.000000 +89235 -1.000000 +89236 -1.000000 +89237 -1.000000 +89238 -1.000000 +89240 -1.000000 +89241 -1.000000 +89242 -1.000000 +89243 -1.000000 +89244 -1.000000 +89246 -1.000000 +89249 -1.000000 +89250 -1.000000 +89251 -1.000000 +89252 -1.000000 +89253 -1.000000 +89254 -1.000000 +89255 -1.000000 +89256 -1.000000 +89257 -1.000000 +89259 -1.000000 +89260 -1.000000 +89263 -1.000000 +89264 -1.000000 +89266 -1.000000 +89267 -1.000000 +89268 -1.000000 +89269 -1.000000 +89270 -1.000000 +89271 -1.000000 +89272 -1.000000 +89273 -1.000000 +89276 -1.000000 +89277 -1.000000 +89278 -1.000000 +89279 -1.000000 +89280 -1.000000 +89281 -1.000000 +89282 -1.000000 +89283 -1.000000 +89284 -1.000000 +89285 -1.000000 +89286 -1.000000 +89287 -1.000000 +89289 -1.000000 +89290 -1.000000 +89292 -1.000000 +89293 -1.000000 +89294 -1.000000 +89295 -1.000000 +89296 -1.000000 +89297 -1.000000 +89298 -1.000000 +89299 -1.000000 +89300 -1.000000 +89301 -1.000000 +89302 -1.000000 +89303 -1.000000 +89304 -1.000000 +89305 -1.000000 +89306 -1.000000 +89307 -1.000000 +89308 -1.000000 +89309 -1.000000 +89310 -1.000000 +89311 -1.000000 +89312 -1.000000 +89313 -1.000000 +89314 -1.000000 +89315 -1.000000 +89316 -1.000000 +89318 -1.000000 +89322 -1.000000 +89323 -1.000000 +89324 -1.000000 +89326 -1.000000 +89327 -1.000000 +89328 -1.000000 +89329 -1.000000 +89330 -1.000000 +89331 -1.000000 +89332 -1.000000 +89334 -1.000000 +89335 -1.000000 +89336 -1.000000 +89337 -1.000000 +89339 -1.000000 +89341 -1.000000 +89342 -1.000000 +89343 -1.000000 +89344 -1.000000 +89345 -1.000000 +89346 -1.000000 +89347 -1.000000 +89348 -1.000000 +89349 -1.000000 +89350 -1.000000 +89351 -1.000000 +89352 -1.000000 +89353 -1.000000 +89354 -1.000000 +89355 -1.000000 +89356 -1.000000 +89357 -1.000000 +89358 -1.000000 +89359 -1.000000 +89360 -1.000000 +89361 -1.000000 +89362 -1.000000 +89363 -1.000000 +89364 -1.000000 +89365 -1.000000 +89367 -1.000000 +89368 -1.000000 +89369 -1.000000 +89370 -1.000000 +89372 -1.000000 +89374 -1.000000 +89375 -1.000000 +89376 -1.000000 +89377 -1.000000 +89378 -1.000000 +89379 -1.000000 +89380 -1.000000 +89381 -1.000000 +89382 -1.000000 +89383 -1.000000 +89384 -1.000000 +89385 -1.000000 +89386 -1.000000 +89387 -1.000000 +89388 -1.000000 +89389 -1.000000 +89391 -1.000000 +89392 -1.000000 +89393 -1.000000 +89394 -1.000000 +89395 -1.000000 +89396 -1.000000 +89397 -1.000000 +89398 -1.000000 +89399 -1.000000 +89400 -1.000000 +89401 -1.000000 +89402 -1.000000 +89403 -1.000000 +89404 -1.000000 +89405 -1.000000 +89406 -1.000000 +89407 -1.000000 +89408 -1.000000 +89409 -1.000000 +89410 -1.000000 +89411 -1.000000 +89412 -1.000000 +89413 -1.000000 +89414 -1.000000 +89415 -1.000000 +89416 -1.000000 +89417 -1.000000 +89419 -1.000000 +89423 -1.000000 +89424 -1.000000 +89426 -1.000000 +89427 -1.000000 +89428 -1.000000 +89433 -1.000000 +89435 -1.000000 +89442 -1.000000 +89443 -1.000000 +89444 -1.000000 +89445 -1.000000 +89446 -1.000000 +89447 -1.000000 +89449 -1.000000 +89452 -1.000000 +89454 -1.000000 +89455 -1.000000 +89459 -1.000000 +89460 -1.000000 +89461 -1.000000 +89462 -1.000000 +89464 -1.000000 +89465 -1.000000 +89467 -1.000000 +89468 -1.000000 +89469 -1.000000 +89471 -1.000000 +89473 -1.000000 +89474 -1.000000 +89475 -1.000000 +89476 -1.000000 +89477 -1.000000 +89478 -1.000000 +89479 -1.000000 +89480 -1.000000 +89481 -1.000000 +89482 -1.000000 +89483 -1.000000 +89484 -1.000000 +89485 -1.000000 +89486 -1.000000 +89487 -1.000000 +89488 -1.000000 +89489 -1.000000 +89490 -1.000000 +89491 -1.000000 +89492 -1.000000 +89493 -1.000000 +89494 -1.000000 +89495 -1.000000 +89496 -1.000000 +89497 -1.000000 +89498 -1.000000 +89499 -1.000000 +89500 -1.000000 +89501 -1.000000 +89502 -1.000000 +89503 -1.000000 +89504 -1.000000 +89505 -1.000000 +89506 -1.000000 +89507 -1.000000 +89508 -1.000000 +89509 -1.000000 +89510 -1.000000 +89511 -1.000000 +89512 -1.000000 +89513 -1.000000 +89514 -1.000000 +89516 -1.000000 +89517 -1.000000 +89518 -1.000000 +89520 -1.000000 +89521 -1.000000 +89522 -1.000000 +89523 -1.000000 +89524 -1.000000 +89525 -1.000000 +89526 -1.000000 +89527 -1.000000 +89528 -1.000000 +89529 -1.000000 +89530 -1.000000 +89531 -1.000000 +89532 -1.000000 +89533 -1.000000 +89534 -1.000000 +89535 -1.000000 +89536 -1.000000 +89537 -1.000000 +89538 -1.000000 +89539 -1.000000 +89540 -1.000000 +89541 -1.000000 +89542 -1.000000 +89543 -1.000000 +89544 -1.000000 +89545 -1.000000 +89546 -1.000000 +89547 -1.000000 +89548 -1.000000 +89549 -1.000000 +89550 -1.000000 +89551 -1.000000 +89552 -1.000000 +89553 -1.000000 +89554 -1.000000 +89555 -1.000000 +89556 -1.000000 +89557 -1.000000 +89558 -1.000000 +89559 -1.000000 +89560 -1.000000 +89561 -1.000000 +89562 -1.000000 +89563 -1.000000 +89564 -1.000000 +89565 -1.000000 +89566 -1.000000 +89567 -1.000000 +89568 -1.000000 +89569 -1.000000 +89570 -1.000000 +89571 -1.000000 +89572 -1.000000 +89573 -1.000000 +89574 -1.000000 +89575 -1.000000 +89576 -1.000000 +89577 -1.000000 +89578 -1.000000 +89579 -1.000000 +89580 -1.000000 +89581 -1.000000 +89582 -1.000000 +89583 -1.000000 +89584 -1.000000 +89585 -1.000000 +89586 -1.000000 +89587 -1.000000 +89588 -1.000000 +89589 -1.000000 +89590 -1.000000 +89591 -1.000000 +89592 -1.000000 +89593 -1.000000 +89594 -1.000000 +89595 -1.000000 +89597 -1.000000 +89598 -1.000000 +89599 -1.000000 +89601 -1.000000 +89602 -1.000000 +89605 -1.000000 +89606 -1.000000 +89608 -1.000000 +89609 -1.000000 +89611 -1.000000 +89612 -1.000000 +89613 -1.000000 +89614 -1.000000 +89616 -1.000000 +89617 -1.000000 +89618 -1.000000 +89619 -1.000000 +89620 -1.000000 +89621 -1.000000 +89622 -1.000000 +89623 -1.000000 +89624 -1.000000 +89625 -1.000000 +89626 -1.000000 +89627 -1.000000 +89628 -1.000000 +89629 -1.000000 +89630 -1.000000 +89632 -1.000000 +89633 -1.000000 +89634 -1.000000 +89636 -1.000000 +89637 -1.000000 +89638 -1.000000 +89639 -1.000000 +89641 -1.000000 +89642 -1.000000 +89643 -1.000000 +89644 -1.000000 +89645 -1.000000 +89646 -1.000000 +89647 -1.000000 +89648 -1.000000 +89649 -1.000000 +89650 -1.000000 +89651 -1.000000 +89652 -1.000000 +89653 -1.000000 +89654 -1.000000 +89655 -1.000000 +89656 -1.000000 +89658 -1.000000 +89661 -1.000000 +89662 -1.000000 +89663 -1.000000 +89664 -1.000000 +89665 -1.000000 +89666 -1.000000 +89669 -1.000000 +89670 -1.000000 +89671 -1.000000 +89672 -1.000000 +89673 -1.000000 +89674 -1.000000 +89675 -1.000000 +89676 -1.000000 +89677 -1.000000 +89678 -1.000000 +89679 -1.000000 +89680 -1.000000 +89681 -1.000000 +89682 -1.000000 +89683 -1.000000 +89684 -1.000000 +89685 -1.000000 +89686 -1.000000 +89687 -1.000000 +89688 -1.000000 +89689 -1.000000 +89690 -1.000000 +89691 -1.000000 +89692 -1.000000 +89693 -1.000000 +89694 -1.000000 +89695 -1.000000 +89696 -1.000000 +89697 -1.000000 +89698 -1.000000 +89699 -1.000000 +89700 -1.000000 +89701 -1.000000 +89702 -1.000000 +89703 -1.000000 +89704 -1.000000 +89705 -1.000000 +89707 -1.000000 +89708 -1.000000 +89709 -1.000000 +89710 -1.000000 +89711 -1.000000 +89712 -1.000000 +89713 -1.000000 +89714 -1.000000 +89715 -1.000000 +89716 -1.000000 +89717 -1.000000 +89718 -1.000000 +89719 -1.000000 +89720 -1.000000 +89721 -1.000000 +89722 -1.000000 +89723 -1.000000 +89724 -1.000000 +89725 -1.000000 +89726 -1.000000 +89727 -1.000000 +89728 -1.000000 +89729 -1.000000 +89730 -1.000000 +89731 -1.000000 +89732 -1.000000 +89734 -1.000000 +89735 -1.000000 +89736 -1.000000 +89737 -1.000000 +89738 -1.000000 +89739 -1.000000 +89740 -1.000000 +89741 -1.000000 +89742 -1.000000 +89743 -1.000000 +89746 -1.000000 +89747 -1.000000 +89748 -1.000000 +89749 -1.000000 +89750 -1.000000 +89751 -1.000000 +89752 -1.000000 +89754 -1.000000 +89756 -1.000000 +89757 -1.000000 +89758 -1.000000 +89759 -1.000000 +89767 -1.000000 +89775 -1.000000 +89776 -1.000000 +89777 -1.000000 +89778 -1.000000 +89779 -1.000000 +89781 -1.000000 +89783 -1.000000 +89784 -1.000000 +89786 -1.000000 +89787 -1.000000 +89788 -1.000000 +89789 -1.000000 +89790 -1.000000 +89791 -1.000000 +89792 -1.000000 +89793 -1.000000 +89794 -1.000000 +89807 -1.000000 +89808 -1.000000 +89809 -1.000000 +89810 -1.000000 +89811 -1.000000 +89812 -1.000000 +89813 -1.000000 +89814 -1.000000 +89815 -1.000000 +89818 -1.000000 +89819 -1.000000 +89820 -1.000000 +89821 -1.000000 +89822 -1.000000 +89823 -1.000000 +89824 -1.000000 +89825 -1.000000 +89826 -1.000000 +89827 -1.000000 +89828 -1.000000 +89829 -1.000000 +89830 -1.000000 +89831 -1.000000 +89832 -1.000000 +89833 -1.000000 +89834 -1.000000 +89835 -1.000000 +89836 -1.000000 +89837 -1.000000 +89838 -1.000000 +89839 -1.000000 +89840 -1.000000 +89841 -1.000000 +89842 -1.000000 +89844 -1.000000 +89845 -1.000000 +89846 -1.000000 +89847 -1.000000 +89848 -1.000000 +89849 -1.000000 +89850 -1.000000 +89851 -1.000000 +89852 -1.000000 +89853 -1.000000 +89854 -1.000000 +89855 -1.000000 +89856 -1.000000 +89857 -1.000000 +89858 -1.000000 +89859 -1.000000 +89860 -1.000000 +89861 -1.000000 +89862 -1.000000 +89863 -1.000000 +89865 -1.000000 +89866 -1.000000 +89867 -1.000000 +89868 -1.000000 +89869 -1.000000 +89871 -1.000000 +89872 -1.000000 +89873 -1.000000 +89874 -1.000000 +89875 -1.000000 +89876 -1.000000 +89877 -1.000000 +89878 -1.000000 +89879 -1.000000 +89880 -1.000000 +89881 -1.000000 +89882 -1.000000 +89883 -1.000000 +89884 -1.000000 +89886 -1.000000 +89887 -1.000000 +89888 -1.000000 +89889 -1.000000 +89890 -1.000000 +89891 -1.000000 +89893 -1.000000 +89894 -1.000000 +89895 -1.000000 +89896 -1.000000 +89897 -1.000000 +89898 -1.000000 +89899 -1.000000 +89900 -1.000000 +89901 -1.000000 +89902 -1.000000 +89903 -1.000000 +89905 -1.000000 +89906 -1.000000 +89907 -1.000000 +89908 -1.000000 +89909 -1.000000 +89910 -1.000000 +89911 -1.000000 +89912 -1.000000 +89913 -1.000000 +89914 -1.000000 +89916 -1.000000 +89917 -1.000000 +89918 -1.000000 +89919 -1.000000 +89920 -1.000000 +89921 -1.000000 +89922 -1.000000 +89923 -1.000000 +89924 -1.000000 +89925 -1.000000 +89926 -1.000000 +89927 -1.000000 +89928 -1.000000 +89929 -1.000000 +89930 -1.000000 +89931 -1.000000 +89932 -1.000000 +89933 -1.000000 +89934 -1.000000 +89935 -1.000000 +89936 -1.000000 +89937 -1.000000 +89938 -1.000000 +89939 -1.000000 +89940 -1.000000 +89941 -1.000000 +89942 -1.000000 +89943 -1.000000 +89944 -1.000000 +89945 -1.000000 +89946 -1.000000 +89947 -1.000000 +89948 -1.000000 +89949 -1.000000 +89951 -1.000000 +89952 -1.000000 +89953 -1.000000 +89954 -1.000000 +89955 -1.000000 +89956 -1.000000 +89957 -1.000000 +89958 -1.000000 +89959 -1.000000 +89960 -1.000000 +89961 -1.000000 +89962 -1.000000 +89963 -1.000000 +89964 -1.000000 +89965 -1.000000 +89966 -1.000000 +89967 -1.000000 +89968 -1.000000 +89969 -1.000000 +89970 -1.000000 +89971 -1.000000 +89972 -1.000000 +89973 -1.000000 +89974 -1.000000 +89975 -1.000000 +89976 -1.000000 +89977 -1.000000 +89978 -1.000000 +89979 -1.000000 +89980 -1.000000 +89981 -1.000000 +89982 -1.000000 +89983 -1.000000 +89984 -1.000000 +89985 -1.000000 +89986 -1.000000 +89987 -1.000000 +89988 -1.000000 +89989 -1.000000 +89990 -1.000000 +89991 -1.000000 +89992 -1.000000 +89993 -1.000000 +89994 -1.000000 +89995 -1.000000 +89996 -1.000000 +89997 -1.000000 +89999 -1.000000 +90000 -1.000000 +90001 -1.000000 +90002 -1.000000 +90003 -1.000000 +90004 -1.000000 +90005 -1.000000 +90006 -1.000000 +90007 -1.000000 +90008 -1.000000 +90009 -1.000000 +90010 -1.000000 +90011 -1.000000 +90012 -1.000000 +90013 -1.000000 +90014 -1.000000 +90015 -1.000000 +90016 -1.000000 +90017 -1.000000 +90018 -1.000000 +90019 -1.000000 +90020 -1.000000 +90021 -1.000000 +90022 -1.000000 +90023 -1.000000 +90024 -1.000000 +90025 -1.000000 +90026 -1.000000 +90027 -1.000000 +90028 -1.000000 +90029 -1.000000 +90030 -1.000000 +90032 -1.000000 +90033 -1.000000 +90034 -1.000000 +90035 -1.000000 +90036 -1.000000 +90038 -1.000000 +90039 -1.000000 +90040 -1.000000 +90041 -1.000000 +90042 -1.000000 +90043 -1.000000 +90044 -1.000000 +90045 -1.000000 +90046 -1.000000 +90050 -1.000000 +90051 -1.000000 +90052 -1.000000 +90053 -1.000000 +90054 -1.000000 +90055 -1.000000 +90056 -1.000000 +90057 -1.000000 +90058 -1.000000 +90059 -1.000000 +90060 -1.000000 +90061 -1.000000 +90062 -1.000000 +90063 -1.000000 +90064 -1.000000 +90065 -1.000000 +90066 -1.000000 +90067 -1.000000 +90068 -1.000000 +90069 -1.000000 +90070 -1.000000 +90071 -1.000000 +90072 -1.000000 +90073 -1.000000 +90074 -1.000000 +90075 -1.000000 +90076 -1.000000 +90077 -1.000000 +90078 -1.000000 +90079 -1.000000 +90080 -1.000000 +90081 -1.000000 +90082 -1.000000 +90083 -1.000000 +90084 -1.000000 +90085 -1.000000 +90086 -1.000000 +90087 -1.000000 +90088 -1.000000 +90089 -1.000000 +90090 -1.000000 +90091 -1.000000 +90092 -1.000000 +90093 -1.000000 +90094 -1.000000 +90095 -1.000000 +90096 -1.000000 +90097 -1.000000 +90098 -1.000000 +90099 -1.000000 +90102 -1.000000 +90103 -1.000000 +90104 -1.000000 +90105 -1.000000 +90106 -1.000000 +90107 -1.000000 +90108 -1.000000 +90109 -1.000000 +90110 -1.000000 +90111 -1.000000 +90113 -1.000000 +90115 -1.000000 +90116 -1.000000 +90117 -1.000000 +90118 -1.000000 +90119 -1.000000 +90120 -1.000000 +90127 -1.000000 +90128 -1.000000 +90130 -1.000000 +90131 -1.000000 +90132 -1.000000 +90133 -1.000000 +90134 -1.000000 +90135 -1.000000 +90136 -1.000000 +90137 -1.000000 +90139 -1.000000 +90140 -1.000000 +90141 -1.000000 +90142 -1.000000 +90143 -1.000000 +90144 -1.000000 +90145 -1.000000 +90146 -1.000000 +90147 -1.000000 +90148 -1.000000 +90149 -1.000000 +90151 -1.000000 +90152 -1.000000 +90154 -1.000000 +90155 -1.000000 +90156 -1.000000 +90157 -1.000000 +90158 -1.000000 +90159 -1.000000 +90160 -1.000000 +90161 -1.000000 +90163 -1.000000 +90165 -1.000000 +90166 -1.000000 +90167 -1.000000 +90168 -1.000000 +90169 -1.000000 +90170 -1.000000 +90171 -1.000000 +90172 -1.000000 +90173 -1.000000 +90174 -1.000000 +90175 -1.000000 +90176 -1.000000 +90177 -1.000000 +90178 -1.000000 +90179 -1.000000 +90180 -1.000000 +90181 -1.000000 +90182 -1.000000 +90183 -1.000000 +90184 -1.000000 +90185 -1.000000 +90186 -1.000000 +90187 -1.000000 +90189 -1.000000 +90190 -1.000000 +90192 -1.000000 +90193 -1.000000 +90194 -1.000000 +90195 -1.000000 +90196 -1.000000 +90197 -1.000000 +90198 -1.000000 +90199 -1.000000 +90200 -1.000000 +90201 -1.000000 +90202 -1.000000 +90203 -1.000000 +90204 -1.000000 +90205 -1.000000 +90206 -1.000000 +90207 -1.000000 +90208 -1.000000 +90209 -1.000000 +90211 -1.000000 +90212 -1.000000 +90213 -1.000000 +90214 -1.000000 +90215 -1.000000 +90216 -1.000000 +90217 -1.000000 +90220 -1.000000 +90221 -1.000000 +90222 -1.000000 +90223 -1.000000 +90224 -1.000000 +90227 -1.000000 +90228 -1.000000 +90229 -1.000000 +90230 -1.000000 +90231 -1.000000 +90232 -1.000000 +90233 -1.000000 +90234 -1.000000 +90235 -1.000000 +90236 -1.000000 +90237 -1.000000 +90238 -1.000000 +90239 -1.000000 +90240 -1.000000 +90241 -1.000000 +90242 -1.000000 +90243 -1.000000 +90244 -1.000000 +90245 -1.000000 +90247 -1.000000 +90248 -1.000000 +90249 -1.000000 +90251 -1.000000 +90255 -1.000000 +90256 -1.000000 +90257 -1.000000 +90258 -1.000000 +90259 -1.000000 +90260 -1.000000 +90261 -1.000000 +90262 -1.000000 +90263 -1.000000 +90264 -1.000000 +90265 -1.000000 +90266 -1.000000 +90267 -1.000000 +90270 -1.000000 +90271 -1.000000 +90272 -1.000000 +90273 -1.000000 +90274 -1.000000 +90275 -1.000000 +90277 -1.000000 +90278 -1.000000 +90279 -1.000000 +90280 -1.000000 +90282 -1.000000 +90283 -1.000000 +90284 -1.000000 +90285 -1.000000 +90286 -1.000000 +90287 -1.000000 +90288 -1.000000 +90289 -1.000000 +90291 -1.000000 +90292 -1.000000 +90293 -1.000000 +90294 -1.000000 +90295 -1.000000 +90296 -1.000000 +90297 -1.000000 +90298 -1.000000 +90308 -1.000000 +90313 -1.000000 +90314 -1.000000 +90315 -1.000000 +90316 -1.000000 +90317 -1.000000 +90318 -1.000000 +90321 -1.000000 +90323 -1.000000 +90324 -1.000000 +90325 -1.000000 +90326 -1.000000 +90327 -1.000000 +90328 -1.000000 +90329 -1.000000 +90331 -1.000000 +90332 -1.000000 +90338 -1.000000 +90339 -1.000000 +90340 -1.000000 +90341 -1.000000 +90342 -1.000000 +90343 -1.000000 +90344 -1.000000 +90345 -1.000000 +90348 -1.000000 +90349 -1.000000 +90350 -1.000000 +90351 -1.000000 +90352 -1.000000 +90353 -1.000000 +90354 -1.000000 +90355 -1.000000 +90356 -1.000000 +90360 -1.000000 +90361 -1.000000 +90363 -1.000000 +90364 -1.000000 +90365 -1.000000 +90366 -1.000000 +90372 -1.000000 +90373 -1.000000 +90374 -1.000000 +90375 -1.000000 +90376 -1.000000 +90377 -1.000000 +90379 -1.000000 +90380 -1.000000 +90381 -1.000000 +90382 -1.000000 +90383 -1.000000 +90385 -1.000000 +90398 -1.000000 +90399 -1.000000 +90400 -1.000000 +90401 -1.000000 +90402 -1.000000 +90403 -1.000000 +90405 -1.000000 +90406 -1.000000 +90407 -1.000000 +90408 -1.000000 +90409 -1.000000 +90410 -1.000000 +90411 -1.000000 +90413 -1.000000 +90414 -1.000000 +90415 -1.000000 +90416 -1.000000 +90417 -1.000000 +90418 -1.000000 +90419 -1.000000 +90421 -1.000000 +90422 -1.000000 +90423 -1.000000 +90424 -1.000000 +90425 -1.000000 +90426 -1.000000 +90427 -1.000000 +90428 -1.000000 +90429 -1.000000 +90430 -1.000000 +90431 -1.000000 +90432 -1.000000 +90435 -1.000000 +90436 -1.000000 +90437 -1.000000 +90438 -1.000000 +90439 -1.000000 +90440 -1.000000 +90441 -1.000000 +90442 -1.000000 +90443 -1.000000 +90446 -1.000000 +90447 -1.000000 +90448 -1.000000 +90449 -1.000000 +90450 -1.000000 +90451 -1.000000 +90452 -1.000000 +90453 -1.000000 +90454 -1.000000 +90455 -1.000000 +90456 -1.000000 +90457 -1.000000 +90458 -1.000000 +90459 -1.000000 +90460 -1.000000 +90462 -1.000000 +90463 -1.000000 +90465 -1.000000 +90466 -1.000000 +90468 -1.000000 +90471 -1.000000 +90472 -1.000000 +90473 -1.000000 +90474 -1.000000 +90475 -1.000000 +90476 -1.000000 +90477 -1.000000 +90478 -1.000000 +90479 -1.000000 +90480 -1.000000 +90481 -1.000000 +90482 -1.000000 +90483 -1.000000 +90484 -1.000000 +90485 -1.000000 +90486 -1.000000 +90487 -1.000000 +90488 -1.000000 +90489 -1.000000 +90490 -1.000000 +90491 -1.000000 +90492 -1.000000 +90493 -1.000000 +90494 -1.000000 +90496 -1.000000 +90497 -1.000000 +90498 -1.000000 +90499 -1.000000 +90500 -1.000000 +90501 -1.000000 +90502 -1.000000 +90503 -1.000000 +90504 -1.000000 +90505 -1.000000 +90506 -1.000000 +90507 -1.000000 +90508 -1.000000 +90509 -1.000000 +90510 -1.000000 +90511 -1.000000 +90514 -1.000000 +90515 -1.000000 +90516 -1.000000 +90517 -1.000000 +90518 -1.000000 +90519 -1.000000 +90520 -1.000000 +90521 -1.000000 +90522 -1.000000 +90523 -1.000000 +90524 -1.000000 +90525 -1.000000 +90526 -1.000000 +90527 -1.000000 +90528 -1.000000 +90530 -1.000000 +90531 -1.000000 +90534 -1.000000 +90535 -1.000000 +90536 -1.000000 +90537 -1.000000 +90538 -1.000000 +90539 -1.000000 +90540 -1.000000 +90541 -1.000000 +90542 -1.000000 +90543 -1.000000 +90545 -1.000000 +90546 -1.000000 +90547 -1.000000 +90549 -1.000000 +90550 -1.000000 +90551 -1.000000 +90552 -1.000000 +90553 -1.000000 +90554 -1.000000 +90555 -1.000000 +90556 -1.000000 +90557 -1.000000 +90558 -1.000000 +90559 -1.000000 +90560 -1.000000 +90561 -1.000000 +90562 -1.000000 +90563 -1.000000 +90564 -1.000000 +90565 -1.000000 +90566 -1.000000 +90567 -1.000000 +90568 -1.000000 +90569 -1.000000 +90570 -1.000000 +90571 -1.000000 +90572 -1.000000 +90573 -1.000000 +90574 -1.000000 +90575 -1.000000 +90576 -1.000000 +90577 -1.000000 +90578 -1.000000 +90580 -1.000000 +90581 -1.000000 +90582 -1.000000 +90583 -1.000000 +90584 -1.000000 +90586 -1.000000 +90587 -1.000000 +90588 -1.000000 +90589 -1.000000 +90590 -1.000000 +90591 -1.000000 +90592 -1.000000 +90593 -1.000000 +90597 -1.000000 +90604 -1.000000 +90605 -1.000000 +90608 -1.000000 +90609 -1.000000 +90610 -1.000000 +90622 -1.000000 +90626 -1.000000 +90627 -1.000000 +90628 -1.000000 +90629 -1.000000 +90630 -1.000000 +90631 -1.000000 +90632 -1.000000 +90633 -1.000000 +90634 -1.000000 +90635 -1.000000 +90636 -1.000000 +90637 -1.000000 +90638 -1.000000 +90640 -1.000000 +90642 -1.000000 +90645 -1.000000 +90646 -1.000000 +90647 -1.000000 +90649 -1.000000 +90650 -1.000000 +90651 -1.000000 +90652 -1.000000 +90653 -1.000000 +90654 -1.000000 +90655 -1.000000 +90656 -1.000000 +90657 -1.000000 +90658 -1.000000 +90660 -1.000000 +90661 -1.000000 +90662 -1.000000 +90663 -1.000000 +90664 -1.000000 +90665 -1.000000 +90666 -1.000000 +90667 -1.000000 +90668 -1.000000 +90669 -1.000000 +90670 -1.000000 +90671 -1.000000 +90672 -1.000000 +90674 -1.000000 +90677 -1.000000 +90678 -1.000000 +90682 -1.000000 +90683 -1.000000 +90697 -1.000000 +90698 -1.000000 +90702 -1.000000 +90703 -1.000000 +90704 -1.000000 +90705 -1.000000 +90708 -1.000000 +90711 -1.000000 +90712 -1.000000 +90713 -1.000000 +90714 -1.000000 +90715 -1.000000 +90716 -1.000000 +90717 -1.000000 +90718 -1.000000 +90719 -1.000000 +90722 -1.000000 +90725 -1.000000 +90726 -1.000000 +90728 -1.000000 +90730 -1.000000 +90731 -1.000000 +90732 -1.000000 +90733 -1.000000 +90734 -1.000000 +90735 -1.000000 +90736 -1.000000 +90737 -1.000000 +90738 -1.000000 +90739 -1.000000 +90740 -1.000000 +90741 -1.000000 +90742 -1.000000 +90743 -1.000000 +90744 -1.000000 +90745 -1.000000 +90746 -1.000000 +90747 -1.000000 +90748 -1.000000 +90749 -1.000000 +90750 -1.000000 +90751 -1.000000 +90752 -1.000000 +90753 -1.000000 +90754 -1.000000 +90755 -1.000000 +90757 -1.000000 +90758 -1.000000 +90759 -1.000000 +90760 -1.000000 +90761 -1.000000 +90762 -1.000000 +90763 -1.000000 +90764 -1.000000 +90765 -1.000000 +90766 -1.000000 +90767 -1.000000 +90768 -1.000000 +90769 -1.000000 +90770 -1.000000 +90771 -1.000000 +90772 -1.000000 +90773 -1.000000 +90774 -1.000000 +90775 -1.000000 +90776 -1.000000 +90777 -1.000000 +90778 -1.000000 +90779 -1.000000 +90780 -1.000000 +90781 -1.000000 +90782 -1.000000 +90783 -1.000000 +90784 -1.000000 +90785 -1.000000 +90786 -1.000000 +90788 -1.000000 +90789 -1.000000 +90790 -1.000000 +90791 -1.000000 +90793 -1.000000 +90794 -1.000000 +90795 -1.000000 +90796 -1.000000 +90797 -1.000000 +90798 -1.000000 +90799 -1.000000 +90800 -1.000000 +90801 -1.000000 +90802 -1.000000 +90803 -1.000000 +90804 -1.000000 +90805 -1.000000 +90806 -1.000000 +90807 -1.000000 +90808 -1.000000 +90809 -1.000000 +90810 -1.000000 +90811 -1.000000 +90812 -1.000000 +90813 -1.000000 +90814 -1.000000 +90815 -1.000000 +90816 -1.000000 +90817 -1.000000 +90818 -1.000000 +90819 -1.000000 +90820 -1.000000 +90821 -1.000000 +90822 -1.000000 +90823 -1.000000 +90824 -1.000000 +90825 -1.000000 +90826 -1.000000 +90827 -1.000000 +90828 -1.000000 +90829 -1.000000 +90830 -1.000000 +90831 -1.000000 +90832 -1.000000 +90833 -1.000000 +90834 -1.000000 +90835 -1.000000 +90836 -1.000000 +90837 -1.000000 +90838 -1.000000 +90839 -1.000000 +90840 -1.000000 +90841 -1.000000 +90842 -1.000000 +90843 -1.000000 +90844 -1.000000 +90845 -1.000000 +90846 -1.000000 +90847 -1.000000 +90848 -1.000000 +90849 -1.000000 +90850 -1.000000 +90851 -1.000000 +90852 -1.000000 +90853 -1.000000 +90854 -1.000000 +90855 -1.000000 +90856 -1.000000 +90857 -1.000000 +90858 -1.000000 +90859 -1.000000 +90860 -1.000000 +90861 -1.000000 +90862 -1.000000 +90863 -1.000000 +90864 -1.000000 +90865 -1.000000 +90866 -1.000000 +90867 -1.000000 +90868 -1.000000 +90869 -1.000000 +90870 -1.000000 +90871 -1.000000 +90872 -1.000000 +90873 -1.000000 +90874 -1.000000 +90875 -1.000000 +90876 -1.000000 +90877 -1.000000 +90878 -1.000000 +90879 -1.000000 +90880 -1.000000 +90881 -1.000000 +90882 -1.000000 +90883 -1.000000 +90884 -1.000000 +90885 -1.000000 +90886 -1.000000 +90888 -1.000000 +90889 -1.000000 +90890 -1.000000 +90891 -1.000000 +90892 -1.000000 +90893 -1.000000 +90894 -1.000000 +90895 -1.000000 +90896 -1.000000 +90897 -1.000000 +90898 -1.000000 +90899 -1.000000 +90901 -1.000000 +90902 -1.000000 +90903 -1.000000 +90905 -1.000000 +90906 -1.000000 +90907 -1.000000 +90908 -1.000000 +90909 -1.000000 +90910 -1.000000 +90911 -1.000000 +90912 -1.000000 +90913 -1.000000 +90914 -1.000000 +90915 -1.000000 +90916 -1.000000 +90917 -1.000000 +90918 -1.000000 +90919 -1.000000 +90920 -1.000000 +90921 -1.000000 +90922 -1.000000 +90923 -1.000000 +90925 -1.000000 +90926 -1.000000 +90927 -1.000000 +90928 -1.000000 +90929 -1.000000 +90930 -1.000000 +90931 -1.000000 +90932 -1.000000 +90933 -1.000000 +90934 -1.000000 +90935 -1.000000 +90936 -1.000000 +90937 -1.000000 +90938 -1.000000 +90939 -1.000000 +90940 -1.000000 +90941 -1.000000 +90942 -1.000000 +90943 -1.000000 +90944 -1.000000 +90945 -1.000000 +90946 -1.000000 +90947 -1.000000 +90948 -1.000000 +90949 -1.000000 +90950 -1.000000 +90952 -1.000000 +90954 -1.000000 +90955 -1.000000 +90956 -1.000000 +90957 -1.000000 +90958 -1.000000 +90959 -1.000000 +90960 -1.000000 +90961 -1.000000 +90962 -1.000000 +90963 -1.000000 +90964 -1.000000 +90967 -1.000000 +90968 -1.000000 +90969 -1.000000 +90970 -1.000000 +90971 -1.000000 +90972 -1.000000 +90973 -1.000000 +90974 -1.000000 +90975 -1.000000 +90976 -1.000000 +90977 -1.000000 +90978 -1.000000 +90979 -1.000000 +90980 -1.000000 +90981 -1.000000 +90983 -1.000000 +90984 -1.000000 +90986 -1.000000 +90987 -1.000000 +90988 -1.000000 +90989 -1.000000 +90990 -1.000000 +90991 -1.000000 +90992 -1.000000 +90993 -1.000000 +90994 -1.000000 +90995 -1.000000 +90996 -1.000000 +90997 -1.000000 +90998 -1.000000 +90999 -1.000000 +91000 -1.000000 +91001 -1.000000 +91002 -1.000000 +91003 -1.000000 +91004 -1.000000 +91005 -1.000000 +91007 -1.000000 +91008 -1.000000 +91009 -1.000000 +91010 -1.000000 +91011 -1.000000 +91012 -1.000000 +91014 -1.000000 +91015 -1.000000 +91016 -1.000000 +91017 -1.000000 +91018 -1.000000 +91019 -1.000000 +91020 -1.000000 +91021 -1.000000 +91022 -1.000000 +91023 -1.000000 +91027 -1.000000 +91034 -1.000000 +91041 -1.000000 +91043 -1.000000 +91044 -1.000000 +91045 -1.000000 +91046 -1.000000 +91047 -1.000000 +91048 -1.000000 +91049 -1.000000 +91050 -1.000000 +91051 -1.000000 +91052 -1.000000 +91053 -1.000000 +91054 -1.000000 +91055 -1.000000 +91056 -1.000000 +91057 -1.000000 +91058 -1.000000 +91059 -1.000000 +91060 -1.000000 +91061 -1.000000 +91062 -1.000000 +91063 -1.000000 +91064 -1.000000 +91065 -1.000000 +91066 -1.000000 +91070 -1.000000 +91075 -1.000000 +91083 -1.000000 +91084 -1.000000 +91085 -1.000000 +91086 -1.000000 +91087 -1.000000 +91089 -1.000000 +91097 -1.000000 +91099 -1.000000 +91100 -1.000000 +91101 -1.000000 +91102 -1.000000 +91104 -1.000000 +91105 -1.000000 +91106 -1.000000 +91107 -1.000000 +91108 -1.000000 +91109 -1.000000 +91110 -1.000000 +91111 -1.000000 +91112 -1.000000 +91113 -1.000000 +91114 -1.000000 +91115 -1.000000 +91116 -1.000000 +91117 -1.000000 +91118 -1.000000 +91119 -1.000000 +91120 -1.000000 +91121 -1.000000 +91122 -1.000000 +91123 -1.000000 +91124 -1.000000 +91125 -1.000000 +91126 -1.000000 +91127 -1.000000 +91128 -1.000000 +91129 -1.000000 +91130 -1.000000 +91131 -1.000000 +91133 -1.000000 +91134 -1.000000 +91135 -1.000000 +91136 -1.000000 +91137 -1.000000 +91138 -1.000000 +91139 -1.000000 +91140 -1.000000 +91141 -1.000000 +91142 -1.000000 +91143 -1.000000 +91144 -1.000000 +91145 -1.000000 +91146 -1.000000 +91147 -1.000000 +91148 -1.000000 +91149 -1.000000 +91150 -1.000000 +91151 -1.000000 +91152 -1.000000 +91153 -1.000000 +91154 -1.000000 +91155 -1.000000 +91156 -1.000000 +91157 -1.000000 +91158 -1.000000 +91159 -1.000000 +91160 -1.000000 +91161 -1.000000 +91162 -1.000000 +91163 -1.000000 +91164 -1.000000 +91165 -1.000000 +91166 -1.000000 +91167 -1.000000 +91168 -1.000000 +91169 -1.000000 +91170 -1.000000 +91171 -1.000000 +91172 -1.000000 +91173 -1.000000 +91174 -1.000000 +91175 -1.000000 +91176 -1.000000 +91177 -1.000000 +91178 -1.000000 +91179 -1.000000 +91180 -1.000000 +91181 -1.000000 +91182 -1.000000 +91183 -1.000000 +91184 -1.000000 +91185 -1.000000 +91186 -1.000000 +91187 -1.000000 +91188 -1.000000 +91189 -1.000000 +91190 -1.000000 +91191 -1.000000 +91192 -1.000000 +91193 -1.000000 +91194 -1.000000 +91195 -1.000000 +91196 -1.000000 +91197 -1.000000 +91198 -1.000000 +91199 -1.000000 +91200 -1.000000 +91201 -1.000000 +91202 -1.000000 +91203 -1.000000 +91204 -1.000000 +91205 -1.000000 +91206 -1.000000 +91207 -1.000000 +91208 -1.000000 +91209 -1.000000 +91210 -1.000000 +91211 -1.000000 +91212 -1.000000 +91213 -1.000000 +91214 -1.000000 +91215 -1.000000 +91216 -1.000000 +91217 -1.000000 +91218 -1.000000 +91219 -1.000000 +91220 -1.000000 +91221 -1.000000 +91222 -1.000000 +91223 -1.000000 +91224 -1.000000 +91225 -1.000000 +91226 -1.000000 +91227 -1.000000 +91228 -1.000000 +91229 -1.000000 +91230 -1.000000 +91231 -1.000000 +91232 -1.000000 +91233 -1.000000 +91234 -1.000000 +91235 -1.000000 +91236 -1.000000 +91237 -1.000000 +91238 -1.000000 +91239 -1.000000 +91240 -1.000000 +91241 -1.000000 +91242 -1.000000 +91244 -1.000000 +91245 -1.000000 +91246 -1.000000 +91247 -1.000000 +91248 -1.000000 +91249 -1.000000 +91250 -1.000000 +91251 -1.000000 +91252 -1.000000 +91253 -1.000000 +91254 -1.000000 +91255 -1.000000 +91256 -1.000000 +91257 -1.000000 +91258 -1.000000 +91259 -1.000000 +91260 -1.000000 +91261 -1.000000 +91262 -1.000000 +91263 -1.000000 +91264 -1.000000 +91265 -1.000000 +91267 -1.000000 +91268 -1.000000 +91270 -1.000000 +91271 -1.000000 +91272 -1.000000 +91273 -1.000000 +91274 -1.000000 +91275 -1.000000 +91276 -1.000000 +91277 -1.000000 +91279 -1.000000 +91280 -1.000000 +91281 -1.000000 +91282 -1.000000 +91283 -1.000000 +91286 -1.000000 +91287 -1.000000 +91288 -1.000000 +91289 -1.000000 +91290 -1.000000 +91295 -1.000000 +91296 -1.000000 +91297 -1.000000 +91298 -1.000000 +91299 -1.000000 +91301 -1.000000 +91303 -1.000000 +91304 -1.000000 +91305 -1.000000 +91306 -1.000000 +91307 -1.000000 +91308 -1.000000 +91309 -1.000000 +91310 -1.000000 +91311 -1.000000 +91312 -1.000000 +91313 -1.000000 +91314 -1.000000 +91315 -1.000000 +91316 -1.000000 +91317 -1.000000 +91318 -1.000000 +91319 -1.000000 +91320 -1.000000 +91321 -1.000000 +91322 -1.000000 +91323 -1.000000 +91324 -1.000000 +91325 -1.000000 +91326 -1.000000 +91327 -1.000000 +91328 -1.000000 +91329 -1.000000 +91330 -1.000000 +91331 -1.000000 +91332 -1.000000 +91333 -1.000000 +91335 -1.000000 +91336 -1.000000 +91337 -1.000000 +91341 -1.000000 +91343 -1.000000 +91344 -1.000000 +91345 -1.000000 +91346 -1.000000 +91347 -1.000000 +91348 -1.000000 +91349 -1.000000 +91350 -1.000000 +91351 -1.000000 +91352 -1.000000 +91353 -1.000000 +91354 -1.000000 +91356 -1.000000 +91357 -1.000000 +91359 -1.000000 +91360 -1.000000 +91361 -1.000000 +91362 -1.000000 +91363 -1.000000 +91364 -1.000000 +91365 -1.000000 +91366 -1.000000 +91367 -1.000000 +91368 -1.000000 +91369 -1.000000 +91370 -1.000000 +91371 -1.000000 +91372 -1.000000 +91373 -1.000000 +91374 -1.000000 +91375 -1.000000 +91376 -1.000000 +91377 -1.000000 +91378 -1.000000 +91379 -1.000000 +91380 -1.000000 +91381 -1.000000 +91382 -1.000000 +91383 -1.000000 +91384 -1.000000 +91385 -1.000000 +91386 -1.000000 +91387 -1.000000 +91389 -1.000000 +91390 -1.000000 +91391 -1.000000 +91392 -1.000000 +91393 -1.000000 +91394 -1.000000 +91395 -1.000000 +91396 -1.000000 +91397 -1.000000 +91398 -1.000000 +91399 -1.000000 +91400 -1.000000 +91401 -1.000000 +91402 -1.000000 +91403 -1.000000 +91404 -1.000000 +91405 -1.000000 +91406 -1.000000 +91408 -1.000000 +91409 -1.000000 +91410 -1.000000 +91411 -1.000000 +91412 -1.000000 +91413 -1.000000 +91414 -1.000000 +91415 -1.000000 +91416 -1.000000 +91417 -1.000000 +91418 -1.000000 +91419 -1.000000 +91420 -1.000000 +91421 -1.000000 +91422 -1.000000 +91423 -1.000000 +91424 -1.000000 +91425 -1.000000 +91426 -1.000000 +91428 -1.000000 +91430 -1.000000 +91431 -1.000000 +91432 -1.000000 +91433 -1.000000 +91434 -1.000000 +91435 -1.000000 +91436 -1.000000 +91437 -1.000000 +91438 -1.000000 +91439 -1.000000 +91440 -1.000000 +91441 -1.000000 +91442 -1.000000 +91444 -1.000000 +91447 -1.000000 +91448 -1.000000 +91449 -1.000000 +91450 -1.000000 +91451 -1.000000 +91452 -1.000000 +91453 -1.000000 +91454 -1.000000 +91455 -1.000000 +91456 -1.000000 +91457 -1.000000 +91458 -1.000000 +91459 -1.000000 +91460 -1.000000 +91461 -1.000000 +91462 -1.000000 +91464 -1.000000 +91465 -1.000000 +91466 -1.000000 +91467 -1.000000 +91468 -1.000000 +91469 -1.000000 +91470 -1.000000 +91471 -1.000000 +91472 -1.000000 +91473 -1.000000 +91474 -1.000000 +91475 -1.000000 +91476 -1.000000 +91477 -1.000000 +91478 -1.000000 +91479 -1.000000 +91480 -1.000000 +91481 -1.000000 +91482 -1.000000 +91483 -1.000000 +91484 -1.000000 +91485 -1.000000 +91486 -1.000000 +91487 -1.000000 +91488 -1.000000 +91489 -1.000000 +91490 -1.000000 +91491 -1.000000 +91492 -1.000000 +91493 -1.000000 +91494 -1.000000 +91495 -1.000000 +91496 -1.000000 +91498 -1.000000 +91499 -1.000000 +91500 -1.000000 +91501 -1.000000 +91502 -1.000000 +91503 -1.000000 +91504 -1.000000 +91505 -1.000000 +91507 -1.000000 +91508 -1.000000 +91510 -1.000000 +91511 -1.000000 +91512 -1.000000 +91513 -1.000000 +91514 -1.000000 +91515 -1.000000 +91516 -1.000000 +91517 -1.000000 +91518 -1.000000 +91519 -1.000000 +91520 -1.000000 +91521 -1.000000 +91523 -1.000000 +91524 -1.000000 +91525 -1.000000 +91526 -1.000000 +91527 -1.000000 +91528 -1.000000 +91529 -1.000000 +91530 -1.000000 +91531 -1.000000 +91532 -1.000000 +91533 -1.000000 +91535 -1.000000 +91536 -1.000000 +91537 -1.000000 +91538 -1.000000 +91539 -1.000000 +91540 -1.000000 +91542 -1.000000 +91543 -1.000000 +91544 -1.000000 +91545 -1.000000 +91546 -1.000000 +91547 -1.000000 +91548 -1.000000 +91549 -1.000000 +91550 -1.000000 +91551 -1.000000 +91552 -1.000000 +91553 -1.000000 +91554 -1.000000 +91555 -1.000000 +91556 -1.000000 +91557 -1.000000 +91558 -1.000000 +91559 -1.000000 +91560 -1.000000 +91561 -1.000000 +91562 -1.000000 +91563 -1.000000 +91564 -1.000000 +91565 -1.000000 +91566 -1.000000 +91567 -1.000000 +91568 -1.000000 +91569 -1.000000 +91571 -1.000000 +91573 -1.000000 +91574 -1.000000 +91575 -1.000000 +91576 -1.000000 +91577 -1.000000 +91578 -1.000000 +91579 -1.000000 +91580 -1.000000 +91581 -1.000000 +91582 -1.000000 +91583 -1.000000 +91584 -1.000000 +91585 -1.000000 +91587 -1.000000 +91588 -1.000000 +91590 -1.000000 +91591 -1.000000 +91592 -1.000000 +91593 -1.000000 +91594 -1.000000 +91595 -1.000000 +91596 -1.000000 +91597 -1.000000 +91599 -1.000000 +91600 -1.000000 +91601 -1.000000 +91602 -1.000000 +91603 -1.000000 +91604 -1.000000 +91605 -1.000000 +91606 -1.000000 +91607 -1.000000 +91608 -1.000000 +91609 -1.000000 +91610 -1.000000 +91611 -1.000000 +91612 -1.000000 +91613 -1.000000 +91614 -1.000000 +91616 -1.000000 +91617 -1.000000 +91618 -1.000000 +91619 -1.000000 +91620 -1.000000 +91621 -1.000000 +91622 -1.000000 +91623 -1.000000 +91624 -1.000000 +91625 -1.000000 +91626 -1.000000 +91630 -1.000000 +91631 -1.000000 +91632 -1.000000 +91633 -1.000000 +91634 -1.000000 +91635 -1.000000 +91637 -1.000000 +91638 -1.000000 +91639 -1.000000 +91640 -1.000000 +91643 -1.000000 +91644 -1.000000 +91645 -1.000000 +91646 -1.000000 +91647 -1.000000 +91648 -1.000000 +91649 -1.000000 +91650 -1.000000 +91652 -1.000000 +91653 -1.000000 +91654 -1.000000 +91655 -1.000000 +91656 -1.000000 +91658 -1.000000 +91659 -1.000000 +91660 -1.000000 +91661 -1.000000 +91662 -1.000000 +91663 -1.000000 +91664 -1.000000 +91665 -1.000000 +91666 -1.000000 +91667 -1.000000 +91668 -1.000000 +91669 -1.000000 +91670 -1.000000 +91671 -1.000000 +91672 -1.000000 +91673 -1.000000 +91674 -1.000000 +91675 -1.000000 +91676 -1.000000 +91679 -1.000000 +91680 -1.000000 +91682 -1.000000 +91683 -1.000000 +91684 -1.000000 +91685 -1.000000 +91686 -1.000000 +91687 -1.000000 +91688 -1.000000 +91689 -1.000000 +91690 -1.000000 +91691 -1.000000 +91692 -1.000000 +91693 -1.000000 +91694 -1.000000 +91695 -1.000000 +91697 -1.000000 +91698 -1.000000 +91699 -1.000000 +91700 -1.000000 +91701 -1.000000 +91702 -1.000000 +91703 -1.000000 +91705 -1.000000 +91706 -1.000000 +91708 -1.000000 +91710 -1.000000 +91711 -1.000000 +91712 -1.000000 +91713 -1.000000 +91714 -1.000000 +91715 -1.000000 +91716 -1.000000 +91717 -1.000000 +91718 -1.000000 +91719 -1.000000 +91720 -1.000000 +91721 -1.000000 +91722 -1.000000 +91723 -1.000000 +91724 -1.000000 +91725 -1.000000 +91726 -1.000000 +91729 -1.000000 +91730 -1.000000 +91731 -1.000000 +91732 -1.000000 +91733 -1.000000 +91734 -1.000000 +91735 -1.000000 +91736 -1.000000 +91737 -1.000000 +91738 -1.000000 +91739 -1.000000 +91740 -1.000000 +91741 -1.000000 +91742 -1.000000 +91743 -1.000000 +91744 -1.000000 +91745 -1.000000 +91746 -1.000000 +91747 -1.000000 +91748 -1.000000 +91749 -1.000000 +91750 -1.000000 +91751 -1.000000 +91752 -1.000000 +91753 -1.000000 +91754 -1.000000 +91755 -1.000000 +91756 -1.000000 +91757 -1.000000 +91758 -1.000000 +91759 -1.000000 +91760 -1.000000 +91761 -1.000000 +91762 -1.000000 +91763 -1.000000 +91764 -1.000000 +91765 -1.000000 +91766 -1.000000 +91767 -1.000000 +91768 -1.000000 +91769 -1.000000 +91770 -1.000000 +91771 -1.000000 +91772 -1.000000 +91773 -1.000000 +91774 -1.000000 +91775 -1.000000 +91776 -1.000000 +91777 -1.000000 +91778 -1.000000 +91779 -1.000000 +91780 -1.000000 +91781 -1.000000 +91782 -1.000000 +91783 -1.000000 +91784 -1.000000 +91785 -1.000000 +91786 -1.000000 +91787 -1.000000 +91788 -1.000000 +91789 -1.000000 +91790 -1.000000 +91791 -1.000000 +91792 -1.000000 +91794 -1.000000 +91795 -1.000000 +91797 -1.000000 +91798 -1.000000 +91799 -1.000000 +91800 -1.000000 +91801 -1.000000 +91802 -1.000000 +91803 -1.000000 +91804 -1.000000 +91805 -1.000000 +91806 -1.000000 +91807 -1.000000 +91808 -1.000000 +91809 -1.000000 +91810 -1.000000 +91811 -1.000000 +91812 -1.000000 +91813 -1.000000 +91814 -1.000000 +91815 -1.000000 +91816 -1.000000 +91817 -1.000000 +91818 -1.000000 +91819 -1.000000 +91821 -1.000000 +91822 -1.000000 +91823 -1.000000 +91824 -1.000000 +91825 -1.000000 +91827 -1.000000 +91828 -1.000000 +91829 -1.000000 +91830 -1.000000 +91831 -1.000000 +91833 -1.000000 +91834 -1.000000 +91835 -1.000000 +91836 -1.000000 +91837 -1.000000 +91838 -1.000000 +91839 -1.000000 +91840 -1.000000 +91841 -1.000000 +91842 -1.000000 +91844 -1.000000 +91845 -1.000000 +91846 -1.000000 +91847 -1.000000 +91848 -1.000000 +91849 -1.000000 +91850 -1.000000 +91851 -1.000000 +91852 -1.000000 +91853 -1.000000 +91854 -1.000000 +91855 -1.000000 +91856 -1.000000 +91857 -1.000000 +91858 -1.000000 +91859 -1.000000 +91860 -1.000000 +91861 -1.000000 +91862 -1.000000 +91863 -1.000000 +91864 -1.000000 +91865 -1.000000 +91866 -1.000000 +91867 -1.000000 +91868 -1.000000 +91869 -1.000000 +91870 -1.000000 +91871 -1.000000 +91872 -1.000000 +91873 -1.000000 +91874 -1.000000 +91875 -1.000000 +91876 -1.000000 +91877 -1.000000 +91878 -1.000000 +91879 -1.000000 +91880 -1.000000 +91881 -1.000000 +91882 -1.000000 +91883 -1.000000 +91884 -1.000000 +91885 -1.000000 +91886 -1.000000 +91887 -1.000000 +91890 -1.000000 +91891 -1.000000 +91892 -1.000000 +91893 -1.000000 +91894 -1.000000 +91895 -1.000000 +91896 -1.000000 +91897 -1.000000 +91898 -1.000000 +91899 -1.000000 +91900 -1.000000 +91901 -1.000000 +91902 -1.000000 +91903 -1.000000 +91904 -1.000000 +91905 -1.000000 +91906 -1.000000 +91908 -1.000000 +91909 -1.000000 +91910 -1.000000 +91911 -1.000000 +91912 -1.000000 +91913 -1.000000 +91914 -1.000000 +91915 -1.000000 +91916 -1.000000 +91917 -1.000000 +91918 -1.000000 +91919 -1.000000 +91920 -1.000000 +91921 -1.000000 +91922 -1.000000 +91923 -1.000000 +91925 -1.000000 +91926 -1.000000 +91927 -1.000000 +91928 -1.000000 +91929 -1.000000 +91930 -1.000000 +91931 -1.000000 +91932 -1.000000 +91933 -1.000000 +91934 -1.000000 +91935 -1.000000 +91936 -1.000000 +91937 -1.000000 +91938 -1.000000 +91939 -1.000000 +91940 -1.000000 +91941 -1.000000 +91942 -1.000000 +91943 -1.000000 +91944 -1.000000 +91945 -1.000000 +91946 -1.000000 +91947 -1.000000 +91948 -1.000000 +91949 -1.000000 +91950 -1.000000 +91951 -1.000000 +91952 -1.000000 +91953 -1.000000 +91954 -1.000000 +91955 -1.000000 +91956 -1.000000 +91957 -1.000000 +91958 -1.000000 +91959 -1.000000 +91960 -1.000000 +91961 -1.000000 +91962 -1.000000 +91964 -1.000000 +91965 -1.000000 +91966 -1.000000 +91967 -1.000000 +91968 -1.000000 +91969 -1.000000 +91973 -1.000000 +91974 -1.000000 +91975 -1.000000 +91976 -1.000000 +91978 -1.000000 +91979 -1.000000 +91980 -1.000000 +91982 -1.000000 +91984 -1.000000 +91985 -1.000000 +91986 -1.000000 +91987 -1.000000 +91988 -1.000000 +91996 -1.000000 +91999 -1.000000 +92000 -1.000000 +92002 -1.000000 +92004 -1.000000 +92005 -1.000000 +92007 -1.000000 +92011 -1.000000 +92023 -1.000000 +92024 -1.000000 +92025 -1.000000 +92026 -1.000000 +92027 -1.000000 +92028 -1.000000 +92029 -1.000000 +92030 -1.000000 +92032 -1.000000 +92039 -1.000000 +92041 -1.000000 +92042 -1.000000 +92046 -1.000000 +92048 -1.000000 +92051 -1.000000 +92052 -1.000000 +92053 -1.000000 +92055 -1.000000 +92058 -1.000000 +92060 -1.000000 +92061 -1.000000 +92062 -1.000000 +92063 -1.000000 +92064 -1.000000 +92065 -1.000000 +92066 -1.000000 +92067 -1.000000 +92068 -1.000000 +92071 -1.000000 +92073 -1.000000 +92074 -1.000000 +92075 -1.000000 +92076 -1.000000 +92078 -1.000000 +92079 -1.000000 +92083 -1.000000 +92084 -1.000000 +92085 -1.000000 +92086 -1.000000 +92089 -1.000000 +92090 -1.000000 +92091 -1.000000 +92092 -1.000000 +92093 -1.000000 +92094 -1.000000 +92095 -1.000000 +92096 -1.000000 +92097 -1.000000 +92102 -1.000000 +92103 -1.000000 +92104 -1.000000 +92106 -1.000000 +92108 -1.000000 +92109 -1.000000 +92110 -1.000000 +92111 -1.000000 +92112 -1.000000 +92114 -1.000000 +92115 -1.000000 +92117 -1.000000 +92118 -1.000000 +92119 -1.000000 +92121 -1.000000 +92122 -1.000000 +92126 -1.000000 +92127 -1.000000 +92128 -1.000000 +92130 -1.000000 +92131 -1.000000 +92133 -1.000000 +92137 -1.000000 +92138 -1.000000 +92139 -1.000000 +92141 -1.000000 +92142 -1.000000 +92143 -1.000000 +92145 -1.000000 +92146 -1.000000 +92147 -1.000000 +92148 -1.000000 +92149 -1.000000 +92150 -1.000000 +92151 -1.000000 +92154 -1.000000 +92155 -1.000000 +92158 -1.000000 +92159 -1.000000 +92160 -1.000000 +92161 -1.000000 +92162 -1.000000 +92163 -1.000000 +92164 -1.000000 +92166 -1.000000 +92167 -1.000000 +92168 -1.000000 +92169 -1.000000 +92170 -1.000000 +92171 -1.000000 +92172 -1.000000 +92173 -1.000000 +92175 -1.000000 +92177 -1.000000 +92178 -1.000000 +92179 -1.000000 +92180 -1.000000 +92183 -1.000000 +92184 -1.000000 +92187 -1.000000 +92191 -1.000000 +92193 -1.000000 +92194 -1.000000 +92195 -1.000000 +92196 -1.000000 +92198 -1.000000 +92200 -1.000000 +92201 -1.000000 +92202 -1.000000 +92203 -1.000000 +92204 -1.000000 +92206 -1.000000 +92207 -1.000000 +92209 -1.000000 +92216 -1.000000 +92218 -1.000000 +92219 -1.000000 +92222 -1.000000 +92223 -1.000000 +92224 -1.000000 +92228 -1.000000 +92232 -1.000000 +92234 -1.000000 +92237 -1.000000 +92242 -1.000000 +92243 -1.000000 +92244 -1.000000 +92245 -1.000000 +92247 -1.000000 +92248 -1.000000 +92249 -1.000000 +92250 -1.000000 +92251 -1.000000 +92252 -1.000000 +92254 -1.000000 +92255 -1.000000 +92256 -1.000000 +92257 -1.000000 +92259 -1.000000 +92260 -1.000000 +92261 -1.000000 +92262 -1.000000 +92263 -1.000000 +92265 -1.000000 +92266 -1.000000 +92268 -1.000000 +92272 -1.000000 +92273 -1.000000 +92274 -1.000000 +92275 -1.000000 +92276 -1.000000 +92277 -1.000000 +92279 -1.000000 +92280 -1.000000 +92281 -1.000000 +92282 -1.000000 +92283 -1.000000 +92284 -1.000000 +92285 -1.000000 +92286 -1.000000 +92290 -1.000000 +92291 -1.000000 +92292 -1.000000 +92293 -1.000000 +92294 -1.000000 +92295 -1.000000 +92298 -1.000000 +92301 -1.000000 +92302 -1.000000 +92303 -1.000000 +92304 -1.000000 +92306 -1.000000 +92307 -1.000000 +92310 -1.000000 +92314 -1.000000 +92315 -1.000000 +92316 -1.000000 +92318 -1.000000 +92319 -1.000000 +92320 -1.000000 +92321 -1.000000 +92322 -1.000000 +92323 -1.000000 +92324 -1.000000 +92326 -1.000000 +92327 -1.000000 +92328 -1.000000 +92329 -1.000000 +92330 -1.000000 +92331 -1.000000 +92332 -1.000000 +92333 -1.000000 +92334 -1.000000 +92335 -1.000000 +92336 -1.000000 +92337 -1.000000 +92338 -1.000000 +92339 -1.000000 +92340 -1.000000 +92341 -1.000000 +92342 -1.000000 +92343 -1.000000 +92344 -1.000000 +92345 -1.000000 +92346 -1.000000 +92347 -1.000000 +92348 -1.000000 +92350 -1.000000 +92351 -1.000000 +92352 -1.000000 +92353 -1.000000 +92354 -1.000000 +92355 -1.000000 +92369 -1.000000 +92370 -1.000000 +92371 -1.000000 +92373 -1.000000 +92374 -1.000000 +92379 -1.000000 +92380 -1.000000 +92382 -1.000000 +92383 -1.000000 +92385 -1.000000 +92386 -1.000000 +92387 -1.000000 +92388 -1.000000 +92390 -1.000000 +92391 -1.000000 +92392 -1.000000 +92396 -1.000000 +92397 -1.000000 +92400 -1.000000 +92401 -1.000000 +92403 -1.000000 +92405 -1.000000 +92406 -1.000000 +92407 -1.000000 +92409 -1.000000 +92411 -1.000000 +92412 -1.000000 +92416 -1.000000 +92417 -1.000000 +92418 -1.000000 +92419 -1.000000 +92420 -1.000000 +92421 -1.000000 +92423 -1.000000 +92425 -1.000000 +92426 -1.000000 +92428 -1.000000 +92429 -1.000000 +92430 -1.000000 +92431 -1.000000 +92434 -1.000000 +92436 -1.000000 +92438 -1.000000 +92439 -1.000000 +92440 -1.000000 +92441 -1.000000 +92442 -1.000000 +92443 -1.000000 +92444 -1.000000 +92445 -1.000000 +92446 -1.000000 +92450 -1.000000 +92451 -1.000000 +92455 -1.000000 +92463 -1.000000 +92464 -1.000000 +92465 -1.000000 +92467 -1.000000 +92468 -1.000000 +92469 -1.000000 +92470 -1.000000 +92471 -1.000000 +92472 -1.000000 +92473 -1.000000 +92474 -1.000000 +92475 -1.000000 +92476 -1.000000 +92478 -1.000000 +92479 -1.000000 +92480 -1.000000 +92481 -1.000000 +92482 -1.000000 +92483 -1.000000 +92484 -1.000000 +92485 -1.000000 +92486 -1.000000 +92487 -1.000000 +92488 -1.000000 +92489 -1.000000 +92490 -1.000000 +92491 -1.000000 +92492 -1.000000 +92493 -1.000000 +92494 -1.000000 +92495 -1.000000 +92496 -1.000000 +92498 -1.000000 +92499 -1.000000 +92501 -1.000000 +92502 -1.000000 +92503 -1.000000 diff --git a/data/shot_lists/jet/ILW_unint_full.txt b/data/shot_lists/jet/ILW_unint_full.txt new file mode 100644 index 00000000..62d403fd --- /dev/null +++ b/data/shot_lists/jet/ILW_unint_full.txt @@ -0,0 +1,626 @@ +80181 53.449000 +80195 68.864000 +80406 53.576000 +80487 57.883000 +80511 48.311000 +80512 46.088000 +80605 55.027000 +80609 64.760000 +80618 56.576000 +80652 53.142000 +80697 42.951000 +80706 54.171000 +80708 60.396000 +80749 51.260000 +80763 51.188000 +80764 50.835000 +80772 61.272000 +80773 51.189000 +80774 51.174000 +80847 59.291000 +80848 51.293000 +80853 52.554000 +80874 42.675000 +80947 62.458000 +80997 52.026000 +81008 63.293000 +81017 59.602000 +81024 55.104000 +81159 59.258000 +81191 66.438000 +81193 66.794000 +81197 54.891000 +81200 54.856000 +81203 54.936000 +81228 63.141000 +81308 55.002000 +81312 55.132000 +81313 56.724000 +81422 63.023000 +81438 54.892000 +81491 53.608000 +81502 64.762000 +81516 54.359000 +81517 50.880000 +81520 52.024000 +81521 51.304000 +81522 53.568000 +81526 52.243000 +81529 53.114000 +81530 52.591000 +81531 53.179000 +81538 63.496000 +81578 52.476000 +81579 52.796000 +81580 47.769000 +81581 53.094000 +81582 49.885000 +81583 51.887000 +81584 53.700000 +81585 50.693000 +81586 52.229000 +81610 45.852000 +81612 58.154000 +81628 44.725000 +81637 51.697000 +81638 45.290000 +81667 54.792000 +81714 57.592000 +81727 51.519000 +81731 63.080000 +81749 62.328000 +81765 53.840000 +81766 53.632000 +81781 53.987000 +81782 59.770000 +81788 51.856000 +81789 48.291000 +81799 57.511000 +81801 61.508000 +81803 59.220000 +81804 56.343000 +81819 60.875000 +81820 55.141000 +81821 59.954000 +81823 57.094000 +81824 57.760000 +81826 60.292000 +81827 56.010000 +81833 51.525000 +81834 54.860000 +81867 46.299000 +81914 59.429000 +81953 59.763000 +81978 53.788000 +81983 59.458000 +81985 52.270000 +81990 52.379000 +81992 66.240000 +82001 53.367000 +82004 48.801000 +82005 53.782000 +82012 56.558000 +82013 53.698000 +82015 50.654000 +82016 51.803000 +82023 55.920000 +82024 55.753000 +82025 55.629000 +82034 57.566000 +82140 59.529000 +82157 61.799000 +82196 62.124000 +82218 63.128000 +82257 53.535000 +82258 53.221000 +82259 54.130000 +82281 59.615000 +82299 55.541000 +82304 53.114000 +82314 56.868000 +82318 52.942000 +82320 53.545000 +82342 57.058000 +82390 54.844000 +82393 56.699000 +82409 54.388000 +82415 54.861000 +82465 54.839000 +82466 56.725000 +82470 55.486000 +82473 56.413000 +82495 60.085000 +82499 59.595000 +82500 53.945000 +82502 62.277000 +82504 65.249000 +82553 56.615000 +82554 58.037000 +82555 58.092000 +82556 57.986000 +82569 61.856000 +82572 61.306000 +82577 56.849000 +82578 58.836000 +82589 56.072000 +82590 58.582000 +82669 64.898000 +82673 62.856000 +82674 57.066000 +82687 49.673000 +82698 47.111000 +82775 64.753000 +82780 57.023000 +82797 43.896000 +82807 59.433000 +82811 59.528000 +82822 53.340000 +82851 58.081000 +82852 58.015000 +82853 58.228000 +82867 55.737000 +82927 55.730000 +82932 63.365000 +82933 67.044000 +82934 67.099000 +82937 69.501000 +82938 60.763000 +82939 69.798000 +82940 69.591000 +82941 61.479000 +82942 69.717000 +82955 56.989000 +82962 64.172000 +82980 54.919000 +82981 59.284000 +83065 66.290000 +83083 60.340000 +83137 58.849000 +83143 51.231000 +83144 51.481000 +83146 51.490000 +83153 55.796000 +83154 53.804000 +83191 64.030000 +83209 59.014000 +83210 60.174000 +83216 57.638000 +83232 56.948000 +83233 54.305000 +83295 56.443000 +83312 44.808000 +83313 50.361000 +83314 48.663000 +83317 48.346000 +83324 50.743000 +83326 50.272000 +83330 58.715000 +83331 59.586000 +83333 60.973000 +83337 59.998000 +83338 59.674000 +83346 56.938000 +83352 56.594000 +83356 60.968000 +83363 57.301000 +83366 58.293000 +83381 61.786000 +83390 52.392000 +83403 57.689000 +83404 54.601000 +83411 43.780000 +83417 47.619000 +83423 45.608000 +83425 49.346000 +83435 59.928000 +83453 55.353000 +83504 55.365000 +83514 43.549000 +83515 42.126000 +83518 48.918000 +83519 44.031000 +83521 48.180000 +83522 49.216000 +83526 49.543000 +83531 48.851000 +83533 48.773000 +83545 53.969000 +83557 49.912000 +83566 49.743000 +83567 42.390000 +83568 47.534000 +83570 47.871000 +83571 52.837000 +83572 59.435000 +83598 58.713000 +83601 67.306000 +83611 44.922000 +83615 44.992000 +83618 52.350000 +83619 56.538000 +83620 53.530000 +83633 54.718000 +83635 58.275000 +83681 51.627000 +83698 45.183000 +83730 56.689000 +83980 57.094000 +83982 58.260000 +83987 60.302000 +83999 67.703000 +84031 52.478000 +84036 60.611000 +84051 42.442000 +84054 48.645000 +84077 62.348000 +84079 43.558000 +84115 62.483000 +84142 55.516000 +84143 55.849000 +84158 66.375000 +84160 66.072000 +84161 57.578000 +84162 65.768000 +84163 65.745000 +84164 65.581000 +84165 64.432000 +84166 65.260000 +84167 65.758000 +84168 65.609000 +84169 65.562000 +84170 64.446000 +84171 64.653000 +84172 61.274000 +84173 61.241000 +84180 57.028000 +84271 68.689000 +84275 71.964000 +84308 54.066000 +84315 61.706000 +84322 52.757000 +84323 50.809000 +84324 67.761000 +84328 52.269000 +84352 56.338000 +84408 56.079000 +84428 52.550000 +84433 64.507000 +84435 48.404000 +84462 53.487000 +84464 54.373000 +84465 53.856000 +84467 53.787000 +84517 55.391000 +84519 62.414000 +84520 61.561000 +84524 64.352000 +84581 58.570000 +84595 55.371000 +84600 54.728000 +84620 60.637000 +84628 44.644000 +84639 56.795000 +84640 60.077000 +84648 52.534000 +84655 53.855000 +84656 52.276000 +84657 53.012000 +84658 48.198000 +84671 48.609000 +84674 48.703000 +84676 47.269000 +84677 45.992000 +84679 48.144000 +84681 48.622000 +84690 57.988000 +84691 56.899000 +84695 45.147000 +84696 57.971000 +84707 42.448000 +84715 55.956000 +84716 61.576000 +84748 51.816000 +84808 49.022000 +84820 53.125000 +84826 53.835000 +84827 54.505000 +84828 53.998000 +84829 53.174000 +84857 52.303000 +84858 49.521000 +84861 61.379000 +84862 44.904000 +84869 59.811000 +84870 52.772000 +84912 55.777000 +84933 63.841000 +84935 44.202000 +84937 65.729000 +84942 53.223000 +84943 53.002000 +84946 53.406000 +84947 52.257000 +84950 54.623000 +84955 49.091000 +84957 56.140000 +84960 60.014000 +84962 60.116000 +84965 58.565000 +84986 54.540000 +84987 59.135000 +84988 54.721000 +84989 51.132000 +84990 51.432000 +84991 61.108000 +84994 47.247000 +84995 54.857000 +84996 64.204000 +84998 51.615000 +85005 64.394000 +85033 46.945000 +85048 57.780000 +85070 52.611000 +85072 52.023000 +85073 54.245000 +85074 52.204000 +85076 59.550000 +85077 61.266000 +85162 54.661000 +85164 47.220000 +85165 56.460000 +85168 57.332000 +85170 60.336000 +85171 54.831000 +85176 58.868000 +85177 56.874000 +85179 55.828000 +85182 55.635000 +85185 54.932000 +85187 60.373000 +85188 51.912000 +85189 61.024000 +85190 52.724000 +85191 53.310000 +85192 60.552000 +85193 54.018000 +85200 47.141000 +85202 42.509000 +85204 46.227000 +85212 58.269000 +85222 48.971000 +85229 56.333000 +85236 55.035000 +85238 57.957000 +85239 55.257000 +85240 56.385000 +85241 60.581000 +85251 55.288000 +85252 53.744000 +85253 55.255000 +85257 56.118000 +85258 55.034000 +85259 57.055000 +85285 50.560000 +85286 50.533000 +85287 50.850000 +85290 61.096000 +85291 61.063000 +85292 60.681000 +85293 54.933000 +85294 59.465000 +85295 55.196000 +85300 62.739000 +85359 55.633000 +85360 59.611000 +85362 51.807000 +85363 52.514000 +85387 64.350000 +85390 59.210000 +85396 47.740000 +85401 51.074000 +85410 61.132000 +85411 61.146000 +85447 61.926000 +85455 52.266000 +85457 63.455000 +85460 53.227000 +85467 53.057000 +85472 51.837000 +85473 51.687000 +85482 60.001000 +85483 46.571000 +85484 46.700000 +85551 46.766000 +85554 43.391000 +85593 42.798000 +85603 42.851000 +85643 49.750000 +85674 53.981000 +85720 46.072000 +85722 64.085000 +85727 46.283000 +85753 56.435000 +85763 48.685000 +85767 46.787000 +85771 54.050000 +85774 46.670000 +85779 54.184000 +85780 51.615000 +85792 52.684000 +85808 45.813000 +85809 53.861000 +85843 51.943000 +85861 51.218000 +85865 49.968000 +85867 50.332000 +85869 47.270000 +85882 50.214000 +85883 49.687000 +85925 45.264000 +85944 56.634000 +85958 59.550000 +85959 59.602000 +85964 54.644000 +86102 53.739000 +86129 55.013000 +86268 49.344000 +86291 57.813000 +86337 49.797000 +86448 63.370000 +86449 62.157000 +86542 50.178000 +86545 45.187000 +86558 51.933000 +86580 53.509000 +86585 50.981000 +86586 50.455000 +86588 49.225000 +86591 51.230000 +86601 50.629000 +86603 53.093000 +86614 54.230000 +86826 47.503000 +86866 64.704000 +86911 55.250000 +86986 60.128000 +86991 54.040000 +87011 43.133000 +87056 44.702000 +87068 51.719000 +87134 60.154000 +87151 63.217000 +87248 51.773000 +87254 52.503000 +87356 43.628000 +87434 45.286000 +87435 43.294000 +87441 44.718000 +87477 53.006000 +87478 48.760000 +87490 53.713000 +87510 54.918000 +87515 56.566000 +87640 53.051000 +87643 56.193000 +87644 56.042000 +87647 53.279000 +87649 54.203000 +87702 64.004000 +87713 59.769000 +87714 61.537000 +87719 59.209000 +87720 59.168000 +87728 46.427000 +87743 43.074000 +87746 52.294000 +87751 64.087000 +87757 62.878000 +87782 60.344000 +87787 50.256000 +87790 56.591000 +87791 46.965000 +87796 53.479000 +87797 57.577000 +87798 48.821000 +87811 48.633000 +87812 48.700000 +87813 48.773000 +87820 53.615000 +87821 57.520000 +87822 57.475000 +87824 57.865000 +87826 57.000000 +87827 52.926000 +87828 54.126000 +87832 47.632000 +87848 50.181000 +87856 56.234000 +87857 47.886000 +87859 56.751000 +87861 55.045000 +87863 55.824000 +87864 53.267000 +87878 51.628000 +87942 60.100000 +88098 50.168000 +88197 47.009000 +88220 47.283000 +88238 48.187000 +88239 55.773000 +88258 54.906000 +88367 58.489000 +88420 53.942000 +88494 59.049000 +88498 49.252000 +88499 49.996000 +88511 56.585000 +88520 57.916000 +88535 49.761000 +88547 55.957000 +88550 49.700000 +88577 52.380000 +88613 51.149000 +88627 56.809000 +88632 55.500000 +88736 62.365000 +88745 60.511000 +89127 54.600000 +89182 51.103000 +89186 51.129000 +89192 55.701000 +89325 56.046000 +89418 58.982000 +89439 59.408000 +89635 64.828000 +89659 50.743000 +89774 54.764000 +89780 54.256000 +89843 43.449000 +89892 50.899000 +90164 55.479000 +90218 51.472000 +90219 52.108000 +90226 56.852000 +90276 57.241000 +90333 45.624000 +90336 51.288000 +90337 51.364000 +90404 50.415000 +90433 50.711000 +90434 50.211000 +90444 50.718000 +90445 54.664000 +90544 55.149000 +90548 55.156000 +90641 53.673000 +91042 67.259000 +91072 62.929000 +91098 43.410000 +91103 47.177000 +91266 50.725000 +91302 55.967000 +91407 55.518000 +91627 53.645000 +91681 57.620000 +92038 54.712000 +92056 49.993000 +92057 49.949000 +92069 53.972000 +92077 50.535000 +92082 51.342000 +92101 48.219000 +92125 52.160000 +92135 58.630000 +92136 59.924000 +92140 60.312000 +92229 53.957000 +92264 53.918000 +92270 55.440000 +92305 53.205000 +92309 54.446000 +92312 54.222000 +92376 57.186000 +92377 56.089000 +92410 51.739000 +92422 54.664000 +92453 43.290000 diff --git a/data/shot_lists/jet/ILW_unint_late.txt b/data/shot_lists/jet/ILW_unint_late.txt new file mode 100644 index 00000000..3c6cf97b --- /dev/null +++ b/data/shot_lists/jet/ILW_unint_late.txt @@ -0,0 +1,380 @@ +83980 57.094000 +83982 58.260000 +83987 60.302000 +83999 67.703000 +84031 52.478000 +84036 60.611000 +84051 42.442000 +84054 48.645000 +84077 62.348000 +84079 43.558000 +84115 62.483000 +84142 55.516000 +84143 55.849000 +84158 66.375000 +84160 66.072000 +84161 57.578000 +84162 65.768000 +84163 65.745000 +84164 65.581000 +84165 64.432000 +84166 65.260000 +84167 65.758000 +84168 65.609000 +84169 65.562000 +84170 64.446000 +84171 64.653000 +84172 61.274000 +84173 61.241000 +84180 57.028000 +84271 68.689000 +84275 71.964000 +84308 54.066000 +84315 61.706000 +84322 52.757000 +84323 50.809000 +84324 67.761000 +84328 52.269000 +84352 56.338000 +84408 56.079000 +84428 52.550000 +84433 64.507000 +84435 48.404000 +84462 53.487000 +84464 54.373000 +84465 53.856000 +84467 53.787000 +84517 55.391000 +84519 62.414000 +84520 61.561000 +84524 64.352000 +84581 58.570000 +84595 55.371000 +84600 54.728000 +84620 60.637000 +84628 44.644000 +84639 56.795000 +84640 60.077000 +84648 52.534000 +84655 53.855000 +84656 52.276000 +84657 53.012000 +84658 48.198000 +84671 48.609000 +84674 48.703000 +84676 47.269000 +84677 45.992000 +84679 48.144000 +84681 48.622000 +84690 57.988000 +84691 56.899000 +84695 45.147000 +84696 57.971000 +84707 42.448000 +84715 55.956000 +84716 61.576000 +84748 51.816000 +84808 49.022000 +84820 53.125000 +84826 53.835000 +84827 54.505000 +84828 53.998000 +84829 53.174000 +84857 52.303000 +84858 49.521000 +84861 61.379000 +84862 44.904000 +84869 59.811000 +84870 52.772000 +84912 55.777000 +84933 63.841000 +84935 44.202000 +84937 65.729000 +84942 53.223000 +84943 53.002000 +84946 53.406000 +84947 52.257000 +84950 54.623000 +84955 49.091000 +84957 56.140000 +84960 60.014000 +84962 60.116000 +84965 58.565000 +84986 54.540000 +84987 59.135000 +84988 54.721000 +84989 51.132000 +84990 51.432000 +84991 61.108000 +84994 47.247000 +84995 54.857000 +84996 64.204000 +84998 51.615000 +85005 64.394000 +85033 46.945000 +85048 57.780000 +85070 52.611000 +85072 52.023000 +85073 54.245000 +85074 52.204000 +85076 59.550000 +85077 61.266000 +85162 54.661000 +85164 47.220000 +85165 56.460000 +85168 57.332000 +85170 60.336000 +85171 54.831000 +85176 58.868000 +85177 56.874000 +85179 55.828000 +85182 55.635000 +85185 54.932000 +85187 60.373000 +85188 51.912000 +85189 61.024000 +85190 52.724000 +85191 53.310000 +85192 60.552000 +85193 54.018000 +85200 47.141000 +85202 42.509000 +85204 46.227000 +85212 58.269000 +85222 48.971000 +85229 56.333000 +85236 55.035000 +85238 57.957000 +85239 55.257000 +85240 56.385000 +85241 60.581000 +85251 55.288000 +85252 53.744000 +85253 55.255000 +85257 56.118000 +85258 55.034000 +85259 57.055000 +85285 50.560000 +85286 50.533000 +85287 50.850000 +85290 61.096000 +85291 61.063000 +85292 60.681000 +85293 54.933000 +85294 59.465000 +85295 55.196000 +85300 62.739000 +85359 55.633000 +85360 59.611000 +85362 51.807000 +85363 52.514000 +85387 64.350000 +85390 59.210000 +85396 47.740000 +85401 51.074000 +85410 61.132000 +85411 61.146000 +85447 61.926000 +85455 52.266000 +85457 63.455000 +85460 53.227000 +85467 53.057000 +85472 51.837000 +85473 51.687000 +85482 60.001000 +85483 46.571000 +85484 46.700000 +85551 46.766000 +85554 43.391000 +85593 42.798000 +85603 42.851000 +85643 49.750000 +85674 53.981000 +85720 46.072000 +85722 64.085000 +85727 46.283000 +85753 56.435000 +85763 48.685000 +85767 46.787000 +85771 54.050000 +85774 46.670000 +85779 54.184000 +85780 51.615000 +85792 52.684000 +85808 45.813000 +85809 53.861000 +85843 51.943000 +85861 51.218000 +85865 49.968000 +85867 50.332000 +85869 47.270000 +85882 50.214000 +85883 49.687000 +85925 45.264000 +85944 56.634000 +85958 59.550000 +85959 59.602000 +85964 54.644000 +86102 53.739000 +86129 55.013000 +86268 49.344000 +86291 57.813000 +86337 49.797000 +86448 63.370000 +86449 62.157000 +86542 50.178000 +86545 45.187000 +86558 51.933000 +86580 53.509000 +86585 50.981000 +86586 50.455000 +86588 49.225000 +86591 51.230000 +86601 50.629000 +86603 53.093000 +86614 54.230000 +86826 47.503000 +86866 64.704000 +86911 55.250000 +86986 60.128000 +86991 54.040000 +87011 43.133000 +87056 44.702000 +87068 51.719000 +87134 60.154000 +87151 63.217000 +87248 51.773000 +87254 52.503000 +87356 43.628000 +87434 45.286000 +87435 43.294000 +87441 44.718000 +87477 53.006000 +87478 48.760000 +87490 53.713000 +87510 54.918000 +87515 56.566000 +87640 53.051000 +87643 56.193000 +87644 56.042000 +87647 53.279000 +87649 54.203000 +87702 64.004000 +87713 59.769000 +87714 61.537000 +87719 59.209000 +87720 59.168000 +87728 46.427000 +87743 43.074000 +87746 52.294000 +87751 64.087000 +87757 62.878000 +87782 60.344000 +87787 50.256000 +87790 56.591000 +87791 46.965000 +87796 53.479000 +87797 57.577000 +87798 48.821000 +87811 48.633000 +87812 48.700000 +87813 48.773000 +87820 53.615000 +87821 57.520000 +87822 57.475000 +87824 57.865000 +87826 57.000000 +87827 52.926000 +87828 54.126000 +87832 47.632000 +87848 50.181000 +87856 56.234000 +87857 47.886000 +87859 56.751000 +87861 55.045000 +87863 55.824000 +87864 53.267000 +87878 51.628000 +87942 60.100000 +88098 50.168000 +88197 47.009000 +88220 47.283000 +88238 48.187000 +88239 55.773000 +88258 54.906000 +88367 58.489000 +88420 53.942000 +88494 59.049000 +88498 49.252000 +88499 49.996000 +88511 56.585000 +88520 57.916000 +88535 49.761000 +88547 55.957000 +88550 49.700000 +88577 52.380000 +88613 51.149000 +88627 56.809000 +88632 55.500000 +88736 62.365000 +88745 60.511000 +89127 54.600000 +89182 51.103000 +89186 51.129000 +89192 55.701000 +89325 56.046000 +89418 58.982000 +89439 59.408000 +89635 64.828000 +89659 50.743000 +89774 54.764000 +89780 54.256000 +89843 43.449000 +89892 50.899000 +90164 55.479000 +90218 51.472000 +90219 52.108000 +90226 56.852000 +90276 57.241000 +90333 45.624000 +90336 51.288000 +90337 51.364000 +90404 50.415000 +90433 50.711000 +90434 50.211000 +90444 50.718000 +90445 54.664000 +90544 55.149000 +90548 55.156000 +90641 53.673000 +91042 67.259000 +91072 62.929000 +91098 43.410000 +91103 47.177000 +91266 50.725000 +91302 55.967000 +91407 55.518000 +91627 53.645000 +91681 57.620000 +92038 54.712000 +92056 49.993000 +92057 49.949000 +92069 53.972000 +92077 50.535000 +92082 51.342000 +92101 48.219000 +92125 52.160000 +92135 58.630000 +92136 59.924000 +92140 60.312000 +92229 53.957000 +92264 53.918000 +92270 55.440000 +92305 53.205000 +92309 54.446000 +92312 54.222000 +92376 57.186000 +92377 56.089000 +92410 51.739000 +92422 54.664000 +92453 43.290000 From af7a920af3e03618b68d0cb259d5a6ae2205b712 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 12 Nov 2018 03:25:25 -0500 Subject: [PATCH 541/744] new option to use later ILW campaigns --- plasma/conf_parser.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index a13ca7e4..18be63fd 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -70,6 +70,9 @@ def parameters(input_file): #shot lists jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') + jet_iterlike_wall_late = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint_late.txt','ILW_clear_late.txt'],'Late jet iter like wall data') + jet_iterlike_wall_full = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint_full.txt','ILW_clear_full.txt'],'Full jet iter like wall data') + jenkins_jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['jenkins_CWall_clear.txt','jenkins_CFC_unint.txt'],'Subset of jet carbon wall data for Jenkins tests') jenkins_jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['jenkins_ILW_unint.txt','jenkins_BeWall_clear.txt'],'Subset of jet iter like wall data for Jenkins tests') From 6ab3c32f32426a4dc2275b09ecc9c772577fc2c2 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 12 Nov 2018 03:29:40 -0500 Subject: [PATCH 542/744] new option to use later ILW campaigns --- plasma/conf_parser.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 18be63fd..cebe50c4 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -100,6 +100,14 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = jet_signals_1D + elif params['paths']['data'] == 'jet_data_late': + params['paths']['shot_files'] = [jet_iterlike_wall_late] + params['paths']['shot_files_test'] = [jet_iterlike_wall_late] + params['paths']['use_signals_dict'] = jet_signals + elif params['paths']['data'] == 'jet_data_carbon_to_late_0D': + params['paths']['shot_files'] = [jet_carbon_wall] + params['paths']['shot_files_test'] = [jet_iterlike_wall_late] + params['paths']['use_signals_dict'] = jet_signals elif params['paths']['data'] == 'jet_data_temp_profile': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] @@ -183,6 +191,10 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = fully_defined_signals + elif params['paths']['data'] == 'd3d_to_late_jet_data': + params['paths']['shot_files'] = [d3d_full] + params['paths']['shot_files_test'] = [jet_iterlike_wall_late] + params['paths']['use_signals_dict'] = fully_defined_signals elif params['paths']['data'] == 'jet_to_d3d_data_0D': params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [d3d_full] From d476d41bde063adaff10ab013658a71115bdd5a4 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 12 Nov 2018 03:45:42 -0500 Subject: [PATCH 543/744] fixed import error --- plasma/utils/downloading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 91f4e968..0f36c65b 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -23,7 +23,7 @@ import multiprocessing as mp from functools import partial from multiprocessing import Queue -import os +import os,time import errno import dill,hashlib From 12646bd3becd76f2a71628408c5b58271f9fa4a7 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 12 Nov 2018 04:11:02 -0500 Subject: [PATCH 544/744] added density & temperature profiles for jet again --- data/signals.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data/signals.py b/data/signals.py index e6083dc9..eb5c85c2 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,11 +137,11 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -#etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -#edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +# etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +# edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) @@ -179,6 +179,7 @@ def fetch_nstx_data(signal_path,shot_num,c): pin = Signal("Input Power (beam for d3d)",['jpf/gs/bl-ptotout'],[jet]) +#pradtot = Signal("Radiated Power",['jpf/db/b5r-ptot>out', 'd3d/'+r'\prad_tot'],[jet,d3d]) #pradcore = ChannelSignal("Radiated Power Core",[ 'd3d/'+r'\bol_l15_p'],[d3d]) #pradedge = ChannelSignal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) From 23587d8e9baeddb1978927ee1c3900414f0ba211 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Mon, 12 Nov 2018 04:38:31 -0500 Subject: [PATCH 545/744] added density & temperature profiles for jet again --- data/signals.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/signals.py b/data/signals.py index eb5c85c2..61659d34 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,8 +137,8 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[25,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) # etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) # edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) @@ -159,9 +159,9 @@ def fetch_nstx_data(signal_path,shot_num,c): # epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) -edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) -rho_profile_spatial = ProfileSignal("Rho at spatial positions",["ppf/hrts/rho"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) +etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[0],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) +edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[0],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) +rho_profile_spatial = ProfileSignal("Rho at spatial positions",["ppf/hrts/rho"],[jet],causal_shifts=[0],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25],data_avail_tolerances=[0.05]) # epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) From 8641d40ec85973703ac282041ca8351194819025 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 16 Nov 2018 00:02:32 -0500 Subject: [PATCH 546/744] changed jet profiles to available --- data/signals.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/signals.py b/data/signals.py index e6083dc9..88533887 100644 --- a/data/signals.py +++ b/data/signals.py @@ -137,11 +137,11 @@ def fetch_nstx_data(signal_path,shot_num,c): profile_num_channels = 64 #ZIPFIT comes from actual measurements -#etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -#edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) +edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +#etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) +#edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) From 8c48c7bd483aebea79a0882dec0fde3f4068840e Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 16 Nov 2018 01:59:24 -0500 Subject: [PATCH 547/744] keywords --- plasma/models/builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 28459936..bc2de201 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -182,7 +182,7 @@ def slicer_output_shape(input_shape,indices): else: pre_rnn = pre_rnn_input - if model_conf['rnn_layers'] == 0 or model_conf['extra_dense_input']: + if model_conf['rnn_layers'] == 0 or ('extra_dense_input' in model_conf.keys() and model_conf['extra_dense_input']): pre_rnn = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn = Dense(dense_size//2,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) pre_rnn = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) From c0d00819438d839eabc9bde84f172e41df50ab05 Mon Sep 17 00:00:00 2001 From: Julian Kates-Harbeck Date: Fri, 23 Nov 2018 20:25:46 -0500 Subject: [PATCH 548/744] made signal hash dependent on number of machines (explicitly on paths) --- plasma/conf_parser.py | 6 +++--- plasma/primitives/data.py | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index cebe50c4..bcd8e293 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -102,12 +102,12 @@ def parameters(input_file): params['paths']['use_signals_dict'] = jet_signals_1D elif params['paths']['data'] == 'jet_data_late': params['paths']['shot_files'] = [jet_iterlike_wall_late] - params['paths']['shot_files_test'] = [jet_iterlike_wall_late] + params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = jet_signals elif params['paths']['data'] == 'jet_data_carbon_to_late_0D': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall_late] - params['paths']['use_signals_dict'] = jet_signals + params['paths']['use_signals_dict'] = jet_signals_0D elif params['paths']['data'] == 'jet_data_temp_profile': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] @@ -244,7 +244,7 @@ def parameters(input_file): return params def get_unique_signal_hash(signals): - return int(hashlib.md5(''.join(tuple(map(lambda x: x.description, sorted(signals)))).encode('utf-8')).hexdigest(),16) + return int(hashlib.md5(''.join(tuple(map(lambda x: "{}".format(x.__hash__()), sorted(signals)))).encode('utf-8')).hexdigest(),16) #make sure 1D signals come last! This is necessary for model builder. def sort_by_channels(list_of_signals): diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index fb19f466..e2b1ed49 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -171,21 +171,23 @@ def get_idx(self,machine): idx = self.machines.index(machine) return idx + def description_plus_paths(self): + return self.description + ' ' + ' '.join(self.paths) + def __eq__(self,other): if other is None: return False - return self.description.__eq__(other.description) - + return self.description_plus_paths().__eq__(other.description_plus_paths()) def __ne__(self,other): - return self.description.__ne__(other.description) + return self.description_plus_paths().__ne__(other.description_plus_paths()) def __lt__(self,other): - return self.description.__lt__(other.description) + return self.description_plus_paths().__lt__(other.description_plus_paths()) def __hash__(self): import hashlib - return int(hashlib.md5(self.description.encode('utf-8')).hexdigest(),16) + return int(hashlib.md5(self.description_plus_paths().encode('utf-8')).hexdigest(),16) def __str__(self): return self.description From 78da591167818038f8bdeb199b9b82e1a61437c8 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 18 Jan 2019 14:30:32 -0500 Subject: [PATCH 549/744] Fix link to tutorial in README.md (use relative link) --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9a96c8f5..d6cfb48b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It consists of 4 core modules: - `primitives`: contains abstractions specific to the domain, implemented as Python classes. For instance: Shot - a measurement of plasma current as a function of time. The Shot object contains attributes corresponding to unique identifier of a shot, disruption time in milliseconds, time profile of the shot converted to time-to- disruption values, validity of a shot (whether plasma current reaches a certain value during the shot), etc. Other primitives include `Machines` and `Signals` which carry the relevant information necessary for incorporating physics data into the overall pipeline. Signals know the Machine they live on, their mds+ paths, code for being downloaded, preprocessing approaches, their dimensionality, etc. Machines know which Signals are defined on them, which mds+ server houses the data, etc. -- `utilities`: a set of auxiliary functions for preprocessing, performance evaluation and learning curves analysis. +- `utilities`: a set of auxiliary functions for preprocessing, performance evaluation and learning curves analysis. In addition to the `utilities` FRNN supports TensorBoard scaler variable summaries, histogramms of layers, activations and gradients and graph visualizations. @@ -47,5 +47,4 @@ The Sphinx pages for FRNN are building up here: http://tigress-web.princeton.edu ## Tutorials -For tutorial check: -https://github.com/PPPLDeepLearning/plasma-python/blob/mpicc-travis/docs/PrincetonUTutorial.md +For a tutorial, check out: [PrincetonUTutorial.md](docs/PrincetonUTutorial.md) From 888c10439fae695f0d9e09d3b7d4d4bc68ed9b34 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 18 Jan 2019 14:57:22 -0500 Subject: [PATCH 550/744] Update ANL_Theta.md --- docs/ANL_Theta.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ANL_Theta.md b/docs/ANL_Theta.md index cc1a68bb..abc2f2eb 100644 --- a/docs/ANL_Theta.md +++ b/docs/ANL_Theta.md @@ -1,4 +1,4 @@ -#First time setup on Theta, Argonne +# First time setup on Theta, Argonne ```bash mkdir PPPL From 82b60ec65cca75ceb71876714697302338bb0676 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 18 Jan 2019 15:06:26 -0500 Subject: [PATCH 551/744] Update Primitives.md --- docs/Primitives.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Primitives.md b/docs/Primitives.md index 253aa349..d1f38ad2 100644 --- a/docs/Primitives.md +++ b/docs/Primitives.md @@ -2,11 +2,11 @@ Each shot is a measurement of plasma current as a function of time. The Shot objects contains following attributes: - 1. number - integer, unique identifier of a shot - 1. t_disrupt - double, disruption time in milliseconds (second column in the shotlist input file) - 1. ttd - array of doubles, time profile of the shot converted to time-to-disruption values - 1. valid - boolean, whether plasma current reaches a certain value during the shot - 1. is_disruptive - boolean, + 1. `number` - integer, unique identifier of a shot + 1. `t_disrupt` - double, disruption time in milliseconds (second column in the shotlist input file) + 1. `ttd` - array of doubles, time profile of the shot converted to time-to-disruption values + 1. `valid` - boolean, whether plasma current reaches a certain value during the shot + 1. `is_disruptive` - boolean, whether the shot was determined to be disruptive by an expert For 0D data, each shot is modeled as 2D array - time vs plasma current. From f3a69582a9abe051e9b3fed4a1f0c7b226329d3b Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Sun, 24 Feb 2019 17:27:33 -0500 Subject: [PATCH 552/744] Update ICC 17 version available on TigerGPU --- docs/PrincetonUTutorial.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index 61f45d52..b9a97565 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -1,13 +1,13 @@ ## Tutorials -### Login to Tigergpu +### Login to TigerGPU First, login to TigerGPU cluster headnode via ssh: ``` ssh -XC @tigergpu.princeton.edu ``` -### Sample usage on Tigergpu +### Sample usage on TigerGPU Next, check out the source code from github: ``` @@ -26,7 +26,7 @@ export OMPI_MCA_btl="tcp,self,sm" module load cudatoolkit/8.0 module load cudnn/cuda-8.0/6.0 module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 +module load intel/17.0/64/17.0.5.239 ``` and install the `plasma-python` package: From a78867aee1e4f20388f07a0d590c0d9e8fb47534 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 11 Sep 2019 15:42:51 -0500 Subject: [PATCH 553/744] Add encrypted credentials for new Slack plugin --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 03026741..50f292fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,3 +34,7 @@ env: - TEST_DIR=.; TEST_SCRIPT="python setup.py test" script: cd $TEST_DIR && $TEST_SCRIPT && cd .. + +notifications: + slack: + secure: NBjGYpIF2VO/GvhbC7XVPIfi0WLGFEuVhi51UbZjfHg4IOv1UuCF0fImi8GN2UZZBFRnZcbtPVffZnyMUyJI0Krw0M1ropkjA4YDaJx1JUGnYuQLxNmX+jbQmN61Usjg5MQOgcRnAn1bdMN1ttWInqkKejpV5buCjZbt8SZbDePfXz4U3No68P/pRsDTVXSy0xLTtRacuEITJjwxfjp6phbmR3qs127MZMRbVYDC2HA6KsoJW6YSKF1vFyHqnFMl7GSavxYw/XQpqFLJkGKXfnNgPZV6qAbVk5+bzyytAbbwLGvgbuFpnJsGPvAyebV8wVYaIPg7OeK+Sm1A3q0jt774NnqFp2AZ+pSKrxbxIkygDM0zoWLm4i3pt6ToJ6dKcqSbCKbELnSY5NphcyYuiJ8uhLVpAR0Y+vp+fOvhb8td/nH2AWkxFpp6xwOHPXvtodBsyPMkiaeKoVElYBfbfOhDSYH2KafADECTX75S63A9KleeNZh0DSImfFdQPaN3GFLEL8Z9UFABzTkM9eYKP9pyEP82Wh/JGDaqbARazEgNzy8rwghomsEguV247XHdOx32PSd0att541gsRFZ5uyMuVFKzI0jiLijekibY2I1c5b6dDeuK4O8uBiq4FTS+bM55Rj4Job01kdxSCKw3RwOh0amzITRTQvEWKpTAekg= From a992a93db9c201e127f8bf200bc5d6b58b025721 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 11 Sep 2019 15:46:38 -0500 Subject: [PATCH 554/744] Update broken Travis CI badge --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d6cfb48b..5ec11e38 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# FRNN [![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master) [![Build Status](https://jenkins.princeton.edu/buildStatus/icon?job=FRNM/PPPL)](https://jenkins.princeton.edu/job/FRNM/job/PPPL/) +# FRNN + +[![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python) +[![Build Status](https://jenkins.princeton.edu/buildStatus/icon?job=FRNM/PPPL)](https://jenkins.princeton.edu/job/FRNM/job/PPPL/) ## Package description From c4236ea31a5882f2f180674457e7d8e6673a01d2 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 17 Sep 2019 13:37:09 -0500 Subject: [PATCH 555/744] Add basic flake8 linting style rules to setup.cfg Ported from Athena++ linter rules --- setup.cfg | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/setup.cfg b/setup.cfg index b88034e4..912ef080 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,29 @@ [metadata] description-file = README.md + +[flake8] +max-line-length = 79 +# exclude = cpplint.py +ignore = + # Subset of DEFAULT_IGNORE error codes from pycodestyle + # (not universally accepted / not enforced by PEP 8 document) + # E1: Indentation + # E121: continuation line under-indented for hanging indent (allow fewer than 4 spaces w/ hanging indent) + E121, + # E123: closing bracket does not match indentation of opening bracket’s line + E123, + # E126: continuation line over-indented for hanging inden (allow fewer than 4 spaces w/ hanging indent) + E126, + # E2: Whitespace + # E226: missing whitespace around arithmetic operator (allow nx+1, ...) + E226, + # E241: multiple spaces after ‘,’ + E241, + # E7: Statements + # E704: multiple statements on one line (def) + E704, + # E731: Do not assign a lambda expression, use a def + E731, + # W5: Line break warning + # W503: line break before binary operator (use mutually exclusive W504) + W503 \ No newline at end of file From 3dcf8636cfc0970b6465763520288056dc057c3c Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 19 Sep 2019 16:09:03 -0500 Subject: [PATCH 556/744] Start applying subset of PEP8 style rules to existing files Via autopep8 + manual touchups --- jenkins-ci/jenkins.sh | 18 ---------- jenkins-ci/run_jenkins.py | 51 +++++++++++++++++--------- jenkins-ci/validate_jenkins.py | 12 +++---- makedocs.py | 17 +++++---- setup.py | 66 ++++++++++++++++++---------------- tests/testbasic.py | 2 +- 6 files changed, 87 insertions(+), 79 deletions(-) diff --git a/jenkins-ci/jenkins.sh b/jenkins-ci/jenkins.sh index 1fa10ffe..6dbf1170 100644 --- a/jenkins-ci/jenkins.sh +++ b/jenkins-ci/jenkins.sh @@ -31,21 +31,3 @@ sed -i -e 's/data: jet_data/data: jenkins_jet/g' conf.yaml srun python mpi_learn.py echo "Jenkins test Python2.7" -#rm /tigress/alexeys/model_checkpoints/* - -#source deactivate -#module purge -#module load anaconda/4.4.0 -#source activate /tigress/alexeys/jenkins/.conda/envs/jenkins2 -#module load cudatoolkit/8.0 -#module load cudnn/cuda-8.0/6.0 -#module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -#module load intel/17.0/64/17.0.4.196 - -#cd .. -#python setup.py install - -#echo $SLURM_NODELIST -#cd examples -#sed -i -e 's/data: jenkins_jet/data: jenkins_d3d/g' conf.yaml -#srun python mpi_learn.py diff --git a/jenkins-ci/run_jenkins.py b/jenkins-ci/run_jenkins.py index 57be2675..282b3900 100644 --- a/jenkins-ci/run_jenkins.py +++ b/jenkins-ci/run_jenkins.py @@ -1,19 +1,28 @@ -from plasma.utils.batch_jobs import generate_working_dirname,copy_files_to_environment,start_jenkins_job +from plasma.utils.batch_jobs import ( + generate_working_dirname, copy_files_to_environment, start_jenkins_job + ) import yaml -import sys,os,getpass +import os +import getpass import plasma.conf -num_nodes = 4 #Set in the Jenkins project area!! -test_matrix = [("Python3","jet_data"),("Python2","jet_data")] +num_nodes = 4 # Set in the Jenkins project area!! +test_matrix = [("Python3", "jet_data"), ("Python2", "jet_data")] -run_directory = "{}/{}/jenkins/".format(plasma.conf.conf['fs_path'],getpass.getuser()) +run_directory = "{}/{}/jenkins/".format( + plasma.conf.conf['fs_path'], getpass.getuser()) template_path = os.environ['PWD'] conf_name = "conf.yaml" executable_name = "mpi_learn.py" -def generate_conf_file(test_configuration,template_path = "../",save_path = "./",conf_name="conf.yaml"): + +def generate_conf_file( + test_configuration, + template_path="../", + save_path="./", + conf_name="conf.yaml"): assert(template_path != save_path) - with open(os.path.join(template_path,conf_name), 'r') as yaml_file: + with open(os.path.join(template_path, conf_name), 'r') as yaml_file: conf = yaml.load(yaml_file) conf['training']['num_epochs'] = 2 conf['paths']['data'] = test_configuration[1] @@ -24,25 +33,30 @@ def generate_conf_file(test_configuration,template_path = "../",save_path = "./" conf['env']['name'] = "PPPL" conf['env']['type'] = "anaconda" - with open(os.path.join(save_path,conf_name), 'w') as outfile: + with open(os.path.join(save_path, conf_name), 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) return conf + working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) -os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) +os.system( + " ".join(["cp -p", os.path.join(template_path, conf_name), + working_directory])) +os.system(" ".join( + ["cp -p", os.path.join(template_path, executable_name), + working_directory])) -#os.chdir(working_directory) -#print("Going into {}".format(working_directory)) +# os.chdir(working_directory) +# print("Going into {}".format(working_directory)) for ci in test_matrix: - subdir = working_directory + "/{}/".format(ci[0]) + subdir = working_directory + "/{}/".format(ci[0]) os.makedirs(subdir) copy_files_to_environment(subdir) print("Making modified conf") - conf = generate_conf_file(ci,working_directory,subdir,conf_name) + conf = generate_conf_file(ci, working_directory, subdir, conf_name) print("Starting job") if ci[1] == "Python3": env_name = "PPPL_dev3" @@ -50,7 +64,12 @@ def generate_conf_file(test_configuration,template_path = "../",save_path = "./" else: env_name = "PPPL" env_type = "anaconda" - start_jenkins_job(subdir,num_nodes,executable_name,ci,env_name,env_type) - + start_jenkins_job( + subdir, + num_nodes, + executable_name, + ci, + env_name, + env_type) print("submitted jobs.") diff --git a/jenkins-ci/validate_jenkins.py b/jenkins-ci/validate_jenkins.py index 6014fb2b..abed06f4 100644 --- a/jenkins-ci/validate_jenkins.py +++ b/jenkins-ci/validate_jenkins.py @@ -1,17 +1,15 @@ #!/usr/bin/env python +import sys +from mpi4py import MPI +import tensorflow as tf +import keras as kk import mpi4py as mmm -print(mmm.__version__) -import keras as kk +print(mmm.__version__) print(kk.__version__) - -import tensorflow as tf print(tf.__version__) -from mpi4py import MPI -import sys - size = MPI.COMM_WORLD.Get_size() rank = MPI.COMM_WORLD.Get_rank() name = MPI.Get_processor_name() diff --git a/makedocs.py b/makedocs.py index 51446a2b..fca2371e 100644 --- a/makedocs.py +++ b/makedocs.py @@ -14,7 +14,7 @@ "plasma.preprocessor.preprocess", "plasma.utils.evaluation", "plasma.utils.performance", - "plasma.utils.processing" + "plasma.utils.processing" ] modules = {name: importlib.import_module(name) for name in modules} @@ -23,11 +23,13 @@ for moduleName, module in modules.items(): for objName in dir(module): obj = getattr(module, objName) - if not objName.startswith("_") and callable(obj) and obj.__module__ == moduleName: - print objName, obj + if (not objName.startswith("_") + and callable(obj) and obj.__module__ == moduleName): + print(objName, obj) documented.append(moduleName + "." + objName) if inspect.isclass(obj): - open("docs/" + moduleName + "." + objName + ".rst", "w").write(''':orphan: + open("docs/" + moduleName + "." + objName + ".rst", "w").write( + ''':orphan: {0} {1} @@ -37,12 +39,13 @@ :special-members: __init__, __add__ :inherited-members: :show-inheritance: -'''.format(moduleName + "." + objName, "=" * (len(moduleName) + len(objName) + 1))) +'''.format(moduleName + "." + objName, "="*(len(moduleName)+len(objName)+1))) else: - open("docs/" + moduleName + "." + objName + ".rst", "w").write(''':orphan: + open("docs/" + moduleName + "." + objName + ".rst", + "w").write(''':orphan: {0} {1} .. autofunction:: {0} -'''.format(moduleName + "." + objName, "=" * (len(moduleName) + len(objName) + 1))) +'''.format(moduleName + "." + objName, "="*(len(moduleName)+len(objName)+1))) diff --git a/setup.py b/setup.py index ab3be99f..5c8fec7f 100644 --- a/setup.py +++ b/setup.py @@ -1,40 +1,46 @@ import os -import sys import subprocess from setuptools import setup, find_packages import plasma.version try: - os.environ['MPICC'] = subprocess.check_output("which mpicc", shell=True).decode("utf-8") -except: - print ("Please set up the OpenMPI environment") + os.environ['MPICC'] = subprocess.check_output( + "which mpicc", shell=True).decode("utf-8") +except BaseException: + print("Please set up the OpenMPI environment") exit(1) -setup(name = "plasma", - version = plasma.version.__version__, - packages = find_packages(), - #scripts = [""], - description = "PPPL deep learning package.", - long_description = """Add description here""", - author = "Julian Kates-Harbeck, Alexey Svyatkovskiy", - author_email = "jkatesharbeck@g.harvard.edu", - maintainer = "Alexey Svyatkovskiy", - maintainer_email = "alexeys@princeton.edu", - #url = "http://", - download_url = "https://github.com/PPPLDeepLearning/plasma-python", - #license = "Apache Software License v2", - test_suite = "tests", - install_requires = ['keras>2.0.8','pathos','matplotlib==2.0.2','hyperopt','mpi4py','xgboost'], - tests_require = [], - classifiers = ["Development Status :: 3 - Alpha", - "Environment :: Console", - "Intended Audience :: Science/Research", - "Programming Language :: Python", - "Topic :: Scientific/Engineering :: Information Analysis", - "Topic :: Scientific/Engineering :: Physics", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: System :: Distributed Computing", - ], - platforms = "Any", +setup(name="plasma", + version=plasma.version.__version__, + packages=find_packages(), + # scripts = [""], + description="PPPL deep learning package.", + long_description="""Add description here""", + author="Julian Kates-Harbeck, Alexey Svyatkovskiy", + author_email="jkatesharbeck@g.harvard.edu", + maintainer="Alexey Svyatkovskiy", + maintainer_email="alexeys@princeton.edu", + # url = "http://", + download_url="https://github.com/PPPLDeepLearning/plasma-python", + # license = "Apache Software License v2", + test_suite="tests", + install_requires=[ + 'keras>2.0.8', + 'pathos', + 'matplotlib==2.0.2', + 'hyperopt', + 'mpi4py', + 'xgboost'], + tests_require=[], + classifiers=["Development Status :: 3 - Alpha", + "Environment :: Console", + "Intended Audience :: Science/Research", + "Programming Language :: Python", + "Topic :: Scientific/Engineering :: Information Analysis", + "Topic :: Scientific/Engineering :: Physics", + "Topic :: Scientific/Engineering :: Mathematics", + "Topic :: System :: Distributed Computing", + ], + platforms="Any", ) diff --git a/tests/testbasic.py b/tests/testbasic.py index 6fb2f4b7..261b31ab 100644 --- a/tests/testbasic.py +++ b/tests/testbasic.py @@ -1,5 +1,5 @@ -import sys import unittest + class TestBasic(unittest.TestCase): pass From 1e985a9223853867441eb9f84e2d3de0e3f07f0e Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Mon, 23 Sep 2019 17:39:07 -0500 Subject: [PATCH 557/744] Apply PEP8 styling to examples/*.py --- examples/analyze_tuning.py | 103 ++++++++------- examples/check_tuning.py | 32 ++--- examples/compare_performance.py | 59 +++++---- examples/custom_plot.py | 42 ++++-- examples/distributed_job.sh | 3 +- examples/extract_best_overtime.py | 126 ++++++++++-------- examples/guarantee_preprocessed.py | 9 +- examples/hyper_learn.py | 37 +++--- examples/individual_shot_performance.py | 21 ++- examples/learn.py | 108 ++++++++------- examples/mpi_augment_learn.py | 104 ++++++++------- examples/mpi_learn.py | 97 ++++++++------ examples/performance_analysis.py | 101 ++++++++------ examples/prepare_pbs_configs_titan.py | 111 ++++++++-------- examples/prepare_slurm_configs.py | 48 ++++--- examples/signal_influence.py | 143 ++++++++++++-------- examples/simple_augmentation.py | 136 +++++++++++-------- examples/submit_batch_job.py | 54 +++++--- examples/test.py | 69 +++++----- examples/tune_hyperparams.py | 167 ++++++++++++++++-------- 20 files changed, 923 insertions(+), 647 deletions(-) diff --git a/examples/analyze_tuning.py b/examples/analyze_tuning.py index 1cb91f0f..f93b7f5a 100644 --- a/examples/analyze_tuning.py +++ b/examples/analyze_tuning.py @@ -1,18 +1,22 @@ -from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,HyperparamExperiment +from plasma.primitives.hyperparameters import ( + # CategoricalHyperparam, ContinuousHyperparam, + # LogContinuousHyperparam, + HyperparamExperiment +) import matplotlib.pylab as plt -from pprint import pprint -import yaml -import datetime -import uuid -import sys,os,getpass -import shutil -import subprocess as sp -import pandas +# from pprint import pprint +# import yaml, datetime, uuid +import sys +import os +import getpass +# import shutil, pandas +# import subprocess as sp import numpy as np import plasma.conf -dir_path = "/{}/{}/hyperparams/".format(plasma.conf.conf['fs_path'],getpass.getuser()) +dir_path = "/{}/{}/hyperparams/".format( + plasma.conf.conf['fs_path'], getpass.getuser()) if len(sys.argv) <= 1: dir_path = dir_path + os.listdir(dir_path)[0] + '/' @@ -21,80 +25,85 @@ dir_path = sys.argv[1] -def get_experiments(path,verbose=0): +def get_experiments(path, verbose=0): experiments = [] num_tot = 0 num_finished = 0 num_success = 0 for name in sorted(os.listdir(path)): - if os.path.isdir(os.path.join(path,name)): - print(os.path.join(path,name)) - exp= HyperparamExperiment(os.path.join(path,name)) + if os.path.isdir(os.path.join(path, name)): + print(os.path.join(path, name)) + exp = HyperparamExperiment(os.path.join(path, name)) num_finished += 1 if exp.finished else 0 num_success += 1 if exp.success else 0 num_tot += 1 experiments.append(exp) - if verbose: - print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) + if verbose: + print("Read {} experiments, {} finished ({} success)".format( + num_tot, num_finished, num_success)) return experiments + experiments = sorted(get_experiments(dir_path)) -best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) -best = [] +best_experiments = np.argsort( + np.array([e.get_maximum(False)[0] for e in experiments])) +best = [] for e in np.array(experiments)[best_experiments][-5:]: best.append(e.get_number()) bigdict = {} for base in best: - f = "/{}/{}/changed_params.out".format(dir_path,base) + f = "/{}/{}/changed_params.out".format(dir_path, base) data = open(f).readlines() for line in data: tuples = line.split(":") - #if len(tuples) == 2: + # if len(tuples) == 2: key, values = tuples[-2:] - key = key.strip() + key = key.strip() try: bigdict[key] += [values] except KeyError: bigdict[key] = [values] -def make_comparison_plot(key,tunable,trial): - values,edges = tunable +def make_comparison_plot(key, tunable, trial): + values, edges = tunable - trial = list(map(lambda x: eval(x),trial)) - trial_values,_ = np.histogram(trial,bins=edges) + trial = list(map(lambda x: eval(x), trial)) + trial_values, _ = np.histogram(trial, bins=edges) total = trial_values.sum() - values_percentages =list(map(lambda x: x*100.0/total, trial_values)) + values_percentages = list(map(lambda x: x*100.0/total, trial_values)) - plt.bar(edges[:-1], values_percentages, width=np.diff(edges), ec="k", align="edge") + plt.bar(edges[:-1], values_percentages, + width=np.diff(edges), ec="k", align="edge") plt.xlabel(key, fontsize=20) - #plt.yscale('log') + # plt.yscale('log') plt.ylabel('Fraction of trials [%]/bin', fontsize=20) plt.bar(edges[:-1], values, width=np.diff(edges), ec="k", align="edge") plt.savefig(key+".png") - #plt.show() + # plt.show() plt.clf() -#default tunables: +# default tunables: defaults = {} -defaults['lr'] = np.histogram([1e-7,1e-4]) -defaults['lr_decay'] = np.histogram([0.97,0.985,1.0]) -defaults['positive_example_penalty'] = np.histogram([1.0,4.0,16.0]) -#defaults['target'] = np.histogram([50,50,50],bins=['hinge','ttdinv','ttd']) -defaults['batch_size'] = np.histogram([64,256,1024]) -defaults['dropout_prob'] = np.histogram([0.1,0.3,0.5]) -defaults['rnn_layers'] = np.histogram([1,4]) -defaults['rnn_size'] = np.histogram([100,200,300]) -defaults['num_conv_filters'] = np.histogram([5,10]) -defaults['num_conv_layers'] = np.histogram([2,4]) -defaults['T_warning'] = np.histogram([0.256,1.024,10.024]) -defaults['cut_shot_ends'] = np.histogram([False,True]) - -#Histogram it -for key,trial in bigdict.items(): - if key == 'target': continue - make_comparison_plot(key,defaults[key],trial) +defaults['lr'] = np.histogram([1e-7, 1e-4]) +defaults['lr_decay'] = np.histogram([0.97, 0.985, 1.0]) +defaults['positive_example_penalty'] = np.histogram([1.0, 4.0, 16.0]) +# defaults['target'] = np.histogram([50,50,50],bins=['hinge','ttdinv','ttd']) +defaults['batch_size'] = np.histogram([64, 256, 1024]) +defaults['dropout_prob'] = np.histogram([0.1, 0.3, 0.5]) +defaults['rnn_layers'] = np.histogram([1, 4]) +defaults['rnn_size'] = np.histogram([100, 200, 300]) +defaults['num_conv_filters'] = np.histogram([5, 10]) +defaults['num_conv_layers'] = np.histogram([2, 4]) +defaults['T_warning'] = np.histogram([0.256, 1.024, 10.024]) +defaults['cut_shot_ends'] = np.histogram([False, True]) + +# Histogram it +for key, trial in bigdict.items(): + if key == 'target': + continue + make_comparison_plot(key, defaults[key], trial) diff --git a/examples/check_tuning.py b/examples/check_tuning.py index b65581f6..ce2875c4 100644 --- a/examples/check_tuning.py +++ b/examples/check_tuning.py @@ -1,16 +1,15 @@ -from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,HyperparamExperiment -from pprint import pprint -import yaml -import datetime -import uuid -import sys,os,getpass -import shutil -import subprocess as sp -import pandas +from plasma.primitives.hyperparameters import ( + # CategoricalHyperparam, ContinuousHyperparam, LogContinuousHyperparam, + HyperparamExperiment +) +import sys +import os +import getpass import numpy as np import plasma.conf -dir_path = "/{}/{}/hyperparams/".format(plasma.conf.conf['fs_path'],getpass.getuser()) +dir_path = "/{}/{}/hyperparams/".format( + plasma.conf.conf['fs_path'], getpass.getuser()) if len(sys.argv) <= 1: dir_path = dir_path + os.listdir(dir_path)[0] + '/' print("using default dir {}".format(dir_path)) @@ -24,19 +23,22 @@ def get_experiments(path): num_finished = 0 num_success = 0 for name in sorted(os.listdir(path)): - if os.path.isdir(os.path.join(path,name)): - print(os.path.join(path,name)) - exp= HyperparamExperiment(os.path.join(path,name)) + if os.path.isdir(os.path.join(path, name)): + print(os.path.join(path, name)) + exp = HyperparamExperiment(os.path.join(path, name)) num_finished += 1 if exp.finished else 0 num_success += 1 if exp.success else 0 num_tot += 1 experiments.append(exp) - print("Read {} experiments, {} finished ({} success)".format(num_tot,num_finished,num_success)) + print("Read {} experiments, {} finished ({} success)".format( + num_tot, num_finished, num_success)) return experiments + experiments = sorted(get_experiments(dir_path)) print(len(experiments)) -best_experiments = np.argsort(np.array([e.get_maximum(False)[0] for e in experiments])) +best_experiments = np.argsort( + np.array([e.get_maximum(False)[0] for e in experiments])) for e in experiments: e.summary() print("Best experiment so far: \n") diff --git a/examples/compare_performance.py b/examples/compare_performance.py index 498927f8..b91d0ff0 100644 --- a/examples/compare_performance.py +++ b/examples/compare_performance.py @@ -1,10 +1,8 @@ -import os,sys -import numpy as np - -from plasma.utils.performance import * +import sys +from plasma.utils.performance import PerformanceAnalyzer from plasma.conf import conf -#mode = 'test' +# mode = 'test' file_num = 0 save_figure = True pred_ttd = False @@ -12,51 +10,64 @@ # cut_shot_ends = conf['data']['cut_shot_ends'] # dt = conf['data']['dt'] # T_max_warn = int(round(conf['data']['T_warning']/dt)) -# T_min_warn = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) +# T_min_warn = conf['data']['T_min_warn'] +# T_min_warn = int(round(conf['data']['T_min_warn']/dt)) # if cut_shot_ends: # T_max_warn = T_max_warn-T_min_warn # T_min_warn = 0 -T_min_warn = 30 #None #take value from conf #30 +T_min_warn = 30 # None #take value from conf #30 -verbose=False +verbose = False assert(sys.argv > 1) results_dirs = sys.argv[1:] shots_dir = conf['paths']['processed_prepath'] -analyzers = [PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num,T_min_warn = T_min_warn, verbose = verbose, pred_ttd=pred_ttd) for results_dir in results_dirs] +analyzers = [PerformanceAnalyzer(conf=conf, results_dir=results_dir, + shots_dir=shots_dir, i=file_num, + T_min_warn=T_min_warn, + verbose=verbose, pred_ttd=pred_ttd) + for results_dir in results_dirs] for analyzer in analyzers: analyzer.load_ith_file() analyzer.verbose = False -P_threshs = [analyzer.compute_tradeoffs_and_print_from_training() for analyzer in analyzers] +P_threshs = [analyzer.compute_tradeoffs_and_print_from_training() + for analyzer in analyzers] print('Test ROC:') for analyzer in analyzers: print(analyzer.get_roc_area_by_mode('test')) -#P_thresh_opt = 0.566#0.566#0.92# analyzer.compute_tradeoffs_and_print_from_training() -linestyle="-" +# P_thresh_opt = 0.566#0.566#0.92# +# analyzer.compute_tradeoffs_and_print_from_training() +linestyle = "-" -#analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test',linestyle=linestyle) -#analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train',linestyle=linestyle) -#analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') +# analyzer.compute_tradeoffs_and_plot('test', save_figure=save_figure, +# plot_string='_test',linestyle=linestyle) +# analyzer.compute_tradeoffs_and_plot('train', save_figure=save_figure, +# plot_string='_train',linestyle=linestyle) +# analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') shots = analyzers[0].shot_list_test for shot in shots: - if all([(shot in analyzer.shot_list_test or shot in analyzer.shot_list_train) for analyzer in analyzers]): - types = [analyzers[i].get_prediction_type_for_individual_shot(P_threshs[i],shot,mode='test') for i in range(len(analyzers))] - #if len(set(types)) > 1: - if types == ['TP','late']: + if all([(shot in analyzer.shot_list_test + or shot in analyzer.shot_list_train) + for analyzer in analyzers]): + types = [ + analyzers[i].get_prediction_type_for_individual_shot( + P_threshs[i], shot, mode='test') + for i in range(len(analyzers))] + if types == ['TP', 'late']: if shot in analyzers[1].shot_list_test: print("TEST") else: print("TRAIN") print(shot.number) print(types) - for i,analyzer in enumerate(analyzers): - analyzer.save_shot(shot,P_thresh_opt=P_threshs[i],extra_filename=['1D','0D'][i]) + for i, analyzer in enumerate(analyzers): + analyzer.save_shot(shot, P_thresh_opt=P_threshs[i], + extra_filename=['1D', '0D'][i]) else: pass - #print("shot {} not in train or test shot list (must be in validation)".format(shot)) - - + # print("shot {} not in train or test shot list + # (must be in validation)".format(shot)) diff --git a/examples/custom_plot.py b/examples/custom_plot.py index 31d21c76..8f48f725 100644 --- a/examples/custom_plot.py +++ b/examples/custom_plot.py @@ -1,16 +1,37 @@ import numpy as np -from bokeh.plotting import figure, show, output_file, save +from bokeh.plotting import figure, output_file, save # , show from tensorboard.backend.event_processing import event_accumulator -ea1 = event_accumulator.EventAccumulator("/tigress/alexeys/worked_Graphs/Graph16_momSGD_new/events.out.tfevents.1502649990.tiger-i19g10") +file_path = "/tigress/alexeys/worked_Graphs/Graph16_momSGD_new/" +ea1 = event_accumulator.EventAccumulator( + file_path + "events.out.tfevents.1502649990.tiger-i19g10") ea1.Reload() -ea2 = event_accumulator.EventAccumulator("/tigress/alexeys/worked_Graphs/Graph32_momSGD_new/events.out.tfevents.1502652797.tiger-i19g10") +ea2 = event_accumulator.EventAccumulator( + file_path + "events.out.tfevents.1502652797.tiger-i19g10") ea2.Reload() histograms = ea1.Tags()['histograms'] -#ages': [], 'audio': [], 'histograms': ['input_2_out', 'time_distributed_1_out', 'lstm_1/kernel_0', 'lstm_1/kernel_0_grad', 'lstm_1/recurrent_kernel_0', 'lstm_1/recurrent_kernel_0_grad', 'lstm_1/bias_0', 'lstm_1/bias_0_grad', 'lstm_1_out', 'dropout_1_out', 'lstm_2/kernel_0', 'lstm_2/kernel_0_grad', 'lstm_2/recurrent_kernel_0', 'lstm_2/recurrent_kernel_0_grad', 'lstm_2/bias_0', 'lstm_2/bias_0_grad', 'lstm_2_out', 'dropout_2_out', 'time_distributed_2/kernel_0', 'time_distributed_2/kernel_0_grad', 'time_distributed_2/bias_0', 'time_distributed_2/bias_0_grad', 'time_distributed_2_out'], 'scalars': ['val_roc', 'val_loss', 'train_loss'], 'distributions': ['input_2_out', 'time_distributed_1_out', 'lstm_1/kernel_0', 'lstm_1/kernel_0_grad', 'lstm_1/recurrent_kernel_0', 'lstm_1/recurrent_kernel_0_grad', 'lstm_1/bias_0', 'lstm_1/bias_0_grad', 'lstm_1_out', 'dropout_1_out', 'lstm_2/kernel_0', 'lstm_2/kernel_0_grad', 'lstm_2/recurrent_kernel_0', 'lstm_2/recurrent_kernel_0_grad', 'lstm_2/bias_0', 'lstm_2/bias_0_grad', 'lstm_2_out', 'dropout_2_out', 'time_distributed_2/kernel_0', 'time_distributed_2/kernel_0_grad', 'time_distributed_2/bias_0', 'time_distributed_2/bias_0_grad', 'time_distributed_2_out'], 'tensors': [], 'graph': True, 'meta_graph': True, 'run_metadata': []} +# ages': [], 'audio': [], 'histograms': ['input_2_out', +# 'time_distributed_1_out', 'lstm_1/kernel_0', 'lstm_1/kernel_0_grad', +# 'lstm_1/recurrent_kernel_0', 'lstm_1/recurrent_kernel_0_grad', +# 'lstm_1/bias_0', 'lstm_1/bias_0_grad', 'lstm_1_out', 'dropout_1_out', +# 'lstm_2/kernel_0', 'lstm_2/kernel_0_grad', 'lstm_2/recurrent_kernel_0', +# 'lstm_2/recurrent_kernel_0_grad', 'lstm_2/bias_0', 'lstm_2/bias_0_grad', +# 'lstm_2_out', 'dropout_2_out', 'time_distributed_2/kernel_0', +# 'time_distributed_2/kernel_0_grad', 'time_distributed_2/bias_0', +# 'time_distributed_2/bias_0_grad', 'time_distributed_2_out'], 'scalars': +# ['val_roc', 'val_loss', 'train_loss'], 'distributions': ['input_2_out', +# 'time_distributed_1_out', 'lstm_1/kernel_0', 'lstm_1/kernel_0_grad', +# 'lstm_1/recurrent_kernel_0', 'lstm_1/recurrent_kernel_0_grad', +# 'lstm_1/bias_0', 'lstm_1/bias_0_grad', 'lstm_1_out', 'dropout_1_out', +# 'lstm_2/kernel_0', 'lstm_2/kernel_0_grad', 'lstm_2/recurrent_kernel_0', +# 'lstm_2/recurrent_kernel_0_grad', 'lstm_2/bias_0', 'lstm_2/bias_0_grad', +# 'lstm_2_out', 'dropout_2_out', 'time_distributed_2/kernel_0', +# 'time_distributed_2/kernel_0_grad', 'time_distributed_2/bias_0', +# 'time_distributed_2/bias_0_grad', 'time_distributed_2_out'], 'tensors': +# [], 'graph': True, 'meta_graph': True, 'run_metadata': []} for h in histograms: x1 = np.array(ea1.Histograms(h)[0].histogram_value.bucket_limit[:-1]) @@ -18,18 +39,19 @@ x2 = np.array(ea2.Histograms(h)[0].histogram_value.bucket_limit[:-1]) y2 = ea2.Histograms(h)[0].histogram_value.bucket[:-1] - h = h.replace("/","_") + h = h.replace("/", "_") - p = figure(title=h, y_axis_label="Arbitrary units", x_axis_label="Arbitrary units") - # ,y_axis_type="log") + p = figure(title=h, y_axis_label="Arbitrary units", + x_axis_label="Arbitrary units") + # , y_axis_type="log") p.line(x1, y1, legend="float16, SGD with momentum", - line_color="green", line_width=2) + line_color="green", line_width=2) p.line(x2, y2, legend="float32, SGD with momentum", - line_color="indigo", line_width=2) + line_color="indigo", line_width=2) p.legend.location = "top_right" - output_file("plot"+h+".html", title=h) + output_file("plot" + h + ".html", title=h) save(p) # open a browser diff --git a/examples/distributed_job.sh b/examples/distributed_job.sh index 97e3cfd3..421a4225 100644 --- a/examples/distributed_job.sh +++ b/examples/distributed_job.sh @@ -1,6 +1,6 @@ #!/bin/bash #SBATCH -t 0-2:00 -#SBATCH -N 10 #how many nodes. The number of GPUs is this times 4. +#SBATCH -N 10 # how many nodes. The totla number of GPUs is equal to this x4 #SBATCH --ntasks-per-node=16 #SBATCH --ntasks-per-socket=8 #SBATCH --gres=gpu:4 @@ -13,4 +13,3 @@ echo "Removing old model checkpoints." rm /tigress/jk7/data/model_checkpoints/* echo "Running distributed learning" mpirun -npernode 4 python mpi_learn.py - diff --git a/examples/extract_best_overtime.py b/examples/extract_best_overtime.py index f20fed60..867a08ef 100644 --- a/examples/extract_best_overtime.py +++ b/examples/extract_best_overtime.py @@ -1,9 +1,6 @@ +import matplotlib.pylab as plt import pandas as pd import glob -from subprocess import Popen -import yaml -import os -import math import numpy as np from random import shuffle from joblib import Parallel, delayed @@ -11,11 +8,9 @@ import matplotlib matplotlib.use('Agg') -import matplotlib.pylab as plt -import pdb -def arrangeTrialsAtRandom(filenames,scale=1.0): +def arrangeTrialsAtRandom(filenames, scale=1.0): shuffle(filenames) previous = pd.read_csv(filenames[0]) previous['times'] = previous['times'].apply(lambda x: x/60.0/scale) @@ -23,26 +18,29 @@ def arrangeTrialsAtRandom(filenames,scale=1.0): for filename in filenames[1:]: shift = max(previous['times'].values) current = pd.read_csv(filename) - current['times'] = current['times'].apply(lambda x: x/60.0/scale+shift) + current['times'] = current['times'].apply( + lambda x: x/60.0/scale + shift) dataframes.append(current) previous = current return pd.concat(dataframes) -def getOneBestValidationAUC(T_of_test,dataset): - #select subset of dataframe by time for all + +def getOneBestValidationAUC(T_of_test, dataset): + # select subset of dataframe by time for all dataset = dataset[dataset.times <= T_of_test] - - #apply emulate_converge script + + # apply emulate_converge script aucs = dataset['val_roc'].values if len(aucs) > 0: return max(aucs) else: return 0.0 + def doPlot(parallel_aucs, serial_aucs, times, errors): times = list(times) - times_histo = np.histogram(parallel_aucs,bins=times) - #values,edges = times_histo + np.histogram(parallel_aucs, bins=times) + # values,edges = times_histo parallel_values = parallel_aucs[1:] edges = times print(len(parallel_values)) @@ -54,106 +52,120 @@ def doPlot(parallel_aucs, serial_aucs, times, errors): print(edges.shape) print(serial_values.shape) - plt.figure() - plt.plot(edges, parallel_values,label = "Distributed search") #, width=np.diff(edges), ec="k", align="edge") - plt.plot(edges, serial_values, label="Sequential search") #, width=np.diff(edges), ec="k", align="edge") - #plt.fill_between(edges, serial_values-errors,serial_values+errors) - plt.legend(loc = (0.6,0.7)) + # , width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, parallel_values, label="Distributed search") + # , width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, serial_values, label="Sequential search") + # plt.fill_between(edges, serial_values-errors,serial_values+errors) + plt.legend(loc=(0.6, 0.7)) plt.xlabel("Time [minutes]", fontsize=20) - #plt.yscale('log') + # plt.yscale('log') plt.ylabel('Best validation AUC', fontsize=20) plt.savefig("times.png") plt.figure() - plt.plot(edges, parallel_values,label = "Distributed search") #, width=np.diff(edges), ec="k", align="edge") - plt.plot(edges, serial_values, label="Sequential search") #, width=np.diff(edges), ec="k", align="edge") - #plt.fill_between(edges, serial_values-errors,serial_values+errors) - plt.legend(loc = (0.6,0.7)) + # , width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, parallel_values, label="Distributed search") + # , width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, serial_values, label="Sequential search") + # plt.fill_between(edges, serial_values-errors,serial_values+errors) + plt.legend(loc=(0.6, 0.7)) plt.xlabel("Time [minutes]", fontsize=20) plt.xscale('log') - plt.xlim([0,100]) + plt.xlim([0, 100]) plt.ylabel('Best validation AUC', fontsize=20) plt.savefig("times_logx_start.png") plt.figure() - plt.plot(edges, parallel_values,label = "Distributed search") #, width=np.diff(edges), ec="k", align="edge") - plt.plot(edges, serial_values, label="Sequential search") #, width=np.diff(edges), ec="k", align="edge") - #plt.fill_between(edges, serial_values-errors,serial_values+errors) - plt.legend(loc = (0.6,0.7)) + # , width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, parallel_values, label="Distributed search") + # , width=np.diff(edges), ec="k", align="edge") + plt.plot(edges, serial_values, label="Sequential search") + # plt.fill_between(edges, serial_values-errors,serial_values+errors) + plt.legend(loc=(0.6, 0.7)) plt.xlabel("Time [minutes]", fontsize=20) plt.xscale('log') - plt.xlim([100,10000]) + plt.xlim([100, 10000]) plt.ylabel('Best validation AUC', fontsize=20) plt.savefig("times_logx.png") def getReplica(filenames, times): - serial_auc_replica = arrangeTrialsAtRandom(filenames,100.0) + serial_auc_replica = arrangeTrialsAtRandom(filenames, 100.0) best_serial_aucs_over_time = [] for T in times: current_best = 0 - ##pass AUCs and real epoch counts to emulate_converge - auc = getOneBestValidationAUC(T,serial_auc_replica) - if auc > current_best: current_best = auc + # pass AUCs and real epoch counts to emulate_converge + auc = getOneBestValidationAUC(T, serial_auc_replica) + if auc > current_best: + current_best = auc best_serial_aucs_over_time.append(current_best) - #replicas.append(best_serial_aucs_over_time) + # replicas.append(best_serial_aucs_over_time) return best_serial_aucs_over_time -def getTimeReplica(filenames,T): + +def getTimeReplica(filenames, T): current_best = 0 for filename in filenames: - #get AUCs for this trial, one per effective epoch + # get AUCs for this trial, one per effective epoch try: dataset = pd.read_csv(filename) dataset['times'] = dataset['times'].apply(lambda x: x/60.0) - except: + except BaseException: print("No data in {}".format(filename)) continue - ##pass AUCs and real epoch counts to emulate_converge - auc = getOneBestValidationAUC(T,dataset) - if auc > current_best: current_best = auc + # pass AUCs and real epoch counts to emulate_converge + auc = getOneBestValidationAUC(T, dataset) + if auc > current_best: + current_best = auc return current_best -def getTimeReplicaSerial(serial_auc_replica,T): + +def getTimeReplicaSerial(serial_auc_replica, T): current_best = 0 - ##pass AUCs and real epoch counts to emulate_converge - auc = getOneBestValidationAUC(T,serial_auc_replica) - if auc > current_best: current_best = auc + # pass AUCs and real epoch counts to emulate_converge + auc = getOneBestValidationAUC(T, serial_auc_replica) + if auc > current_best: + current_best = auc - #replicas.append(best_serial_aucs_over_time) + # replicas.append(best_serial_aucs_over_time) return current_best if __name__ == '__main__': - filenames = glob.glob("/tigress/FRNN/JET_Titan_hyperparameter_run/*/temporal_csv_log.csv") + filenames = glob.glob( + "/tigress/FRNN/JET_Titan_hyperparameter_run/*/temporal_csv_log.csv") patience = 5 - times = np.linspace(0,310*30,186*30) + times = np.linspace(0, 310*30, 186*30) best_parallel_aucs_over_time = [] num_cores = multiprocessing.cpu_count() - print ("Running on ", num_cores, " CPU cores") - best_parallel_aucs_over_time = Parallel(n_jobs=num_cores)(delayed(getTimeReplica)(filenames, T) for T in times) + print("Running on ", num_cores, " CPU cores") + best_parallel_aucs_over_time = Parallel(n_jobs=num_cores)( + delayed(getTimeReplica)(filenames, T) for T in times) Nreplicas = 20 replicas = [] - for i in range(Nreplicas): - serial_auc_replica = arrangeTrialsAtRandom(filenames,100.0) + serial_auc_replica = arrangeTrialsAtRandom(filenames, 100.0) - #replicas = Parallel(n_jobs=num_cores)(delayed(getReplica)(filenames, times) for i in range(Nreplicas)) - best_serial_aucs_over_time = Parallel(n_jobs=num_cores)(delayed(getTimeReplicaSerial)(serial_auc_replica, T) for T in times) + # replicas = Parallel(n_jobs=num_cores)(delayed(getReplica)(filenames, + # times) for i in range(Nreplicas)) + best_serial_aucs_over_time = Parallel(n_jobs=num_cores)( + delayed(getTimeReplicaSerial)(serial_auc_replica, + T) for T in times) replicas.append(best_serial_aucs_over_time) - - from statistics import mean,stdev + from statistics import mean, stdev best_serial_aucs_over_time = list(map(mean, zip(*replicas))) errors = list(map(stdev, zip(*replicas))) - doPlot(best_parallel_aucs_over_time, best_serial_aucs_over_time, times, errors) + doPlot(best_parallel_aucs_over_time, best_serial_aucs_over_time, times, + errors) diff --git a/examples/guarantee_preprocessed.py b/examples/guarantee_preprocessed.py index 67826ad0..310ed300 100644 --- a/examples/guarantee_preprocessed.py +++ b/examples/guarantee_preprocessed.py @@ -1,18 +1,13 @@ -from __future__ import print_function -import os -import sys -import time -import datetime +from plasma.preprocessor.preprocess import guarantee_preprocessed import random import numpy as np from plasma.conf import conf from pprint import pprint pprint(conf) -from plasma.preprocessor.preprocess import guarantee_preprocessed ##################################################### -####################PREPROCESSING#################### +# PREPROCESSING # ##################################################### np.random.seed(0) random.seed(0) diff --git a/examples/hyper_learn.py b/examples/hyper_learn.py index 4306835b..0dc41a8a 100644 --- a/examples/hyper_learn.py +++ b/examples/hyper_learn.py @@ -1,4 +1,5 @@ -from __future__ import print_function +from plasma.models import runner +from plasma.models.loader import Loader import numpy as np from hyperopt import Trials, tpe @@ -6,37 +7,41 @@ from plasma.conf import conf from pprint import pprint pprint(conf) -#from plasma.primitives.shots import Shot, ShotList -from plasma.preprocessor.normalize import Normalizer -from plasma.models.loader import Loader -#from plasma.models.runner import train, make_predictions,make_predictions_gpu +# from plasma.primitives.shots import Shot, ShotList +# from plasma.models.runner import train, make_predictions,make_predictions_gpu if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import VarNormalizer as Normalizer elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import ( + AveragingVarNormalizer as Normalizer + ) else: print('unkown normalizer. exiting') exit(1) np.random.seed(1) -print("normalization",end='') +print("normalization", end='') nn = Normalizer(conf) nn.train() -loader = Loader(conf,nn) -shot_list_train,shot_list_validate,shot_list_test = loader.load_shotlists(conf) +loader = Loader(conf, nn) +shot_list_train, shot_list_validate, shot_list_test = loader.load_shotlists( + conf) print("...done") -print('Training on {} shots, testing on {} shots'.format(len(shot_list_train),len(shot_list_test))) -from plasma.models import runner +print('Training on {} shots, testing on {} shots'.format( + len(shot_list_train), len(shot_list_test))) -specific_runner = runner.HyperRunner(conf,loader,shot_list_train) +specific_runner = runner.HyperRunner(conf, loader, shot_list_train) -best_run, best_model = specific_runner.frnn_minimize(algo=tpe.suggest,max_evals=2,trials=Trials()) -print (best_run) -print (best_model) +best_run, best_model = specific_runner.frnn_minimize( + algo=tpe.suggest, max_evals=2, trials=Trials()) +print(best_run) +print(best_model) diff --git a/examples/individual_shot_performance.py b/examples/individual_shot_performance.py index dec7a6b7..a2ad6989 100644 --- a/examples/individual_shot_performance.py +++ b/examples/individual_shot_performance.py @@ -1,17 +1,15 @@ -import os,sys -import numpy as np - -from plasma.utils.performance import * +import sys +from plasma.utils.performance import PerformanceAnalyzer from plasma.conf import conf -#mode = 'test' +# mode = 'test' file_num = 0 save_figure = True pred_ttd = False -T_min_warn = 30 #None #take value from conf #30 +T_min_warn = 30 # None #take value from conf #30 -verbose=False +verbose = False if len(sys.argv) == 3: results_dir = sys.argv[1] num = int(sys.argv[2]) @@ -23,10 +21,11 @@ print("Plotting shot {}".format(num)) shots_dir = conf['paths']['processed_prepath'] -analyzer = PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num, -T_min_warn = T_min_warn, verbose = verbose, pred_ttd=pred_ttd) +analyzer = PerformanceAnalyzer(conf=conf, results_dir=results_dir, + shots_dir=shots_dir, i=file_num, + T_min_warn=T_min_warn, verbose=verbose, + pred_ttd=pred_ttd) analyzer.load_ith_file() P_thresh_opt = analyzer.compute_tradeoffs_and_print_from_training() -analyzer.plot_individual_shot(P_thresh_opt,num) - +analyzer.plot_individual_shot(P_thresh_opt, num) diff --git a/examples/learn.py b/examples/learn.py index 14eae8fb..947e58fc 100644 --- a/examples/learn.py +++ b/examples/learn.py @@ -1,3 +1,9 @@ +from plasma.models.loader import Loader +from plasma.preprocessor.preprocess import guarantee_preprocessed +from pprint import pprint +from plasma.conf import conf +import multiprocessing as old_mp +import numpy as np ''' ######################################################### This file trains a deep learning model to predict @@ -14,38 +20,35 @@ ######################################################### ''' -from __future__ import print_function -import datetime,time,random -import sys,os -import dill -from functools import partial +import datetime +import random +import sys +import os import matplotlib matplotlib.use('Agg') -import numpy as np -import multiprocessing as old_mp -from plasma.conf import conf -from pprint import pprint pprint(conf) -from plasma.primitives.shots import Shot, ShotList -from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.preprocess import Preprocessor, guarantee_preprocessed -from plasma.models.loader import Loader if conf['model']['shallow']: - from plasma.models.shallow_runner import train, make_predictions_and_evaluate_gpu + from plasma.models.shallow_runner import ( + train, make_predictions_and_evaluate_gpu + ) else: from plasma.models.runner import train, make_predictions_and_evaluate_gpu if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': - from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer + from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import VarNormalizer as Normalizer elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import ( + AveragingVarNormalizer as Normalizer + ) else: print('unkown normalizer. exiting') exit(1) @@ -55,7 +58,7 @@ shot_files_test = conf['paths']['shot_files_test'] train_frac = conf['training']['train_frac'] stateful = conf['model']['stateful'] -# if stateful: +# if stateful: # batch_size = conf['model']['length'] # else: # batch_size = conf['training']['batch_size_large'] @@ -70,37 +73,43 @@ print("predicting using path {}".format(custom_path)) ##################################################### -####################PREPROCESSING#################### +# PREPROCESSING # ##################################################### -shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +# TODO(KGF): check tuple unpack +(shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) ##################################################### -####################Normalization#################### +# NORMALIZATION # ##################################################### -print("normalization",end='') +print("normalization", end='') nn = Normalizer(conf) nn.train() -loader = Loader(conf,nn) +loader = Loader(conf, nn) print("...done") -print('Training on {} shots, testing on {} shots'.format(len(shot_list_train),len(shot_list_test))) +print('Training on {} shots, testing on {} shots'.format( + len(shot_list_train), len(shot_list_test))) ##################################################### -######################TRAINING####################### +# TRAINING # ##################################################### -#train(conf,shot_list_train,loader) +# train(conf,shot_list_train,loader) if not only_predict: - p = old_mp.Process(target = train,args=(conf,shot_list_train,shot_list_validate,loader)) + p = old_mp.Process(target=train, + args=(conf, shot_list_train, + shot_list_validate, loader) + ) p.start() p.join() ##################################################### -####################PREDICTING####################### +# PREDICTING # ##################################################### loader.set_inference_mode(True) -#load last model for testing +# load last model for testing print('saving results') y_prime = [] y_prime_test = [] @@ -110,15 +119,22 @@ y_gold_test = [] y_gold_train = [] -disruptive= [] -disruptive_train= [] -disruptive_test= [] - -# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) -# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) - -y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader,custom_path) -y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = make_predictions_and_evaluate_gpu(conf,shot_list_test,loader,custom_path) +disruptive = [] +disruptive_train = [] +disruptive_test = [] + +# y_prime_train, y_gold_train, disruptive_train = +# make_predictions(conf, shot_list_train, loader) +# y_prime_test, y_gold_test, disruptive_test = +# make_predictions(conf, shot_list_test, loader) + +# TODO(KGF): check tuple unpack +(y_prime_train, y_gold_train, disruptive_train, roc_train, + loss_train) = make_predictions_and_evaluate_gpu( + conf, shot_list_train, loader, custom_path) +(y_prime_test, y_gold_test, disruptive_test, roc_test, + loss_test) = make_predictions_and_evaluate_gpu( + conf, shot_list_test, loader, custom_path) print('=========Summary========') print('Train Loss: {:.3e}'.format(loss_train)) print('Train ROC: {:.4f}'.format(roc_train)) @@ -126,13 +142,12 @@ print('Test ROC: {:.4f}'.format(roc_test)) - disruptive_train = np.array(disruptive_train) disruptive_test = np.array(disruptive_test) y_gold = y_gold_train + y_gold_test y_prime = y_prime_train + y_prime_test -disruptive = np.concatenate((disruptive_train,disruptive_test)) +disruptive = np.concatenate((disruptive_train, disruptive_test)) shot_list_validate.make_light() shot_list_test.make_light() @@ -142,11 +157,12 @@ result_base_path = conf['paths']['results_prepath'] if not os.path.exists(result_base_path): os.makedirs(result_base_path) -np.savez(result_base_path+save_str, - y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, - y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, - disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, - shot_list_validate=shot_list_validate,shot_list_train=shot_list_train,shot_list_test=shot_list_test, - conf = conf) +np.savez(result_base_path+save_str, y_gold=y_gold, y_gold_train=y_gold_train, + y_gold_test=y_gold_test, y_prime=y_prime, y_prime_train=y_prime_train, + y_prime_test=y_prime_test, disruptive=disruptive, + disruptive_train=disruptive_train, disruptive_test=disruptive_test, + shot_list_validate=shot_list_validate, + shot_list_train=shot_list_train, shot_list_test=shot_list_test, + conf=conf) print('finished.') diff --git a/examples/mpi_augment_learn.py b/examples/mpi_augment_learn.py index 35df1aaa..727d559b 100644 --- a/examples/mpi_augment_learn.py +++ b/examples/mpi_augment_learn.py @@ -1,3 +1,12 @@ +from plasma.models.mpi_runner import ( + mpi_train, mpi_make_predictions_and_evaluate + ) +from mpi4py import MPI +from plasma.preprocessor.preprocess import guarantee_preprocessed +from plasma.preprocessor.augment import Augmentator +from plasma.models.loader import Loader +from plasma.conf import conf +from pprint import pprint ''' ######################################################### This file trains a deep learning model to predict @@ -16,10 +25,8 @@ ######################################################### ''' -from __future__ import print_function import os -import sys -import time +import sys import datetime import random import numpy as np @@ -27,38 +34,35 @@ import matplotlib matplotlib.use('Agg') -from pprint import pprint sys.setrecursionlimit(10000) -from plasma.conf import conf -from plasma.models.loader import Loader -from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.augment import Augmentator -from plasma.preprocessor.preprocess import guarantee_preprocessed if conf['model']['shallow']: - print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + print( + "Shallow learning using MPI is not supported yet. ", + "Set conf['model']['shallow'] to False.") exit(1) if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import VarNormalizer as Normalizer elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import ( + AveragingVarNormalizer as Normalizer) else: print('unkown normalizer. exiting') exit(1) -from mpi4py import MPI comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() NUM_GPUS = 4 MY_GPU = task_index % NUM_GPUS -from plasma.models.mpi_runner import * np.random.seed(task_index) random.seed(task_index) @@ -72,47 +76,54 @@ print("predicting using path {}".format(custom_path)) ##################################################### -####################Normalization#################### +# NORMALIZATION # ##################################################### -if task_index == 0: #make sure preprocessing has been run, and is saved as a file - shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +# TODO(KGF): identical in at least 3x files in examples/ +# make sure preprocessing has been run, and is saved as a file +if task_index == 0: + # TODO(KGF): check tuple unpack + (shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) comm.Barrier() -shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) - +(shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) -print("normalization",end='') +print("normalization", end='') raw_normalizer = Normalizer(conf) raw_normalizer.train() -is_inference= False -normalizer = Augmentator(raw_normalizer,is_inference,conf) -loader = Loader(conf,normalizer) +is_inference = False +normalizer = Augmentator(raw_normalizer, is_inference, conf) +loader = Loader(conf, normalizer) print("...done") if not only_predict: - mpi_train(conf,shot_list_train,shot_list_validate,loader) + mpi_train(conf, shot_list_train, shot_list_validate, loader) -#load last model for testing +# load last model for testing print('saving results') y_prime = [] y_gold = [] -disruptive= [] - -# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) -# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) +disruptive = [] normalizer.set_inference(True) -y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader,custom_path) -y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) +# TODO(KGF): check tuple unpack +(y_prime_train, y_gold_train, disruptive_train, roc_train, + loss_train) = mpi_make_predictions_and_evaluate(conf, shot_list_train, + loader, custom_path) +(y_prime_test, y_gold_test, disruptive_test, roc_test, + loss_test) = mpi_make_predictions_and_evaluate(conf, shot_list_test, + loader, custom_path) if task_index == 0: - print('=========Summary========') - print('Train Loss: {:.3e}'.format(loss_train)) - print('Train ROC: {:.4f}'.format(roc_train)) - print('Test Loss: {:.3e}'.format(loss_test)) - print('Test ROC: {:.4f}'.format(roc_test)) - if roc_test < 0.8: sys.exit(1) + print('=========Summary========') + print('Train Loss: {:.3e}'.format(loss_train)) + print('Train ROC: {:.4f}'.format(roc_train)) + print('Test Loss: {:.3e}'.format(loss_test)) + print('Test ROC: {:.4f}'.format(roc_test)) + if roc_test < 0.8: + sys.exit(1) if task_index == 0: @@ -121,22 +132,25 @@ y_gold = y_gold_train + y_gold_test y_prime = y_prime_train + y_prime_test - disruptive = np.concatenate((disruptive_train,disruptive_test)) + disruptive = np.concatenate((disruptive_train, disruptive_test)) shot_list_test.make_light() shot_list_train.make_light() - save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + save_str = 'results_' + datetime.datetime.now().strftime( + "%Y-%m-%d-%H-%M-%S") result_base_path = conf['paths']['results_prepath'] if not os.path.exists(result_base_path): os.makedirs(result_base_path) - np.savez(result_base_path+save_str, - y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, - y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, - disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, - shot_list_train=shot_list_train,shot_list_test=shot_list_test, - conf = conf) + np.savez(result_base_path+save_str, y_gold=y_gold, + y_gold_train=y_gold_train, y_gold_test=y_gold_test, + y_prime=y_prime, y_prime_train=y_prime_train, + y_prime_test=y_prime_test, disruptive=disruptive, + disruptive_train=disruptive_train, + disruptive_test=disruptive_test, + shot_list_train=shot_list_train, shot_list_test=shot_list_test, + conf=conf) sys.stdout.flush() if task_index == 0: diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 7bc4ce8b..16321888 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -1,3 +1,11 @@ +from plasma.models.mpi_runner import ( + mpi_train, mpi_make_predictions_and_evaluate + ) +from mpi4py import MPI +from plasma.preprocessor.preprocess import guarantee_preprocessed +from plasma.models.loader import Loader +from plasma.conf import conf +from pprint import pprint ''' ######################################################### This file trains a deep learning model to predict @@ -16,10 +24,8 @@ ######################################################### ''' -from __future__ import print_function import os -import sys -import time +import sys import datetime import random import numpy as np @@ -27,37 +33,36 @@ import matplotlib matplotlib.use('Agg') -from pprint import pprint sys.setrecursionlimit(10000) -from plasma.conf import conf -from plasma.models.loader import Loader -from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.preprocess import guarantee_preprocessed if conf['model']['shallow']: - print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + print( + "Shallow learning using MPI is not supported yet. ", + "Set conf['model']['shallow'] to False.") exit(1) if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import VarNormalizer as Normalizer elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import ( + AveragingVarNormalizer as Normalizer + ) else: print('unkown normalizer. exiting') exit(1) -from mpi4py import MPI comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS -from plasma.models.mpi_runner import * np.random.seed(task_index) random.seed(task_index) @@ -70,47 +75,53 @@ custom_path = sys.argv[1] print("predicting using path {}".format(custom_path)) + ##################################################### -####################Normalization#################### +# NORMALIZATION # ##################################################### -if task_index == 0: #make sure preprocessing has been run, and is saved as a file - shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +# make sure preprocessing has been run, and is saved as a file +if task_index == 0: + # TODO(KGF): check tuple unpack + (shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) comm.Barrier() -shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) - +(shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) -print("normalization",end='') +print("normalization", end='') normalizer = Normalizer(conf) normalizer.train() -loader = Loader(conf,normalizer) +loader = Loader(conf, normalizer) print("...done") -#ensure training has a separate random seed for every worker +# ensure training has a separate random seed for every worker np.random.seed(task_index) random.seed(task_index) if not only_predict: - mpi_train(conf,shot_list_train,shot_list_validate,loader) + mpi_train(conf, shot_list_train, shot_list_validate, loader) -#load last model for testing +# load last model for testing loader.set_inference_mode(True) print('saving results') y_prime = [] y_gold = [] -disruptive= [] - -# y_prime_train,y_gold_train,disruptive_train = make_predictions(conf,shot_list_train,loader) -# y_prime_test,y_gold_test,disruptive_test = make_predictions(conf,shot_list_test,loader) +disruptive = [] -y_prime_train,y_gold_train,disruptive_train,roc_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader,custom_path) -y_prime_test,y_gold_test,disruptive_test,roc_test,loss_test = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) +# TODO(KGF): check tuple unpack +(y_prime_train, y_gold_train, disruptive_train, roc_train, + loss_train) = mpi_make_predictions_and_evaluate(conf, shot_list_train, + loader, custom_path) +(y_prime_test, y_gold_test, disruptive_test, roc_test, + loss_test) = mpi_make_predictions_and_evaluate(conf, shot_list_test, + loader, custom_path) if task_index == 0: - print('=========Summary========') - print('Train Loss: {:.3e}'.format(loss_train)) - print('Train ROC: {:.4f}'.format(roc_train)) - print('Test Loss: {:.3e}'.format(loss_test)) - print('Test ROC: {:.4f}'.format(roc_test)) + print('=========Summary========') + print('Train Loss: {:.3e}'.format(loss_train)) + print('Train ROC: {:.4f}'.format(roc_train)) + print('Test Loss: {:.3e}'.format(loss_test)) + print('Test ROC: {:.4f}'.format(roc_test)) if task_index == 0: @@ -119,22 +130,24 @@ y_gold = y_gold_train + y_gold_test y_prime = y_prime_train + y_prime_test - disruptive = np.concatenate((disruptive_train,disruptive_test)) + disruptive = np.concatenate((disruptive_train, disruptive_test)) shot_list_test.make_light() shot_list_train.make_light() - save_str = 'results_' + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + save_str = 'results_' + datetime.datetime.now().strftime( + "%Y-%m-%d-%H-%M-%S") result_base_path = conf['paths']['results_prepath'] if not os.path.exists(result_base_path): os.makedirs(result_base_path) - np.savez(result_base_path+save_str, - y_gold=y_gold,y_gold_train=y_gold_train,y_gold_test=y_gold_test, - y_prime=y_prime,y_prime_train=y_prime_train,y_prime_test=y_prime_test, - disruptive=disruptive,disruptive_train=disruptive_train,disruptive_test=disruptive_test, - shot_list_train=shot_list_train,shot_list_test=shot_list_test, - conf = conf) + np.savez(result_base_path+save_str, y_gold=y_gold, + y_gold_train=y_gold_train, y_gold_test=y_gold_test, + y_prime=y_prime, y_prime_train=y_prime_train, + y_prime_test=y_prime_test, disruptive=disruptive, + disruptive_train=disruptive_train, + disruptive_test=disruptive_test, shot_list_train=shot_list_train, + shot_list_test=shot_list_test, conf=conf) sys.stdout.flush() if task_index == 0: diff --git a/examples/performance_analysis.py b/examples/performance_analysis.py index 31568581..499abd45 100644 --- a/examples/performance_analysis.py +++ b/examples/performance_analysis.py @@ -1,66 +1,93 @@ -import os,sys +import sys import numpy as np -from plasma.utils.performance import * +from plasma.utils.performance import PerformanceAnalyzer from plasma.conf import conf -#mode = 'test' +# mode = 'test' file_num = 0 save_figure = True pred_ttd = False -# cut_shot_ends = conf['data']['cut_shot_ends'] -# dt = conf['data']['dt'] -# T_max_warn = int(round(conf['data']['T_warning']/dt)) -# T_min_warn = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) -# if cut_shot_ends: -# T_max_warn = T_max_warn-T_min_warn -# T_min_warn = 0 -T_min_warn = 30 #None #take value from conf #30 +T_min_warn = 30 # None #take value from conf #30 -verbose=False +verbose = False if len(sys.argv) > 1: results_dir = sys.argv[1] else: results_dir = conf['paths']['results_prepath'] shots_dir = conf['paths']['processed_prepath'] -analyzer = PerformanceAnalyzer(conf=conf,results_dir=results_dir,shots_dir=shots_dir,i = file_num, -T_min_warn = T_min_warn, verbose = verbose, pred_ttd=pred_ttd) +analyzer = PerformanceAnalyzer( + conf=conf, + results_dir=results_dir, + shots_dir=shots_dir, + i=file_num, + T_min_warn=T_min_warn, + verbose=verbose, + pred_ttd=pred_ttd) analyzer.load_ith_file() P_thresh_opt = analyzer.compute_tradeoffs_and_print_from_training() -#P_thresh_opt = 0.566#0.566#0.92# analyzer.compute_tradeoffs_and_print_from_training() -linestyle="-" +# P_thresh_opt = 0.566 # 0.566 # 0.92 +# analyzer.compute_tradeoffs_and_print_from_training() +linestyle = "-" -P_thresh_range,missed_range,fp_range = analyzer.compute_tradeoffs_and_plot('test',save_figure=save_figure,plot_string='_test',linestyle=linestyle) -np.savez('test_roc.npz',"P_thresh_range",P_thresh_range,"missed_range",missed_range,"fp_range",fp_range) -analyzer.compute_tradeoffs_and_plot('train',save_figure=save_figure,plot_string='_train',linestyle=linestyle) +P_thresh_range, missed_range, fp_range = analyzer.compute_tradeoffs_and_plot( + 'test', save_figure=save_figure, plot_string='_test', linestyle=linestyle) +np.savez( + 'test_roc.npz', + "P_thresh_range", + P_thresh_range, + "missed_range", + missed_range, + "fp_range", + fp_range) +analyzer.compute_tradeoffs_and_plot( + 'train', + save_figure=save_figure, + plot_string='_train', + linestyle=linestyle) -analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test') +analyzer.summarize_shot_prediction_stats_by_mode(P_thresh_opt, 'test') normalize = True -analyzer.example_plots(P_thresh_opt,'test','any',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'test',['FP'],extra_filename='test',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'test',['FN'],extra_filename='test',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'test',['TP'],extra_filename='test',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'test',['late'],extra_filename='test',normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'test', 'any', normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'test', ['FP'], extra_filename='test', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'test', ['FN'], extra_filename='test', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'test', ['TP'], extra_filename='test', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'test', ['late'], extra_filename='test', + normalize=normalize) -analyzer.example_plots(P_thresh_opt,'train',['TN'],extra_filename='train',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'train',['FP'],extra_filename='train',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'train',['FN'],extra_filename='train',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'train',['TP'],extra_filename='train',normalize=normalize) -analyzer.example_plots(P_thresh_opt,'train',['late'],extra_filename='train',normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'train', ['TN'], extra_filename='train', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'train', ['FP'], extra_filename='train', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'train', ['FN'], extra_filename='train', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'train', ['TP'], extra_filename='train', + normalize=normalize) +analyzer.example_plots(P_thresh_opt, 'train', ['late'], extra_filename='train', + normalize=normalize) -alarms,disr_alarms,nondisr_alarms = analyzer.gather_first_alarms(P_thresh_opt,'test') -analyzer.hist_alarms(disr_alarms,'disruptive alarms, P thresh = {}'.format(P_thresh_opt),save_figure=save_figure,linestyle=linestyle) -np.savez('disruptive_alarms_test.npz',"disr_alarms",disr_alarms,"P_thresh_opt",P_thresh_opt) +alarms, disr_alarms, nondisr_alarms = analyzer.gather_first_alarms( + P_thresh_opt, 'test') +analyzer.hist_alarms(disr_alarms, 'disruptive alarms, P thresh = {}'.format( + P_thresh_opt), save_figure=save_figure, linestyle=linestyle) +np.savez('disruptive_alarms_test.npz', "disr_alarms", disr_alarms, + "P_thresh_opt", P_thresh_opt) print('{} disruptive alarms'.format(len(disr_alarms))) -print('{} seconds mean alarm time'.format(np.mean(disr_alarms[disr_alarms > 0]))) -print('{} seconds median alarm time'.format(np.median(disr_alarms[disr_alarms > 0]))) -analyzer.hist_alarms(nondisr_alarms,'nondisruptive alarms, P thresh = {}'.format(P_thresh_opt)) +print('{} seconds mean alarm time'.format( + np.mean(disr_alarms[disr_alarms > 0]))) +print('{} seconds median alarm time'.format( + np.median(disr_alarms[disr_alarms > 0]))) +analyzer.hist_alarms(nondisr_alarms, + 'nondisruptive alarms, P thresh = {}'.format(P_thresh_opt) + ) print('{} nondisruptive alarms'.format(len(nondisr_alarms))) - diff --git a/examples/prepare_pbs_configs_titan.py b/examples/prepare_pbs_configs_titan.py index f036c9d8..bd92b2be 100644 --- a/examples/prepare_pbs_configs_titan.py +++ b/examples/prepare_pbs_configs_titan.py @@ -3,76 +3,85 @@ from subprocess import Popen from time import sleep -def checkAndSchedule(configBaseName,nextGPUcount,GPUstep,maxGPUcount): - if nextGPUcount > maxGPUcount: return - job_is_running = subprocess.check_output(['qstat','-u','alexeys']) - if len(job_is_running) > 0: - #sleep 500 seconds + +def checkAndSchedule(configBaseName, nextGPUcount, GPUstep, maxGPUcount): + if nextGPUcount > maxGPUcount: + return + job_is_running = subprocess.check_output(['qstat', '-u', 'alexeys']) + if len(job_is_running) > 0: + # sleep 500 seconds sleep(500) - checkAndSchedule(configBaseName,nextGPUcount,GPUstep,maxGPUcount) + checkAndSchedule(configBaseName, nextGPUcount, GPUstep, maxGPUcount) else: - #create a config - nextConfigName = createOneConfig(configBaseName,nextGPUcount) - print "Submitting next PBS job {} to run on {} GPUs".format(configBaseName,nextGPUcount) - print "qsub "+nextConfigName - Popen("qsub "+nextConfigName,shell=True).wait() - #update parameters + # create a config + nextConfigName = createOneConfig(configBaseName, nextGPUcount) + print("Submitting next PBS job {} to run on {} GPUs".format( + configBaseName, nextGPUcount)) + print("qsub ", nextConfigName) + Popen("qsub " + nextConfigName, shell=True).wait() + # update parameters nextGPUcount += GPUstep sleep(10) - checkAndSchedule(configBaseName,nextGPUcount,GPUstep,maxGPUcount) + checkAndSchedule(configBaseName, nextGPUcount, GPUstep, maxGPUcount) def createOneConfig(configBaseName, GPUcount): configFullName = configBaseName+str(GPUcount)+".cmd" - with open(configFullName,"w") as f: - f.write('#!/bin/bash\n') - f.write('#PBS -A FUS117\n') - f.write('#PBS -l walltime=1:30:00\n') #FIXME this depends a lot on the number of GPUs 1900s/1epoch at 50, 2350s/1epoch at 4 - f.write('#PBS -l nodes='+str(GPUcount)+'\n') - f.write('##PBS -l procs=1\n') - f.write('##PBS -l gres=atlas1%atlas2\n') + with open(configFullName, "w") as f: + f.write('#!/bin/bash\n') + f.write('#PBS -A FUS117\n') + # FIXME this depends a lot on the number of GPUs 1900s/1epoch at 50, + # 2350s/1epoch at 4 + f.write('#PBS -l walltime=1:30:00\n') + f.write('#PBS -l nodes='+str(GPUcount)+'\n') + f.write('##PBS -l procs=1\n') + f.write('##PBS -l gres=atlas1%atlas2\n') f.write('\n\n') - f.write('export HOME=/lustre/atlas/proj-shared/fus117\n') - f.write('cd $HOME/PPPL/plasma-python/examples\n') + f.write('export HOME=/lustre/atlas/proj-shared/fus117\n') + f.write('cd $HOME/PPPL/plasma-python/examples\n') f.write('\n\n') - f.write('source $MODULESHOME/init/bash\n') - f.write('module switch PrgEnv-pgi PrgEnv-gnu\n') + f.write('source $MODULESHOME/init/bash\n') + f.write('module switch PrgEnv-pgi PrgEnv-gnu\n') f.write('\n\n') - f.write('module load cudatoolkit\n') - f.write('export LIBRARY_PATH=/opt/nvidia/cudatoolkit7.5/7.5.18-1.0502.10743.2.1/lib64:$LIBRARY_PATH\n') + f.write('module load cudatoolkit\n') + f.write(('export LIBRARY_PATH=/opt/nvidia/cudatoolkit7.5/' + '7.5.18-1.0502.10743.2.1/lib64:$LIBRARY_PATH\n')) f.write('\n\n') - f.write('#This block is CuDNN module\n') - f.write('export LD_LIBRARY_PATH=$HOME/cuda/lib64:$LD_LIBRARY_PATH\n') - f.write('export LIBRARY_PATH=$HOME/cuda/lib64:$LIBRARY_PATH\n') - f.write('export LDFLAGS=$LDFLAGS:$HOME/cuda/lib64\n') - f.write('export INCLUDE=$INCLUDE:$HOME/cuda/include\n') - f.write('export CPATH=$CPATH:$HOME/cuda/include\n') - f.write('export FFLAGS=$FFLAGS:$HOME/cuda/include\n') - f.write('export LOCAL_LDFLAGS=$LOCAL_LDFLAGS:$HOME/cuda/lib64\n') - f.write('export LOCAL_INCLUDE=$LOCAL_INCLUDE:$HOME/cuda/include\n') - f.write('export LOCAL_CFLAGS=$LOCAL_CFLAGS:$HOME/cuda/include\n') - f.write('export LOCAL_FFLAGS=$LOCAL_FFLAGS:$HOME/cuda/include\n') - f.write('export LOCAL_CXXFLAGS=$LOCAL_CXXFLAGS:$HOME/cuda/include\n') + f.write('#This block is CuDNN module\n') + f.write('export LD_LIBRARY_PATH=$HOME/cuda/lib64:$LD_LIBRARY_PATH\n') + f.write('export LIBRARY_PATH=$HOME/cuda/lib64:$LIBRARY_PATH\n') + f.write('export LDFLAGS=$LDFLAGS:$HOME/cuda/lib64\n') + f.write('export INCLUDE=$INCLUDE:$HOME/cuda/include\n') + f.write('export CPATH=$CPATH:$HOME/cuda/include\n') + f.write('export FFLAGS=$FFLAGS:$HOME/cuda/include\n') + f.write('export LOCAL_LDFLAGS=$LOCAL_LDFLAGS:$HOME/cuda/lib64\n') + f.write('export LOCAL_INCLUDE=$LOCAL_INCLUDE:$HOME/cuda/include\n') + f.write('export LOCAL_CFLAGS=$LOCAL_CFLAGS:$HOME/cuda/include\n') + f.write('export LOCAL_FFLAGS=$LOCAL_FFLAGS:$HOME/cuda/include\n') + f.write('export LOCAL_CXXFLAGS=$LOCAL_CXXFLAGS:$HOME/cuda/include\n') f.write('\n\n') - f.write('#This sets new home and Anaconda module\n') - f.write('export PATH=$HOME/anaconda2/bin:$PATH\n') - f.write('export LD_LIBRARY_PATH=$HOME/anaconda2/lib:$LD_LIBRARY_PATH\n') - f.write('source activate PPPL\n') + f.write('#This sets new home and Anaconda module\n') + f.write('export PATH=$HOME/anaconda2/bin:$PATH\n') + f.write( + 'export LD_LIBRARY_PATH=$HOME/anaconda2/lib:$LD_LIBRARY_PATH\n') + f.write('source activate PPPL\n') f.write('\n\n') - f.write('PYTHON=`which python`\n') - f.write('echo $PYTHON\n') + f.write('PYTHON=`which python`\n') + f.write('echo $PYTHON\n') f.write('\n\n') - f.write('export LD_LIBRARY_PATH=$CRAY_LD_LIBRARY_PATH:$LD_LIBRARY_PATH\n') - f.write('export MPICH_RDMA_ENABLED_CUDA=1\n') + f.write( + 'export LD_LIBRARY_PATH=$CRAY_LD_LIBRARY_PATH:$LD_LIBRARY_PATH\n') + f.write('export MPICH_RDMA_ENABLED_CUDA=1\n') f.write('\n\n') - f.write('rm $HOME/tigress/alexeys/model_checkpoints/*\n') - f.write('aprun -n'+str(GPUcount)+' -N1 $PYTHON mpi_learn.py\n') + f.write('rm $HOME/tigress/alexeys/model_checkpoints/*\n') + f.write('aprun -n'+str(GPUcount)+' -N1 $PYTHON mpi_learn.py\n') return configFullName -if __name__=='__main__': + +if __name__ == '__main__': nextGPUcount = 50 - GPUstep = 50 + GPUstep = 50 maxGPUcount = 101 configBaseName = "FRNN_Titan" - checkAndSchedule(configBaseName,nextGPUcount,GPUstep,maxGPUcount) + checkAndSchedule(configBaseName, nextGPUcount, GPUstep, maxGPUcount) diff --git a/examples/prepare_slurm_configs.py b/examples/prepare_slurm_configs.py index 32223b53..518eccf8 100644 --- a/examples/prepare_slurm_configs.py +++ b/examples/prepare_slurm_configs.py @@ -3,29 +3,34 @@ from subprocess import Popen from time import sleep -def checkAndSchedule(configBaseName,gpuNodeCountGrid,nextGPUNodeCount): - if nextGPUNodeCount > len(gpuNodeCountGrid)-1: return - job_is_running = subprocess.check_output(['squeue','-u','alexeys']) #['qstat','-u','alexeys']) + +def checkAndSchedule(configBaseName, gpuNodeCountGrid, nextGPUNodeCount): + if nextGPUNodeCount > len(gpuNodeCountGrid)-1: + return + job_is_running = subprocess.check_output( + ['squeue', '-u', 'alexeys']) # ['qstat','-u','alexeys']) if 'alexeys' in job_is_running: - #sleep 500 seconds + # sleep 500 seconds sleep(500) - checkAndSchedule(configBaseName,gpuNodeCountGrid,nextGPUNodeCount) + checkAndSchedule(configBaseName, gpuNodeCountGrid, nextGPUNodeCount) else: - #create a config - nextConfigName = createOneConfig(configBaseName,gpuNodeCountGrid[nextGPUNodeCount]) - print "Submitting next PBS job {} to run on {} GPUs".format(configBaseName,gpuNodeCountGrid[nextGPUNodeCount]) - print "sbatch "+nextConfigName - Popen("sbatch "+nextConfigName,shell=True).wait() - #update parameters + # create a config + nextConfigName = createOneConfig( + configBaseName, gpuNodeCountGrid[nextGPUNodeCount]) + print("Submitting next PBS job {} to run on {} GPUs".format( + configBaseName, gpuNodeCountGrid[nextGPUNodeCount])) + print("sbatch ", nextConfigName) + Popen("sbatch " + nextConfigName, shell=True).wait() + # update parameters nextGPUNodeCount += 1 sleep(10) - checkAndSchedule(configBaseName,gpuNodeCountGrid,nextGPUNodeCount) + checkAndSchedule(configBaseName, gpuNodeCountGrid, nextGPUNodeCount) def createOneConfig(configBaseName, GPUcount): - configFullName = configBaseName+str(GPUcount)+".cmd" - with open(configFullName,"w") as f: - f.write('#!/bin/bash\n') + configFullName = configBaseName + str(GPUcount) + ".cmd" + with open(configFullName, "w") as f: + f.write('#!/bin/bash\n') f.write('#SBATCH -t 01:00:00\n') f.write('#SBATCH -N '+str(GPUcount)+'\n') f.write('#SBATCH --ntasks-per-node=4\n') @@ -35,14 +40,15 @@ def createOneConfig(configBaseName, GPUcount): f.write('\n\n') f.write('module load anaconda\n') f.write('source activate PPPL\n') - f.write('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n') - + f.write(('module load cudatoolkit/8.0 cudann/cuda-8.0/5.1 ' + 'openmpi/intel-17.0/1.10.2/64 intel/17.0/64/17.0.2.174\n')) f.write('rm /tigress/alexeys/model_checkpoints/*\n') - f.write('srun python mpi_learn.py\n') + f.write('srun python mpi_learn.py\n') return configFullName -if __name__=='__main__': - gpuNodeCountGrid = [1,3,6,12,24,32,48] + +if __name__ == '__main__': + gpuNodeCountGrid = [1, 3, 6, 12, 24, 32, 48] configBaseName = "FRNN_TigerGPU" - checkAndSchedule(configBaseName,gpuNodeCountGrid,0) + checkAndSchedule(configBaseName, gpuNodeCountGrid, 0) diff --git a/examples/signal_influence.py b/examples/signal_influence.py index fc987177..3fbae01c 100644 --- a/examples/signal_influence.py +++ b/examples/signal_influence.py @@ -1,3 +1,13 @@ +from plasma.models.mpi_runner import ( + mpi_make_predictions + ) +from mpi4py import MPI +from plasma.preprocessor.preprocess import guarantee_preprocessed +from plasma.preprocessor.augment import ByShotAugmentator +from plasma.primitives.shots import ShotList +from plasma.models.loader import Loader +from plasma.conf import conf +from pprint import pprint ''' ######################################################### This file trains a deep learning model to predict @@ -16,10 +26,8 @@ ######################################################### ''' -from __future__ import print_function import os -import sys -import time +import sys import datetime import random import numpy as np @@ -29,39 +37,36 @@ import matplotlib matplotlib.use('Agg') -from pprint import pprint sys.setrecursionlimit(10000) -from plasma.conf import conf -from plasma.models.loader import Loader -from plasma.primitives.shots import ShotList -from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.augment import ByShotAugmentator -from plasma.preprocessor.preprocess import guarantee_preprocessed if conf['model']['shallow']: - print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + print( + "Shallow learning using MPI is not supported yet. ", + "Set conf['model']['shallow'] to False.") exit(1) if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import VarNormalizer as Normalizer elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import ( + AveragingVarNormalizer as Normalizer + ) else: print('unkown normalizer. exiting') exit(1) -from mpi4py import MPI comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS -from plasma.models.mpi_runner import * np.random.seed(task_index) random.seed(task_index) @@ -73,102 +78,132 @@ if only_predict: custom_path = sys.argv[1] shot_num = int(sys.argv[2]) -print("predicting using path {} on shot {}".format(custom_path,shot_num)) +print("predicting using path {} on shot {}".format(custom_path, shot_num)) assert(only_predict) + ##################################################### -####################Normalization#################### +# NORMALIZATION # ##################################################### -if task_index == 0: #make sure preprocessing has been run, and is saved as a file - shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +# TODO(KGF): identical in at least 3x files in examples/ +# make sure preprocessing has been run, and is saved as a file +if task_index == 0: + # TODO(KGF): check tuple unpack + (shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) comm.Barrier() -shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +(shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) -shot_list = sum([l.filter_by_number([shot_num]) for l in [shot_list_train,shot_list_validate,shot_list_test]],ShotList()) +shot_list = sum([l.filter_by_number([shot_num]) + for l in [shot_list_train, shot_list_validate, + shot_list_test]], ShotList()) assert(len(shot_list) == 1) # for s in shot_list.shots: - # s.restore() +# s.restore() + def chunks(l, n): """Yield successive n-sized chunks from l.""" - return[ l[i:i + n] for i in range(0, len(l), n)] + return[l[i:i + n] for i in range(0, len(l), n)] + -def hide_signal_data(shot,t=0,sigs_to_hide=None): +def hide_signal_data(shot, t=0, sigs_to_hide=None): for sig in shot.signals: - if sigs_to_hide is None or (sigs_to_hide is not None and sig in sigs_to_hide): - shot.signals_dict[sig][t:,:] = shot.signals_dict[sig][t,:] + if sigs_to_hide is None or ( + sigs_to_hide is not None and sig in sigs_to_hide): + shot.signals_dict[sig][t:, :] = shot.signals_dict[sig][t, :] -def create_shot_list_tmp(original_shot,time_points,sigs=None): + +def create_shot_list_tmp(original_shot, time_points, sigs=None): shot_list_tmp = ShotList() T = len(original_shot.ttd) - t_range = np.linspace(0,T-1,time_points,dtype=np.int) + t_range = np.linspace(0, T-1, time_points, dtype=np.int) for t in t_range: new_shot = copy.copy(original_shot) - assert(new_shot.augmentation_fn == None) - new_shot.augmentation_fn = partial(hide_signal_data,t = t,sigs_to_hide=sigs) - #new_shot.number = original_shot.number + assert(new_shot.augmentation_fn is None) + new_shot.augmentation_fn = partial( + hide_signal_data, t=t, sigs_to_hide=sigs) + # new_shot.number = original_shot.number shot_list_tmp.append(new_shot) - return shot_list_tmp,t_range - -def get_importance_measure(original_shot,loader,custom_path,metric,time_points=10,sig=None): - shot_list_tmp,t_range = create_shot_list_tmp(original_shot,time_points,sigs) - y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list_tmp,loader,custom_path) + return shot_list_tmp, t_range + + +def get_importance_measure( + original_shot, + loader, + custom_path, + metric, + time_points=10, + sig=None): + shot_list_tmp, t_range = create_shot_list_tmp( + original_shot, time_points, sigs) + y_prime, y_gold, disruptive = mpi_make_predictions( + conf, shot_list_tmp, loader, custom_path) shot_list_tmp.make_light() - return t_range,get_importance_measure_given_y_prime(y_prime,metric),y_prime[-1] + return t_range, get_importance_measure_given_y_prime( + y_prime, metric), y_prime[-1] -def difference_metric(y_prime,y_prime_orig): - idx = np.argmax(y_prime_orig) - return (np.max(y_prime_orig) - y_prime[idx])/(np.max(y_prime_orig) - np.min(y_prime_orig)) -def get_importance_measure_given_y_prime(y_prime,metric): - differences = [metric(y_prime[i],y_prime[-1]) for i in range(len(y_prime))] - return 1.0-np.array(differences)#/np.max(differences) +def difference_metric(y_prime, y_prime_orig): + idx = np.argmax(y_prime_orig) + return (np.max(y_prime_orig) - y_prime[idx]) / \ + (np.max(y_prime_orig) - np.min(y_prime_orig)) +def get_importance_measure_given_y_prime(y_prime, metric): + differences = [metric(y_prime[i], y_prime[-1]) + for i in range(len(y_prime))] + return 1.0-np.array(differences) # /np.max(differences) original_shot = shot_list[0] original_shot.augmentation_fn = None original_shot.restore(conf['paths']['processed_prepath']) -#remove original shot +# remove original shot -print("normalization",end='') +print("normalization", end='') normalizer = Normalizer(conf) normalizer.train() normalizer = ByShotAugmentator(normalizer) -loader = Loader(conf,normalizer) +loader = Loader(conf, normalizer) print("...done") # if not only_predict: # mpi_train(conf,shot_list_train,shot_list_validate,loader) -#load last model for testing +# load last model for testing loader.set_inference_mode(True) use_signals = copy.copy(conf['paths']['use_signals']) use_signals.append(None) importances = dict() y_prime = 0 -use_signals = [[s] for s in use_signals[:-3]] + [use_signals[-3:-1]] + [use_signals[-1]] +use_signals = [ + [s] for s in use_signals[:-3]] + [use_signals[-3:-1]] + [use_signals[-1]] print(use_signals) for sigs in use_signals: - t_range,measure,y_prime = get_importance_measure(original_shot,loader,custom_path,difference_metric,time_points=128,sig=sigs) + t_range, measure, y_prime = get_importance_measure(original_shot, loader, + custom_path, + difference_metric, + time_points=128, + sig=sigs) if sigs is None: idx = None else: idx = tuple(sorted(sigs)) - importances[idx] = (t_range,measure) - + importances[idx] = (t_range, measure) if task_index == 0: - save_str = 'signal_influence_results_{}_'.format(shot_num) + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + save_str = 'signal_influence_results_{}_'.format( + shot_num) + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") result_base_path = conf['paths']['results_prepath'] if not os.path.exists(result_base_path): os.makedirs(result_base_path) - np.savez(result_base_path+save_str, - original_shot=original_shot,importances=importances,y_prime=y_prime,conf = conf) + np.savez(result_base_path + save_str, original_shot=original_shot, + importances=importances, y_prime=y_prime, conf=conf) shot_list.make_light() sys.stdout.flush() diff --git a/examples/simple_augmentation.py b/examples/simple_augmentation.py index 3afd19c9..8be07b85 100644 --- a/examples/simple_augmentation.py +++ b/examples/simple_augmentation.py @@ -1,3 +1,13 @@ +from plasma.models.mpi_runner import ( + mpi_make_predictions_and_evaluate + ) +from mpi4py import MPI +from plasma.preprocessor.preprocess import guarantee_preprocessed +from plasma.preprocessor.augment import ByShotAugmentator +from plasma.primitives.shots import ShotList +from plasma.models.loader import Loader +from plasma.conf import conf +from pprint import pprint ''' ######################################################### This file trains a deep learning model to predict @@ -16,11 +26,7 @@ ######################################################### ''' -from __future__ import print_function -import os -import sys -import time -import datetime +import sys import random import numpy as np import copy @@ -29,39 +35,36 @@ import matplotlib matplotlib.use('Agg') -from pprint import pprint sys.setrecursionlimit(10000) -from plasma.conf import conf -from plasma.models.loader import Loader -from plasma.primitives.shots import ShotList -from plasma.preprocessor.normalize import Normalizer -from plasma.preprocessor.augment import ByShotAugmentator -from plasma.preprocessor.preprocess import guarantee_preprocessed if conf['model']['shallow']: - print("Shallow learning using MPI is not supported yet. set conf['model']['shallow'] to false.") + print( + "Shallow learning using MPI is not supported yet. ", + "Set conf['model']['shallow'] to False.") exit(1) if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer elif conf['data']['normalizer'] == 'meanvar': from plasma.preprocessor.normalize import MeanVarNormalizer as Normalizer elif conf['data']['normalizer'] == 'var': - from plasma.preprocessor.normalize import VarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import VarNormalizer as Normalizer elif conf['data']['normalizer'] == 'averagevar': - from plasma.preprocessor.normalize import AveragingVarNormalizer as Normalizer #performs !much better than minmaxnormalizer + # performs !much better than minmaxnormalizer + from plasma.preprocessor.normalize import ( + AveragingVarNormalizer as Normalizer + ) else: print('unkown normalizer. exiting') exit(1) -from mpi4py import MPI comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS -from plasma.models.mpi_runner import * np.random.seed(task_index) random.seed(task_index) @@ -75,86 +78,115 @@ print("predicting using path {}".format(custom_path)) assert(only_predict) + + ##################################################### -####################Normalization#################### +# NORMALIZATION # ##################################################### -if task_index == 0: #make sure preprocessing has been run, and is saved as a file - shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +# TODO(KGF): identical in at least 3x files in examples/ +# make sure preprocessing has been run, and is saved as a file +if task_index == 0: + # TODO(KGF): check tuple unpack + (shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) comm.Barrier() -shot_list_train,shot_list_validate,shot_list_test = guarantee_preprocessed(conf) +(shot_list_train, shot_list_validate, + shot_list_test) = guarantee_preprocessed(conf) def chunks(l, n): """Yield successive n-sized chunks from l.""" - return[ l[i:i + n] for i in range(0, len(l), n)] + return[l[i:i + n] for i in range(0, len(l), n)] + -def hide_signal_data(shot,t=0,sigs_to_hide=None): +def hide_signal_data(shot, t=0, sigs_to_hide=None): for sig in shot.signals: - if sigs_to_hide is None or (sigs_to_hide is not None and sig in sigs_to_hide): - shot.signals_dict[sig][t:,:] = shot.signals_dict[sig][t,:] + if sigs_to_hide is None or ( + sigs_to_hide is not None and sig in sigs_to_hide): + shot.signals_dict[sig][t:, :] = shot.signals_dict[sig][t, :] -def create_shot_list_tmp(original_shot,time_points,sigs=None): + +def create_shot_list_tmp(original_shot, time_points, sigs=None): shot_list_tmp = ShotList() T = len(original_shot.ttd) - t_range = np.linspace(0,T-1,time_points,dtype=np.int) + t_range = np.linspace(0, T-1, time_points, dtype=np.int) for t in t_range: new_shot = copy.copy(original_shot) - assert(new_shot.augmentation_fn == None) - new_shot.augmentation_fn = partial(hide_signal_data,t = t,sigs_to_hide=sigs) + assert(new_shot.augmentation_fn is None) + new_shot.augmentation_fn = partial( + hide_signal_data, t=t, sigs_to_hide=sigs) #new_shot.number = original_shot.number shot_list_tmp.append(new_shot) - return shot_list_tmp,t_range - -def get_importance_measure(original_shot,loader,custom_path,metric,time_points=10,sig=None): - shot_list_tmp,t_range = create_shot_list_tmp(original_shot,time_points,sigs) - y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list_tmp,loader,custom_path) + return shot_list_tmp, t_range + + +def get_importance_measure( + original_shot, + loader, + custom_path, + metric, + time_points=10, + sig=None): + shot_list_tmp, t_range = create_shot_list_tmp( + original_shot, time_points, sigs) + y_prime, y_gold, disruptive = mpi_make_predictions( + conf, shot_list_tmp, loader, custom_path) shot_list_tmp.make_light() - return t_range,get_importance_measure_given_y_prime(y_prime,metric),y_prime[-1] + return t_range, get_importance_measure_given_y_prime( + y_prime, metric), y_prime[-1] + -def difference_metric(y_prime,y_prime_orig): - idx = np.argmax(y_prime_orig) - return (np.max(y_prime_orig) - y_prime[idx])/(np.max(y_prime_orig) - np.min(y_prime_orig)) +def difference_metric(y_prime, y_prime_orig): + idx = np.argmax(y_prime_orig) + return (np.max(y_prime_orig) - y_prime[idx]) / \ + (np.max(y_prime_orig) - np.min(y_prime_orig)) -def get_importance_measure_given_y_prime(y_prime,metric): - differences = [metric(y_prime[i],y_prime[-1]) for i in range(len(y_prime))] - return 1.0-np.array(differences)#/np.max(differences) +def get_importance_measure_given_y_prime(y_prime, metric): + differences = [metric(y_prime[i], y_prime[-1]) + for i in range(len(y_prime))] + return 1.0-np.array(differences) # /np.max(differences) -print("normalization",end='') + +print("normalization", end='') normalizer = Normalizer(conf) normalizer.train() normalizer = ByShotAugmentator(normalizer) -loader = Loader(conf,normalizer) +loader = Loader(conf, normalizer) print("...done") # if not only_predict: # mpi_train(conf,shot_list_train,shot_list_validate,loader) -#load last model for testing +# load last model for testing loader.set_inference_mode(True) use_signals = copy.copy(conf['paths']['use_signals']) use_signals.append(None) - for shot in shot_list_test: - shot.augmentation_fn = None# partial(hide_signal_data,t = 0,sigs_to_hide = sigs_to_hide) + # partial(hide_signal_data,t = 0,sigs_to_hide = sigs_to_hide) + shot.augmentation_fn = None print("All signals:") -y_prime,y_gold,disruptive,roc,loss = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) +y_prime, y_gold, disruptive, roc, loss = mpi_make_predictions_and_evaluate( + conf, shot_list_test, loader, custom_path) print(roc) print(loss) -#for sigs_to_hide in [[s] for s in use_signals[:-3]] + [use_signals[-3:-1]] + [use_signals[-1]]: -for sigs_to_hide in [[s] for s in use_signals[:-3]] + [[s] for s in use_signals[-3:-1]] + [use_signals[-3:-1]]:# + [use_signals[-1]]: +# for sigs_to_hide in [[s] for s in use_signals[:-3]] + +# [use_signals[-3:-1]] + [use_signals[-1]]: +for sigs_to_hide in [[s] for s in use_signals[:-3]] + [[s] + for s in use_signals[-3:-1]] + [use_signals[-3:-1]]: # + [use_signals[-1]]: for shot in shot_list_test: - shot.augmentation_fn = partial(hide_signal_data,t = 0,sigs_to_hide = sigs_to_hide) + shot.augmentation_fn = partial( + hide_signal_data, t=0, sigs_to_hide=sigs_to_hide) print("Hiding: {}".format(sigs_to_hide)) - y_prime,y_gold,disruptive,roc,loss = mpi_make_predictions_and_evaluate(conf,shot_list_test,loader,custom_path) + y_prime, y_gold, disruptive, roc, loss = mpi_make_predictions_and_evaluate( + conf, shot_list_test, loader, custom_path) print(roc) print(loss) - if task_index == 0: print('finished.') diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index d13f8213..facc2214 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -1,7 +1,10 @@ -from plasma.utils.batch_jobs import get_executable_name,generate_working_dirname,start_slurm_job,copy_files_to_environment -from pprint import pprint +from plasma.utils.batch_jobs import ( + get_executable_name, generate_working_dirname, + start_slurm_job, copy_files_to_environment + ) import yaml -import sys,os,getpass +import os +import getpass import plasma.conf # tunables = [] @@ -10,49 +13,62 @@ num_trials = 1 -run_directory = "{}/{}/batch_jobs/".format(plasma.conf.conf['fs_path'],getpass.getuser()) -template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) +run_directory = "{}/{}/batch_jobs/".format( + plasma.conf.conf['fs_path'], getpass.getuser()) +# "/home/{}/plasma-python/examples/".format(getpass.getuser()) +template_path = os.environ['PWD'] conf_name = "conf.yaml" -def copy_conf_file(shallow,template_path = "../",save_path = "./",conf_name="conf.yaml"): + +def copy_conf_file( + shallow, + template_path="../", + save_path="./", + conf_name="conf.yaml"): assert(template_path != save_path) - pathsrc = os.path.join(template_path,conf_name) - pathdst = os.path.join(save_path,conf_name) + pathsrc = os.path.join(template_path, conf_name) + pathdst = os.path.join(save_path, conf_name) with open(pathsrc, 'r') as yaml_file: conf = yaml.load(yaml_file) - conf['training']['hyperparam_tuning'] = True #make sure all files like checkpoints and normalization are done locally + # make sure all files like checkpoints and normalization are done locally + conf['training']['hyperparam_tuning'] = True with open(pathdst, 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) -def get_conf(template_path,conf_name): - with open(os.path.join(template_path,conf_name), 'r') as yaml_file: + +def get_conf(template_path, conf_name): + with open(os.path.join(template_path, conf_name), 'r') as yaml_file: conf = yaml.load(yaml_file) return conf -conf = get_conf(template_path,conf_name) + +conf = get_conf(template_path, conf_name) shallow = conf['model']['shallow'] if shallow: num_nodes = 1 working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -#copy conf and executable into directory -executable_name,_ = get_executable_name(conf) -os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) -os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) +# copy conf and executable into directory +executable_name, _ = get_executable_name(conf) +os.system(" ".join(["cp -p", os.path.join(template_path, conf_name), + working_directory])) +os.system(" ".join(["cp -p", os.path.join(template_path, executable_name), + working_directory])) os.chdir(working_directory) print("Going into {}".format(working_directory)) for i in range(num_trials): - subdir = working_directory + "/{}/".format(i) + subdir = working_directory + "/{}/".format(i) os.makedirs(subdir) copy_files_to_environment(subdir) print("Making modified conf") - copy_conf_file(shallow,working_directory,subdir,conf_name) + copy_conf_file(shallow, working_directory, subdir, conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name'],conf['env']['type']) + start_slurm_job(subdir, num_nodes, i, conf, + shallow, conf['env']['name'], conf['env']['type']) print("submitted {} jobs.".format(num_trials)) diff --git a/examples/test.py b/examples/test.py index 544ac257..3a3cfd22 100644 --- a/examples/test.py +++ b/examples/test.py @@ -1,65 +1,64 @@ -import keras -from keras.models import Sequential, Model +# import keras +from keras.models import Model # , Sequential from keras.layers import Input -from keras.layers.core import Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute -from keras.layers.recurrent import LSTM, SimpleRNN -from keras.layers.convolutional import Convolution1D -from keras.layers.pooling import MaxPooling1D -from keras.utils.data_utils import get_file -from keras.layers.wrappers import TimeDistributed -from keras.layers.merge import Concatenate -from keras.callbacks import Callback -from keras.optimizers import * -from keras.regularizers import l1,l2,l1_l2 +from keras.layers.core import Lambda, Reshape, Permute +# Dense, Activation, Dropout, Flatten +# from keras.layers.recurrent import LSTM, SimpleRNN +# from keras.layers.convolutional import Convolution1D +# from keras.layers.pooling import MaxPooling1D +# from keras.utils.data_utils import get_file +# from keras.layers.wrappers import TimeDistributed +# from keras.layers.merge import Concatenate +# from keras.callbacks import Callback +# from keras.optimizers import * +# from keras.regularizers import l1, l2, l1_l2 - -import keras.backend as K - -import dill -import re -import os,sys import numpy as np -from copy import deepcopy x = np.array(range(8)) num_signals = len(x) x = np.atleast_2d(x) -x = np.reshape(x,(1,num_signals)) +x = np.reshape(x, (1, num_signals)) print(x.shape) print(x) -indices_0d = np.array([0,1]) -indices_1d = np.array([2,3,4,5,6,7]) +indices_0d = np.array([0, 1]) +indices_1d = np.array([2, 3, 4, 5, 6, 7]) num_1D = 2 pre_rnn_input = Input(shape=(num_signals,)) -pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) -pre_rnn_0D = Lambda(lambda x: x[:,:len(indices_0d)],output_shape=(len(indices_0d),))(pre_rnn_input)# slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) -pre_rnn_1D = Reshape((num_1D,len(indices_1d)/num_1D)) (pre_rnn_1D) -pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) - +pre_rnn_1D = Lambda(lambda x: x[:, len(indices_0d):], output_shape=( + len(indices_1d),))(pre_rnn_input) +pre_rnn_0D = Lambda(lambda x: x[:, :len(indices_0d)], + output_shape=(len(indices_0d),))(pre_rnn_input) +# slicer(x, indices_0d), +# lambda s: slicer_output_shape(s, indices_0d))(pre_rnn_input) +pre_rnn_1D = Reshape((num_1D, len(indices_1d)/num_1D))(pre_rnn_1D) +pre_rnn_1D = Permute((2, 1))(pre_rnn_1D) + # for i in range(model_conf['num_conv_layers']): -# pre_rnn_1D = Convolution1D(num_conv_filters,size_conv_filters,padding='valid',activation='relu') (pre_rnn_1D) +# pre_rnn_1D = Convolution1D(num_conv_filters, size_conv_filters, +# padding='valid',activation='relu') (pre_rnn_1D) # pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) # pre_rnn_1D = Flatten() (pre_rnn_1D) # pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) -model = Model(inputs = pre_rnn_input,outputs=pre_rnn_1D) +model = Model(inputs=pre_rnn_input, outputs=pre_rnn_1D) # x_input = Input(batch_shape = batch_input_shape) # x_in = TimeDistributed(pre_rnn_model) (x_input) # if return_sequences: - #x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) - # x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) +# x_out = TimeDistributed(Dense(100, activation='tanh')) (x_in) +# x_out = TimeDistributed(Dense(1, activation=output_activation)) (x_in) # else: - # x_out = Dense(1,activation=output_activation) (x_in) -model.compile(loss='mse',optimizer='sgd') +# x_out = Dense(1, activation=output_activation) (x_in) +model.compile(loss='mse', optimizer='sgd') y = model.predict(x) print(model.layers) print(x) print(y) print(y.shape) -print(y[0,:,0]) -#bug with tensorflow/Keras \ No newline at end of file +print(y[0, :, 0]) +# bug with tensorflow/Keras --- ????? diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 56b8eb69..6d8f5d8f 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -1,8 +1,14 @@ -from plasma.primitives.hyperparameters import CategoricalHyperparam,ContinuousHyperparam,LogContinuousHyperparam,IntegerHyperparam -from plasma.utils.batch_jobs import create_slurm_script,create_slurm_header,start_slurm_job,generate_working_dirname,copy_files_to_environment -from pprint import pprint +from plasma.primitives.hyperparameters import ( + CategoricalHyperparam, ContinuousHyperparam, + LogContinuousHyperparam, IntegerHyperparam + ) +from plasma.utils.batch_jobs import ( + # create_slurm_script, create_slurm_header, + start_slurm_job, generate_working_dirname, copy_files_to_environment + ) import yaml -import sys,os,getpass +import os +import getpass import plasma.conf tunables = [] @@ -10,61 +16,107 @@ num_nodes = 1 num_trials = 20 -t_warn = CategoricalHyperparam(['data','T_warning'],[0.256,1.024,10.024]) -cut_ends = CategoricalHyperparam(['data','cut_shot_ends'],[False,True]) -#for shallow +t_warn = CategoricalHyperparam(['data', 'T_warning'], [0.256, 1.024, 10.024]) +cut_ends = CategoricalHyperparam(['data', 'cut_shot_ends'], [False, True]) +# for shallow if shallow: num_nodes = 1 - shallow_model = CategoricalHyperparam(['model','shallow_model','type'],["svm","random_forest","xgboost","mlp"]) - n_estimators = CategoricalHyperparam(['model','shallow_model','n_estimators'],[5,20,50,100,300,1000]) - max_depth = CategoricalHyperparam(['model','shallow_model','max_depth'],[None,3,6,10,30,100]) - C = LogContinuousHyperparam(['model','shallow_model','C'],1e-3,1e3) - kernel = CategoricalHyperparam(['model','shallow_model','kernel'],["rbf","sigmoid","linear","poly"]) - xg_learning_rate = ContinuousHyperparam(['model','shallow_model','learning_rate'],0,1) - scale_pos_weight = CategoricalHyperparam(['model','shallow_model','scale_pos_weight'],[1,10.0,100.0]) - num_samples = CategoricalHyperparam(['model','shallow_model','num_samples'],[30000,100000,1000000,2000000]) - hidden_size = CategoricalHyperparam(['model','shallow_model','final_hidden_layer_size'],[5,10,20]) - hidden_num = CategoricalHyperparam(['model','shallow_model','num_hidden_layers'],[2,4]) - mlp_learning_rate = CategoricalHyperparam(['model','shallow_model','learning_rate_mlp'],[0.001,0.0001,0.00001]) - mlp_regularization = CategoricalHyperparam(['model','shallow_model','mlp_regularization'],[0.1,0.003,0.0001]) - tunables = [shallow_model,n_estimators,max_depth,C,kernel,xg_learning_rate,scale_pos_weight,num_samples,hidden_num,hidden_size,mlp_learning_rate,mlp_regularization] #target + shallow_model = CategoricalHyperparam( + ['model', 'shallow_model', 'type'], + ["svm", "random_forest", "xgboost", "mlp"]) + n_estimators = CategoricalHyperparam( + ['model', 'shallow_model', 'n_estimators'], + [5, 20, 50, 100, 300, 1000]) + max_depth = CategoricalHyperparam( + ['model', 'shallow_model', 'max_depth'], + [None, 3, 6, 10, 30, 100]) + C = LogContinuousHyperparam(['model', 'shallow_model', 'C'], 1e-3, 1e3) + kernel = CategoricalHyperparam(['model', 'shallow_model', 'kernel'], [ + "rbf", "sigmoid", "linear", "poly"]) + xg_learning_rate = ContinuousHyperparam( + ['model', 'shallow_model', 'learning_rate'], 0, 1) + scale_pos_weight = CategoricalHyperparam( + ['model', 'shallow_model', 'scale_pos_weight'], [1, 10.0, 100.0]) + num_samples = CategoricalHyperparam( + ['model', 'shallow_model', 'num_samples'], + [30000, 100000, 1000000, 2000000]) + hidden_size = CategoricalHyperparam( + ['model', 'shallow_model', 'final_hidden_layer_size'], [5, 10, 20]) + hidden_num = CategoricalHyperparam( + ['model', 'shallow_model', 'num_hidden_layers'], [2, 4]) + mlp_learning_rate = CategoricalHyperparam( + ['model', 'shallow_model', 'learning_rate_mlp'], + [0.001, 0.0001, 0.00001]) + mlp_regularization = CategoricalHyperparam( + ['model', 'shallow_model', 'mlp_regularization'], [0.1, 0.003, 0.0001]) + tunables = [ + shallow_model, + n_estimators, + max_depth, + C, + kernel, + xg_learning_rate, + scale_pos_weight, + num_samples, + hidden_num, + hidden_size, + mlp_learning_rate, + mlp_regularization] # target else: - #for DL - lr = LogContinuousHyperparam(['model','lr'],1e-7,1e-4) - lr_decay = CategoricalHyperparam(['model','lr_decay'],[0.97,0.985,1.0]) - fac = CategoricalHyperparam(['data','positive_example_penalty'],[1.0,4.0,16.0]) - target = CategoricalHyperparam(['target'],['maxhinge','hinge','ttdinv','ttd']) - #target = CategoricalHyperparam(['target'],['hinge','ttdinv','ttd']) - batch_size = CategoricalHyperparam(['training','batch_size'],[128,256]) - dropout_prob = CategoricalHyperparam(['model','dropout_prob'],[0.01,0.05,0.1]) - conv_filters = CategoricalHyperparam(['model','num_conv_filters'],[128,256]) - conv_layers = IntegerHyperparam(['model','num_conv_layers'],2,4) - rnn_layers = IntegerHyperparam(['model','rnn_layers'],1,3) - rnn_size = CategoricalHyperparam(['model','rnn_size'],[128,256]) - dense_size = CategoricalHyperparam(['model','dense_size'],[128,256]) - extra_dense_input = CategoricalHyperparam(['model','extra_dense_input'],[False,True]) - equalize_classes = CategoricalHyperparam(['data','equalize_classes'],[False,True]) - #rnn_length = CategoricalHyperparam(['model','length'],[32,128]) - #tunables = [lr,lr_decay,fac,target,batch_size,dropout_prob] - tunables = [lr,lr_decay,fac,target,batch_size,equalize_classes,dropout_prob] - tunables += [conv_filters,conv_layers,rnn_layers,rnn_size,dense_size,extra_dense_input] -tunables += [cut_ends,t_warn] + # for DL + lr = LogContinuousHyperparam(['model', 'lr'], 1e-7, 1e-4) + lr_decay = CategoricalHyperparam(['model', 'lr_decay'], [0.97, 0.985, 1.0]) + fac = CategoricalHyperparam( + ['data', 'positive_example_penalty'], [1.0, 4.0, 16.0]) + target = CategoricalHyperparam( + ['target'], ['maxhinge', 'hinge', 'ttdinv', 'ttd']) + # target = CategoricalHyperparam(['target'],['hinge','ttdinv','ttd']) + batch_size = CategoricalHyperparam(['training', 'batch_size'], [128, 256]) + dropout_prob = CategoricalHyperparam( + ['model', 'dropout_prob'], [0.01, 0.05, 0.1]) + conv_filters = CategoricalHyperparam( + ['model', 'num_conv_filters'], [128, 256]) + conv_layers = IntegerHyperparam(['model', 'num_conv_layers'], 2, 4) + rnn_layers = IntegerHyperparam(['model', 'rnn_layers'], 1, 3) + rnn_size = CategoricalHyperparam(['model', 'rnn_size'], [128, 256]) + dense_size = CategoricalHyperparam(['model', 'dense_size'], [128, 256]) + extra_dense_input = CategoricalHyperparam( + ['model', 'extra_dense_input'], [False, True]) + equalize_classes = CategoricalHyperparam( + ['data', 'equalize_classes'], [False, True]) + # rnn_length = CategoricalHyperparam(['model', 'length'], [32, 128]) + # tunables = [lr, lr_decay, fac, target, batch_size, dropout_prob] + tunables = [lr, lr_decay, fac, target, batch_size, equalize_classes, + dropout_prob] + tunables += [conv_filters, conv_layers, rnn_layers, + rnn_size, dense_size, extra_dense_input] +tunables += [cut_ends, t_warn] -run_directory = "{}/{}/hyperparams/".format(plasma.conf.conf['fs_path'],getpass.getuser()) -template_path = os.environ['PWD'] #"/home/{}/plasma-python/examples/".format(getpass.getuser()) +run_directory = "{}/{}/hyperparams/".format( + plasma.conf.conf['fs_path'], getpass.getuser()) +# "/home/{}/plasma-python/examples/".format(getpass.getuser()) +template_path = os.environ['PWD'] conf_name = "conf.yaml" -def generate_conf_file(tunables,shallow,template_path = "../",save_path = "./",conf_name="conf.yaml"): + +def generate_conf_file( + tunables, + shallow, + template_path="../", + save_path="./", + conf_name="conf.yaml"): assert(template_path != save_path) - with open(os.path.join(template_path,conf_name), 'r') as yaml_file: + with open(os.path.join(template_path, conf_name), 'r') as yaml_file: conf = yaml.load(yaml_file) for tunable in tunables: - tunable.assign_to_conf(conf,save_path) - conf['training']['num_epochs'] = 1000 #rely on early stopping to terminate training - conf['training']['hyperparam_tuning'] = True #rely on early stopping to terminate training + tunable.assign_to_conf(conf, save_path) + # rely on early stopping to terminate training + conf['training']['num_epochs'] = 1000 + # rely on early stopping to terminate training + conf['training']['hyperparam_tuning'] = True conf['model']['shallow'] = shallow - with open(os.path.join(save_path,conf_name), 'w') as outfile: + with open(os.path.join(save_path, conf_name), 'w') as outfile: yaml.dump(conf, outfile, default_flow_style=False) return conf @@ -77,27 +129,30 @@ def get_executable_name_imposed_shallow(shallow): else: executable_name = conf['paths']['executable'] use_mpi = True - return executable_name,use_mpi - + return executable_name, use_mpi working_directory = generate_working_dirname(run_directory) os.makedirs(working_directory) -executable_name,_ = get_executable_name_imposed_shallow(shallow) -os.system(" ".join(["cp -p",os.path.join(template_path,conf_name),working_directory])) -os.system(" ".join(["cp -p",os.path.join(template_path,executable_name),working_directory])) +executable_name, _ = get_executable_name_imposed_shallow(shallow) +os.system(" ".join(["cp -p", os.path.join(template_path, conf_name), + working_directory])) +os.system(" ".join(["cp -p", os.path.join(template_path, executable_name), + working_directory])) os.chdir(working_directory) print("Going into {}".format(working_directory)) for i in range(num_trials): - subdir = working_directory + "/{}/".format(i) + subdir = working_directory + "/{}/".format(i) os.makedirs(subdir) copy_files_to_environment(subdir) print("Making modified conf") - conf = generate_conf_file(tunables,shallow,working_directory,subdir,conf_name) + conf = generate_conf_file(tunables, shallow, working_directory, + subdir, conf_name) print("Starting job") - start_slurm_job(subdir,num_nodes,i,conf,shallow,conf['env']['name'],conf['env']['type']) + start_slurm_job(subdir, num_nodes, i, conf, shallow, + conf['env']['name'], conf['env']['type']) print("submitted {} jobs.".format(num_trials)) From 33681eb2d5464c680f339c0bed58d42fb9c91db1 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 11:30:33 -0500 Subject: [PATCH 558/744] Clean up files in data/ --- data/d3d_signals.py | 108 +++---- data/gadata.py | 172 ++++++----- data/get_mdsplus_data.py | 15 +- data/jet_signals.py | 238 +++++++------- data/signals.py | 652 ++++++++++++++++++++++++--------------- plasma/conf.py | 11 +- plasma/version.py | 4 +- 7 files changed, 693 insertions(+), 507 deletions(-) diff --git a/data/d3d_signals.py b/data/d3d_signals.py index 1ae4b1a7..2845b570 100644 --- a/data/d3d_signals.py +++ b/data/d3d_signals.py @@ -1,59 +1,59 @@ -#JET signal hierarchy -#------------------------------------------------------------------------# -#User only needs to look at 1st and last sections +# D3D signal hierarchy +# ------------------------------------------------------------------------ +# User only needs to look at 1st and last sections # - conf.py only needs to import signals_dirs and signals_masks # - get_mdsplus_data.py only needs signals_dirs and download_masks # - performance_analysis_utils.py needs : # - signals_dirs, plot_masks, ppf_labels, jpf_labels -#------------------------------------------------------------------------# +# ------------------------------------------------------------------------ ################ # Signal names # ################ -#This section contains all the exact JET signal strings and their -#groupings by type and dimensionality. -#User should not touch this. Use for reference +# This section contains all the exact D3D signal strings and their +# groupings by type and dimensionality. +# User should not touch this. Use for reference -### 0D signals ### +# 0D signals # signal_paths = [ -'efsli', #Internal Inductance -'ipsip', #Plasma Current -'efsbetan', #Normalized Beta -'efswmhd', #Stored Energy -'nssampn1l', #Tearing Mode Amplitude (rotating 2/1) -'nssfrqn1l', #Tearing Mode Frequency (rotating 2/1) -'nssampn2l', #Tearing Mode Amplitude (rotating 3/2) -'nssfrqn2l', #Tearing Mode Frequency (rotating 3/2) -'dusbradial', #LM Amplitude -'dssdenest', #Plasma Density -r'\bol_l15_p', #Radiated Power core -r'\bol_l03_p', #Radiated Power Edge -'bmspinj', #Total Beam Power -'bmstinj',] #Total Beam Torque -#'pcechpwrf'] #Total ECH Power Not always on! + 'efsli', # Internal Inductance + 'ipsip', # Plasma Current + 'efsbetan', # Normalized Beta + 'efswmhd', # Stored Energy + 'nssampn1l', # Tearing Mode Amplitude (rotating 2/1) + 'nssfrqn1l', # Tearing Mode Frequency (rotating 2/1) + 'nssampn2l', # Tearing Mode Amplitude (rotating 3/2) + 'nssfrqn2l', # Tearing Mode Frequency (rotating 3/2) + 'dusbradial', # LM Amplitude + 'dssdenest', # Plasma Density + r'\bol_l15_p', # Radiated Power core + r'\bol_l03_p', # Radiated Power Edge + 'bmspinj', # Total Beam Power + 'bmstinj', ] # Total Beam Torque +# 'pcechpwrf'] #Total ECH Power Not always on! signal_paths = ['d3d/' + path for path in signal_paths] -### 0D EFIT signals ### +# 0D EFIT signals signal_paths += ['EFIT01/RESULTS.AEQDSK.Q95'] - -### 1D EFIT signals ### -#signal_paths += [ -#'AOT/EQU.t_e', #electron temperature profile vs rho (uniform mapping over time) -#'AOT/EQU.dens_e'] #electron density profile vs rho (uniform mapping over time) -#these signals seem to give more reliable data +# 1D EFIT signals +# signal_paths += [ +# 'AOT/EQU.t_e', # electron temperature profile vs rho +# 'AOT/EQU.dens_e'] # electron density profile vs rho + +# these signals seem to give more reliable data signal_paths += [ -'ZIPFIT01/PROFILES.ETEMPFIT', #electron temperature profile vs rho (uniform mapping over time) -'ZIPFIT01/PROFILES.EDENSFIT'] #electron density profile vs rho (uniform mapping over time) + 'ZIPFIT01/PROFILES.ETEMPFIT', # electron temperature profile vs rho + 'ZIPFIT01/PROFILES.EDENSFIT'] # electron density profile vs rho -#make into list of lists format to be consistent with jet_signals.py +# make into list of lists format to be consistent with jet_signals.py signal_paths = [[path] for path in signal_paths] -#format : 'tree/signal_path' for each path +# format : 'tree/signal_path' for each path signals_dirs = signal_paths - + ################################################## # USER SELECTIONS # ################################################## @@ -63,37 +63,39 @@ # Select signals for downloading # ################################## -#Default pass to get_mdsplus_data.py: download all above signals +# Default pass to get_mdsplus_data.py: download all above signals download_masks = [[True]*len(sig_list) for sig_list in signals_dirs] -# download_masks[-1] = [False] # enable/disable temperature profile -# download_masks[-2] = [False] # enable/disable density profile +# download_masks[-1] = [False] # enable/disable temperature profile +# download_masks[-2] = [False] # enable/disable density profile ####################################### # Select signals for training/testing # ####################################### -#Default pass to conf.py: train with all above signals +# Default pass to conf.py: train with all above signals signals_masks = [[True]*len(sig_list) for sig_list in signals_dirs] -signals_masks[-1] = [False] # enable/disable temperature profile -signals_masks[-2] = [False] # enable/disable density profile +signals_masks[-1] = [False] # enable/disable temperature profile +signals_masks[-2] = [False] # enable/disable density profile + +# num_signals = sum([group.count(True) for i, group in +# enumerate(jet_signals.signals_masks)] -#num_signals = sum([group.count(True) for i,group in enumerate(jet_signals.signals_masks)] ########################################### # Select signals for performance analysis # ########################################### -#User selects these by signal name +# User selects these by signal name plot_masks = [[True]*len(sig_list) for sig_list in signals_dirs] -#LaTeX strings for performance analysis, sorted in lists by signal_group +# LaTeX strings for performance analysis, sorted in lists by signal_group group_labels = [[r' $I_{plasma}$ [A]'], - [r' Mode L. A. [A]'], - [r' $P_{radiated}$ [W]'], #0d radiation, db/ - [r' $P_{radiated}$ [W]'],#1d radiation, db/ - [r' $\rho_{plasma}$ [m^-2]'], - [r' $L_{plasma,internal}$'], - [r'$\frac{d}{dt} E_{D}$ [W]'], - [r' $P_{input}$ [W]'], - [r'$E_{D}$'], -#ppf signal labels + [r' Mode L. A. [A]'], + [r' $P_{radiated}$ [W]'], # 0d radiation, db/ + [r' $P_{radiated}$ [W]'], # 1d radiation, db/ + [r' $\rho_{plasma}$ [m^-2]'], + [r' $L_{plasma,internal}$'], + [r'$\frac{d}{dt} E_{D}$ [W]'], + [r' $P_{input}$ [W]'], + [r'$E_{D}$'], + # ppf signal labels [r'ECE unit?']] diff --git a/data/gadata.py b/data/gadata.py index 9494e87c..1906ea58 100644 --- a/data/gadata.py +++ b/data/gadata.py @@ -1,94 +1,108 @@ -import MDSplus +import MDSplus import numpy -import time -import sys +# import time + class gadata: - """GA Data Obj""" - def __init__(self,signal,shot,tree=None,connection=None,nomds=False): + """GA Data Obj""" + + def __init__(self, signal, shot, tree=None, connection=None, nomds=False): - # Save object values - self.signal = signal - self.shot = shot - self.zdata = -1 - self.xdata = -1 - self.ydata = -1 - self.zunits = '' - self.xunits = '' - self.yunits = '' - self.rank = -1 - self.connection = connection - + # Save object values + self.signal = signal + self.shot = shot + self.zdata = -1 + self.xdata = -1 + self.ydata = -1 + self.zunits = '' + self.xunits = '' + self.yunits = '' + self.rank = -1 + self.connection = connection - ## Retrieve Data - t0 = time.time() - self.found = False + # Retrieve Data + # t0 = time.time() + self.found = False - # Create the MDSplus connection (thin) if not passed in - if self.connection is None: - self.connection = MDSplus.Connection('atlas.gat.com') + # Create the MDSplus connection (thin) if not passed in + if self.connection is None: + self.connection = MDSplus.Connection('atlas.gat.com') - # Retrieve data from MDSplus (thin) - if nomds == False: - #first try, retrieve directly from tree and tag - try: - #print 'trying direct using tree and tag' - if tree != None: - tag = self.signal - fstree = tree - else: - tag = self.connection.get('findsig("'+self.signal+'",_fstree)').value - fstree = self.connection.get('_fstree').value + # Retrieve data from MDSplus (thin) + if not nomds: + # first try, retrieve directly from tree and tag + try: + # print('trying direct using tree and tag') + if tree is not None: + tag = self.signal + fstree = tree + else: + tag = self.connection.get( + 'findsig("' + self.signal + '",_fstree)').value + fstree = self.connection.get('_fstree').value - self.connection.openTree(fstree,shot) - self.zdata = self.connection.get('_s = '+tag).data() - self.zunits = self.connection.get('units_of(_s)').data() - self.rank = numpy.ndim(self.zdata) - if self.rank > 1: - self.xdata = self.connection.get('dim_of(_s,1)').data() - self.xunits = self.connection.get('units_of(dim_of(_s,1))').data() - if self.xunits == '' or self.xunits == ' ': - self.xunits = self.connection.get('units(dim_of(_s,1))').data() + self.connection.openTree(fstree, shot) + self.zdata = self.connection.get('_s = ' + tag).data() + self.zunits = self.connection.get('units_of(_s)').data() + self.rank = numpy.ndim(self.zdata) + if self.rank > 1: + self.xdata = self.connection.get('dim_of(_s,1)').data() + self.xunits = self.connection.get( + 'units_of(dim_of(_s,1))').data() + if self.xunits == '' or self.xunits == ' ': + self.xunits = self.connection.get( + 'units(dim_of(_s,1))').data() - self.ydata = self.connection.get('dim_of(_s)').data() - self.yunits = self.connection.get('units_of(dim_of(_s))').data() - if self.yunits == '' or self.yunits == ' ': - self.yunits = self.connection.get('units(dim_of(_s))').data() - else: - self.xdata = self.connection.get('dim_of(_s)').data() - self.xunits = self.connection.get('units_of(dim_of(_s))').data() - if self.xunits == '' or self.xunits == ' ': - self.xunits = self.connection.get('units(dim_of(_s))').data() - #print 'zdata: ' + str(self.zdata) - self.found = True + self.ydata = self.connection.get('dim_of(_s)').data() + self.yunits = self.connection.get( + 'units_of(dim_of(_s))').data() + if self.yunits == '' or self.yunits == ' ': + self.yunits = self.connection.get( + 'units(dim_of(_s))').data() + else: + self.xdata = self.connection.get('dim_of(_s)').data() + self.xunits = self.connection.get( + 'units_of(dim_of(_s))').data() + if self.xunits == '' or self.xunits == ' ': + self.xunits = self.connection.get( + 'units(dim_of(_s))').data() + # print('zdata: ' + str(self.zdata)) + self.found = True - # MDSplus seems to return 2-D arrays transposed. Change them back. - if numpy.ndim(self.zdata) == 2: self.zdata = numpy.transpose(self.zdata) - if numpy.ndim(self.ydata) == 2: self.ydata = numpy.transpose(self.ydata) - if numpy.ndim(self.xdata) == 2: self.xdata = numpy.transpose(self.xdata) + # MDSplus seems to return 2-D arrays transposed. Change them + # back. + if numpy.ndim(self.zdata) == 2: + self.zdata = numpy.transpose(self.zdata) + if numpy.ndim(self.ydata) == 2: + self.ydata = numpy.transpose(self.ydata) + if numpy.ndim(self.xdata) == 2: + self.xdata = numpy.transpose(self.xdata) - except Exception as e: - pass + except Exception as e: + print(e) + pass - # Retrieve data from PTDATA if node not found - if not self.found: - #print 'Trying ptdata: %s' % (signal,) - self.zdata = self.connection.get('_s = ptdata2("'+signal+'",'+str(shot)+')') - if len(self.zdata) != 1: - self.xdata = self.connection.get('dim_of(_s)') - self.rank = 1 - self.found = True + # Retrieve data from PTDATA if node not found + if not self.found: + # print('Trying ptdata: %s' % (signal,)) + self.zdata = self.connection.get( + '_s = ptdata2("' + signal+'",' + str(shot)+')') + if len(self.zdata) != 1: + self.xdata = self.connection.get('dim_of(_s)') + self.rank = 1 + self.found = True - # Retrieve data from Pseudo-pointname if not in ptdata - if not self.found: - #print ' Signal not in PTDATA: %s' % (signal,) - self.zdata = self.connection.get('_s = pseudo("'+signal+'",'+str(shot)+')') - if len(self.zdata) != 1: - self.xdata = self.connection.get('dim_of(_s)') - self.rank = 1 - self.found = True + # Retrieve data from Pseudo-pointname if not in ptdata + if not self.found: + # print(' Signal not in PTDATA: %s' % (signal,)) + self.zdata = self.connection.get( + '_s = pseudo("' + signal+'",' + str(shot)+')') + if len(self.zdata) != 1: + self.xdata = self.connection.get('dim_of(_s)') + self.rank = 1 + self.found = True - if not self.found: #this means the signal wasn't found - pass + if not self.found: # this means the signal wasn't found + pass - return + return diff --git a/data/get_mdsplus_data.py b/data/get_mdsplus_data.py index 077b0c85..81f14c53 100644 --- a/data/get_mdsplus_data.py +++ b/data/get_mdsplus_data.py @@ -1,19 +1,18 @@ from plasma.utils.downloading import download_all_shot_numbers -from data.signals import * from plasma.conf import conf -prepath = '/p/datad2/' #'/cscratch/share/frnn/'#'/p/datad2/' +prepath = '/p/datad2/' # '/cscratch/share/frnn/' shot_numbers_path = 'shot_lists/' save_path = 'signal_data_new/' -machine = conf['paths']['all_machines'][0]# d3d#jet#d3d #should match with data set from conf.yaml -signals = conf['paths']['all_signals']#all_signals#jet_signals#d3d_signals +# d3d, jet # should match with data set from conf.yaml +machine = conf['paths']['all_machines'][0] +signals = conf['paths']['all_signals'] # jet_signals, d3d_signals print('using signals: ') print(signals) # shot_list_files = plasma.conf.jet_full -#shot_list_files = plasma.conf.d3d_full -shot_list_files = conf['paths']['shot_files'][0]#plasma.conf.d3d_100 - -download_all_shot_numbers(prepath,save_path,shot_list_files,signals) +# shot_list_files = plasma.conf.d3d_full +shot_list_files = conf['paths']['shot_files'][0] # plasma.conf.d3d_100 +download_all_shot_numbers(prepath, save_path, shot_list_files, signals) diff --git a/data/jet_signals.py b/data/jet_signals.py index 8add5273..1efea0e1 100644 --- a/data/jet_signals.py +++ b/data/jet_signals.py @@ -1,90 +1,101 @@ -#JET signal hierarchy -#------------------------------------------------------------------------# -#User only needs to look at 1st and last sections +# JET signal hierarchy +# ------------------------------------------------------------------------ +# User only needs to look at 1st and last sections # - conf.py only needs to import signals_dirs and signals_masks # - get_mdsplus_data.py only needs signals_dirs and download_masks # - performance_analysis_utils.py needs : # - signals_dirs, plot_masks, ppf_labels, jpf_labels -#------------------------------------------------------------------------# +# ------------------------------------------------------------------------ ################ # Signal names # ################ -#This section contains all the exact JET signal strings and their -#groupings by type and dimensionality. -#User should not touch this. Use for reference - -#### 0D current signals #### -da_current = ['c2-ipla'] # Plasma Current [A] -da_lock =['c2-loca'] # Mode Lock Amplitude [A] - -#### Radiation signals #### -#0D -db_out = ['b5r-ptot>out'] #Radiated Power [W] -#1D vertical signals, don't use signal 16 and 23 -db =[] -db += ['b5vr-pbol:{:03d}'.format(i) for i in range(1,28) if (i != 16 and i != 23)] -#1D horizontal signals -db += ['b5hr-pbol:{:03d}'.format(i) for i in range(1,24)] - -#### 1D density signals [m^-2] #### -df = [] -#4 vertical channels and 4 horizontal channels, dont use signal 1 -df += ['g1r-lid:{:03d}'.format(i) for i in range(2,9)] - -#### 0D signals et al #### -gs_inductance = ['bl-liout'] # Radiated Power [W] +# 1D vertical signals, don't use signal 16 and 23 +db = [] +db += ['b5vr-pbol:{:03d}'.format(i) + for i in range(1, 28) if (i != 16 and i != 23)] +# 1D horizontal signals +db += ['b5hr-pbol:{:03d}'.format(i) for i in range(1, 24)] + +#################################### +# 1D density signals [m^-2] # +#################################### +df = [] +# 4 vertical channels and 4 horizontal channels, dont use signal 1 +df += ['g1r-lid:{:03d}'.format(i) for i in range(2, 9)] + +########################### +# 0D signals et al # +########################### +gs_inductance = ['bl-li 1: - xdata = c.get('dim_of(_s,1)').data() - xunits = get_units('dim_of(_s,1)') - ydata = c.get('dim_of(_s)').data() - yunits = get_units('dim_of(_s)') - else: - xdata = c.get('dim_of(_s)').data() - xunits = get_units('dim_of(_s)') - - # MDSplus seems to return 2-D arrays transposed. Change them back. - if np.ndim(data) == 2: data = np.transpose(data) - if np.ndim(ydata) == 2: ydata = np.transpose(ydata) - if np.ndim(xdata) == 2: xdata = np.transpose(xdata) - - # print ' GADATA Retrieval Time : ',time.time() - t0 - xdata = xdata*1e-3#time is measued in ms - return xdata,data,ydata,found - - -def fetch_jet_data(signal_path,shot_num,c): - found = False - time = np.array([0]) - ydata = None - data = np.array([0]) - try: - data = c.get('_sig=jet("{}/",{})'.format(signal_path,shot_num)).data() - if np.ndim(data) == 2: - data = np.transpose(data) - time = c.get('_sig=dim_of(jet("{}/",{}),1)'.format(signal_path,shot_num)).data() - ydata = c.get('_sig=dim_of(jet("{}/",{}),0)'.format(signal_path,shot_num)).data() - else: - time = c.get('_sig=dim_of(jet("{}/",{}))'.format(signal_path,shot_num)).data() - found = True - except Exception as e: - print(e) - sys.stdout.flush() - #pass - return time,data,ydata,found - -def fetch_nstx_data(signal_path,shot_num,c): - tree,tag = get_tree_and_tag(signal_path) - c.openTree(tree,shot_num) - data = c.get(tag).data() - time = c.get('dim_of('+tag+')').data() - found = True - return time,data,None,found - - - - - -d3d = Machine("d3d","atlas.gat.com",fetch_d3d_data,max_cores=32,current_threshold=2e-1) -jet = Machine("jet","mdsplus.jet.efda.org",fetch_jet_data,max_cores=8,current_threshold=1e5) -nstx = Machine("nstx","skylark.pppl.gov:8501::",fetch_nstx_data,max_cores=8) - -all_machines = [d3d,jet] + spl = path.split('/') + tree = spl[0] + tag = spl[1] + return tree, tag + + +def fetch_d3d_data(signal_path, shot, c=None): + tree, signal = get_tree_and_tag_no_backslash(signal_path) + if tree is None: + signal = c.get('findsig("'+signal+'",_fstree)').value + tree = c.get('_fstree').value + # if c is None: + # c = MDSplus.Connection('atlas.gat.com') + + # Retrieve data + found = False + xdata = np.array([0]) + ydata = None + data = np.array([0]) + + # Retrieve data from MDSplus (thin) + # first try, retrieve directly from tree andsignal + def get_units(str): + units = c.get('units_of('+str+')').data() + if units == '' or units == ' ': + units = c.get('units('+str+')').data() + return units + + try: + c.openTree(tree, shot) + data = c.get('_s = '+signal).data() + # data_units = c.get('units_of(_s)').data() + rank = np.ndim(data) + found = True + + except Exception as e: + print(e) + sys.stdout.flush() + pass + + # Retrieve data from PTDATA if node not found + if not found: + # print("not in full path {}".format(signal)) + data = c.get('_s = ptdata2("'+signal+'",'+str(shot)+')').data() + if len(data) != 1: + rank = np.ndim(data) + found = True + # Retrieve data from Pseudo-pointname if not in ptdata + if not found: + # print("not in PTDATA {}".format(signal)) + data = c.get('_s = pseudo("'+signal+'",'+str(shot)+')').data() + if len(data) != 1: + rank = np.ndim(data) + found = True + # this means the signal wasn't found + if not found: + print("No such signal: {}".format(signal)) + pass + + # get time base + if found: + if rank > 1: + xdata = c.get('dim_of(_s,1)').data() + # xunits = get_units('dim_of(_s,1)') + ydata = c.get('dim_of(_s)').data() + # yunits = get_units('dim_of(_s)') + else: + xdata = c.get('dim_of(_s)').data() + # xunits = get_units('dim_of(_s)') + + # MDSplus seems to return 2-D arrays transposed. Change them back. + if np.ndim(data) == 2: + data = np.transpose(data) + if np.ndim(ydata) == 2: + ydata = np.transpose(ydata) + if np.ndim(xdata) == 2: + xdata = np.transpose(xdata) + + # print(' GADATA Retrieval Time : ', time.time() - t0) + xdata = xdata*1e-3 # time is measued in ms + return xdata, data, ydata, found + + +def fetch_jet_data(signal_path, shot_num, c): + found = False + time = np.array([0]) + ydata = None + data = np.array([0]) + try: + data = c.get('_sig=jet("{}/",{})'.format(signal_path, shot_num)).data() + if np.ndim(data) == 2: + data = np.transpose(data) + time = c.get( + '_sig=dim_of(jet("{}/",{}),1)'.format( + signal_path, shot_num)).data() + ydata = c.get( + '_sig=dim_of(jet("{}/",{}),0)'.format( + signal_path, shot_num)).data() + else: + time = c.get( + '_sig=dim_of(jet("{}/",{}))'.format( + signal_path, shot_num)).data() + found = True + except Exception as e: + print(e) + sys.stdout.flush() + # pass + return time, data, ydata, found + + +def fetch_nstx_data(signal_path, shot_num, c): + tree, tag = get_tree_and_tag(signal_path) + c.openTree(tree, shot_num) + data = c.get(tag).data() + time = c.get('dim_of(' + tag + ')').data() + found = True + return time, data, None, found + + +d3d = Machine( + "d3d", + "atlas.gat.com", + fetch_d3d_data, + max_cores=32, + current_threshold=2e-1) +jet = Machine( + "jet", + "mdsplus.jet.efda.org", + fetch_jet_data, + max_cores=8, + current_threshold=1e5) +nstx = Machine("nstx", "skylark.pppl.gov:8501::", fetch_nstx_data, max_cores=8) + +all_machines = [d3d, jet] profile_num_channels = 64 -#ZIPFIT comes from actual measurements -#etemp_profile = ProfileSignal("Electron temperature profile",["ppf/hrts/te","ZIPFIT01/PROFILES.ETEMPFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) -#edens_profile = ProfileSignal("Electron density profile",["ppf/hrts/ne","ZIPFIT01/PROFILES.EDENSFIT"],[jet,d3d],mapping_paths=["ppf/hrts/rho",None],causal_shifts=[0,10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.05,0.02]) - -etemp_profile = ProfileSignal("Electron temperature profile",["ZIPFIT01/PROFILES.ETEMPFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -edens_profile = ProfileSignal("Electron density profile",["ZIPFIT01/PROFILES.EDENSFIT"],[d3d],mapping_paths=[None],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -itemp_profile = ProfileSignal("Ion temperature profile",["ZIPFIT01/PROFILES.ITEMPFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -zdens_profile = ProfileSignal("Impurity density profile",["ZIPFIT01/PROFILES.ZDENSFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -trot_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.TROTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) -pthm_profile = ProfileSignal("Thermal pressure profile",["ZIPFIT01/PROFILES.PTHMFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02])# thermal pressure doesn't include fast ions -neut_profile = ProfileSignal("Neutrals profile",["ZIPFIT01/PROFILES.NEUTFIT"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) - -q_profile = ProfileSignal("Q profile",["ZIPFIT01/PROFILES.BOOTSTRAP.QRHO"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02])#compare to just q95 -bootstrap_current_profile = ProfileSignal("Rotation profile",["ZIPFIT01/PROFILES.BOOTSTRAP.JBS_SAUTER"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) - -#equilibrium_image = 2DSignal("2D Magnetic Equilibrium",["EFIT01/RESULTS.GEQDSK.PSIRZ"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) - -#EFIT is the inverse problem from external magnetic measurements -#pressure_profile = ProfileSignal("Pressure profile",["EFIT01/RESULTS.GEQDSK.PRES"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02])# pressure might be unphysical since it is not constrained by measurements, only the EFIT which does not know about density and temperature -q_psi_profile = ProfileSignal("Q(psi) profile",["EFIT01/RESULTS.GEQDSK.QPSI"],[d3d],causal_shifts=[10],mapping_range=(0,1),num_channels=profile_num_channels,data_avail_tolerances=[0.02]) - - -# epress_profile_spatial = ProfileSignal("Electron pressure profile",["ppf/hrts/pe/"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels) -etemp_profile_spatial = ProfileSignal("Electron temperature profile",["ppf/hrts/te"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) -edens_profile_spatial = ProfileSignal("Electron density profile",["ppf/hrts/ne"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) -rho_profile_spatial = ProfileSignal("Rho at spatial positions",["ppf/hrts/rho"],[jet],causal_shifts=[25],mapping_range=(2,4),num_channels=profile_num_channels,data_avail_tolerances=[0.05]) - -etemp = Signal("electron temperature",["ppf/hrtx/te0"],[jet],causal_shifts=[25],data_avail_tolerances=[0.05]) -# epress = Signal("electron pressure",["ppf/hrtx/pe0/"],[jet],causal_shifts=[25]) - -q95 = Signal("q95 safety factor",['ppf/efit/q95',"EFIT01/RESULTS.AEQDSK.Q95"],[jet,d3d],causal_shifts=[15,10],normalize=False,data_avail_tolerances=[0.03,0.02]) - -ip = Signal("plasma current",["jpf/da/c2-ipla","d3d/ipspr15V"],[jet,d3d],is_ip=True) #"d3d/ipsip" was used before, ipspr15V seems to be available for a superset of shots. -iptarget = Signal("plasma current target",["d3d/ipsiptargt"],[d3d]) -iperr = Signal("plasma current error",["d3d/ipeecoil"],[d3d]) - -li = Signal("internal inductance",["jpf/gs/bl-liout'],[jet]) -#pradcore = ChannelSignal("Radiated Power Core",[ 'd3d/'+r'\bol_l15_p'],[d3d]) -#pradedge = ChannelSignal("Radiated Power Edge",['d3d/'+r'\bol_l03_p'],[d3d]) -pradcore = ChannelSignal("Radiated Power Core",['ppf/bolo/kb5h/channel14', 'd3d/'+r'\bol_l15_p'],[jet,d3d]) -pradedge = ChannelSignal("Radiated Power Edge",['ppf/bolo/kb5h/channel10','d3d/'+r'\bol_l03_p'],[jet,d3d]) -# pechin = Signal("ECH input power, not always on",['d3d/pcechpwrf'],[d3d]) -pechin = Signal("ECH input power, not always on",['RF/ECH.TOTAL.ECHPWRC'],[d3d]) - -#betan = Signal("Normalized Beta",['jpf/gs/bl-bndiaout'], [jet]) +# pradcore = ChannelSignal("Radiated Power Core", [ 'd3d/' + r'\bol_l15_p'] +# ,[d3d]) +# pradedge = ChannelSignal("Radiated Power Edge", ['d3d/' + r'\bol_l03_p'], +# [d3d]) +pradcore = ChannelSignal("Radiated Power Core", + ['ppf/bolo/kb5h/channel14', 'd3d/' + r'\bol_l15_p'], + [jet, d3d]) +pradedge = ChannelSignal("Radiated Power Edge", + ['ppf/bolo/kb5h/channel10', 'd3d/' + r'\bol_l03_p'], + [jet, d3d]) +# pechin = Signal("ECH input power, not always on", ['d3d/pcechpwrf'], [d3d]) +pechin = Signal("ECH input power, not always on", + ['RF/ECH.TOTAL.ECHPWRC'], [d3d]) + +# betan = Signal("Normalized Beta", ['jpf/gs/bl-bndia 1) } - -d3d_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(d3d)} -d3d_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(d3d) and sig.num_channels == 1)} -d3d_signals_1D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(d3d) and sig.num_channels > 1)} - -jet_signals = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if sig.is_defined_on_machine(jet)} -jet_signals_0D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels == 1)} -jet_signals_1D = {sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if (sig.is_defined_on_machine(jet) and sig.num_channels > 1)} - -#['pcechpwrf'] #Total ECH Power Not always on! -### 0D EFIT signals ### -#signal_paths += ['EFIT02/RESULTS.AEQDSK.Q95'] - -### 1D EFIT signals ### -#the other signals give more reliable data -#signal_paths += [ -#'AOT/EQU.t_e', #electron temperature profile vs rho (uniform mapping over time) -#'AOT/EQU.dens_e'] #electron density profile vs rho (uniform mapping over time) +fully_defined_signals = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + sig.is_defined_on_machines(all_machines)) +} +fully_defined_signals_0D = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + sig.is_defined_on_machines(all_machines) and sig.num_channels == 1) +} +fully_defined_signals_1D = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + sig.is_defined_on_machines(all_machines) and sig.num_channels > 1) +} +d3d_signals = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + sig.is_defined_on_machine(d3d)) +} +d3d_signals_0D = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + (sig.is_defined_on_machine(d3d) and sig.num_channels == 1)) +} +d3d_signals_1D = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + (sig.is_defined_on_machine(d3d) and sig.num_channels > 1)) +} + +jet_signals = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + sig.is_defined_on_machine(jet)) +} +jet_signals_0D = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + (sig.is_defined_on_machine(jet) and sig.num_channels == 1)) +} +jet_signals_1D = { + sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( + (sig.is_defined_on_machine(jet) and sig.num_channels > 1)) +} + +# ['pcechpwrf'] #Total ECH Power Not always on! +# ## 0D EFIT signals ### +# signal_paths += ['EFIT02/RESULTS.AEQDSK.Q95'] + +# ## 1D EFIT signals ### +# the other signals give more reliable data +# signal_paths += [ +# # Note, the following signals are uniformly mapped over time +# 'AOT/EQU.t_e', # electron temperature profile vs rho +# 'AOT/EQU.dens_e'] # electron density profile vs rho # [[' $I_{plasma}$ [A]'], -#[' Mode L. A. [A]'], -#[' $P_{radiated}$ [W]'], -#[' $P_{radiated}$ [W]'], -#[' $\rho_{plasma}$ [m^-2]'], -#[' $L_{plasma,internal}$'], -#['$\frac{d}{dt} E_{D}$ [W]'], -#[' $P_{input}$ [W]'], -#['$E_{D}$'], -##ppf signal labels -#['ECE unit?']] +# [' Mode L. A. [A]'], +# [' $P_{radiated}$ [W]'], +# [' $P_{radiated}$ [W]'], +# [' $\rho_{plasma}$ [m^-2]'], +# [' $L_{plasma,internal}$'], +# ['$\frac{d}{dt} E_{D}$ [W]'], +# [' $P_{input}$ [W]'], +# ['$E_{D}$'], +# ppf signal labels +# ['ECE unit?']] diff --git a/plasma/conf.py b/plasma/conf.py index 26ed01b8..84b6ce49 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -2,13 +2,16 @@ import os import errno -if os.path.exists(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../examples/conf.yaml')): - conf = parameters(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../examples/conf.yaml')) +if os.path.exists(os.path.join(os.path.abspath(os.path.dirname(__file__)), + '../examples/conf.yaml')): + conf = parameters(os.path.join(os.path.abspath(os.path.dirname(__file__)), + '../examples/conf.yaml')) elif os.path.exists('./conf.yaml'): conf = parameters('./conf.yaml') elif os.path.exists('./examples/conf.yaml'): conf = parameters('./examples/conf.yaml') elif os.path.exists('../examples/conf.yaml'): - conf = parameters('../examples/conf.yaml') + conf = parameters('../examples/conf.yaml') else: - raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'conf.yaml') + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), + 'conf.yaml') diff --git a/plasma/version.py b/plasma/version.py index 758ad1a2..b7c9168c 100644 --- a/plasma/version.py +++ b/plasma/version.py @@ -8,9 +8,11 @@ specification = ".".join(version_info[:2]) + def compatible(serializedVersion): selfMajor, selfMinor = map(int, version_info[:2]) - otherMajor, otherMinor = map(int, re.split(r"[-\.]", serializedVersion)[:2]) + otherMajor, otherMinor = map(int, + re.split(r"[-\.]", serializedVersion)[:2]) if selfMajor >= otherMajor: return True elif selfMinor >= otherMinor: From f23865aed4d4ad44a0723e229e73adc16fb076cc Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 11:38:37 -0500 Subject: [PATCH 559/744] Use qualified import for data.signals module in conf_parser.py --- plasma/conf_parser.py | 337 +++++++++++++++++++++++++++++------------- 1 file changed, 234 insertions(+), 103 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 97ec81ae..050d48cc 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -1,47 +1,62 @@ from plasma.primitives.shots import ShotListFiles -from data.signals import * - +import data.signals as sig +# from data.signals import ( +# all_signals, fully_defined_signals_1D, +# jet, d3d) # nstx import getpass -import uuid import yaml import hashlib + def parameters(input_file): """Parse yaml file of configuration parameters.""" - from plasma.models.targets import HingeTarget, MaxHingeTarget, BinaryTarget, TTDTarget, TTDInvTarget, TTDLinearTarget - + from plasma.models.targets import ( + HingeTarget, MaxHingeTarget, BinaryTarget, + TTDTarget, TTDInvTarget, TTDLinearTarget + ) with open(input_file, 'r') as yaml_file: params = yaml.load(yaml_file) - params['user_name'] = getpass.getuser() output_path = params['fs_path'] + "/" + params['user_name'] base_path = output_path params['paths']['base_path'] = base_path - params['paths']['signal_prepath'] = base_path + params['paths']['signal_prepath'] - params['paths']['shot_list_dir'] = base_path + params['paths']['shot_list_dir'] + params['paths']['signal_prepath'] = base_path + \ + params['paths']['signal_prepath'] + params['paths']['shot_list_dir'] = base_path + \ + params['paths']['shot_list_dir'] params['paths']['output_path'] = output_path - h = get_unique_signal_hash(all_signals.values()) - params['paths']['global_normalizer_path'] = output_path + '/normalization/normalization_signal_group_{}.npz'.format(h) + h = get_unique_signal_hash(sig.all_signals.values()) + params['paths']['global_normalizer_path'] = output_path + \ + '/normalization/normalization_signal_group_{}.npz'.format(h) if params['training']['hyperparam_tuning']: - # params['paths']['saved_shotlist_path'] = './normalization/shot_lists.npz' - params['paths']['normalizer_path'] = './normalization/normalization_signal_group_{}.npz'.format(h) + # params['paths']['saved_shotlist_path'] = + # './normalization/shot_lists.npz' + params['paths']['normalizer_path'] = ( + './normalization/normalization_signal_group_{}.npz'.format(h)) params['paths']['model_save_path'] = './model_checkpoints/' params['paths']['csvlog_save_path'] = './csv_logs/' params['paths']['results_prepath'] = './results/' else: - # params['paths']['saved_shotlist_path'] = output_path +'/normalization/shot_lists.npz' - params['paths']['normalizer_path'] = params['paths']['global_normalizer_path'] - params['paths']['model_save_path'] = output_path + '/model_checkpoints/' + # params['paths']['saved_shotlist_path'] = output_path + + # '/normalization/shot_lists.npz' + params['paths']['normalizer_path'] = ( + params['paths']['global_normalizer_path']) + params['paths']['model_save_path'] = ( + output_path + '/model_checkpoints/') params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['results_prepath'] = output_path + '/results/' - params['paths']['tensorboard_save_path'] = output_path + params['paths']['tensorboard_save_path'] - params['paths']['saved_shotlist_path'] = params['paths']['base_path'] + '/processed_shotlists/' + params['paths']['data'] + '/shot_lists_signal_group_{}.npz'.format(h) - params['paths']['processed_prepath'] = output_path +'/processed_shots/' + 'signal_group_{}/'.format(h) - - #ensure shallow model has +1 -1 target. + params['paths']['tensorboard_save_path'] = output_path + \ + params['paths']['tensorboard_save_path'] + params['paths']['saved_shotlist_path'] = ( + params['paths']['base_path'] + '/processed_shotlists/' + + params['paths']['data'] + + '/shot_lists_signal_group_{}.npz'.format(h)) + params['paths']['processed_prepath'] = ( + output_path + '/processed_shots/' + 'signal_group_{}/'.format(h)) + # ensure shallow model has +1 -1 target. if params['model']['shallow'] or params['target'] == 'hinge': params['data']['target'] = HingeTarget elif params['target'] == 'maxhinge': @@ -59,163 +74,279 @@ def parameters(input_file): print('Unkown type of target. Exiting') exit(1) - #params['model']['output_activation'] = params['data']['target'].activation - #binary crossentropy performs slightly better? - #params['model']['loss'] = params['data']['target'].loss - - #signals - params['paths']['all_signals_dict'] = all_signals - #assert order q95,li,ip,lm,betan,energy,dens,pradcore,pradedge,pin,pechin,torquein,ipdirect,etemp_profile,edens_profile + # params['model']['output_activation'] = + # params['data']['target'].activation + # binary crossentropy performs slightly better? + # params['model']['loss'] = params['data']['target'].loss + + # signals + params['paths']['all_signals_dict'] = sig.all_signals + # assert order + # q95, li, ip, lm, betan, energy, dens, pradcore, pradedge, pin, + # pechin, torquein, ipdirect, etemp_profile, edens_profile + + # shot lists + jet_carbon_wall = ShotListFiles( + sig.jet, params['paths']['shot_list_dir'], + ['CWall_clear.txt', 'CFC_unint.txt'], 'jet carbon wall data') + jet_iterlike_wall = ShotListFiles( + sig.jet, params['paths']['shot_list_dir'], + ['ILW_unint.txt', 'BeWall_clear.txt'], 'jet iter like wall data') + + jenkins_jet_carbon_wall = ShotListFiles( + sig.jet, params['paths']['shot_list_dir'], + ['jenkins_CWall_clear.txt', 'jenkins_CFC_unint.txt'], + 'Subset of jet carbon wall data for Jenkins tests') + jenkins_jet_iterlike_wall = ShotListFiles( + sig.jet, params['paths']['shot_list_dir'], + ['jenkins_ILW_unint.txt', 'jenkins_BeWall_clear.txt'], + 'Subset of jet iter like wall data for Jenkins tests') + + jet_full = ShotListFiles( + sig.jet, params['paths']['shot_list_dir'], + ['ILW_unint.txt', 'BeWall_clear.txt', 'CWall_clear.txt', + 'CFC_unint.txt'], 'jet full data') + + # d3d_10000 = ShotListFiles( + # sig.d3d, params['paths']['shot_list_dir'], + # ['d3d_clear_10000.txt', 'd3d_disrupt_10000.txt'], + # 'd3d data 10000 ND and D shots') + # d3d_1000 = ShotListFiles( + # sig.d3d, params['paths']['shot_list_dir'], + # ['d3d_clear_1000.txt', 'd3d_disrupt_1000.txt'], + # 'd3d data 1000 ND and D shots') + # d3d_100 = ShotListFiles( + # sig.d3d, params['paths']['shot_list_dir'], + # ['d3d_clear_100.txt', 'd3d_disrupt_100.txt'], + # 'd3d data 100 ND and D shots') + d3d_full = ShotListFiles( + sig.d3d, params['paths']['shot_list_dir'], + ['d3d_clear_data_avail.txt', 'd3d_disrupt_data_avail.txt'], + 'd3d data since shot 125500') + d3d_jenkins = ShotListFiles( + sig.d3d, params['paths']['shot_list_dir'], + ['jenkins_d3d_clear.txt', 'jenkins_d3d_disrupt.txt'], + 'Subset of d3d data for Jenkins test') + # d3d_jb_full = ShotListFiles( + # sig.d3d, params['paths']['shot_list_dir'], + # ['shotlist_JaysonBarr_clear.txt', + # 'shotlist_JaysonBarr_disrupt.txt'], + # 'd3d shots since 160000-170000') + + # nstx_full = ShotListFiles( + # nstx, params['paths']['shot_list_dir'], + # ['disrupt_nstx.txt'], 'nstx shots (all are disruptive') - #shot lists - jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['CWall_clear.txt','CFC_unint.txt'],'jet carbon wall data') - jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt'],'jet iter like wall data') - - jenkins_jet_carbon_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['jenkins_CWall_clear.txt','jenkins_CFC_unint.txt'],'Subset of jet carbon wall data for Jenkins tests') - jenkins_jet_iterlike_wall = ShotListFiles(jet,params['paths']['shot_list_dir'],['jenkins_ILW_unint.txt','jenkins_BeWall_clear.txt'],'Subset of jet iter like wall data for Jenkins tests') - - jet_full = ShotListFiles(jet,params['paths']['shot_list_dir'],['ILW_unint.txt','BeWall_clear.txt','CWall_clear.txt','CFC_unint.txt'],'jet full data') - - d3d_10000 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_10000.txt','d3d_disrupt_10000.txt'],'d3d data 10000 ND and D shots') - d3d_1000 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_1000.txt','d3d_disrupt_1000.txt'],'d3d data 1000 ND and D shots') - d3d_100 = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_100.txt','d3d_disrupt_100.txt'],'d3d data 100 ND and D shots') - d3d_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['d3d_clear_data_avail.txt','d3d_disrupt_data_avail.txt'],'d3d data since shot 125500') - d3d_jenkins = ShotListFiles(d3d,params['paths']['shot_list_dir'],['jenkins_d3d_clear.txt','jenkins_d3d_disrupt.txt'],'Subset of d3d data for Jenkins test') - d3d_jb_full = ShotListFiles(d3d,params['paths']['shot_list_dir'],['shotlist_JaysonBarr_clear.txt','shotlist_JaysonBarr_disrupt.txt'],'d3d shots since 160000-170000') - - nstx_full = ShotListFiles(nstx,params['paths']['shot_list_dir'],['disrupt_nstx.txt'],'nstx shots (all are disruptive') - if params['paths']['data'] == 'jet_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = jet_signals + params['paths']['use_signals_dict'] = sig.jet_signals elif params['paths']['data'] == 'jet_data_0D': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = jet_signals_0D + params['paths']['use_signals_dict'] = sig.jet_signals_0D elif params['paths']['data'] == 'jet_data_1D': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = jet_signals_1D + params['paths']['use_signals_dict'] = sig.jet_signals_1D elif params['paths']['data'] == 'jet_carbon_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = jet_signals + params['paths']['use_signals_dict'] = sig.jet_signals elif params['paths']['data'] == 'jet_mixed_data': params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = jet_signals + params['paths']['use_signals_dict'] = sig.jet_signals elif params['paths']['data'] == 'jenkins_jet': params['paths']['shot_files'] = [jenkins_jet_carbon_wall] params['paths']['shot_files_test'] = [jenkins_jet_iterlike_wall] - params['paths']['use_signals_dict'] = jet_signals - elif params['paths']['data'] == 'jet_data_fully_defined': #jet data but with fully defined signals + params['paths']['use_signals_dict'] = sig.jet_signals + # jet data but with fully defined signals + elif params['paths']['data'] == 'jet_data_fully_defined': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = fully_defined_signals - elif params['paths']['data'] == 'jet_data_fully_defined_0D': #jet data but with fully defined signals + params['paths']['use_signals_dict'] = sig.fully_defined_signals + # jet data but with fully defined signals + elif params['paths']['data'] == 'jet_data_fully_defined_0D': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = fully_defined_signals_0D - - + params['paths']['use_signals_dict'] = sig.fully_defined_signals_0D elif params['paths']['data'] == 'd3d_data': params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = { + 'q95': sig.q95, + 'li': sig.li, + 'ip': sig.ip, + 'lm': sig.lm, + 'betan': sig.betan, + 'energy': sig.energy, + 'dens': sig.dens, + 'pradcore': sig.pradcore, + 'pradedge': sig.pradedge, + 'pin': sig.pin, + 'torquein': sig.torquein, + 'ipdirect': sig.ipdirect, + 'iptarget': sig.iptarget, + 'iperr': sig.iperr, + 'etemp_profile': sig.etemp_profile, + 'edens_profile': sig.edens_profile, + } elif params['paths']['data'] == 'd3d_data_1D': params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile} + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = { + 'ipdirect': sig.ipdirect, + 'etemp_profile': sig.etemp_profile, + 'edens_profile': sig.edens_profile, + } elif params['paths']['data'] == 'd3d_data_all_profiles': params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'ipdirect':ipdirect,'etemp_profile':etemp_profile ,'edens_profile':edens_profile,'itemp_profile':itemp_profile,'zdens_profile':zdens_profile,'trot_profile':trot_profile,'pthm_profile':pthm_profile,'neut_profile':neut_profile,'q_profile':q_profile,'bootstrap_current_profile':bootstrap_current_profile,'q_psi_profile':q_psi_profile} + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = { + 'ipdirect': sig.ipdirect, + 'etemp_profile': sig.etemp_profile, + 'edens_profile': sig.edens_profile, + 'itemp_profile': sig.itemp_profile, + 'zdens_profile': sig.zdens_profile, + 'trot_profile': sig.trot_profile, + 'pthm_profile': sig.pthm_profile, + 'neut_profile': sig.neut_profile, + 'q_profile': sig.q_profile, + 'bootstrap_current_profile': sig.bootstrap_current_profile, + 'q_psi_profile': sig.q_psi_profile, + } elif params['paths']['data'] == 'd3d_data_0D': params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr} + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = { + 'q95': sig.q95, + 'li': sig.li, + 'ip': sig.ip, + 'lm': sig.lm, + 'betan': sig.betan, + 'energy': sig.energy, + 'dens': sig.dens, + 'pradcore': sig.pradcore, + 'pradedge': sig.pradedge, + 'pin': sig.pin, + 'torquein': sig.torquein, + 'ipdirect': sig.ipdirect, + 'iptarget': sig.iptarget, + 'iperr': sig.iperr, + } elif params['paths']['data'] == 'd3d_data_all': params['paths']['shot_files'] = [d3d_full] - params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = d3d_signals + params['paths']['shot_files_test'] = [] + params['paths']['use_signals_dict'] = sig.d3d_signals elif params['paths']['data'] == 'jenkins_d3d': params['paths']['shot_files'] = [d3d_jenkins] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = {'q95':q95,'li':li,'ip':ip,'lm':lm,'betan':betan,'energy':energy,'dens':dens,'pradcore':pradcore,'pradedge':pradedge,'pin':pin,'torquein':torquein,'ipdirect':ipdirect,'iptarget':iptarget,'iperr':iperr, -'etemp_profile':etemp_profile ,'edens_profile':edens_profile} - elif params['paths']['data'] == 'd3d_data_fully_defined': #jet data but with fully defined signals + params['paths']['use_signals_dict'] = { + 'q95': sig.q95, + 'li': sig.li, + 'ip': sig.ip, + 'lm': sig.lm, + 'betan': sig.betan, + 'energy': sig.energy, + 'dens': sig.dens, + 'pradcore': sig.pradcore, + 'pradedge': sig.pradedge, + 'pin': sig.pin, + 'torquein': sig.torquein, + 'ipdirect': sig.ipdirect, + 'iptarget': sig.iptarget, + 'iperr': sig.iperr, + 'etemp_profile': sig.etemp_profile, + 'edens_profile': sig.edens_profile, + } + # jet data but with fully defined signals + elif params['paths']['data'] == 'd3d_data_fully_defined': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = fully_defined_signals - elif params['paths']['data'] == 'd3d_data_fully_defined_0D': #jet data but with fully defined signals + params['paths']['use_signals_dict'] = sig.fully_defined_signals + # jet data but with fully defined signals + elif params['paths']['data'] == 'd3d_data_fully_defined_0D': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] - params['paths']['use_signals_dict'] = fully_defined_signals_0D + params['paths']['use_signals_dict'] = sig.fully_defined_signals_0D - #cross-machine + # cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [d3d_full] - params['paths']['use_signals_dict'] = fully_defined_signals + params['paths']['use_signals_dict'] = sig.fully_defined_signals elif params['paths']['data'] == 'd3d_to_jet_data': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = fully_defined_signals + params['paths']['use_signals_dict'] = sig.fully_defined_signals elif params['paths']['data'] == 'jet_to_d3d_data_0D': params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [d3d_full] - params['paths']['use_signals_dict'] = fully_defined_signals_0D + params['paths']['use_signals_dict'] = sig.fully_defined_signals_0D elif params['paths']['data'] == 'd3d_to_jet_data_0D': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = fully_defined_signals_0D + params['paths']['use_signals_dict'] = sig.fully_defined_signals_0D elif params['paths']['data'] == 'jet_to_d3d_data_1D': params['paths']['shot_files'] = [jet_full] params['paths']['shot_files_test'] = [d3d_full] - params['paths']['use_signals_dict'] = fully_defined_signals_1D + params['paths']['use_signals_dict'] = sig.fully_defined_signals_1D elif params['paths']['data'] == 'd3d_to_jet_data_1D': params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [jet_iterlike_wall] - params['paths']['use_signals_dict'] = fully_defined_signals_1D - + params['paths']['use_signals_dict'] = sig.fully_defined_signals_1D - - else: + else: print("Unkown data set {}".format(params['paths']['data'])) exit(1) if len(params['paths']['specific_signals']): - for sig in params['paths']['specific_signals']: - if sig not in params['paths']['use_signals_dict'].keys(): - print("Signal {} is not fully defined for {} machine. Skipping...".format(sig,params['paths']['data'].split("_")[0])) - params['paths']['specific_signals'] = list(filter(lambda x: x in params['paths']['use_signals_dict'].keys(), params['paths']['specific_signals'])) - selected_signals = {k: params['paths']['use_signals_dict'][k] for k in params['paths']['specific_signals']} - params['paths']['use_signals'] = sort_by_channels(list(selected_signals.values())) + for s in params['paths']['specific_signals']: + if s not in params['paths']['use_signals_dict'].keys(): + print("Signal {} is not fully defined for {} machine. ", + "Skipping...".format( + s, params['paths']['data'].split("_")[0])) + params['paths']['specific_signals'] = list( + filter( + lambda x: x in params['paths']['use_signals_dict'].keys(), + params['paths']['specific_signals'])) + selected_signals = {k: params['paths']['use_signals_dict'][k] + for k in params['paths']['specific_signals']} + params['paths']['use_signals'] = sort_by_channels( + list(selected_signals.values())) else: - #default case - params['paths']['use_signals'] = sort_by_channels(list(params['paths']['use_signals_dict'].values())) + # default case + params['paths']['use_signals'] = sort_by_channels( + list(params['paths']['use_signals_dict'].values())) - params['paths']['all_signals'] = sort_by_channels(list(params['paths']['all_signals_dict'].values())) + params['paths']['all_signals'] = sort_by_channels( + list(params['paths']['all_signals_dict'].values())) - print("Selected signals (determines which signals training is run on):\n{}".format(params['paths']['use_signals'])) + print("Selected signals (determines which signals are used for ", + "training):\n{}".format(params['paths']['use_signals'])) - params['paths']['shot_files_all'] = params['paths']['shot_files']+params['paths']['shot_files_test'] - params['paths']['all_machines'] = list(set([file.machine for file in params['paths']['shot_files_all']])) + params['paths']['shot_files_all'] = ( + params['paths']['shot_files'] + params['paths']['shot_files_test']) + params['paths']['all_machines'] = list( + set([file.machine for file in params['paths']['shot_files_all']])) - #type assertations - assert type(params['data']['signal_to_augment']) == str or type(params['data']['signal_to_augment']) == None - assert type(params['data']['augment_during_training']) == bool + # type assertations + assert (isinstance(params['data']['signal_to_augment'], str) + or isinstance(params['data']['signal_to_augment'], None)) + assert isinstance(params['data']['augment_during_training'], bool) return params + def get_unique_signal_hash(signals): - return int(hashlib.md5(''.join(tuple(map(lambda x: x.description, sorted(signals)))).encode('utf-8')).hexdigest(),16) + return int(hashlib.md5(''.join( + tuple(map(lambda x: x.description, sorted(signals)))).encode( + 'utf-8')).hexdigest(), 16) -#make sure 1D signals come last! This is necessary for model builder. -def sort_by_channels(list_of_signals): - return sorted(list_of_signals,key = lambda x: x.num_channels) +def sort_by_channels(list_of_signals): + # make sure 1D signals come last! This is necessary for model builder. + return sorted(list_of_signals, key=lambda x: x.num_channels) From deddb520c861e6693811c90b718fcc843d395113 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 12:49:52 -0500 Subject: [PATCH 560/744] Fix style for files in plasma/models --- plasma/models/builder.py | 331 +++++---- plasma/models/custom_loss.py | 28 +- plasma/models/loader.py | 617 +++++++++------- plasma/models/mpi_runner.py | 1199 +++++++++++++++++-------------- plasma/models/runner.py | 442 +++++++----- plasma/models/shallow_runner.py | 449 +++++++----- plasma/models/targets.py | 138 ++-- 7 files changed, 1849 insertions(+), 1355 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index e1913b85..dc2b75c6 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -1,28 +1,32 @@ from __future__ import division -import keras from keras.models import Sequential, Model from keras.layers import Input -from keras.layers.core import Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute, RepeatVector +from keras.layers.core import ( + Dense, Activation, Dropout, Lambda, + Reshape, Flatten, Permute, # RepeatVector + ) from keras.layers import LSTM, SimpleRNN, Bidirectional, BatchNormalization from keras.layers.convolutional import Convolution1D from keras.layers.pooling import MaxPooling1D -from keras.utils.data_utils import get_file +# from keras.utils.data_utils import get_file from keras.layers.wrappers import TimeDistributed from keras.layers.merge import Concatenate from keras.callbacks import Callback -from keras.regularizers import l1,l2,l1_l2 +from keras.regularizers import l2 # l1, l1_l2 import keras.backend as K import dill import re -import os,sys +import os +import sys import numpy as np from copy import deepcopy from plasma.utils.downloading import makedirs_process_safe import hashlib + class LossHistory(Callback): def on_train_begin(self, logs=None): self.losses = [] @@ -32,44 +36,49 @@ def on_batch_end(self, batch, logs=None): class ModelBuilder(object): - def __init__(self,conf): + def __init__(self, conf): self.conf = conf def get_unique_id(self): - num_epochs = self.conf['training']['num_epochs'] + # num_epochs = self.conf['training']['num_epochs'] this_conf = deepcopy(self.conf) - #don't make hash dependent on number of epochs. + # don't make hash dependent on number of epochs. this_conf['training']['num_epochs'] = 0 - unique_id = int(hashlib.md5((dill.dumps(this_conf).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + unique_id = int(hashlib.md5((dill.dumps(this_conf).decode( + 'unicode_escape')).encode('utf-8')).hexdigest(), 16) return unique_id def get_0D_1D_indices(self): - #make sure all 1D indices are contiguous in the end! + # make sure all 1D indices are contiguous in the end! use_signals = self.conf['paths']['use_signals'] indices_0d = [] indices_1d = [] num_0D = 0 num_1D = 0 curr_idx = 0 - is_1D_region = use_signals[0].num_channels > 1#do we have any 1D indices? + # do we have any 1D indices? + is_1D_region = use_signals[0].num_channels > 1 for sig in use_signals: num_channels = sig.num_channels - indices = range(curr_idx,curr_idx+num_channels) + indices = range(curr_idx, curr_idx+num_channels) if num_channels > 1: indices_1d += indices num_1D += 1 is_1D_region = True else: - assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" + assert(not is_1D_region) + # , "make sure all use_signals are ordered such that 1D signals + # come last!" assert(num_channels == 1) indices_0d += indices num_0D += 1 is_1D_region = False curr_idx += num_channels - return np.array(indices_0d).astype(np.int32), np.array(indices_1d).astype(np.int32),num_0D,num_1D - + return np.array(indices_0d).astype( + np.int32), np.array(indices_1d).astype( + np.int32), num_0D, num_1D - def build_model(self,predict,custom_batch_size=None): + def build_model(self, predict, custom_batch_size=None): conf = self.conf model_conf = conf['model'] use_bidirectional = model_conf['use_bidirectional'] @@ -82,25 +91,25 @@ def build_model(self,predict,custom_batch_size=None): dropout_prob = model_conf['dropout_prob'] length = model_conf['length'] pred_length = model_conf['pred_length'] - skip = model_conf['skip'] + # skip = model_conf['skip'] stateful = model_conf['stateful'] return_sequences = model_conf['return_sequences'] - output_activation = conf['data']['target'].activation#model_conf['output_activation'] + # model_conf['output_activation'] + output_activation = conf['data']['target'].activation use_signals = conf['paths']['use_signals'] num_signals = sum([sig.num_channels for sig in use_signals]) num_conv_filters = model_conf['num_conv_filters'] - num_conv_layers = model_conf['num_conv_layers'] + # num_conv_layers = model_conf['num_conv_layers'] size_conv_filters = model_conf['size_conv_filters'] pool_size = model_conf['pool_size'] dense_size = model_conf['dense_size'] - batch_size = self.conf['training']['batch_size'] if predict: batch_size = self.conf['model']['pred_batch_size'] - #so we can predict with one time point at a time! + # so we can predict with one time point at a time! if return_sequences: - length =pred_length + length = pred_length else: length = 1 @@ -110,20 +119,20 @@ def build_model(self,predict,custom_batch_size=None): if rnn_type == 'LSTM': rnn_model = LSTM elif rnn_type == 'SimpleRNN': - rnn_model =SimpleRNN + rnn_model = SimpleRNN else: print('Unkown Model Type, exiting.') exit(1) - - batch_input_shape=(batch_size,length, num_signals) - batch_shape_non_temporal=(batch_size,num_signals) - indices_0d,indices_1d,num_0D,num_1D = self.get_0D_1D_indices() + batch_input_shape = (batch_size, length, num_signals) + # batch_shape_non_temporal = (batch_size, num_signals) + + indices_0d, indices_1d, num_0D, num_1D = self.get_0D_1D_indices() - def slicer(x,indices): - return x[:,indices] + def slicer(x, indices): + return x[:, indices] - def slicer_output_shape(input_shape,indices): + def slicer_output_shape(input_shape, indices): shape_curr = list(input_shape) assert len(shape_curr) == 2 # only valid for 3D tensors shape_curr[-1] = len(indices) @@ -132,112 +141,178 @@ def slicer_output_shape(input_shape,indices): pre_rnn_input = Input(shape=(num_signals,)) if num_1D > 0: - pre_rnn_1D = Lambda(lambda x: x[:,len(indices_0d):],output_shape=(len(indices_1d),))(pre_rnn_input) - pre_rnn_0D = Lambda(lambda x: x[:,:len(indices_0d)],output_shape=(len(indices_0d),))(pre_rnn_input)# slicer(x,indices_0d),lambda s: slicer_output_shape(s,indices_0d))(pre_rnn_input) - pre_rnn_1D = Reshape((num_1D,len(indices_1d)//num_1D)) (pre_rnn_1D) - pre_rnn_1D = Permute((2,1)) (pre_rnn_1D) - + pre_rnn_1D = Lambda(lambda x: x[:, len(indices_0d):], + output_shape=(len(indices_1d),))(pre_rnn_input) + pre_rnn_0D = Lambda(lambda x: x[:, :len(indices_0d)], + output_shape=(len(indices_0d),))(pre_rnn_input) + # slicer(x,indices_0d),lambda s: + # slicer_output_shape(s,indices_0d))(pre_rnn_input) + pre_rnn_1D = Reshape((num_1D, len(indices_1d)//num_1D))(pre_rnn_1D) + pre_rnn_1D = Permute((2, 1))(pre_rnn_1D) + for i in range(model_conf['num_conv_layers']): div_fac = 2**i - '''The first conv layer learns `num_conv_filters//div_fac` filters (aka kernels), - each of size `(size_conv_filters, num1D)``. Its output will have shape - (None, len(indices_1d)//num_1D - size_conv_filters + 1, num_conv_filters//div_fac), - i.e., for each position in the input spatial series (direction along radius), - the activation of each filter at that position.''' + '''The first conv layer learns `num_conv_filters//div_fac` + filters (aka kernels), each of size + `(size_conv_filters, num1D)`. Its output will have shape + (None, len(indices_1d)//num_1D - size_conv_filters + 1, + num_conv_filters//div_fac), i.e., for + each position in the input spatial series (direction along + radius), the activation of each filter at that position. + + ''' '''For i=1 first conv layer would get: - (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/pool_size-size_conv_filters+1,num_conv_filters//div_fac)''' - pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,size_conv_filters,padding='valid') (pre_rnn_1D) - if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + (None, (len(indices_1d)//num_1D - size_conv_filters + + 1)/pool_size-size_conv_filters + 1,num_conv_filters//div_fac) + + ''' + pre_rnn_1D = Convolution1D( + num_conv_filters//div_fac, size_conv_filters, + padding='valid')(pre_rnn_1D) + if use_batch_norm: + pre_rnn_1D = BatchNormalization()(pre_rnn_1D) pre_rnn_1D = Activation('relu')(pre_rnn_1D) - '''The output of the second conv layer will have shape - (None, len(indices_1d)//num_1D - size_conv_filters + 1, num_conv_filters//div_fac), - i.e., for each position in the input spatial series (direction along radius), - the activation of each filter at that position. - - for i=1 second layer would output - (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/pool_size-size_conv_filters+1,num_conv_filters//div_fac)''' - pre_rnn_1D = Convolution1D(num_conv_filters//div_fac,1,padding='valid') (pre_rnn_1D) - if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + '''The output of the second conv layer will have shape + (None, len(indices_1d)//num_1D - size_conv_filters + 1, + num_conv_filters//div_fac), + i.e., for each position in the input spatial series + (direction along radius), the activation of each filter + at that position. + + For i=1, the second layer would output + (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/ + pool_size-size_conv_filters + 1,num_conv_filters//div_fac) + ''' + pre_rnn_1D = Convolution1D( + num_conv_filters//div_fac, 1, padding='valid')(pre_rnn_1D) + if use_batch_norm: + pre_rnn_1D = BatchNormalization()(pre_rnn_1D) pre_rnn_1D = Activation('relu')(pre_rnn_1D) - '''Outputs (None, (len(indices_1d)//num_1D - size_conv_filters + 1)/pool_size, num_conv_filters//div_fac) - - for i=1 pooling layer would output: - (None,((len(indices_1d)//num_1D- size_conv_filters + 1)/pool_size-size_conv_filters+1)/pool_size,num_conv_filters//div_fac)''' - pre_rnn_1D = MaxPooling1D(pool_size) (pre_rnn_1D) - pre_rnn_1D = Flatten() (pre_rnn_1D) - pre_rnn_1D = Dense(dense_size,kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) - if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + '''Outputs (None, (len(indices_1d)//num_1D - size_conv_filters + + 1)/pool_size, num_conv_filters//div_fac) + + For i=1, the pooling layer would output: + (None,((len(indices_1d)//num_1D- size_conv_filters + + 1)/pool_size-size_conv_filters+1)/pool_size, + num_conv_filters//div_fac) + + ''' + pre_rnn_1D = MaxPooling1D(pool_size)(pre_rnn_1D) + pre_rnn_1D = Flatten()(pre_rnn_1D) + pre_rnn_1D = Dense( + dense_size, + kernel_regularizer=l2(dense_regularization), + bias_regularizer=l2(dense_regularization), + activity_regularizer=l2(dense_regularization))(pre_rnn_1D) + if use_batch_norm: + pre_rnn_1D = BatchNormalization()(pre_rnn_1D) pre_rnn_1D = Activation('relu')(pre_rnn_1D) - pre_rnn_1D = Dense(dense_size//4,kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn_1D) - if use_batch_norm: pre_rnn_1D = BatchNormalization()(pre_rnn_1D) + pre_rnn_1D = Dense( + dense_size//4, + kernel_regularizer=l2(dense_regularization), + bias_regularizer=l2(dense_regularization), + activity_regularizer=l2(dense_regularization))(pre_rnn_1D) + if use_batch_norm: + pre_rnn_1D = BatchNormalization()(pre_rnn_1D) pre_rnn_1D = Activation('relu')(pre_rnn_1D) - pre_rnn = Concatenate() ([pre_rnn_0D,pre_rnn_1D]) + pre_rnn = Concatenate()([pre_rnn_0D, pre_rnn_1D]) else: - pre_rnn = pre_rnn_input + pre_rnn = pre_rnn_input if model_conf['rnn_layers'] == 0 or model_conf['extra_dense_input']: - pre_rnn = Dense(dense_size,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size//2,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - pre_rnn = Dense(dense_size//4,activation='relu',kernel_regularizer=l2(dense_regularization),bias_regularizer=l2(dense_regularization),activity_regularizer=l2(dense_regularization)) (pre_rnn) - - pre_rnn_model = Model(inputs = pre_rnn_input,outputs=pre_rnn) - #pre_rnn_model.summary() - x_input = Input(batch_shape = batch_input_shape) - x_in = TimeDistributed(pre_rnn_model) (x_input) + pre_rnn = Dense( + dense_size, + activation='relu', + kernel_regularizer=l2(dense_regularization), + bias_regularizer=l2(dense_regularization), + activity_regularizer=l2(dense_regularization))(pre_rnn) + pre_rnn = Dense( + dense_size//2, + activation='relu', + kernel_regularizer=l2(dense_regularization), + bias_regularizer=l2(dense_regularization), + activity_regularizer=l2(dense_regularization))(pre_rnn) + pre_rnn = Dense( + dense_size//4, + activation='relu', + kernel_regularizer=l2(dense_regularization), + bias_regularizer=l2(dense_regularization), + activity_regularizer=l2(dense_regularization))(pre_rnn) + + pre_rnn_model = Model(inputs=pre_rnn_input, outputs=pre_rnn) + # pre_rnn_model.summary() + x_input = Input(batch_shape=batch_input_shape) + x_in = TimeDistributed(pre_rnn_model)(x_input) if use_bidirectional: for _ in range(model_conf['rnn_layers']): - x_in = Bidirectional(rnn_model(rnn_size, return_sequences=return_sequences, - stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob)) (x_in) - x_in = Dropout(dropout_prob) (x_in) + x_in = Bidirectional( + rnn_model( + rnn_size, + return_sequences=return_sequences, + stateful=stateful, + kernel_regularizer=l2(regularization), + recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization), + dropout=dropout_prob, + recurrent_dropout=dropout_prob))(x_in) + x_in = Dropout(dropout_prob)(x_in) else: for _ in range(model_conf['rnn_layers']): - x_in = rnn_model(rnn_size, return_sequences=return_sequences,#batch_input_shape=batch_input_shape, - stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob) (x_in) - x_in = Dropout(dropout_prob) (x_in) + x_in = rnn_model( + rnn_size, + return_sequences=return_sequences, + # batch_input_shape=batch_input_shape, + stateful=stateful, + kernel_regularizer=l2(regularization), + recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization), + dropout=dropout_prob, + recurrent_dropout=dropout_prob)(x_in) + x_in = Dropout(dropout_prob)(x_in) if return_sequences: - #x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) - x_out = TimeDistributed(Dense(1,activation=output_activation)) (x_in) + # x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) + x_out = TimeDistributed( + Dense(1, activation=output_activation))(x_in) else: - x_out = Dense(1,activation=output_activation) (x_in) - model = Model(inputs=x_input,outputs=x_out) - #bug with tensorflow/Keras - if conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow': - first_time = "tensorflow" not in sys.modules - import tensorflow as tf - if first_time: - K.get_session().run(tf.global_variables_initializer()) + x_out = Dense(1, activation=output_activation)(x_in) + model = Model(inputs=x_input, outputs=x_out) + # bug with tensorflow/Keras + if (conf['model']['backend'] == 'tf' + or conf['model']['backend'] == 'tensorflow'): + first_time = "tensorflow" not in sys.modules + import tensorflow as tf + if first_time: + K.get_session().run(tf.global_variables_initializer()) model.reset_states() return model def build_train_test_models(self): - return self.build_model(False),self.build_model(True) + return self.build_model(False), self.build_model(True) - def save_model_weights(self,model,epoch): + def save_model_weights(self, model, epoch): save_path = self.get_save_path(epoch) - model.save_weights(save_path,overwrite=True) + model.save_weights(save_path, overwrite=True) - def delete_model_weights(self,model,epoch): + def delete_model_weights(self, model, epoch): save_path = self.get_save_path(epoch) assert(os.path.exists(save_path)) os.remove(save_path) - - def get_save_path(self,epoch): + def get_save_path(self, epoch): unique_id = self.get_unique_id() - return self.conf['paths']['model_save_path'] + 'model.{}._epoch_.{}.h5'.format(unique_id,epoch) + return (self.conf['paths']['model_save_path'] + + 'model.{}._epoch_.{}.h5'.format(unique_id, epoch)) def ensure_save_directory(self): prepath = self.conf['paths']['model_save_path'] makedirs_process_safe(prepath) - def load_model_weights(self,model,custom_path=None): - if custom_path == None: + def load_model_weights(self, model, custom_path=None): + if custom_path is None: epochs = self.get_all_saved_files() if len(epochs) == 0: print('no previous checkpoint found') @@ -248,7 +323,8 @@ def load_model_weights(self,model,custom_path=None): model.load_weights(self.get_save_path(max_epoch)) return max_epoch else: - epoch = self.extract_id_and_epoch_from_filename(os.path.basename(custom_path))[1] + epoch = self.extract_id_and_epoch_from_filename( + os.path.basename(custom_path))[1] model.load_weights(custom_path) print("Loading from custom epoch {}".format(epoch)) return epoch @@ -263,14 +339,12 @@ def get_latest_save_path(self): print('loading from epoch {}'.format(max_epoch)) return self.get_save_path(max_epoch) - - def extract_id_and_epoch_from_filename(self,filename): + def extract_id_and_epoch_from_filename(self, filename): regex = re.compile(r'-?\d+') numbers = [int(x) for x in regex.findall(filename)] - assert(len(numbers) == 3) #id,epoch number and extension - assert(numbers[2] == 5) #.h5 extension - return numbers[0],numbers[1] - + assert(len(numbers) == 3) # id,epoch number and extension + assert(numbers[2] == 5) # .h5 extension + return numbers[0], numbers[1] def get_all_saved_files(self): self.ensure_save_directory() @@ -278,16 +352,15 @@ def get_all_saved_files(self): filenames = os.listdir(self.conf['paths']['model_save_path']) epochs = [] for file in filenames: - curr_id,epoch = self.extract_id_and_epoch_from_filename(file) + curr_id, epoch = self.extract_id_and_epoch_from_filename(file) if curr_id == unique_id: epochs.append(epoch) return epochs - - #FIXME this is essentially the ModelBuilder.build_model - #in the long run we want to replace the space dictionary with the - #regular conf file - I am sure there is a way to accomodate - def hyper_build_model(self,space,predict,custom_batch_size=None): + # FIXME this is essentially the ModelBuilder.build_model + # in the long run we want to replace the space dictionary with the + # regular conf file - I am sure there is a way to accomodate + def hyper_build_model(self, space, predict, custom_batch_size=None): conf = self.conf model_conf = conf['model'] rnn_size = model_conf['rnn_size'] @@ -297,19 +370,19 @@ def hyper_build_model(self,space,predict,custom_batch_size=None): dropout_prob = model_conf['dropout_prob'] length = model_conf['length'] pred_length = model_conf['pred_length'] - skip = model_conf['skip'] + # skip = model_conf['skip'] stateful = model_conf['stateful'] return_sequences = model_conf['return_sequences'] - output_activation = conf['data']['target'].activation#model_conf['output_activation'] + # model_conf['output_activation'] + output_activation = conf['data']['target'].activation num_signals = conf['data']['num_signals'] - batch_size = self.conf['training']['batch_size'] if predict: batch_size = self.conf['model']['pred_batch_size'] - #so we can predict with one time point at a time! + # so we can predict with one time point at a time! if return_sequences: - length =pred_length + length = pred_length else: length = 1 @@ -319,23 +392,31 @@ def hyper_build_model(self,space,predict,custom_batch_size=None): if rnn_type == 'LSTM': rnn_model = LSTM elif rnn_type == 'SimpleRNN': - rnn_model =SimpleRNN + rnn_model = SimpleRNN else: print('Unkown Model Type, exiting.') exit(1) - - batch_input_shape=(batch_size,length, num_signals) + + batch_input_shape = (batch_size, length, num_signals) model = Sequential() for _ in range(model_conf['rnn_layers']): - model.add(rnn_model(rnn_size, return_sequences=return_sequences,batch_input_shape=batch_input_shape, - stateful=stateful,kernel_regularizer=l2(regularization),recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization),dropout=dropout_prob,recurrent_dropout=dropout_prob)) + model.add( + rnn_model( + rnn_size, + return_sequences=return_sequences, + batch_input_shape=batch_input_shape, + stateful=stateful, + kernel_regularizer=l2(regularization), + recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization), + dropout=dropout_prob, + recurrent_dropout=dropout_prob)) model.add(Dropout(space['Dropout'])) if return_sequences: - model.add(TimeDistributed(Dense(1,activation=output_activation))) + model.add(TimeDistributed(Dense(1, activation=output_activation))) else: - model.add(Dense(1,activation=output_activation)) + model.add(Dense(1, activation=output_activation)) model.reset_states() return model diff --git a/plasma/models/custom_loss.py b/plasma/models/custom_loss.py index aaaa03b5..bdc18a9e 100644 --- a/plasma/models/custom_loss.py +++ b/plasma/models/custom_loss.py @@ -1,27 +1,30 @@ import numpy as np -from keras import objectives +# from keras import objectives from keras import backend as K -from keras.losses import hinge, squared_hinge +from keras.losses import squared_hinge _EPSILON = K.epsilon() + def _loss_tensor(y_true, y_pred): - max_val = K.max(y_pred,axis=-2) #temporal axis! - max_val = K.repeat(max_val,K.shape(y_pred)[-2]) + max_val = K.max(y_pred, axis=-2) # temporal axis! + max_val = K.repeat(max_val, K.shape(y_pred)[-2]) print(K.eval(max_val)) - mask = K.cast(K.equal(max_val,y_pred),K.floatx()) + mask = K.cast(K.equal(max_val, y_pred), K.floatx()) y_pred = mask * y_pred + (1-mask) * y_true - return squared_hinge(y_true,y_pred) + return squared_hinge(y_true, y_pred) + def _loss_np(y_true, y_pred): print(y_pred.shape) - max_val = np.max(y_pred,axis=-2) #temporal axis! - max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) - max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) + max_val = np.max(y_pred, axis=-2) # temporal axis! + max_val = np.reshape( + max_val, max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) + max_val = np.tile(max_val, (1, y_pred.shape[-2], 1)) print(max_val.shape) print(max_val) - mask = np.equal(max_val,y_pred) + mask = np.equal(max_val, y_pred) mask = mask.astype(np.float32) y_pred = mask * y_pred + (1-mask) * y_true return np.mean(np.square(np.maximum(1. - y_true * y_pred, 0.)), axis=-1) @@ -38,7 +41,7 @@ def check_loss(_shape): shape = (9, 8, 5, 6, 7) y_a = 1.0*np.ones(shape) - y_b = 0.5+np.random.random(shape) + y_b = 0.5 + np.random.random(shape) print(y_a) print(y_b) @@ -55,10 +58,11 @@ def check_loss(_shape): def test_loss(): - shape_list = ['3d']#, '3d', '4d', '5d'] + shape_list = ['3d'] # , '3d', '4d', '5d'] for _shape in shape_list: check_loss(_shape) print('======================') + if __name__ == '__main__': test_loss() diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 56ba0021..cdc63937 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -14,45 +14,55 @@ from plasma.primitives.shots import Shot import multiprocessing as mp -import pdb +# import pdb + class Loader(object): - ''' - A Python class to ... + '''A Python class to ... - The length of shots in e.g. JET data varies by orders of magnitude. For data parallel - synchronous training it is essential that amounds of train data passed to the model replica is about the same size. - Therefore, a patching technique is introduced. + The length of shots in e.g. JET data varies by orders of magnitude. For + data parallel synchronous training it is essential that amounds of train + data passed to the model replica is about the same size. Therefore, a + patching technique is introduced. + + A patch is a subset of shot's time/signal profile having a fixed length, + equal among all patches. Patch size is approximately equal to the minimum + shot length. More precisely: it is equal to the max(1, + min_len//rnn_length)*rnn_length - the largest number less or equal to the + minimum shot length divisible by the LSTM model length. If minimum shot + length is less than the rnn_length, then the patch length is equal to the + rnn_length - A patch is a subset of shot's time/signal profile having a fixed length, equal among all patches. - Patch size is approximately equal to the minimum shot length. More precisely: it is equal - to the max(1, min_len//rnn_length)*rnn_length - the largest number less or equal to the minimum shot length divisible by the LSTM model length. If minimum shot length is less than the rnn_length, then the patch length is equal to the rnn_length ''' - def __init__(self,conf,normalizer=None): + def __init__(self, conf, normalizer=None): self.conf = conf self.stateful = conf['model']['stateful'] self.normalizer = normalizer self.verbose = True - def set_inference_mode(self,val): + def set_inference_mode(self, val): self.normalizer.set_inference_mode(val) - def training_batch_generator(self,shot_list): - """ - The method implements a training batch generator as a Python generator with a while-loop. - It iterates indefinitely over the data set and returns one mini-batch of data at a time. + def training_batch_generator(self, shot_list): + """The method implements a training batch generator as a Python + generator with a while-loop. It iterates indefinitely over the + data set and returns one mini-batch of data at a time. - NOTE: Can be inefficient during distributed training because one process loading data will - cause all other processes to stall. + NOTE: Can be inefficient during distributed training because one + process loading data will cause all other processes to stall. - Argument list: + Argument list: - shot_list: - Returns: - - One mini-batch of data and label as a Numpy array: X[start:end],y[start:end] - - reset_states_now: boolean flag indicating when to reset state during stateful RNN training - - num_so_far,num_total: number of samples generated so far and the total dataset size as per shot_list + Returns: + - One mini-batch of data and label as a Numpy array: X[start:end], + y[start:end] + - reset_states_now: boolean flag indicating when to reset state + during stateful RNN training + - num_so_far,num_total: number of samples generated so far and the + total dataset size as per shot_list + """ batch_size = self.conf['training']['batch_size'] num_at_once = self.conf['training']['num_shots_at_once'] @@ -60,193 +70,238 @@ def training_batch_generator(self,shot_list): num_so_far = 0 while True: # the list of all shots - shot_list.shuffle() - # split the list into equal-length sublists (random shots will be reused to make them equal length). - shot_sublists = shot_list.sublists(num_at_once,equal_size=True) + shot_list.shuffle() + # split the list into equal-length sublists (random shots will be + # reused to make them equal length). + shot_sublists = shot_list.sublists(num_at_once, equal_size=True) num_total = len(shot_list) - for (i,shot_sublist) in enumerate(shot_sublists): - #produce a list of equal-length chunks from this set of shots - X_list,y_list = self.load_as_X_y_list(shot_sublist) - #Each chunk will be a multiple of the batch size - for j,(X,y) in enumerate(zip(X_list,y_list)): + for (i, shot_sublist) in enumerate(shot_sublists): + # produce a list of equal-length chunks from this set of shots + X_list, y_list = self.load_as_X_y_list(shot_sublist) + # Each chunk will be a multiple of the batch size + for j, (X, y) in enumerate(zip(X_list, y_list)): num_examples = X.shape[0] assert(num_examples % batch_size == 0) num_chunks = num_examples//batch_size """ - The method produces batch-sized training data X and labels y as Numpy arrays to feed during training. - Mini-batch dimensions are (num_examples, num_timesteps, num_dimensions_of_data) - also num_examples has to be divisible by the batch_size. The i-th example and the - (batchsize + 1)-th example are consecutive in time, so we do not reset the - RNN internal state unless we start a new chunk. + The method produces batch-sized training data X and labels + y as Numpy arrays to feed during training. + + Mini-batch dimensions are (num_examples, num_timesteps, + num_dimensions_of_data) also num_examples has to be + divisible by the batch_size. The i-th example and the + (batchsize + 1)-th example are consecutive in time, so we + do not reset the RNN internal state unless we start a new + chunk. + """ for k in range(num_chunks): - #epoch_end = (i == len(shot_sublists) - 1 and j == len(X_list) -1 and k == num_chunks - 1) + # epoch_end = (i == len(shot_sublists) - 1 and j == + # len(X_list) -1 and k == num_chunks - 1) reset_states_now = (k == 0) start = k*batch_size end = (k + 1)*batch_size - num_so_far += 1.0*len(shot_sublist)/(len(X_list)*num_chunks) - yield X[start:end],y[start:end],reset_states_now,num_so_far,num_total + num_so_far += 1.0 * \ + len(shot_sublist)/(len(X_list)*num_chunks) + yield X[start:end], y[start:end], reset_states_now, + num_so_far, num_total epoch += 1 - def fill_training_buffer(self,Xbuff,Ybuff,end_indices,shot,is_first_fill=False): - sig,res = self.get_signal_result_from_shot(shot) + def fill_training_buffer( + self, + Xbuff, + Ybuff, + end_indices, + shot, + is_first_fill=False): + sig, res = self.get_signal_result_from_shot(shot) length = self.conf['model']['length'] - if is_first_fill:#cut signal to random position + if is_first_fill: # cut signal to random position cut_idx = np.random.randint(res.shape[0]-length+1) sig = sig[cut_idx:] res = res[cut_idx:] sig_len = res.shape[0] - sig_len = (sig_len // length)*length #make divisible by lenth + sig_len = (sig_len // length)*length # make divisible by lenth assert(sig_len > 0) batch_idx = np.where(end_indices == 0)[0][0] if sig_len > Xbuff.shape[1]: - Xbuff = self.resize_buffer(Xbuff,sig_len+length) - Ybuff = self.resize_buffer(Ybuff,sig_len+length) - Xbuff[batch_idx,:sig_len,:] = sig[-sig_len:] - Ybuff[batch_idx,:sig_len,:] = res[-sig_len:] + Xbuff = self.resize_buffer(Xbuff, sig_len+length) + Ybuff = self.resize_buffer(Ybuff, sig_len+length) + Xbuff[batch_idx, :sig_len, :] = sig[-sig_len:] + Ybuff[batch_idx, :sig_len, :] = res[-sig_len:] end_indices[batch_idx] += sig_len - #print("Filling buffer at index {}".format(batch_idx)) - return Xbuff,Ybuff,batch_idx + # print("Filling buffer at index {}".format(batch_idx)) + return Xbuff, Ybuff, batch_idx - def return_from_training_buffer(self,Xbuff,Ybuff,end_indices): + def return_from_training_buffer(self, Xbuff, Ybuff, end_indices): length = self.conf['model']['length'] end_indices -= length assert(np.all(end_indices >= 0)) - X = 1.0*Xbuff[:,:length,:] - Y = 1.0*Ybuff[:,:length,:] - self.shift_buffer(Xbuff,length) - self.shift_buffer(Ybuff,length) - return X,Y - - def shift_buffer(self,buff,length): - buff[:,:-length,:] = buff[:,length:,:] + X = 1.0*Xbuff[:, :length, :] + Y = 1.0*Ybuff[:, :length, :] + self.shift_buffer(Xbuff, length) + self.shift_buffer(Ybuff, length) + return X, Y + def shift_buffer(self, buff, length): + buff[:, :-length, :] = buff[:, length:, :] - def resize_buffer(self,buff,new_length): + def resize_buffer(self, buff, new_length): old_length = buff.shape[1] batch_size = buff.shape[0] num_signals = buff.shape[2] - new_buff = np.empty((batch_size,new_length,num_signals),dtype=self.conf['data']['floatx']) - new_buff[:,:old_length,:] = buff - #print("Resizing buffer to new length {}".format(new_length)) + new_buff = np.empty( + (batch_size, + new_length, + num_signals), + dtype=self.conf['data']['floatx']) + new_buff[:, :old_length, :] = buff + # print("Resizing buffer to new length {}".format(new_length)) return new_buff - - - - def training_batch_generator_partial_reset(self,shot_list): + def training_batch_generator_partial_reset(self, shot_list): """ - The method implements a training batch generator as a Python generator with a while-loop. - It iterates indefinitely over the data set and returns one mini-batch of data at a time. + The method implements a training batch generator as a Python generator + with a while-loop. It iterates indefinitely over the data set and + returns one mini-batch of data at a time. - NOTE: Can be inefficient during distributed training because one process loading data will - cause all other processes to stall. + NOTE: Can be inefficient during distributed training because one + process loading data will cause all other processes to stall. - Argument list: + Argument list: - shot_list: - Returns: - - One mini-batch of data and label as a Numpy array: X[start:end],y[start:end] - - reset_states_now: boolean flag indicating when to reset state during stateful RNN training - - num_so_far,num_total: number of samples generated so far and the total dataset size as per shot_list + Returns: + - One mini-batch of data and label as a Numpy array: X[start:end], + y[start:end] + - reset_states_now: boolean flag indicating when to reset state + during stateful RNN training + - num_so_far,num_total: number of samples generated so far and the + total dataset size as per shot_list """ batch_size = self.conf['training']['batch_size'] - length = self.conf['model']['length'] - sig,res = self.get_signal_result_from_shot(shot_list.shots[0]) - Xbuff = np.empty((batch_size,) + sig.shape,dtype=self.conf['data']['floatx']) - Ybuff = np.empty((batch_size,) + res.shape,dtype=self.conf['data']['floatx']) - end_indices = np.zeros(batch_size,dtype=np.int) - batches_to_reset = np.ones(batch_size,dtype=np.bool) + # length = self.conf['model']['length'] + sig, res = self.get_signal_result_from_shot(shot_list.shots[0]) + Xbuff = np.empty((batch_size,) + sig.shape, + dtype=self.conf['data']['floatx']) + Ybuff = np.empty((batch_size,) + res.shape, + dtype=self.conf['data']['floatx']) + end_indices = np.zeros(batch_size, dtype=np.int) + batches_to_reset = np.ones(batch_size, dtype=np.bool) # epoch = 0 num_total = len(shot_list) num_so_far = 0 returned = False num_steps = 0 warmup_steps = self.conf['training']['batch_generator_warmup_steps'] - is_warmup_period = num_steps < warmup_steps + is_warmup_period = num_steps < warmup_steps is_first_fill = num_steps < batch_size while True: # the list of all shots - shot_list.shuffle() + shot_list.shuffle() for i in range(len(shot_list)): if self.conf['training']['ranking_difficulty_fac'] == 1.0: if self.conf['data']['equalize_classes']: shot = shot_list.sample_equal_classes() else: shot = shot_list.shots[i] - else: #draw the shot weighted + else: # draw the shot weighted shot = shot_list.sample_weighted() while not np.any(end_indices == 0): - X,Y = self.return_from_training_buffer(Xbuff,Ybuff,end_indices) - yield X,Y,batches_to_reset,num_so_far,num_total,is_warmup_period + X, Y = self.return_from_training_buffer( + Xbuff, Ybuff, end_indices) + yield (X, Y, batches_to_reset, num_so_far, num_total, + is_warmup_period) returned = True num_steps += 1 is_warmup_period = num_steps < warmup_steps is_first_fill = num_steps < batch_size batches_to_reset[:] = False - Xbuff,Ybuff,batch_idx = self.fill_training_buffer(Xbuff,Ybuff,end_indices,shot,is_first_fill) + Xbuff, Ybuff, batch_idx = self.fill_training_buffer( + Xbuff, Ybuff, end_indices, shot, is_first_fill) batches_to_reset[batch_idx] = True if returned and not is_warmup_period: num_so_far += 1 # epoch += 1 - def fill_batch_queue(self,shot_list,queue): + def fill_batch_queue(self, shot_list, queue): print("Starting thread to fill queue") gen = self.training_batch_generator_partial_reset(shot_list) while True: ret = next(gen) - queue.put(ret,block=True,timeout=-1) + queue.put(ret, block=True, timeout=-1) - - def training_batch_generator_process(self,shot_list): + def training_batch_generator_process(self, shot_list): queue = mp.Queue() - proc = mp.Process(target = self.fill_batch_queue,args=(shot_list,queue)) + proc = mp.Process( + target=self.fill_batch_queue, args=( + shot_list, queue)) proc.start() while True: yield queue.get(True) proc.join() queue.close() - def load_as_X_y_list(self,shot_list,verbose=False,prediction_mode=False): + def load_as_X_y_list( + self, + shot_list, + verbose=False, + prediction_mode=False): """ - The method turns a ShotList into a set of equal-sized patches which contain a number of examples - that is a multiple of the batch size. - Initially, shots are "light" meaning signal amd disruption related attributes are not filled. - By invoking Loader.get_signals_results_from_shotlist the shot information is filled and stored in - the object in memory. Next, patches are made, finally patches are arranged into batch input shape expected by RNN model. - - Performs calls to: get_signals_results_from_shotlist, make_patches, arange_patches + The method turns a ShotList into a set of equal-sized patches which + contain a number of examples that is a multiple of the batch size. + Initially, shots are "light" meaning signal amd disruption related + attributes are not filled. + By invoking Loader.get_signals_results_from_shotlist the + shot information is filled and stored in the object in memory. Next, + patches are made, finally patches are arranged into batch input shape + expected by RNN model. + + Performs calls to: get_signals_results_from_shotlist, make_patches, + arange_patches Argument list: - shot_list: a ShotList - verbose: TO BE DEPRECATED, self.verbose data member is used instead - prediction_mode: unused - + Returns: - X_list,y_list: lists of Numpy arrays of batch input shape + """ - signals,results,total_length = self.get_signals_results_from_shotlist(shot_list) - sig_patches, res_patches = self.make_patches(signals,results) + # TODO(KGF): check tuple unpack + (signals, results, + total_length) = self.get_signals_results_from_shotlist(shot_list) + sig_patches, res_patches = self.make_patches(signals, results) - X_list,y_list = self.arange_patches(sig_patches,res_patches) + X_list, y_list = self.arange_patches(sig_patches, res_patches) effective_length = len(res_patches)*len(res_patches[0]) if self.verbose: - print('multiplication factor: {}'.format(1.0*effective_length/total_length)) - print('effective/total length : {}/{}'.format(effective_length,total_length)) - print('patch length: {} num patches: {}'.format(len(res_patches[0]),len(res_patches))) - return X_list,y_list - - def load_as_X_y_pred(self,shot_list,verbose=False,custom_batch_size=None): - signals,results,shot_lengths,disruptive = self.get_signals_results_from_shotlist(shot_list,prediction_mode=True) - sig_patches, res_patches = self.make_prediction_patches(signals,results) - X,y = self.arange_patches_single(sig_patches,res_patches,prediction_mode=True,custom_batch_size=custom_batch_size) - return X,y,shot_lengths,disruptive - - - def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): + print('multiplication factor: {}'.format( + 1.0 * effective_length / total_length)) + print('effective/total length : {}/{}'.format( + effective_length, total_length)) + print('patch length: {} num patches: {}'.format( + len(res_patches[0]), len(res_patches))) + return X_list, y_list + + def load_as_X_y_pred(self, shot_list, verbose=False, + custom_batch_size=None): + (signals, results, shot_lengths, + disruptive) = self.get_signals_results_from_shotlist( + shot_list, prediction_mode=True) + sig_patches, res_patches = self.make_prediction_patches(signals, + results) + X, y = self.arange_patches_single(sig_patches, res_patches, + prediction_mode=True, + custom_batch_size=custom_batch_size) + return X, y, shot_lengths, disruptive + + def get_signals_results_from_shotlist(self, shot_list, + prediction_mode=False): prepath = self.conf['paths']['processed_prepath'] use_signals = self.conf['paths']['use_signals'] signals = [] @@ -255,20 +310,20 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): shot_lengths = [] total_length = 0 for shot in shot_list: - assert(isinstance(shot,Shot)) + assert(isinstance(shot, Shot)) assert(shot.valid) shot.restore(prepath) if self.normalizer is not None: self.normalizer.apply(shot) else: - print('Warning, no normalization. Training data may be poorly conditioned') - - + print('Warning, no normalization. ', + 'Training data may be poorly conditioned') if self.conf['training']['use_mock_data']: - signal,ttd = self.get_mock_data() - ttd,signal = shot.get_data_arrays(use_signals,self.conf['data']['floatx']) + signal, ttd = self.get_mock_data() + ttd, signal = shot.get_data_arrays( + use_signals, self.conf['data']['floatx']) if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) @@ -279,29 +334,31 @@ def get_signals_results_from_shotlist(self,shot_list,prediction_mode=False): shot_lengths.append(len(ttd)) disruptive.append(shot.is_disruptive) if len(ttd.shape) == 1: - results.append(np.expand_dims(ttd,axis=1)) + results.append(np.expand_dims(ttd, axis=1)) else: results.append(ttd) shot.make_light() if not prediction_mode: - return signals,results,total_length + return signals, results, total_length else: - return signals,results,shot_lengths,disruptive + return signals, results, shot_lengths, disruptive - def get_signal_result_from_shot(self,shot,prediction_mode=False): + def get_signal_result_from_shot(self, shot, prediction_mode=False): prepath = self.conf['paths']['processed_prepath'] use_signals = self.conf['paths']['use_signals'] - assert(isinstance(shot,Shot)) + assert(isinstance(shot, Shot)) assert(shot.valid) shot.restore(prepath) if self.normalizer is not None: self.normalizer.apply(shot) else: - print('Warning, no normalization. Training data may be poorly conditioned') + print('Warning, no normalization. ', + 'Training data may be poorly conditioned') if self.conf['training']['use_mock_data']: - signal,ttd = self.get_mock_data() - ttd,signal = shot.get_data_arrays(use_signals,self.conf['data']['floatx']) + signal, ttd = self.get_mock_data() + ttd, signal = shot.get_data_arrays( + use_signals, self.conf['data']['floatx']) if len(ttd) < self.conf['model']['length']: print(ttd) print(shot) @@ -310,15 +367,14 @@ def get_signal_result_from_shot(self,shot,prediction_mode=False): exit(1) if len(ttd.shape) == 1: - ttd = np.expand_dims(ttd,axis=1) + ttd = np.expand_dims(ttd, axis=1) shot.make_light() if not prediction_mode: - return signal,ttd + return signal, ttd else: - return signal,ttd,shot.is_disruptive + return signal, ttd, shot.is_disruptive - - def batch_output_to_array(self,output,batch_size = None): + def batch_output_to_array(self, output, batch_size=None): if batch_size is None: batch_size = self.conf['model']['pred_batch_size'] assert(output.shape[0] % batch_size == 0) @@ -328,152 +384,171 @@ def batch_output_to_array(self,output,batch_size = None): outs = [] for patch_idx in range(batch_size): - out = np.empty((num_chunks*num_timesteps,feature_size)) + out = np.empty((num_chunks*num_timesteps, feature_size)) for chunk in range(num_chunks): - out[chunk*num_timesteps:(chunk+1)*num_timesteps,:] = output[chunk*batch_size+patch_idx,:,:] + out[chunk*num_timesteps:(chunk + 1)*num_timesteps, :] = output[ + chunk * batch_size + patch_idx, :, :] outs.append(out) - return outs - + return outs - def make_deterministic_patches(self,signals,results): + def make_deterministic_patches(self, signals, results): num_timesteps = self.conf['model']['length'] sig_patches = [] res_patches = [] - min_len = self.get_min_len(signals,num_timesteps) - for sig,res in zip(signals,results): - sig_patch, res_patch = self.make_deterministic_patches_from_single_array(sig,res,min_len) + min_len = self.get_min_len(signals, num_timesteps) + for sig, res in zip(signals, results): + (sig_patch, + res_patch) = self.make_deterministic_patches_from_single_array( + sig, res, min_len) sig_patches += sig_patch res_patches += res_patch return sig_patches, res_patches - def make_deterministic_patches_from_single_array(self,sig,res,min_len): + def make_deterministic_patches_from_single_array(self, sig, res, min_len): sig_patches = [] res_patches = [] if len(sig) <= min_len: print('signal length: {}'.format(len(sig))) assert(min_len <= len(sig)) - for start in range(0,len(sig)-min_len,min_len): + for start in range(0, len(sig)-min_len, min_len): sig_patches.append(sig[start:start+min_len]) res_patches.append(res[start:start+min_len]) sig_patches.append(sig[-min_len:]) res_patches.append(res[-min_len:]) - return sig_patches,res_patches + return sig_patches, res_patches - def make_random_patches(self,signals,results,num): + def make_random_patches(self, signals, results, num): num_timesteps = self.conf['model']['length'] sig_patches = [] res_patches = [] - min_len = self.get_min_len(signals,num_timesteps) + min_len = self.get_min_len(signals, num_timesteps) for i in range(num): - idx= np.random.randint(len(signals)) - sig_patch, res_patch = self.make_random_patch_from_array(signals[idx],results[idx],min_len) + idx = np.random.randint(len(signals)) + sig_patch, res_patch = self.make_random_patch_from_array( + signals[idx], results[idx], min_len) sig_patches.append(sig_patch) res_patches.append(res_patch) - return sig_patches,res_patches + return sig_patches, res_patches - def make_random_patch_from_array(self,sig,res,min_len): + def make_random_patch_from_array(self, sig, res, min_len): start = np.random.randint(len(sig) - min_len+1) - return sig[start:start+min_len],res[start:start+min_len] - + return sig[start:start+min_len], res[start:start+min_len] - def get_min_len(self,arrs,length): - min_len = min([len(a) for a in arrs] + [self.conf['training']['max_patch_length']]) - min_len = max(1,min_len // length) * length + def get_min_len(self, arrs, length): + min_len = min([len(a) for a in arrs] + + [self.conf['training']['max_patch_length']]) + min_len = max(1, min_len // length) * length return min_len - - def get_max_len(self,arrs,length): + def get_max_len(self, arrs, length): max_len = max([len(a) for a in arrs]) - max_len = int(np.ceil(1.0*max_len / length) * length ) + max_len = int(np.ceil(1.0*max_len / length) * length) return max_len - def make_patches(self,signals,results): - """ - A patch is a subset of shot's time/signal profile having a fixed length, equal among all patches. - Patch size is approximately equal to the minimum shot length. More precisely: it is equal - to the max(1, min_len//rnn_length)*rnn_length - the largest number less or equal to the minimum shot length divisible by the LSTM model length. If minimum shot length is less than the rnn_length, then the patch length is equal to the rnn_length + def make_patches(self, signals, results): + """A patch is a subset of shot's time/signal profile having a fixed + length, equal among all patches. Patch size is approximately equal to + the minimum shot length. More precisely: it is equal to the max(1, + min_len//rnn_length)*rnn_length - the largest number less or equal to + the minimum shot length divisible by the LSTM model length. If minimum + shot length is less than the rnn_length, then the patch length is equal + to the rnn_length - Since shot lengthes are not multiples of the minimum shot length in general, - some non-deterministic fraction of patches is created. See: + Since shot lengthes are not multiples of the minimum shot length in + general, some non-deterministic fraction of patches is created. See: Deterministic patching: Random patching: - Argument list: - - signals: a list of 1D Numpy array of doubles containing signal values (a plasma property). - Numpy arrays are shot-sized - - results: a list of 1D Numpy array of doubles containing disruption times or -1 if a shot - is non-disruptive. Numpy arrays are shot-sized + Argument list: + - signals: a list of 1D Numpy array of doubles containing signal + values (a plasma property). Numpy arrays are shot-sized + - results: a list of 1D Numpy array of doubles containing disruption + times or -1 if a shot is non-disruptive. Numpy arrays are shot-sized - NOTE: signals and results are parallel lists. Since Arrays are shot-sized, the shape veries across the list + NOTE: signals and results are parallel lists. Since Arrays are + shot-sized, the shape veries across the list + + + Returns: + - sig_patches_det + sig_patches_rand: (concatenated) list of 1D Numpy + arrays of doubles containing signal values. Numpy arrays are + patch-sized + - res_patches_det + res_patches_rand: (concatenated) a list of 1D + Numpy array of doubles containing disruption times or -1 if a shot is + non-disruptive. Numpy arrays are patch-sized + NOTE: sig_patches_det + sig_patches_rand and res_patches_det + + res_patches_rand are prallel lists. All arrays in the list have + identical shapes. - Returns: - - sig_patches_det + sig_patches_rand: (concatenated) list of 1D Numpy arrays of doubles containing signal values. - Numpy arrays are patch-sized - - res_patches_det + res_patches_rand: (concatenated) a list of 1D Numpy array of doubles containing disruption times - or -1 if a shot is non-disruptive. Numpy arrays are patch-sized - NOTE: sig_patches_det + sig_patches_rand and res_patches_det + res_patches_rand are prallel lists - All arrays in the list have identical shapes. """ - total_num = self.conf['training']['batch_size'] - sig_patches_det,res_patches_det = self.make_deterministic_patches(signals,results) + total_num = self.conf['training']['batch_size'] + sig_patches_det, res_patches_det = self.make_deterministic_patches( + signals, results) num_already = len(sig_patches_det) - + total_num = int(np.ceil(1.0 * num_already / total_num)) * total_num - + num_additional = total_num - num_already assert(num_additional >= 0) - sig_patches_rand,res_patches_rand = self.make_random_patches(signals,results,num_additional) + sig_patches_rand, res_patches_rand = self.make_random_patches( + signals, results, num_additional) if self.verbose: - print('random to deterministic ratio: {}/{}'.format(num_additional,num_already)) - return sig_patches_det + sig_patches_rand,res_patches_det + res_patches_rand - - - def make_prediction_patches(self,signals,results): - #total_num = self.conf['training']['batch_size'] + print( + 'random to deterministic ratio: {}/{}'.format(num_additional, + num_already)) + return (sig_patches_det + sig_patches_rand, + res_patches_det + res_patches_rand) + + def make_prediction_patches(self, signals, results): + # total_num = self.conf['training']['batch_size'] num_timesteps = self.conf['model']['pred_length'] sig_patches = [] res_patches = [] - max_len = self.get_max_len(signals,num_timesteps) - for sig,res in zip(signals,results): - sig_patches.append(Loader.pad_array_to_length(sig,max_len)) - res_patches.append(Loader.pad_array_to_length(res,max_len)) + max_len = self.get_max_len(signals, num_timesteps) + for sig, res in zip(signals, results): + sig_patches.append(Loader.pad_array_to_length(sig, max_len)) + res_patches.append(Loader.pad_array_to_length(res, max_len)) return sig_patches, res_patches @staticmethod - def pad_array_to_length(arr,length): - dlength = max(0,length - arr.shape[0]) - tuples = [(0,dlength)] + def pad_array_to_length(arr, length): + dlength = max(0, length - arr.shape[0]) + tuples = [(0, dlength)] for l in arr.shape[1:]: - tuples.append((0,0)) - return np.pad(arr,tuples,mode='constant',constant_values=0) - - + tuples.append((0, 0)) + return np.pad(arr, tuples, mode='constant', constant_values=0) - - def arange_patches(self,sig_patches,res_patches): + def arange_patches(self, sig_patches, res_patches): num_timesteps = self.conf['model']['length'] batch_size = self.conf['training']['batch_size'] - assert(len(sig_patches) % batch_size == 0) #fixed number of batches - assert(len(sig_patches[0]) % num_timesteps == 0) #divisible by length of RNN sequence + assert(len(sig_patches) % batch_size == 0) # fixed number of batches + # divisible by length of RNN sequence + assert(len(sig_patches[0]) % num_timesteps == 0) num_batches = len(sig_patches) // batch_size - #patch_length = len(sig_patches[0]) + # patch_length = len(sig_patches[0]) - zipped = list(zip(sig_patches,res_patches)) + zipped = list(zip(sig_patches, res_patches)) np.random.shuffle(zipped) - sig_patches, res_patches = zip(*zipped) + sig_patches, res_patches = zip(*zipped) X_list = [] y_list = [] for i in range(num_batches): - X,y = self.arange_patches_single(sig_patches[i*batch_size:(i+1)*batch_size], - res_patches[i*batch_size:(i+1)*batch_size]) + X, y = self.arange_patches_single( + sig_patches[i*batch_size:(i+1)*batch_size], + res_patches[i*batch_size:(i+1)*batch_size]) X_list.append(X) y_list.append(y) - return X_list,y_list - - def arange_patches_single(self,sig_patches,res_patches,prediction_mode=False,custom_batch_size=None): + return X_list, y_list + + def arange_patches_single( + self, + sig_patches, + res_patches, + prediction_mode=False, + custom_batch_size=None): if prediction_mode: num_timesteps = self.conf['model']['pred_length'] batch_size = self.conf['model']['pred_batch_size'] @@ -492,27 +567,32 @@ def arange_patches_single(self,sig_patches,res_patches,prediction_mode=False,cus num_answers = 1 else: num_answers = res_patches[0].shape[1] - - X = np.zeros((num_chunks*batch_size,num_timesteps,num_dimensions_of_data)) + + X = np.zeros( + (num_chunks*batch_size, + num_timesteps, + num_dimensions_of_data)) if return_sequences: - y = np.zeros((num_chunks*batch_size,num_timesteps,num_answers)) + y = np.zeros((num_chunks*batch_size, num_timesteps, num_answers)) else: - y = np.zeros((num_chunks*batch_size,num_answers)) + y = np.zeros((num_chunks*batch_size, num_answers)) - for chunk_idx in range(num_chunks): src_start = chunk_idx*num_timesteps src_end = (chunk_idx+1)*num_timesteps for patch_idx in range(batch_size): - X[chunk_idx*batch_size + patch_idx,:,:] = sig_patches[patch_idx][src_start:src_end] + X[chunk_idx*batch_size + patch_idx, :, + :] = sig_patches[patch_idx][src_start:src_end] if return_sequences: - y[chunk_idx*batch_size + patch_idx,:,:] = res_patches[patch_idx][src_start:src_end] + y[chunk_idx*batch_size + patch_idx, :, + :] = res_patches[patch_idx][src_start:src_end] else: - y[chunk_idx*batch_size + patch_idx,:] = res_patches[patch_idx][src_end-1] - return X,y + y[chunk_idx*batch_size + patch_idx, + :] = res_patches[patch_idx][src_end-1] + return X, y - def load_as_X_y(self,shot,verbose=False,prediction_mode=False): - assert(isinstance(shot,Shot)) + def load_as_X_y(self, shot, verbose=False, prediction_mode=False): + assert(isinstance(shot, Shot)) assert(shot.valid) prepath = self.conf['paths']['processed_prepath'] return_sequences = self.conf['model']['return_sequences'] @@ -521,111 +601,116 @@ def load_as_X_y(self,shot,verbose=False,prediction_mode=False): if self.normalizer is not None: self.normalizer.apply(shot) else: - print('Warning, no normalization. Training data may be poorly conditioned') - + print('Warning, no normalization. ', + 'Training data may be poorly conditioned') signals = shot.signals ttd = shot.ttd if self.conf['training']['use_mock_data']: - signals,ttd = self.get_mock_data() + signals, ttd = self.get_mock_data() # if not self.stateful: # X,y = self.array_to_path_and_external_pred(signals,ttd) # else: - X,y = self.array_to_path_and_external_pred_cut(signals,ttd, - return_sequences=return_sequences,prediction_mode=prediction_mode) + X, y = self.array_to_path_and_external_pred_cut( + signals, ttd, return_sequences=return_sequences, + prediction_mode=prediction_mode) shot.make_light() - return X,y#X,y + return X, y # X,y def get_mock_data(self): - signals = linspace(0,4*pi,10000) - rand_idx = randint(6000) - lgth = randint(1000,3000) + signals = np.linspace(0, 4*np.pi, 10000) + rand_idx = np.randint(6000) + lgth = np.randint(1000, 3000) signals = signals[rand_idx:rand_idx+lgth] - #ttd[-100:] = 1 - signals = vstack([signals]*8) + # ttd[-100:] = 1 + signals = np.vstack([signals]*8) signals = signals.T - signals[:,0] = 0.5 + 0.5*sin(signals[:,0]) - signals[:,1] = 0.5# + 0.5*cos(signals[:,1]) - signals[:,2] = 0.5 + 0.5*sin(2*signals[:,2]) - signals[:,3:] *= 0 + signals[:, 0] = 0.5 + 0.5*np.sin(signals[:, 0]) + signals[:, 1] = 0.5 # + 0.5*cos(signals[:,1]) + signals[:, 2] = 0.5 + 0.5*np.sin(2*signals[:, 2]) + signals[:, 3:] *= 0 offset = 100 - ttd = 0.0*signals[:,0] - ttd[offset:] = 1.0*signals[:-offset,0] - mask = ttd > mean(ttd) + ttd = 0.0*signals[:, 0] + ttd[offset:] = 1.0*signals[:-offset, 0] + mask = ttd > np.mean(ttd) ttd[~mask] = 0 - #mean(signals[:,:2],1) - return signals,ttd - - def array_to_path_and_external_pred_cut(self,arr,res,return_sequences=False,prediction_mode=False): + # mean(signals[:,:2],1) + return signals, ttd + + def array_to_path_and_external_pred_cut( + self, + arr, + res, + return_sequences=False, + prediction_mode=False): num_timesteps = self.conf['model']['length'] skip = self.conf['model']['skip'] if prediction_mode: num_timesteps = self.conf['model']['pred_length'] if not return_sequences: num_timesteps = 1 - skip = num_timesteps #batchsize = 1! - assert(shape(arr)[0] == shape(res)[0]) + skip = num_timesteps # batchsize = 1! + assert(np.shape(arr)[0] == np.shape(res)[0]) num_chunks = len(arr) // num_timesteps arr = arr[-num_chunks*num_timesteps:] res = res[-num_chunks*num_timesteps:] - assert(shape(arr)[0] == shape(res)[0]) + assert(np.shape(arr)[0] == np.shape(res)[0]) X = [] y = [] i = 0 chunk_range = range(num_chunks-1) - i_range = range(1,num_timesteps+1,skip) + i_range = range(1, num_timesteps+1, skip) if prediction_mode: chunk_range = range(num_chunks) i_range = range(1) - for chunk in chunk_range: for i in i_range: start = chunk*num_timesteps + i assert(start + num_timesteps <= len(arr)) - X.append(arr[start:start+num_timesteps,:]) + X.append(arr[start:start+num_timesteps, :]) if return_sequences: y.append(res[start:start+num_timesteps]) else: y.append(res[start+num_timesteps-1:start+num_timesteps]) - X = array(X) - y = array(y) - if len(shape(X)) == 1: - X = np.expand_dims(X,axis=len(shape(X))) + X = np.array(X) + y = np.array(y) + if len(np.shape(X)) == 1: + X = np.expand_dims(X, axis=len(np.shape(X))) if return_sequences: - y = np.expand_dims(y,axis=len(shape(y))) - return X,y + y = np.expand_dims(y, axis=len(np.shape(y))) + return X, y @staticmethod - def get_batch_size(batch_size,prediction_mode): + def get_batch_size(batch_size, prediction_mode): if prediction_mode: return 1 else: - return batch_size#Loader.get_num_skips(length,skip) + return batch_size # Loader.get_num_skips(length,skip) @staticmethod - def get_num_skips(length,skip): + def get_num_skips(length, skip): return 1 + (length-1)//skip class ProcessGenerator(object): - def __init__(self,generator): + def __init__(self, generator): self.generator = generator self.proc = mp.Process(target=self.fill_batch_queue) self.queue = mp.Queue() self.proc.start() - + def fill_batch_queue(self): print("Starting process to fetch data") while True: - self.queue.put(next(self.generator),True) + self.queue.put(next(self.generator), True) def __next__(self): return self.queue.get(True) - + def next(self): return self.__next__() diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 35181d68..e092d8b7 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -1,3 +1,16 @@ +from __future__ import print_function +from plasma.primitives.ops import mpi_sum_f16 +from plasma.utils.performance import PerformanceAnalyzer +from plasma.utils.processing import concatenate_sublists +from plasma.utils.evaluation import get_loss_from_list +from plasma.models import builder +from plasma.models.loader import ProcessGenerator +from plasma.utils.state_reset import reset_states # , get_states +from plasma.conf import conf +from pprint import pprint +from mpi4py import MPI +# import mpi4py +# import getpass ''' ######################################################### This file trains a deep learning model to predict @@ -14,9 +27,8 @@ ######################################################### ''' -from __future__ import print_function import os -import sys +import sys import time import datetime import numpy as np @@ -25,20 +37,14 @@ from functools import partial import socket sys.setrecursionlimit(10000) -import getpass -#import keras sequentially because it otherwise reads from ~/.keras/keras.json with too many threads. -#from mpi_launch_tensorflow import get_mpi_task_index -import mpi4py -from mpi4py import MPI +# import keras sequentially because it otherwise reads from ~/.keras/keras.json +# with too many threads: +# from mpi_launch_tensorflow import get_mpi_task_index comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() -from pprint import pprint -from plasma.conf import conf -from plasma.utils.state_reset import reset_states,get_states -from plasma.models.loader import ProcessGenerator NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS @@ -46,511 +52,621 @@ backend = conf['model']['backend'] if backend == 'tf' or backend == 'tensorflow': - if NUM_GPUS > 1: os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU)#,mode=NanGuardMode' + if NUM_GPUS > 1: + os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format( + MY_GPU) # ,mode=NanGuardMode' os.environ['KERAS_BACKEND'] = 'tensorflow' import tensorflow as tf from keras.backend.tensorflow_backend import set_session - gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95, allow_growth=True) + gpu_options = tf.GPUOptions( + per_process_gpu_memory_fraction=0.95, + allow_growth=True) config = tf.ConfigProto(gpu_options=gpu_options) set_session(tf.Session(config=config)) else: os.environ['KERAS_BACKEND'] = 'theano' - base_compile_dir = '{}/tmp/{}-{}'.format(conf['paths']['output_path'],socket.gethostname(),task_index) - os.environ['THEANO_FLAGS'] = 'device=gpu{},floatX=float32,base_compiledir={}'.format(MY_GPU,base_compile_dir)#,mode=NanGuardMode' - import theano -#import keras + base_compile_dir = '{}/tmp/{}-{}'.format( + conf['paths']['output_path'], socket.gethostname(), task_index) + os.environ['THEANO_FLAGS'] = ( + 'device=gpu{},floatX=float32,base_compiledir={}'.format( + MY_GPU, base_compile_dir)) # ,mode=NanGuardMode' + # import theano +# import keras for i in range(num_workers): - comm.Barrier() - if i == task_index: - print('[{}] importing Keras'.format(task_index)) - from keras import backend as K - from keras.optimizers import * - from keras.utils.generic_utils import Progbar - import keras.callbacks as cbks + comm.Barrier() + if i == task_index: + print('[{}] importing Keras'.format(task_index)) + from keras import backend as K + # from keras.optimizers import * + from keras.utils.generic_utils import Progbar + import keras.callbacks as cbks -from plasma.models import builder -from plasma.utils.evaluation import get_loss_from_list -from plasma.utils.processing import concatenate_sublists -from plasma.utils.performance import PerformanceAnalyzer -from plasma.primitives.ops import mpi_sum_f16 if task_index == 0: pprint(conf) - class MPIOptimizer(object): - def __init__(self,lr): - self.lr = lr - self.iterations = 0 + def __init__(self, lr): + self.lr = lr + self.iterations = 0 + + def get_deltas(self, raw_deltas): + raise NotImplementedError - def get_deltas(self,raw_deltas): - raise NotImplementedError + def set_lr(self, lr): + self.lr = lr - def set_lr(self,lr): - self.lr = lr class MPISGD(MPIOptimizer): - def __init__(self,lr): - super(MPISGD,self).__init__(lr) + def __init__(self, lr): + super(MPISGD, self).__init__(lr) + + def get_deltas(self, raw_deltas): + deltas = [] + for g in raw_deltas: + deltas.append(self.lr*g) - def get_deltas(self,raw_deltas): - deltas = [] - for g in raw_deltas: - deltas.append(self.lr*g) + self.iterations += 1 + return deltas - self.iterations += 1 - return deltas class MPIMomentumSGD(MPIOptimizer): def __init__(self, lr): super(MPIMomentumSGD, self).__init__(lr) self.momentum = 0.9 - def get_deltas(self, raw_deltas): + def get_deltas(self, raw_deltas): deltas = [] if self.iterations == 0: self.velocity_list = [np.zeros_like(g) for g in raw_deltas] - for (i,g) in enumerate(raw_deltas): - self.velocity_list[i] = self.momentum * self.velocity_list[i] + self.lr * g + for (i, g) in enumerate(raw_deltas): + self.velocity_list[i] = ( + self.momentum * self.velocity_list[i] + self.lr * g) deltas.append(self.velocity_list[i]) self.iterations += 1 return deltas + class MPIAdam(MPIOptimizer): - def __init__(self,lr): - super(MPIAdam,self).__init__(lr) - self.beta_1 = 0.9 - self.beta_2 = 0.999 - self.eps = 1e-8 + def __init__(self, lr): + super(MPIAdam, self).__init__(lr) + self.beta_1 = 0.9 + self.beta_2 = 0.999 + self.eps = 1e-8 - def get_deltas(self,raw_deltas): + def get_deltas(self, raw_deltas): - if self.iterations == 0: - self.m_list = [np.zeros_like(g) for g in raw_deltas] - self.v_list = [np.zeros_like(g) for g in raw_deltas] + if self.iterations == 0: + self.m_list = [np.zeros_like(g) for g in raw_deltas] + self.v_list = [np.zeros_like(g) for g in raw_deltas] - t = self.iterations + 1 - lr_t = self.lr * np.sqrt(1-self.beta_2**t)/(1-self.beta_1**t) - deltas = [] - for (i,g) in enumerate(raw_deltas): - m_t = (self.beta_1 * self.m_list[i]) + (1 - self.beta_1) * g - v_t = (self.beta_2 * self.v_list[i]) + (1 - self.beta_2) * (g**2) - delta_t = lr_t * m_t / (np.sqrt(v_t) + self.eps) - deltas.append(delta_t) - self.m_list[i] = m_t - self.v_list[i] = v_t + t = self.iterations + 1 + lr_t = self.lr * np.sqrt(1-self.beta_2**t)/(1-self.beta_1**t) + deltas = [] + for (i, g) in enumerate(raw_deltas): + m_t = (self.beta_1 * self.m_list[i]) + (1 - self.beta_1) * g + v_t = (self.beta_2 * self.v_list[i]) + (1 - self.beta_2) * (g**2) + delta_t = lr_t * m_t / (np.sqrt(v_t) + self.eps) + deltas.append(delta_t) + self.m_list[i] = m_t + self.v_list[i] = v_t - self.iterations += 1 + self.iterations += 1 - return deltas + return deltas class Averager(object): - def __init__(self): - self.steps = 0 - self.val = 0.0 + def __init__(self): + self.steps = 0 + self.val = 0.0 - def add_val(self,val): - self.val = (self.steps * self.val + 1.0 * val)/(self.steps + 1.0) - self.steps += 1 + def add_val(self, val): + self.val = (self.steps * self.val + 1.0 * val)/(self.steps + 1.0) + self.steps += 1 - def get_val(self): - return self.val + def get_val(self): + return self.val class MPIModel(): - def __init__(self,model,optimizer,comm,batch_iterator,batch_size,num_replicas=None,warmup_steps=1000,lr=0.01,num_batches_minimum=100): - random.seed(task_index) - np.random.seed(task_index) - self.start_time = time.time() - self.epoch = 0 - self.num_so_far = 0 - self.num_so_far_accum = 0 - self.num_so_far_indiv = 0 - self.model = model - self.optimizer = optimizer - self.max_lr = 0.1 - self.DUMMY_LR = 0.001 - self.comm = comm - self.batch_size = batch_size - self.batch_iterator = batch_iterator - self.set_batch_iterator_func() - self.warmup_steps=warmup_steps - self.num_batches_minimum=num_batches_minimum - self.num_workers = comm.Get_size() - self.task_index = comm.Get_rank() - self.history = cbks.History() - self.model.stop_training = False - if num_replicas is None or num_replicas < 1 or num_replicas > self.num_workers: - self.num_replicas = self.num_workers - else: - self.num_replicas = num_replicas - self.lr = lr/(1.0+self.num_replicas/100.0) if (lr < self.max_lr) else self.max_lr/(1.0+self.num_replicas/100.0) - - - def set_batch_iterator_func(self): - self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) - - def close(self): - self.batch_iterator_func.__exit__() - - def set_lr(self,lr): - self.lr = lr - - def save_weights(self,path,overwrite=False): - self.model.save_weights(path,overwrite=overwrite) - - def load_weights(self,path): - self.model.load_weights(path) - - def compile(self,optimizer,clipnorm,loss='mse'): - if optimizer == 'sgd': - optimizer_class = SGD(lr=self.DUMMY_LR,clipnorm=clipnorm) - elif optimizer == 'momentum_sgd': - optimizer_class = SGD(lr=self.DUMMY_LR, clipnorm=clipnorm, decay=1e-6, momentum=0.9) - elif optimizer == 'tf_momentum_sgd': - optimizer_class = TFOptimizer(tf.train.MomentumOptimizer(learning_rate=self.DUMMY_LR,momentum=0.9)) - elif optimizer == 'adam': - optimizer_class = Adam(lr=self.DUMMY_LR,clipnorm=clipnorm) - elif optimizer == 'tf_adam': - optimizer_class = TFOptimizer(tf.train.AdamOptimizer(learning_rate=self.DUMMY_LR)) - elif optimizer == 'rmsprop': - optimizer_class = RMSprop(lr=self.DUMMY_LR,clipnorm=clipnorm) - elif optimizer == 'nadam': - optimizer_class = Nadam(lr=self.DUMMY_LR,clipnorm=clipnorm) - else: - print("Optimizer not implemented yet") - exit(1) - self.model.compile(optimizer=optimizer_class,loss=loss) - self.ensure_equal_weights() - - def ensure_equal_weights(self): - if task_index == 0: - new_weights = self.model.get_weights() - else: - new_weights = None - nw = comm.bcast(new_weights,root=0) - self.model.set_weights(nw) - - - - def train_on_batch_and_get_deltas(self,X_batch,Y_batch,verbose=False): - ''' - The purpose of the method is to perform a single gradient update over one mini-batch for one model replica. - Given a mini-batch, it first accesses the current model weights, performs single gradient update over one mini-batch, - gets new model weights, calculates weight updates (deltas) by subtracting weight scalars, applies the learning rate. - - It performs calls to: subtract_params, multiply_params - - Argument list: - - X_batch: input data for one mini-batch as a Numpy array - - Y_batch: labels for one mini-batch as a Numpy array - - verbose: set verbosity level (currently unused) - - Returns: - - deltas: a list of model weight updates - - loss: scalar training loss - ''' - weights_before_update = self.model.get_weights() - - loss = self.model.train_on_batch(X_batch,Y_batch) - - weights_after_update = self.model.get_weights() - self.model.set_weights(weights_before_update) - - #unscale before subtracting - weights_before_update = multiply_params(weights_before_update,1.0/self.DUMMY_LR) - weights_after_update = multiply_params(weights_after_update,1.0/self.DUMMY_LR) - - deltas = subtract_params(weights_after_update,weights_before_update) - - #unscale loss - if conf['model']['loss_scale_factor'] != 1.0: - deltas = multiply_params(deltas,1.0/conf['model']['loss_scale_factor']) - - return deltas,loss - - - def get_new_weights(self,deltas): - return add_params(self.model.get_weights(),deltas) - - def mpi_average_gradients(self,arr,num_replicas=None): - if num_replicas == None: - num_replicas = self.num_workers - if self.task_index >= num_replicas: - arr *= 0.0 - arr_global = np.empty_like(arr) - if K.floatx() == 'float16': - self.comm.Allreduce(arr,arr_global,op=mpi_sum_f16) - else: - self.comm.Allreduce(arr,arr_global,op=MPI.SUM) - arr_global /= num_replicas - return arr_global - - - - def mpi_average_scalars(self,val,num_replicas=None): - ''' - The purpose of the method is to calculate a simple scalar arithmetic mean over num_replicas. - - It performs calls to: MPIModel.mpi_sum_scalars - - Argument list: - - val: value averaged, scalar - - num_replicas: the size of the ensemble an average is perfromed over - - Returns: - - val_global: scalar arithmetic mean over num_replicas - ''' - val_global = self.mpi_sum_scalars(val,num_replicas) - val_global /= num_replicas - return val_global - - - def mpi_sum_scalars(self,val,num_replicas=None): - ''' - The purpose of the method is to calculate a simple scalar arithmetic mean over num_replicas using MPI allreduce action with fixed op=MPI.SIM - - Argument list: - - val: value averaged, scalar - - num_replicas: the size of the ensemble an average is perfromed over - - Returns: - - val_global: scalar arithmetic mean over num_replicas - ''' - if num_replicas == None: - num_replicas = self.num_workers - if self.task_index >= num_replicas: - val *= 0.0 - val_global = 0.0 - val_global = self.comm.allreduce(val,op=MPI.SUM) - return val_global - - - - def sync_deltas(self,deltas,num_replicas=None): - global_deltas = [] - #default is to reduce the deltas from all workers - for delta in deltas: - global_deltas.append(self.mpi_average_gradients(delta,num_replicas)) - return global_deltas - - def set_new_weights(self,deltas,num_replicas=None): - global_deltas = self.sync_deltas(deltas,num_replicas) - effective_lr = self.get_effective_lr(num_replicas) - - self.optimizer.set_lr(effective_lr) - global_deltas = self.optimizer.get_deltas(global_deltas) - - new_weights = self.get_new_weights(global_deltas) - self.model.set_weights(new_weights) - - def build_callbacks(self,conf,callbacks_list): - ''' - The purpose of the method is to set up logging and history. It is based on Keras Callbacks - https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py - - Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. - Other possible callbacks to add in future: RemoteMonitor, LearningRateScheduler - - Argument list: - - conf: There is a "callbacks" section in conf.yaml file. Relevant parameters are: - list: Parameter specifying additional callbacks, read in the driver script and passed as an argument of type list (see next arg) - metrics: List of quantities monitored during training and validation - mode: one of {auto, min, max}. The decision to overwrite the current save file is made based on either the maximization or the minimization of the monitored quantity. For val_acc, this should be max, for val_loss this should be min, etc. In auto mode, the direction is automatically inferred from the name of the monitored quantity. - monitor: Quantity used for early stopping, has to be from the list of metrics - patience: Number of epochs used to decide on whether to apply early stopping or continue training - - callbacks_list: uses callbacks.list configuration parameter, specifies the list of additional callbacks - Returns: modified list of callbacks - ''' - - mode = conf['callbacks']['mode'] - monitor = conf['callbacks']['monitor'] - patience = conf['callbacks']['patience'] - csvlog_save_path = conf['paths']['csvlog_save_path'] - #CSV callback is on by default - if not os.path.exists(csvlog_save_path): - os.makedirs(csvlog_save_path) - - callbacks_list = conf['callbacks']['list'] - - callbacks = [cbks.BaseLogger()] - callbacks += [self.history] - callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(csvlog_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] - - if "earlystop" in callbacks_list: - callbacks += [cbks.EarlyStopping(patience=patience, monitor=monitor, mode=mode)] - if "lr_scheduler" in callbacks_list: - pass - - return cbks.CallbackList(callbacks) - - def train_epoch(self): - ''' - The purpose of the method is to perform distributed mini-batch SGD for one epoch. - It takes the batch iterator function and a NN model from MPIModel object, fetches mini-batches - in a while-loop until number of samples seen by the ensemble of workers (num_so_far) exceeds the - training dataset size (num_total). - - During each iteration, the gradient updates (deltas) and the loss are calculated for each model replica - in the ensemble, weights are averaged over ensemble, and the new weights are set. - - It performs calls to: MPIModel.get_deltas, MPIModel.set_new_weights methods - - Argument list: Empty - - Returns: - - step: epoch number - - ave_loss: training loss averaged over replicas - - curr_loss: - - num_so_far: the number of samples seen by ensemble of replicas to a current epoch (step) - - Intermediate outputs and logging: debug printout of task_index (MPI), epoch number, number of samples seen to - a current epoch, average training loss - ''' - - verbose = False - first_run = True - step = 0 - loss_averager = Averager() - t_start = time.time() - - batch_iterator_func = self.batch_iterator_func - num_total = 1 - ave_loss = -1 - curr_loss = -1 - t0 = 0 - t1 = 0 - t2 = 0 - - while (self.num_so_far-self.epoch*num_total) < num_total or step < self.num_batches_minimum: - - try: - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator_func) - except StopIteration: - print("Resetting batch iterator.") - self.num_so_far_accum = self.num_so_far_indiv - self.set_batch_iterator_func() - batch_iterator_func = self.batch_iterator_func - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator_func) - self.num_so_far_indiv = self.num_so_far_accum+num_so_far_curr - - # if batches_to_reset: - # self.model.reset_states(batches_to_reset) - - warmup_phase = (step < self.warmup_steps and self.epoch == 0) - num_replicas = 1 if warmup_phase else self.num_replicas - - self.num_so_far = self.mpi_sum_scalars(self.num_so_far_indiv,num_replicas) - - #run the model once to force compilation. Don't actually use these values. - if first_run: - first_run = False - t0_comp = time.time() - _,_ = self.train_on_batch_and_get_deltas(batch_xs,batch_ys,verbose) - self.comm.Barrier() - sys.stdout.flush() - print_unique('Compilation finished in {:.2f}s'.format(time.time()-t0_comp)) + def __init__( + self, + model, + optimizer, + comm, + batch_iterator, + batch_size, + num_replicas=None, + warmup_steps=1000, + lr=0.01, + num_batches_minimum=100): + random.seed(task_index) + np.random.seed(task_index) + self.start_time = time.time() + self.epoch = 0 + self.num_so_far = 0 + self.num_so_far_accum = 0 + self.num_so_far_indiv = 0 + self.model = model + self.optimizer = optimizer + self.max_lr = 0.1 + self.DUMMY_LR = 0.001 + self.comm = comm + self.batch_size = batch_size + self.batch_iterator = batch_iterator + self.set_batch_iterator_func() + self.warmup_steps = warmup_steps + self.num_batches_minimum = num_batches_minimum + self.num_workers = comm.Get_size() + self.task_index = comm.Get_rank() + self.history = cbks.History() + self.model.stop_training = False + if (num_replicas is None or num_replicas < 1 + or num_replicas > self.num_workers): + self.num_replicas = self.num_workers + else: + self.num_replicas = num_replicas + self.lr = ( + lr/(1.0+self.num_replicas/100.0) if (lr < self.max_lr) + else self.max_lr/(1.0+self.num_replicas/100.0) + ) + + def set_batch_iterator_func(self): + self.batch_iterator_func = ProcessGenerator(self.batch_iterator()) + + def close(self): + self.batch_iterator_func.__exit__() + + def set_lr(self, lr): + self.lr = lr + + def save_weights(self, path, overwrite=False): + self.model.save_weights(path, overwrite=overwrite) + + def load_weights(self, path): + self.model.load_weights(path) + + def compile(self, optimizer, clipnorm, loss='mse'): + # TODO(KGF): check the following import taken from runner.py + # Was not in this file, originally. + from keras.optimizers import SGD, Adam, RMSprop, Nadam, TFOptimizer + if optimizer == 'sgd': + optimizer_class = SGD(lr=self.DUMMY_LR, clipnorm=clipnorm) + elif optimizer == 'momentum_sgd': + optimizer_class = SGD( + lr=self.DUMMY_LR, + clipnorm=clipnorm, + decay=1e-6, + momentum=0.9) + elif optimizer == 'tf_momentum_sgd': + optimizer_class = TFOptimizer( + tf.train.MomentumOptimizer( + learning_rate=self.DUMMY_LR, + momentum=0.9)) + elif optimizer == 'adam': + optimizer_class = Adam(lr=self.DUMMY_LR, clipnorm=clipnorm) + elif optimizer == 'tf_adam': + optimizer_class = TFOptimizer( + tf.train.AdamOptimizer( + learning_rate=self.DUMMY_LR)) + elif optimizer == 'rmsprop': + optimizer_class = RMSprop(lr=self.DUMMY_LR, clipnorm=clipnorm) + elif optimizer == 'nadam': + optimizer_class = Nadam(lr=self.DUMMY_LR, clipnorm=clipnorm) + else: + print("Optimizer not implemented yet") + exit(1) + self.model.compile(optimizer=optimizer_class, loss=loss) + self.ensure_equal_weights() + + def ensure_equal_weights(self): + if task_index == 0: + new_weights = self.model.get_weights() + else: + new_weights = None + nw = comm.bcast(new_weights, root=0) + self.model.set_weights(nw) + + def train_on_batch_and_get_deltas(self, X_batch, Y_batch, verbose=False): + ''' + The purpose of the method is to perform a single gradient update over + one mini-batch for one model replica. Given a mini-batch, it first + accesses the current model weights, performs single gradient update + over one mini-batch, gets new model weights, calculates weight updates + (deltas) by subtracting weight scalars, applies the learning rate. + + It performs calls to: subtract_params, multiply_params + + Argument list: + - X_batch: input data for one mini-batch as a Numpy array + - Y_batch: labels for one mini-batch as a Numpy array + - verbose: set verbosity level (currently unused) + + Returns: + - deltas: a list of model weight updates + - loss: scalar training loss + + ''' + weights_before_update = self.model.get_weights() + + loss = self.model.train_on_batch(X_batch, Y_batch) + + weights_after_update = self.model.get_weights() + self.model.set_weights(weights_before_update) + + # unscale before subtracting + weights_before_update = multiply_params( + weights_before_update, 1.0/self.DUMMY_LR) + weights_after_update = multiply_params( + weights_after_update, 1.0/self.DUMMY_LR) + + deltas = subtract_params(weights_after_update, weights_before_update) + + # unscale loss + if conf['model']['loss_scale_factor'] != 1.0: + deltas = multiply_params( + deltas, 1.0/conf['model']['loss_scale_factor']) + + return deltas, loss + + def get_new_weights(self, deltas): + return add_params(self.model.get_weights(), deltas) + + def mpi_average_gradients(self, arr, num_replicas=None): + if num_replicas is None: + num_replicas = self.num_workers + if self.task_index >= num_replicas: + arr *= 0.0 + arr_global = np.empty_like(arr) + if K.floatx() == 'float16': + self.comm.Allreduce(arr, arr_global, op=mpi_sum_f16) + else: + self.comm.Allreduce(arr, arr_global, op=MPI.SUM) + arr_global /= num_replicas + return arr_global + + def mpi_average_scalars(self, val, num_replicas=None): + ''' + The purpose of the method is to calculate a simple scalar arithmetic + mean over num_replicas. + + It performs calls to: MPIModel.mpi_sum_scalars + + Argument list: + - val: value averaged, scalar + - num_replicas: the size of the ensemble an average is perfromed over + + Returns: + - val_global: scalar arithmetic mean over num_replicas + ''' + val_global = self.mpi_sum_scalars(val, num_replicas) + val_global /= num_replicas + return val_global + + def mpi_sum_scalars(self, val, num_replicas=None): + ''' + The purpose of the method is to calculate a simple scalar arithmetic + mean over num_replicas using MPI allreduce action with fixed op=MPI.SIM + + Argument list: + - val: value averaged, scalar + - num_replicas: the size of the ensemble an average is perfromed over + + Returns: + - val_global: scalar arithmetic mean over num_replicas + ''' + if num_replicas is None: + num_replicas = self.num_workers + if self.task_index >= num_replicas: + val *= 0.0 + val_global = 0.0 + val_global = self.comm.allreduce(val, op=MPI.SUM) + return val_global + + def sync_deltas(self, deltas, num_replicas=None): + global_deltas = [] + # default is to reduce the deltas from all workers + for delta in deltas: + global_deltas.append( + self.mpi_average_gradients( + delta, num_replicas)) + return global_deltas + + def set_new_weights(self, deltas, num_replicas=None): + global_deltas = self.sync_deltas(deltas, num_replicas) + effective_lr = self.get_effective_lr(num_replicas) + + self.optimizer.set_lr(effective_lr) + global_deltas = self.optimizer.get_deltas(global_deltas) + + new_weights = self.get_new_weights(global_deltas) + self.model.set_weights(new_weights) + + def build_callbacks(self, conf, callbacks_list): + ''' + The purpose of the method is to set up logging and history. It is based + on Keras Callbacks + https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py + + Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. + Other possible callbacks to add in future: RemoteMonitor, + LearningRateScheduler + + Argument list: + - conf: There is a "callbacks" section in conf.yaml file. + + Relevant parameters are: + - list: Parameter specifying additional callbacks, read + in the driver script and passed as an argument of type list (see next + arg) + + - metrics: List of quantities monitored during training and validation + + - mode: one of {auto, min, max}. The decision to overwrite the current + save file is made based on either the maximization or the minimization + of the monitored quantity. For val_acc, this should be max, for + val_loss this should be min, etc. In auto mode, the direction is + automatically inferred from the name of the monitored quantity. + + -monitor: Quantity used for early stopping, has to + be from the list of metrics + + - patience: Number of epochs used to decide on whether to apply early + stopping or continue training + + - callbacks_list: uses callbacks.list configuration parameter, + specifies the list of additional callbacks Returns: modified list of + callbacks + + ''' + + mode = conf['callbacks']['mode'] + monitor = conf['callbacks']['monitor'] + patience = conf['callbacks']['patience'] + csvlog_save_path = conf['paths']['csvlog_save_path'] + # CSV callback is on by default + if not os.path.exists(csvlog_save_path): + os.makedirs(csvlog_save_path) + + callbacks_list = conf['callbacks']['list'] + + callbacks = [cbks.BaseLogger()] + callbacks += [self.history] + callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format( + csvlog_save_path, + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] + + if "earlystop" in callbacks_list: + callbacks += [ + cbks.EarlyStopping( + patience=patience, + monitor=monitor, + mode=mode)] + if "lr_scheduler" in callbacks_list: + pass + + return cbks.CallbackList(callbacks) + + def train_epoch(self): + ''' + The purpose of the method is to perform distributed mini-batch SGD for + one epoch. It takes the batch iterator function and a NN model from + MPIModel object, fetches mini-batches in a while-loop until number of + samples seen by the ensemble of workers (num_so_far) exceeds the + training dataset size (num_total). + + During each iteration, the gradient updates (deltas) and the loss are + calculated for each model replica in the ensemble, weights are averaged + over ensemble, and the new weights are set. + + It performs calls to: MPIModel.get_deltas, MPIModel.set_new_weights + methods + + Argument list: Empty + + Returns: + - step: epoch number + - ave_loss: training loss averaged over replicas + - curr_loss: + - num_so_far: the number of samples seen by ensemble of replicas to a + current epoch (step) + + + Intermediate outputs and logging: debug printout of task_index (MPI), + epoch number, number of samples seen to a current epoch, average + training loss + + ''' + + verbose = False + first_run = True + step = 0 + loss_averager = Averager() t_start = time.time() - sys.stdout.flush() - - if np.any(batches_to_reset): - reset_states(self.model,batches_to_reset) - - t0 = time.time() - deltas,loss = self.train_on_batch_and_get_deltas(batch_xs,batch_ys,verbose) - t1 = time.time() - if not is_warmup_period: - self.set_new_weights(deltas,num_replicas) - t2 = time.time() - write_str_0 = self.calculate_speed(t0,t1,t2,num_replicas) - - curr_loss = self.mpi_average_scalars(1.0*loss,num_replicas) - #if self.task_index == 0: - #print(self.model.get_weights()[0][0][:4]) - loss_averager.add_val(curr_loss) - ave_loss = loss_averager.get_val() - eta = self.estimate_remaining_time(t0 - t_start,self.num_so_far-self.epoch*num_total,num_total) - write_str = '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], loss: {:.5f} [{:.5f}] | walltime: {:.4f} | '.format(self.task_index,step,eta,1.0*self.num_so_far,num_total,ave_loss,curr_loss,time.time()-self.start_time) - print_unique(write_str + write_str_0) - step += 1 - else: - print_unique('\r[{}] warmup phase, num so far: {}'.format(self.task_index,self.num_so_far)) - - - - - effective_epochs = 1.0*self.num_so_far/num_total - epoch_previous = self.epoch - self.epoch = effective_epochs - print_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed) in {:.2f} seconds.\n'.format(1.0*self.epoch,self.epoch-epoch_previous,t2 - t_start)) - return (step,ave_loss,curr_loss,self.num_so_far,effective_epochs) - - - def estimate_remaining_time(self,time_so_far,work_so_far,work_total): - eps = 1e-6 - total_time = 1.0*time_so_far*work_total/(work_so_far + eps) - return total_time - time_so_far - - def get_effective_lr(self,num_replicas): - effective_lr = self.lr * num_replicas - if effective_lr > self.max_lr: - print_unique('Warning: effective learning rate set to {}, larger than maximum {}. Clipping.'.format(effective_lr,self.max_lr)) - effective_lr = self.max_lr - return effective_lr - - def get_effective_batch_size(self,num_replicas): - return self.batch_size*num_replicas - - def calculate_speed(self,t0,t_after_deltas,t_after_update,num_replicas,verbose=False): - effective_batch_size = self.get_effective_batch_size(num_replicas) - t_calculate = t_after_deltas - t0 - t_sync = t_after_update - t_after_deltas - t_tot = t_after_update - t0 - - examples_per_sec = effective_batch_size/t_tot - frac_calculate = t_calculate/t_tot - frac_sync = t_sync/t_tot - - print_str = '{:.2E} Examples/sec | {:.2E} sec/batch [{:.1%} calc., {:.1%} synch.]'.format(examples_per_sec,t_tot,frac_calculate,frac_sync) - print_str += '[batch = {} = {}*{}] [lr = {:.2E} = {:.2E}*{}]'.format(effective_batch_size,self.batch_size,num_replicas,self.get_effective_lr(num_replicas),self.lr,num_replicas) - if verbose: - print_unique(print_str) - return print_str + batch_iterator_func = self.batch_iterator_func + num_total = 1 + ave_loss = -1 + curr_loss = -1 + t0 = 0 + t1 = 0 + t2 = 0 + + while ( + self.num_so_far + - self.epoch + * num_total) < num_total or step < self.num_batches_minimum: + + try: + (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, + num_total, is_warmup_period) = next(batch_iterator_func) + except StopIteration: + print("Resetting batch iterator.") + self.num_so_far_accum = self.num_so_far_indiv + self.set_batch_iterator_func() + batch_iterator_func = self.batch_iterator_func + (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, + num_total, is_warmup_period) = next(batch_iterator_func) + self.num_so_far_indiv = self.num_so_far_accum + num_so_far_curr + + # if batches_to_reset: + # self.model.reset_states(batches_to_reset) + + warmup_phase = (step < self.warmup_steps and self.epoch == 0) + num_replicas = 1 if warmup_phase else self.num_replicas + + self.num_so_far = self.mpi_sum_scalars( + self.num_so_far_indiv, num_replicas) + + # run the model once to force compilation. Don't actually use these + # values. + if first_run: + first_run = False + t0_comp = time.time() + _, _ = self.train_on_batch_and_get_deltas( + batch_xs, batch_ys, verbose) + self.comm.Barrier() + sys.stdout.flush() + print_unique( + 'Compilation finished in {:.2f}s'.format( + time.time()-t0_comp)) + t_start = time.time() + sys.stdout.flush() + + if np.any(batches_to_reset): + reset_states(self.model, batches_to_reset) + + t0 = time.time() + deltas, loss = self.train_on_batch_and_get_deltas( + batch_xs, batch_ys, verbose) + t1 = time.time() + if not is_warmup_period: + self.set_new_weights(deltas, num_replicas) + t2 = time.time() + write_str_0 = self.calculate_speed(t0, t1, t2, num_replicas) + + curr_loss = self.mpi_average_scalars(1.0*loss, num_replicas) + # if self.task_index == 0: + # print(self.model.get_weights()[0][0][:4]) + loss_averager.add_val(curr_loss) + ave_loss = loss_averager.get_val() + eta = self.estimate_remaining_time( + t0 - t_start, + self.num_so_far - self.epoch*num_total, num_total) + write_str = ( + '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], '.format( + self.task_index, step, eta, + 1.0*self.num_so_far, num_total) + + 'loss: {:.5f} [{:.5f}] | '.format(ave_loss, curr_loss) + + 'walltime: {:.4f} | '.format( + time.time() - self.start_time)) + print_unique(write_str + write_str_0) + step += 1 + else: + print_unique('\r[{}] warmup phase, num so far: {}'.format( + self.task_index, self.num_so_far)) + + effective_epochs = 1.0*self.num_so_far/num_total + epoch_previous = self.epoch + self.epoch = effective_epochs + print_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed)'.format( + 1.0 * self.epoch, self.epoch - epoch_previous) + + ' in {:.2f} seconds.\n'.format(t2 - t_start)) + return (step, ave_loss, curr_loss, self.num_so_far, effective_epochs) + + def estimate_remaining_time(self, time_so_far, work_so_far, work_total): + eps = 1e-6 + total_time = 1.0*time_so_far*work_total/(work_so_far + eps) + return total_time - time_so_far + + def get_effective_lr(self, num_replicas): + effective_lr = self.lr * num_replicas + if effective_lr > self.max_lr: + print_unique('Warning: effective learning rate set to {}, '.format( + effective_lr) + + 'larger than maximum {}. Clipping.'.format( + self.max_lr)) + effective_lr = self.max_lr + return effective_lr + + def get_effective_batch_size(self, num_replicas): + return self.batch_size*num_replicas + + def calculate_speed( + self, + t0, + t_after_deltas, + t_after_update, + num_replicas, + verbose=False): + effective_batch_size = self.get_effective_batch_size(num_replicas) + t_calculate = t_after_deltas - t0 + t_sync = t_after_update - t_after_deltas + t_tot = t_after_update - t0 + + examples_per_sec = effective_batch_size/t_tot + frac_calculate = t_calculate/t_tot + frac_sync = t_sync/t_tot + + print_str = ( + '{:.2E} Examples/sec | {:.2E} sec/batch '.format(examples_per_sec, + t_tot) + + '[{:.1%} calc., {:.1%} synch.]'.format(frac_calculate, + frac_sync)) + print_str += '[batch = {} = {}*{}] [lr = {:.2E} = {:.2E}*{}]'.format( + effective_batch_size, + self.batch_size, + num_replicas, + self.get_effective_lr(num_replicas), + self.lr, + num_replicas) + if verbose: + print_unique(print_str) + return print_str def print_unique(print_str): - if task_index == 0: - sys.stdout.write(print_str) - sys.stdout.flush() + if task_index == 0: + sys.stdout.write(print_str) + sys.stdout.flush() + def print_all(print_str): - sys.stdout.write('[{}] '.format(task_index) + print_str) - sys.stdout.flush() + sys.stdout.write('[{}] '.format(task_index) + print_str) + sys.stdout.flush() + +def multiply_params(params, eps): + return [el*eps for el in params] -def multiply_params(params,eps): - return [el*eps for el in params] -def subtract_params(params1,params2): - return [p1 - p2 for p1,p2 in zip(params1,params2)] +def subtract_params(params1, params2): + return [p1 - p2 for p1, p2 in zip(params1, params2)] -def add_params(params1,params2): - return [p1 + p2 for p1,p2 in zip(params1,params2)] + +def add_params(params1, params2): + return [p1 + p2 for p1, p2 in zip(params1, params2)] def get_shot_list_path(conf): - return conf['paths']['base_path'] + '/normalization/shot_lists.npz' #kyle: not compatible with flexible conf.py hierarchy + # KGF: not compatible with flexible conf.py hierarchy + return conf['paths']['base_path'] + '/normalization/shot_lists.npz' + -def save_shotlists(conf,shot_list_train,shot_list_validate,shot_list_test): +def save_shotlists(conf, shot_list_train, shot_list_validate, shot_list_test): path = get_shot_list_path(conf) - np.savez(path,shot_list_train=shot_list_train,shot_list_validate=shot_list_validate,shot_list_test=shot_list_test) + np.savez( + path, + shot_list_train=shot_list_train, + shot_list_validate=shot_list_validate, + shot_list_test=shot_list_test) + def load_shotlists(conf): path = get_shot_list_path(conf) @@ -558,36 +674,40 @@ def load_shotlists(conf): shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] - return shot_list_train,shot_list_validate,shot_list_test + return shot_list_train, shot_list_validate, shot_list_test + +# shot_list_train, shot_list_validate, shot_list_test = load_shotlists(conf) -#shot_list_train,shot_list_validate,shot_list_test = load_shotlists(conf) -def mpi_make_predictions(conf,shot_list,loader,custom_path=None): +def mpi_make_predictions(conf, shot_list, loader, custom_path=None): loader.set_inference_mode(True) np.random.seed(task_index) - shot_list.sort()#make sure all replicas have the same list - specific_builder = builder.ModelBuilder(conf) + shot_list.sort() # make sure all replicas have the same list + specific_builder = builder.ModelBuilder(conf) y_prime = [] y_gold = [] disruptive = [] model = specific_builder.build_model(True) - specific_builder.load_model_weights(model,custom_path) + specific_builder.load_model_weights(model, custom_path) - #broadcast model weights then set it explicitely: fix for Py3.6 + # broadcast model weights then set it explicitely: fix for Py3.6 if sys.version_info[0] > 2: if task_index == 0: new_weights = model.get_weights() else: new_weights = None - nw = comm.bcast(new_weights,root=0) + nw = comm.bcast(new_weights, root=0) model.set_weights(nw) model.reset_states() if task_index == 0: - pbar = Progbar(len(shot_list)) - shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'],do_shuffle=False,equal_size=True) + pbar = Progbar(len(shot_list)) + shot_sublists = shot_list.sublists( + conf['model']['pred_batch_size'], + do_shuffle=False, + equal_size=True) y_prime_global = [] y_gold_global = [] @@ -595,39 +715,36 @@ def mpi_make_predictions(conf,shot_list,loader,custom_path=None): if task_index != 0: loader.verbose = False - for (i,shot_sublist) in enumerate(shot_sublists): + for (i, shot_sublist) in enumerate(shot_sublists): if i % num_workers == task_index: - X,y,shot_lengths,disr = loader.load_as_X_y_pred(shot_sublist) - + X, y, shot_lengths, disr = loader.load_as_X_y_pred(shot_sublist) - - #load data and fit on data - y_p = model.predict(X,batch_size=conf['model']['pred_batch_size']) + # load data and fit on data + y_p = model.predict(X, batch_size=conf['model']['pred_batch_size']) model.reset_states() y_p = loader.batch_output_to_array(y_p) y = loader.batch_output_to_array(y) - #cut arrays back - y_p = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y_p)] - y = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y)] + # cut arrays back + y_p = [arr[:shot_lengths[j]] for (j, arr) in enumerate(y_p)] + y = [arr[:shot_lengths[j]] for (j, arr) in enumerate(y)] - # print('Shots {}/{}'.format(i*num_at_once + j*1.0*len(shot_sublist)/len(X_list),len(shot_list_train))) y_prime += y_p y_gold += y disruptive += disr # print_all('\nFinished with i = {}'.format(i)) - if i % num_workers == num_workers -1 or i == len(shot_sublists) - 1: + if i % num_workers == num_workers - 1 or i == len(shot_sublists) - 1: comm.Barrier() y_prime_global += concatenate_sublists(comm.allgather(y_prime)) y_gold_global += concatenate_sublists(comm.allgather(y_gold)) - disruptive_global += concatenate_sublists(comm.allgather(disruptive)) + disruptive_global += concatenate_sublists( + comm.allgather(disruptive)) comm.Barrier() y_prime = [] y_gold = [] disruptive = [] - # print_all('\nFinished subepoch with lists len(y_prime_global), gold, disruptive = {},{},{}'.format(len(y_prime_global),len(y_gold_global),len(disruptive_global))) if task_index == 0: pbar.add(1.0*len(shot_sublist)) @@ -637,19 +754,28 @@ def mpi_make_predictions(conf,shot_list,loader,custom_path=None): disruptive_global = disruptive_global[:len(shot_list)] loader.set_inference_mode(False) - return y_prime_global,y_gold_global,disruptive_global + return y_prime_global, y_gold_global, disruptive_global -def mpi_make_predictions_and_evaluate(conf,shot_list,loader,custom_path=None): - y_prime,y_gold,disruptive = mpi_make_predictions(conf,shot_list,loader,custom_path) +def mpi_make_predictions_and_evaluate( + conf, shot_list, loader, custom_path=None): + y_prime, y_gold, disruptive = mpi_make_predictions( + conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss + roc_area = analyzer.get_roc_area(y_prime, y_gold, disruptive) + shot_list.set_weights( + analyzer.get_shot_difficulty( + y_prime, y_gold, disruptive)) + loss = get_loss_from_list(y_prime, y_gold, conf['data']['target']) + return y_prime, y_gold, disruptive, roc_area, loss -def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=None): +def mpi_train( + conf, + shot_list_train, + shot_list_validate, + loader, + callbacks_list=None): loader.set_inference_mode(False) conf['num_workers'] = comm.Get_size() @@ -657,7 +783,7 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non specific_builder = builder.ModelBuilder(conf) train_model = specific_builder.build_model(False) - #load the latest epoch we did. Returns -1 if none exist yet + # load the latest epoch we did. Returns -1 if none exist yet e = specific_builder.load_model_weights(train_model) e_old = e @@ -671,7 +797,8 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non if 'adam' in conf['model']['optimizer']: optimizer = MPIAdam(lr=lr) - elif conf['model']['optimizer'] == 'sgd' or conf['model']['optimizer'] == 'tf_sgd': + elif (conf['model']['optimizer'] == 'sgd' + or conf['model']['optimizer'] == 'tf_sgd'): optimizer = MPISGD(lr=lr) elif 'momentum_sgd' in conf['model']['optimizer']: optimizer = MPIMomentumSGD(lr=lr) @@ -681,30 +808,45 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('{} epochs left to go'.format(num_epochs - 1 - e)) - # batch_generator = partial(loader.training_batch_generator,shot_list=shot_list_train) - batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) - #{}batch_generator = partial(loader.training_batch_generator_process,shot_list=shot_list_train) + batch_generator = partial( + loader.training_batch_generator_partial_reset, + shot_list=shot_list_train) print("warmup {}".format(warmup_steps)) - mpi_model = MPIModel(train_model,optimizer,comm,batch_generator,batch_size,lr=lr,warmup_steps = warmup_steps,num_batches_minimum=num_batches_minimum) - mpi_model.compile(conf['model']['optimizer'],clipnorm,conf['data']['target'].loss) + mpi_model = MPIModel( + train_model, + optimizer, + comm, + batch_generator, + batch_size, + lr=lr, + warmup_steps=warmup_steps, + num_batches_minimum=num_batches_minimum) + mpi_model.compile( + conf['model']['optimizer'], + clipnorm, + conf['data']['target'].loss) tensorboard = None if backend != "theano" and task_index == 0: tensorboard_save_path = conf['paths']['tensorboard_save_path'] write_grads = conf['callbacks']['write_grads'] - tensorboard = TensorBoard(log_dir=tensorboard_save_path,histogram_freq=1,write_graph=True,write_grads=write_grads) + tensorboard = TensorBoard( + log_dir=tensorboard_save_path, + histogram_freq=1, + write_graph=True, + write_grads=write_grads) tensorboard.set_model(mpi_model.model) mpi_model.model.summary() if task_index == 0: - callbacks = mpi_model.build_callbacks(conf,callbacks_list) + callbacks = mpi_model.build_callbacks(conf, callbacks_list) callbacks.set_model(mpi_model.model) callback_metrics = conf['callbacks']['metrics'] callbacks.set_params({ - 'epochs': num_epochs, - 'metrics': callback_metrics, - 'batch_size': batch_size, + 'epochs': num_epochs, + 'metrics': callback_metrics, + 'batch_size': batch_size, }) callbacks.on_train_begin() if conf['callbacks']['mode'] == 'max': @@ -718,29 +860,36 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non if task_index == 0: callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) - print_unique('\nEpoch {}/{}'.format(e,num_epochs)) + print_unique('\nEpoch {}/{}'.format(e, num_epochs)) - (step,ave_loss,curr_loss,num_so_far,effective_epochs) = mpi_model.train_epoch() + (step, ave_loss, curr_loss, num_so_far, + effective_epochs) = mpi_model.train_epoch() e = e_old + effective_epochs - loader.verbose=False #True during the first iteration - if task_index == 0: - specific_builder.save_model_weights(train_model,int(round(e))) + loader.verbose = False # True during the first iteration + if task_index == 0: + specific_builder.save_model_weights(train_model, int(round(e))) epoch_logs = {} - - _,_,_,roc_area,loss = mpi_make_predictions_and_evaluate(conf,shot_list_validate,loader) + + _, _, _, roc_area, loss = mpi_make_predictions_and_evaluate( + conf, shot_list_validate, loader) if conf['training']['ranking_difficulty_fac'] != 1.0: - _,_,_,roc_area_train,loss_train = mpi_make_predictions_and_evaluate(conf,shot_list_train,loader) - batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + (_, _, _, roc_area_train, + loss_train) = mpi_make_predictions_and_evaluate( + conf, shot_list_train, loader) + batch_generator = partial( + loader.training_batch_generator_partial_reset, + shot_list=shot_list_train) mpi_model.batch_iterator = batch_generator mpi_model.batch_iterator_func.__exit__() mpi_model.num_so_far_accum = mpi_model.num_so_far_indiv mpi_model.set_batch_iterator_func() - epoch_logs['val_roc'] = roc_area + epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss - best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']],best_so_far) + best_so_far = cmp_fn( + epoch_logs[conf['callbacks']['monitor']], best_so_far) if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) @@ -752,17 +901,23 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non print('Training ROC: {:.4f}'.format(roc_area_train)) callbacks.on_epoch_end(int(round(e)), epoch_logs) - if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + # only save model weights if quantity we are tracking is improving + if best_so_far != epoch_logs[conf['callbacks']['monitor']]: print("Not saving model weights") - specific_builder.delete_model_weights(train_model,int(round(e))) + specific_builder.delete_model_weights( + train_model, int(round(e))) - #tensorboard + # tensorboard if backend != 'theano': - val_generator = partial(loader.training_batch_generator,shot_list=shot_list_validate)() + val_generator = partial( + loader.training_batch_generator, + shot_list=shot_list_validate)() val_steps = 1 - tensorboard.on_epoch_end(val_generator,val_steps,int(round(e)),epoch_logs) + tensorboard.on_epoch_end( + val_generator, val_steps, int( + round(e)), epoch_logs) - stop_training = comm.bcast(mpi_model.model.stop_training,root=0) + stop_training = comm.bcast(mpi_model.model.stop_training, root=0) if stop_training: print("Stopping training due to early stopping") break @@ -776,12 +931,13 @@ def mpi_train(conf,shot_list_train,shot_list_validate,loader, callbacks_list=Non def get_stop_training(callbacks): for cb in callbacks.callbacks: - if isinstance(cb,cbks.EarlyStopping): + if isinstance(cb, cbks.EarlyStopping): print("Checking for early stopping") return cb.model.stop_training print("No early stopping callback found.") return False + class TensorBoard(object): def __init__(self, log_dir='./logs', histogram_freq=0, @@ -812,28 +968,29 @@ def set_model(self, model): mapped_weight_name = weight.name.replace(':', '_') tf.summary.histogram(mapped_weight_name, weight) if self.write_grads: - grads = self.model.optimizer.get_gradients(self.model.total_loss, - weight) + grads = self.model.optimizer.get_gradients( + self.model.total_loss, weight) + def is_indexed_slices(grad): return type(grad).__name__ == 'IndexedSlices' grads = [ grad.values if is_indexed_slices(grad) else grad for grad in grads] - for grad in grads: - tf.summary.histogram('{}_grad'.format(mapped_weight_name), grad) + for grad in grads: + tf.summary.histogram( + '{}_grad'.format(mapped_weight_name), grad) if hasattr(layer, 'output'): tf.summary.histogram('{}_out'.format(layer.name), - layer.output) + layer.output) self.merged = tf.summary.merge_all() if self.write_graph: self.writer = tf.summary.FileWriter(self.log_dir, - self.sess.graph) + self.sess.graph) else: self.writer = tf.summary.FileWriter(self.log_dir) - def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): logs = logs or {} @@ -847,9 +1004,9 @@ def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): self.writer.add_summary(summary, epoch) self.writer.flush() - tensors = (self.model.inputs + - self.model.targets + - self.model.sample_weights) + tensors = (self.model.inputs + + self.model.targets + + self.model.sample_weights) if self.model.uses_learning_phase: tensors += [K.learning_phase()] @@ -870,8 +1027,8 @@ def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): summary_str = result[0] self.writer.add_summary(summary_str, int(round(epoch))) val_steps -= 1 - if val_steps <= 0: break - + if val_steps <= 0: + break def on_train_end(self): self.writer.close() diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 11f3ff3d..2eb0b58b 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -1,71 +1,78 @@ -from __future__ import print_function -import matplotlib -matplotlib.use('Agg') -import matplotlib.pyplot as plt - -import numpy as np - -from hyperopt import hp, STATUS_OK - +from plasma.utils.state_reset import reset_states +from plasma.utils.evaluation import lr, tf, get_loss_from_list +from plasma.utils.performance import PerformanceAnalyzer +from plasma.models.loader import Loader, ProcessGenerator +from plasma.conf import conf +import pathos.multiprocessing as mp +from functools import partial +import os import time +from hyperopt import hp, STATUS_OK +import numpy as np import sys -import os -from functools import partial -import pathos.multiprocessing as mp +import matplotlib.pyplot as plt +import matplotlib +matplotlib.use('Agg') -if sys.version_info[0] < 3: - from itertools import imap +# if sys.version_info[0] < 3: +# from itertools import imap -from plasma.conf import conf -from plasma.models.loader import Loader, ProcessGenerator -from plasma.utils.performance import PerformanceAnalyzer -from plasma.utils.evaluation import * -from plasma.utils.state_reset import reset_states backend = conf['model']['backend'] -def train(conf,shot_list_train,shot_list_validate,loader): + +def train(conf, shot_list_train, shot_list_validate, loader): loader.set_inference_mode(False) np.random.seed(1) validation_losses = [] validation_roc = [] training_losses = [] - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + print( + 'validate: {} shots, {} disruptive'.format( + len(shot_list_validate), + shot_list_validate.num_disruptive())) + print( + 'training: {} shots, {} disruptive'.format( + len(shot_list_train), + shot_list_train.num_disruptive())) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU": 1}) + set_session(tf.Session(config=config)) else: os.environ['KERAS_BACKEND'] = 'theano' os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' - import theano + # import theano - from keras.utils.generic_utils import Progbar + from keras.utils.generic_utils import Progbar from keras import backend as K from plasma.models import builder - print('Build model...',end='') + print('Build model...', end='') specific_builder = builder.ModelBuilder(conf) - train_model = specific_builder.build_model(False) - print('Compile model',end='') - train_model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) + train_model = specific_builder.build_model(False) + print('Compile model', end='') + train_model.compile( + optimizer=optimizer_class(), + loss=conf['data']['target'].loss) print('...done') - #load the latest epoch we did. Returns -1 if none exist yet + # load the latest epoch we did. Returns -1 if none exist yet e = specific_builder.load_model_weights(train_model) e_start = e - batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + batch_generator = partial( + loader.training_batch_generator_partial_reset, + shot_list=shot_list_train) batch_iterator = ProcessGenerator(batch_generator()) num_epochs = conf['training']['num_epochs'] - num_at_once = conf['training']['num_shots_at_once'] + # num_at_once = conf['training']['num_shots_at_once'] lr_decay = conf['model']['lr_decay'] print('{} epochs left to go'.format(num_epochs - 1 - e)) num_so_far_accum = 0 @@ -81,67 +88,77 @@ def train(conf,shot_list_train,shot_list_validate,loader): while e < num_epochs-1: e += 1 - print('\nEpoch {}/{}'.format(e+1,num_epochs)) - pbar = Progbar(len(shot_list_train)) + print('\nEpoch {}/{}'.format(e+1, num_epochs)) + pbar = Progbar(len(shot_list_train)) - #decay learning rate each epoch: + # decay learning rate each epoch: K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) - - #print('Learning rate: {}'.format(train_model.optimizer.lr.get_value())) + num_batches_minimum = 100 num_batches_current = 0 training_losses_tmp = [] - while num_so_far < (e - e_start)*num_total or num_batches_current < num_batches_minimum: + while (num_so_far < (e - e_start)*num_total + or num_batches_current < num_batches_minimum): num_so_far_old = num_so_far try: - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator) + (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, + num_total, is_warmup_period) = next(batch_iterator) except StopIteration: print("Resetting batch iterator.") num_so_far_accum = num_so_far batch_iterator = ProcessGenerator(batch_generator()) - batch_xs,batch_ys,batches_to_reset,num_so_far_curr,num_total,is_warmup_period = next(batch_iterator) + (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, + num_total, is_warmup_period) = next(batch_iterator) if np.any(batches_to_reset): - reset_states(train_model,batches_to_reset) + reset_states(train_model, batches_to_reset) if not is_warmup_period: num_so_far = num_so_far_accum+num_so_far_curr - num_batches_current +=1 + num_batches_current += 1 - - loss = train_model.train_on_batch(batch_xs,batch_ys) + loss = train_model.train_on_batch(batch_xs, batch_ys) training_losses_tmp.append(loss) - pbar.add(num_so_far - num_so_far_old, values=[("train loss", loss)]) - loader.verbose=False#True during the first iteration + pbar.add(num_so_far - num_so_far_old, + values=[("train loss", loss)]) + loader.verbose = False # True during the first iteration else: - _ = train_model.predict(batch_xs,batch_size=conf['training']['batch_size']) - + _ = train_model.predict( + batch_xs, batch_size=conf['training']['batch_size']) e = e_start+1.0*num_so_far/num_total sys.stdout.flush() ave_loss = np.mean(training_losses_tmp) training_losses.append(ave_loss) - specific_builder.save_model_weights(train_model,int(round(e))) + specific_builder.save_model_weights(train_model, int(round(e))) if conf['training']['validation_frac'] > 0.0: print("prediction on GPU...") - _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) + _, _, _, roc_area, loss = make_predictions_and_evaluate_gpu( + conf, shot_list_validate, loader) validation_losses.append(loss) validation_roc.append(roc_area) epoch_logs = {} - epoch_logs['val_roc'] = roc_area + epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss - best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']],best_so_far) - if best_so_far != epoch_logs[conf['callbacks']['monitor']]: #only save model weights if quantity we are tracking is improving + best_so_far = cmp_fn( + epoch_logs[conf['callbacks']['monitor']], best_so_far) + # only save model weights if quantity we are tracking is improving + if best_so_far != epoch_logs[conf['callbacks']['monitor']]: print("Not saving model weights") - specific_builder.delete_model_weights(train_model,int(round(e))) + specific_builder.delete_model_weights( + train_model, int(round(e))) if conf['training']['ranking_difficulty_fac'] != 1.0: - _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) + (_, _, _, roc_area_train, + loss_train) = make_predictions_and_evaluate_gpu( + conf, shot_list_train, loader) batch_iterator.__exit__() - batch_generator = partial(loader.training_batch_generator_partial_reset,shot_list=shot_list_train) + batch_generator = partial( + loader.training_batch_generator_partial_reset, + shot_list=shot_list_train) batch_iterator = ProcessGenerator(batch_generator()) num_so_far_accum = num_so_far @@ -153,58 +170,78 @@ def train(conf,shot_list_train,shot_list_validate,loader): if conf['training']['ranking_difficulty_fac'] != 1.0: print('Train Loss: {:.3e}'.format(loss_train)) print('Train ROC: {:.4f}'.format(roc_area_train)) - - # plot_losses(conf,[training_losses],specific_builder,name='training') if conf['training']['validation_frac'] > 0.0: - plot_losses(conf,[training_losses,validation_losses,validation_roc],specific_builder,name='training_validation_roc') + plot_losses(conf, + [training_losses, + validation_losses, + validation_roc], + specific_builder, + name='training_validation_roc') batch_iterator.__exit__() print('...done') + def optimizer_class(): - from keras.optimizers import SGD,Adam,RMSprop,Nadam,TFOptimizer + from keras.optimizers import SGD, Adam, RMSprop, Nadam, TFOptimizer if conf['model']['optimizer'] == 'sgd': - return SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + return SGD(lr=conf['model']['lr'], clipnorm=conf['model']['clipnorm']) elif conf['model']['optimizer'] == 'momentum_sgd': - return SGD(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm'], decay=1e-6, momentum=0.9) + return SGD( + lr=conf['model']['lr'], + clipnorm=conf['model']['clipnorm'], + decay=1e-6, + momentum=0.9) elif conf['model']['optimizer'] == 'tf_momentum_sgd': - return TFOptimizer(tf.train.MomentumOptimizer(learning_rate=conf['model']['lr'],momentum=0.9)) + return TFOptimizer( + tf.train.MomentumOptimizer( + learning_rate=conf['model']['lr'], + momentum=0.9)) elif conf['model']['optimizer'] == 'adam': - return Adam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + return Adam(lr=conf['model']['lr'], clipnorm=conf['model']['clipnorm']) elif conf['model']['optimizer'] == 'tf_adam': - return TFOptimizer(tf.train.AdamOptimizer(learning_rate=conf['model']['lr'])) + return TFOptimizer( + tf.train.AdamOptimizer( + learning_rate=conf['model']['lr'])) elif conf['model']['optimizer'] == 'rmsprop': - return RMSprop(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + return RMSprop( + lr=conf['model']['lr'], + clipnorm=conf['model']['clipnorm']) elif conf['model']['optimizer'] == 'nadam': - return Nadam(lr=conf['model']['lr'],clipnorm=conf['model']['clipnorm']) + return Nadam( + lr=conf['model']['lr'], + clipnorm=conf['model']['clipnorm']) else: print("Optimizer not implemented yet") exit(1) class HyperRunner(object): - def __init__(self,conf,loader,shot_list): + def __init__(self, conf, loader, shot_list): self.loader = loader self.shot_list = shot_list self.conf = conf - #FIXME setup for hyperas search - def keras_fmin_fnct(self,space): + # FIXME setup for hyperas search + def keras_fmin_fnct(self, space): from plasma.models import builder specific_builder = builder.ModelBuilder(self.conf) - train_model = specific_builder.hyper_build_model(space,False) - train_model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) + train_model = specific_builder.hyper_build_model(space, False) + train_model.compile( + optimizer=optimizer_class(), + loss=conf['data']['target'].loss) np.random.seed(1) validation_losses = [] validation_roc = [] training_losses = [] - shot_list_train,shot_list_validate = self.shot_list.split_direct(1.0-conf['training']['validation_frac'],do_shuffle=True) - + shot_list_train, shot_list_validate = self.shot_list.split_direct( + 1.0-conf['training']['validation_frac'], do_shuffle=True) + from keras.utils.generic_utils import Progbar from keras import backend as K @@ -212,46 +249,59 @@ def keras_fmin_fnct(self,space): num_at_once = self.conf['training']['num_shots_at_once'] lr_decay = self.conf['model']['lr_decay'] - resulting_dict = {'loss':None,'status':STATUS_OK,'model':None} + resulting_dict = {'loss': None, 'status': STATUS_OK, 'model': None} e = -1 - #print("Current num_epochs {}".format(e)) + # print("Current num_epochs {}".format(e)) while e < num_epochs-1: e += 1 - pbar = Progbar(len(shot_list_train)) + pbar = Progbar(len(shot_list_train)) shot_list_train.shuffle() shot_sublists = shot_list_train.sublists(num_at_once)[:1] training_losses_tmp = [] K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) - for (i,shot_sublist) in enumerate(shot_sublists): - X_list,y_list = self.loader.load_as_X_y_list(shot_sublist) - for j,(X,y) in enumerate(zip(X_list,y_list)): + for (i, shot_sublist) in enumerate(shot_sublists): + X_list, y_list = self.loader.load_as_X_y_list(shot_sublist) + for j, (X, y) in enumerate(zip(X_list, y_list)): history = builder.LossHistory() - train_model.fit(X,y, - batch_size=Loader.get_batch_size(self.conf['training']['batch_size'],prediction_mode=False), - epochs=1,shuffle=False,verbose=0, - validation_split=0.0,callbacks=[history]) + train_model.fit( + X, + y, + batch_size=Loader.get_batch_size( + self.conf['training']['batch_size'], + prediction_mode=False), + epochs=1, + shuffle=False, + verbose=0, + validation_split=0.0, + callbacks=[history]) train_model.reset_states() train_loss = np.mean(history.losses) training_losses_tmp.append(train_loss) - pbar.add(1.0*len(shot_sublist)/len(X_list), values=[("train loss", train_loss)]) - self.loader.verbose=False + pbar.add(1.0*len(shot_sublist)/len(X_list), + values=[("train loss", train_loss)]) + self.loader.verbose = False sys.stdout.flush() training_losses.append(np.mean(training_losses_tmp)) - specific_builder.save_model_weights(train_model,e) + specific_builder.save_model_weights(train_model, e) - _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(self.conf,shot_list_validate,self.loader) - print("Epoch: {}, loss: {}, validation_losses_size: {}".format(e,loss,len(validation_losses))) + _, _, _, roc_area, loss = make_predictions_and_evaluate_gpu( + self.conf, shot_list_validate, self.loader) + print( + "Epoch: {}, loss: {}, validation_losses_size: {}".format( + e, loss, len(validation_losses))) validation_losses.append(loss) validation_roc.append(roc_area) resulting_dict['loss'] = loss resulting_dict['model'] = train_model - #print("Results {}, before {}".format(resulting_dict,id(resulting_dict))) + # print("Results {}, before + # {}".format(resulting_dict,id(resulting_dict))) - #print("Results {}, after {}".format(resulting_dict,id(resulting_dict))) + # print("Results {}, after + # {}".format(resulting_dict,id(resulting_dict))) return resulting_dict def get_space(self): @@ -263,29 +313,31 @@ def frnn_minimize(self, algo, max_evals, trials, rseed=1337): from hyperopt import fmin best_run = fmin(self.keras_fmin_fnct, - space=self.get_space(), - algo=algo, - max_evals=max_evals, - trials=trials, - rstate=np.random.RandomState(rseed)) + space=self.get_space(), + algo=algo, + max_evals=max_evals, + trials=trials, + rstate=np.random.RandomState(rseed)) best_model = None for trial in trials: vals = trial.get('misc').get('vals') for key in vals.keys(): vals[key] = vals[key][0] - if trial.get('misc').get('vals') == best_run and 'model' in trial.get('result').keys(): + if (trial.get('misc').get('vals') == best_run + and 'model' in trial.get('result').keys()): best_model = trial.get('result').get('model') return best_run, best_model -def plot_losses(conf,losses_list,specific_builder,name=''): + +def plot_losses(conf, losses_list, specific_builder, name=''): unique_id = specific_builder.get_unique_id() savedir = 'losses' if not os.path.exists(savedir): os.makedirs(savedir) - save_path = os.path.join(savedir,'{}_loss_{}.png'.format(name,unique_id)) + save_path = os.path.join(savedir, '{}_loss_{}.png'.format(name, unique_id)) plt.figure() for losses in losses_list: plt.semilogy(losses) @@ -295,43 +347,49 @@ def plot_losses(conf,losses_list,specific_builder,name=''): plt.savefig(save_path) -def make_predictions(conf,shot_list,loader): +def make_predictions(conf, shot_list, loader): loader.set_inference_mode(True) - use_cores = max(1,mp.cpu_count()-2) + use_cores = max(1, mp.cpu_count()-2) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"CPU":use_cores}) - set_session(tf.Session(config=config)) + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"CPU": use_cores}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=cpu' - import theano + # import theano from plasma.models.builder import ModelBuilder - specific_builder = ModelBuilder(conf) + specific_builder = ModelBuilder(conf) y_prime = [] y_gold = [] disruptive = [] model = specific_builder.build_model(True) - model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) + model.compile( + optimizer=optimizer_class(), + loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model_save_path = specific_builder.get_latest_save_path() start_time = time.time() pool = mp.Pool(use_cores) - fn = partial(make_single_prediction,builder=specific_builder,loader=loader,model_save_path=model_save_path) + fn = partial( + make_single_prediction, + builder=specific_builder, + loader=loader, + model_save_path=model_save_path) print('running in parallel on {} processes'.format(pool._processes)) - for (i,(y_p,y,is_disruptive)) in enumerate(pool.imap(fn,shot_list)): - print('Shot {}/{}'.format(i,len(shot_list))) + for (i, (y_p, y, is_disruptive)) in enumerate(pool.imap(fn, shot_list)): + print('Shot {}/{}'.format(i, len(shot_list))) sys.stdout.flush() y_prime.append(y_p) y_gold.append(y) @@ -340,77 +398,87 @@ def make_predictions(conf,shot_list,loader): pool.join() print('Finished Predictions in {} seconds'.format(time.time()-start_time)) loader.set_inference_mode(False) - return y_prime,y_gold,disruptive + return y_prime, y_gold, disruptive -def make_single_prediction(shot,specific_builder,loader,model_save_path): +def make_single_prediction(shot, specific_builder, loader, model_save_path): loader.set_inference_mode(True) model = specific_builder.build_model(True) - model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) + model.compile( + optimizer=optimizer_class(), + loss=conf['data']['target'].loss) model.load_weights(model_save_path) model.reset_states() - X,y = loader.load_as_X_y(shot,prediction_mode=True) + X, y = loader.load_as_X_y(shot, prediction_mode=True) assert(X.shape[0] == y.shape[0]) - y_p = model.predict(X,batch_size=Loader.get_batch_size(conf['training']['batch_size'],prediction_mode=True),verbose=0) + y_p = model.predict( + X, + batch_size=Loader.get_batch_size(conf['training']['batch_size'], + prediction_mode=True), + verbose=0) answer_dims = y_p.shape[-1] if conf['model']['return_sequences']: shot_length = y_p.shape[0]*y_p.shape[1] else: shot_length = y_p.shape[0] - y_p = np.reshape(y_p,(shot_length,answer_dims)) - y = np.reshape(y,(shot_length,answer_dims)) + y_p = np.reshape(y_p, (shot_length, answer_dims)) + y = np.reshape(y, (shot_length, answer_dims)) is_disruptive = shot.is_disruptive_shot() model.reset_states() loader.set_inference_mode(False) - return y_p,y,is_disruptive + return y_p, y, is_disruptive -def make_predictions_gpu(conf,shot_list,loader,custom_path=None): +def make_predictions_gpu(conf, shot_list, loader, custom_path=None): loader.set_inference_mode(True) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU": 1}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' - import theano + # import theano - from keras.utils.generic_utils import Progbar + from keras.utils.generic_utils import Progbar from plasma.models.builder import ModelBuilder - specific_builder = ModelBuilder(conf) + specific_builder = ModelBuilder(conf) y_prime = [] y_gold = [] disruptive = [] model = specific_builder.build_model(True) - model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(), + loss=conf['data']['target'].loss) - specific_builder.load_model_weights(model,custom_path) + specific_builder.load_model_weights(model, custom_path) model.reset_states() - pbar = Progbar(len(shot_list)) - shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'],do_shuffle=False,equal_size=True) - for (i,shot_sublist) in enumerate(shot_sublists): - X,y,shot_lengths,disr = loader.load_as_X_y_pred(shot_sublist) - #load data and fit on data + pbar = Progbar(len(shot_list)) + shot_sublists = shot_list.sublists( + conf['model']['pred_batch_size'], + do_shuffle=False, + equal_size=True) + for (i, shot_sublist) in enumerate(shot_sublists): + X, y, shot_lengths, disr = loader.load_as_X_y_pred(shot_sublist) + # load data and fit on data y_p = model.predict(X, - batch_size=conf['model']['pred_batch_size']) + batch_size=conf['model']['pred_batch_size']) model.reset_states() y_p = loader.batch_output_to_array(y_p) y = loader.batch_output_to_array(y) - #cut arrays back - y_p = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y_p)] - y = [arr[:shot_lengths[j]] for (j,arr) in enumerate(y)] + # cut arrays back + y_p = [arr[:shot_lengths[j]] for (j, arr) in enumerate(y_p)] + y = [arr[:shot_lengths[j]] for (j, arr) in enumerate(y)] pbar.add(1.0*len(shot_sublist)) - loader.verbose=False#True during the first iteration + loader.verbose = False # True during the first iteration y_prime += y_p y_gold += y disruptive += disr @@ -418,67 +486,83 @@ def make_predictions_gpu(conf,shot_list,loader,custom_path=None): y_gold = y_gold[:len(shot_list)] disruptive = disruptive[:len(shot_list)] loader.set_inference_mode(False) - return y_prime,y_gold,disruptive - + return y_prime, y_gold, disruptive -def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path=None): - y_prime,y_gold,disruptive = make_predictions_gpu(conf,shot_list,loader,custom_path) +def make_predictions_and_evaluate_gpu( + conf, shot_list, loader, custom_path=None): + y_prime, y_gold, disruptive = make_predictions_gpu( + conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - shot_list.set_weights(analyzer.get_shot_difficulty(y_prime,y_gold,disruptive)) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss + roc_area = analyzer.get_roc_area(y_prime, y_gold, disruptive) + shot_list.set_weights( + analyzer.get_shot_difficulty( + y_prime, y_gold, disruptive)) + loss = get_loss_from_list(y_prime, y_gold, conf['data']['target']) + return y_prime, y_gold, disruptive, roc_area, loss -def make_evaluations_gpu(conf,shot_list,loader): + +def make_evaluations_gpu(conf, shot_list, loader): loader.set_inference_mode(True) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules if first_time: - import tensorflow as tf - os.environ['KERAS_BACKEND'] = 'tensorflow' - from keras.backend.tensorflow_backend import set_session - config = tf.ConfigProto(device_count={"GPU":1}) - set_session(tf.Session(config=config)) + import tensorflow as tf + os.environ['KERAS_BACKEND'] = 'tensorflow' + from keras.backend.tensorflow_backend import set_session + config = tf.ConfigProto(device_count={"GPU": 1}) + set_session(tf.Session(config=config)) else: os.environ['THEANO_FLAGS'] = 'device=gpu,floatX=float32' - import theano - - from keras.utils.generic_utils import Progbar + # import theano + + from keras.utils.generic_utils import Progbar from plasma.models.builder import ModelBuilder - specific_builder = ModelBuilder(conf) + specific_builder = ModelBuilder(conf) - y_prime = [] - y_gold = [] - disruptive = [] - batch_size = min(len(shot_list),conf['model']['pred_batch_size']) + # y_prime = [] + # y_gold = [] + # disruptive = [] + batch_size = min(len(shot_list), conf['model']['pred_batch_size']) - pbar = Progbar(len(shot_list)) - print('evaluating {} shots using batchsize {}'.format(len(shot_list),batch_size)) + pbar = Progbar(len(shot_list)) + print( + 'evaluating {} shots using batchsize {}'.format( + len(shot_list), + batch_size)) - shot_sublists = shot_list.sublists(batch_size,equal_size=False) + shot_sublists = shot_list.sublists(batch_size, equal_size=False) all_metrics = [] all_weights = [] - for (i,shot_sublist) in enumerate(shot_sublists): + for (i, shot_sublist) in enumerate(shot_sublists): batch_size = len(shot_sublist) - model = specific_builder.build_model(True,custom_batch_size=batch_size) - model.compile(optimizer=optimizer_class(),loss=conf['data']['target'].loss) + model = specific_builder.build_model( + True, custom_batch_size=batch_size) + model.compile( + optimizer=optimizer_class(), + loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model.reset_states() - X,y,shot_lengths,disr = loader.load_as_X_y_pred(shot_sublist,custom_batch_size=batch_size) - #load data and fit on data - all_metrics.append(model.evaluate(X,y,batch_size=batch_size,verbose=False)) + X, y, shot_lengths, disr = loader.load_as_X_y_pred( + shot_sublist, custom_batch_size=batch_size) + # load data and fit on data + all_metrics.append( + model.evaluate( + X, + y, + batch_size=batch_size, + verbose=False)) all_weights.append(batch_size) model.reset_states() pbar.add(1.0*len(shot_sublist)) - loader.verbose=False#True during the first iteration + loader.verbose = False # True during the first iteration if len(all_metrics) > 1: print('evaluations all: {}'.format(all_metrics)) - loss = np.average(all_metrics,weights = all_weights) + loss = np.average(all_metrics, weights=all_weights) print('Evaluation Loss: {}'.format(loss)) loader.set_inference_mode(False) - return loss + return loss diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index b9ccf883..c4fa1552 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -1,43 +1,46 @@ -from __future__ import print_function +from sklearn import svm +from keras.utils.generic_utils import Progbar +import keras.callbacks as cbks +from sklearn.metrics import classification_report +# accuracy_score, auc, confusion_matrix +from sklearn.externals import joblib +from sklearn.ensemble import RandomForestClassifier +import hashlib +from plasma.utils.downloading import makedirs_process_safe +# from plasma.utils.state_reset import reset_states +from plasma.utils.evaluation import ttd, get_loss_from_list +from plasma.utils.performance import PerformanceAnalyzer +# from plasma.models.loader import Loader, ProcessGenerator +# from plasma.conf import conf +from sklearn.neural_network import MLPClassifier +from xgboost import XGBClassifier +import pathos.multiprocessing as mp +from functools import partial +import os +import datetime +import time +import numpy as np +# import matplotlib.pyplot as plt import matplotlib matplotlib.use('Agg') -import matplotlib.pyplot as plt -import numpy as np -import sys -if sys.version_info[0] < 3: - from itertools import imap +# import sys +# if sys.version_info[0] < 3: +# from itertools import imap -#leading to import errors: -#from hyperopt import hp, STATUS_OK -#from hyperas.distributions import conditional +# leading to import errors: +# from hyperopt import hp, STATUS_OK +# from hyperas.distributions import conditional -import time -import datetime -import os -from functools import partial -import pathos.multiprocessing as mp -from xgboost import XGBClassifier -from sklearn.neural_network import MLPClassifier - -from plasma.conf import conf -from plasma.models.loader import Loader, ProcessGenerator -from plasma.utils.performance import PerformanceAnalyzer -from plasma.utils.evaluation import * -from plasma.utils.state_reset import reset_states -from plasma.utils.downloading import makedirs_process_safe - -from keras.utils.generic_utils import Progbar - -import hashlib debug_use_shots = 100000 model_filename = "saved_model.pkl" dataset_path = "dataset.npz" dataset_test_path = "dataset_test.npz" + class FeatureExtractor(object): - def __init__(self,loader,timesteps = 32): + def __init__(self, loader, timesteps=32): self.loader = loader self.timesteps = timesteps self.positional_fit_order = 4 @@ -45,53 +48,72 @@ def __init__(self,loader,timesteps = 32): self.temporal_fit_order = 3 self.num_temporal_features = self.temporal_fit_order + 1 + 3 - def get_sample_probs(self,shot_list,num_samples): + def get_sample_probs(self, shot_list, num_samples): print("Calculating number of timesteps") - timesteps_total,timesteps_d,timesteps_nd = shot_list.num_timesteps(self.loader.conf['paths']['processed_prepath']) - print("Total data: {} time samples, {} disruptive".format(timesteps_total,1.0*timesteps_d/timesteps_total)) + timesteps_total, timesteps_d, timesteps_nd = shot_list.num_timesteps( + self.loader.conf['paths']['processed_prepath']) + print("Total data: {} time samples, {} disruptive".format( + timesteps_total, 1.0*timesteps_d/timesteps_total)) if self.loader.conf['data']['equalize_classes']: - sample_prob_d = np.minimum(1.0,1.0*timesteps_nd/timesteps_d) - sample_prob_nd = np.minimum(1.0,1.0*timesteps_d/timesteps_nd) - timesteps_total = 1.0*sample_prob_d*timesteps_d+sample_prob_nd*timesteps_nd - sample_prob = np.minimum(1.0,1.0*num_samples/timesteps_total) + sample_prob_d = np.minimum(1.0, 1.0*timesteps_nd/timesteps_d) + sample_prob_nd = np.minimum(1.0, 1.0*timesteps_d/timesteps_nd) + timesteps_total = (1.0*sample_prob_d*timesteps_d + + sample_prob_nd*timesteps_nd) + sample_prob = np.minimum(1.0, 1.0*num_samples/timesteps_total) sample_prob_d *= sample_prob sample_prob_nd *= sample_prob else: - sample_prob_d = np.minimum(1.0,1.0*num_samples/timesteps_total) + sample_prob_d = np.minimum(1.0, 1.0*num_samples/timesteps_total) sample_prob_nd = sample_prob_d if sample_prob_nd <= 0.0 or sample_prob_d <= 0.0: - val = np.minimum(1.0,num_samples/timesteps_total) - return val,val - return sample_prob_d,sample_prob_nd - - def load_shots(self,shot_list,is_inference=False,as_list=False,num_samples=np.Inf): + val = np.minimum(1.0, num_samples/timesteps_total) + return val, val + return sample_prob_d, sample_prob_nd + + def load_shots( + self, + shot_list, + is_inference=False, + as_list=False, + num_samples=np.Inf): X = [] Y = [] Disr = [] print("loading...") - pbar = Progbar(len(shot_list)) - - sample_prob_d,sample_prob_nd = self.get_sample_probs(shot_list,num_samples) - fn = partial(self.load_shot,is_inference=is_inference,sample_prob_d=sample_prob_d,sample_prob_nd=sample_prob_nd) + pbar = Progbar(len(shot_list)) + + sample_prob_d, sample_prob_nd = self.get_sample_probs( + shot_list, num_samples) + fn = partial( + self.load_shot, + is_inference=is_inference, + sample_prob_d=sample_prob_d, + sample_prob_nd=sample_prob_nd) pool = mp.Pool() - print('loading data in parallel on {} processes'.format(pool._processes)) - for x,y,disr in pool.imap(fn,shot_list): + print('loading data in parallel on {} processes'.format( + pool._processes)) + for x, y, disr in pool.imap(fn, shot_list): X.append(x) Y.append(y) Disr.append(disr) pbar.add(1.0) pool.close() pool.join() - return X,Y,np.array(Disr) + return X, Y, np.array(Disr) def get_save_prepath(self): prepath = self.loader.conf['paths']['processed_prepath'] use_signals = self.loader.conf['paths']['use_signals'] - identifying_tuple = ''.join(tuple(map(lambda x: x.description, sorted(use_signals)))).encode('utf-8') - save_prepath = prepath + "shallow/use_signals_{}/".format(int(hashlib.md5(identifying_tuple).hexdigest(),16)) + identifying_tuple = ''.join( + tuple(map(lambda x: x.description, + sorted(use_signals)))).encode('utf-8') + save_prepath = ( + prepath + "shallow/use_signals_{}/".format( + int(hashlib.md5(identifying_tuple).hexdigest(), 16)) + ) return save_prepath - def process(self,shot): + def process(self, shot): save_prepath = self.get_save_prepath() save_path = shot.get_save_path(save_prepath) if not os.path.exists(save_prepath): @@ -99,45 +121,45 @@ def process(self,shot): prepath = self.loader.conf['paths']['processed_prepath'] assert(shot.valid) shot.restore(prepath) - self.loader.set_inference_mode(True)#make sure shots aren't cut + self.loader.set_inference_mode(True) # make sure shots aren't cut if self.loader.normalizer is not None: self.loader.normalizer.apply(shot) else: - print('Warning, no normalization. Training data may be poorly conditioned') + print('Warning, no normalization. ', + 'Training data may be poorly conditioned') self.loader.set_inference_mode(False) - # sig,res = self.get_signal_result_from_shot(shot) + # sig, res = self.get_signal_result_from_shot(shot) disr = 1 if shot.is_disruptive else 0 - if not os.path.isfile(save_path): X = self.get_X(shot) - np.savez(save_path,X=X)#,Y=Y,disr=disr - #print(X.shape,Y.shape) + np.savez(save_path, X=X) # , Y=Y, disr=disr + # print(X.shape, Y.shape) else: try: dat = np.load(save_path) - # X,Y,disr = dat["X"],dat["Y"],dat["disr"][()] + # X, Y, disr = dat["X"], dat["Y"], dat["disr"][()] X = dat["X"] - except: #data was there but corrupted, save it again + except BaseException: + # data was there but corrupted, save it again X = self.get_X(shot) - np.savez(save_path,X=X) - + np.savez(save_path, X=X) Y = self.get_Y(shot) shot.make_light() - return X,Y,disr + return X, Y, disr - def get_X(self,shot): + def get_X(self, shot): use_signals = self.loader.conf['paths']['use_signals'] - sig_sample = shot.signals_dict[use_signals[0]] + sig_sample = shot.signals_dict[use_signals[0]] if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) + shot.ttd = np.expand_dims(shot.ttd, axis=1) length = sig_sample.shape[0] if length < self.timesteps: - print(ttd,shot,shot.number) + print(ttd, shot, shot.number) print("Shot must be at least as long as the RNN length.") exit(1) assert(len(sig_sample.shape) == len(shot.ttd.shape) == 2) @@ -146,24 +168,29 @@ def get_X(self,shot): X = [] while(len(X) == 0): for i in range(length-self.timesteps+1): - #if np.random.rand() < sample_prob: - x = self.get_x(i,shot) + # if np.random.rand() < sample_prob: + x = self.get_x(i, shot) X.append(x) X = np.stack(X) return X - def get_Y(self,shot): + def get_Y(self, shot): if len(shot.ttd.shape) == 1: - shot.ttd = np.expand_dims(shot.ttd,axis=1) + shot.ttd = np.expand_dims(shot.ttd, axis=1) offset = self.timesteps - 1 - return np.round(shot.ttd[offset:,0]).astype(np.int) + return np.round(shot.ttd[offset:, 0]).astype(np.int) - def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0): + def load_shot( + self, + shot, + is_inference=False, + sample_prob_d=1.0, + sample_prob_nd=1.0): - X,Y,disr = self.process(shot) + X, Y, disr = self.process(shot) - #cut shot ends if we are supposed to - if self.loader.conf['data']['cut_shot_ends'] and not is_inference: + # cut shot ends if we are supposed to + if self.loader.conf['data']['cut_shot_ends'] and not is_inference: T_min_warn = self.loader.conf['data']['T_min_warn'] X = X[:-T_min_warn] Y = Y[:-T_min_warn] @@ -171,23 +198,24 @@ def load_shot(self,shot,is_inference=False,sample_prob_d=1.0,sample_prob_nd=1.0) sample_prob = sample_prob_nd if disr: sample_prob = sample_prob_d - if sample_prob < 1.0: - indices = np.sort(np.random.choice(np.array(range(len(Y))),int(round(sample_prob*len(Y))),replace=False)) + if sample_prob < 1.0: + indices = np.sort( + np.random.choice(np.array(range(len(Y))), + int(round(sample_prob*len(Y))), + replace=False)) X = X[indices] Y = Y[indices] - return X,Y,disr + return X, Y, disr - - def get_x(self,timestep,shot): + def get_x(self, timestep, shot): x = [] use_signals = self.loader.conf['paths']['use_signals'] for sig in use_signals: - x += [self.extract_features(timestep,shot,sig)] - # x = sig[timestep:timestep+timesteps,:] - x = np.concatenate(x,axis=0) + x += [self.extract_features(timestep, shot, sig)] + # x = sig[timestep:timestep + timesteps,:] + x = np.concatenate(x, axis=0) return x - # def get_x_y(self,timestep,shot): # x = [] # use_signals = self.loader.conf['paths']['use_signals'] @@ -198,24 +226,28 @@ def get_x(self,timestep,shot): # y = np.round(shot.ttd[timestep+self.timesteps-1,0]).astype(np.int) # return x,y - - def extract_features(self,timestep,shot,signal): - raw_sig = shot.signals_dict[signal][timestep:timestep+self.timesteps] - num_positional_features = self.num_positional_features if signal.num_channels > 1 else 1 - output_arr = np.empty((self.timesteps,num_positional_features)) - final_output_arr = np.empty((num_positional_features*self.num_temporal_features)) + def extract_features(self, timestep, shot, signal): + raw_sig = shot.signals_dict[signal][timestep:timestep + self.timesteps] + num_positional_features = ( + self.num_positional_features if signal.num_channels > 1 else 1) + output_arr = np.empty((self.timesteps, num_positional_features)) + final_output_arr = np.empty( + (num_positional_features*self.num_temporal_features)) for t in range(self.timesteps): - output_arr[t,:] = self.extract_positional_features(raw_sig[t,:]) + output_arr[t, :] = self.extract_positional_features(raw_sig[t, :]) for i in range(num_positional_features): idx = i*self.num_temporal_features - final_output_arr[idx:idx+self.num_temporal_features] = self.extract_temporal_features(output_arr[:,i]) + final_output_arr[idx:idx + self.num_temporal_features] = ( + self.extract_temporal_features(output_arr[:, i])) return final_output_arr - def extract_positional_features(self,arr): + def extract_positional_features(self, arr): num_channels = len(arr) if num_channels > 1: ret_arr = np.empty(self.num_positional_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,num_channels),arr,self.positional_fit_order) + coefficients = np.polynomial.polynomial.polyfit( + np.linspace(0, 1, num_channels), arr, + self.positional_fit_order) mu = np.mean(arr) std = np.std(arr) max_val = np.max(arr) @@ -227,9 +259,10 @@ def extract_positional_features(self,arr): else: return arr - def extract_temporal_features(self,arr): + def extract_temporal_features(self, arr): ret_arr = np.empty(self.num_temporal_features) - coefficients = np.polynomial.polynomial.polyfit(np.linspace(0,1,self.timesteps),arr,self.temporal_fit_order) + coefficients = np.polynomial.polynomial.polyfit( + np.linspace(0, 1, self.timesteps), arr, self.temporal_fit_order) mu = np.mean(arr) std = np.std(arr) max_val = np.max(arr) @@ -239,75 +272,95 @@ def extract_temporal_features(self,arr): ret_arr[self.temporal_fit_order+3] = max_val return ret_arr - def prepend_timesteps(self,arr): + def prepend_timesteps(self, arr): prepend = arr[0]*np.ones(self.timesteps-1) - return np.concatenate((prepend,arr)) + return np.concatenate((prepend, arr)) -from sklearn import svm -from sklearn.ensemble import RandomForestClassifier -from sklearn.externals import joblib -from sklearn.metrics import accuracy_score,auc,classification_report,confusion_matrix -import keras.callbacks as cbks def build_callbacks(conf): ''' - The purpose of the method is to set up logging and history. It is based on Keras Callbacks + The purpose of the method is to set up logging and history. It is based on + Keras Callbacks https://github.com/fchollet/keras/blob/fbc9a18f0abc5784607cd4a2a3886558efa3f794/keras/callbacks.py - Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. - Other possible callbacks to add in future: RemoteMonitor, LearningRateScheduler - - Argument list: - - conf: There is a "callbacks" section in conf.yaml file. Relevant parameters are: - list: Parameter specifying additional callbacks, read in the driver script and passed as an argument of type list (see next arg) - metrics: List of quantities monitored during training and validation - mode: one of {auto, min, max}. The decision to overwrite the current save file is made based on either the maximization or the minimization of the monitored quantity. For val_acc, this should be max, for val_loss this should be min, etc. In auto mode, the direction is automatically inferred from the name of the monitored quantity. - monitor: Quantity used for early stopping, has to be from the list of metrics - patience: Number of epochs used to decide on whether to apply early stopping or continue training - - callbacks_list: uses callbacks.list configuration parameter, specifies the list of additional callbacks - Returns: modified list of callbacks + Currently used callbacks include: BaseLogger, CSVLogger, EarlyStopping. + Other possible callbacks to add in future: + RemoteMonitor, LearningRateScheduler + + Argument list: + - conf: There is a "callbacks" section in conf.yaml file. + + Relevant parameters are: + list: Parameter specifying additional callbacks, read in the driver + script and passed as an argument of type list (see next arg) + metrics: List of quantities monitored during training and + validation + mode: one of {auto, min, max}. The decision to overwrite the + current save file is made based on either the maximization or the + minimization of the monitored quantity. For val_acc, this should be max, + for val_loss this should be min, etc. In auto mode, the direction is + automatically inferred from the name of the monitored quantity. + monitor: Quantity used for early stopping, has to be from the list + of metrics + patience: Number of epochs used to decide on whether to apply early + stopping or continue training + + - callbacks_list: uses callbacks.list configuration parameter, + specifies the list of additional callbacks + + Returns: + modified list of callbacks ''' - mode = conf['callbacks']['mode'] - monitor = conf['callbacks']['monitor'] - patience = conf['callbacks']['patience'] + # mode = conf['callbacks']['mode'] + # monitor = conf['callbacks']['monitor'] + # patience = conf['callbacks']['patience'] csvlog_save_path = conf['paths']['csvlog_save_path'] - #CSV callback is on by default + # CSV callback is on by default if not os.path.exists(csvlog_save_path): - os.makedirs(csvlog_save_path) + os.makedirs(csvlog_save_path) - callbacks_list = conf['callbacks']['list'] + # callbacks_list = conf['callbacks']['list'] callbacks = [cbks.BaseLogger()] - callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format(csvlog_save_path,datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] - + callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format( + csvlog_save_path, + datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) + ] return cbks.CallbackList(callbacks) -def train(conf,shot_list_train,shot_list_validate,loader): +def train(conf, shot_list_train, shot_list_validate, loader): np.random.seed(1) - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), + shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format( + len(shot_list_train), + shot_list_train.num_disruptive())) num_samples = conf['model']['shallow_model']['num_samples'] feature_extractor = FeatureExtractor(loader) shot_list_train = shot_list_train.random_sublist(debug_use_shots) - X,Y,_ = feature_extractor.load_shots(shot_list_train,num_samples = num_samples) - Xv,Yv,_ = feature_extractor.load_shots(shot_list_validate,num_samples = num_samples) - X = np.concatenate(X,axis=0) - Y = np.concatenate(Y,axis=0) - Xv = np.concatenate(Xv,axis=0) - Yv = np.concatenate(Yv,axis=0) - - #max_samples = 100000 - #num_samples = min(max_samples,len(Y)) - #indices = np.random.choice(np.array(range(len(Y))),num_samples,replace=False) - #X = X[indices] - #Y = Y[indices] - - print("fitting on {} samples, {} positive".format(len(X),np.sum(Y > 0))) + X, Y, _ = feature_extractor.load_shots( + shot_list_train, num_samples=num_samples) + Xv, Yv, _ = feature_extractor.load_shots( + shot_list_validate, num_samples=num_samples) + X = np.concatenate(X, axis=0) + Y = np.concatenate(Y, axis=0) + Xv = np.concatenate(Xv, axis=0) + Yv = np.concatenate(Yv, axis=0) + + # max_samples = 100000 + # num_samples = min(max_samples, len(Y)) + # indices = np.random.choice(np.array(range(len(Y))), num_samples, + # replace=False) + # X = X[indices] + # Y = Y[indices] + + print("fitting on {} samples, {} positive".format(len(X), np.sum(Y > 0))) callbacks = build_callbacks(conf) callback_metrics = conf['callbacks']['metrics'] callbacks.set_params({ @@ -316,119 +369,131 @@ def train(conf,shot_list_train,shot_list_validate,loader): callbacks.on_train_begin() callbacks.on_epoch_begin(0) - save_prepath = feature_extractor.get_save_prepath() - model_path = conf['paths']['model_save_path'] + model_filename #save_prepath + model_filename + # save_prepath = feature_extractor.get_save_prepath() + model_path = (conf['paths']['model_save_path'] + + model_filename) # save_prepath + model_filename makedirs_process_safe(conf['paths']['model_save_path']) model_conf = conf['model']['shallow_model'] if not model_conf['skip_train'] or not os.path.isfile(model_path): - + start_time = time.time() if model_conf["scale_pos_weight"] != 1: - scale_pos_weight_dict = {np.min(Y) : 1, np.max(Y):model_conf["scale_pos_weight"]} + scale_pos_weight_dict = { + np.min(Y): 1, np.max(Y): model_conf["scale_pos_weight"]} else: scale_pos_weight_dict = None if model_conf['type'] == "svm": model = svm.SVC(probability=True, - C=model_conf["C"], - kernel=model_conf["kernel"], - class_weight=scale_pos_weight_dict) + C=model_conf["C"], + kernel=model_conf["kernel"], + class_weight=scale_pos_weight_dict) elif model_conf['type'] == "random_forest": - model = RandomForestClassifier(n_estimators=model_conf["n_estimators"], + model = RandomForestClassifier( + n_estimators=model_conf["n_estimators"], max_depth=model_conf["max_depth"], class_weight=scale_pos_weight_dict, n_jobs=-1) elif model_conf['type'] == "xgboost": max_depth = model_conf["max_depth"] - if max_depth == None: + if max_depth is None: max_depth = 0 - model = XGBClassifier(max_depth=max_depth, + model = XGBClassifier( + max_depth=max_depth, learning_rate=model_conf['learning_rate'], n_estimators=model_conf["n_estimators"], scale_pos_weight=model_conf["scale_pos_weight"]) elif model_conf['type'] == 'mlp': - hidden_layer_sizes = tuple(reversed([model_conf['final_hidden_layer_size']*2**x for x in range(model_conf['num_hidden_layers'])])) - model = MLPClassifier(hidden_layer_sizes = hidden_layer_sizes, - learning_rate_init = model_conf['learning_rate_mlp'], - alpha = model_conf['mlp_regularization']) + hidden_layer_sizes = tuple(reversed( + [model_conf['final_hidden_layer_size']*2**x + for x in range(model_conf['num_hidden_layers'])])) + model = MLPClassifier( + hidden_layer_sizes=hidden_layer_sizes, + learning_rate_init=model_conf['learning_rate_mlp'], + alpha=model_conf['mlp_regularization']) else: print("Unkown model type, exiting.") exit(1) - model.fit(X,Y) - joblib.dump(model,model_path) + model.fit(X, Y) + joblib.dump(model, model_path) print("Fit model in {} seconds".format(time.time()-start_time)) else: model = joblib.load(model_path) print("model exists.") - Y_pred = model.predict(X) print("Train") - print(classification_report(Y,Y_pred)) + print(classification_report(Y, Y_pred)) Y_predv = model.predict(Xv) print("Validate") - print(classification_report(Yv,Y_predv)) - #print(confusion_matrix(Y,Y_pred)) - _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) - # _,_,_,roc_area_train,loss_train = make_predictions_and_evaluate_gpu(conf,shot_list_train,loader) + print(classification_report(Yv, Y_predv)) + # print(confusion_matrix(Y,Y_pred)) + _, _, _, roc_area, loss = make_predictions_and_evaluate_gpu( + conf, shot_list_validate, loader) + # _, _, _, roc_area_train, loss_train = make_predictions_and_evaluate_gpu( + # conf, shot_list_train, loader) print('Validation Loss: {:.3e}'.format(loss)) print('Validation ROC: {:.4f}'.format(roc_area)) epoch_logs = {} - epoch_logs['val_roc'] = roc_area + epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss # epoch_logs['train_roc'] = roc_area_train - # epoch_logs['train_loss'] = loss_train + # epoch_logs['train_loss'] = loss_train callbacks.on_epoch_end(0, epoch_logs) - print('...done') -def make_predictions(conf,shot_list,loader,custom_path=None): +def make_predictions(conf, shot_list, loader, custom_path=None): feature_extractor = FeatureExtractor(loader) - save_prepath = feature_extractor.get_save_prepath() - if custom_path == None: - model_path = conf['paths']['model_save_path'] + model_filename#save_prepath + model_filename + # save_prepath = feature_extractor.get_save_prepath() + if custom_path is None: + model_path = conf['paths']['model_save_path'] + \ + model_filename # save_prepath + model_filename else: model_path = custom_path model = joblib.load(model_path) - #shot_list = shot_list.random_sublist(10) + # shot_list = shot_list.random_sublist(10) y_prime = [] y_gold = [] disruptive = [] - pbar = Progbar(len(shot_list)) - fn = partial(predict_single_shot,model=model,feature_extractor=feature_extractor) + pbar = Progbar(len(shot_list)) + fn = partial( + predict_single_shot, + model=model, + feature_extractor=feature_extractor) pool = mp.Pool() print('predicting in parallel on {} processes'.format(pool._processes)) - #for (y_p,y,disr) in map(fn,shot_list): - for (y_p,y,disr) in pool.imap(fn,shot_list): - #y_p,y,disr = predict_single_shot(model,feature_extractor,shot) - y_prime += [np.expand_dims(y_p,axis=1)] - y_gold += [np.expand_dims(y,axis=1)] + # for (y_p, y, disr) in map(fn, shot_list): + for (y_p, y, disr) in pool.imap(fn, shot_list): + # y_p, y, disr = predict_single_shot(model, feature_extractor,shot) + y_prime += [np.expand_dims(y_p, axis=1)] + y_gold += [np.expand_dims(y, axis=1)] disruptive += [disr] pbar.add(1.0) pool.close() pool.join() - return y_prime,y_gold,disruptive + return y_prime, y_gold, disruptive + -def predict_single_shot(shot,model,feature_extractor): - X,y,disr = feature_extractor.load_shot(shot,is_inference=True) - y_p = model.predict_proba(X)[:,1] - #print(y) - #print(y_p) +def predict_single_shot(shot, model, feature_extractor): + X, y, disr = feature_extractor.load_shot(shot, is_inference=True) + y_p = model.predict_proba(X)[:, 1] + # print(y) + # print(y_p) y = feature_extractor.prepend_timesteps(y) y_p = feature_extractor.prepend_timesteps(y_p) - return y_p,y,disr + return y_p, y, disr - -def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): - y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) +def make_predictions_and_evaluate_gpu( + conf, shot_list, loader, custom_path=None): + y_prime, y_gold, disruptive = make_predictions( + conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss - + roc_area = analyzer.get_roc_area(y_prime, y_gold, disruptive) + loss = get_loss_from_list(y_prime, y_gold, conf['data']['target']) + return y_prime, y_gold, disruptive, roc_area, loss diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 7aa3df6c..558d644f 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -1,27 +1,32 @@ import numpy as np import abc -from keras.losses import hinge, squared_hinge, mean_absolute_percentage_error -from plasma.utils.evaluation import mae_np,mse_np,binary_crossentropy_np,hinge_np,squared_hinge_np +from keras.losses import hinge # squared_hinge, mean_absolute_percentage_error +from plasma.utils.evaluation import ( + mse_np, binary_crossentropy_np, hinge_np, + # mae_np, squared_hinge_np, + ) import keras.backend as K -#Requirement: larger value must mean disruption more likely. +# Requirement: larger value must mean disruption more likely. + + class Target(object): activation = 'linear' loss = 'mse' @abc.abstractmethod - def loss_np(y_true,y_pred): + def loss_np(y_true, y_pred): from plasma.conf import conf - return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + return conf['model']['loss_scale_factor']*mse_np(y_true, y_pred) @abc.abstractmethod - def remapper(ttd,T_warning): + def remapper(ttd, T_warning): return -ttd @abc.abstractmethod def threshold_range(T_warning): - return np.logspace(-1,4,100) + return np.logspace(-1, 4, 100) class BinaryTarget(Target): @@ -29,12 +34,13 @@ class BinaryTarget(Target): loss = 'binary_crossentropy' @staticmethod - def loss_np(y_true,y_pred): - from plasma.conf import conf - return conf['model']['loss_scale_factor']*binary_crossentropy_np(y_true,y_pred) + def loss_np(y_true, y_pred): + from plasma.conf import conf + return (conf['model']['loss_scale_factor'] + * binary_crossentropy_np(y_true, y_pred)) @staticmethod - def remapper(ttd,T_warning,as_array_of_shots=True): + def remapper(ttd, T_warning, as_array_of_shots=True): binary_ttd = 0*ttd mask = ttd < np.log10(T_warning) binary_ttd[mask] = 1.0 @@ -43,28 +49,27 @@ def remapper(ttd,T_warning,as_array_of_shots=True): @staticmethod def threshold_range(T_warning): - return np.logspace(-6,0,100) + return np.logspace(-6, 0, 100) class TTDTarget(Target): activation = 'linear' loss = 'mse' - @staticmethod - def loss_np(y_true,y_pred): - from plasma.conf import conf - return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) + def loss_np(y_true, y_pred): + from plasma.conf import conf + return conf['model']['loss_scale_factor']*mse_np(y_true, y_pred) @staticmethod - def remapper(ttd,T_warning): + def remapper(ttd, T_warning): mask = ttd < np.log10(T_warning) ttd[~mask] = np.log10(T_warning) return -ttd @staticmethod def threshold_range(T_warning): - return np.linspace(-np.log10(T_warning),6,100) + return np.linspace(-np.log10(T_warning), 6, 100) class TTDInvTarget(Target): @@ -72,21 +77,21 @@ class TTDInvTarget(Target): loss = 'mse' @staticmethod - def loss_np(y_true,y_pred): - return mse_np(y_true,y_pred) + def loss_np(y_true, y_pred): + return mse_np(y_true, y_pred) @staticmethod - def remapper(ttd,T_warning): + def remapper(ttd, T_warning): eps = 1e-4 ttd = 10**(ttd) mask = ttd < T_warning ttd[~mask] = T_warning - ttd = (1.0)/(ttd+eps)#T_warning + ttd = (1.0)/(ttd+eps) # T_warning return ttd @staticmethod def threshold_range(T_warning): - return np.logspace(-6,np.log10(T_warning),100) + return np.logspace(-6, np.log10(T_warning), 100) class TTDLinearTarget(Target): @@ -94,26 +99,25 @@ class TTDLinearTarget(Target): loss = 'mse' @staticmethod - def loss_np(y_true,y_pred): + def loss_np(y_true, y_pred): from plasma.conf import conf - return conf['model']['loss_scale_factor']*mse_np(y_true,y_pred) - + return conf['model']['loss_scale_factor']*mse_np(y_true, y_pred) @staticmethod - def remapper(ttd,T_warning): + def remapper(ttd, T_warning): ttd = 10**(ttd) mask = ttd < T_warning - ttd[~mask] = 0#T_warning - ttd[mask] = T_warning - ttd[mask]#T_warning + ttd[~mask] = 0 # T_warning + ttd[mask] = T_warning - ttd[mask] # T_warning return ttd @staticmethod def threshold_range(T_warning): - return np.logspace(-6,np.log10(T_warning),100) + return np.logspace(-6, np.log10(T_warning), 100) -#implements a "maximum" driven loss function. Only the maximal value in the time sequence is punished. -#Also implements class weighting +# implements a "maximum" driven loss function. Only the maximal value in the +# time sequence is punished. Also implements class weighting class MaxHingeTarget(Target): activation = 'linear' fac = 1.0 @@ -122,35 +126,46 @@ class MaxHingeTarget(Target): def loss(y_true, y_pred): from plasma.conf import conf fac = MaxHingeTarget.fac - #overall_fac = np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) - overall_fac = K.prod(K.cast(K.shape(y_pred)[1:],K.floatx())) - max_val = K.max(y_pred,axis=-2) #temporal axis! - max_val1 = K.repeat(max_val,K.shape(y_pred)[-2]) - mask = K.cast(K.equal(max_val1,y_pred),K.floatx()) + # overall_fac = + # np.prod(np.array(K.shape(y_pred)[1:]).astype(np.float32)) + overall_fac = K.prod(K.cast(K.shape(y_pred)[1:], K.floatx())) + max_val = K.max(y_pred, axis=-2) # temporal axis! + max_val1 = K.repeat(max_val, K.shape(y_pred)[-2]) + mask = K.cast(K.equal(max_val1, y_pred), K.floatx()) y_pred1 = mask * y_pred + (1-mask) * y_true - weight_mask = K.mean(y_true,axis=-1) - weight_mask = K.cast(K.greater(weight_mask,0.0),K.floatx()) #positive label! + weight_mask = K.mean(y_true, axis=-1) + weight_mask = K.cast(K.greater(weight_mask, 0.0), + K.floatx()) # positive label! weight_mask = fac*weight_mask + (1 - weight_mask) - #return weight_mask*squared_hinge(y_true,y_pred1) - return conf['model']['loss_scale_factor']*overall_fac*weight_mask*hinge(y_true,y_pred1) + # return weight_mask*squared_hinge(y_true, y_pred1) + return conf['model']['loss_scale_factor'] * \ + overall_fac*weight_mask*hinge(y_true, y_pred1) @staticmethod def loss_np(y_true, y_pred): from plasma.conf import conf fac = MaxHingeTarget.fac - #print(y_pred.shape) + # print(y_pred.shape) overall_fac = np.prod(np.array(y_pred.shape).astype(np.float32)) - max_val = np.max(y_pred,axis=-2) #temporal axis! - max_val = np.reshape(max_val,max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) - max_val = np.tile(max_val,(1,y_pred.shape[-2],1)) - mask = np.equal(max_val,y_pred) + max_val = np.max(y_pred, axis=-2) # temporal axis! + max_val = np.reshape( + max_val, max_val.shape[:-1] + (1,) + (max_val.shape[-1],)) + max_val = np.tile(max_val, (1, y_pred.shape[-2], 1)) + mask = np.equal(max_val, y_pred) mask = mask.astype(np.float32) y_pred = mask * y_pred + (1-mask) * y_true - weight_mask = np.greater(y_true,0.0).astype(np.float32) #positive label! + weight_mask = np.greater( + y_true, 0.0).astype( + np.float32) # positive label! weight_mask = fac*weight_mask + (1 - weight_mask) - #return np.mean(weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.)))#, axis=-1) only during training, here we want to completely sum up over all instances - return conf['model']['loss_scale_factor']*np.mean(overall_fac*weight_mask*np.maximum(1. - y_true * y_pred, 0.))#, axis=-1) only during training, here we want to completely sum up over all instances - + # return np.mean( + # weight_mask*np.square(np.maximum(1. - y_true * y_pred, 0.))) + # , axis=-1) + # only during training, here we want to completely sum up over all + # instances + return (conf['model']['loss_scale_factor'] + * np.mean(overall_fac * weight_mask + * np.maximum(1. - y_true * y_pred, 0.))) # def _loss_tensor_old(y_true, y_pred): # max_val = K.max(y_pred) #temporal axis! @@ -158,9 +173,8 @@ def loss_np(y_true, y_pred): # y_pred = mask * y_pred + (1-mask) * y_true # return squared_hinge(y_true,y_pred) - @staticmethod - def remapper(ttd,T_warning,as_array_of_shots=True): + def remapper(ttd, T_warning, as_array_of_shots=True): binary_ttd = 0*ttd mask = ttd < np.log10(T_warning) binary_ttd[mask] = 1.0 @@ -169,22 +183,24 @@ def remapper(ttd,T_warning,as_array_of_shots=True): @staticmethod def threshold_range(T_warning): - return np.concatenate((np.linspace(-2,-1.06,100),np.linspace(-1.06,-0.96,100),np.linspace(-0.96,2,50))) + return np.concatenate( + (np.linspace(-2, -1.06, 100), np.linspace(-1.06, -0.96, 100), + np.linspace(-0.96, 2, 50))) class HingeTarget(Target): activation = 'linear' - loss = 'hinge' #hinge - + loss = 'hinge' # hinge + @staticmethod def loss_np(y_true, y_pred): from plasma.conf import conf - return conf['model']['loss_scale_factor']*hinge_np(y_true,y_pred) - #return squared_hinge_np(y_true,y_pred) - + return conf['model']['loss_scale_factor']*hinge_np(y_true, y_pred) + # return squared_hinge_np(y_true, y_pred) + @staticmethod - def remapper(ttd,T_warning,as_array_of_shots=True): + def remapper(ttd, T_warning, as_array_of_shots=True): binary_ttd = 0*ttd mask = ttd < np.log10(T_warning) binary_ttd[mask] = 1.0 @@ -193,4 +209,6 @@ def remapper(ttd,T_warning,as_array_of_shots=True): @staticmethod def threshold_range(T_warning): - return np.concatenate((np.linspace(-2,-1.06,100),np.linspace(-1.06,-0.96,100),np.linspace(-0.96,2,50))) + return np.concatenate( + (np.linspace(-2, -1.06, 100), np.linspace(-1.06, -0.96, 100), + np.linspace(-0.96, 2, 50))) From 040407aeee557a057f30852df24e3718a28b1982 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 14:14:25 -0500 Subject: [PATCH 561/744] Clean up files in plasma/preprocessor --- plasma/preprocessor/augment.py | 103 +++++----- plasma/preprocessor/normalize.py | 319 +++++++++++++++++------------- plasma/preprocessor/preprocess.py | 205 +++++++++++-------- 3 files changed, 365 insertions(+), 262 deletions(-) diff --git a/plasma/preprocessor/augment.py b/plasma/preprocessor/augment.py index 38903f1f..9ecb4d43 100644 --- a/plasma/preprocessor/augment.py +++ b/plasma/preprocessor/augment.py @@ -1,13 +1,11 @@ from __future__ import print_function -import os -import time,sys import abc import numpy as np import random class ByShotAugmentator(object): - def __init__(self,normalizer): + def __init__(self, normalizer): self.normalizer = normalizer def __str__(self): @@ -15,35 +13,39 @@ def __str__(self): s += "\n including by shot augmentation" return s - def apply(self,shot): + def apply(self, shot): ''' - The purpose of the method is to apply normalization to a shot and then optionally apply augmentation with a function that is individual to every shot. + The purpose of the method is to apply normalization to a shot and then + optionally apply augmentation with a function that is individual to + every shot. - Argument list: + Argument list: - shot: plasma shot. Should contain an augment function Config parameters list: - - conf['data']['augment_during_training']: boolean flag, yes or no to augment during training + - conf['data']['augment_during_training']: boolean flag, yes or no to + augment during training + ''' - #first just apply normalization as usual. + # first just apply normalization as usual. self.normalizer.apply(shot) if shot.augmentation_fn is not None: shot.augmentation_fn(shot) - def set_inference_mode(self,is_inference): + def set_inference_mode(self, is_inference): self.normalizer.set_inference_mode(is_inference) class AbstractAugmentator(object): - def __init__(self,normalizer,is_inference,conf): + def __init__(self, normalizer, is_inference, conf): self.conf = conf self.to_augment_str = self.conf['data']['signal_to_augment'] self.normalizer = normalizer self.is_inference = is_inference - #set whether we are training or testing - def set_inference(self,is_inference): + # set whether we are training or testing + def set_inference(self, is_inference): self.is_inference = is_inference def __str__(self): @@ -52,78 +54,89 @@ def __str__(self): s += "Signal to augmented: {}\n".format(self.to_augment_str) s += "Is inference: {}\n".format(self.is_inference) return s - - #for compatibility with code that changes the mode of the normalizer - def set_inference_mode(self,is_inference): + + # for compatibility with code that changes the mode of the normalizer + def set_inference_mode(self, is_inference): self.normalizer.set_inference_mode(is_inference) @abc.abstractmethod - def apply(self,shot): + def apply(self, shot): pass @abc.abstractmethod - def augment(self,sig): + def augment(self, sig): pass - + class Augmentator(AbstractAugmentator): - def apply(self,shot): + def apply(self, shot): ''' - The purpose of the method is to apply normalization to a shot and then optionally apply augmentation. - During inference, a specific signal (one at a time) is augmented based on the string supplied in the config file. - During training, augment a random signal (again, one at a time) or do not augment at all. + The purpose of the method is to apply normalization to a shot and then + optionally apply augmentation. During inference, a specific signal + (one at a time) is augmented based on the string supplied in the config + file. During training, augment a random signal (again, one at a time) + or do not augment at all. It performs calls to: Augmentator.augment(), random.random.choice - Argument list: + Argument list: - shot: plasma shot Config parameters list: - - conf['data']['augment_during_training']: boolean flag, yes or no to augment during training + - conf['data']['augment_during_training']: boolean flag, yes or no to + augment during training + ''' - #first just apply normalization as usual. + # first just apply normalization as usual. self.normalizer.apply(shot) if self.is_inference: - #during inference, augment a specific signal (one at a time) + # during inference, augment a specific signal (one at a time) to_augment_str = self.to_augment_str - else: - #during training augment a random signal, one at a time + else: + # during training augment a random signal, one at a time if self.conf['data']['augment_during_training']: - to_augment_str = random.choice([x.description for x in shot.signals]) + to_augment_str = random.choice( + [x.description for x in shot.signals]) else: - to_augment_str = None + to_augment_str = None if to_augment_str is not None: - #FIXME might be better to use search. are we always going to augment 1 signal at a time? - for (i,sig) in enumerate(shot.signals): + # FIXME might be better to use search. are we always going to + # augment 1 signal at a time? + for (i, sig) in enumerate(shot.signals): if sig.description == to_augment_str: - print ('Augmenting {} signal'.format(sig.description)) - shot.signals_dict[sig] = self.augment(shot.signals_dict[sig]) + print('Augmenting {} signal'.format(sig.description)) + shot.signals_dict[sig] = self.augment( + shot.signals_dict[sig]) - def augment(self,signal,strength=10): + def augment(self, signal, strength=10): ''' - The purpose of the method is to modify a signal specified by a configuration parameter or at random according to - a specific mode. Modes include: noise, zeroing and no augmentation. + The purpose of the method is to modify a signal specified by a + configuration parameter or at random according to a specific + mode. Modes include: noise, zeroing and no augmentation. It performs calls to: numpy random number generator - Argument list: + Argument list: - signal: signal - - strength: strength of the noise, measured in standard deviations. Integer, default value: 10 + - strength: strength of the noise, measured in standard + deviations. Integer, default value: 10 Config parameters list: - - conf['data']['augmentation_mode']: categorical config parameter specifying how to augment. Possible values - include "noise", "zero" and "none" (strings) + - conf['data']['augmentation_mode']: categorical config parameter + specifying how to augment. Possible values include "noise", "zero" and + "none" (strings) - Returns: + Returns: - signal: augmented signal ... numpy array of numeric types? ''' if self.conf['data']['augmentation_mode'] == "noise": - return np.random.normal(0,strength,signal.shape) + return np.random.normal(0, strength, signal.shape) elif self.conf['data']['augmentation_mode'] == "zero": - return signal*0.0 #if "set to zero" augmentation. Can control in conf. + # if "set to zero" augmentation. Can control in conf. + return signal*0.0 elif self.conf['data']['augmentation_mode'] == "none": - return signal #if no augmentation. Should be the default in conf. + return signal # if no augmentation. Should be the default in conf. else: print("Unknown augmentation mode. Exiting") exit(-1) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index f9f23ac0..3f181d0d 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -10,32 +10,34 @@ from __future__ import print_function import os -import time,sys +import time +import sys import abc import numpy as np -from scipy.signal import exponential,correlate +from scipy.signal import exponential, correlate import pathos.multiprocessing as mp from plasma.primitives.shots import ShotList, Shot -from plasma.utils.processing import get_signal_slices '''TODO - incorporate stats, pass machine (perhaps save machine in stats object!) - incorporate stats, have a dictionary of aggregate stats for every machine. -- check "is_previously_saved" by making sure there is a normalizer for every machine -''' - +- check "is_previously_saved" by making sure there is a normalizer for every +machine +''' -#######NORMALIZATION########## +################# +# NORMALIZATION # +################# class Stats(object): pass class Normalizer(object): - def __init__(self,conf): + def __init__(self, conf): self.num_processed = dict() self.num_disruptive = dict() self.conf = conf @@ -50,15 +52,15 @@ def __str__(self): pass @abc.abstractmethod - def extract_stats(self,shot): + def extract_stats(self, shot): pass @abc.abstractmethod - def incorporate_stats(self,stats): + def incorporate_stats(self, stats): pass @abc.abstractmethod - def apply(self,shot): + def apply(self, shot): pass @abc.abstractmethod @@ -69,19 +71,20 @@ def save_stats(self): def load_stats(self): pass - def set_inference_mode(self,val): + def set_inference_mode(self, val): self.inference_mode = val - def ensure_machine(self,machine): + def ensure_machine(self, machine): if machine not in self.means: - self.num_processed[machine] = 0 - self.num_disruptive[machine] = 0 - ######Modify the above to change the specifics of the normalization scheme####### + self.num_processed[machine] = 0 + self.num_disruptive[machine] = 0 + # Modify the above to change the specifics of the normalization scheme def train(self): conf = self.conf - #only use training shots here!! "Don't touch testing shots" - shot_files = conf['paths']['shot_files']# + conf['paths']['shot_files_test'] + # only use training shots here!! "Don't touch testing shots" + # + conf['paths']['shot_files_test'] + shot_files = conf['paths']['shot_files'] shot_files_all = conf['paths']['shot_files_all'] all_machines = set([file.machine for file in shot_files_all]) train_machines = set([file.machine for file in shot_files]) @@ -89,22 +92,22 @@ def train(self): if train_machines >= all_machines: shot_files_use = shot_files else: - print('Testing set contains new machine, using testing set to train normalizer for that machine.') + print('Testing set contains new machine, using testing set ', + 'to train normalizer for that machine.') shot_files_use = shot_files_all # shot_list_dir = conf['paths']['shot_list_dir'] - use_shots = max(400,conf['data']['use_shots']) - return self.train_on_files(shot_files_use,use_shots,all_machines) + use_shots = max(400, conf['data']['use_shots']) + return self.train_on_files(shot_files_use, use_shots, all_machines) - - def train_on_files(self,shot_files,use_shots,all_machines): + def train_on_files(self, shot_files, use_shots, all_machines): conf = self.conf - all_signals = conf['paths']['all_signals'] + all_signals = conf['paths']['all_signals'] shot_list = ShotList() - shot_list.load_from_shot_list_files_objects(shot_files,all_signals) - shot_list_picked = shot_list.random_sublist(use_shots) + shot_list.load_from_shot_list_files_objects(shot_files, all_signals) + shot_list_picked = shot_list.random_sublist(use_shots) - previously_saved,machines_saved = self.previously_saved_stats() + previously_saved, machines_saved = self.previously_saved_stats() machines_to_compute = all_machines - machines_saved recompute = conf['data']['recompute_normalization'] if recompute: @@ -114,34 +117,43 @@ def train_on_files(self,shot_files,use_shots,all_machines): if not previously_saved or len(machines_to_compute) > 0: if previously_saved: self.load_stats() - print('computing normalization for machines {}'.format(machines_to_compute)) - use_cores = max(1,mp.cpu_count()-2) + print('computing normalization for machines {}'.format( + machines_to_compute)) + use_cores = max(1, mp.cpu_count()-2) pool = mp.Pool(use_cores) - print('running in parallel on {} processes'.format(pool._processes)) + print('running in parallel on {} processes'.format( + pool._processes)) start_time = time.time() - for (i,stats) in enumerate(pool.imap_unordered(self.train_on_single_shot,shot_list_picked)): - #for (i,stats) in enumerate(map(self.train_on_single_shot,shot_list_picked)): + for (i, stats) in enumerate(pool.imap_unordered( + self.train_on_single_shot, + shot_list_picked)): + # for (i,stats) in + # enumerate(map(self.train_on_single_shot,shot_list_picked)): if stats.machine in machines_to_compute: self.incorporate_stats(stats) self.machines.add(stats.machine) - sys.stdout.write('\r' + '{}/{}'.format(i,len(shot_list_picked))) + sys.stdout.write('\r' + + '{}/{}'.format(i, len(shot_list_picked))) pool.close() pool.join() - print('Finished Training Normalizer on {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) + print('Finished Training Normalizer on ', + '{} files in {} seconds'.format(len(shot_list_picked), + time.time()-start_time)) self.save_stats() else: self.load_stats() print(self) - - def cut_end_of_shot(self,shot): + def cut_end_of_shot(self, shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] - if not self.inference_mode and cut_shot_ends: #only cut shots during training + # only cut shots during training + if not self.inference_mode and cut_shot_ends: T_min_warn = self.conf['data']['T_min_warn'] for key in shot.signals_dict: - shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] + shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn, + :] shot.ttd = shot.ttd[:-T_min_warn] # def apply_mask(self,shot): @@ -151,18 +163,19 @@ def cut_end_of_shot(self,shot): # def apply_positivity_mask(self,shot): # mask = self.conf['paths']['positivity_mask'] # mask = [np.array(subl) for subl in mask] - # indices = np.concatenate([indices_sublist[mask[i]] for i,indices_sublist in enumerate(self.get_indices_list())]) + # indices = np.concatenate([indices_sublist[mask[i]] for + # i,indices_sublist in enumerate(self.get_indices_list())]) # shot.signals[:,indices] = np.clip(shot.signals[:,indices],0,np.Inf) - def train_on_single_shot(self,shot): - assert isinstance(shot,Shot), 'should be instance of shot' + def train_on_single_shot(self, shot): + assert isinstance(shot, Shot), 'should be instance of shot' processed_prepath = self.conf['paths']['processed_prepath'] shot.restore(processed_prepath) - #print(shot) - stats = self.extract_stats(shot) + # print(shot) + stats = self.extract_stats(shot) shot.make_light() return stats - + def ensure_save_directory(self): prepath = os.path.dirname(self.path) if not os.path.exists(prepath): @@ -170,27 +183,25 @@ def ensure_save_directory(self): def previously_saved_stats(self): if not os.path.isfile(self.path): - return False,set([]) + return False, set([]) else: - dat = np.load(self.path,encoding="latin1") + dat = np.load(self.path, encoding="latin1") machines = dat['machines'][()] - ret = all([m in machines for m in self.conf['paths']['all_machines']]) + ret = all( + [m in machines for m in self.conf['paths']['all_machines']]) if not ret: print(machines) print(self.conf['paths']['all_machines']) print('Not all machines present. Recomputing normalizer.') - return True,set(machines) + return True, set(machines) # def get_indices_list(self): # return get_signal_slices(self.conf['paths']['signals_dirs']) - - - class MeanVarNormalizer(Normalizer): - def __init__(self,conf): - Normalizer.__init__(self,conf) + def __init__(self, conf): + Normalizer.__init__(self, conf) self.means = dict() self.stds = dict() self.bound = self.conf['data']['norm_stat_range'] @@ -198,19 +209,23 @@ def __init__(self,conf): def __str__(self): s = '' for machine in self.means: - means = np.median(self.means[machine],axis=0) - stds = np.median(self.stds[machine],axis=0) - s += 'Machine: {}:\nMean Var Normalizer.\nmeans: {}\nstds: {}'.format(machine,means,stds) - return s + means = np.median(self.means[machine], axis=0) + stds = np.median(self.stds[machine], axis=0) + s += 'Machine: {}:\nMean Var Normalizer.\n'.format(machine) + s += 'means: {}\nstds: {}'.format(means, stds) + return s - def extract_stats(self,shot): + def extract_stats(self, shot): stats = Stats() if shot.valid: list_of_signals = shot.get_individual_signal_arrays() num_signals = len(list_of_signals) - stats.means = np.reshape(np.array([np.mean(sig) for sig in list_of_signals]),(1,num_signals)) - stats.stds = np.reshape(np.array([np.std(sig,dtype=np.float64) for sig in list_of_signals]),(1,num_signals)) - + stats.means = np.reshape(np.array([np.mean(sig) for + sig in list_of_signals]), + (1, num_signals)) + stats.stds = np.reshape(np.array([np.std(sig, dtype=np.float64) for + sig in list_of_signals]), + (1, num_signals)) stats.is_disruptive = shot.is_disruptive else: print('Warning: shot {} not valid, omitting'.format(shot.number)) @@ -218,9 +233,7 @@ def extract_stats(self,shot): stats.machine = shot.machine return stats - - - def incorporate_stats(self,stats): + def incorporate_stats(self, stats): machine = stats.machine self.ensure_machine(stats.machine) if stats.valid: @@ -228,95 +241,113 @@ def incorporate_stats(self,stats): stds = stats.stds if self.num_processed[machine] == 0: self.means[machine] = means - self.stds[machine] = stds + self.stds[machine] = stds else: - self.means[machine] = np.concatenate((self.means[machine],means),axis=0) - self.stds[machine] = np.concatenate((self.stds[machine],stds),axis=0) + self.means[machine] = np.concatenate( + (self.means[machine], means), axis=0) + self.stds[machine] = np.concatenate( + (self.stds[machine], stds), axis=0) self.num_processed[machine] = self.num_processed[machine] + 1 - self.num_disruptive[machine] = self.num_disruptive[machine] + (1 if stats.is_disruptive else 0) + self.num_disruptive[machine] = self.num_disruptive[machine] + \ + (1 if stats.is_disruptive else 0) - - def apply(self,shot): + def apply(self, shot): apply_positivity(shot) m = shot.machine - assert self.means[m] is not None and self.stds[m] is not None, "self.means or self.stds not initialized" - means = np.median(self.means[m],axis=0) - stds = np.median(self.stds[m],axis=0) - for (i,sig) in enumerate(shot.signals): + assert self.means[m] is not None and self.stds[m] is not None, ( + "self.means or self.stds not initialized") + means = np.median(self.means[m], axis=0) + stds = np.median(self.stds[m], axis=0) + for (i, sig) in enumerate(shot.signals): if sig.normalize: stds_curr = stds[i] if stds_curr == 0.0: stds_curr = 1.0 - shot.signals_dict[sig] = (shot.signals_dict[sig] - means[i])/stds_curr - shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) + shot.signals_dict[sig] = ( + shot.signals_dict[sig] - means[i])/stds_curr + shot.signals_dict[sig] = np.clip( + shot.signals_dict[sig], -self.bound, self.bound) - shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) + shot.ttd = self.remapper(shot.ttd, self.conf['data']['T_warning']) self.cut_end_of_shot(shot) # self.apply_positivity_mask(shot) # self.apply_mask(shot) - def save_stats(self): # standard_deviations = dat['standard_deviations'] # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] self.ensure_save_directory() - np.savez(self.path,means = self.means,stds = self.stds, - num_processed=self.num_processed,num_disruptive=self.num_disruptive,machines=self.machines) - print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) + np.savez( + self.path, + means=self.means, + stds=self.stds, + num_processed=self.num_processed, + num_disruptive=self.num_disruptive, + machines=self.machines) + print( + 'saved normalization data from {} shots ( {} disruptive )'.format( + self.num_processed, + self.num_disruptive)) def load_stats(self): assert self.previously_saved_stats()[0], "stats not saved before" - dat = np.load(self.path,encoding="latin1") + dat = np.load(self.path, encoding="latin1") self.means = dat['means'][()] self.stds = dat['stds'][()] self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] for machine in self.means: - print('Machine {}:'.format(machine)) - print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) - #print('loading normalization data from {} shots, {} disruptive'.format(num_processed,num_disruptive)) + print('Machine {}:'.format(machine)) + print('loaded normalization data from ', + '{} shots ( {} disruptive )'.format(self.num_processed, + self.num_disruptive)) class VarNormalizer(MeanVarNormalizer): - def apply(self,shot): + def apply(self, shot): apply_positivity(shot) - assert self.means is not None and self.stds is not None, "self.means or self.stds not initialized" + assert self.means is not None and self.stds is not None, ( + "self.means or self.stds not initialized") m = shot.machine - stds = np.median(self.stds[m],axis=0) - for (i,sig) in enumerate(shot.signals): + stds = np.median(self.stds[m], axis=0) + for (i, sig) in enumerate(shot.signals): if sig.normalize: stds_curr = stds[i] if stds_curr == 0.0: stds_curr = 1.0 shot.signals_dict[sig] = (shot.signals_dict[sig])/stds_curr - shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) - shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) + shot.signals_dict[sig] = np.clip( + shot.signals_dict[sig], -self.bound, self.bound) + shot.ttd = self.remapper(shot.ttd, self.conf['data']['T_warning']) self.cut_end_of_shot(shot) def __str__(self): s = '' for m in self.stds: - stds = np.median(self.stds[m],axis=0) - s += 'Machine: {}:\n'.format(m) - s += 'Var Normalizer.\nstds: {}\n'.format(stds) + stds = np.median(self.stds[m], axis=0) + s += 'Machine: {}:\n'.format(m) + s += 'Var Normalizer.\nstds: {}\n'.format(stds) return s class AveragingVarNormalizer(VarNormalizer): - def apply(self,shot): + def apply(self, shot): apply_positivity(shot) - super(AveragingVarNormalizer,self).apply(shot) + super(AveragingVarNormalizer, self).apply(shot) window_decay = self.conf['data']['window_decay'] window_size = self.conf['data']['window_size'] - window = exponential(window_size,0,window_decay,False) + window = exponential(window_size, 0, window_decay, False) window /= np.sum(window) - for (i,sig) in enumerate(shot.signals): + for (i, sig) in enumerate(shot.signals): if sig.normalize: - shot.signals_dict[sig] = apply_along_axis(lambda m : correlate(m,window,'valid'),axis=0,arr=shot.signals_dict[sig]) - shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) + shot.signals_dict[sig] = np.apply_along_axis( + lambda m: correlate(m, window, 'valid'), + axis=0, arr=shot.signals_dict[sig]) + shot.signals_dict[sig] = np.clip( + shot.signals_dict[sig], -self.bound, self.bound) shot.ttd = shot.ttd[-shot.signals.shape[0]:] def __str__(self): @@ -324,27 +355,30 @@ def __str__(self): window_size = self.conf['data']['window_size'] s = '' for m in self.stds: - stds = np.median(self.stds[m],axis=0) - s += 'Machine: {}:\n'.format(m) - s += 'Averaging Var Normalizer.\nstds: {}\nWindow size: {}, Window decay: {}'.format(stds,window_size,window_decay) + stds = np.median(self.stds[m], axis=0) + s += 'Machine: {}:\n'.format(m) + s += 'Averaging Var Normalizer.\nstds: ' + s += ' {}\nWindow size: {}, Window decay: {}'.format( + stds, window_size, window_decay) return s class MinMaxNormalizer(Normalizer): - def __init__(self,conf): - Normalizer.__init__(self,conf) + def __init__(self, conf): + Normalizer.__init__(self, conf) self.minimums = None self.maximums = None self.bound = self.conf['data']['norm_stat_range'] - def __str__(self): s = '' for m in self.minimums: - s += 'Machine {}:\n.Min Max Normalizer.\nminimums: {}\nmaximums: {}'.format(m,self.minimums[m],self.maximums[m]) - return s + s += 'Machine {}:\n.Min Max Normalizer.\n'.format(m, + self.minimums[m]) + s += 'minimums: {}\nmaximums: {}'.format(self.maximums[m]) + return s - def extract_stats(self,shot): + def extract_stats(self, shot): stats = Stats() if shot.valid: list_of_signals = shot.get_individual_signal_arrays() @@ -357,8 +391,7 @@ def extract_stats(self,shot): stats.machine = shot.machine return stats - - def incorporate_stats(self,stats): + def incorporate_stats(self, stats): self.ensure_machine(stats.machine) if stats.valid: m = stats.machine @@ -368,25 +401,30 @@ def incorporate_stats(self,stats): self.minimums[m] = minimums self.maximums[m] = maximums else: - self.minimums[m] = (self.num_processed[m]*self.minimums + minimums)/(self.num_processed[m] + 1.0)#snp.min(vstack((self.minimums,minimums)),0) - self.maximums[m] = (self.num_processed[m]*self.maximums + maximums)/(self.num_processed[m] + 1.0)#snp.max(vstack((self.maximums,maximums)),0) + self.minimums[m] = (self.num_processed[m]*self.minimums + + minimums)/(self.num_processed[m] + 1.0) + self.maximums[m] = (self.num_processed[m]*self.maximums + + maximums)/(self.num_processed[m] + 1.0) self.num_processed[m] = self.num_processed[m] + 1 - self.num_disruptive[m] = self.num_disruptive[m] + (1 if stats.is_disruptive else 0) - + self.num_disruptive[m] = self.num_disruptive[m] + \ + (1 if stats.is_disruptive else 0) - def apply(self,shot): + def apply(self, shot): apply_positivity(shot) - assert(self.minimums is not None and self.maximums is not None) + assert(self.minimums is not None and self.maximums is not None) m = shot.machine curr_range = (self.maximums[m] - self.minimums[m]) if curr_range == 0.0: - curr_range = 1.0 + curr_range = 1.0 shot.signals = (shot.signals - self.minimums[m])/curr_range - for (i,sig) in enumerate(shot.signals): + for (i, sig) in enumerate(shot.signals): if sig.normalize: - shot.signals_dict[sig] = (shot.signals_dict[sig] - self.minimums[m])/(self.maximums[m] - self.minimums[m]) - shot.signals_dict[sig] = np.clip(shot.signals_dict[sig],-self.bound,self.bound) - shot.ttd = self.remapper(shot.ttd,self.conf['data']['T_warning']) + shot.signals_dict[sig] = ( + shot.signals_dict[sig] - self.minimums[m])/( + self.maximums[m] - self.minimums[m]) + shot.signals_dict[sig] = np.clip( + shot.signals_dict[sig], -self.bound, self.bound) + shot.ttd = self.remapper(shot.ttd, self.conf['data']['T_warning']) self.cut_end_of_shot(shot) # self.apply_positivity_mask(shot) # self.apply_mask(shot) @@ -396,29 +434,42 @@ def save_stats(self): # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] self.ensure_save_directory() - np.savez(self.path,minimums = self.minimums,maximums = self.maximums, - num_processed=self.num_processed,num_disruptive=self.num_disruptive,machines=self.machines) - print('saved normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) + np.savez( + self.path, + minimums=self.minimums, + maximums=self.maximums, + num_processed=self.num_processed, + num_disruptive=self.num_disruptive, + machines=self.machines) + print( + 'saved normalization data from {} shots ( {} disruptive )'.format( + self.num_processed, + self.num_disruptive)) def load_stats(self): assert(self.previously_saved_stats()[0]) - dat = np.load(self.path,encoding="latin1") + dat = np.load(self.path, encoding="latin1") self.minimums = dat['minimums'][()] self.maximums = dat['maximums'][()] self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] - print('loaded normalization data from {} shots ( {} disruptive )'.format(self.num_processed,self.num_disruptive)) - #print('loading normalization data from {} shots, {} disruptive'.format(num_processed,num_disruptive)) + print( + 'loaded normalization data from {} shots ( {} disruptive )'.format( + self.num_processed, + self.num_disruptive)) -def get_individual_shot_file(prepath,shot_num,ext='.txt'): - return prepath + str(shot_num) + ext +def get_individual_shot_file(prepath, shot_num, ext='.txt'): + return prepath + str(shot_num) + ext def apply_positivity(shot): - for (i,sig) in enumerate(shot.signals): - if hasattr(sig,"is_strictly_positive"): #backwards compatibility when this attribute didn't exist + for (i, sig) in enumerate(shot.signals): + if hasattr(sig, "is_strictly_positive"): + # backwards compatibility when this attribute didn't exist if sig.is_strictly_positive: - #print ('Applying positivity constraint to {} signal'.format(sig.description)) - shot.signals_dict[sig]=np.clip(shot.signals_dict[sig],0,np.inf) + # print ('Applying positivity constraint to {} + # signal'.format(sig.description)) + shot.signals_dict[sig] = np.clip( + shot.signals_dict[sig], 0, np.inf) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 1d12f6c3..17a5699f 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -9,7 +9,7 @@ ''' from __future__ import print_function -from os import listdir,remove +from os import listdir # , remove import time import sys import os @@ -17,42 +17,44 @@ import numpy as np import pathos.multiprocessing as mp -from plasma.utils.processing import * +from plasma.utils.processing import append_to_filename from plasma.primitives.shots import ShotList from plasma.utils.downloading import mkdirdepth + class Preprocessor(object): - def __init__(self,conf): + def __init__(self, conf): self.conf = conf - def clean_shot_lists(self): shot_list_dir = self.conf['paths']['shot_list_dir'] - paths = [os.path.join(shot_list_dir, f) for f in listdir(shot_list_dir) if os.path.isfile(os.path.join(shot_list_dir, f))] + paths = [ + os.path.join( + shot_list_dir, + f) for f in listdir(shot_list_dir) if os.path.isfile( + os.path.join( + shot_list_dir, + f))] for path in paths: self.clean_shot_list(path) - - def clean_shot_list(self,path): + def clean_shot_list(self, path): data = np.loadtxt(path) - ending_idx = path.rfind('.') - new_path = append_to_filename(path,'_clear') + # ending_idx = path.rfind('.') + new_path = append_to_filename(path, '_clear') if len(np.shape(data)) < 2: - #nondisruptive + # nondisruptive nd_times = -1.0*np.ones_like(data) - data_two_column = np.vstack((data,nd_times)).transpose() - np.savetxt(new_path,data_two_column,fmt = '%d %f') + data_two_column = np.vstack((data, nd_times)).transpose() + np.savetxt(new_path, data_two_column, fmt='%d %f') print('created new file: {}'.format(new_path)) print('deleting old file: {}'.format(path)) os.remove(path) - def all_are_preprocessed(self): return os.path.isfile(self.get_shot_list_path()) - - def preprocess_all(self): conf = self.conf shot_files_all = conf['paths']['shot_files_all'] @@ -60,47 +62,65 @@ def preprocess_all(self): # shot_files_test = conf['paths']['shot_files_test'] # shot_list_dir = conf['paths']['shot_list_dir'] use_shots = conf['data']['use_shots'] - train_frac = conf['training']['train_frac'] - use_shots_train = int(round(train_frac*use_shots)) - use_shots_test = int(round((1-train_frac)*use_shots)) -# print(use_shots_train) -# print(use_shots_test) #each print out 100,000 + # train_frac = conf['training']['train_frac'] + # use_shots_train = int(round(train_frac*use_shots)) + # use_shots_test = int(round((1-train_frac)*use_shots)) + # print(use_shots_train) + # print(use_shots_test) #each print out 100,000 + # if len(shot_files_test) > 0: - # return self.preprocess_from_files(shot_list_dir,shot_files_train,machines_train,use_shots_train) + \ - # self.preprocess_from_files(shot_list_dir,shot_files_test,machines_train,use_shots_test) + # return + # self.preprocess_from_files(shot_list_dir,shot_files_train, + # machines_train,use_shots_train) + # + self.preprocess_from_files(shot_list_dir, + # shot_files_test,machines_train,use_shots_test) # else: - return self.preprocess_from_files(shot_files_all,use_shots) + return self.preprocess_from_files(shot_files_all, use_shots) - - def preprocess_from_files(self,shot_files,use_shots): - #all shots, including invalid ones - all_signals = self.conf['paths']['all_signals'] + def preprocess_from_files(self, shot_files, use_shots): + # all shots, including invalid ones + all_signals = self.conf['paths']['all_signals'] shot_list = ShotList() - shot_list.load_from_shot_list_files_objects(shot_files,all_signals) + shot_list.load_from_shot_list_files_objects(shot_files, all_signals) shot_list_picked = shot_list.random_sublist(use_shots) - #empty + # empty used_shots = ShotList() - use_cores = max(1,mp.cpu_count()-2) + use_cores = max(1, mp.cpu_count()-2) pool = mp.Pool(use_cores) print('running in parallel on {} processes'.format(pool._processes)) start_time = time.time() - for (i,shot) in enumerate(pool.imap_unordered(self.preprocess_single_file,shot_list_picked)): - #for (i,shot) in enumerate(map(self.preprocess_single_file,shot_list_picked)): - sys.stdout.write('\r{}/{}'.format(i,len(shot_list_picked))) + for ( + i, + shot) in enumerate( + pool.imap_unordered( + self.preprocess_single_file, + shot_list_picked)): + # for (i,shot) in + # enumerate(map(self.preprocess_single_file,shot_list_picked)): + sys.stdout.write('\r{}/{}'.format(i, len(shot_list_picked))) used_shots.append_if_valid(shot) pool.close() pool.join() - print('Finished Preprocessing {} files in {} seconds'.format(len(shot_list_picked),time.time()-start_time)) - print('Omitted {} shots of {} total.'.format(len(shot_list_picked) - len(used_shots),len(shot_list_picked))) - print('{}/{} disruptive shots'.format(used_shots.num_disruptive(),len(used_shots))) + print('Finished Preprocessing {} files in {} seconds'.format( + len(shot_list_picked), time.time()-start_time)) + print( + 'Omitted {} shots of {} total.'.format( + len(shot_list_picked) + - len(used_shots), + len(shot_list_picked))) + print('{}/{} disruptive shots'.format(used_shots.num_disruptive(), + len(used_shots))) if len(used_shots) == 0: - print("WARNING: All shots were omitted, please ensure raw data is complete and available at {}.".format(self.conf['paths']['signal_prepath'])) - return used_shots + print( + "WARNING: All shots were omitted, please ensure raw data " + " is complete and available at {}.".format( + self.conf['paths']['signal_prepath'])) + return used_shots - def preprocess_single_file(self,shot): + def preprocess_single_file(self, shot): processed_prepath = self.conf['paths']['processed_prepath'] recompute = self.conf['data']['recompute'] # print('({}/{}): '.format(num_processed,use_shots)) @@ -110,52 +130,62 @@ def preprocess_single_file(self,shot): else: try: - shot.restore(processed_prepath,light=True) + shot.restore(processed_prepath, light=True) sys.stdout.write('\r{} exists.'.format(shot.number)) - except: + except BaseException: shot.preprocess(self.conf) shot.save(processed_prepath) - sys.stdout.write('\r{} exists but corrupted, resaved.'.format(shot.number)) + sys.stdout.write( + '\r{} exists but corrupted, resaved.'.format( + shot.number)) shot.make_light() - return shot - + return shot def get_individual_channel_dirs(self): - signals_dirs = self.conf['paths']['signals_dirs'] + return self.conf['paths']['signals_dirs'] def get_shot_list_path(self): return self.conf['paths']['saved_shotlist_path'] def load_shotlists(self): path = self.get_shot_list_path() - data = np.load(path,encoding="latin1") + data = np.load(path, encoding="latin1") shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] - if isinstance(shot_list_train,ShotList): - return shot_list_train,shot_list_validate,shot_list_test + if isinstance(shot_list_train, ShotList): + return shot_list_train, shot_list_validate, shot_list_test else: - return ShotList(shot_list_train),ShotList(shot_list_validate),ShotList(shot_list_test) - - - def save_shotlists(self,shot_list_train,shot_list_validate,shot_list_test): + return ShotList(shot_list_train), ShotList( + shot_list_validate), ShotList(shot_list_test) + + def save_shotlists( + self, + shot_list_train, + shot_list_validate, + shot_list_test): path = self.get_shot_list_path() mkdirdepth(path) - np.savez(path,shot_list_train=shot_list_train,shot_list_validate=shot_list_validate,shot_list_test=shot_list_test) + np.savez( + path, + shot_list_train=shot_list_train, + shot_list_validate=shot_list_validate, + shot_list_test=shot_list_test) - -def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): +def apply_bleed_in(conf, shot_list_train, shot_list_validate, shot_list_test): np.random.seed(2) num = conf['data']['bleed_in'] - new_shots = [] + # new_shots = [] if num > 0: shot_list_bleed = ShotList() print('applying bleed in with {} disruptive shots\n'.format(num)) - num_total = len(shot_list_test) + # num_total = len(shot_list_test) num_d = shot_list_test.num_disruptive() - num_nd = num_total - num_d - assert(num_d >= num), "Not enough disruptive shots {} to cover bleed in {}".format(num_d,num) + # num_nd = num_total - num_d + assert num_d >= num, ( + "Not enough disruptive shots {} to cover bleed in {}".format( + num_d, num)) num_sampled_d = 0 num_sampled_nd = 0 while num_sampled_d < num: @@ -167,12 +197,15 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): num_sampled_d += 1 else: num_sampled_nd += 1 - print("Sampled {} shots, {} disruptive, {} nondisruptive".format(num_sampled_nd+num_sampled_d,num_sampled_d,num_sampled_nd)) - print("Before adding: training shots: {} validation shots: {}".format(len(shot_list_train),len(shot_list_validate))) + print("Sampled {} shots, {} disruptive, {} nondisruptive".format( + num_sampled_nd+num_sampled_d, num_sampled_d, num_sampled_nd)) + print("Before adding: training shots: {} validation shots: {}".format( + len(shot_list_train), len(shot_list_validate))) assert(num_sampled_d == num) - if conf['data']['bleed_in_equalize_sets']:#add bleed-in shots to training and validation set repeatedly + # add bleed-in shots to training and validation set repeatedly + if conf['data']['bleed_in_equalize_sets']: print("Applying equalized bleed in") - for shot_list_curr in [shot_list_train,shot_list_validate]: + for shot_list_curr in [shot_list_train, shot_list_validate]: for i in range(len(shot_list_curr)): s = shot_list_bleed.sample_shot() shot_list_curr.append(s) @@ -184,12 +217,13 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): s = shot_list_bleed.sample_shot() shot_list_train.append(s) shot_list_validate.append(s) - else: #add each shot only once + else: # add each shot only once print("Applying bleed in without repetition") for s in shot_list_bleed: shot_list_train.append(s) shot_list_validate.append(s) - print("After adding: training shots: {} validation shots: {}".format(len(shot_list_train),len(shot_list_validate))) + print("After adding: training shots: {} validation shots: {}".format( + len(shot_list_train), len(shot_list_validate))) print("Added bleed in shots to training and validation sets") # if num_d > 0: # for i in range(num): @@ -209,34 +243,39 @@ def apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test): # shot_list_test.remove(s) # else: # print('No nondisruptive shots in test set, omitting bleed in') - return shot_list_train,shot_list_validate,shot_list_test - - - + return shot_list_train, shot_list_validate, shot_list_test def guarantee_preprocessed(conf): pp = Preprocessor(conf) if pp.all_are_preprocessed(): print("shots already processed.") - shot_list_train,shot_list_validate,shot_list_test = pp.load_shotlists() + (shot_list_train, shot_list_validate, + shot_list_test) = pp.load_shotlists() else: - print("preprocessing all shots",end='') + print("preprocessing all shots", end='') pp.clean_shot_lists() - shot_list = pp.preprocess_all() - shot_list.sort() - shot_list_train,shot_list_test = shot_list.split_train_test(conf) - num_shots = len(shot_list_train) + len(shot_list_test) + shot_list = sorted(pp.preprocess_all()) + shot_list_train, shot_list_test = shot_list.split_train_test(conf) + # num_shots = len(shot_list_train) + len(shot_list_test) validation_frac = conf['training']['validation_frac'] if validation_frac <= 0.05: print('Setting validation to a minimum of 0.05') validation_frac = 0.05 - shot_list_train,shot_list_validate = shot_list_train.split_direct(1.0-validation_frac,do_shuffle=True) - pp.save_shotlists(shot_list_train,shot_list_validate,shot_list_test) - shot_list_train,shot_list_validate,shot_list_test = apply_bleed_in(conf,shot_list_train,shot_list_validate,shot_list_test) - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) - print('testing: {} shots, {} disruptive'.format(len(shot_list_test),shot_list_test.num_disruptive())) + shot_list_train, shot_list_validate = shot_list_train.split_direct( + 1.0-validation_frac, do_shuffle=True) + pp.save_shotlists(shot_list_train, shot_list_validate, shot_list_test) + shot_list_train, shot_list_validate, shot_list_test = apply_bleed_in( + conf, shot_list_train, shot_list_validate, shot_list_test) + print( + 'validate: {} shots, {} disruptive'.format( + len(shot_list_validate), + shot_list_validate.num_disruptive())) + print( + 'training: {} shots, {} disruptive'.format( + len(shot_list_train), + shot_list_train.num_disruptive())) + print('testing: {} shots, {} disruptive'.format( + len(shot_list_test), shot_list_test.num_disruptive())) print("...done") - return shot_list_train,shot_list_validate,shot_list_test - + return shot_list_train, shot_list_validate, shot_list_test From dcbb00e91d47c6c06a5811b76e1b0696c66d5611 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 14:38:53 -0500 Subject: [PATCH 562/744] Fix style for files in plasma/primitives --- plasma/primitives/data.py | 374 +++++++++++++++---------- plasma/primitives/hyperparameters.py | 77 +++--- plasma/primitives/ops.py | 6 +- plasma/primitives/shots.py | 396 ++++++++++++++------------- 4 files changed, 494 insertions(+), 359 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index fb19f466..93663757 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -1,13 +1,13 @@ from __future__ import division import numpy as np -import time -import sys,os +import sys +import os import re from scipy.interpolate import UnivariateSpline from plasma.utils.processing import get_individual_shot_file -from plasma.utils.downloading import format_save_path,get_missing_value_array +from plasma.utils.downloading import get_missing_value_array # class SignalCollection: # """GA Data Obj""" @@ -16,25 +16,31 @@ # for i in range(len(signal_paths)) # self.signals.append(Signal(signal_descriptions[i],signal_paths[i])) +try: + from MDSplus import Connection +except ImportError: + pass + + class Signal(object): - def __init__(self,description,paths,machines,tex_label=None, - causal_shifts=None,is_ip=False,normalize=True, - data_avail_tolerances=None,is_strictly_positive=False, - mapping_paths=None): + def __init__(self, description, paths, machines, tex_label=None, + causal_shifts=None, is_ip=False, normalize=True, + data_avail_tolerances=None, is_strictly_positive=False, + mapping_paths=None): assert(len(paths) == len(machines)) self.description = description self.paths = paths - self.machines = machines #on which machines is the signal defined - if causal_shifts == None: + self.machines = machines # on which machines is the signal defined + if causal_shifts is None: causal_shifts = [0 for m in machines] - self.causal_shifts = causal_shifts #causal shift in ms + self.causal_shifts = causal_shifts # causal shift in ms self.is_ip = is_ip self.num_channels = 1 self.normalize = normalize - if data_avail_tolerances == None: + if data_avail_tolerances is None: data_avail_tolerances = [0 for m in machines] self.data_avail_tolerances = data_avail_tolerances - self.is_strictly_positive=is_strictly_positive + self.is_strictly_positive = is_strictly_positive self.mapping_paths = mapping_paths def is_strictly_positive_fn(self): @@ -43,231 +49,317 @@ def is_strictly_positive_fn(self): def is_ip(self): return self.is_ip - def get_file_path(self,prepath,machine,shot_number): + def get_file_path(self, prepath, machine, shot_number): dirname = self.get_path(machine) - return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) + return get_individual_shot_file(prepath + '/' + machine.name + '/' + + dirname + '/', shot_number) - def is_valid(self,prepath,shot,dtype='float32'): - t,data,exists = self.load_data(prepath,shot,dtype) - return exists + def is_valid(self, prepath, shot, dtype='float32'): + t, data, exists = self.load_data(prepath, shot, dtype) + return exists - def is_saved(self,prepath,shot): - file_path = self.get_file_path(prepath,shot.machine,shot.number) + def is_saved(self, prepath, shot): + file_path = self.get_file_path(prepath, shot.machine, shot.number) return os.path.isfile(file_path) - def load_data_from_txt_safe(self,prepath,shot,dtype='float32'): - file_path = self.get_file_path(prepath,shot.machine,shot.number) - if not self.is_saved(prepath,shot): - print('Signal {}, shot {} was never downloaded'.format(self.description,shot.number)) - return None,False + def load_data_from_txt_safe(self, prepath, shot, dtype='float32'): + file_path = self.get_file_path(prepath, shot.machine, shot.number) + if not self.is_saved(prepath, shot): + print( + 'Signal {}, shot {} was never downloaded'.format( + self.description, + shot.number)) + return None, False if os.path.getsize(file_path) == 0: - print('Signal {}, shot {} was downloaded incorrectly (empty file). Removing.'.format(self.description,shot.number)) + print('Signal {}, shot {} '.format(self.description, shot.number), + 'was downloaded incorrectly (empty file). Removing.') os.remove(file_path) - return None,False + return None, False try: - data = np.loadtxt(file_path,dtype=dtype) + data = np.loadtxt(file_path, dtype=dtype) if np.all(data == get_missing_value_array()): - print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) - return None,False + print( + 'Signal {}, shot {} contains no data'.format( + self.description, shot.number)) + return None, False except Exception as e: print(e) - print('Couldnt load signal {} shot {}. Removing.'.format(file_path,shot.number)) + print( + 'Couldnt load signal {} shot {}. Removing.'.format( + file_path, shot.number)) os.remove(file_path) return None, False - return data,True + return data, True - def load_data(self,prepath,shot,dtype='float32'): - data,succ = self.load_data_from_txt_safe(prepath,shot) + def load_data(self, prepath, shot, dtype='float32'): + data, succ = self.load_data_from_txt_safe(prepath, shot) if not succ: - return None,None,False - + return None, None, False + if np.ndim(data) == 1: - data = np.expand_dims(data,axis=0) + data = np.expand_dims(data, axis=0) - t = data[:,0] - sig = data[:,1:] + t = data[:, 0] + sig = data[:, 1:] - if self.is_ip: #restrict shot to current threshold + if self.is_ip: # restrict shot to current threshold region = np.where(np.abs(sig) >= shot.machine.current_threshold)[0] if len(region) == 0: print('shot {} has no current'.format(shot.number)) - return None,None,False + return None, None, False first_idx = region[0] last_idx = region[-1] - last_time = t[last_idx]+5e-2 #add 50 ms to cover possible disruption event + # add 50 ms to cover possible disruption event + last_time = t[last_idx]+5e-2 last_indices = np.where(t > last_time)[0] if len(last_indices) == 0: last_idx = -1 else: last_idx = last_indices[0] t = t[first_idx:last_idx] - sig = sig[first_idx:last_idx,:] + sig = sig[first_idx:last_idx, :] - #make sure shot is not garbage data + # make sure shot is not garbage data if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): if self.is_ip: print('shot {} has no current'.format(shot.number)) else: - print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) - return None,None,False - - #make sure data doesn't contain nan - if np.any(np.isnan(t)) or np.any(np.isnan(sig)): - print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) - return None,None,False + print( + 'Signal {}, shot {} contains no data'.format( + self.description, shot.number)) + return None, None, False - return t,sig,True + # make sure data doesn't contain nan + if np.any(np.isnan(t)) or np.any(np.isnan(sig)): + print( + 'Signal {}, shot {} contains NAN'.format( + self.description, + shot.number)) + return None, None, False + return t, sig, True - def fetch_data_basic(self,machine,shot_num,c,path=None): + def fetch_data_basic(self, machine, shot_num, c, path=None): if path is None: path = self.get_path(machine) success = False mapping = None try: - time,data,mapping,success = machine.fetch_data_fn(path,shot_num,c) + time, data, mapping, success = machine.fetch_data_fn( + path, shot_num, c) except Exception as e: print(e) sys.stdout.flush() if not success: - return None,None,None,False + return None, None, None, False time = np.array(time) + 1e-3*self.get_causal_shift(machine) - return time,np.array(data),mapping,success + return time, np.array(data), mapping, success - def fetch_data(self,machine,shot_num,c): - return self.fetch_data_basic(machine,shot_num,c) + def fetch_data(self, machine, shot_num, c): + return self.fetch_data_basic(machine, shot_num, c) - def is_defined_on_machine(self,machine): + def is_defined_on_machine(self, machine): return machine in self.machines - def is_defined_on_machines(self,machines): + def is_defined_on_machines(self, machines): return all([m in self.machines for m in machines]) - def get_path(self,machine): + def get_path(self, machine): idx = self.get_idx(machine) return self.paths[idx] - def get_mapping_path(self,machine): + def get_mapping_path(self, machine): if self.mapping_paths is None: return None else: idx = self.get_idx(machine) - return self.mapping_paths[idx] + return self.mapping_paths[idx] - def get_causal_shift(self,machine): + def get_causal_shift(self, machine): idx = self.get_idx(machine) return self.causal_shifts[idx] - def get_data_avail_tolerance(self,machine): + def get_data_avail_tolerance(self, machine): idx = self.get_idx(machine) return self.data_avail_tolerances[idx] - def get_idx(self,machine): + def get_idx(self, machine): assert(machine in self.machines) - idx = self.machines.index(machine) + idx = self.machines.index(machine) return idx - def __eq__(self,other): + def __eq__(self, other): if other is None: return False return self.description.__eq__(other.description) - - def __ne__(self,other): + def __ne__(self, other): return self.description.__ne__(other.description) - def __lt__(self,other): + def __lt__(self, other): return self.description.__lt__(other.description) - + def __hash__(self): - import hashlib - return int(hashlib.md5(self.description.encode('utf-8')).hexdigest(),16) + import hashlib + return int( + hashlib.md5( + self.description.encode('utf-8')).hexdigest(), + 16) def __str__(self): return self.description - + def __repr__(self): return self.description + class ProfileSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,mapping_range=(0,1),num_channels=32,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): - super(ProfileSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerances=data_avail_tolerances,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) + def __init__( + self, + description, + paths, + machines, + tex_label=None, + causal_shifts=None, + mapping_range=( + 0, + 1), + num_channels=32, + data_avail_tolerances=None, + is_strictly_positive=False, + mapping_paths=None): + super( + ProfileSignal, + self).__init__( + description, + paths, + machines, + tex_label, + causal_shifts, + is_ip=False, + data_avail_tolerances=data_avail_tolerances, + is_strictly_positive=is_strictly_positive, + mapping_paths=mapping_paths) self.mapping_range = mapping_range self.num_channels = num_channels - def load_data(self,prepath,shot,dtype='float32'): - data,succ = self.load_data_from_txt_safe(prepath,shot) + def load_data(self, prepath, shot, dtype='float32'): + data, succ = self.load_data_from_txt_safe(prepath, shot) if not succ: - return None,None,False + return None, None, False if np.ndim(data) == 1: - data = np.expand_dims(data,axis=0) - #_ = data[0,0] - T = data.shape[0]//2 #time is stored twice, once for mapping and once for signal - mapping = data[:T,1:] - remapping = np.linspace(self.mapping_range[0],self.mapping_range[1],self.num_channels) - t = data[:T,0] - sig = data[T:,1:] + data = np.expand_dims(data, axis=0) + # time is stored twice, once for mapping and once for signal + T = data.shape[0]//2 + mapping = data[:T, 1:] + remapping = np.linspace( + self.mapping_range[0], + self.mapping_range[1], + self.num_channels) + t = data[:T, 0] + sig = data[T:, 1:] if sig.shape[1] < 2: - print('Signal {}, shot {} should be profile but has only one channel. Possibly only one profile fit was run for the duration of the shot and was transposed during downloading. Need at least 2.'.format(self.description,shot.number)) - return None,None,False + print('Signal {}, shot {} '.format(self.description, shot.number), + 'should be profile but has only one channel. Possibly only ', + 'one profile fit was run for the duration of the shot and ', + 'was transposed during downloading. Need at least 2.') + return None, None, False if len(t) <= 1 or (np.max(sig) == 0.0 and np.min(sig) == 0.0): - print('Signal {}, shot {} contains no data'.format(self.description,shot.number)) - return None,None,False + print('Signal {}, shot {} '.format(self.description, shot.number), + 'contains no data.') + return None, None, False if np.any(np.isnan(t)) or np.any(np.isnan(sig)): - print('Signal {}, shot {} contains NAN'.format(self.description,shot.number)) - return None,None,False + print('Signal {}, shot {} '.format(self.description, shot.number), + 'contains NaN value(s).') + return None, None, False timesteps = len(t) - sig_interp = np.zeros((timesteps,self.num_channels)) + sig_interp = np.zeros((timesteps, self.num_channels)) for i in range(timesteps): - _,order = np.unique(mapping[i,:],return_index=True) #make sure the mapping is ordered and unique - if sig[i,order].shape[0] > 2: - f = UnivariateSpline(mapping[i,order],sig[i,order],s=0,k=1,ext=3) #ext = 0 is extrapolation, ext = 3 is boundary value. - sig_interp[i,:] = f(remapping) + # make sure the mapping is ordered and unique + _, order = np.unique(mapping[i, :], return_index=True) + if sig[i, order].shape[0] > 2: + # ext = 0 is extrapolation, ext = 3 is boundary value. + f = UnivariateSpline( + mapping[i, order], sig[i, order], s=0, k=1, ext=3) + sig_interp[i, :] = f(remapping) else: - print('Signal {}, shot {} has not enough points for linear interpolation. dfitpack.error: (m>k) failed for hidden m: fpcurf0:m=1'.format(self.description,shot.number)) - return None,None,False + print('Signal {}, shot {} '.format(self.description, + shot.number), + 'has insufficient points for linear interpolation. ', + 'dfitpack.error: (m>k) failed for hidden m: fpcurf0:m=1') + return None, None, False - return t,sig_interp,True + return t, sig_interp, True - def fetch_data(self,machine,shot_num,c): - time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) + def fetch_data(self, machine, shot_num, c): + time, data, mapping, success = self.fetch_data_basic( + machine, shot_num, c) path = self.get_path(machine) mapping_path = self.get_mapping_path(machine) - if mapping is not None and np.ndim(mapping) == 1:#make sure there is a mapping for every timestep + if mapping is not None and np.ndim(mapping) == 1: + # make sure there is a mapping for every timestep T = len(time) - mapping = np.tile(mapping,(T,1)).transpose() - assert(mapping.shape == data.shape), "shape of mapping and data is different" - if mapping_path is not None:#fetch the mapping separately - time_map,data_map,mapping_map,success_map = self.fetch_data_basic(machine,shot_num,c,path=mapping_path) + mapping = np.tile(mapping, (T, 1)).transpose() + assert mapping.shape == data.shape, ( + "mapping and data shapes are different") + if mapping_path is not None: + # fetch the mapping separately + (time_map, data_map, mapping_map, + success_map) = self.fetch_data_basic(machine, shot_num, c, + path=mapping_path) success = (success and success_map) if not success: - print("No success for signal {} and mapping {}".format(path,mapping_path)) + print("No success for signal {} and mapping {}".format( + path, mapping_path)) else: - assert(np.all(time == time_map)), "time for signal {} and mapping {} don't align: \n{}\n\n{}\n".format(path,mapping_path,time,time_map) + assert np.all(time == time_map), ( + "time for signal {} and mapping {} ".format(path, + mapping_path) + + "don't align: \n{}\n\n{}\n".format(time, time_map)) mapping = data_map if not success: - return None,None,None,False - return time,data,mapping,success + return None, None, None, False + return time, data, mapping, success class ChannelSignal(Signal): - def __init__(self,description,paths,machines,tex_label=None,causal_shifts=None,data_avail_tolerances=None,is_strictly_positive=False,mapping_paths=None): - super(ChannelSignal, self).__init__(description,paths,machines,tex_label,causal_shifts,is_ip=False,data_avail_tolerances=data_avail_tolerances,is_strictly_positive=is_strictly_positive,mapping_paths=mapping_paths) - nums,new_paths = self.get_channel_nums(paths) + def __init__( + self, + description, + paths, + machines, + tex_label=None, + causal_shifts=None, + data_avail_tolerances=None, + is_strictly_positive=False, + mapping_paths=None): + super( + ChannelSignal, + self).__init__( + description, + paths, + machines, + tex_label, + causal_shifts, + is_ip=False, + data_avail_tolerances=data_avail_tolerances, + is_strictly_positive=is_strictly_positive, + mapping_paths=mapping_paths) + nums, new_paths = self.get_channel_nums(paths) self.channel_nums = nums self.paths = new_paths - def get_channel_nums(self,paths): - regex = re.compile('channel\d+') - regex_int = re.compile('\d+') + def get_channel_nums(self, paths): + regex = re.compile(r'channel\d+') + regex_int = re.compile(r'\d+') nums = [] new_paths = [] for p in paths: @@ -281,35 +373,43 @@ def get_channel_nums(self,paths): else: nums.append(int(regex_int.findall(res[0])[0])) new_paths.append("/".join(elements[:-1])) - return nums,new_paths + return nums, new_paths - def get_channel_num(self,machine): + def get_channel_num(self, machine): idx = self.get_idx(machine) return self.channel_nums[idx] - def fetch_data(self,machine,shot_num,c): - time,data,mapping,success = self.fetch_data_basic(machine,shot_num,c) - mapping = None #we are not interested in the whole profile + def fetch_data(self, machine, shot_num, c): + time, data, mapping, success = self.fetch_data_basic( + machine, shot_num, c) + mapping = None # we are not interested in the whole profile channel_num = self.get_channel_num(machine) if channel_num is not None and success: if np.ndim(data) != 2: - print("Channel Signal {} expected 2D array for shot {}".format(self,shot)) + print("Channel Signal {} expected 2D array for shot {}".format( + self, self.shot_number)) success = False else: - data = data[channel_num,:] #extract channel of interest - return time,data,mapping,success + data = data[channel_num, :] # extract channel of interest + return time, data, mapping, success - def get_file_path(self,prepath,machine,shot_number): + def get_file_path(self, prepath, machine, shot_number): dirname = self.get_path(machine) num = self.get_channel_num(machine) if num is not None: dirname += "/channel{}".format(num) - return get_individual_shot_file(prepath + '/' + machine.name + '/' +dirname + '/',shot_number) - + return get_individual_shot_file(prepath + '/' + machine.name + '/' + + dirname + '/', shot_number) class Machine(object): - def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): + def __init__( + self, + name, + server, + fetch_data_fn, + max_cores=8, + current_threshold=0): self.name = name self.server = server self.max_cores = max_cores @@ -317,24 +417,22 @@ def __init__(self,name,server,fetch_data_fn,max_cores = 8,current_threshold=0): self.current_threshold = current_threshold def get_connection(self): - return Connection(server) + return Connection(self.server) - def __eq__(self,other): + def __eq__(self, other): return self.name.__eq__(other.name) - def __lt__(self,other): + def __lt__(self, other): return self.name.__lt__(other.name) - - def __ne__(self,other): + + def __ne__(self, other): return self.name.__ne__(other.name) - + def __hash__(self): return self.name.__hash__() - + def __str__(self): return self.name def __repr__(self): return self.__str__() - - diff --git a/plasma/primitives/hyperparameters.py b/plasma/primitives/hyperparameters.py index d3e29e35..9bed2a78 100644 --- a/plasma/primitives/hyperparameters.py +++ b/plasma/primitives/hyperparameters.py @@ -1,7 +1,9 @@ import numpy as np import random import abc -import yaml,os +import yaml +import os + class Hyperparam(object): @@ -9,21 +11,22 @@ class Hyperparam(object): def choice(self): return 0 - def get_conf_entry(self,conf): + def get_conf_entry(self, conf): el = conf for sub_path in self.path: el = el[sub_path] return el - def assign_to_conf(self,conf,save_path): + def assign_to_conf(self, conf, save_path): val = self.choice() - print(" : ".join(self.path)+ ": {}".format(val)) + print(" : ".join(self.path) + ": {}".format(val)) el = conf for sub_path in self.path[:-1]: el = el[sub_path] el[self.path[-1]] = val - with open(os.path.join(save_path,"changed_params.out"), 'a+') as outfile: + with open(os.path.join(save_path, "changed_params.out"), + 'a+') as outfile: for el in self.path: outfile.write("{} : ".format(el)) outfile.write("{}\n".format(val)) @@ -31,56 +34,59 @@ def assign_to_conf(self,conf,save_path): class CategoricalHyperparam(Hyperparam): - def __init__(self,path,values): + def __init__(self, path, values): self.path = path self.values = values def choice(self): return random.choice(self.values) + class GridCategoricalHyperparam(Hyperparam): - def __init__(self,path,values): + def __init__(self, path, values): self.path = path self.values = iter(values) def choice(self): return next(self.values) + class ContinuousHyperparam(Hyperparam): - def __init__(self,path,lo,hi): + def __init__(self, path, lo, hi): self.path = path - self.lo =lo - self.hi =hi + self.lo = lo + self.hi = hi def choice(self): - return float(np.random.uniform(self.lo,self.hi)) + return float(np.random.uniform(self.lo, self.hi)) + class LogContinuousHyperparam(Hyperparam): - def __init__(self,path,lo,hi): + def __init__(self, path, lo, hi): self.path = path self.lo = self.to_log(lo) - self.hi = self.to_log(hi) + self.hi = self.to_log(hi) - def to_log(self,num_val): + def to_log(self, num_val): return np.log10(num_val) def choice(self): - return float(np.power(10,np.random.uniform(self.lo,self.hi))) + return float(np.power(10, np.random.uniform(self.lo, self.hi))) class IntegerHyperparam(Hyperparam): - def __init__(self,path,lo,hi): + def __init__(self, path, lo, hi): self.path = path - self.lo =lo - self.hi =hi + self.lo = lo + self.hi = hi def choice(self): - return int(np.random.random_integers(self.lo,self.hi)) + return int(np.random.random_integers(self.lo, self.hi)) class GenericHyperparam(Hyperparam): - def __init__(self,path,choice_fn): + def __init__(self, path, choice_fn): self.path = path self.choice_fn = choice_fn @@ -89,24 +95,24 @@ def choice(self): class HyperparamExperiment(object): - def __init__(self,path,conf_name = "conf.yaml"): + def __init__(self, path, conf_name="conf.yaml"): if not path.endswith('/'): path += '/' self.path = path self.finished = False self.success = False - self.logs_path = os.path.join(path,"csv_logs/") + self.logs_path = os.path.join(path, "csv_logs/") self.raw_logs_path = path[:-1] + ".out" - self.changed_path = os.path.join(path,"changed_params.out") - with open(os.path.join(self.path,conf_name), 'r') as yaml_file: - conf = yaml.load(yaml_file) + self.changed_path = os.path.join(path, "changed_params.out") + with open(os.path.join(self.path, conf_name), 'r') as yaml_file: + conf = yaml.load(yaml_file) self.name_to_monitor = conf['callbacks']['monitor'] self.load_data() self.get_changed() self.get_maximum() self.read_raw_logs() - def __lt__(self,other): + def __lt__(self, other): return self.path.__lt__(other.path) def get_number(self): @@ -125,8 +131,8 @@ def __str__(self): def summary(self): s = "Finished" if self.finished else "Running" - print("# {} [{}] maximum of {} at epoch {}".format(self.get_number(),s,*self.get_maximum(False))) - + print("# {} [{}] maximum of {} at epoch {}".format( + self.get_number(), s, *self.get_maximum(False))) def load_data(self): import pandas @@ -164,16 +170,17 @@ def read_raw_logs(self): if lines[-1].strip() == 'done.': self.finished = True if lines[-2].strip() == 'finished.': - self.success = True + self.success = True print('finished: {}, success: {}'.format(self.finished, self.success)) - def get_maximum(self,verbose=True): + def get_maximum(self, verbose=True): if len(self.epochs) > 0: - idx = np.argmax(self.values) + idx = np.argmax(self.values) s = "Finished" if self.finished else "Running" if verbose: - #print(self.path) - print("[{}] maximum of {} at epoch {}".format(s,self.values[idx],self.epochs[idx])) - return self.values[idx],self.epochs[idx] + # print(self.path) + print("[{}] maximum of {} at epoch {}".format( + s, self.values[idx], self.epochs[idx])) + return self.values[idx], self.epochs[idx] else: - return -1,-1 + return -1, -1 diff --git a/plasma/primitives/ops.py b/plasma/primitives/ops.py index 1152ad46..19e7ed8f 100644 --- a/plasma/primitives/ops.py +++ b/plasma/primitives/ops.py @@ -2,15 +2,17 @@ from mpi4py import MPI comm = MPI.COMM_WORLD -#define a float16 mpi datatype +# define a float16 mpi datatype mpi_float16 = MPI.BYTE.Create_contiguous(2).Commit() MPI._typedict['e'] = mpi_float16 + def sum_f16_cb(buffer_a, buffer_b, t): assert t == mpi_float16 array_a = np.frombuffer(buffer_a, dtype='float16') array_b = np.frombuffer(buffer_b, dtype='float16') array_b += array_a -#create new OP + +# create new OP mpi_sum_f16 = MPI.Op.Create(sum_f16_cb, commute=True) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index e2865d72..3b96e9fc 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -16,11 +16,12 @@ import numpy as np -from plasma.utils.processing import train_test_split,cut_and_resample_signal +from plasma.utils.processing import train_test_split, cut_and_resample_signal from plasma.utils.downloading import makedirs_process_safe + class ShotListFiles(object): - def __init__(self,machine,prepath,paths,description=''): + def __init__(self, machine, prepath, paths, description=''): self.machine = machine self.prepath = prepath self.paths = paths @@ -34,121 +35,105 @@ def __str__(self): def __repr__(self): return self.__str__() - def get_single_shot_numbers_and_disruption_times(self,full_path): - data = np.loadtxt(full_path,ndmin=1,dtype={'names':('num','disrupt_times'), - 'formats':('i4','f4')}) + def get_single_shot_numbers_and_disruption_times(self, full_path): + data = np.loadtxt( + full_path, ndmin=1, dtype={ + 'names': ( + 'num', 'disrupt_times'), 'formats': ( + 'i4', 'f4')}) shots = np.array(list(zip(*data))[0]) disrupt_times = np.array(list(zip(*data))[1]) return shots, disrupt_times - def get_shot_numbers_and_disruption_times(self): all_shots = [] all_disruption_times = [] - all_machines_arr = [] + # all_machines_arr = [] for path in self.paths: full_path = self.prepath + path - shots,disruption_times = self.get_single_shot_numbers_and_disruption_times(full_path) + shots, disruption_times = ( + self.get_single_shot_numbers_and_disruption_times(full_path)) all_shots.append(shots) all_disruption_times.append(disruption_times) - return np.concatenate(all_shots),np.concatenate(all_disruption_times) - + return np.concatenate(all_shots), np.concatenate(all_disruption_times) class ShotList(object): ''' - A wrapper class around list of Shot objects, providing utilities to + A wrapper class around list of Shot objects, providing utilities to extract, load and transform Shots before passing them to an estimator. During distributed training, shot lists are split into sublists. - A sublist is a ShotList object having num_at_once shots. The ShotList contains an entire dataset - as specified in the configuration file. + A sublist is a ShotList object having num_at_once shots. The ShotList + contains an entire dataset as specified in the configuration file. ''' - def __init__(self,shots=None): + def __init__(self, shots=None): ''' A ShotList is a list of 2D Numpy arrays. ''' self.shots = [] if shots is not None: - assert(all([isinstance(shot,Shot) for shot in shots])) + assert(all([isinstance(shot, Shot) for shot in shots])) self.shots = [shot for shot in shots] - def load_from_shot_list_files_object(self,shot_list_files_object,signals): + def load_from_shot_list_files_object( + self, shot_list_files_object, signals): machine = shot_list_files_object.machine - shot_numbers,disruption_times = shot_list_files_object.get_shot_numbers_and_disruption_times() - for number,t in list(zip(shot_numbers,disruption_times)): - self.append(Shot(number=number,t_disrupt=t,machine=machine,signals=[s for s in signals if s.is_defined_on_machine(machine)])) - - - - def load_from_shot_list_files_objects(self,shot_list_files_objects,signals): + shot_numbers, disruption_times = ( + shot_list_files_object.get_shot_numbers_and_disruption_times()) + for number, t in list(zip(shot_numbers, disruption_times)): + self.append( + Shot(number=number, t_disrupt=t, machine=machine, + signals=[s for s in signals if + s.is_defined_on_machine(machine)] + ) + ) + + def load_from_shot_list_files_objects( + self, shot_list_files_objects, signals): for obj in shot_list_files_objects: - self.load_from_shot_list_files_object(obj,signals) - - # ######Generic Methods#### - - # @staticmethod - # def get_shots_and_disruption_times(shots_and_disruption_times_path,machine): - # data = np.loadtxt(shots_and_disruption_times_path,ndmin=1,dtype={'names':('num','disrupt_times'), - # 'formats':('i4','f4')}) - # shots = np.array(list(zip(*data))[0]) - # disrupt_times = np.array(list(zip(*data))[1]) - # machines = np.array([machine]*len(shots)) - # return shots, disrupt_times, machines - - # @staticmethod - # def get_multiple_shots_and_disruption_times(base_path,endings,machines): - # all_shots = [] - # all_disruption_times = [] - # all_machines_arr = [] - # for (ending,machine) in zip(endings,machines): - # path = base_path + ending - # shots,disruption_times,machines_arr = ShotList.get_shots_and_disruption_times(path,machine) - # all_shots.append(shots) - # all_disruption_times.append(disruption_times) - # all_machines_arr.append(machines_arr) - # return np.concatenate(all_shots),np.concatenate(all_disruption_times),np.concatenate(all_machines_arr) - - - def split_train_test(self,conf): - shot_list_dir = conf['paths']['shot_list_dir'] + self.load_from_shot_list_files_object(obj, signals) + + def split_train_test(self, conf): + # shot_list_dir = conf['paths']['shot_list_dir'] shot_files = conf['paths']['shot_files'] shot_files_test = conf['paths']['shot_files_test'] train_frac = conf['training']['train_frac'] shuffle_training = conf['training']['shuffle_training'] use_shots = conf['data']['use_shots'] all_signals = conf['paths']['all_signals'] - #split randomly + # split randomly use_shots_train = int(round(train_frac*use_shots)) use_shots_test = int(round((1-train_frac)*use_shots)) if len(shot_files_test) == 0: - shot_list_train,shot_list_test = train_test_split(self.shots,train_frac,shuffle_training) - #train and test list given + shot_list_train, shot_list_test = train_test_split( + self.shots, train_frac, shuffle_training) + # train and test list given else: shot_list_train = ShotList() - shot_list_train.load_from_shot_list_files_objects(shot_files,all_signals) - + shot_list_train.load_from_shot_list_files_objects( + shot_files, all_signals) + shot_list_test = ShotList() - shot_list_test.load_from_shot_list_files_objects(shot_files_test,all_signals) - - + shot_list_test.load_from_shot_list_files_objects( + shot_files_test, all_signals) + shot_numbers_train = [shot.number for shot in shot_list_train] shot_numbers_test = [shot.number for shot in shot_list_test] - print(len(shot_numbers_train),len(shot_numbers_test)) - #make sure we only use pre-filtered valid shots + print(len(shot_numbers_train), len(shot_numbers_test)) + # make sure we only use pre-filtered valid shots shots_train = self.filter_by_number(shot_numbers_train) shots_test = self.filter_by_number(shot_numbers_test) - return shots_train.random_sublist(use_shots_train),shots_test.random_sublist(use_shots_test) - + return shots_train.random_sublist( + use_shots_train), shots_test.random_sublist(use_shots_test) - def split_direct(self,frac,do_shuffle=True): - shot_list_one,shot_list_two = train_test_split(self.shots,frac,do_shuffle) - return ShotList(shot_list_one),ShotList(shot_list_two) + def split_direct(self, frac, do_shuffle=True): + shot_list_one, shot_list_two = train_test_split( + self.shots, frac, do_shuffle) + return ShotList(shot_list_one), ShotList(shot_list_two) - - - def filter_by_number(self,numbers): + def filter_by_number(self, numbers): new_shot_list = ShotList() numbers = set(numbers) for shot in self.shots: @@ -156,14 +141,14 @@ def filter_by_number(self,numbers): new_shot_list.append(shot) return new_shot_list - def set_weights(self,weights): + def set_weights(self, weights): assert(len(weights) == len(self.shots)) - for (i,w) in enumerate(weights): + for (i, w) in enumerate(weights): self.shots[i].weight = w - def sample_weighted_given_arr(self,p): + def sample_weighted_given_arr(self, p): p = p/np.sum(p) - idx = np.random.choice(range(len(self.shots)),p=p) + idx = np.random.choice(range(len(self.shots)), p=p) return self.shots[idx] def sample_shot(self): @@ -174,19 +159,20 @@ def sample_weighted(self): p = np.array([shot.weight for shot in self.shots]) return self.sample_weighted_given_arr(p) - def sample_single_class(self,disruptive): + def sample_single_class(self, disruptive): weights_d = 0.0 weights_nd = 1.0 if disruptive: weights_d = 1.0 weights_nd = 0.0 - p = np.array([weights_d if shot.is_disruptive_shot() else weights_nd for shot in self.shots ]) + p = np.array([weights_d if shot.is_disruptive_shot() + else weights_nd for shot in self.shots]) return self.sample_weighted_given_arr(p) - def sample_equal_classes(self): - weights_d,weights_nd = self.get_weights_d_nd() - p = np.array([weights_d if shot.is_disruptive_shot() else weights_nd for shot in self.shots ]) + weights_d, weights_nd = self.get_weights_d_nd() + p = np.array([weights_d if shot.is_disruptive_shot() + else weights_nd for shot in self.shots]) return self.sample_weighted_given_arr(p) def get_weights_d_nd(self): @@ -199,22 +185,22 @@ def get_weights_d_nd(self): else: weights_d = 1.0*num_nd weights_nd = 1.0*num_d - max_weight = np.maximum(weights_d,weights_nd) - return weights_d/max_weight,weights_nd/max_weight + max_weight = np.maximum(weights_d, weights_nd) + return weights_d/max_weight, weights_nd/max_weight - def num_timesteps(self,prepath): + def num_timesteps(self, prepath): ls = [shot.num_timesteps(prepath) for shot in self.shots] timesteps_total = sum(ls) - timesteps_d = sum([ts for (i,ts) in enumerate(ls) if self.shots[i].is_disruptive_shot()]) + timesteps_d = sum([ts for (i, ts) in enumerate( + ls) if self.shots[i].is_disruptive_shot()]) timesteps_nd = timesteps_total-timesteps_d - return timesteps_total,timesteps_d,timesteps_nd - + return timesteps_total, timesteps_d, timesteps_nd def num_disruptive(self): return len([shot for shot in self.shots if shot.is_disruptive_shot()]) def __len__(self): - return len(self.shots) + return len(self.shots) def __str__(self): return str([s.number for s in self.shots]) @@ -225,47 +211,45 @@ def __iter__(self): def next(self): return self.__iter__().next() - def __add__(self,other_list): + def __add__(self, other_list): return ShotList(self.shots + other_list.shots) - def index(self,item): + def index(self, item): return self.shots.index(item) - def __getitem__(self,key): + def __getitem__(self, key): return self.shots[key] - def random_sublist(self,num): - num = min(num,len(self)) - shots_picked = np.random.choice(self.shots,size=num,replace=False) + def random_sublist(self, num): + num = min(num, len(self)) + shots_picked = np.random.choice(self.shots, size=num, replace=False) return ShotList(shots_picked) - def sublists(self,num,do_shuffle=True,equal_size=False): + def sublists(self, num, do_shuffle=True, equal_size=False): lists = [] if do_shuffle: self.shuffle() - for i in range(0,len(self),num): + for i in range(0, len(self), num): subl = self.shots[i:i+num] while equal_size and len(subl) < num: subl.append(rnd.choice(self.shots)) lists.append(subl) return [ShotList(l) for l in lists] - - def shuffle(self): np.random.shuffle(self.shots) def sort(self): - self.shots.sort() #will sort based on machine and number + self.shots.sort() # will sort based on machine and number def as_list(self): return self.shots - def append(self,shot): - assert(isinstance(shot,Shot)) + def append(self, shot): + assert(isinstance(shot, Shot)) self.shots.append(shot) - def remove(self,shot): + def remove(self, shot): assert(shot in self.shots) self.shots.remove(shot) assert(shot not in self.shots) @@ -274,75 +258,93 @@ def make_light(self): for shot in self.shots: shot.make_light() - def append_if_valid(self,shot): + def append_if_valid(self, shot): if shot.valid: self.append(shot) return True else: - #print('Warning: shot {} not valid, omitting'.format(shot.number)) + # print('Warning: shot {} not valid, omitting'.format(shot.number)) return False - class Shot(object): ''' A class representing a shot. - Each shot is a measurement of plasma properties (current, locked mode amplitude, etc.) as a function of time. + Each shot is a measurement of plasma properties (current, locked mode + amplitude, etc.) as a function of time. - For 0D data, each shot is modeled as a 2D Numpy array - time vs a plasma property. + For 0D data, each shot is modeled as a 2D Numpy array - time vs a plasma + property. ''' - def __init__(self,number=None,machine=None,signals=None,signals_dict=None,ttd=None,valid=None,is_disruptive=None,t_disrupt=None): + def __init__( + self, + number=None, + machine=None, + signals=None, + signals_dict=None, + ttd=None, + valid=None, + is_disruptive=None, + t_disrupt=None): ''' Shot objects contain following attributes: - + - number: integer, unique identifier of a shot - - t_disrupt: double, disruption time in milliseconds (second column in the shotlist input file) - - ttd: Numpy array of doubles, time profile of the shot converted to time-to-disruption values - - valid: boolean flag indicating whether plasma property (specifically, current) reaches a certain value during the shot + - t_disrupt: double, disruption time in milliseconds (second column in + the shotlist input file) + + - ttd: Numpy array of doubles, time profile of the shot converted to + time-to-disruption values + - valid: boolean flag indicating whether plasma property + (specifically, current) reaches a certain value during the shot - is_disruptive: boolean flag indicating whether a shot is disruptive ''' - self.number = number #Shot number - self.machine = machine #machine on which it is defined - self.signals = signals - self.signals_dict = signals_dict # - self.ttd = ttd - self.valid =valid + self.number = number # Shot number + self.machine = machine # machine on which it is defined + self.signals = signals + self.signals_dict = signals_dict + self.ttd = ttd + self.valid = valid self.is_disruptive = is_disruptive self.t_disrupt = t_disrupt self.weight = 1.0 self.augmentation_fn = None if t_disrupt is not None: - self.is_disruptive = Shot.is_disruptive_given_disruption_time(t_disrupt) + self.is_disruptive = Shot.is_disruptive_given_disruption_time( + t_disrupt) else: - print('Warning, disruption time (disruptivity) not set! Either set t_disrupt or is_disruptive') + print('Warning, disruption time (disruptivity) not set! ', + 'Either set t_disrupt or is_disruptive') def get_id_str(self): - return '{} : {}'.format(self.machine,self.number) + return '{} : {}'.format(self.machine, self.number) - def __lt__(self,other): + def __lt__(self, other): return self.get_id_str().__lt__(other.get_id_str()) - def __eq__(self,other): + def __eq__(self, other): return self.get_id_str().__eq__(other.get_id_str()) def __hash__(self): - import hashlib - return int(hashlib.md5(self.get_id_str().encode('utf-8')).hexdigest(),16) + import hashlib + return int( + hashlib.md5( + self.get_id_str().encode('utf-8')).hexdigest(), + 16) def __str__(self): string = 'number: {}\n'.format(self.number) string += 'machine: {}\n'.format(self.machine) - string += 'signals: {}\n'.format(self.signals ) - string += 'signals_dict: {}\n'.format(self.signals_dict ) - string += 'ttd: {}\n'.format(self.ttd ) - string += 'valid: {}\n'.format(self.valid ) + string += 'signals: {}\n'.format(self.signals) + string += 'signals_dict: {}\n'.format(self.signals_dict) + string += 'ttd: {}\n'.format(self.ttd) + string += 'valid: {}\n'.format(self.valid) string += 'is_disruptive: {}\n'.format(self.is_disruptive) string += 't_disrupt: {}\n'.format(self.t_disrupt) return string - - def num_timesteps(self,prepath): + def num_timesteps(self, prepath): self.restore(prepath) ts = self.ttd.shape[0] self.make_light() @@ -360,131 +362,155 @@ def is_valid(self): def is_disruptive_shot(self): return self.is_disruptive - def get_data_arrays(self,use_signals,dtype='float32'): + def get_data_arrays(self, use_signals, dtype='float32'): t_array = self.ttd - signal_array = np.zeros((len(t_array),sum([sig.num_channels for sig in use_signals])),dtype=dtype) + signal_array = np.zeros( + (len(t_array), sum([sig.num_channels for sig in use_signals])), + dtype=dtype) curr_idx = 0 for sig in use_signals: - signal_array[:,curr_idx:curr_idx+sig.num_channels] = self.signals_dict[sig] + signal_array[:, curr_idx:curr_idx + + sig.num_channels] = self.signals_dict[sig] curr_idx += sig.num_channels - return t_array,signal_array + return t_array, signal_array def get_individual_signal_arrays(self): - #guarantee ordering + # guarantee ordering return [self.signals_dict[sig] for sig in self.signals] - def preprocess(self,conf): + def preprocess(self, conf): sys.stdout.write('\rrecomputing {}'.format(self.number)) sys.stdout.flush() - #get minmax times - time_arrays,signal_arrays,t_min,t_max,valid = self.get_signals_and_times_from_file(conf) + # get minmax times + time_arrays, signal_arrays, t_min, t_max, valid = ( + self.get_signals_and_times_from_file(conf)) self.valid = valid - #cut and resample + # cut and resample if self.valid: - self.cut_and_resample_signals(time_arrays,signal_arrays,t_min,t_max,conf) + self.cut_and_resample_signals( + time_arrays, signal_arrays, t_min, t_max, conf) - def get_signals_and_times_from_file(self,conf): + def get_signals_and_times_from_file(self, conf): valid = True t_min = -np.Inf t_max = np.Inf - t_thresh = -1 + # t_thresh = -1 signal_arrays = [] time_arrays = [] - #disruptive = self.t_disrupt >= 0 + # disruptive = self.t_disrupt >= 0 signal_prepath = conf['paths']['signal_prepath'] - for (i,signal) in enumerate(self.signals): - t,sig,valid_signal = signal.load_data(signal_prepath,self,conf['data']['floatx']) + for (i, signal) in enumerate(self.signals): + t, sig, valid_signal = signal.load_data( + signal_prepath, self, conf['data']['floatx']) if not valid_signal: - return None,None,None,None,False + return None, None, None, None, False else: assert(len(sig.shape) == 2) assert(len(t.shape) == 1) assert(len(t) > 1) - t_min = max(t_min,np.min(t)) + t_min = max(t_min, np.min(t)) signal_arrays.append(sig) time_arrays.append(t) if self.is_disruptive and self.t_disrupt > np.max(t): - if self.t_disrupt > np.max(t) + signal.get_data_avail_tolerance(self.machine): - print('Shot {}: disruption event is not contained in valid time region of signal {} by {}s, omitting.'.format(self.number,signal,self.t_disrupt - np.max(t))) - valid = False + t_max_total = ( + np.max(t) + signal.get_data_avail_tolerance( + self.machine) + ) + if (self.t_disrupt > t_max_total): + print('Shot {}: disruption event '.format(self.number), + 'is not contained in valid time region of ', + 'signal {} by {}s, omitting.'.format( + self.number, signal, + self.t_disrupt - np.max(t))) + valid = False else: - t_max = np.max(t) + signal.get_data_avail_tolerance(self.machine) + t_max = np.max( + t) + signal.get_data_avail_tolerance(self.machine) else: - t_max = min(t_max,np.max(t)) + t_max = min(t_max, np.max(t)) - #make sure the shot is long enough. + # make sure the shot is long enough. dt = conf['data']['dt'] - if (t_max - t_min)/dt <= (2*conf['model']['length']+conf['data']['T_min_warn']): - print('Shot {} contains insufficient data, omitting.'.format(self.number)) + if (t_max - t_min)/dt <= (2*conf['model'] + ['length']+conf['data']['T_min_warn']): + print( + 'Shot {} contains insufficient data, omitting.'.format( + self.number)) valid = False - # if self.is_disruptive and self.t_disrupt > t_max+conf['data']['data_avail_tolerance']: - # print('Shot {}: disruption event is not contained in valid time region by {}s, omitting.'.format(self.number,self.t_disrupt - t_max)) - # valid = False - assert(t_max > t_min or not valid), "t max: {}, t_min: {}".format(t_max,t_min) - - + assert( + t_max > t_min or not valid), "t max: {}, t_min: {}".format( + t_max, t_min) + if self.is_disruptive: assert(self.t_disrupt <= t_max or not valid) t_max = self.t_disrupt - return time_arrays,signal_arrays,t_min,t_max,valid - + return time_arrays, signal_arrays, t_min, t_max, valid - def cut_and_resample_signals(self,time_arrays,signal_arrays,t_min,t_max,conf): + def cut_and_resample_signals( + self, + time_arrays, + signal_arrays, + t_min, + t_max, + conf): dt = conf['data']['dt'] signals_dict = dict() - #resample signals - assert((len(signal_arrays) == len(time_arrays) == len(self.signals)) and len(signal_arrays) > 0) + # resample signals + assert((len(signal_arrays) == len(time_arrays) + == len(self.signals)) and len(signal_arrays) > 0) tr = 0 - for (i,signal) in enumerate(self.signals): - tr,sigr = cut_and_resample_signal(time_arrays[i],signal_arrays[i],t_min,t_max,dt,conf['data']['floatx']) + for (i, signal) in enumerate(self.signals): + tr, sigr = cut_and_resample_signal( + time_arrays[i], signal_arrays[i], t_min, t_max, dt, + conf['data']['floatx']) signals_dict[signal] = sigr - ttd = self.convert_to_ttd(tr,conf) - self.signals_dict =signals_dict + ttd = self.convert_to_ttd(tr, conf) + self.signals_dict = signals_dict self.ttd = ttd - def convert_to_ttd(self,tr,conf): + def convert_to_ttd(self, tr, conf): T_max = conf['data']['T_max'] dt = conf['data']['dt'] if self.is_disruptive: ttd = max(tr) - tr - ttd = np.clip(ttd,0,T_max) + ttd = np.clip(ttd, 0, T_max) else: ttd = T_max*np.ones_like(tr) ttd = np.log10(ttd + 1.0*dt/10) return ttd - def save(self,prepath): + def save(self, prepath): makedirs_process_safe(prepath) save_path = self.get_save_path(prepath) - np.savez(save_path,valid=self.valid,is_disruptive=self.is_disruptive, - signals_dict=self.signals_dict,ttd=self.ttd) + np.savez(save_path, valid=self.valid, is_disruptive=self.is_disruptive, + signals_dict=self.signals_dict, ttd=self.ttd) print('...saved shot {}'.format(self.number)) - def get_save_path(self,prepath): - return get_individual_shot_file(prepath,self.number,'.npz') + def get_save_path(self, prepath): + return get_individual_shot_file(prepath, self.number, '.npz') - def restore(self,prepath,light=False): + def restore(self, prepath, light=False): assert self.previously_saved(prepath), 'shot was never saved' save_path = self.get_save_path(prepath) - dat = np.load(save_path,encoding="latin1") + dat = np.load(save_path, encoding="latin1") self.valid = dat['valid'][()] self.is_disruptive = dat['is_disruptive'][()] if light: self.signals_dict = None - self.ttd = None + self.ttd = None else: self.signals_dict = dat['signals_dict'][()] self.ttd = dat['ttd'] - - def previously_saved(self,prepath): + + def previously_saved(self, prepath): save_path = self.get_save_path(prepath) return os.path.isfile(save_path) @@ -496,6 +522,8 @@ def make_light(self): def is_disruptive_given_disruption_time(t): return t >= 0 -#it used to be in utilities, but can't import globals in multiprocessing -def get_individual_shot_file(prepath,shot_num,ext='.txt'): - return prepath + str(shot_num) + ext +# it used to be in utilities, but can't import globals in multiprocessing + + +def get_individual_shot_file(prepath, shot_num, ext='.txt'): + return prepath + str(shot_num) + ext From d1f20f9dcf2821acbd35b91da464118df6b4cb70 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 15:58:05 -0500 Subject: [PATCH 563/744] Add flake8 linting to new Travis CI build stage --- .travis.yml | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 50f292fb..49b6e77e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ language: python -sudo: required - os: - linux +dist: xenial + #python: # - 2.7 # - 3.6 @@ -15,6 +15,9 @@ matrix: python: 2.7 - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=2.0.0 python: 3.6 + - stage: python linter + install: pip install flake8 + script: python -m flake8 addons: apt: @@ -22,6 +25,11 @@ addons: - python-numpy - python-setuptools +env: + - TEST_DIR=.; TEST_SCRIPT="python setup.py test" + +# before_install: + install: - sh install-mpi.sh - export MPI_PREFIX="${HOME}/opt/${MPI_LIBRARY}-${MPI_LIBRARY_VERSION}" @@ -30,11 +38,22 @@ install: - pip install --upgrade pip - pip install -r requirements-travis.txt -env: - - TEST_DIR=.; TEST_SCRIPT="python setup.py test" +# before_script: + +script: + - cd $TEST_DIR && $TEST_SCRIPT && cd .. -script: cd $TEST_DIR && $TEST_SCRIPT && cd .. +# Specify order of stages; build matrix of installation and regression tests +# will only run if linter stage passes +stages: + - python linter + - test notifications: + email: + on_success: change + on_failure: always slack: secure: NBjGYpIF2VO/GvhbC7XVPIfi0WLGFEuVhi51UbZjfHg4IOv1UuCF0fImi8GN2UZZBFRnZcbtPVffZnyMUyJI0Krw0M1ropkjA4YDaJx1JUGnYuQLxNmX+jbQmN61Usjg5MQOgcRnAn1bdMN1ttWInqkKejpV5buCjZbt8SZbDePfXz4U3No68P/pRsDTVXSy0xLTtRacuEITJjwxfjp6phbmR3qs127MZMRbVYDC2HA6KsoJW6YSKF1vFyHqnFMl7GSavxYw/XQpqFLJkGKXfnNgPZV6qAbVk5+bzyytAbbwLGvgbuFpnJsGPvAyebV8wVYaIPg7OeK+Sm1A3q0jt774NnqFp2AZ+pSKrxbxIkygDM0zoWLm4i3pt6ToJ6dKcqSbCKbELnSY5NphcyYuiJ8uhLVpAR0Y+vp+fOvhb8td/nH2AWkxFpp6xwOHPXvtodBsyPMkiaeKoVElYBfbfOhDSYH2KafADECTX75S63A9KleeNZh0DSImfFdQPaN3GFLEL8Z9UFABzTkM9eYKP9pyEP82Wh/JGDaqbARazEgNzy8rwghomsEguV247XHdOx32PSd0att541gsRFZ5uyMuVFKzI0jiLijekibY2I1c5b6dDeuK4O8uBiq4FTS+bM55Rj4Job01kdxSCKw3RwOh0amzITRTQvEWKpTAekg= + on_success: always + on_failure: always From 02e49629570c9dc2dca1fe7b9c07abbb94f52503 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 16:24:38 -0500 Subject: [PATCH 564/744] Fix style of files in plasma/utils/ --- .travis.yml | 1 + plasma/utils/batch_jobs.py | 175 +++-- plasma/utils/downloading.py | 162 ++-- plasma/utils/evaluation.py | 31 +- plasma/utils/mpi_launch_tensorflow.py | 340 ++++---- plasma/utils/performance.py | 1032 +++++++++++++++---------- plasma/utils/processing.py | 75 +- plasma/utils/state_reset.py | 51 +- 8 files changed, 1139 insertions(+), 728 deletions(-) diff --git a/.travis.yml b/.travis.yml index 49b6e77e..a983ca04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ matrix: - env: MPI_LIBRARY=openmpi MPI_LIBRARY_VERSION=2.0.0 python: 3.6 - stage: python linter + env: install: pip install flake8 script: python -m flake8 diff --git a/plasma/utils/batch_jobs.py b/plasma/utils/batch_jobs.py index 4ae45732..292964c8 100644 --- a/plasma/utils/batch_jobs.py +++ b/plasma/utils/batch_jobs.py @@ -1,17 +1,17 @@ -from __future__ import division -from pprint import pprint -import yaml +from __future__ import division import datetime import uuid -import sys,os,getpass +import os +# import getpass import subprocess as sp -import numpy as np + def generate_working_dirname(run_directory): s = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") s += "_{}".format(uuid.uuid4()) return run_directory + s + def get_executable_name(conf): shallow = conf['model']['shallow'] if shallow: @@ -20,21 +20,43 @@ def get_executable_name(conf): else: executable_name = conf['paths']['executable'] use_mpi = True - return executable_name,use_mpi - - -def start_slurm_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="anaconda"): - executable_name,use_mpi = get_executable_name(conf) - os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_slurm_script(subdir,num_nodes,i,executable_name,use_mpi,env_name,env_type) - sp.Popen("sbatch "+script,shell=True) - - -def create_jenkins_script(subdir,num_nodes,executable_name,test_configuration,env_name="frnn",env_type="anaconda"): - filename = "jenkins_{}_{}.cmd".format(test_configuration[0],test_configuration[1]) #version of Python and the dataset - filepath = os.path.join(subdir,filename) - user = getpass.getuser() - with open(filepath,"w") as f: + return executable_name, use_mpi + + +def start_slurm_job( + subdir, + num_nodes, + i, + conf, + shallow, + env_name="frnn", + env_type="anaconda"): + executable_name, use_mpi = get_executable_name(conf) + os.system(" ".join(["cp -p", executable_name, subdir])) + script = create_slurm_script( + subdir, + num_nodes, + i, + executable_name, + use_mpi, + env_name, + env_type) + sp.Popen("sbatch "+script, shell=True) + + +def create_jenkins_script( + subdir, + num_nodes, + executable_name, + test_configuration, + env_name="frnn", + env_type="anaconda"): + filename = "jenkins_{}_{}.cmd".format( + test_configuration[0], + test_configuration[1]) # version of Python and the dataset + filepath = os.path.join(subdir, filename) + # user = getpass.getuser() + with open(filepath, "w") as f: f.write('#!/usr/bin/bash\n') f.write('export OMPI_MCA_btl=\"tcp,self,sm\"\n') f.write('echo \"Jenkins test {}\"\n'.format(test_configuration[1])) @@ -48,36 +70,74 @@ def create_jenkins_script(subdir,num_nodes,executable_name,test_configuration,en f.write('module load cudnn/cuda-8.0/6.0\n') f.write('module load openmpi/cuda-8.0/intel-17.0/2.1.0/64\n') f.write('module load intel/17.0/64/17.0.4.196\n') - f.write('cd /home/alexeys/jenkins/workspace/FRNM/PPPL\n') + f.write('cd /home/alexeys/jenkins/workspace/FRNM/PPPL\n') f.write('python setup.py install\n') f.write('cd {}\n'.format(subdir)) - f.write('srun -N {} -n {} python {}\n'.format(num_nodes//2, num_nodes//2*4, executable_name)) + f.write('srun -N {} -n {} python {}\n'.format( + num_nodes // 2, num_nodes // 2 * 4, executable_name)) return filepath -def start_jenkins_job(subdir,num_nodes,executable_name,test_configuration,env_name,env_type): - os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_jenkins_script(subdir,num_nodes,executable_name,test_configuration,env_name,env_type) - sp.Popen("sh "+script,shell=True) - -def start_pbs_job(subdir,num_nodes,i,conf,shallow,env_name="frnn",env_type="anaconda"): - executable_name,use_mpi = get_executable_name(conf) - os.system(" ".join(["cp -p",executable_name,subdir])) - script = create_pbs_script(subdir,num_nodes,i,executable_name,use_mpi,env_name,env_type) - sp.Popen("qsub "+script,shell=True) - -def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn",env_type="anaconda"): +def start_jenkins_job( + subdir, + num_nodes, + executable_name, + test_configuration, + env_name, + env_type): + os.system(" ".join(["cp -p", executable_name, subdir])) + script = create_jenkins_script( + subdir, + num_nodes, + executable_name, + test_configuration, + env_name, + env_type) + sp.Popen("sh "+script, shell=True) + + +def start_pbs_job( + subdir, + num_nodes, + i, + conf, + shallow, + env_name="frnn", + env_type="anaconda"): + executable_name, use_mpi = get_executable_name(conf) + os.system(" ".join(["cp -p", executable_name, subdir])) + script = create_pbs_script( + subdir, + num_nodes, + i, + executable_name, + use_mpi, + env_name, + env_type) + sp.Popen("qsub "+script, shell=True) + + +def create_slurm_script( + subdir, + num_nodes, + idx, + executable_name, + use_mpi, + env_name="frnn", + env_type="anaconda"): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename - user = getpass.getuser() - sbatch_header = create_slurm_header(num_nodes,use_mpi,idx) - with open(filepath,"w") as f: + # user = getpass.getuser() + sbatch_header = create_slurm_header(num_nodes, use_mpi, idx) + with open(filepath, "w") as f: for line in sbatch_header: f.write(line) f.write('module load '+env_type+'\n') f.write('source activate '+env_name+'\n') - f.write('module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 openmpi/cuda-8.0/intel-17.0/2.1.0/64\n') + f.write(( + 'module load cudatoolkit/8.0 cudnn/cuda-8.0/6.0 ' + 'openmpi/cuda-8.0/intel-17.0/2.1.0/64\n')) f.write('module load intel/17.0/64/17.0.5.239 intel-mkl/2017.3/4/64\n') # f.write('rm -f /tigress/{}/model_checkpoints/*.h5\n'.format(user)) f.write('cd {}\n'.format(subdir)) @@ -87,27 +147,38 @@ def create_slurm_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="f return filepath -def create_pbs_script(subdir,num_nodes,idx,executable_name,use_mpi,env_name="frnn",env_type="anaconda"): + +def create_pbs_script( + subdir, + num_nodes, + idx, + executable_name, + use_mpi, + env_name="frnn", + env_type="anaconda"): filename = "run_{}_nodes.cmd".format(num_nodes) filepath = subdir+filename - user = getpass.getuser() - sbatch_header = create_pbs_header(num_nodes,use_mpi,idx) - with open(filepath,"w") as f: + # user = getpass.getuser() + sbatch_header = create_pbs_header(num_nodes, use_mpi, idx) + with open(filepath, "w") as f: for line in sbatch_header: f.write(line) - #f.write('export HOME=/lustre/atlas/proj-shared/fus117\n') - #f.write('cd $HOME/PPPL/plasma-python/examples\n') + # f.write('export HOME=/lustre/atlas/proj-shared/fus117\n') + # f.write('cd $HOME/PPPL/plasma-python/examples\n') f.write('source $MODULESHOME/init/bash\n') f.write('module load tensorflow\n') # f.write('rm $HOME/tigress/alexeys/model_checkpoints/*\n') f.write('cd {}\n'.format(subdir)) - f.write('aprun -n {} -N1 env KERAS_HOME={} singularity exec $TENSORFLOW_CONTAINER python3 {}\n'.format(str(num_nodes),subdir,executable_name)) + f.write( + 'aprun -n {} -N1 env KERAS_HOME={} singularity exec ' + '$TENSORFLOW_CONTAINER python3 {}\n'.format(str(num_nodes), subdir, + executable_name)) f.write('echo "done."') return filepath -def create_slurm_header(num_nodes,use_mpi,idx): +def create_slurm_header(num_nodes, use_mpi, idx): if not use_mpi: assert(num_nodes == 1) lines = [] @@ -127,7 +198,8 @@ def create_slurm_header(num_nodes,use_mpi,idx): lines.append('\n\n') return lines -def create_pbs_header(num_nodes,use_mpi,idx): + +def create_pbs_header(num_nodes, use_mpi, idx): if not use_mpi: assert(num_nodes == 1) lines = [] @@ -143,7 +215,12 @@ def create_pbs_header(num_nodes,use_mpi,idx): def copy_files_to_environment(subdir): from plasma.conf import conf - normalization_dir = os.path.dirname(conf['paths']['global_normalizer_path']) + normalization_dir = os.path.dirname( + conf['paths']['global_normalizer_path']) if os.path.isdir(normalization_dir): print("Copying normalization to") - os.system(" ".join(["cp -rp",normalization_dir,os.path.join(subdir,os.path.basename(normalization_dir))])) + os.system(" ".join( + ["cp -rp", normalization_dir, + os.path.join(subdir, os.path.basename(normalization_dir))] + ) + ) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 8980ebde..4822a99b 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -1,4 +1,12 @@ from __future__ import print_function +import errno +import os +# from multiprocessing import Queue +from functools import partial +import multiprocessing as mp +import sys +import time +import numpy as np ''' http://www.mdsplus.org/index.php?title=Documentation:Tutorial:RemoteAccess&open=76203664636339686324830207&page=Documentation%2FThe+MDSplus+tutorial%2FRemote+data+access+in+MDSplus http://piscope.psfc.mit.edu/index.php/MDSplus_%26_python#Simple_example_of_reading_MDSplus_data @@ -14,58 +22,57 @@ - TEST ''' try: - from MDSplus import * + from MDSplus import Connection except ImportError: pass -#from pylab import * -import numpy as np -import sys -import multiprocessing as mp -from functools import partial -from multiprocessing import Queue -import os -import errno # import gadata - # from plasma.primitives.shots import ShotList -#from signals import * - -#print("Importing numpy version"+np.__version__) - def get_missing_value_array(): return np.array([-1.0]) + def makedirs_process_safe(dirpath): - try: #can lead to race condition + try: # can lead to race condition os.makedirs(dirpath) except OSError as e: - if e.errno == errno.EEXIST:# File exists, and it's a directory, another process beat us to creating this dir, that's OK. + # File exists, and it's a directory, another process beat us to + # creating this dir, that's OK. + if e.errno == errno.EEXIST: pass - else:# Our target dir exists as a file, or different error, reraise the error! + else: + # Our target dir exists as a file, or different error, reraise the + # error! raise + def makedirdepth_process_safe(dirpath): - try: #can lead to race condition + try: # can lead to race condition mkdirdepth(dirpath) except OSError as e: - if e.errno == errno.EEXIST:# File exists, and it's a directory, another process beat us to creating this dir, that's OK. + # File exists, and it's a directory, another process beat us to + # creating this dir, that's OK. + if e.errno == errno.EEXIST: pass - else:# Our target dir exists as a file, or different error, reraise the error! + else: + # Our target dir exists as a file, or different error, reraise the + # error! raise + def mkdirdepth(filename): - folder=os.path.dirname(filename) + folder = os.path.dirname(filename) if not os.path.exists(folder): os.makedirs(folder) -def format_save_path(prepath,signal_path,shot_num): - return prepath + signal_path + '/{}.txt'.format(shot_num) + +def format_save_path(prepath, signal_path, shot_num): + return prepath + signal_path + '/{}.txt'.format(shot_num) -def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): +def save_shot(shot_num_queue, c, signals, save_prepath, machine, sentinel=-1): missing_values = 0 # if machine == 'd3d': # reload(gadata) #reloads Gadata object with connection @@ -76,99 +83,132 @@ def save_shot(shot_num_queue,c,signals,save_prepath,machine,sentinel=-1): shot_complete = True for signal in signals: signal_path = signal.get_path(machine) - save_path_full = signal.get_file_path(save_prepath,machine,shot_num) + save_path_full = signal.get_file_path( + save_prepath, machine, shot_num) success = False mapping = None if os.path.isfile(save_path_full): if os.path.getsize(save_path_full) > 0: - print('-',end='') + print('-', end='') success = True else: - print('Signal {}, shot {} was downloaded incorrectly (empty file). Redownloading.'.format(signal_path,shot_num)) + print( + 'Signal {}, shot {} '.format(signal_path, shot_num), + 'was downloaded incorrectly (empty file). ', + 'Redownloading.') if not success: try: try: - time,data,mapping,success = signal.fetch_data(machine,shot_num,c) + time, data, mapping, success = ( + signal.fetch_data(machine, shot_num, c)) if not success: - print('No success shot {}, signal {}'.format(shot_num,signal)) + print('No success shot {}, signal {}'.format( + shot_num, signal)) except Exception as e: print(e) sys.stdout.flush() - #missing_values += 1 - print('Signal {}, shot {} missing. Filling with zeros'.format(signal_path,shot_num)) + # missing_values += 1 + print('Signal {}, shot {} missing. '.format( + signal_path, shot_num), 'Filling with zeros.') success = False - if success: - data_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(data))).transpose() + data_two_column = np.vstack((np.atleast_2d(time), + np.atleast_2d(data)) + ).transpose() if mapping is not None: - mapping_two_column = np.vstack((np.atleast_2d(time),np.atleast_2d(mapping))).transpose() - # mapping_two_column = np.hstack((np.array([[0.0]]),np.atleast_2d(mapping))) - data_two_column = np.vstack((mapping_two_column,data_two_column)) + mapping_two_column = np.vstack(( + np.atleast_2d(time), np.atleast_2d(mapping)) + ).transpose() + data_two_column = np.vstack( + (mapping_two_column, data_two_column)) makedirdepth_process_safe(save_path_full) if success: - np.savetxt(save_path_full,data_two_column,fmt = '%.5e')#fmt = '%f %f') + np.savetxt(save_path_full, data_two_column, fmt='%.5e') else: - np.savetxt(save_path_full,get_missing_value_array(),fmt = '%.5e') - print('.',end='') - except: - print('Could not save shot {}, signal {}'.format(shot_num,signal_path)) + np.savetxt(save_path_full, get_missing_value_array(), + fmt='%.5e') + print('.', end='') + except BaseException: + print( + 'Could not save shot {}, signal {}'.format( + shot_num, signal_path)) print('Warning: Incomplete!!!') raise sys.stdout.flush() if not success: missing_values += 1 shot_complete = False - #only add shot to list if it was complete + # only add shot to list if it was complete if shot_complete: print('saved shot {}'.format(shot_num)) - #complete_queue.put(shot_num) + # complete_queue.put(shot_num) else: print('shot {} not complete. removing from list.'.format(shot_num)) print('Finished with {} missing values total'.format(missing_values)) return -def download_shot_numbers(shot_numbers,save_prepath,machine,signals): +def download_shot_numbers(shot_numbers, save_prepath, machine, signals): max_cores = machine.max_cores sentinel = -1 - fn = partial(save_shot,signals=signals,save_prepath=save_prepath,machine=machine,sentinel=sentinel) - num_cores = min(mp.cpu_count(),max_cores) #can only handle 8 connections at once :( + fn = partial(save_shot, signals=signals, save_prepath=save_prepath, + machine=machine, sentinel=sentinel) + # can only handle 8 connections at once :( + num_cores = min(mp.cpu_count(), max_cores) queue = mp.Queue() - #complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() - - assert(len(shot_numbers) < 32000) # mp.queue can't handle larger queues yet! + # complete_shots = Array('i',zeros(len(shot_numbers)))# = mp.Queue() + + # mp.queue can't handle larger queues yet! + assert(len(shot_numbers) < 32000) for shot_num in shot_numbers: queue.put(shot_num) for i in range(num_cores): queue.put(sentinel) connections = [Connection(machine.server) for _ in range(num_cores)] - processes = [mp.Process(target=fn,args=(queue,connections[i])) for i in range(num_cores)] - + processes = [ + mp.Process( + target=fn, + args=( + queue, + connections[i])) for i in range(num_cores)] + print('running in parallel on {} processes'.format(num_cores)) - + for p in processes: p.start() for p in processes: p.join() -def download_all_shot_numbers(prepath,save_path,shot_list_files,signals_full): +def download_all_shot_numbers( + prepath, + save_path, + shot_list_files, + signals_full): max_len = 30000 machine = shot_list_files.machine signals = [] for sig in signals_full: if not sig.is_defined_on_machine(machine): - print('Signal {} not defined on machine {}, omitting'.format(sig,machine)) + print( + 'Signal {} not defined on machine {}, omitting'.format( + sig, machine)) else: signals.append(sig) - save_prepath = prepath+save_path + '/' - shot_numbers,_ = shot_list_files.get_shot_numbers_and_disruption_times() - shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in xrange(0,len(shot_numbers),max_len)]#can only use queue of max size 30000 + save_prepath = prepath+save_path + '/' + shot_numbers, _ = shot_list_files.get_shot_numbers_and_disruption_times() + # can only use queue of max size 30000 + shot_numbers_chunks = [shot_numbers[i:i+max_len] + for i in np.xrange(0, len(shot_numbers), max_len)] start_time = time.time() for shot_numbers_chunk in shot_numbers_chunks: - download_shot_numbers(shot_numbers_chunk,save_prepath,machine,signals) - - print('Finished downloading {} shots in {} seconds'.format(len(shot_numbers),time.time()-start_time)) - + download_shot_numbers( + shot_numbers_chunk, + save_prepath, + machine, + signals) + + print('Finished downloading {} shots in {} seconds'.format( + len(shot_numbers), time.time()-start_time)) diff --git a/plasma/utils/evaluation.py b/plasma/utils/evaluation.py index 9993ee79..5b0305b9 100644 --- a/plasma/utils/evaluation.py +++ b/plasma/utils/evaluation.py @@ -1,27 +1,32 @@ import numpy as np epsilon = 1e-7 -def get_loss_from_list(y_pred_list,y_true_list,target): - return np.mean([get_loss(yg,yp,target) for yp,yg in zip(y_pred_list,y_true_list)]) -def get_loss(y_true,y_pred,target): - return target.loss_np(y_true,y_pred) +def get_loss_from_list(y_pred_list, y_true_list, target): + return np.mean([get_loss(yg, yp, target) + for yp, yg in zip(y_pred_list, y_true_list)]) -def mae_np(y_true,y_pred): + +def get_loss(y_true, y_pred, target): + return target.loss_np(y_true, y_pred) + + +def mae_np(y_true, y_pred): return np.mean(np.abs(y_pred-y_true)) -def mse_np(y_true,y_pred): + +def mse_np(y_true, y_pred): return np.mean((y_pred-y_true)**2) -def binary_crossentropy_np(y_true,y_pred): - y_pred = np.clip(y_pred,epsilon,1-epsilon) - return np.mean(- (y_true*np.log(y_pred) + (1-y_true)*np.log(1 - y_pred))) -def hinge_np(y_true,y_pred): - return np.mean(np.maximum(0.0,1 - y_pred*y_true)) +def binary_crossentropy_np(y_true, y_pred): + y_pred = np.clip(y_pred, epsilon, 1-epsilon) + return np.mean(- (y_true*np.log(y_pred) + (1-y_true)*np.log(1 - y_pred))) -def squared_hinge_np(y_true,y_pred): - return np.mean(np.maximum(0.0,1 - y_pred*y_true)**2) +def hinge_np(y_true, y_pred): + return np.mean(np.maximum(0.0, 1 - y_pred*y_true)) +def squared_hinge_np(y_true, y_pred): + return np.mean(np.maximum(0.0, 1 - y_pred*y_true)**2) diff --git a/plasma/utils/mpi_launch_tensorflow.py b/plasma/utils/mpi_launch_tensorflow.py index f372683c..c1ea9fec 100644 --- a/plasma/utils/mpi_launch_tensorflow.py +++ b/plasma/utils/mpi_launch_tensorflow.py @@ -2,156 +2,206 @@ from mpi4py import MPI from hostlist import expand_hostlist -import socket,os,math +import socket +import os +import math + def get_host_to_id_mapping(): - return {host:i for (i,host) in enumerate(expand_hostlist( os.environ['SLURM_NODELIST']))} + return { + host: i for ( + i, host) in enumerate( + expand_hostlist( + os.environ['SLURM_NODELIST']))} + def get_my_host_id(): - return get_host_to_id_mapping()[socket.gethostname()] + return get_host_to_id_mapping()[socket.gethostname()] def get_host_list(port): - return [ '{}:{}'.format(host,port) for host in expand_hostlist( os.environ['SLURM_NODELIST']) ] - -def get_worker_host_list(base_port,workers_per_host): - hosts = expand_hostlist( os.environ['SLURM_NODELIST']) - ports = [base_port + i for i in range(workers_per_host)] - l = [] - for h in hosts: - for p in ports: - l.append('{}:{}'.format(h,p)) - return l - -def get_worker_host(base_port,workers_per_host,task_id): - return get_worker_host_list(base_port,workers_per_host)[task_id] - -def get_ps_host_list(base_port,num_ps): - assert(num_ps < 10000000) - port = base_port - l = [] - hosts = expand_hostlist( os.environ['SLURM_NODELIST']) - while True: - for host in hosts: - if len(l) >= num_ps: - return l - l.append('{}:{}'.format(host,port)) - port += 1 - -def get_ps_host(base_port,num_ps,num_workers,task_id): - return get_ps_host_list(base_port,num_ps)[task_id - num_workers] - -def get_mpi_cluster_server_jobname(num_ps = 1,num_workers = None): - import tensorflow as tf - NUM_GPUS = 4 - comm = MPI.COMM_WORLD - task_index = comm.Get_rank() - task_num = comm.Get_size() - num_hosts = len(get_host_list(1)) - - num_workers_per_host = NUM_GPUS - if num_workers is None or num_workers == 0 or num_workers > num_workers_per_host*num_hosts: - if num_workers > num_workers_per_host*num_hosts: - print('Num workers too large (more than one per GPU). Setting to default of {} for {} hosts'.format(num_workers_per_host*num_hosts,num_hosts)) - if num_workers == 0: - print('Num workers set to 0, should be positive. Setting to default of {} for {} hosts'.format(num_workers_per_host*num_hosts,num_hosts)) - num_workers = num_workers_per_host*num_hosts - - - tasks_per_node = task_num / num_hosts - - max_ps = num_hosts*(tasks_per_node - num_workers_per_host) - print("tasks_per_node {} num_workers_per_host {} num_hosts {}".format(tasks_per_node,num_workers_per_host,num_hosts)) - if num_ps == 0 or num_ps > max_ps: - print('Invalid number of ps {} (maximum {}, minimum 0)'.format(num_ps,max_ps)) - if num_ps == 0: - print('Setting to 1') - num_ps = 1 + return [ + '{}:{}'.format( + host, + port) for host in expand_hostlist( + os.environ['SLURM_NODELIST'])] + + +def get_worker_host_list(base_port, workers_per_host): + hosts = expand_hostlist(os.environ['SLURM_NODELIST']) + ports = [base_port + i for i in range(workers_per_host)] + worker_hlist = [] + for h in hosts: + for p in ports: + worker_hlist.append('{}:{}'.format(h, p)) + return worker_hlist + + +def get_worker_host(base_port, workers_per_host, task_id): + return get_worker_host_list(base_port, workers_per_host)[task_id] + + +def get_ps_host_list(base_port, num_ps): + assert(num_ps < 10000000) + port = base_port + ps_hlist = [] + hosts = expand_hostlist(os.environ['SLURM_NODELIST']) + while True: + for host in hosts: + if len(ps_hlist) >= num_ps: + return ps_hlist + ps_hlist.append('{}:{}'.format(host, port)) + port += 1 + + +def get_ps_host(base_port, num_ps, num_workers, task_id): + return get_ps_host_list(base_port, num_ps)[task_id - num_workers] + + +def get_mpi_cluster_server_jobname(num_ps=1, num_workers=None): + import tensorflow as tf + NUM_GPUS = 4 + comm = MPI.COMM_WORLD + task_index = comm.Get_rank() + task_num = comm.Get_size() + num_hosts = len(get_host_list(1)) + + num_workers_per_host = NUM_GPUS + # TODO(KGF): this error handling is completely duplicated below + if (num_workers is None or num_workers == 0 + or num_workers > num_workers_per_host*num_hosts): + if num_workers > num_workers_per_host*num_hosts: + print('Num workers too large (more than one per GPU). ', + 'Setting to default of {} for {} hosts'.format( + num_workers_per_host * num_hosts, num_hosts)) + if num_workers == 0: + print('Num workers set to 0, should be positive. ', + 'Setting to default of {} for {} hosts'.format( + num_workers_per_host * num_hosts, num_hosts)) + num_workers = num_workers_per_host*num_hosts + + tasks_per_node = task_num / num_hosts + + max_ps = num_hosts*(tasks_per_node - num_workers_per_host) + print("tasks_per_node {} num_workers_per_host {} num_hosts {}".format( + tasks_per_node, num_workers_per_host, num_hosts)) + if num_ps == 0 or num_ps > max_ps: + print( + 'Invalid number of ps {} (maximum {}, minimum 0)'.format( + num_ps, max_ps)) + if num_ps == 0: + print('Setting to 1') + num_ps = 1 + else: + print('Setting to {}'.format(max_ps)) + num_ps = max_ps + num_ps_per_host = int(math.ceil(1.0*num_ps/num_hosts)) + + task_index = task_index % tasks_per_node + + if task_index < NUM_GPUS: + job_name = 'worker' + num_per_host = num_workers_per_host + global_task_index = get_my_host_id()*num_per_host+task_index + else: + job_name = 'ps' + task_index = task_index - NUM_GPUS + num_per_host = num_ps_per_host + os.environ['CUDA_VISIBLE_DEVICES'] = '' + global_task_index = num_hosts*task_index+get_my_host_id() + + # if job_name == "ps": + # if job_name == "worker": + # os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU) + num_total = num_workers + num_ps + assert(task_num >= num_total) + + if task_index == 0: + print('{} superfluous processes'.format(task_num - num_total)) + print( + '{} superfluous workers'.format( + num_workers_per_host + * num_hosts + - num_workers)) + print('{} superfluous ps'.format(num_ps_per_host*num_hosts - num_ps)) + + print( + '{}, task_id: {}, host_id: {}'.format( + socket.gethostname(), + task_index, + get_my_host_id())) + + worker_hosts = get_worker_host_list( + 2222, num_workers_per_host)[:num_workers] + ps_hosts = get_ps_host_list(2322, num_ps) + if global_task_index == 0: + print( + 'ps_hosts: {}\n, worker hosts: {}\n'.format( + ps_hosts, + worker_hosts)) + # Create a cluster from the parameter server and worker hosts. + if job_name == 'ps' and global_task_index >= num_ps: + exit(0) + if job_name == 'worker' and global_task_index >= num_workers: + exit(0) + + cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts}) + # Create and start a server for the local task. + server = tf.train.Server( + cluster, + job_name=job_name, + task_index=global_task_index) + + return cluster, server, job_name, global_task_index, num_workers + + +def get_mpi_task_index(num_workers=None): + NUM_GPUS = 4 + comm = MPI.COMM_WORLD + task_index = comm.Get_rank() + task_num = comm.Get_size() + num_hosts = len(get_host_list(1)) + + num_workers_per_host = NUM_GPUS + if (num_workers is None or num_workers == 0 + or num_workers > num_workers_per_host*num_hosts): + if num_workers > num_workers_per_host*num_hosts: + print('Num workers too large (more than one per GPU). ', + 'Setting to default of {} for {} hosts'.format( + num_workers_per_host * num_hosts, num_hosts)) + if num_workers == 0: + print('Num workers set to 0, should be positive. ', + 'Setting to default of {} for {} hosts'.format( + num_workers_per_host * num_hosts, num_hosts)) + num_workers = num_workers_per_host*num_hosts + + tasks_per_node = task_num / num_hosts + task_index = task_index % tasks_per_node + + if task_index < NUM_GPUS: + job_name = 'worker' + num_per_host = num_workers_per_host + global_task_index = get_my_host_id()*num_per_host+task_index else: - print('Setting to {}'.format(max_ps)) - num_ps = max_ps - num_ps_per_host = int(math.ceil(1.0*num_ps/num_hosts)) - - - task_index = task_index % tasks_per_node - - if task_index < NUM_GPUS: - job_name = 'worker' - num_per_host = num_workers_per_host - global_task_index = get_my_host_id()*num_per_host+task_index - else: - job_name = 'ps' - task_index = task_index - NUM_GPUS - num_per_host = num_ps_per_host - os.environ['CUDA_VISIBLE_DEVICES'] = '' - global_task_index = num_hosts*task_index+get_my_host_id() - - # if job_name == "ps": - # if job_name == "worker": - # os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU) - num_total = num_workers + num_ps - assert(task_num >= num_total) - - if task_index == 0: - print('{} superfluous processes'.format(task_num - num_total)) - print('{} superfluous workers'.format(num_workers_per_host*num_hosts - num_workers)) - print('{} superfluous ps'.format(num_ps_per_host*num_hosts - num_ps)) - - - print('{}, task_id: {}, host_id: {}'.format(socket.gethostname(),task_index,get_my_host_id())) - - worker_hosts = get_worker_host_list(2222,num_workers_per_host)[:num_workers] - ps_hosts = get_ps_host_list(2322,num_ps) - if global_task_index == 0: - print('ps_hosts: {}\n, worker hosts: {}\n'.format(ps_hosts,worker_hosts)) - # Create a cluster from the parameter server and worker hosts. - if job_name == 'ps' and global_task_index >= num_ps: - exit(0) - if job_name == 'worker' and global_task_index >= num_workers: - exit(0) - - cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts}) - # Create and start a server for the local task. - server = tf.train.Server(cluster,job_name=job_name,task_index=global_task_index) - - return cluster,server,job_name,global_task_index,num_workers - -def get_mpi_task_index(num_workers = None): - NUM_GPUS = 4 - comm = MPI.COMM_WORLD - task_index = comm.Get_rank() - task_num = comm.Get_size() - num_hosts = len(get_host_list(1)) - - num_workers_per_host = NUM_GPUS - if num_workers is None or num_workers == 0 or num_workers > num_workers_per_host*num_hosts: - if num_workers > num_workers_per_host*num_hosts: - print('Num workers too large (more than one per GPU). Setting to default of {} for {} hosts'.format(num_workers_per_host*num_hosts,num_hosts)) - if num_workers == 0: - print('Num workers set to 0, should be positive. Setting to default of {} for {} hosts'.format(num_workers_per_host*num_hosts,num_hosts)) - num_workers = num_workers_per_host*num_hosts - - - tasks_per_node = task_num / num_hosts - task_index = task_index % tasks_per_node - - if task_index < NUM_GPUS: - job_name = 'worker' - num_per_host = num_workers_per_host - global_task_index = get_my_host_id()*num_per_host+task_index - else: - exit(0) - - num_total = num_workers - assert(task_num >= num_total) - - if task_index == 0: - print('{} superfluous workers'.format(num_workers_per_host*num_hosts - num_workers)) - print('{} total workers'.format(num_workers)) - - - print('{}, task_id: {}, host_id: {}'.format(socket.gethostname(),task_index,get_my_host_id())) - if job_name == 'worker' and global_task_index >= num_workers: - exit(0) - - return global_task_index,num_workers + exit(0) + + num_total = num_workers + assert(task_num >= num_total) + + if task_index == 0: + print( + '{} superfluous workers'.format( + num_workers_per_host + * num_hosts + - num_workers)) + print('{} total workers'.format(num_workers)) + + print( + '{}, task_id: {}, host_id: {}'.format( + socket.gethostname(), + task_index, + get_my_host_id())) + if job_name == 'worker' and global_task_index >= num_workers: + exit(0) + + return global_task_index, num_workers diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 7bbb9538..5df6a108 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -1,29 +1,38 @@ from __future__ import print_function -import matplotlib -matplotlib.use('Agg')#for machines that don't have a display +from plasma.preprocessor.normalize import VarNormalizer as Normalizer +from plasma.primitives.shots import ShotList # , Shot +from scipy import stats +import numpy as np +from pprint import pprint +import os +import matplotlib.pyplot as plt from matplotlib import rc -rc('font',**{'family':'serif','sans-serif':['Times']}) +import matplotlib +matplotlib.use('Agg') # for machines that don't have a display +rc('font', **{'family': 'serif', 'sans-serif': ['Times']}) rc('text', usetex=True) -import matplotlib.pyplot as plt -import os -from pprint import pprint -import numpy as np -from scipy import stats -from plasma.preprocessor.normalize import VarNormalizer as Normalizer -from plasma.conf import conf -from plasma.primitives.shots import Shot,ShotList class PerformanceAnalyzer(): - def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_warn = None, verbose = False,pred_ttd=False,conf=None): + def __init__( + self, + results_dir=None, + shots_dir=None, + i=0, + T_min_warn=None, + T_max_warn=None, + verbose=False, + pred_ttd=False, + conf=None): self.T_min_warn = T_min_warn self.T_max_warn = T_max_warn dt = conf['data']['dt'] T_max_warn_def = int(round(conf['data']['T_warning']/dt)) - T_min_warn_def = conf['data']['T_min_warn']#int(round(conf['data']['T_min_warn']/dt)) - if T_min_warn == None: + # int(round(conf['data']['T_min_warn']/dt)) + T_min_warn_def = conf['data']['T_min_warn'] + if T_min_warn is None: self.T_min_warn = T_min_warn_def - if T_max_warn == None: + if T_max_warn is None: self.T_max_warn = T_max_warn_def self.verbose = verbose self.results_dir = results_dir @@ -47,214 +56,239 @@ def __init__(self,results_dir=None,shots_dir=None,i = 0,T_min_warn = None,T_max_ self.normalizer = None - - - def get_metrics_vs_p_thresh(self,mode): + def get_metrics_vs_p_thresh(self, mode): if mode == 'train': all_preds = self.pred_train all_truths = self.truth_train all_disruptive = self.disruptive_train - elif mode == 'test': all_preds = self.pred_test all_truths = self.truth_test all_disruptive = self.disruptive_test - return self.get_metrics_vs_p_thresh_custom(all_preds,all_truths,all_disruptive) - - + return self.get_metrics_vs_p_thresh_custom( + all_preds, all_truths, all_disruptive) - def get_metrics_vs_p_thresh_custom(self,all_preds,all_truths,all_disruptive): - return self.get_metrics_vs_p_thresh_fast(all_preds,all_truths,all_disruptive) + def get_metrics_vs_p_thresh_custom( + self, all_preds, all_truths, all_disruptive): + return self.get_metrics_vs_p_thresh_fast( + all_preds, all_truths, all_disruptive) P_thresh_range = self.get_p_thresh_range() correct_range = np.zeros_like(P_thresh_range) accuracy_range = np.zeros_like(P_thresh_range) fp_range = np.zeros_like(P_thresh_range) missed_range = np.zeros_like(P_thresh_range) early_alarm_range = np.zeros_like(P_thresh_range) - - for i,P_thresh in enumerate(P_thresh_range): - correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive) + + for i, P_thresh in enumerate(P_thresh_range): + correct, accuracy, fp_rate, missed, early_alarm_rate = ( + self.summarize_shot_prediction_stats( + P_thresh, all_preds, all_truths, all_disruptive)) correct_range[i] = correct - accuracy_range[i] = accuracy - fp_range[i] = fp_rate + accuracy_range[i] = accuracy + fp_range[i] = fp_rate missed_range[i] = missed early_alarm_range[i] = early_alarm_rate - - return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range + return (correct_range, accuracy_range, fp_range, missed_range, + early_alarm_range) def get_p_thresh_range(self): - #return self.conf['data']['target'].threshold_range(self.conf['data']['T_warning']) - if np.any(self.p_thresh_range) == None: - all_preds_tr = self.pred_train - all_truths_tr = self.truth_train - all_disruptive_tr = self.disruptive_train - all_preds_te = self.pred_test - all_truths_te = self.truth_test - all_disruptive_te = self.disruptive_test - - early_th_tr,correct_th_tr,late_th_tr,nd_th_tr = self.get_threshold_arrays(all_preds_tr,all_truths_tr,all_disruptive_tr) - early_th_te,correct_th_te,late_th_te,nd_th_te = self.get_threshold_arrays(all_preds_te,all_truths_te,all_disruptive_te) - all_thresholds = np.sort(np.concatenate((early_th_tr,correct_th_tr,late_th_tr,nd_th_tr,early_th_te,correct_th_te,late_th_te,nd_th_te))) - self.p_thresh_range = all_thresholds - #print(np.unique(self.p_thresh_range)) + if np.any(self.p_thresh_range) is None: + all_preds_tr = self.pred_train + all_truths_tr = self.truth_train + all_disruptive_tr = self.disruptive_train + all_preds_te = self.pred_test + all_truths_te = self.truth_test + all_disruptive_te = self.disruptive_test + + early_th_tr, correct_th_tr, late_th_tr, nd_th_tr = ( + self.get_threshold_arrays(all_preds_tr, all_truths_tr, + all_disruptive_tr)) + early_th_te, correct_th_te, late_th_te, nd_th_te = ( + self.get_threshold_arrays(all_preds_te, all_truths_te, + all_disruptive_te)) + all_thresholds = np.sort(np.concatenate( + (early_th_tr, correct_th_tr, late_th_tr, nd_th_tr, early_th_te, + correct_th_te, late_th_te, nd_th_te))) + self.p_thresh_range = all_thresholds + # print(np.unique(self.p_thresh_range)) return self.p_thresh_range - - def get_metrics_vs_p_thresh_fast(self,all_preds,all_truths,all_disruptive): - all_disruptive = np.array(all_disruptive) + def get_metrics_vs_p_thresh_fast( + self, all_preds, all_truths, all_disruptive): + all_disruptive = np.array(all_disruptive) if self.pred_train is not None: - p_thresh_range = self.get_p_thresh_range() + p_thresh_range = self.get_p_thresh_range() else: - early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) - p_thresh_range = np.sort(np.concatenate((early_th,correct_th,late_th,nd_th))) + early_th, correct_th, late_th, nd_th = self.get_threshold_arrays( + all_preds, all_truths, all_disruptive) + p_thresh_range = np.sort(np.concatenate( + (early_th, correct_th, late_th, nd_th))) correct_range = np.zeros_like(p_thresh_range) accuracy_range = np.zeros_like(p_thresh_range) fp_range = np.zeros_like(p_thresh_range) missed_range = np.zeros_like(p_thresh_range) early_alarm_range = np.zeros_like(p_thresh_range) - early_th,correct_th,late_th,nd_th = self.get_threshold_arrays(all_preds,all_truths,all_disruptive) + early_th, correct_th, late_th, nd_th = self.get_threshold_arrays( + all_preds, all_truths, all_disruptive) - for i,thresh in enumerate(p_thresh_range): - #correct,accuracy,fp_rate,missed,early_alarm_rate = self.summarize_shot_prediction_stats(thresh,all_preds,all_truths,all_disruptive) - correct,accuracy,fp_rate,missed,early_alarm_rate = self.get_shot_prediction_stats_from_threshold_arrays(early_th,correct_th,late_th,nd_th,thresh) + for i, thresh in enumerate(p_thresh_range): + correct, accuracy, fp_rate, missed, early_alarm_rate = ( + self.get_shot_prediction_stats_from_threshold_arrays( + early_th, correct_th, late_th, nd_th, thresh)) correct_range[i] = correct - accuracy_range[i] = accuracy - fp_range[i] = fp_rate + accuracy_range[i] = accuracy + fp_range[i] = fp_rate missed_range[i] = missed early_alarm_range[i] = early_alarm_rate - - return correct_range,accuracy_range,fp_range,missed_range,early_alarm_range - def get_shot_prediction_stats_from_threshold_arrays(self,early_th,correct_th,late_th,nd_th,thresh): - indices = np.where(np.logical_and(correct_th > thresh,early_th <= thresh))[0] - FPs = np.sum(nd_th > thresh) - TNs = len(nd_th) - FPs + return (correct_range, accuracy_range, fp_range, missed_range, + early_alarm_range) - earlies = np.sum(early_th > thresh) - TPs = np.sum(np.logical_and(early_th <= thresh,correct_th > thresh)) - lates = np.sum(np.logical_and(np.logical_and(early_th <= thresh,correct_th <= thresh),late_th > thresh)) - FNs = np.sum(np.logical_and(np.logical_and(early_th <= thresh,correct_th <= thresh),late_th <= thresh)) + def get_shot_prediction_stats_from_threshold_arrays( + self, early_th, correct_th, late_th, nd_th, thresh): + # indices = np.where(np.logical_and( + # correct_th > thresh, early_th <= thresh))[0] + FPs = np.sum(nd_th > thresh) + TNs = len(nd_th) - FPs - return self.get_accuracy_and_fp_rate_from_stats(TPs,FPs,FNs,TNs,earlies,lates) + earlies = np.sum(early_th > thresh) + TPs = np.sum(np.logical_and(early_th <= thresh, correct_th > thresh)) + lates = np.sum(np.logical_and(np.logical_and( + early_th <= thresh, correct_th <= thresh), late_th > thresh)) + FNs = np.sum(np.logical_and(np.logical_and( + early_th <= thresh, correct_th <= thresh), late_th <= thresh)) + return self.get_accuracy_and_fp_rate_from_stats( + TPs, FPs, FNs, TNs, earlies, lates) - def get_shot_difficulty(self,preds,truths,disruptives): + def get_shot_difficulty(self, preds, truths, disruptives): disruptives = np.array(disruptives) - d_early_thresholds, d_correct_thresholds,d_late_thresholds, nd_thresholds = self.get_threshold_arrays(preds,truths,disruptives) - d_thresholds = np.maximum(d_early_thresholds,d_correct_thresholds) - #rank shots by difficulty. rank 1 is assigned to lowest value, should be highest difficulty - d_ranks = stats.rankdata(d_thresholds,method='min')#difficulty is highest when threshold is low, can't detect disruption - nd_ranks = stats.rankdata(-nd_thresholds,method='min')#difficulty is highest when threshold is high, can't avoid false positive + (d_early_thresholds, d_correct_thresholds, d_late_thresholds, + nd_thresholds) = self.get_threshold_arrays(preds, truths, disruptives) + d_thresholds = np.maximum(d_early_thresholds, d_correct_thresholds) + # rank shots by difficulty. rank 1 is assigned to lowest value, should + # be highest difficulty + # difficulty is highest when threshold is low, can't detect disruption + d_ranks = stats.rankdata(d_thresholds, method='min') + # difficulty is highest when threshold is high, can't avoid false + # positive + nd_ranks = stats.rankdata(-nd_thresholds, method='min') ranking_fac = self.saved_conf['training']['ranking_difficulty_fac'] - facs_d = np.linspace(ranking_fac,1,len(d_ranks))[d_ranks-1] - facs_nd = np.linspace(ranking_fac,1,len(nd_ranks))[nd_ranks-1] + facs_d = np.linspace(ranking_fac, 1, len(d_ranks))[d_ranks-1] + facs_nd = np.linspace(ranking_fac, 1, len(nd_ranks))[nd_ranks-1] ret_facs = np.ones(len(disruptives)) ret_facs[disruptives] = facs_d ret_facs[~disruptives] = facs_nd - #print("setting shot difficulty") - #print(disruptives) - #print(d_thresholds) - #print(nd_thresholds) - #print(ret_facs) + # print("setting shot difficulty") + # print(disruptives) + # print(d_thresholds) + # print(nd_thresholds) + # print(ret_facs) return ret_facs - def get_threshold_arrays(self,preds,truths,disruptives): - num_d = np.sum(disruptives) - num_nd = np.sum(~disruptives) - nd_thresholds = [] - d_early_thresholds = [] - d_correct_thresholds = [] - d_late_thresholds = [] + def get_threshold_arrays(self, preds, truths, disruptives): + # num_d = np.sum(disruptives) + # num_nd = np.sum(~disruptives) + nd_thresholds = [] + d_early_thresholds = [] + d_correct_thresholds = [] + d_late_thresholds = [] for i in range(len(preds)): pred = 1.0*preds[i] truth = truths[i] pred[:self.get_ignore_indices()] = -np.inf - is_disruptive = disruptives[i] + is_disruptive = disruptives[i] if is_disruptive: - max_acceptable = self.create_acceptable_region(truth,'max') - min_acceptable = self.create_acceptable_region(truth,'min') - correct_indices = np.logical_and(max_acceptable, ~min_acceptable) + max_acceptable = self.create_acceptable_region(truth, 'max') + min_acceptable = self.create_acceptable_region(truth, 'min') + correct_indices = np.logical_and( + max_acceptable, ~min_acceptable) early_indices = ~max_acceptable late_indices = min_acceptable if np.sum(late_indices) == 0: - d_late_thresholds.append(-np.inf) + d_late_thresholds.append(-np.inf) else: - d_late_thresholds.append(np.max(pred[late_indices])) + d_late_thresholds.append(np.max(pred[late_indices])) if np.sum(early_indices) == 0: - d_early_thresholds.append(-np.inf) + d_early_thresholds.append(-np.inf) else: - d_early_thresholds.append(np.max(pred[early_indices])) - + d_early_thresholds.append(np.max(pred[early_indices])) + d_correct_thresholds.append(np.max(pred[correct_indices])) else: nd_thresholds.append(np.max(pred)) - return np.array(d_early_thresholds), np.array(d_correct_thresholds),np.array(d_late_thresholds), np.array(nd_thresholds) - - - - - + return (np.array(d_early_thresholds), np.array(d_correct_thresholds), + np.array(d_late_thresholds), np.array(nd_thresholds)) - def summarize_shot_prediction_stats_by_mode(self,P_thresh,mode,verbose=False): + def summarize_shot_prediction_stats_by_mode( + self, P_thresh, mode, verbose=False): if mode == 'train': all_preds = self.pred_train all_truths = self.truth_train all_disruptive = self.disruptive_train - elif mode == 'test': all_preds = self.pred_test all_truths = self.truth_test all_disruptive = self.disruptive_test - return self.summarize_shot_prediction_stats(P_thresh,all_preds,all_truths,all_disruptive,verbose) - + return self.summarize_shot_prediction_stats( + P_thresh, all_preds, all_truths, all_disruptive, verbose) - def summarize_shot_prediction_stats(self,P_thresh,all_preds,all_truths,all_disruptive,verbose=False): - TPs,FPs,FNs,TNs,earlies,lates = (0,0,0,0,0,0) + def summarize_shot_prediction_stats( + self, + P_thresh, + all_preds, + all_truths, + all_disruptive, + verbose=False): + TPs, FPs, FNs, TNs, earlies, lates = (0, 0, 0, 0, 0, 0) for i in range(len(all_preds)): preds = all_preds[i] truth = all_truths[i] is_disruptive = all_disruptive[i] - - TP,FP,FN,TN,early,late = self.get_shot_prediction_stats(P_thresh,preds,truth,is_disruptive) + TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( + P_thresh, preds, truth, is_disruptive) TPs += TP FPs += FP FNs += FN TNs += TN earlies += early lates += late - + disr = earlies + lates + TPs + FNs nondisr = FPs + TNs if verbose: - print('total: {}, tp: {} fp: {} fn: {} tn: {} early: {} late: {} disr: {} nondisr: {}'.format(len(all_preds),TPs,FPs,FNs,TNs,earlies,lates,disr,nondisr)) - - return self.get_accuracy_and_fp_rate_from_stats(TPs,FPs,FNs,TNs,earlies,lates,verbose) + print('total: {}, tp: {} fp: {} fn: {} tn: {} '.format( + len(all_preds), TPs, FPs, FNs, TNs,), + 'early: {} late: {} disr: {} nondisr: {}'.format( + earlies, lates, disr, nondisr)) + return self.get_accuracy_and_fp_rate_from_stats( + TPs, FPs, FNs, TNs, earlies, lates, verbose) + # we are interested in the predictions of the *first alarm* - #we are interested in the predictions of the *first alarm* - def get_shot_prediction_stats(self,P_thresh,pred,truth,is_disruptive): + def get_shot_prediction_stats(self, P_thresh, pred, truth, is_disruptive): if self.pred_ttd: predictions = pred < P_thresh else: predictions = pred > P_thresh - predictions = np.reshape(predictions,(len(predictions),)) - - max_acceptable = self.create_acceptable_region(truth,'max') - min_acceptable = self.create_acceptable_region(truth,'min') - + predictions = np.reshape(predictions, (len(predictions),)) + + max_acceptable = self.create_acceptable_region(truth, 'max') + min_acceptable = self.create_acceptable_region(truth, 'min') + early = late = TP = TN = FN = FP = 0 - - positives = self.get_positives(predictions)#where(predictions)[0] + + positives = self.get_positives(predictions) # where(predictions)[0] if len(positives) == 0: if is_disruptive: FN = 1 @@ -263,7 +297,8 @@ def get_shot_prediction_stats(self,P_thresh,pred,truth,is_disruptive): else: if is_disruptive: first_pred_idx = positives[0] - if max_acceptable[first_pred_idx] and ~min_acceptable[first_pred_idx]: + if (max_acceptable[first_pred_idx] + and ~min_acceptable[first_pred_idx]): TP = 1 elif min_acceptable[first_pred_idx]: late = 1 @@ -271,51 +306,52 @@ def get_shot_prediction_stats(self,P_thresh,pred,truth,is_disruptive): early = 1 else: FP = 1 - return TP,FP,FN,TN,early,late + return TP, FP, FN, TN, early, late def get_ignore_indices(self): return self.saved_conf['model']['ignore_timesteps'] - - def get_positives(self,predictions): + def get_positives(self, predictions): indices = np.arange(len(predictions)) - return np.where(np.logical_and(predictions,indices >= self.get_ignore_indices()))[0] + return np.where( + np.logical_and( + predictions, + indices >= self.get_ignore_indices()))[0] - - def create_acceptable_region(self,truth,mode): + def create_acceptable_region(self, truth, mode): if mode == 'min': acceptable_timesteps = self.T_min_warn elif mode == 'max': acceptable_timesteps = self.T_max_warn else: print('Error Invalid Mode for acceptable region') - exit(1) + exit(1) - acceptable = np.zeros_like(truth,dtype=bool) + acceptable = np.zeros_like(truth, dtype=bool) if acceptable_timesteps > 0: acceptable[-acceptable_timesteps:] = True return acceptable - - def get_accuracy_and_fp_rate_from_stats(self,tp,fp,fn,tn,early,late,verbose=False): + def get_accuracy_and_fp_rate_from_stats( + self, tp, fp, fn, tn, early, late, verbose=False): total = tp + fp + fn + tn + early + late - disr = early + late + tp + fn + disr = early + late + tp + fn nondisr = fp + tn - + if disr == 0: early_alarm_rate = 0 missed = 0 - accuracy = 0 + accuracy = 0 else: early_alarm_rate = 1.0*early/disr missed = 1.0*(late + fn)/disr accuracy = 1.0*tp/disr if nondisr == 0: fp_rate = 0 - else: + else: fp_rate = 1.0*fp/nondisr correct = 1.0*(tp + tn)/total - + if verbose: print('accuracy: {}'.format(accuracy)) print('missed: {}'.format(missed)) @@ -323,15 +359,14 @@ def get_accuracy_and_fp_rate_from_stats(self,tp,fp,fn,tn,early,late,verbose=Fals print('false positive rate: {}'.format(fp_rate)) print('correct: {}'.format(correct)) - return correct,accuracy,fp_rate,missed,early_alarm_rate - - + return correct, accuracy, fp_rate, missed, early_alarm_rate def load_ith_file(self): results_files = os.listdir(self.results_dir) print(results_files) dat = np.load(self.results_dir + results_files[self.i]) - print("Loading results file {}".format(self.results_dir + results_files[self.i])) + print("Loading results file {}".format( + self.results_dir + results_files[self.i])) if self.verbose: print('configuration: {} '.format(dat['conf'])) @@ -345,44 +380,54 @@ def load_ith_file(self): self.shot_list_test = ShotList(dat['shot_list_test'][()]) self.shot_list_train = ShotList(dat['shot_list_train'][()]) self.saved_conf = dat['conf'][()] - self.conf['data']['T_warning'] = self.saved_conf['data']['T_warning'] #all files must agree on T_warning due to output of truth vs. normalized shot ttd. - for mode in ['test','train']: - print('{}: loaded {} shot ({}) disruptive'.format(mode,self.get_num_shots(mode),self.get_num_disruptive_shots(mode))) + # all files must agree on T_warning due to output of truth vs. + # normalized shot ttd. + self.conf['data']['T_warning'] = self.saved_conf['data']['T_warning'] + for mode in ['test', 'train']: + print( + '{}: loaded {} shot ({}) disruptive'.format( + mode, + self.get_num_shots(mode), + self.get_num_disruptive_shots(mode))) if self.verbose: self.print_conf() - #self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) - #self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) + # self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) + # self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) - def assert_same_lists(self,shot_list,truth_arr,disr_arr): + def assert_same_lists(self, shot_list, truth_arr, disr_arr): assert(len(shot_list) == len(truth_arr)) for i in range(len(shot_list)): - shot_list.shots[i].restore("/tigress/jk7/processed_shots/") - s = shot_list.shots[i].ttd - if not truth_arr[i].shape[0] == s.shape[0]-30: - print(i) - print(shot_list.shots[i].number) - print((s.shape,truth_arr[i].shape,disr_arr[i])) - assert(truth_arr[i].shape[0] == s.shape[0]-30) + shot_list.shots[i].restore("/tigress/jk7/processed_shots/") + s = shot_list.shots[i].ttd + if not truth_arr[i].shape[0] == s.shape[0]-30: + print(i) + print(shot_list.shots[i].number) + print((s.shape, truth_arr[i].shape, disr_arr[i])) + assert(truth_arr[i].shape[0] == s.shape[0]-30) print("Same Shape!") - + def print_conf(self): - pprint(self.saved_conf) + pprint(self.saved_conf) - def get_num_shots(self,mode): + def get_num_shots(self, mode): if mode == 'test': return len(self.disruptive_test) if mode == 'train': return len(self.disruptive_train) - def get_num_disruptive_shots(self,mode): + def get_num_disruptive_shots(self, mode): if mode == 'test': return sum(self.disruptive_test) if mode == 'train': return sum(self.disruptive_train) - - def hist_alarms(self,alarms,title_str='alarms',save_figure=False,linestyle='-'): - fontsize=15 + def hist_alarms( + self, + alarms, + title_str='alarms', + save_figure=False, + linestyle='-'): + fontsize = 15 T_min_warn = self.T_min_warn T_max_warn = self.T_max_warn if len(alarms) > 0: @@ -392,40 +437,45 @@ def hist_alarms(self,alarms,title_str='alarms',save_figure=False,linestyle='-'): T_max_warn /= 1000.0 plt.figure() alarms += 0.0001 - bins=np.logspace(np.log10(min(alarms)),np.log10(max(alarms)),40) - #bins=linspace(min(alarms),max(alarms),100) - # hist(alarms,bins=bins,alpha=1.0,histtype='step',normed=True,log=False,cumulative=-1) - # - plt.step(np.concatenate((alarms[::-1], alarms[[0]])), 1.0*np.arange(alarms.size+1)/(alarms.size),linestyle=linestyle,linewidth=1.5) + # bins = np.logspace(np.log10(min(alarms)), np.log10(max(alarms)), + # 40) + + # bins=linspace(min(alarms), max(alarms), 100) + # hist(alarms, bins=bins, alpha=1.0, histtype='step', + # normed=True, log=False, cumulative=-1) + plt.step(np.concatenate((alarms[::-1], alarms[[0]])), + 1.0*np.arange(alarms.size+1)/(alarms.size), + linestyle=linestyle, linewidth=1.5) plt.gca().set_xscale('log') - plt.axvline(T_min_warn,color='r',linewidth=0.5) - #if T_max_warn < np.max(alarms): + plt.axvline(T_min_warn, color='r', linewidth=0.5) + # if T_max_warn < np.max(alarms): # plt.axvline(T_max_warn,color='r',linewidth=0.5) - plt.xlabel('Time to disruption [s]',size=fontsize) - plt.ylabel('Fraction of detected disruptions',size=fontsize) - plt.xlim([1e-4,4e1])#max(alarms)*10]) - plt.ylim([0,1]) + plt.xlabel('Time to disruption [s]', size=fontsize) + plt.ylabel('Fraction of detected disruptions', size=fontsize) + plt.xlim([1e-4, 4e1]) # max(alarms)*10]) + plt.ylim([0, 1]) plt.grid() plt.title(title_str) - plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize) - plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize) + plt.setp(plt.gca().get_yticklabels(), fontsize=fontsize) + plt.setp(plt.gca().get_xticklabels(), fontsize=fontsize) plt.show() if save_figure: - plt.savefig('accum_disruptions.png',dpi=200,bbox_inches='tight') + plt.savefig( + 'accum_disruptions.png', + dpi=200, + bbox_inches='tight') else: print(title_str + ": No alarms!") - - - def gather_first_alarms(self,P_thresh,mode): + def gather_first_alarms(self, P_thresh, mode): if mode == 'train': - pred_list = self.pred_train - disruptive_list = self.disruptive_train + pred_list = self.pred_train + disruptive_list = self.disruptive_train elif mode == 'test': - pred_list = self.pred_test - disruptive_list = self.disruptive_test - + pred_list = self.pred_test + disruptive_list = self.disruptive_test + alarms = [] disr_alarms = [] nondisr_alarms = [] @@ -435,8 +485,9 @@ def gather_first_alarms(self,P_thresh,mode): predictions = pred < P_thresh else: predictions = pred > P_thresh - predictions = np.reshape(predictions,(len(predictions),)) - positives = self.get_positives(predictions) #where(predictions)[0] + predictions = np.reshape(predictions, (len(predictions),)) + positives = self.get_positives( + predictions) # where(predictions)[0] if len(positives) > 0: alarm_ttd = len(pred) - 1.0 - positives[0] alarms.append(alarm_ttd) @@ -447,36 +498,45 @@ def gather_first_alarms(self,P_thresh,mode): else: if disruptive_list[i]: disr_alarms.append(-1) - return np.array(alarms),np.array(disr_alarms),np.array(nondisr_alarms) - + return np.array(alarms), np.array( + disr_alarms), np.array(nondisr_alarms) - def compute_tradeoffs_and_print(self,mode): + def compute_tradeoffs_and_print(self, mode): P_thresh_range = self.get_p_thresh_range() - correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = self.get_metrics_vs_p_thresh(mode) - fp_threshs = [0.01,0.05,0.1] - missed_threshs = [0.01,0.05,0.0] - # missed_threshs = [0.01,0.05,0.1,0.2,0.3] - - #first index where... - for fp_thresh in fp_threshs: + (correct_range, accuracy_range, fp_range, missed_range, + early_alarm_range) = self.get_metrics_vs_p_thresh(mode) + fp_threshs = [0.01, 0.05, 0.1] + missed_threshs = [0.01, 0.05, 0.0] + # missed_threshs = [0.01, 0.05, 0.1, 0.2, 0.3] + + # first index where... + for fp_thresh in fp_threshs: print('============= FP RATE < {} ============='.format(fp_thresh)) if(any(fp_range < fp_thresh)): idx = np.where(fp_range <= fp_thresh)[0][0] P_thresh_opt = P_thresh_range[idx] - self.summarize_shot_prediction_stats_by_mode(P_thresh_opt,mode,verbose=True) - print('============= AT P_THRESH = {} ============='.format(P_thresh_opt)) + self.summarize_shot_prediction_stats_by_mode( + P_thresh_opt, mode, verbose=True) + print( + '============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: - print('No such P_thresh found') + print('No such P_thresh found') print('') - #last index where - for missed_thresh in missed_threshs: - print('============= MISSED RATE < {} ============='.format(missed_thresh)) + # last index where + for missed_thresh in missed_threshs: + print( + '============= MISSED RATE < {} ============='.format( + missed_thresh)) if(any(missed_range < missed_thresh)): idx = np.where(missed_range <= missed_thresh)[0][-1] P_thresh_opt = P_thresh_range[idx] - self.summarize_shot_prediction_stats_by_mode(P_thresh_opt,mode,verbose=True) - print('============= AT P_THRESH = {} ============='.format(P_thresh_opt)) + self.summarize_shot_prediction_stats_by_mode( + P_thresh_opt, mode, verbose=True) + print( + '============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: print('No such P_thresh found') print('') @@ -485,17 +545,18 @@ def compute_tradeoffs_and_print(self,mode): print('============= TEST PERFORMANCE: =============') idx = np.where(missed_range <= fp_range)[0][-1] P_thresh_opt = P_thresh_range[idx] - self.summarize_shot_prediction_stats_by_mode(P_thresh_opt,mode,verbose=True) + self.summarize_shot_prediction_stats_by_mode( + P_thresh_opt, mode, verbose=True) P_thresh_ret = P_thresh_opt return P_thresh_ret - def compute_tradeoffs_and_print_from_training(self): P_thresh_range = self.get_p_thresh_range() - correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = self.get_metrics_vs_p_thresh('train') + (correct_range, accuracy_range, fp_range, missed_range, + early_alarm_range) = self.get_metrics_vs_p_thresh('train') - fp_threshs = [0.01,0.05,0.1] - missed_threshs = [0.01,0.05,0.0] + fp_threshs = [0.01, 0.05, 0.1] + missed_threshs = [0.01, 0.05, 0.0] # missed_threshs = [0.01,0.05,0.1,0.2,0.3] P_thresh_default = 0.03 P_thresh_ret = P_thresh_default @@ -503,33 +564,38 @@ def compute_tradeoffs_and_print_from_training(self): first_idx = 0 if not self.pred_ttd else -1 last_idx = -1 if not self.pred_ttd else 0 - #first index where... - for fp_thresh in fp_threshs: + # first index where... + for fp_thresh in fp_threshs: - print('============= TRAINING FP RATE < {} ============='.format(fp_thresh)) + print('============= TRAINING FP RATE < {} ============='.format( + fp_thresh)) print('============= TEST PERFORMANCE: =============') if(any(fp_range < fp_thresh)): idx = np.where(fp_range <= fp_thresh)[0][first_idx] P_thresh_opt = P_thresh_range[idx] - self.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test',verbose=True) - print('============= AT P_THRESH = {} ============='.format(P_thresh_opt)) + self.summarize_shot_prediction_stats_by_mode( + P_thresh_opt, 'test', verbose=True) + print('============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: print('No such P_thresh found') P_thresh_opt = P_thresh_default print('') - #last index where - for missed_thresh in missed_threshs: - - print('============= TRAINING MISSED RATE < {} ============='.format(missed_thresh)) + # last index where + for missed_thresh in missed_threshs: + print('============= TRAINING MISSED RATE < {} ==========='.format( + missed_thresh)) print('============= TEST PERFORMANCE: =============') if(any(missed_range < missed_thresh)): idx = np.where(missed_range <= missed_thresh)[0][last_idx] P_thresh_opt = P_thresh_range[idx] - self.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test',verbose=True) + self.summarize_shot_prediction_stats_by_mode( + P_thresh_opt, 'test', verbose=True) if missed_thresh == 0.05: P_thresh_ret = P_thresh_opt - print('============= AT P_THRESH = {} ============='.format(P_thresh_opt)) + print('============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: print('No such P_thresh found') P_thresh_opt = P_thresh_default @@ -540,20 +606,25 @@ def compute_tradeoffs_and_print_from_training(self): if(any(missed_range <= fp_range)): idx = np.where(missed_range <= fp_range)[0][last_idx] P_thresh_opt = P_thresh_range[idx] - self.summarize_shot_prediction_stats_by_mode(P_thresh_opt,'test',verbose=True) + self.summarize_shot_prediction_stats_by_mode( + P_thresh_opt, 'test', verbose=True) P_thresh_ret = P_thresh_opt - print('============= AT P_THRESH = {} ============='.format(P_thresh_opt)) + print('============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: print('No such P_thresh found') return P_thresh_ret + def compute_tradeoffs_and_plot(self, mode, save_figure=True, + plot_string='', linestyle="-"): + (correct_range, accuracy_range, fp_range, missed_range, + early_alarm_range) = self.get_metrics_vs_p_thresh(mode) - def compute_tradeoffs_and_plot(self,mode,save_figure=True,plot_string='',linestyle="-"): - correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = self.get_metrics_vs_p_thresh(mode) - - return self.tradeoff_plot(accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=save_figure,plot_string=plot_string,linestyle=linestyle) + return self.tradeoff_plot(accuracy_range, missed_range, fp_range, + early_alarm_range, save_figure=save_figure, + plot_string=plot_string, linestyle=linestyle) - def get_prediction_type(self,TP,FP,FN,TN,early,late): + def get_prediction_type(self, TP, FP, FN, TN, early, late): if TP: return 'TP' elif FP: @@ -567,9 +638,14 @@ def get_prediction_type(self,TP,FP,FN,TN,early,late): elif late: return 'late' - def plot_individual_shot(self,P_thresh_opt,shot_num,normalize=True,plot_signals=True): + def plot_individual_shot( + self, + P_thresh_opt, + shot_num, + normalize=True, + plot_signals=True): success = False - for mode in ['test','train']: + for mode in ['test', 'train']: if mode == 'test': pred = self.pred_test truth = self.truth_test @@ -580,30 +656,49 @@ def plot_individual_shot(self,P_thresh_opt,shot_num,normalize=True,plot_signals= truth = self.truth_train is_disruptive = self.disruptive_train shot_list = self.shot_list_train - for i,shot in enumerate(shot_list): + for i, shot in enumerate(shot_list): if shot.number == shot_num: t = truth[i] p = pred[i] is_disr = is_disruptive[i] - TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh_opt,p,t,is_disr) - prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) + TP, FP, FN, TN, early, late = ( + self.get_shot_prediction_stats(P_thresh_opt, p, t, + is_disr)) + prediction_type = self.get_prediction_type(TP, FP, FN, TN, + early, late) print(prediction_type) - self.plot_shot(shot,True,normalize,t,p,P_thresh_opt,prediction_type,extra_filename = '_indiv') + self.plot_shot( + shot, + True, + normalize, + t, + p, + P_thresh_opt, + prediction_type, + extra_filename='_indiv') success = True if not success: print("Shot {} not found".format(shot_num)) - - def get_prediction_type_for_individual_shot(self,P_thresh,shot,mode='test'): - p,t,is_disr = self.get_pred_truth_disr_by_shot(shot) + def get_prediction_type_for_individual_shot( + self, P_thresh, shot, mode='test'): + p, t, is_disr = self.get_pred_truth_disr_by_shot(shot) - TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh,p,t,is_disr) - prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) + TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( + P_thresh, p, t, is_disr) + prediction_type = self.get_prediction_type(TP, FP, FN, TN, early, late) return prediction_type - - def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot = 5,normalize=True,plot_signals=True,extra_filename=''): + def example_plots( + self, + P_thresh_opt, + mode='test', + types_to_plot=['FP'], + max_plot=5, + normalize=True, + plot_signals=True, + extra_filename=''): if mode == 'test': pred = self.pred_test truth = self.truth_test @@ -623,126 +718,201 @@ def example_plots(self,P_thresh_opt,mode='test',types_to_plot = ['FP'],max_plot is_disr = is_disruptive[i] shot = shot_list.shots[i] - TP,FP,FN,TN,early,late =self.get_shot_prediction_stats(P_thresh_opt,p,t,is_disr) - prediction_type = self.get_prediction_type(TP,FP,FN,TN,early,late) - if not all(_ in set(['FP','TP','FN','TN','late','early','any']) for _ in types_to_plot): + TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( + P_thresh_opt, p, t, is_disr) + prediction_type = self.get_prediction_type( + TP, FP, FN, TN, early, late) + if not all(_ in set(['FP', 'TP', 'FN', 'TN', 'late', + 'early', 'any']) for _ in types_to_plot): print('warning, unkown types_to_plot') return - if ('any' in types_to_plot or prediction_type in types_to_plot) and plotted < max_plot: + if (('any' in types_to_plot or prediction_type in types_to_plot) + and plotted < max_plot): if plot_signals: - self.plot_shot(shot,True,normalize,t,p,P_thresh_opt,prediction_type,extra_filename=extra_filename) + self.plot_shot( + shot, + True, + normalize, + t, + p, + P_thresh_opt, + prediction_type, + extra_filename=extra_filename) else: plt.figure() - plt.semilogy((t+0.001)[::-1],label='ground truth') - plt.plot(p[::-1],'g',label='neural net prediction') - plt.axvline(self.T_min_warn,color='r',label='max warning time') - plt.axvline(self.T_max_warn,color='r',label='min warning time') - plt.axhline(P_thresh_opt,color='k',label='trigger threshold') + plt.semilogy((t+0.001)[::-1], label='ground truth') + plt.plot(p[::-1], 'g', label='neural net prediction') + plt.axvline( + self.T_min_warn, + color='r', + label='max warning time') + plt.axvline( + self.T_max_warn, + color='r', + label='min warning time') + plt.axhline( + P_thresh_opt, + color='k', + label='trigger threshold') plt.xlabel('TTD [ms]') - plt.legend(loc = (1.0,0.6)) - plt.ylim([1e-7,1.1e0]) + plt.legend(loc=(1.0, 0.6)) + plt.ylim([1e-7, 1.1e0]) plt.grid() - plt.savefig('fig_{}.png'.format(shot.number),bbox_inches='tight') + plt.savefig( + 'fig_{}.png'.format( + shot.number), + bbox_inches='tight') plotted += 1 - def plot_shot(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): + def plot_shot( + self, + shot, + save_fig=True, + normalize=True, + truth=None, + prediction=None, + P_thresh_opt=None, + prediction_type='', + extra_filename=''): if self.normalizer is None and normalize: if self.conf is not None: - self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] + self.saved_conf['paths']['normalizer_path'] = ( + self.conf['paths']['normalizer_path']) nn = Normalizer(self.saved_conf) nn.train() self.normalizer = nn self.normalizer.set_inference_mode(True) - + if(shot.previously_saved(self.shots_dir)): shot.restore(self.shots_dir) - if shot.signals_dict is not None: #make sure shot was saved with data - t_disrupt = shot.t_disrupt - is_disruptive = shot.is_disruptive + if shot.signals_dict is not None: + # make sure shot was saved with data + # t_disrupt = shot.t_disrupt + # is_disruptive = shot.is_disruptive if normalize: self.normalizer.apply(shot) - + use_signals = self.saved_conf['paths']['use_signals'] - fontsize= 15 - lower_lim = 0 #len(pred) + fontsize = 15 + lower_lim = 0 # len(pred) plt.close() - colors = ["b","k"] - lss = ["-","--"] - f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(10,15))#, squeeze=False) + # colors = ["b", "k"] + # lss = ["-", "--"] + f, axarr = plt.subplots( + len(use_signals)+1, 1, sharex=True, figsize=(10, 15)) plt.title(prediction_type) assert(np.all(shot.ttd.flatten() == truth.flatten())) - xx = range(len(prediction)) #list(reversed(range(len(pred)))) - for i,sig in enumerate(use_signals): + xx = range(len(prediction)) # list(reversed(range(len(pred)))) + for i, sig in enumerate(use_signals): ax = axarr[i] num_channels = sig.num_channels sig_arr = shot.signals_dict[sig] if num_channels == 1: - # if j == 0: - ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j]) - # else: - # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) - ax.plot([],linestyle="none",label = sig.description)#labels[sig]) - if np.min(sig_arr[:,0]) < 0: - ax.set_ylim([-6,6]) - ax.set_yticks([-5,0,5]) - # ax.plot(xx,sig_arr[:,0],linewidth=2)#,linestyle=lss[j],color=colors[j],label = labels[sig]) - ax.plot([],linestyle="none",label = sig.description)#labels[sig]) - if np.min(sig_arr[:,0]) < 0: - ax.set_ylim([-6,6]) - ax.set_yticks([-5,0,5]) + ax.plot(xx, sig_arr[:, 0], linewidth=2) + ax.plot([], linestyle="none", label=sig.description) + if np.min(sig_arr[:, 0]) < 0: + ax.set_ylim([-6, 6]) + ax.set_yticks([-5, 0, 5]) + ax.plot([], linestyle="none", label=sig.description) + if np.min(sig_arr[:, 0]) < 0: + ax.set_ylim([-6, 6]) + ax.set_yticks([-5, 0, 5]) else: - ax.set_ylim([0,8]) - ax.set_yticks([0,5]) - # ax.set_ylabel(labels[sig],size=fontsize) + ax.set_ylim([0, 8]) + ax.set_yticks([0, 5]) else: - ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description,cmap="inferno" ) - ax.set_ylim([0,num_channels]) - ax.text(lower_lim+200, 45, sig.description, bbox={'facecolor': 'white', 'pad': 10},fontsize=fontsize-5) - ax.set_yticks([0,num_channels/2]) - ax.set_yticklabels(["0","0.5"]) - ax.set_ylabel("$\\rho$",size=fontsize) - ax.legend(loc="best",labelspacing=0.1,fontsize=fontsize,frameon=False) - ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5) - plt.setp(ax.get_xticklabels(),visible=False) - plt.setp(ax.get_yticklabels(),fontsize=fontsize) + ax.imshow(sig_arr[:, :].T, aspect='auto', + label=sig.description, cmap="inferno") + ax.set_ylim([0, num_channels]) + ax.text(lower_lim+200, 45, sig.description, + bbox={'facecolor': 'white', 'pad': 10}, + fontsize=fontsize-5) + ax.set_yticks([0, num_channels/2]) + ax.set_yticklabels(["0", "0.5"]) + ax.set_ylabel("$\\rho$", size=fontsize) + ax.legend( + loc="best", + labelspacing=0.1, + fontsize=fontsize, + frameon=False) + ax.axvline( + len(truth) + - self.T_min_warn, + color='r', + linewidth=0.5) + plt.setp(ax.get_xticklabels(), visible=False) + plt.setp(ax.get_yticklabels(), fontsize=fontsize) f.subplots_adjust(hspace=0) - #print(sig) - #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) - ax = axarr[-1] - # ax.semilogy((-truth+0.0001),label='ground truth') - # ax.plot(-prediction+0.0001,'g',label='neural net prediction') - # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') - # nn = np.min(pred) - ax.plot(xx,truth,'g',label='target',linewidth=2) - # ax.axhline(0.4,linestyle="--",color='k',label='threshold') - ax.plot(xx,prediction,'b',label='RNN output',linewidth=2) - ax.axhline(P_thresh_opt,linestyle="--",color='k',label='threshold') - ax.set_ylim([-2,2]) - ax.set_yticks([-1,0,1]) + ax = axarr[-1] + # ax.semilogy((-truth+0.0001),label='ground truth') + # ax.plot(-prediction+0.0001,'g',label='neural net prediction') + # ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') + # nn = np.min(pred) + ax.plot(xx, truth, 'g', label='target', linewidth=2) + # ax.axhline(0.4,linestyle="--",color='k',label='threshold') + ax.plot(xx, prediction, 'b', label='RNN output', linewidth=2) + ax.axhline(P_thresh_opt, linestyle="--", color='k', + label='threshold') + ax.set_ylim([-2, 2]) + ax.set_yticks([-1, 0, 1]) # if len(truth)-T_max_warn >= 0: - # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max warning time') - ax.axvline(len(truth)-self.T_min_warn,color='r',linewidth=0.5)#,label='min warning time') - ax.set_xlabel('T [ms]',size=fontsize) + # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max + # warning time') + # ,label='min warning time') + ax.axvline( + len(truth) + - self.T_min_warn, + color='r', + linewidth=0.5) + ax.set_xlabel('T [ms]', size=fontsize) # ax.axvline(2400) - ax.legend(loc = (0.5,0.7),fontsize=fontsize-5,labelspacing=0.1,frameon=False) - plt.setp(ax.get_yticklabels(),fontsize=fontsize) - plt.setp(ax.get_xticklabels(),fontsize=fontsize) + ax.legend( + loc=( + 0.5, + 0.7), + fontsize=fontsize-5, + labelspacing=0.1, + frameon=False) + plt.setp(ax.get_yticklabels(), fontsize=fontsize) + plt.setp(ax.get_xticklabels(), fontsize=fontsize) # plt.xlim(0,200) - plt.xlim([lower_lim,len(truth)]) + plt.xlim([lower_lim, len(truth)]) # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") if save_fig: - plt.savefig('sig_fig_{}{}.png'.format(shot.number,extra_filename),bbox_inches='tight') - np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=prediction,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) - #plt.show() + plt.savefig( + 'sig_fig_{}{}.png'.format( + shot.number, + extra_filename), + bbox_inches='tight') + np.savez( + 'sig_{}{}.npz'.format( + shot.number, + extra_filename), + shot=shot, + T_min_warn=self.T_min_warn, + T_max_warn=self.T_max_warn, + prediction=prediction, + truth=truth, + use_signals=use_signals, + P_thresh=P_thresh_opt) + # plt.show() else: print("Shot hasn't been processed") - - - def plot_shot_old(self,shot,save_fig=True,normalize=True,truth=None,prediction=None,P_thresh_opt=None,prediction_type='',extra_filename=''): + def plot_shot_old( + self, + shot, + save_fig=True, + normalize=True, + truth=None, + prediction=None, + P_thresh_opt=None, + prediction_type='', + extra_filename=''): if self.normalizer is None and normalize: if self.conf is not None: - self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] + self.saved_conf['paths']['normalizer_path'] = ( + self.conf['paths']['normalizer_path']) nn = Normalizer(self.saved_conf) nn.train() self.normalizer = nn @@ -750,100 +920,155 @@ def plot_shot_old(self,shot,save_fig=True,normalize=True,truth=None,prediction=N if(shot.previously_saved(self.shots_dir)): shot.restore(self.shots_dir) - t_disrupt = shot.t_disrupt - is_disruptive = shot.is_disruptive + # t_disrupt = shot.t_disrupt + # is_disruptive = shot.is_disruptive if normalize: self.normalizer.apply(shot) use_signals = self.saved_conf['paths']['use_signals'] - f,axarr = plt.subplots(len(use_signals)+1,1,sharex=True,figsize=(13,13))#, squeeze=False) + f, axarr = plt.subplots(len(use_signals)+1, 1, sharex=True, + figsize=(13, 13)) plt.title(prediction_type) - #all files must agree on T_warning due to output of truth vs. normalized shot ttd. + # all files must agree on T_warning due to output of truth vs. + # normalized shot ttd. assert(np.all(shot.ttd.flatten() == truth.flatten())) - for i,sig in enumerate(use_signals): + for i, sig in enumerate(use_signals): num_channels = sig.num_channels ax = axarr[i] sig_arr = shot.signals_dict[sig] if num_channels == 1: - ax.plot(sig_arr[:,0],label = sig.description) + ax.plot(sig_arr[:, 0], label=sig.description) else: - ax.imshow(sig_arr[:,:].T, aspect='auto', label = sig.description + " (profile)") - ax.set_ylim([0,num_channels]) - ax.legend(loc='best',fontsize=8) - plt.setp(ax.get_xticklabels(),visible=False) - plt.setp(ax.get_yticklabels(),fontsize=7) + ax.imshow(sig_arr[:, :].T, aspect='auto', + label=sig.description + " (profile)") + ax.set_ylim([0, num_channels]) + ax.legend(loc='best', fontsize=8) + plt.setp(ax.get_xticklabels(), visible=False) + plt.setp(ax.get_yticklabels(), fontsize=7) f.subplots_adjust(hspace=0) - #print(sig) - #print('min: {}, max: {}'.format(np.min(sig_arr), np.max(sig_arr))) - ax = axarr[-1] + # print(sig) + # print('min: {}, max: {}'.format(np.min(sig_arr), + # np.max(sig_arr))) + ax = axarr[-1] if self.pred_ttd: - ax.semilogy((-truth+0.0001),label='ground truth') - ax.plot(-prediction+0.0001,'g',label='neural net prediction') - ax.axhline(-P_thresh_opt,color='k',label='trigger threshold') + ax.semilogy((-truth+0.0001), label='ground truth') + ax.plot(-prediction+0.0001, 'g', label='neural net prediction') + ax.axhline(-P_thresh_opt, color='k', label='trigger threshold') else: - ax.plot((truth+0.001),label='ground truth') - ax.plot(prediction,'g',label='neural net prediction') - ax.axhline(P_thresh_opt,color='k',label='trigger threshold') - #ax.set_ylim([1e-5,1.1e0]) - ax.set_ylim([-2,2]) + ax.plot((truth+0.001), label='ground truth') + ax.plot(prediction, 'g', label='neural net prediction') + ax.axhline(P_thresh_opt, color='k', label='trigger threshold') + # ax.set_ylim([1e-5,1.1e0]) + ax.set_ylim([-2, 2]) if len(truth)-self.T_max_warn >= 0: - ax.axvline(len(truth)-self.T_max_warn,color='r',label='min warning time') - ax.axvline(len(truth)-self.T_min_warn,color='r',label='max warning time') + ax.axvline( + len(truth)-self.T_max_warn, + color='r', + label='min warning time') + ax.axvline( + len(truth) + - self.T_min_warn, + color='r', + label='max warning time') ax.set_xlabel('T [ms]') - #ax.legend(loc = 'lower left',fontsize=10) - plt.setp(ax.get_yticklabels(),fontsize=7) - # ax.grid() + # ax.legend(loc = 'lower left',fontsize=10) + plt.setp(ax.get_yticklabels(), fontsize=7) + # ax.grid() if save_fig: - plt.savefig('sig_fig_{}{}.png'.format(shot.number,extra_filename),bbox_inches='tight') - np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=prediction,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) + plt.savefig( + 'sig_fig_{}{}.png'.format( + shot.number, + extra_filename), + bbox_inches='tight') + np.savez( + 'sig_{}{}.npz'.format( + shot.number, + extra_filename), + shot=shot, + T_min_warn=self.T_min_warn, + T_max_warn=self.T_max_warn, + prediction=prediction, + truth=truth, + use_signals=use_signals, + P_thresh=P_thresh_opt) plt.close() else: print("Shot hasn't been processed") - - def tradeoff_plot(self,accuracy_range,missed_range,fp_range,early_alarm_range,save_figure=False,plot_string='',linestyle="-"): - fontsize=15 + def tradeoff_plot( + self, + accuracy_range, + missed_range, + fp_range, + early_alarm_range, + save_figure=False, + plot_string='', + linestyle="-"): + fontsize = 15 plt.figure() P_thresh_range = self.get_p_thresh_range() # semilogx(P_thresh_range,accuracy_range,label="accuracy") if self.pred_ttd: - plt.semilogx(abs(P_thresh_range[::-1]),missed_range,'r',label="missed",linestyle=linestyle) - plt.plot(abs(P_thresh_range[::-1]),fp_range,'k',label="false positives",linestyle=linestyle) + plt.semilogx(abs(P_thresh_range[::-1]), + missed_range, + 'r', + label="missed", + linestyle=linestyle) + plt.plot(abs(P_thresh_range[::-1]), + fp_range, + 'k', + label="false positives", + linestyle=linestyle) else: - plt.plot(P_thresh_range,missed_range,'r',label="missed",linestyle=linestyle) - plt.plot(P_thresh_range,fp_range,'k',label="false positives",linestyle=linestyle) + plt.plot( + P_thresh_range, + missed_range, + 'r', + label="missed", + linestyle=linestyle) + plt.plot( + P_thresh_range, + fp_range, + 'k', + label="false positives", + linestyle=linestyle) # plot(P_thresh_range,early_alarm_range,'c',label="early alarms") - plt.legend(loc=(1.0,.6)) - plt.xlabel('Alarm threshold',size=fontsize) + plt.legend(loc=(1.0, .6)) + plt.xlabel('Alarm threshold', size=fontsize) plt.grid() - title_str = 'metrics{}'.format(plot_string.replace('_',' ')) + title_str = 'metrics{}'.format(plot_string.replace('_', ' ')) plt.title(title_str) if save_figure: - plt.savefig(title_str + '.png',bbox_inches='tight') + plt.savefig(title_str + '.png', bbox_inches='tight') plt.close('all') - plt.plot(fp_range,1-missed_range,'-b',linestyle=linestyle) + plt.plot(fp_range, 1-missed_range, '-b', linestyle=linestyle) ax = plt.gca() - plt.xlabel('FP rate',size=fontsize) - plt.ylabel('TP rate',size=fontsize) - major_ticks = np.arange(0,1.01,0.2) - minor_ticks = np.arange(0,1.01,0.05) + plt.xlabel('FP rate', size=fontsize) + plt.ylabel('TP rate', size=fontsize) + major_ticks = np.arange(0, 1.01, 0.2) + minor_ticks = np.arange(0, 1.01, 0.05) ax.set_xticks(major_ticks) ax.set_yticks(major_ticks) - ax.set_xticks(minor_ticks,minor=True) - ax.set_yticks(minor_ticks,minor=True) - plt.setp(plt.gca().get_yticklabels(),fontsize=fontsize) - plt.setp(plt.gca().get_xticklabels(),fontsize=fontsize) + ax.set_xticks(minor_ticks, minor=True) + ax.set_yticks(minor_ticks, minor=True) + plt.setp(plt.gca().get_yticklabels(), fontsize=fontsize) + plt.setp(plt.gca().get_xticklabels(), fontsize=fontsize) ax.grid(which='both') - ax.grid(which='major',alpha=0.5) - ax.grid(which='minor',alpha=0.3) - plt.xlim([0,1]) - plt.ylim([0,1]) + ax.grid(which='major', alpha=0.5) + ax.grid(which='minor', alpha=0.3) + plt.xlim([0, 1]) + plt.ylim([0, 1]) if save_figure: - plt.savefig(title_str + '_roc.png',bbox_inches='tight',dpi=200) - print('ROC area ({}) is {}'.format(plot_string,self.roc_from_missed_fp(missed_range,fp_range))) - return P_thresh_range,missed_range,fp_range - - def get_pred_truth_disr_by_shot(self,shot): + plt.savefig(title_str + '_roc.png', bbox_inches='tight', dpi=200) + print( + 'ROC area ({}) is {}'.format( + plot_string, + self.roc_from_missed_fp( + missed_range, + fp_range))) + return P_thresh_range, missed_range, fp_range + + def get_pred_truth_disr_by_shot(self, shot): if shot in self.shot_list_test: mode = 'test' elif shot in self.shot_list_train: @@ -866,50 +1091,49 @@ def get_pred_truth_disr_by_shot(self,shot): p = pred[i] is_disr = is_disruptive[i] shot = shot_list.shots[i] - return p,t,is_disr + return p, t, is_disr - def save_shot(self,shot,P_thresh_opt = 0,extra_filename=''): + def save_shot(self, shot, P_thresh_opt=0, extra_filename=''): if self.normalizer is None: if self.conf is not None: - self.saved_conf['paths']['normalizer_path'] = self.conf['paths']['normalizer_path'] + self.saved_conf['paths']['normalizer_path'] = ( + self.conf['paths']['normalizer_path']) nn = Normalizer(self.saved_conf) nn.train() self.normalizer = nn self.normalizer.set_inference_mode(True) - + shot.restore(self.shots_dir) - t_disrupt = shot.t_disrupt - is_disruptive = shot.is_disruptive + # t_disrupt = shot.t_disrupt + # is_disruptive = shot.is_disruptive self.normalizer.apply(shot) - - - pred,truth,is_disr = self.get_pred_truth_disr_by_shot(shot) + pred, truth, is_disr = self.get_pred_truth_disr_by_shot(shot) use_signals = self.saved_conf['paths']['use_signals'] - np.savez('sig_{}{}.npz'.format(shot.number,extra_filename),shot=shot,T_min_warn=self.T_min_warn,T_max_warn=self.T_max_warn,prediction=pred,truth=truth,use_signals=use_signals,P_thresh=P_thresh_opt) + np.savez('sig_{}{}.npz'.format(shot.number, extra_filename), + shot=shot, T_min_warn=self.T_min_warn, + T_max_warn=self.T_max_warn, prediction=pred, + truth=truth, use_signals=use_signals, P_thresh=P_thresh_opt) - def get_roc_area_by_mode(self,mode='test'): + def get_roc_area_by_mode(self, mode='test'): if mode == 'test': pred = self.pred_test truth = self.truth_test is_disruptive = self.disruptive_test - shot_list = self.shot_list_test + # shot_list = self.shot_list_test else: pred = self.pred_train truth = self.truth_train is_disruptive = self.disruptive_train - shot_list = self.shot_list_train - return self.get_roc_area(pred,truth,is_disruptive) - - def get_roc_area(self,all_preds,all_truths,all_disruptive): - correct_range, accuracy_range, fp_range,missed_range,early_alarm_range = \ - self.get_metrics_vs_p_thresh_custom(all_preds,all_truths,all_disruptive) - - return self.roc_from_missed_fp(missed_range,fp_range) + # shot_list = self.shot_list_train + return self.get_roc_area(pred, truth, is_disruptive) - def roc_from_missed_fp(self,missed_range,fp_range): - #print(fp_range) - #print(missed_range) - return -np.trapz(1-missed_range,x=fp_range) + def get_roc_area(self, all_preds, all_truths, all_disruptive): + (correct_range, accuracy_range, fp_range, missed_range, + early_alarm_range) = self.get_metrics_vs_p_thresh_custom( + all_preds, all_truths, all_disruptive) + return self.roc_from_missed_fp(missed_range, fp_range) + def roc_from_missed_fp(self, missed_range, fp_range): + return -np.trapz(1 - missed_range, x=fp_range) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index 7f8ab81f..d6995bcb 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -12,26 +12,29 @@ import itertools import numpy as np -from scipy.interpolate import UnivariateSpline -import sys - -#interpolate in a way that doesn't use future information. -#It simply finds the latest time point in the original array -#that is less than or equal than the time point in question -#and interpolates to there. -def time_sensitive_interp(x,t,t_new): - indices = np.maximum(0,np.searchsorted(t,t_new,side='right')-1) +# from scipy.interpolate import UnivariateSpline + +# interpolate in a way that doesn't use future information. +# It simply finds the latest time point in the original array +# that is less than or equal than the time point in question +# and interpolates to there. + + +def time_sensitive_interp(x, t, t_new): + indices = np.maximum(0, np.searchsorted(t, t_new, side='right')-1) return x[indices] -def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): + +def resample_signal(t, sig, tmin, tmax, dt, precision_str='float32'): order = np.argsort(t) t = t[order] - sig = sig[order,:] + sig = sig[order, :] sig_width = sig.shape[1] - tt = np.arange(tmin,tmax,dt,dtype=precision_str) - sig_interp = np.zeros((len(tt),sig_width),dtype=precision_str) + tt = np.arange(tmin, tmax, dt, dtype=precision_str) + sig_interp = np.zeros((len(tt), sig_width), dtype=precision_str) for i in range(sig_width): - sig_interp[:,i] = time_sensitive_interp(sig[:,i],t,tt) #make sure to not use future information + # make sure to not use future information + sig_interp[:, i] = time_sensitive_interp(sig[:, i], t, tt) # f = UnivariateSpline(t,sig[:,i],s=0,k=1,ext=0) # sig_interp[:,i] = f(tt) if(np.any(np.isnan(sig_interp))): @@ -41,59 +44,67 @@ def resample_signal(t,sig,tmin,tmax,dt,precision_str='float32'): idx = np.where(t[1:] - t[:-1] <= 0)[0][0] print(t[idx-10:idx+10]) - return tt,sig_interp + return tt, sig_interp + -def cut_signal(t,sig,tmin,tmax): +def cut_signal(t, sig, tmin, tmax): mask = np.logical_and(t >= tmin, t <= tmax) - return t[mask],sig[mask,:] + return t[mask], sig[mask, :] + -def cut_and_resample_signal(t,sig,tmin,tmax,dt,precision_str): - t,sig = cut_signal(t,sig,tmin,tmax) - return resample_signal(t,sig,tmin,tmax,dt,precision_str) +def cut_and_resample_signal(t, sig, tmin, tmax, dt, precision_str): + t, sig = cut_signal(t, sig, tmin, tmax) + return resample_signal(t, sig, tmin, tmax, dt, precision_str) -def get_individual_shot_file(prepath,shot_num,ext='.txt'): - return prepath + str(shot_num) + ext -def append_to_filename(path,to_append): +def get_individual_shot_file(prepath, shot_num, ext='.txt'): + return prepath + str(shot_num) + ext + + +def append_to_filename(path, to_append): ending_idx = path.rfind('.') new_path = path[:ending_idx] + to_append + path[ending_idx:] return new_path -def train_test_split(x,frac,do_shuffle=False): - if not isinstance(x,np.ndarray): - return train_test_split_robust(x,frac,do_shuffle) + +def train_test_split(x, frac, do_shuffle=False): + if not isinstance(x, np.ndarray): + return train_test_split_robust(x, frac, do_shuffle) mask = np.array(range(len(x))) < frac*len(x) if do_shuffle: np.random.shuffle(mask) - return x[mask],x[~mask] + return x[mask], x[~mask] -def train_test_split_robust(x,frac,do_shuffle=False): + +def train_test_split_robust(x, frac, do_shuffle=False): mask = np.array(range(len(x))) < frac*len(x) if do_shuffle: np.random.shuffle(mask) train = [] test = [] - for (i,_x) in enumerate(x): + for (i, _x) in enumerate(x): if mask[i]: train.append(_x) else: test.append(_x) - return train,test + return train, test + -def train_test_split_all(x,frac,do_shuffle=True): +def train_test_split_all(x, frac, do_shuffle=True): groups = [] length = len(x[0]) mask = np.array(range(length)) < frac*length if do_shuffle: np.random.shuffle(mask) for item in x: - groups.append((item[mask],item[~mask])) + groups.append((item[mask], item[~mask])) return groups def concatenate_sublists(superlist): return list(itertools.chain.from_iterable(superlist)) + def get_signal_slices(signals_superlist): indices_superlist = [] signals_so_far = 0 diff --git a/plasma/utils/state_reset.py b/plasma/utils/state_reset.py index 3d872447..172023bf 100644 --- a/plasma/utils/state_reset.py +++ b/plasma/utils/state_reset.py @@ -1,32 +1,35 @@ from __future__ import print_function import keras.backend as K -import numpy as np + def get_states(model): - all_states = [] - for layer in model.layers: - if hasattr(layer,"states"): - layer_states = [] - for state in layer.states: - #print(K.get_value(state)[0][0:3]) - layer_states.append(K.get_value(state)) - all_states.append(layer_states) - # print(all_states) - return all_states + all_states = [] + for layer in model.layers: + if hasattr(layer, "states"): + layer_states = [] + for state in layer.states: + # print(K.get_value(state)[0][0:3]) + layer_states.append(K.get_value(state)) + all_states.append(layer_states) + # print(all_states) + return all_states + def set_states(model, all_states): - i = 0 - for layer in model.layers: - if hasattr(layer,"states"): - layer.reset_states(all_states[i]) - i += 1 + i = 0 + for layer in model.layers: + if hasattr(layer, "states"): + layer.reset_states(all_states[i]) + i += 1 + def reset_states(model, batches_to_reset): - old_states = get_states(model) - model.reset_states() - new_states = get_states(model) - for i,layer_states in enumerate(new_states): - for j,within_layer_state in enumerate(layer_states): - assert(len(batches_to_reset) == within_layer_state.shape[0]) - within_layer_state[~batches_to_reset,:] = old_states[i][j][~batches_to_reset,:] - set_states(model,new_states) + old_states = get_states(model) + model.reset_states() + new_states = get_states(model) + for i, layer_states in enumerate(new_states): + for j, within_layer_state in enumerate(layer_states): + assert(len(batches_to_reset) == within_layer_state.shape[0]) + within_layer_state[~batches_to_reset, + :] = old_states[i][j][~batches_to_reset, :] + set_states(model, new_states) From 492f52f598541eac43090a97f7d310606b869be9 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 24 Sep 2019 16:29:16 -0500 Subject: [PATCH 565/744] Fix remaining flake8 warnings and errors --- examples/mpi_augment_learn.py | 2 +- examples/simple_augmentation.py | 17 +++++++++-------- plasma/__init__.py | 22 +++++++++++----------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/examples/mpi_augment_learn.py b/examples/mpi_augment_learn.py index 727d559b..d826bdfd 100644 --- a/examples/mpi_augment_learn.py +++ b/examples/mpi_augment_learn.py @@ -1,6 +1,6 @@ from plasma.models.mpi_runner import ( mpi_train, mpi_make_predictions_and_evaluate - ) +) from mpi4py import MPI from plasma.preprocessor.preprocess import guarantee_preprocessed from plasma.preprocessor.augment import Augmentator diff --git a/examples/simple_augmentation.py b/examples/simple_augmentation.py index 8be07b85..ea89e42f 100644 --- a/examples/simple_augmentation.py +++ b/examples/simple_augmentation.py @@ -1,6 +1,6 @@ from plasma.models.mpi_runner import ( - mpi_make_predictions_and_evaluate - ) + mpi_make_predictions, mpi_make_predictions_and_evaluate +) from mpi4py import MPI from plasma.preprocessor.preprocess import guarantee_preprocessed from plasma.preprocessor.augment import ByShotAugmentator @@ -115,7 +115,7 @@ def create_shot_list_tmp(original_shot, time_points, sigs=None): assert(new_shot.augmentation_fn is None) new_shot.augmentation_fn = partial( hide_signal_data, t=t, sigs_to_hide=sigs) - #new_shot.number = original_shot.number + # new_shot.number = original_shot.number shot_list_tmp.append(new_shot) return shot_list_tmp, t_range @@ -126,7 +126,7 @@ def get_importance_measure( custom_path, metric, time_points=10, - sig=None): + sigs=None): shot_list_tmp, t_range = create_shot_list_tmp( original_shot, time_points, sigs) y_prime, y_gold, disruptive = mpi_make_predictions( @@ -138,8 +138,8 @@ def get_importance_measure( def difference_metric(y_prime, y_prime_orig): idx = np.argmax(y_prime_orig) - return (np.max(y_prime_orig) - y_prime[idx]) / \ - (np.max(y_prime_orig) - np.min(y_prime_orig)) + return ((np.max(y_prime_orig) - y_prime[idx]) + / (np.max(y_prime_orig) - np.min(y_prime_orig))) def get_importance_measure_given_y_prime(y_prime, metric): @@ -176,8 +176,9 @@ def get_importance_measure_given_y_prime(y_prime, metric): # for sigs_to_hide in [[s] for s in use_signals[:-3]] + # [use_signals[-3:-1]] + [use_signals[-1]]: -for sigs_to_hide in [[s] for s in use_signals[:-3]] + [[s] - for s in use_signals[-3:-1]] + [use_signals[-3:-1]]: # + [use_signals[-1]]: +for sigs_to_hide in ([[s] for s in use_signals[:-3]] + + [[s] for s in use_signals[-3:-1]] + + [use_signals[-3:-1]]): for shot in shot_list_test: shot.augmentation_fn = partial( hide_signal_data, t=0, sigs_to_hide=sigs_to_hide) diff --git a/plasma/__init__.py b/plasma/__init__.py index 23d79fd9..0e21193f 100644 --- a/plasma/__init__.py +++ b/plasma/__init__.py @@ -1,15 +1,15 @@ -#from plasma.conf import * -#from plasma.jet_signals import * +# from plasma.conf import * +# from plasma.jet_signals import * -#from plasma.model.builder import * -#from plasma.model.runner import * -#from plasma.model.targets import * +# from plasma.model.builder import * +# from plasma.model.runner import * +# from plasma.model.targets import * -#from plasma.preprocessor.load import * -#from plasma.preprocessor.normalize import * -#from plasma.preprocessor.preprocess import * +# from plasma.preprocessor.load import * +# from plasma.preprocessor.normalize import * +# from plasma.preprocessor.preprocess import * -#from plasma.primitives.shots import * +# from plasma.primitives.shots import * -#from plasma.utils.preprocessing import * -#from plasma.utils.performance_analysis_utils import * +# from plasma.utils.preprocessing import * +# from plasma.utils.performance_analysis_utils import * From 946449be56ad368acde807a9b2c790b93c002f3f Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 26 Sep 2019 09:56:17 -0500 Subject: [PATCH 566/744] Add PEP 8 style violation to test Travis CI build message --- plasma/preprocessor/preprocess.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 17a5699f..4b0e0b69 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -21,7 +21,6 @@ from plasma.primitives.shots import ShotList from plasma.utils.downloading import mkdirdepth - class Preprocessor(object): def __init__(self, conf): From 0c2dbd6154ed6da0560a03529bbab1e4affe1530 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 26 Sep 2019 10:10:01 -0500 Subject: [PATCH 567/744] Try fixing missing Slack notifications from Travis CI Also add diagnostic/progress message for flake8 that is only posted when flake8 returns 0 (no style warnings or errors) --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a983ca04..d16ec7c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ matrix: - stage: python linter env: install: pip install flake8 - script: python -m flake8 + script: python -m flake8 && echo "Finished linting Python files with flake8" addons: apt: @@ -55,6 +55,7 @@ notifications: on_success: change on_failure: always slack: - secure: NBjGYpIF2VO/GvhbC7XVPIfi0WLGFEuVhi51UbZjfHg4IOv1UuCF0fImi8GN2UZZBFRnZcbtPVffZnyMUyJI0Krw0M1ropkjA4YDaJx1JUGnYuQLxNmX+jbQmN61Usjg5MQOgcRnAn1bdMN1ttWInqkKejpV5buCjZbt8SZbDePfXz4U3No68P/pRsDTVXSy0xLTtRacuEITJjwxfjp6phbmR3qs127MZMRbVYDC2HA6KsoJW6YSKF1vFyHqnFMl7GSavxYw/XQpqFLJkGKXfnNgPZV6qAbVk5+bzyytAbbwLGvgbuFpnJsGPvAyebV8wVYaIPg7OeK+Sm1A3q0jt774NnqFp2AZ+pSKrxbxIkygDM0zoWLm4i3pt6ToJ6dKcqSbCKbELnSY5NphcyYuiJ8uhLVpAR0Y+vp+fOvhb8td/nH2AWkxFpp6xwOHPXvtodBsyPMkiaeKoVElYBfbfOhDSYH2KafADECTX75S63A9KleeNZh0DSImfFdQPaN3GFLEL8Z9UFABzTkM9eYKP9pyEP82Wh/JGDaqbARazEgNzy8rwghomsEguV247XHdOx32PSd0att541gsRFZ5uyMuVFKzI0jiLijekibY2I1c5b6dDeuK4O8uBiq4FTS+bM55Rj4Job01kdxSCKw3RwOh0amzITRTQvEWKpTAekg= + rooms: + - secure: "NBjGYpIF2VO/GvhbC7XVPIfi0WLGFEuVhi51UbZjfHg4IOv1UuCF0fImi8GN2UZZBFRnZcbtPVffZnyMUyJI0Krw0M1ropkjA4YDaJx1JUGnYuQLxNmX+jbQmN61Usjg5MQOgcRnAn1bdMN1ttWInqkKejpV5buCjZbt8SZbDePfXz4U3No68P/pRsDTVXSy0xLTtRacuEITJjwxfjp6phbmR3qs127MZMRbVYDC2HA6KsoJW6YSKF1vFyHqnFMl7GSavxYw/XQpqFLJkGKXfnNgPZV6qAbVk5+bzyytAbbwLGvgbuFpnJsGPvAyebV8wVYaIPg7OeK+Sm1A3q0jt774NnqFp2AZ+pSKrxbxIkygDM0zoWLm4i3pt6ToJ6dKcqSbCKbELnSY5NphcyYuiJ8uhLVpAR0Y+vp+fOvhb8td/nH2AWkxFpp6xwOHPXvtodBsyPMkiaeKoVElYBfbfOhDSYH2KafADECTX75S63A9KleeNZh0DSImfFdQPaN3GFLEL8Z9UFABzTkM9eYKP9pyEP82Wh/JGDaqbARazEgNzy8rwghomsEguV247XHdOx32PSd0att541gsRFZ5uyMuVFKzI0jiLijekibY2I1c5b6dDeuK4O8uBiq4FTS+bM55Rj4Job01kdxSCKw3RwOh0amzITRTQvEWKpTAekg=" on_success: always on_failure: always From 038012d96319cb15060add584b1e7e50c1b14c32 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 26 Sep 2019 10:14:20 -0500 Subject: [PATCH 568/744] Travis CI app in Slack is working again--- fix intentional style error --- plasma/preprocessor/preprocess.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 4b0e0b69..17a5699f 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -21,6 +21,7 @@ from plasma.primitives.shots import ShotList from plasma.utils.downloading import mkdirdepth + class Preprocessor(object): def __init__(self, conf): From a00bc965230d72e3bde5763f115e5b75d49639ec Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 26 Sep 2019 10:15:26 -0500 Subject: [PATCH 569/744] Update Travis CI shield on README.md Migrated repo from open-source travis-ci.org to unified travis-ci.com via Travis CI's beta migration tool. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ec11e38..8b8a9eca 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FRNN -[![Build Status](https://travis-ci.org/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.org/PPPLDeepLearning/plasma-python) +[![Build Status](https://travis-ci.com/PPPLDeepLearning/plasma-python.svg?branch=master)](https://travis-ci.com/PPPLDeepLearning/plasma-python) [![Build Status](https://jenkins.princeton.edu/buildStatus/icon?job=FRNM/PPPL)](https://jenkins.princeton.edu/job/FRNM/job/PPPL/) ## Package description From eed497597e8d4b3b34c2ac1cc950f35872f7fe44 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 3 Oct 2019 17:17:27 -0500 Subject: [PATCH 570/744] Address PyYAML deprecation warning with yaml.load() default See https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation about the CVE about RCE (similar to Pickle) --- examples/submit_batch_job.py | 4 ++-- examples/tune_hyperparams.py | 2 +- jenkins-ci/run_jenkins.py | 2 +- plasma/conf.py | 1 + plasma/conf_parser.py | 2 +- plasma/primitives/hyperparameters.py | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/submit_batch_job.py b/examples/submit_batch_job.py index facc2214..789b6751 100644 --- a/examples/submit_batch_job.py +++ b/examples/submit_batch_job.py @@ -31,7 +31,7 @@ def copy_conf_file( pathdst = os.path.join(save_path, conf_name) with open(pathsrc, 'r') as yaml_file: - conf = yaml.load(yaml_file) + conf = yaml.load(yaml_file, Loader=yaml.SafeLoader) # make sure all files like checkpoints and normalization are done locally conf['training']['hyperparam_tuning'] = True with open(pathdst, 'w') as outfile: @@ -40,7 +40,7 @@ def copy_conf_file( def get_conf(template_path, conf_name): with open(os.path.join(template_path, conf_name), 'r') as yaml_file: - conf = yaml.load(yaml_file) + conf = yaml.load(yaml_file, Loader=yaml.SafeLoader) return conf diff --git a/examples/tune_hyperparams.py b/examples/tune_hyperparams.py index 6d8f5d8f..7c6d7d34 100644 --- a/examples/tune_hyperparams.py +++ b/examples/tune_hyperparams.py @@ -108,7 +108,7 @@ def generate_conf_file( conf_name="conf.yaml"): assert(template_path != save_path) with open(os.path.join(template_path, conf_name), 'r') as yaml_file: - conf = yaml.load(yaml_file) + conf = yaml.load(yaml_file, Loader=yaml.SafeLoader) for tunable in tunables: tunable.assign_to_conf(conf, save_path) # rely on early stopping to terminate training diff --git a/jenkins-ci/run_jenkins.py b/jenkins-ci/run_jenkins.py index 282b3900..b5ae4714 100644 --- a/jenkins-ci/run_jenkins.py +++ b/jenkins-ci/run_jenkins.py @@ -23,7 +23,7 @@ def generate_conf_file( conf_name="conf.yaml"): assert(template_path != save_path) with open(os.path.join(template_path, conf_name), 'r') as yaml_file: - conf = yaml.load(yaml_file) + conf = yaml.load(yaml_file, Loader=yaml.SafeLoader) conf['training']['num_epochs'] = 2 conf['paths']['data'] = test_configuration[1] if test_configuration[1] == "Python3": diff --git a/plasma/conf.py b/plasma/conf.py index 84b6ce49..69aafd88 100644 --- a/plasma/conf.py +++ b/plasma/conf.py @@ -2,6 +2,7 @@ import os import errno +# TODO(KGF): this conf.py feels like an unnecessary level of indirection if os.path.exists(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../examples/conf.yaml')): conf = parameters(os.path.join(os.path.abspath(os.path.dirname(__file__)), diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 050d48cc..f94068ae 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -16,7 +16,7 @@ def parameters(input_file): TTDTarget, TTDInvTarget, TTDLinearTarget ) with open(input_file, 'r') as yaml_file: - params = yaml.load(yaml_file) + params = yaml.load(yaml_file, Loader=yaml.SafeLoader) params['user_name'] = getpass.getuser() output_path = params['fs_path'] + "/" + params['user_name'] diff --git a/plasma/primitives/hyperparameters.py b/plasma/primitives/hyperparameters.py index 9bed2a78..10808654 100644 --- a/plasma/primitives/hyperparameters.py +++ b/plasma/primitives/hyperparameters.py @@ -105,7 +105,7 @@ def __init__(self, path, conf_name="conf.yaml"): self.raw_logs_path = path[:-1] + ".out" self.changed_path = os.path.join(path, "changed_params.out") with open(os.path.join(self.path, conf_name), 'r') as yaml_file: - conf = yaml.load(yaml_file) + conf = yaml.load(yaml_file, Loader=yaml.SafeLoader) self.name_to_monitor = conf['callbacks']['monitor'] self.load_data() self.get_changed() From 6563d669ec5c8626c0a0587857361b104e94b977 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 3 Oct 2019 17:19:56 -0500 Subject: [PATCH 571/744] Ignore 2x more types of local Emacs config files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d7ce66f1..139f148f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Emacs *~ \#*\# +.auctex-auto/ +.dir-locals.el # Generated by test plot_*.html From 1b88161c2b76d119aa50ef74538c0846a64ae1d4 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 4 Oct 2019 16:19:17 -0500 Subject: [PATCH 572/744] Explicitly add allow_pickle=False (default) to all np.load() calls Will change to True only for the calls that may possibly load trusted Pickles, not only generic .npz files. https://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html Changed in version 1.16.3: Made default False in response to CVE-2019-6446. Reported by @Wouter-VDP via Slack on 2019-08-08. --- examples/notebooks/Signal Influence.ipynb | 66 +++++++---------------- plasma/conf_parser.py | 21 ++++---- plasma/models/mpi_runner.py | 2 +- plasma/models/shallow_runner.py | 2 +- plasma/preprocessor/normalize.py | 6 +-- plasma/preprocessor/preprocess.py | 17 +++--- plasma/primitives/shots.py | 2 +- plasma/utils/performance.py | 3 +- 8 files changed, 45 insertions(+), 74 deletions(-) diff --git a/examples/notebooks/Signal Influence.ipynb b/examples/notebooks/Signal Influence.ipynb index 6e865638..f5f70897 100644 --- a/examples/notebooks/Signal Influence.ipynb +++ b/examples/notebooks/Signal Influence.ipynb @@ -26,20 +26,16 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ - "dat = np.load('./temp_data/signal_influence/signal_influence_results_155191_2017-12-01-01-42-33.npz')" + "dat = np.load('./temp_data/signal_influence/signal_influence_results_155191_2017-12-01-01-42-33.npz', allow_pickle=False)" ] }, { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -60,9 +56,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -102,9 +96,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -139,9 +131,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -211,9 +201,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -315,15 +303,13 @@ }, "outputs": [], "source": [ - "dat = np.load('./temp_data/signal_influence/signal_influence_results_2017-11-30-20-13-39.npz')" + "dat = np.load('./temp_data/signal_influence/signal_influence_results_2017-11-30-20-13-39.npz', allow_pickle=False)" ] }, { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "y_gold = dat['y_gold']\n", @@ -333,9 +319,7 @@ { "cell_type": "code", "execution_count": 97, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -362,9 +346,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "t_range = np.linspace(0,len(y_gold[0]),10,dtype=np.int)" @@ -373,9 +355,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -395,9 +375,7 @@ { "cell_type": "code", "execution_count": 95, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "def difference_metric(y_prime,y_prime_orig):\n", @@ -422,9 +400,7 @@ { "cell_type": "code", "execution_count": 96, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "differences = get_importance_measure(y_prime,difference_metric)" @@ -433,9 +409,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -464,21 +438,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda root]", + "display_name": "Python 3", "language": "python", - "name": "conda-root-py" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.7.4" }, "latex_envs": { "LaTeX_envs_menu_present": true, diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index f94068ae..2e20a1a0 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -23,14 +23,15 @@ def parameters(input_file): base_path = output_path params['paths']['base_path'] = base_path - params['paths']['signal_prepath'] = base_path + \ - params['paths']['signal_prepath'] - params['paths']['shot_list_dir'] = base_path + \ - params['paths']['shot_list_dir'] + params['paths']['signal_prepath'] = ( + base_path + params['paths']['signal_prepath']) + params['paths']['shot_list_dir'] = ( + base_path + params['paths']['shot_list_dir']) params['paths']['output_path'] = output_path h = get_unique_signal_hash(sig.all_signals.values()) - params['paths']['global_normalizer_path'] = output_path + \ - '/normalization/normalization_signal_group_{}.npz'.format(h) + params['paths']['global_normalizer_path'] = ( + output_path + + '/normalization/normalization_signal_group_{}.npz'.format(h)) if params['training']['hyperparam_tuning']: # params['paths']['saved_shotlist_path'] = # './normalization/shot_lists.npz' @@ -44,12 +45,12 @@ def parameters(input_file): # '/normalization/shot_lists.npz' params['paths']['normalizer_path'] = ( params['paths']['global_normalizer_path']) - params['paths']['model_save_path'] = ( - output_path + '/model_checkpoints/') + params['paths']['model_save_path'] = (output_path + + '/model_checkpoints/') params['paths']['csvlog_save_path'] = output_path + '/csv_logs/' params['paths']['results_prepath'] = output_path + '/results/' - params['paths']['tensorboard_save_path'] = output_path + \ - params['paths']['tensorboard_save_path'] + params['paths']['tensorboard_save_path'] = ( + output_path + params['paths']['tensorboard_save_path']) params['paths']['saved_shotlist_path'] = ( params['paths']['base_path'] + '/processed_shotlists/' + params['paths']['data'] diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index e092d8b7..e7664131 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -670,7 +670,7 @@ def save_shotlists(conf, shot_list_train, shot_list_validate, shot_list_test): def load_shotlists(conf): path = get_shot_list_path(conf) - data = np.load(path) + data = np.load(path, allow_pickle=False) shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index c4fa1552..b5dabd0e 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -137,7 +137,7 @@ def process(self, shot): # print(X.shape, Y.shape) else: try: - dat = np.load(save_path) + dat = np.load(save_path, allow_pickle=False) # X, Y, disr = dat["X"], dat["Y"], dat["disr"][()] X = dat["X"] except BaseException: diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 3f181d0d..6a89c023 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -185,7 +185,7 @@ def previously_saved_stats(self): if not os.path.isfile(self.path): return False, set([]) else: - dat = np.load(self.path, encoding="latin1") + dat = np.load(self.path, encoding="latin1", allow_pickle=False) machines = dat['machines'][()] ret = all( [m in machines for m in self.conf['paths']['all_machines']]) @@ -292,7 +292,7 @@ def save_stats(self): def load_stats(self): assert self.previously_saved_stats()[0], "stats not saved before" - dat = np.load(self.path, encoding="latin1") + dat = np.load(self.path, encoding="latin1", allow_pickle=False) self.means = dat['means'][()] self.stds = dat['stds'][()] self.num_processed = dat['num_processed'][()] @@ -448,7 +448,7 @@ def save_stats(self): def load_stats(self): assert(self.previously_saved_stats()[0]) - dat = np.load(self.path, encoding="latin1") + dat = np.load(self.path, encoding="latin1", allow_pickle=False) self.minimums = dat['minimums'][()] self.maximums = dat['maximums'][()] self.num_processed = dat['num_processed'][()] diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 17a5699f..1d93775f 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -149,7 +149,7 @@ def get_shot_list_path(self): def load_shotlists(self): path = self.get_shot_list_path() - data = np.load(path, encoding="latin1") + data = np.load(path, encoding="latin1", allow_pickle=False) shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] @@ -159,18 +159,13 @@ def load_shotlists(self): return ShotList(shot_list_train), ShotList( shot_list_validate), ShotList(shot_list_test) - def save_shotlists( - self, - shot_list_train, - shot_list_validate, - shot_list_test): + def save_shotlists(self, shot_list_train, shot_list_validate, + shot_list_test): path = self.get_shot_list_path() mkdirdepth(path) - np.savez( - path, - shot_list_train=shot_list_train, - shot_list_validate=shot_list_validate, - shot_list_test=shot_list_test) + np.savez(path, shot_list_train=shot_list_train, + shot_list_validate=shot_list_validate, + shot_list_test=shot_list_test) def apply_bleed_in(conf, shot_list_train, shot_list_validate, shot_list_test): diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index 3b96e9fc..ea4ae29c 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -498,7 +498,7 @@ def get_save_path(self, prepath): def restore(self, prepath, light=False): assert self.previously_saved(prepath), 'shot was never saved' save_path = self.get_save_path(prepath) - dat = np.load(save_path, encoding="latin1") + dat = np.load(save_path, encoding="latin1", allow_pickle=False) self.valid = dat['valid'][()] self.is_disruptive = dat['is_disruptive'][()] diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 5df6a108..80c3c7f5 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -364,7 +364,8 @@ def get_accuracy_and_fp_rate_from_stats( def load_ith_file(self): results_files = os.listdir(self.results_dir) print(results_files) - dat = np.load(self.results_dir + results_files[self.i]) + dat = np.load(self.results_dir + results_files[self.i], + allow_pickle=False) print("Loading results file {}".format( self.results_dir + results_files[self.i])) From cc71f3eef914e28e5253f97ead242b43c07bf9da Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 4 Oct 2019 19:44:42 -0500 Subject: [PATCH 573/744] Clean up style of preprocess.py --- plasma/preprocessor/preprocess.py | 59 ++++++++++++------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 1d93775f..66fc804f 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -29,13 +29,9 @@ def __init__(self, conf): def clean_shot_lists(self): shot_list_dir = self.conf['paths']['shot_list_dir'] - paths = [ - os.path.join( - shot_list_dir, - f) for f in listdir(shot_list_dir) if os.path.isfile( - os.path.join( - shot_list_dir, - f))] + paths = [os.path.join(shot_list_dir, f) for f in + listdir(shot_list_dir) if + os.path.isfile(os.path.join(shot_list_dir, f))] for path in paths: self.clean_shot_list(path) @@ -87,16 +83,15 @@ def preprocess_from_files(self, shot_files, use_shots): # empty used_shots = ShotList() - use_cores = max(1, mp.cpu_count()-2) + # TODO(KGF): generalize the follwowing line to perform well on + # architecutres other than CPUs, e.g. KNLs + # min( , max(1,mp.cpu_count()-2) ) + use_cores = max(1, mp.cpu_count() - 2) pool = mp.Pool(use_cores) - print('running in parallel on {} processes'.format(pool._processes)) + print('Running in parallel on {} processes'.format(pool._processes)) start_time = time.time() - for ( - i, - shot) in enumerate( - pool.imap_unordered( - self.preprocess_single_file, - shot_list_picked)): + for (i, shot) in enumerate(pool.imap_unordered( + self.preprocess_single_file, shot_list_picked)): # for (i,shot) in # enumerate(map(self.preprocess_single_file,shot_list_picked)): sys.stdout.write('\r{}/{}'.format(i, len(shot_list_picked))) @@ -105,19 +100,15 @@ def preprocess_from_files(self, shot_files, use_shots): pool.close() pool.join() print('Finished Preprocessing {} files in {} seconds'.format( - len(shot_list_picked), time.time()-start_time)) - print( - 'Omitted {} shots of {} total.'.format( - len(shot_list_picked) - - len(used_shots), - len(shot_list_picked))) + len(shot_list_picked), time.time() - start_time)) + print('Omitted {} shots of {} total.'.format( + len(shot_list_picked) - len(used_shots), len(shot_list_picked))) print('{}/{} disruptive shots'.format(used_shots.num_disruptive(), len(used_shots))) if len(used_shots) == 0: - print( - "WARNING: All shots were omitted, please ensure raw data " - " is complete and available at {}.".format( - self.conf['paths']['signal_prepath'])) + print("WARNING: All shots were omitted, please ensure raw data " + " is complete and available at {}.".format( + self.conf['paths']['signal_prepath'])) return used_shots def preprocess_single_file(self, shot): @@ -127,7 +118,6 @@ def preprocess_single_file(self, shot): if recompute or not shot.previously_saved(processed_prepath): shot.preprocess(self.conf) shot.save(processed_prepath) - else: try: shot.restore(processed_prepath, light=True) @@ -135,9 +125,8 @@ def preprocess_single_file(self, shot): except BaseException: shot.preprocess(self.conf) shot.save(processed_prepath) - sys.stdout.write( - '\r{} exists but corrupted, resaved.'.format( - shot.number)) + sys.stdout.write('\r{} exists but corrupted, resaved.'.format( + shot.number)) shot.make_light() return shot @@ -262,14 +251,10 @@ def guarantee_preprocessed(conf): pp.save_shotlists(shot_list_train, shot_list_validate, shot_list_test) shot_list_train, shot_list_validate, shot_list_test = apply_bleed_in( conf, shot_list_train, shot_list_validate, shot_list_test) - print( - 'validate: {} shots, {} disruptive'.format( - len(shot_list_validate), - shot_list_validate.num_disruptive())) - print( - 'training: {} shots, {} disruptive'.format( - len(shot_list_train), - shot_list_train.num_disruptive())) + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format( + len(shot_list_train), shot_list_train.num_disruptive())) print('testing: {} shots, {} disruptive'.format( len(shot_list_test), shot_list_test.num_disruptive())) print("...done") From 67c5622b3c7c0e0547da9efed93f23af4677fda8 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 8 Oct 2019 19:33:02 -0400 Subject: [PATCH 574/744] Start switching np.load(...,allow_pickle=True) as needed Even though these 2x calls load .npz files, they contain NumPy object arrays of ShotList class objects that are implicitly serialized by Pickle via np.savez() calls. Also, fix bug with sorted(ShotList) being converted to a List instead of a ShotList. --- plasma/preprocessor/preprocess.py | 5 +++-- plasma/primitives/shots.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 66fc804f..9861f4a4 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -138,7 +138,7 @@ def get_shot_list_path(self): def load_shotlists(self): path = self.get_shot_list_path() - data = np.load(path, encoding="latin1", allow_pickle=False) + data = np.load(path, encoding="latin1", allow_pickle=True) shot_list_train = data['shot_list_train'][()] shot_list_validate = data['shot_list_validate'][()] shot_list_test = data['shot_list_test'][()] @@ -239,7 +239,8 @@ def guarantee_preprocessed(conf): else: print("preprocessing all shots", end='') pp.clean_shot_lists() - shot_list = sorted(pp.preprocess_all()) + shot_list = pp.preprocess_all() + shot_list.sort() shot_list_train, shot_list_test = shot_list.split_train_test(conf) # num_shots = len(shot_list_train) + len(shot_list_test) validation_frac = conf['training']['validation_frac'] diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index ea4ae29c..cafb76ed 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -498,7 +498,7 @@ def get_save_path(self, prepath): def restore(self, prepath, light=False): assert self.previously_saved(prepath), 'shot was never saved' save_path = self.get_save_path(prepath) - dat = np.load(save_path, encoding="latin1", allow_pickle=False) + dat = np.load(save_path, encoding="latin1", allow_pickle=True) self.valid = dat['valid'][()] self.is_disruptive = dat['is_disruptive'][()] From aae1536fd967c94d3b95ef170e5af4fc60fb62c8 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 8 Oct 2019 19:38:48 -0400 Subject: [PATCH 575/744] Re-order matplotlib.use() calls (before plt import) Addressing warning: This call to matplotlib.use() has no effect because the backend has already been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot, or matplotlib.backends is imported for the first time. --- plasma/models/runner.py | 2 +- plasma/models/shallow_runner.py | 2 +- plasma/utils/performance.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 2eb0b58b..d579d9c7 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -10,9 +10,9 @@ from hyperopt import hp, STATUS_OK import numpy as np import sys -import matplotlib.pyplot as plt import matplotlib matplotlib.use('Agg') +import matplotlib.pyplot as plt # if sys.version_info[0] < 3: # from itertools import imap diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index b5dabd0e..cc7ea2e6 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -20,9 +20,9 @@ import datetime import time import numpy as np -# import matplotlib.pyplot as plt import matplotlib matplotlib.use('Agg') +# import matplotlib.pyplot as plt # import sys # if sys.version_info[0] < 3: diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 80c3c7f5..efe26b50 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -5,10 +5,10 @@ import numpy as np from pprint import pprint import os -import matplotlib.pyplot as plt -from matplotlib import rc import matplotlib matplotlib.use('Agg') # for machines that don't have a display +import matplotlib.pyplot as plt +from matplotlib import rc rc('font', **{'family': 'serif', 'sans-serif': ['Times']}) rc('text', usetex=True) From 52d497190747911d2c7607c685cec4eaf8180154 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 8 Oct 2019 18:45:04 -0500 Subject: [PATCH 576/744] Suppress flake8 warnings from the change in the parent commit --- plasma/models/runner.py | 2 +- plasma/utils/performance.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index d579d9c7..5d09b33e 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -12,7 +12,7 @@ import sys import matplotlib matplotlib.use('Agg') -import matplotlib.pyplot as plt +import matplotlib.pyplot as plt # noqa # if sys.version_info[0] < 3: # from itertools import imap diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index efe26b50..ff6acef7 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -7,8 +7,8 @@ import os import matplotlib matplotlib.use('Agg') # for machines that don't have a display -import matplotlib.pyplot as plt -from matplotlib import rc +import matplotlib.pyplot as plt # noqa +from matplotlib import rc # noqa rc('font', **{'family': 'serif', 'sans-serif': ['Times']}) rc('text', usetex=True) From f34c9b11eccc79e23bc12b0a5b22fa7701152810 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 9 Oct 2019 10:47:59 -0400 Subject: [PATCH 577/744] Let normalize.py load pickles with np.load() --- plasma/preprocessor/normalize.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 6a89c023..eba693a0 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -185,7 +185,7 @@ def previously_saved_stats(self): if not os.path.isfile(self.path): return False, set([]) else: - dat = np.load(self.path, encoding="latin1", allow_pickle=False) + dat = np.load(self.path, encoding="latin1", allow_pickle=True) machines = dat['machines'][()] ret = all( [m in machines for m in self.conf['paths']['all_machines']]) @@ -292,7 +292,7 @@ def save_stats(self): def load_stats(self): assert self.previously_saved_stats()[0], "stats not saved before" - dat = np.load(self.path, encoding="latin1", allow_pickle=False) + dat = np.load(self.path, encoding="latin1", allow_pickle=True) self.means = dat['means'][()] self.stds = dat['stds'][()] self.num_processed = dat['num_processed'][()] @@ -448,7 +448,7 @@ def save_stats(self): def load_stats(self): assert(self.previously_saved_stats()[0]) - dat = np.load(self.path, encoding="latin1", allow_pickle=False) + dat = np.load(self.path, encoding="latin1", allow_pickle=True) self.minimums = dat['minimums'][()] self.maximums = dat['maximums'][()] self.num_processed = dat['num_processed'][()] From dd2c8a635b631062b2363e49d29a2af7011f71d0 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 9 Oct 2019 17:27:40 -0500 Subject: [PATCH 578/744] Fix flake8 style warnings for all files except torch_runner.py --- plasma/conf_parser.py | 16 ++++++++-------- plasma/models/builder.py | 4 +++- plasma/models/mpi_runner.py | 4 ++-- plasma/models/shallow_runner.py | 1 - plasma/preprocessor/normalize.py | 9 +++++---- plasma/utils/downloading.py | 15 ++++++++++----- plasma/utils/performance.py | 16 +++++----------- 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 2a1b1972..6bbe9bb3 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -96,10 +96,10 @@ def parameters(input_file): sig.jet, params['paths']['shot_list_dir'], ['ILW_unint_late.txt', 'ILW_clear_late.txt'], 'Late jet iter like wall data') - jet_iterlike_wall_full = ShotListFiles( - sig.jet, params['paths']['shot_list_dir'], - ['ILW_unint_full.txt', 'ILW_clear_full.txt'], - 'Full jet iter like wall data') + # jet_iterlike_wall_full = ShotListFiles( + # sig.jet, params['paths']['shot_list_dir'], + # ['ILW_unint_full.txt', 'ILW_clear_full.txt'], + # 'Full jet iter like wall data') jenkins_jet_carbon_wall = ShotListFiles( sig.jet, params['paths']['shot_list_dir'], @@ -169,12 +169,12 @@ def parameters(input_file): params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = { - 'etemp_profile': etemp_profile} + 'etemp_profile': sig.etemp_profile} elif params['paths']['data'] == 'jet_data_dens_profile': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [jet_iterlike_wall] params['paths']['use_signals_dict'] = { - 'edens_profile': edens_profile} + 'edens_profile': sig.edens_profile} elif params['paths']['data'] == 'jet_carbon_data': params['paths']['shot_files'] = [jet_carbon_wall] params['paths']['shot_files_test'] = [] @@ -302,13 +302,13 @@ def parameters(input_file): params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = { - 'etemp_profile': etemp_profile} # fully_defined_signals_0D + 'etemp_profile': sig.etemp_profile} # fully_defined_signals_0D elif params['paths']['data'] == 'd3d_data_dens_profile': # jet data but with fully defined signals params['paths']['shot_files'] = [d3d_full] params['paths']['shot_files_test'] = [] params['paths']['use_signals_dict'] = { - 'edens_profile': edens_profile} # fully_defined_signals_0D + 'edens_profile': sig.edens_profile} # fully_defined_signals_0D # cross-machine elif params['paths']['data'] == 'jet_to_d3d_data': diff --git a/plasma/models/builder.py b/plasma/models/builder.py index f7782362..dc49e0ef 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -82,6 +82,7 @@ def build_model(self, predict, custom_batch_size=None): conf = self.conf model_conf = conf['model'] rnn_size = model_conf['rnn_size'] + use_bidirectional = model_conf['use_bidirectional'] rnn_type = model_conf['rnn_type'] regularization = model_conf['regularization'] dense_regularization = model_conf['dense_regularization'] @@ -353,7 +354,8 @@ def get_all_saved_files(self): self.ensure_save_directory() unique_id = self.get_unique_id() path = self.conf['paths']['model_save_path'] - filenames = [name for name in os.listdir(path) if os.path.isfile(os.path.join(path, name))] + filenames = [name for name in os.listdir(path) + if os.path.isfile(os.path.join(path, name))] epochs = [] for file in filenames: curr_id, epoch = self.extract_id_and_epoch_from_filename(file) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 3760fb49..00bf4704 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -786,7 +786,7 @@ def mpi_make_predictions_and_evaluate_multiple_times(conf, shot_list, loader, def mpi_train(conf, shot_list_train, shot_list_validate, loader, - callbacks_list=None shot_list_test=None): + callbacks_list=None, shot_list_test=None): loader.set_inference_mode(False) conf['num_workers'] = comm.Get_size() @@ -949,7 +949,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, round(e)), epoch_logs) print_unique("end epoch {} 0".format(e)) - stop_training = comm.bcast(stop_training,root=0) + stop_training = comm.bcast(stop_training, root=0) print_unique("end epoch {} 1".format(e)) if stop_training: print("Stopping training due to early stopping") diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 63e0fe44..aaabd2b9 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -21,7 +21,6 @@ import time import numpy as np from copy import deepcopy -from keras.utils.generic_utils import Progbar # import matplotlib.pyplot as plt import matplotlib diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 47eb20e2..09f488a2 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -153,12 +153,13 @@ def cut_end_of_shot(self, shot): # only cut shots during training if not self.inference_mode and cut_shot_ends: T_min_warn = self.conf['data']['T_min_warn'] - if shot.ttd.shape[0] - T_min_warn <= max(self.conf['model']['length'],0): - print("not cutting shot since length of shot after cutting by T_min_warn would be shorter than RNN length") + if shot.ttd.shape[0] - T_min_warn <= max( + self.conf['model']['length'], 0): + print("not cutting shot; length of shot after cutting by ", + "T_min_warn would be shorter than RNN length") return for key in shot.signals_dict: - shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn, - :] + shot.signals_dict[key] = shot.signals_dict[key][:-T_min_warn,:] # noqa shot.ttd = shot.ttd[:-T_min_warn] # def apply_mask(self,shot): diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index d4d66463..27c9fb93 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -33,9 +33,11 @@ def general_object_hash(o): - """Makes a hash from a dictionary, list, tuple or set to any level, that contains - only other hashable types (including any lists, tuples, sets, and - dictionaries). Relies on dill for serialization""" + """ + Makes a hash from a dictionary, list, tuple or set to any level, that + contains only other hashable types (including any lists, tuples, sets, and + dictionaries). Relies on dill for serialization +""" if isinstance(o, (set, tuple, list)): return tuple([general_object_hash(e) for e in o]) @@ -51,9 +53,12 @@ def general_object_hash(o): def myhash(x): - return int(hashlib.md5((dill.dumps(x).decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + return int(hashlib.md5((dill.dumps(x).decode('unicode_escape')).encode( + 'utf-8')).hexdigest(), 16) # return int(hashlib.md5((dill.dumps(x))).hexdigest(),16) - # return int(hashlib.md5((dill.dumps(x))))#.decode('unicode_escape')).encode('utf-8')).hexdigest(),16) + # return + # int(hashlib.md5((dill.dumps(x))))#.decode('unicode_escape')).encode( + # 'utf-8')).hexdigest(),16) def get_missing_value_array(): diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 25ac904e..3dd52474 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -14,16 +14,8 @@ class PerformanceAnalyzer(): - def __init__( - self, - results_dir=None, - shots_dir=None, - i=0, - T_min_warn=None, - T_max_warn=None, - verbose=False, - pred_ttd=False, - conf=None): + def __init__(self, results_dir=None, shots_dir=None, i=0, T_min_warn=None, + T_max_warn=None, verbose=False, pred_ttd=False, conf=None): self.T_min_warn = T_min_warn self.T_max_warn = T_max_warn dt = conf['data']['dt'] @@ -35,7 +27,9 @@ def __init__( if T_max_warn is None: self.T_max_warn = T_max_warn_def if self.T_max_warn < self.T_min_warn: - print("T max warn is too small: need to increase artificially.") #computation of statistics is only correct if T_max_warn is larger than T_min_warn + # computation of statistics is only correct if T_max_warn is larger + # than T_min_warn + print("T max warn is too small: need to increase artificially.") self.T_max_warn = self.T_min_warn + 1 self.verbose = verbose self.results_dir = results_dir From 3f9ea6d02647af0963028f498e40b14ba322c1ef Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 9 Oct 2019 17:31:26 -0500 Subject: [PATCH 579/744] Apply autopep8 to torch_runner.py --- plasma/models/torch_runner.py | 399 +++++++++++++++++++++------------- 1 file changed, 253 insertions(+), 146 deletions(-) diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py index 3d7885ba..f85cae87 100644 --- a/plasma/models/torch_runner.py +++ b/plasma/models/torch_runner.py @@ -1,60 +1,87 @@ +import keras.callbacks as cbks +from keras.utils.generic_utils import Progbar +from torch.nn.utils import weight_norm +import torch.optim as opt +from torch.autograd import Variable +import torch.nn as nn +import torch +import hashlib +from plasma.utils.downloading import makedirs_process_safe +from plasma.utils.state_reset import reset_states +from plasma.utils.evaluation import * +from plasma.utils.performance import PerformanceAnalyzer +from plasma.models.loader import Loader, ProcessGenerator +from plasma.conf import conf +from sklearn.neural_network import MLPClassifier +from xgboost import XGBClassifier +import pathos.multiprocessing as mp +from functools import partial +import os +import datetime +import time +import sys +import numpy as np +import matplotlib.pyplot as plt from __future__ import print_function import matplotlib matplotlib.use('Agg') -import matplotlib.pyplot as plt -import numpy as np -import sys if sys.version_info[0] < 3: from itertools import imap -#leading to import errors: +# leading to import errors: #from hyperopt import hp, STATUS_OK #from hyperas.distributions import conditional -import time -import datetime -import os -from functools import partial -import pathos.multiprocessing as mp -from xgboost import XGBClassifier -from sklearn.neural_network import MLPClassifier - -from plasma.conf import conf -from plasma.models.loader import Loader, ProcessGenerator -from plasma.utils.performance import PerformanceAnalyzer -from plasma.utils.evaluation import * -from plasma.utils.state_reset import reset_states -from plasma.utils.downloading import makedirs_process_safe - -from keras.utils.generic_utils import Progbar - -import hashlib - -import torch -import torch.nn as nn -from torch.autograd import Variable -import torch.optim as opt -from torch.nn.utils import weight_norm model_filename = 'torch_model.pt' + class FTCN(nn.Module): - def __init__(self,n_scalars,n_profiles,profile_size,layer_sizes_spatial, - kernel_size_spatial,linear_size,output_size, - num_channels_tcn,kernel_size_temporal,dropout=0.1): + def __init__( + self, + n_scalars, + n_profiles, + profile_size, + layer_sizes_spatial, + kernel_size_spatial, + linear_size, + output_size, + num_channels_tcn, + kernel_size_temporal, + dropout=0.1): super(FTCN, self).__init__() - self.lin = InputBlock(n_scalars, n_profiles,profile_size, layer_sizes_spatial, kernel_size_spatial, linear_size, dropout) - self.input_layer = TimeDistributed(self.lin,batch_first=True) - self.tcn = TCN(linear_size, output_size, num_channels_tcn , kernel_size_temporal, dropout) - self.model = nn.Sequential(self.input_layer,self.tcn) - - def forward(self,x): + self.lin = InputBlock( + n_scalars, + n_profiles, + profile_size, + layer_sizes_spatial, + kernel_size_spatial, + linear_size, + dropout) + self.input_layer = TimeDistributed(self.lin, batch_first=True) + self.tcn = TCN( + linear_size, + output_size, + num_channels_tcn, + kernel_size_temporal, + dropout) + self.model = nn.Sequential(self.input_layer, self.tcn) + + def forward(self, x): return self.model(x) class InputBlock(nn.Module): - def __init__(self, n_scalars, n_profiles,profile_size, layer_sizes, kernel_size, linear_size, dropout=0.2): + def __init__( + self, + n_scalars, + n_profiles, + profile_size, + layer_sizes, + kernel_size, + linear_size, + dropout=0.2): super(InputBlock, self).__init__() self.pooling_size = 2 self.n_scalars = n_scalars @@ -66,25 +93,39 @@ def __init__(self, n_scalars, n_profiles,profile_size, layer_sizes, kernel_size, self.conv_output_size = 0 else: self.layers = [] - for (i,layer_size) in enumerate(layer_sizes): + for (i, layer_size) in enumerate(layer_sizes): if i == 0: input_size = n_profiles else: input_size = layer_sizes[i-1] - self.layers.append(weight_norm(nn.Conv1d(input_size, layer_size, kernel_size))) + self.layers.append( + weight_norm( + nn.Conv1d( + input_size, + layer_size, + kernel_size))) self.layers.append(nn.ReLU()) - self.conv_output_size = calculate_conv_output_size(self.conv_output_size,0,1,1,kernel_size) + self.conv_output_size = calculate_conv_output_size( + self.conv_output_size, 0, 1, 1, kernel_size) self.layers.append(nn.MaxPool1d(kernel_size=self.pooling_size)) - self.conv_output_size = calculate_conv_output_size(self.conv_output_size,0,1,self.pooling_size,self.pooling_size) + self.conv_output_size = calculate_conv_output_size( + self.conv_output_size, 0, 1, self.pooling_size, self.pooling_size) self.layers.append(nn.Dropout2d(dropout)) self.net = nn.Sequential(*self.layers) self.conv_output_size = self.conv_output_size*layer_sizes[-1] self.linear_layers = [] - - print("Final feature size = {}".format(self.n_scalars + self.conv_output_size)) - self.linear_layers.append(nn.Linear(self.conv_output_size+self.n_scalars,linear_size)) + + print( + "Final feature size = {}".format( + self.n_scalars + + self.conv_output_size)) + self.linear_layers.append( + nn.Linear( + self.conv_output_size + + self.n_scalars, + linear_size)) self.linear_layers.append(nn.ReLU()) - self.linear_layers.append(nn.Linear(linear_size,linear_size)) + self.linear_layers.append(nn.Linear(linear_size, linear_size)) self.linear_layers.append(nn.ReLU()) print("Final output size = {}".format(linear_size)) self.linear_net = nn.Sequential(*self.linear_layers) @@ -97,28 +138,30 @@ def __init__(self, n_scalars, n_profiles,profile_size, layer_sizes, kernel_size, def forward(self, x): if self.n_profiles == 0: - full_features = x#x_scalars + full_features = x # x_scalars else: if self.n_scalars == 0: x_profiles = x else: - x_scalars = x[:,:self.n_scalars] - x_profiles = x[:,self.n_scalars:] - x_profiles = x_profiles.contiguous().view(x.size(0),self.n_profiles,self.profile_size) - profile_features = self.net(x_profiles).view(x.size(0),-1) + x_scalars = x[:, :self.n_scalars] + x_profiles = x[:, self.n_scalars:] + x_profiles = x_profiles.contiguous().view( + x.size(0), self.n_profiles, self.profile_size) + profile_features = self.net(x_profiles).view(x.size(0), -1) if self.n_scalars == 0: full_features = profile_features else: - full_features = torch.cat([x_scalars,profile_features],dim=1) - + full_features = torch.cat([x_scalars, profile_features], dim=1) + out = self.linear_net(full_features) # out = self.net(x) # res = x if self.downsample is None else self.downsample(x) return out -def calculate_conv_output_size(L_in,padding,dilation,stride,kernel_size): - return int(np.floor((L_in + 2*padding - dilation*(kernel_size-1) - 1)*1.0/stride + 1)) +def calculate_conv_output_size(L_in, padding, dilation, stride, kernel_size): + return int(np.floor((L_in + 2*padding - dilation + * (kernel_size-1) - 1)*1.0/stride + 1)) class Chomp1d(nn.Module): @@ -131,23 +174,51 @@ def forward(self, x): class TemporalBlock(nn.Module): - def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2): + def __init__( + self, + n_inputs, + n_outputs, + kernel_size, + stride, + dilation, + padding, + dropout=0.2): super(TemporalBlock, self).__init__() - self.conv1 = weight_norm(nn.Conv1d(n_inputs, n_outputs, kernel_size, - stride=stride, padding=padding, dilation=dilation)) + self.conv1 = weight_norm( + nn.Conv1d( + n_inputs, + n_outputs, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation)) self.chomp1 = Chomp1d(padding) self.relu1 = nn.ReLU() self.dropout1 = nn.Dropout2d(dropout) - self.conv2 = weight_norm(nn.Conv1d(n_outputs, n_outputs, kernel_size, - stride=stride, padding=padding, dilation=dilation)) + self.conv2 = weight_norm( + nn.Conv1d( + n_outputs, + n_outputs, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation)) self.chomp2 = Chomp1d(padding) self.relu2 = nn.ReLU() self.dropout2 = nn.Dropout2d(dropout) - self.net = nn.Sequential(self.conv1, self.chomp1, self.relu1, self.dropout1, - self.conv2, self.chomp2, self.relu2, self.dropout2) - self.downsample = nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None + self.net = nn.Sequential( + self.conv1, + self.chomp1, + self.relu1, + self.dropout1, + self.conv2, + self.chomp2, + self.relu2, + self.dropout2) + self.downsample = nn.Conv1d( + n_inputs, n_outputs, 1) if n_inputs != n_outputs else None self.relu = nn.ReLU() self.init_weights() @@ -162,7 +233,9 @@ def forward(self, x): res = x if self.downsample is None else self.downsample(x) return self.relu(out + res) -#dimensions are batch,channels,length +# dimensions are batch,channels,length + + class TemporalConvNet(nn.Module): def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.2): super(TemporalConvNet, self).__init__() @@ -172,32 +245,45 @@ def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.2): dilation_size = 2 ** i in_channels = num_inputs if i == 0 else num_channels[i-1] out_channels = num_channels[i] - layers += [TemporalBlock(in_channels, out_channels, kernel_size, stride=1, dilation=dilation_size, - padding=(kernel_size-1) * dilation_size, dropout=dropout)] + layers += [TemporalBlock(in_channels, + out_channels, + kernel_size, + stride=1, + dilation=dilation_size, + padding=(kernel_size-1) * dilation_size, + dropout=dropout)] self.network = nn.Sequential(*layers) def forward(self, x): return self.network(x) - - + + class TCN(nn.Module): - def __init__(self, input_size, output_size, num_channels, kernel_size, dropout): + def __init__( + self, + input_size, + output_size, + num_channels, + kernel_size, + dropout): super(TCN, self).__init__() - self.tcn = TemporalConvNet(input_size, num_channels, kernel_size, dropout=dropout) + self.tcn = TemporalConvNet( + input_size, + num_channels, + kernel_size, + dropout=dropout) self.linear = nn.Linear(num_channels[-1], output_size) # self.sig = nn.Sigmoid() def forward(self, x): # x needs to have dimension (N, C, L) in order to be passed into CNN output = self.tcn(x.transpose(1, 2)).transpose(1, 2) - output = self.linear(output)#.transpose(1,2)).transpose(1,2) + output = self.linear(output) # .transpose(1,2)).transpose(1,2) return output # return self.sig(output) - - # def train(model,data_gen,lr=0.001,iters = 100): # log_step = int(round(iters*0.1)) # optimizer = opt.Adam(model.parameters(),lr = lr) @@ -206,7 +292,7 @@ def forward(self, x): # count = 0 # loss_fn = nn.MSELoss(size_average=False) # for i in range(iters): -# x_,y_,mask_ = data_gen() +# x_,y_,mask_ = data_gen() # # print(y) # x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) # # print(y) @@ -231,12 +317,6 @@ def forward(self, x): # count = 0 - - - - - - class TimeDistributed(nn.Module): def __init__(self, module, batch_first=False): super(TimeDistributed, self).__init__() @@ -249,22 +329,21 @@ def forward(self, x): return self.module(x) # Squash samples and timesteps into a single axis - x_reshape = x.contiguous().view(-1, x.size(-1)) # (samples * timesteps, input_size) + # (samples * timesteps, input_size) + x_reshape = x.contiguous().view(-1, x.size(-1)) y = self.module(x_reshape) # We have to reshape Y if self.batch_first: - y = y.contiguous().view(x.size(0), -1, y.size(-1)) # (samples, timesteps, output_size) + # (samples, timesteps, output_size) + y = y.contiguous().view(x.size(0), -1, y.size(-1)) else: - y = y.view(-1, x.size(1), y.size(-1)) # (timesteps, samples, output_size) + # (timesteps, samples, output_size) + y = y.view(-1, x.size(1), y.size(-1)) return y -import keras.callbacks as cbks - - - def build_torch_model(conf): dropout = conf['model']['dropout_prob'] @@ -277,25 +356,35 @@ def build_torch_model(conf): output_size = 1 # intermediate_dim = 15 - layer_sizes_spatial = [6,3,3]#[40,20,20] + layer_sizes_spatial = [6, 3, 3] # [40,20,20] kernel_size_spatial = 3 linear_size = 5 - num_channels_tcn = [10,5,3,3]#[3]*5 - kernel_size_temporal = 3 #3 - model = FTCN(n_scalars,n_profiles,profile_size,layer_sizes_spatial, - kernel_size_spatial,linear_size,output_size,num_channels_tcn, - kernel_size_temporal,dropout) + num_channels_tcn = [10, 5, 3, 3] # [3]*5 + kernel_size_temporal = 3 # 3 + model = FTCN( + n_scalars, + n_profiles, + profile_size, + layer_sizes_spatial, + kernel_size_spatial, + linear_size, + output_size, + num_channels_tcn, + kernel_size_temporal, + dropout) return model + def get_signal_dimensions(conf): - #make sure all 1D indices are contiguous in the end! + # make sure all 1D indices are contiguous in the end! use_signals = conf['paths']['use_signals'] n_scalars = 0 n_profiles = 0 profile_size = 0 - is_1D_region = use_signals[0].num_channels > 1#do we have any 1D indices? + # do we have any 1D indices? + is_1D_region = use_signals[0].num_channels > 1 for sig in use_signals: num_channels = sig.num_channels if num_channels > 1: @@ -303,23 +392,25 @@ def get_signal_dimensions(conf): n_profiles += 1 is_1D_region = True else: - assert(not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" + assert( + not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" assert(num_channels == 1) n_scalars += 1 is_1D_region = False - return n_scalars,n_profiles,profile_size + return n_scalars, n_profiles, profile_size -def apply_model_to_np(model,x): - # return model(Variable(torch.from_numpy(x).float()).unsqueeze(0)).squeeze(0).data.numpy() - return model(Variable(torch.from_numpy(x).float())).data.numpy() +def apply_model_to_np(model, x): + # return + # model(Variable(torch.from_numpy(x).float()).unsqueeze(0)).squeeze(0).data.numpy() + return model(Variable(torch.from_numpy(x).float())).data.numpy() -def make_predictions(conf,shot_list,loader,custom_path=None): +def make_predictions(conf, shot_list, loader, custom_path=None): generator = loader.inference_batch_generator_full_shot(shot_list) inference_model = build_torch_model(conf) - if custom_path == None: + if custom_path is None: model_path = get_model_path(conf) else: model_path = custom_path @@ -331,15 +422,15 @@ def make_predictions(conf,shot_list,loader,custom_path=None): disruptive = [] num_shots = len(shot_list) - pbar = Progbar(num_shots) + pbar = Progbar(num_shots) while True: - x,y,mask,disr,lengths,num_so_far,num_total = next(generator) + x, y, mask, disr, lengths, num_so_far, num_total = next(generator) #x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) - output = apply_model_to_np(inference_model,x) + output = apply_model_to_np(inference_model, x) for batch_idx in range(x.shape[0]): curr_length = lengths[batch_idx] - y_prime += [output[batch_idx,:curr_length,0]] - y_gold += [y[batch_idx,:curr_length,0]] + y_prime += [output[batch_idx, :curr_length, 0]] + y_gold += [y[batch_idx, :curr_length, 0]] disruptive += [disr[batch_idx]] pbar.add(1.0) if len(disruptive) >= num_shots: @@ -347,68 +438,84 @@ def make_predictions(conf,shot_list,loader,custom_path=None): y_gold = y_gold[:num_shots] disruptive = disruptive[:num_shots] break - return y_prime,y_gold,disruptive + return y_prime, y_gold, disruptive + -def make_predictions_and_evaluate_gpu(conf,shot_list,loader,custom_path = None): - y_prime,y_gold,disruptive = make_predictions(conf,shot_list,loader,custom_path) +def make_predictions_and_evaluate_gpu( + conf, shot_list, loader, custom_path=None): + y_prime, y_gold, disruptive = make_predictions( + conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) - roc_area = analyzer.get_roc_area(y_prime,y_gold,disruptive) - loss = get_loss_from_list(y_prime,y_gold,conf['data']['target']) - return y_prime,y_gold,disruptive,roc_area,loss + roc_area = analyzer.get_roc_area(y_prime, y_gold, disruptive) + loss = get_loss_from_list(y_prime, y_gold, conf['data']['target']) + return y_prime, y_gold, disruptive, roc_area, loss def get_model_path(conf): - return conf['paths']['model_save_path'] + 'torch/' + model_filename #save_prepath + model_filename + return conf['paths']['model_save_path'] + 'torch/' + \ + model_filename # save_prepath + model_filename -def train_epoch(model,data_gen,optimizer,loss_fn): +def train_epoch(model, data_gen, optimizer, loss_fn): loss = 0 total_loss = 0 num_so_far = 0 - x_,y_,mask_,num_so_far_start,num_total = next(data_gen) + x_, y_, mask_, num_so_far_start, num_total = next(data_gen) num_so_far = num_so_far_start step = 0 while True: - # print(y) - x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) + # print(y) + x, y, mask = Variable( + torch.from_numpy(x_).float()), Variable( + torch.from_numpy(y_).float()), Variable( + torch.from_numpy(mask_).byte()) # print(y) optimizer.zero_grad() # output = model(x.unsqueeze(0)).squeeze(0) - output = model(x)#.unsqueeze(0)).squeeze(0) - output_masked = torch.masked_select(output,mask) - y_masked = torch.masked_select(y,mask) + output = model(x) # .unsqueeze(0)).squeeze(0) + output_masked = torch.masked_select(output, mask) + y_masked = torch.masked_select(y, mask) # print(y.shape,output.shape) - loss = loss_fn(output_masked,y_masked) + loss = loss_fn(output_masked, y_masked) total_loss += loss.data[0] # count += output.size(0) # if args.clip > 0: - # torch.nn.utils.clip_grad_norm(model.parameters(), args.clip) + # torch.nn.utils.clip_grad_norm(model.parameters(), args.clip) loss.backward() optimizer.step() step += 1 - print("[{}] [{}/{}] loss: {:.3f}, ave_loss: {:.3f}".format(step,num_so_far-num_so_far_start,num_total,loss.data[0],total_loss/step)) + print("[{}] [{}/{}] loss: {:.3f}, ave_loss: {:.3f}".format(step, + num_so_far-num_so_far_start, num_total, loss.data[0], total_loss/step)) if num_so_far-num_so_far_start >= num_total: break - x_,y_,mask_,num_so_far,num_total = next(data_gen) - return step,loss.data[0],total_loss,num_so_far,1.0*num_so_far/num_total + x_, y_, mask_, num_so_far, num_total = next(data_gen) + return step, loss.data[0], total_loss, num_so_far, 1.0*num_so_far/num_total -def train(conf,shot_list_train,shot_list_validate,loader): +def train(conf, shot_list_train, shot_list_validate, loader): np.random.seed(1) #data_gen = ProcessGenerator(partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)()) - data_gen = partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)() - - print('validate: {} shots, {} disruptive'.format(len(shot_list_validate),shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format(len(shot_list_train),shot_list_train.num_disruptive())) + data_gen = partial( + loader.training_batch_generator_full_shot_partial_reset, + shot_list=shot_list_train)() + + print( + 'validate: {} shots, {} disruptive'.format( + len(shot_list_validate), + shot_list_validate.num_disruptive())) + print( + 'training: {} shots, {} disruptive'.format( + len(shot_list_train), + shot_list_train.num_disruptive())) loader.set_inference_mode(False) - train_model = build_torch_model(conf) + train_model = build_torch_model(conf) - #load the latest epoch we did. Returns -1 if none exist yet + # load the latest epoch we did. Returns -1 if none exist yet # e = specific_builder.load_model_weights(train_model) num_epochs = conf['training']['num_epochs'] @@ -433,15 +540,14 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('{} epochs left to go'.format(num_epochs - 1 - e)) - if conf['callbacks']['mode'] == 'max': best_so_far = -np.inf cmp_fn = max else: best_so_far = np.inf cmp_fn = min - optimizer = opt.Adam(train_model.parameters(),lr = lr) - scheduler = opt.lr_scheduler.ExponentialLR(optimizer,lr_decay) + optimizer = opt.Adam(train_model.parameters(), lr=lr) + scheduler = opt.lr_scheduler.ExponentialLR(optimizer, lr_decay) train_model.train() not_updated = 0 total_loss = 0 @@ -451,16 +557,18 @@ def train(conf,shot_list_train,shot_list_validate,loader): makedirs_process_safe(os.path.dirname(model_path)) while e < num_epochs-1: scheduler.step() - print('\nEpoch {}/{}'.format(e,num_epochs)) - (step,ave_loss,curr_loss,num_so_far,effective_epochs) = train_epoch(train_model,data_gen,optimizer,loss_fn) + print('\nEpoch {}/{}'.format(e, num_epochs)) + (step, ave_loss, curr_loss, num_so_far, effective_epochs) = train_epoch( + train_model, data_gen, optimizer, loss_fn) e = effective_epochs - loader.verbose=False #True during the first iteration - # if task_index == 0: - # specific_builder.save_model_weights(train_model,int(round(e))) - torch.save(train_model.state_dict(),model_path) - _,_,_,roc_area,loss = make_predictions_and_evaluate_gpu(conf,shot_list_validate,loader) + loader.verbose = False # True during the first iteration + # if task_index == 0: + # specific_builder.save_model_weights(train_model,int(round(e))) + torch.save(train_model.state_dict(), model_path) + _, _, _, roc_area, loss = make_predictions_and_evaluate_gpu( + conf, shot_list_validate, loader) - best_so_far = cmp_fn(roc_area,best_so_far) + best_so_far = cmp_fn(roc_area, best_so_far) stop_training = False print('=========Summary======== for epoch{}'.format(step)) @@ -468,7 +576,7 @@ def train(conf,shot_list_train,shot_list_validate,loader): print('Validation Loss: {:.3e}'.format(loss)) print('Validation ROC: {:.4f}'.format(roc_area)) - if best_so_far != roc_area: #only save model weights if quantity we are tracking is improving + if best_so_far != roc_area: # only save model weights if quantity we are tracking is improving print("No improvement, still saving model") not_updated += 1 else: @@ -477,4 +585,3 @@ def train(conf,shot_list_train,shot_list_validate,loader): if not_updated > patience: print("Stopping training due to early stopping") break - From e14a6780b6060ffa474411696b140283630246b3 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 9 Oct 2019 18:39:39 -0500 Subject: [PATCH 580/744] Manually fix PEP 8 issues in torch_runner.py --- plasma/models/torch_runner.py | 178 +++++++++++++--------------------- 1 file changed, 65 insertions(+), 113 deletions(-) diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py index f85cae87..6ffae00d 100644 --- a/plasma/models/torch_runner.py +++ b/plasma/models/torch_runner.py @@ -1,71 +1,32 @@ -import keras.callbacks as cbks +from __future__ import print_function from keras.utils.generic_utils import Progbar from torch.nn.utils import weight_norm import torch.optim as opt from torch.autograd import Variable import torch.nn as nn import torch -import hashlib from plasma.utils.downloading import makedirs_process_safe -from plasma.utils.state_reset import reset_states -from plasma.utils.evaluation import * from plasma.utils.performance import PerformanceAnalyzer -from plasma.models.loader import Loader, ProcessGenerator -from plasma.conf import conf -from sklearn.neural_network import MLPClassifier -from xgboost import XGBClassifier -import pathos.multiprocessing as mp +from plasma.utils.evaluation import get_loss_from_list from functools import partial import os -import datetime -import time -import sys import numpy as np -import matplotlib.pyplot as plt -from __future__ import print_function -import matplotlib -matplotlib.use('Agg') - -if sys.version_info[0] < 3: - from itertools import imap - -# leading to import errors: -#from hyperopt import hp, STATUS_OK -#from hyperas.distributions import conditional - model_filename = 'torch_model.pt' class FTCN(nn.Module): - def __init__( - self, - n_scalars, - n_profiles, - profile_size, - layer_sizes_spatial, - kernel_size_spatial, - linear_size, - output_size, - num_channels_tcn, - kernel_size_temporal, - dropout=0.1): + def __init__(self, n_scalars, n_profiles, profile_size, + layer_sizes_spatial, kernel_size_spatial, + linear_size, output_size, + num_channels_tcn, kernel_size_temporal, dropout=0.1): super(FTCN, self).__init__() - self.lin = InputBlock( - n_scalars, - n_profiles, - profile_size, - layer_sizes_spatial, - kernel_size_spatial, - linear_size, - dropout) + self.lin = InputBlock(n_scalars, n_profiles, profile_size, + layer_sizes_spatial, kernel_size_spatial, + linear_size, dropout) self.input_layer = TimeDistributed(self.lin, batch_first=True) - self.tcn = TCN( - linear_size, - output_size, - num_channels_tcn, - kernel_size_temporal, - dropout) + self.tcn = TCN(linear_size, output_size, num_channels_tcn, + kernel_size_temporal, dropout) self.model = nn.Sequential(self.input_layer, self.tcn) def forward(self, x): @@ -73,15 +34,8 @@ def forward(self, x): class InputBlock(nn.Module): - def __init__( - self, - n_scalars, - n_profiles, - profile_size, - layer_sizes, - kernel_size, - linear_size, - dropout=0.2): + def __init__(self, n_scalars, n_profiles, profile_size, layer_sizes, + kernel_size, linear_size, dropout=0.2): super(InputBlock, self).__init__() self.pooling_size = 2 self.n_scalars = n_scalars @@ -98,18 +52,15 @@ def __init__( input_size = n_profiles else: input_size = layer_sizes[i-1] - self.layers.append( - weight_norm( - nn.Conv1d( - input_size, - layer_size, - kernel_size))) + self.layers.append(weight_norm( + nn.Conv1d(input_size, layer_size, kernel_size))) self.layers.append(nn.ReLU()) self.conv_output_size = calculate_conv_output_size( self.conv_output_size, 0, 1, 1, kernel_size) self.layers.append(nn.MaxPool1d(kernel_size=self.pooling_size)) self.conv_output_size = calculate_conv_output_size( - self.conv_output_size, 0, 1, self.pooling_size, self.pooling_size) + self.conv_output_size, 0, 1, self.pooling_size, + self.pooling_size) self.layers.append(nn.Dropout2d(dropout)) self.net = nn.Sequential(*self.layers) self.conv_output_size = self.conv_output_size*layer_sizes[-1] @@ -294,7 +245,9 @@ def forward(self, x): # for i in range(iters): # x_,y_,mask_ = data_gen() # # print(y) -# x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) +# x, y, mask = Variable(torch.from_numpy(x_).float()), +# Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_) +# . byte()) # # print(y) # optimizer.zero_grad() # # output = model(x.unsqueeze(0)).squeeze(0) @@ -312,7 +265,8 @@ def forward(self, x): # optimizer.step() # if i > 0 and i % log_step == 0: # cur_loss = total_loss / count -# print("Epoch {:2d} | lr {:.5f} | loss {:.5f}".format(0,lr, cur_loss)) +# print("Epoch {:2d} | lr {:.5f} | loss {:.5f}".format(0,lr, +# # cur_loss)) # total_loss = 0.0 # count = 0 @@ -351,8 +305,8 @@ def build_torch_model(conf): # lin = nn.Linear(input_size,intermediate_dim) n_scalars, n_profiles, profile_size = get_signal_dimensions(conf) - dim = n_scalars+n_profiles*profile_size - input_size = dim + # dim = n_scalars + n_profiles*profile_size + # input_size = dim output_size = 1 # intermediate_dim = 15 @@ -362,17 +316,9 @@ def build_torch_model(conf): num_channels_tcn = [10, 5, 3, 3] # [3]*5 kernel_size_temporal = 3 # 3 - model = FTCN( - n_scalars, - n_profiles, - profile_size, - layer_sizes_spatial, - kernel_size_spatial, - linear_size, - output_size, - num_channels_tcn, - kernel_size_temporal, - dropout) + model = FTCN(n_scalars, n_profiles, profile_size, layer_sizes_spatial, + kernel_size_spatial, linear_size, output_size, + num_channels_tcn, kernel_size_temporal, dropout) return model @@ -392,9 +338,10 @@ def get_signal_dimensions(conf): n_profiles += 1 is_1D_region = True else: - assert( - not is_1D_region), "make sure all use_signals are ordered such that 1D signals come last!" - assert(num_channels == 1) + assert not is_1D_region, ( + "make sure all use_signals are ordered such that ", + "1D signals come last!") + assert num_channels == 1 n_scalars += 1 is_1D_region = False return n_scalars, n_profiles, profile_size @@ -402,7 +349,8 @@ def get_signal_dimensions(conf): def apply_model_to_np(model, x): # return - # model(Variable(torch.from_numpy(x).float()).unsqueeze(0)).squeeze(0).data.numpy() + # model(Variable(torch.from_numpy(x).float()).unsqueeze(0)).squeeze( + # 0).data.numpy() return model(Variable(torch.from_numpy(x).float())).data.numpy() @@ -415,7 +363,7 @@ def make_predictions(conf, shot_list, loader, custom_path=None): else: model_path = custom_path inference_model.load_state_dict(torch.load(model_path)) - #shot_list = shot_list.random_sublist(10) + # shot_list = shot_list.random_sublist(10) y_prime = [] y_gold = [] @@ -425,7 +373,9 @@ def make_predictions(conf, shot_list, loader, custom_path=None): pbar = Progbar(num_shots) while True: x, y, mask, disr, lengths, num_so_far, num_total = next(generator) - #x, y, mask = Variable(torch.from_numpy(x_).float()), Variable(torch.from_numpy(y_).float()),Variable(torch.from_numpy(mask_).byte()) + # x, y, mask = Variable(torch.from_numpy(x_).float()), + # Variable(torch.from_numpy(y_).float()), + # Variable(torch.from_numpy(mask_).byte()) output = apply_model_to_np(inference_model, x) for batch_idx in range(x.shape[0]): curr_length = lengths[batch_idx] @@ -441,8 +391,8 @@ def make_predictions(conf, shot_list, loader, custom_path=None): return y_prime, y_gold, disruptive -def make_predictions_and_evaluate_gpu( - conf, shot_list, loader, custom_path=None): +def make_predictions_and_evaluate_gpu(conf, shot_list, loader, + custom_path=None): y_prime, y_gold, disruptive = make_predictions( conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) @@ -452,8 +402,8 @@ def make_predictions_and_evaluate_gpu( def get_model_path(conf): - return conf['paths']['model_save_path'] + 'torch/' + \ - model_filename # save_prepath + model_filename + return (conf['paths']['model_save_path'] + 'torch/' + + model_filename) # save_prepath + model_filename def train_epoch(model, data_gen, optimizer, loss_fn): @@ -485,8 +435,9 @@ def train_epoch(model, data_gen, optimizer, loss_fn): loss.backward() optimizer.step() step += 1 - print("[{}] [{}/{}] loss: {:.3f}, ave_loss: {:.3f}".format(step, - num_so_far-num_so_far_start, num_total, loss.data[0], total_loss/step)) + print("[{}] [{}/{}] loss: {:.3f}, ave_loss: {:.3f}".format( + step, num_so_far - num_so_far_start, num_total, loss.data[0], + total_loss/step)) if num_so_far-num_so_far_start >= num_total: break x_, y_, mask_, num_so_far, num_total = next(data_gen) @@ -497,19 +448,16 @@ def train(conf, shot_list_train, shot_list_validate, loader): np.random.seed(1) - #data_gen = ProcessGenerator(partial(loader.training_batch_generator_full_shot_partial_reset,shot_list=shot_list_train)()) + # data_gen = ProcessGenerator(partial( + # loader.training_batch_generator_full_shot_partial_reset,shot_list + # = shot_list_train)()) data_gen = partial( loader.training_batch_generator_full_shot_partial_reset, shot_list=shot_list_train)() - - print( - 'validate: {} shots, {} disruptive'.format( - len(shot_list_validate), - shot_list_validate.num_disruptive())) - print( - 'training: {} shots, {} disruptive'.format( - len(shot_list_train), - shot_list_train.num_disruptive())) + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format( + len(shot_list_train), shot_list_train.num_disruptive())) loader.set_inference_mode(False) @@ -521,16 +469,18 @@ def train(conf, shot_list_train, shot_list_validate, loader): num_epochs = conf['training']['num_epochs'] patience = conf['callbacks']['patience'] lr_decay = conf['model']['lr_decay'] - batch_size = conf['training']['batch_size'] + # batch_size = conf['training']['batch_size'] lr = conf['model']['lr'] - clipnorm = conf['model']['clipnorm'] + # clipnorm = conf['model']['clipnorm'] e = 0 # warmup_steps = conf['model']['warmup_steps'] # num_batches_minimum = conf['training']['num_batches_minimum'] # if 'adam' in conf['model']['optimizer']: # optimizer = MPIAdam(lr=lr) - # elif conf['model']['optimizer'] == 'sgd' or conf['model']['optimizer'] == 'tf_sgd': + # elif conf['model']['optimizer'] == 'sgd' or conf['model']['optimizer'] == + # 'tf_sgd': + # # optimizer = MPISGD(lr=lr) # elif 'momentum_sgd' in conf['model']['optimizer']: # optimizer = MPIMomentumSGD(lr=lr) @@ -550,16 +500,17 @@ def train(conf, shot_list_train, shot_list_validate, loader): scheduler = opt.lr_scheduler.ExponentialLR(optimizer, lr_decay) train_model.train() not_updated = 0 - total_loss = 0 - count = 0 + # total_loss = 0 + # count = 0 loss_fn = nn.MSELoss(size_average=True) model_path = get_model_path(conf) makedirs_process_safe(os.path.dirname(model_path)) - while e < num_epochs-1: + while e < num_epochs - 1: scheduler.step() print('\nEpoch {}/{}'.format(e, num_epochs)) - (step, ave_loss, curr_loss, num_so_far, effective_epochs) = train_epoch( - train_model, data_gen, optimizer, loss_fn) + (step, ave_loss, curr_loss, num_so_far, + effective_epochs) = train_epoch(train_model, data_gen, optimizer, + loss_fn) e = effective_epochs loader.verbose = False # True during the first iteration # if task_index == 0: @@ -570,13 +521,14 @@ def train(conf, shot_list_train, shot_list_validate, loader): best_so_far = cmp_fn(roc_area, best_so_far) - stop_training = False + # stop_training = False print('=========Summary======== for epoch{}'.format(step)) print('Training Loss numpy: {:.3e}'.format(ave_loss)) print('Validation Loss: {:.3e}'.format(loss)) print('Validation ROC: {:.4f}'.format(roc_area)) - if best_so_far != roc_area: # only save model weights if quantity we are tracking is improving + # only save model weights if the quantity we are tracking is improving + if best_so_far != roc_area: print("No improvement, still saving model") not_updated += 1 else: From 98cbac75122c49888a8384bba3e452e0855bc2c6 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 9 Oct 2019 19:02:21 -0500 Subject: [PATCH 581/744] Start using saner line breaks around fn defs and calls reduce # of lines by passing multiple arguments per line than what autopep8 does --- plasma/models/loader.py | 29 +--- plasma/models/mpi_runner.py | 39 ++--- plasma/models/shallow_runner.py | 25 +-- plasma/models/torch_runner.py | 88 +++-------- plasma/primitives/data.py | 80 +++------- plasma/utils/performance.py | 267 ++++++++++---------------------- 6 files changed, 153 insertions(+), 375 deletions(-) diff --git a/plasma/models/loader.py b/plasma/models/loader.py index 8ed8806d..39e92d27 100644 --- a/plasma/models/loader.py +++ b/plasma/models/loader.py @@ -107,13 +107,8 @@ def training_batch_generator(self, shot_list): num_so_far, num_total epoch += 1 - def fill_training_buffer( - self, - Xbuff, - Ybuff, - end_indices, - shot, - is_first_fill=False): + def fill_training_buffer(self, Xbuff, Ybuff, end_indices, shot, + is_first_fill=False): sig, res = self.get_signal_result_from_shot(shot) length = self.conf['model']['length'] if is_first_fill: # cut signal to random position @@ -388,20 +383,16 @@ def fill_batch_queue(self, shot_list, queue): def training_batch_generator_process(self, shot_list): queue = mp.Queue() - proc = mp.Process( - target=self.fill_batch_queue, args=( - shot_list, queue)) + proc = mp.Process(target=self.fill_batch_queue, + args=(shot_list, queue)) proc.start() while True: yield queue.get(True) proc.join() queue.close() - def load_as_X_y_list( - self, - shot_list, - verbose=False, - prediction_mode=False): + def load_as_X_y_list(self, shot_list, verbose=False, + prediction_mode=False): """ The method turns a ShotList into a set of equal-sized patches which contain a number of examples that is a multiple of the batch size. @@ -696,12 +687,8 @@ def arange_patches(self, sig_patches, res_patches): y_list.append(y) return X_list, y_list - def arange_patches_single( - self, - sig_patches, - res_patches, - prediction_mode=False, - custom_batch_size=None): + def arange_patches_single(self, sig_patches, res_patches, + prediction_mode=False, custom_batch_size=None): if prediction_mode: num_timesteps = self.conf['model']['pred_length'] batch_size = self.conf['model']['pred_batch_size'] diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 00bf4704..01949c44 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -54,8 +54,8 @@ if backend == 'tf' or backend == 'tensorflow': if NUM_GPUS > 1: - os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format( - MY_GPU) # ,mode=NanGuardMode' + os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU) + # ,mode=NanGuardMode' os.environ['KERAS_BACKEND'] = 'tensorflow' import tensorflow as tf from keras.backend.tensorflow_backend import set_session @@ -749,8 +749,8 @@ def mpi_make_predictions(conf, shot_list, loader, custom_path=None): return y_prime_global, y_gold_global, disruptive_global -def mpi_make_predictions_and_evaluate( - conf, shot_list, loader, custom_path=None): +def mpi_make_predictions_and_evaluate(conf, shot_list, loader, + custom_path=None): y_prime, y_gold, disruptive = mpi_make_predictions( conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) @@ -823,17 +823,9 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, shot_list=shot_list_train) print("warmup {}".format(warmup_steps)) - mpi_model = MPIModel( - train_model, - optimizer, - comm, - batch_generator, - batch_size, - lr=lr, - warmup_steps=warmup_steps, - num_batches_minimum=num_batches_minimum, - conf=conf - ) + mpi_model = MPIModel(train_model, optimizer, comm, batch_generator, + batch_size, lr=lr, warmup_steps=warmup_steps, + num_batches_minimum=num_batches_minimum, conf=conf) mpi_model.compile( conf['model']['optimizer'], clipnorm, @@ -940,13 +932,11 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, # tensorboard if backend != 'theano': - val_generator = partial( - loader.training_batch_generator, - shot_list=shot_list_validate)() + val_generator = partial(loader.training_batch_generator, + shot_list=shot_list_validate)() val_steps = 1 - tensorboard.on_epoch_end( - val_generator, val_steps, int( - round(e)), epoch_logs) + tensorboard.on_epoch_end(val_generator, val_steps, + int(round(e)), epoch_logs) print_unique("end epoch {} 0".format(e)) stop_training = comm.bcast(stop_training, root=0) @@ -972,11 +962,8 @@ def get_stop_training(callbacks): class TensorBoard(object): - def __init__(self, log_dir='./logs', - histogram_freq=0, - validation_steps=0, - write_graph=True, - write_grads=False): + def __init__(self, log_dir='./logs', histogram_freq=0, validation_steps=0, + write_graph=True, write_grads=False): if K.backend() != 'tensorflow': raise RuntimeError('TensorBoard callback only works ' 'with the TensorFlow backend.') diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index aaabd2b9..fc775414 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -71,12 +71,8 @@ def get_sample_probs(self, shot_list, num_samples): return val, val return sample_prob_d, sample_prob_nd - def load_shots( - self, - shot_list, - is_inference=False, - as_list=False, - num_samples=np.Inf): + def load_shots(self, shot_list, is_inference=False, as_list=False, + num_samples=np.Inf): X = [] Y = [] Disr = [] @@ -153,7 +149,6 @@ def process(self, shot): return X, Y, disr def get_X(self, shot): - use_signals = self.loader.conf['paths']['use_signals'] sig_sample = shot.signals_dict[use_signals[0]] if len(shot.ttd.shape) == 1: @@ -181,13 +176,8 @@ def get_Y(self, shot): offset = self.timesteps - 1 return np.round(shot.ttd[offset:, 0]).astype(np.int) - def load_shot( - self, - shot, - is_inference=False, - sample_prob_d=1.0, - sample_prob_nd=1.0): - + def load_shot(self, shot, is_inference=False, sample_prob_d=1.0, + sample_prob_nd=1.0): X, Y, disr = self.process(shot) # cut shot ends if we are supposed to @@ -200,10 +190,9 @@ def load_shot( if disr: sample_prob = sample_prob_d if sample_prob < 1.0: - indices = np.sort( - np.random.choice(np.array(range(len(Y))), - int(round(sample_prob*len(Y))), - replace=False)) + indices = np.sort(np.random.choice(np.array(range(len(Y))), + int(round(sample_prob*len(Y))), + replace=False)) X = X[indices] Y = Y[indices] return X, Y, disr diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py index 6ffae00d..5c85e134 100644 --- a/plasma/models/torch_runner.py +++ b/plasma/models/torch_runner.py @@ -66,10 +66,8 @@ def __init__(self, n_scalars, n_profiles, profile_size, layer_sizes, self.conv_output_size = self.conv_output_size*layer_sizes[-1] self.linear_layers = [] - print( - "Final feature size = {}".format( - self.n_scalars - + self.conv_output_size)) + print("Final feature size = {}".format(self.n_scalars + + self.conv_output_size)) self.linear_layers.append( nn.Linear( self.conv_output_size @@ -111,8 +109,8 @@ def forward(self, x): def calculate_conv_output_size(L_in, padding, dilation, stride, kernel_size): - return int(np.floor((L_in + 2*padding - dilation - * (kernel_size-1) - 1)*1.0/stride + 1)) + return int(np.floor( + (L_in + 2*padding - dilation * (kernel_size-1) - 1)*1.0/stride + 1)) class Chomp1d(nn.Module): @@ -125,51 +123,28 @@ def forward(self, x): class TemporalBlock(nn.Module): - def __init__( - self, - n_inputs, - n_outputs, - kernel_size, - stride, - dilation, - padding, - dropout=0.2): + def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, + padding, dropout=0.2): super(TemporalBlock, self).__init__() - self.conv1 = weight_norm( - nn.Conv1d( - n_inputs, - n_outputs, - kernel_size, - stride=stride, - padding=padding, - dilation=dilation)) + self.conv1 = weight_norm(nn.Conv1d( + n_inputs, n_outputs, kernel_size, stride=stride, padding=padding, + dilation=dilation)) self.chomp1 = Chomp1d(padding) self.relu1 = nn.ReLU() self.dropout1 = nn.Dropout2d(dropout) - self.conv2 = weight_norm( - nn.Conv1d( - n_outputs, - n_outputs, - kernel_size, - stride=stride, - padding=padding, - dilation=dilation)) + self.conv2 = weight_norm(nn.Conv1d( + n_outputs, n_outputs, kernel_size, stride=stride, padding=padding, + dilation=dilation)) self.chomp2 = Chomp1d(padding) self.relu2 = nn.ReLU() self.dropout2 = nn.Dropout2d(dropout) - self.net = nn.Sequential( - self.conv1, - self.chomp1, - self.relu1, - self.dropout1, - self.conv2, - self.chomp2, - self.relu2, - self.dropout2) - self.downsample = nn.Conv1d( - n_inputs, n_outputs, 1) if n_inputs != n_outputs else None + self.net = nn.Sequential(self.conv1, self.chomp1, self.relu1, + self.dropout1, self.conv2, self.chomp2, + self.relu2, self.dropout2) + self.downsample = (nn.Conv1d(n_inputs, n_outputs, 1) + if n_inputs != n_outputs else None) self.relu = nn.ReLU() self.init_weights() @@ -196,11 +171,8 @@ def __init__(self, num_inputs, num_channels, kernel_size=2, dropout=0.2): dilation_size = 2 ** i in_channels = num_inputs if i == 0 else num_channels[i-1] out_channels = num_channels[i] - layers += [TemporalBlock(in_channels, - out_channels, - kernel_size, - stride=1, - dilation=dilation_size, + layers += [TemporalBlock(in_channels, out_channels, kernel_size, + stride=1, dilation=dilation_size, padding=(kernel_size-1) * dilation_size, dropout=dropout)] @@ -211,19 +183,11 @@ def forward(self, x): class TCN(nn.Module): - def __init__( - self, - input_size, - output_size, - num_channels, - kernel_size, - dropout): + def __init__(self, input_size, output_size, num_channels, kernel_size, + dropout): super(TCN, self).__init__() - self.tcn = TemporalConvNet( - input_size, - num_channels, - kernel_size, - dropout=dropout) + self.tcn = TemporalConvNet(input_size, num_channels, kernel_size, + dropout=dropout) self.linear = nn.Linear(num_channels[-1], output_size) # self.sig = nn.Sigmoid() @@ -278,7 +242,6 @@ def __init__(self, module, batch_first=False): self.batch_first = batch_first def forward(self, x): - if len(x.size()) <= 2: return self.module(x) @@ -301,8 +264,7 @@ def forward(self, x): def build_torch_model(conf): dropout = conf['model']['dropout_prob'] -# dim = 10 - + # dim = 10 # lin = nn.Linear(input_size,intermediate_dim) n_scalars, n_profiles, profile_size = get_signal_dimensions(conf) # dim = n_scalars + n_profiles*profile_size @@ -445,9 +407,7 @@ def train_epoch(model, data_gen, optimizer, loss_fn): def train(conf, shot_list_train, shot_list_validate, loader): - np.random.seed(1) - # data_gen = ProcessGenerator(partial( # loader.training_batch_generator_full_shot_partial_reset,shot_list # = shot_list_train)()) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 922cce5a..4710ff77 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -222,30 +222,13 @@ def __repr__(self): class ProfileSignal(Signal): - def __init__( - self, - description, - paths, - machines, - tex_label=None, - causal_shifts=None, - mapping_range=( - 0, - 1), - num_channels=32, - data_avail_tolerances=None, - is_strictly_positive=False, - mapping_paths=None): - super( - ProfileSignal, - self).__init__( - description, - paths, - machines, - tex_label, - causal_shifts, - is_ip=False, - data_avail_tolerances=data_avail_tolerances, + def __init__(self, description, paths, machines, tex_label=None, + causal_shifts=None, mapping_range=(0, 1), num_channels=32, + data_avail_tolerances=None, is_strictly_positive=False, + mapping_paths=None): + super(ProfileSignal, self).__init__( + description, paths, machines, tex_label, causal_shifts, + is_ip=False, data_avail_tolerances=data_avail_tolerances, is_strictly_positive=is_strictly_positive, mapping_paths=mapping_paths) self.mapping_range = mapping_range @@ -261,10 +244,8 @@ def load_data(self, prepath, shot, dtype='float32'): # time is stored twice, once for mapping and once for signal T = data.shape[0]//2 mapping = data[:T, 1:] - remapping = np.linspace( - self.mapping_range[0], - self.mapping_range[1], - self.num_channels) + remapping = np.linspace(self.mapping_range[0], self.mapping_range[1], + self.num_channels) t = data[:T, 0] sig = data[T:, 1:] if sig.shape[1] < 2: @@ -289,8 +270,8 @@ def load_data(self, prepath, shot, dtype='float32'): _, order = np.unique(mapping[i, :], return_index=True) if sig[i, order].shape[0] > 2: # ext = 0 is extrapolation, ext = 3 is boundary value. - f = UnivariateSpline( - mapping[i, order], sig[i, order], s=0, k=1, ext=3) + f = UnivariateSpline(mapping[i, order], sig[i, order], s=0, + k=1, ext=3) sig_interp[i, :] = f(remapping) else: print('Signal {}, shot {} '.format(self.description, @@ -302,8 +283,8 @@ def load_data(self, prepath, shot, dtype='float32'): return t, sig_interp, True def fetch_data(self, machine, shot_num, c): - time, data, mapping, success = self.fetch_data_basic( - machine, shot_num, c) + time, data, mapping, success = self.fetch_data_basic(machine, shot_num, + c) path = self.get_path(machine) mapping_path = self.get_mapping_path(machine) @@ -335,26 +316,12 @@ def fetch_data(self, machine, shot_num, c): class ChannelSignal(Signal): - def __init__( - self, - description, - paths, - machines, - tex_label=None, - causal_shifts=None, - data_avail_tolerances=None, - is_strictly_positive=False, - mapping_paths=None): - super( - ChannelSignal, - self).__init__( - description, - paths, - machines, - tex_label, - causal_shifts, - is_ip=False, - data_avail_tolerances=data_avail_tolerances, + def __init__(self, description, paths, machines, tex_label=None, + causal_shifts=None, data_avail_tolerances=None, + is_strictly_positive=False, mapping_paths=None): + super(ChannelSignal, self).__init__( + description, paths, machines, tex_label, causal_shifts, + is_ip=False, data_avail_tolerances=data_avail_tolerances, is_strictly_positive=is_strictly_positive, mapping_paths=mapping_paths) nums, new_paths = self.get_channel_nums(paths) @@ -407,13 +374,8 @@ def get_file_path(self, prepath, machine, shot_number): class Machine(object): - def __init__( - self, - name, - server, - fetch_data_fn, - max_cores=8, - current_threshold=0): + def __init__(self, name, server, fetch_data_fn, max_cores=8, + current_threshold=0): self.name = name self.server = server self.max_cores = max_cores diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 3dd52474..b88774ec 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -67,8 +67,8 @@ def get_metrics_vs_p_thresh(self, mode): return self.get_metrics_vs_p_thresh_custom( all_preds, all_truths, all_disruptive) - def get_metrics_vs_p_thresh_custom( - self, all_preds, all_truths, all_disruptive): + def get_metrics_vs_p_thresh_custom(self, all_preds, all_truths, + all_disruptive): return self.get_metrics_vs_p_thresh_fast( all_preds, all_truths, all_disruptive) P_thresh_range = self.get_p_thresh_range() @@ -113,8 +113,8 @@ def get_p_thresh_range(self): # print(np.unique(self.p_thresh_range)) return self.p_thresh_range - def get_metrics_vs_p_thresh_fast( - self, all_preds, all_truths, all_disruptive): + def get_metrics_vs_p_thresh_fast(self, all_preds, all_truths, + all_disruptive): all_disruptive = np.array(all_disruptive) if self.pred_train is not None: p_thresh_range = self.get_p_thresh_range() @@ -225,9 +225,8 @@ def get_threshold_arrays(self, preds, truths, disruptives): return (np.array(d_early_thresholds), np.array(d_correct_thresholds), np.array(d_late_thresholds), np.array(nd_thresholds)) - def summarize_shot_prediction_stats_by_mode( - self, P_thresh, mode, verbose=False): - + def summarize_shot_prediction_stats_by_mode(self, P_thresh, mode, + verbose=False): if mode == 'train': all_preds = self.pred_train all_truths = self.truth_train @@ -241,20 +240,13 @@ def summarize_shot_prediction_stats_by_mode( return self.summarize_shot_prediction_stats( P_thresh, all_preds, all_truths, all_disruptive, verbose) - def summarize_shot_prediction_stats( - self, - P_thresh, - all_preds, - all_truths, - all_disruptive, - verbose=False): + def summarize_shot_prediction_stats(self, P_thresh, all_preds, all_truths, + all_disruptive, verbose=False): TPs, FPs, FNs, TNs, earlies, lates = (0, 0, 0, 0, 0, 0) - for i in range(len(all_preds)): preds = all_preds[i] truth = all_truths[i] is_disruptive = all_disruptive[i] - TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( P_thresh, preds, truth, is_disruptive) TPs += TP @@ -334,8 +326,8 @@ def create_acceptable_region(self, truth, mode): acceptable[-acceptable_timesteps:] = True return acceptable - def get_accuracy_and_fp_rate_from_stats( - self, tp, fp, fn, tn, early, late, verbose=False): + def get_accuracy_and_fp_rate_from_stats(self, tp, fp, fn, tn, early, late, + verbose=False): total = tp + fp + fn + tn + early + late disr = early + late + tp + fn nondisr = fp + tn @@ -386,15 +378,15 @@ def load_ith_file(self): # normalized shot ttd. self.conf['data']['T_warning'] = self.saved_conf['data']['T_warning'] for mode in ['test', 'train']: - print( - '{}: loaded {} shot ({}) disruptive'.format( - mode, - self.get_num_shots(mode), - self.get_num_disruptive_shots(mode))) + print('{}: loaded {} shot ({}) disruptive'.format( + mode, self.get_num_shots(mode), + self.get_num_disruptive_shots(mode))) if self.verbose: self.print_conf() - # self.assert_same_lists(self.shot_list_test,self.truth_test,self.disruptive_test) - # self.assert_same_lists(self.shot_list_train,self.truth_train,self.disruptive_train) + # self.assert_same_lists(self.shot_list_test, self.truth_test, + # self.disruptive_test) + # self.assert_same_lists(self.shot_list_train, self.truth_train, + # self.disruptive_train) def assert_same_lists(self, shot_list, truth_arr, disr_arr): assert(len(shot_list) == len(truth_arr)) @@ -423,12 +415,8 @@ def get_num_disruptive_shots(self, mode): if mode == 'train': return sum(self.disruptive_train) - def hist_alarms( - self, - alarms, - title_str='alarms', - save_figure=False, - linestyle='-'): + def hist_alarms(self, alarms, title_str='alarms', save_figure=False, + linestyle='-'): fontsize = 15 T_min_warn = self.T_min_warn T_max_warn = self.T_max_warn @@ -448,7 +436,6 @@ def hist_alarms( plt.step(np.concatenate((alarms[::-1], alarms[[0]])), 1.0*np.arange(alarms.size+1)/(alarms.size), linestyle=linestyle, linewidth=1.5) - plt.gca().set_xscale('log') plt.axvline(T_min_warn, color='r', linewidth=0.5) # if T_max_warn < np.max(alarms): @@ -463,10 +450,8 @@ def hist_alarms( plt.setp(plt.gca().get_xticklabels(), fontsize=fontsize) plt.show() if save_figure: - plt.savefig( - 'accum_disruptions.png', - dpi=200, - bbox_inches='tight') + plt.savefig('accum_disruptions.png', dpi=200, + bbox_inches='tight') else: print(title_str + ": No alarms!") @@ -640,12 +625,8 @@ def get_prediction_type(self, TP, FP, FN, TN, early, late): elif late: return 'late' - def plot_individual_shot( - self, - P_thresh_opt, - shot_num, - normalize=True, - plot_signals=True): + def plot_individual_shot(self, P_thresh_opt, shot_num, normalize=True, + plot_signals=True): success = False for mode in ['test', 'train']: if mode == 'test': @@ -663,28 +644,20 @@ def plot_individual_shot( t = truth[i] p = pred[i] is_disr = is_disruptive[i] - TP, FP, FN, TN, early, late = ( self.get_shot_prediction_stats(P_thresh_opt, p, t, is_disr)) prediction_type = self.get_prediction_type(TP, FP, FN, TN, early, late) print(prediction_type) - self.plot_shot( - shot, - True, - normalize, - t, - p, - P_thresh_opt, - prediction_type, - extra_filename='_indiv') + self.plot_shot(shot, True, normalize, t, p, P_thresh_opt, + prediction_type, extra_filename='_indiv') success = True if not success: print("Shot {} not found".format(shot_num)) - def get_prediction_type_for_individual_shot( - self, P_thresh, shot, mode='test'): + def get_prediction_type_for_individual_shot(self, P_thresh, shot, + mode='test'): p, t, is_disr = self.get_pred_truth_disr_by_shot(shot) TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( @@ -692,15 +665,9 @@ def get_prediction_type_for_individual_shot( prediction_type = self.get_prediction_type(TP, FP, FN, TN, early, late) return prediction_type - def example_plots( - self, - P_thresh_opt, - mode='test', - types_to_plot=['FP'], - max_plot=5, - normalize=True, - plot_signals=True, - extra_filename=''): + def example_plots(self, P_thresh_opt, mode='test', types_to_plot=['FP'], + max_plot=5, normalize=True, plot_signals=True, + extra_filename=''): if mode == 'test': pred = self.pred_test truth = self.truth_test @@ -731,51 +698,30 @@ def example_plots( if (('any' in types_to_plot or prediction_type in types_to_plot) and plotted < max_plot): if plot_signals: - self.plot_shot( - shot, - True, - normalize, - t, - p, - P_thresh_opt, - prediction_type, - extra_filename=extra_filename) + self.plot_shot(shot, True, normalize, t, p, P_thresh_opt, + prediction_type, + extra_filename=extra_filename) else: plt.figure() plt.semilogy((t+0.001)[::-1], label='ground truth') plt.plot(p[::-1], 'g', label='neural net prediction') - plt.axvline( - self.T_min_warn, - color='r', - label='max warning time') - plt.axvline( - self.T_max_warn, - color='r', - label='min warning time') - plt.axhline( - P_thresh_opt, - color='k', - label='trigger threshold') + plt.axvline(self.T_min_warn, color='r', + label='max warning time') + plt.axvline(self.T_max_warn, color='r', + label='min warning time') + plt.axhline(P_thresh_opt, color='k', + label='trigger threshold') plt.xlabel('TTD [ms]') plt.legend(loc=(1.0, 0.6)) plt.ylim([1e-7, 1.1e0]) plt.grid() - plt.savefig( - 'fig_{}.png'.format( - shot.number), - bbox_inches='tight') + plt.savefig('fig_{}.png'.format(shot.number), + bbox_inches='tight') plotted += 1 - def plot_shot( - self, - shot, - save_fig=True, - normalize=True, - truth=None, - prediction=None, - P_thresh_opt=None, - prediction_type='', - extra_filename=''): + def plot_shot(self, shot, save_fig=True, normalize=True, truth=None, + prediction=None, P_thresh_opt=None, prediction_type='', + extra_filename=''): if self.normalizer is None and normalize: if self.conf is not None: self.saved_conf['paths']['normalizer_path'] = ( @@ -832,16 +778,10 @@ def plot_shot( ax.set_yticks([0, num_channels/2]) ax.set_yticklabels(["0", "0.5"]) ax.set_ylabel("$\\rho$", size=fontsize) - ax.legend( - loc="best", - labelspacing=0.1, - fontsize=fontsize, - frameon=False) - ax.axvline( - len(truth) - - self.T_min_warn, - color='r', - linewidth=0.5) + ax.legend(loc="best", labelspacing=0.1, fontsize=fontsize, + frameon=False) + ax.axvline(len(truth) - self.T_min_warn, color='r', + linewidth=0.5) plt.setp(ax.get_xticklabels(), visible=False) plt.setp(ax.get_yticklabels(), fontsize=fontsize) f.subplots_adjust(hspace=0) @@ -881,36 +821,22 @@ def plot_shot( plt.xlim([lower_lim, len(truth)]) # plt.savefig("{}.png".format(num),dpi=200,bbox_inches="tight") if save_fig: - plt.savefig( - 'sig_fig_{}{}.png'.format( - shot.number, - extra_filename), - bbox_inches='tight') - np.savez( - 'sig_{}{}.npz'.format( - shot.number, - extra_filename), - shot=shot, - T_min_warn=self.T_min_warn, - T_max_warn=self.T_max_warn, - prediction=prediction, - truth=truth, - use_signals=use_signals, - P_thresh=P_thresh_opt) + plt.savefig('sig_fig_{}{}.png'.format(shot.number, + extra_filename), + bbox_inches='tight') + np.savez('sig_{}{}.npz'.format(shot.number, + extra_filename), + shot=shot, T_min_warn=self.T_min_warn, + T_max_warn=self.T_max_warn, prediction=prediction, + truth=truth, use_signals=use_signals, + P_thresh=P_thresh_opt) # plt.show() else: print("Shot hasn't been processed") - def plot_shot_old( - self, - shot, - save_fig=True, - normalize=True, - truth=None, - prediction=None, - P_thresh_opt=None, - prediction_type='', - extra_filename=''): + def plot_shot_old(self, shot, save_fig=True, normalize=True, truth=None, + prediction=None, P_thresh_opt=None, prediction_type='', + extra_filename=''): if self.normalizer is None and normalize: if self.conf is not None: self.saved_conf['paths']['normalizer_path'] = ( @@ -977,63 +903,34 @@ def plot_shot_old( plt.setp(ax.get_yticklabels(), fontsize=7) # ax.grid() if save_fig: - plt.savefig( - 'sig_fig_{}{}.png'.format( - shot.number, - extra_filename), - bbox_inches='tight') - np.savez( - 'sig_{}{}.npz'.format( - shot.number, - extra_filename), - shot=shot, - T_min_warn=self.T_min_warn, - T_max_warn=self.T_max_warn, - prediction=prediction, - truth=truth, - use_signals=use_signals, - P_thresh=P_thresh_opt) + plt.savefig('sig_fig_{}{}.png'.format( + shot.number, extra_filename), bbox_inches='tight') + np.savez('sig_{}{}.npz'.format(shot.number, extra_filename), + shot=shot, T_min_warn=self.T_min_warn, + T_max_warn=self.T_max_warn, prediction=prediction, + truth=truth, use_signals=use_signals, + P_thresh=P_thresh_opt) plt.close() else: print("Shot hasn't been processed") - def tradeoff_plot( - self, - accuracy_range, - missed_range, - fp_range, - early_alarm_range, - save_figure=False, - plot_string='', - linestyle="-"): + def tradeoff_plot(self, accuracy_range, missed_range, fp_range, + early_alarm_range, save_figure=False, plot_string='', + linestyle="-"): fontsize = 15 plt.figure() P_thresh_range = self.get_p_thresh_range() # semilogx(P_thresh_range,accuracy_range,label="accuracy") if self.pred_ttd: - plt.semilogx(abs(P_thresh_range[::-1]), - missed_range, - 'r', - label="missed", - linestyle=linestyle) - plt.plot(abs(P_thresh_range[::-1]), - fp_range, - 'k', - label="false positives", - linestyle=linestyle) + plt.semilogx(abs(P_thresh_range[::-1]), missed_range, 'r', + label="missed", linestyle=linestyle) + plt.plot(abs(P_thresh_range[::-1]), fp_range, 'k', + label="false positives", linestyle=linestyle) else: - plt.plot( - P_thresh_range, - missed_range, - 'r', - label="missed", - linestyle=linestyle) - plt.plot( - P_thresh_range, - fp_range, - 'k', - label="false positives", - linestyle=linestyle) + plt.plot(P_thresh_range, missed_range, 'r', label="missed", + linestyle=linestyle) + plt.plot(P_thresh_range, fp_range, 'k', label="false positives", + linestyle=linestyle) # plot(P_thresh_range,early_alarm_range,'c',label="early alarms") plt.legend(loc=(1.0, .6)) plt.xlabel('Alarm threshold', size=fontsize) @@ -1062,12 +959,8 @@ def tradeoff_plot( plt.ylim([0, 1]) if save_figure: plt.savefig(title_str + '_roc.png', bbox_inches='tight', dpi=200) - print( - 'ROC area ({}) is {}'.format( - plot_string, - self.roc_from_missed_fp( - missed_range, - fp_range))) + print('ROC area ({}) is {}'.format( + plot_string, self.roc_from_missed_fp(missed_range, fp_range))) return P_thresh_range, missed_range, fp_range def get_pred_truth_disr_by_shot(self, shot): From 6a30ddcd7bb56be138b2da9715027fa4d0124ce7 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 10 Oct 2019 10:08:07 -0500 Subject: [PATCH 582/744] Re-remove bidirectional RNN Repeat of 76a566ecfade9cebcbfcc3c103c8c011b336856e 735e1c26a2e9269b14e35dfc31db1baac5d08c44 46f2df9e11057d053821775a5bf3d68b875728e7 --- examples/conf.yaml | 1 - plasma/models/builder.py | 39 ++++++++++----------------------------- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 3b0abce8..b9116a5c 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -55,7 +55,6 @@ data: model: loss_scale_factor: 1.0 - use_bidirectional: false use_batch_norm: false torch: False shallow: True diff --git a/plasma/models/builder.py b/plasma/models/builder.py index dc49e0ef..d7b2c0a8 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -5,7 +5,7 @@ Dense, Activation, Dropout, Lambda, Reshape, Flatten, Permute, # RepeatVector ) -from keras.layers import LSTM, SimpleRNN, Bidirectional, BatchNormalization +from keras.layers import LSTM, SimpleRNN, BatchNormalization from keras.layers.convolutional import Convolution1D from keras.layers.pooling import MaxPooling1D # from keras.utils.data_utils import get_file @@ -82,7 +82,6 @@ def build_model(self, predict, custom_batch_size=None): conf = self.conf model_conf = conf['model'] rnn_size = model_conf['rnn_size'] - use_bidirectional = model_conf['use_bidirectional'] rnn_type = model_conf['rnn_type'] regularization = model_conf['regularization'] dense_regularization = model_conf['dense_regularization'] @@ -249,33 +248,15 @@ def slicer_output_shape(input_shape, indices): # pre_rnn_model.summary() x_input = Input(batch_shape=batch_input_shape) x_in = TimeDistributed(pre_rnn_model)(x_input) - - if use_bidirectional: - for _ in range(model_conf['rnn_layers']): - x_in = Bidirectional( - rnn_model( - rnn_size, - return_sequences=return_sequences, - stateful=stateful, - kernel_regularizer=l2(regularization), - recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization), - dropout=dropout_prob, - recurrent_dropout=dropout_prob))(x_in) - x_in = Dropout(dropout_prob)(x_in) - else: - for _ in range(model_conf['rnn_layers']): - x_in = rnn_model( - rnn_size, - return_sequences=return_sequences, - # batch_input_shape=batch_input_shape, - stateful=stateful, - kernel_regularizer=l2(regularization), - recurrent_regularizer=l2(regularization), - bias_regularizer=l2(regularization), - dropout=dropout_prob, - recurrent_dropout=dropout_prob)(x_in) - x_in = Dropout(dropout_prob)(x_in) + for _ in range(model_conf['rnn_layers']): + x_in = rnn_model( + rnn_size, return_sequences=return_sequences, + # batch_input_shape=batch_input_shape, + stateful=stateful, kernel_regularizer=l2(regularization), + recurrent_regularizer=l2(regularization), + bias_regularizer=l2(regularization), dropout=dropout_prob, + recurrent_dropout=dropout_prob)(x_in) + x_in = Dropout(dropout_prob)(x_in) if return_sequences: # x_out = TimeDistributed(Dense(100,activation='tanh')) (x_in) x_out = TimeDistributed( From 9fbe0f8c09bf793b477a9b1b557e2fa1cb177468 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 10 Oct 2019 15:04:32 -0500 Subject: [PATCH 583/744] Remove erroneous imports from runner.py of lr, tf Introduced by style changes in deddb520c861e6693811c90b718fcc843d395113 --- plasma/models/runner.py | 164 ++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 109 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 0b18ef9f..f616f54a 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -1,5 +1,5 @@ from plasma.utils.state_reset import reset_states -from plasma.utils.evaluation import lr, tf, get_loss_from_list +from plasma.utils.evaluation import get_loss_from_list from plasma.utils.performance import PerformanceAnalyzer from plasma.models.loader import Loader, ProcessGenerator from plasma.conf import conf @@ -29,14 +29,10 @@ def train(conf, shot_list_train, shot_list_validate, loader, validation_losses = [] validation_roc = [] training_losses = [] - print( - 'validate: {} shots, {} disruptive'.format( - len(shot_list_validate), - shot_list_validate.num_disruptive())) - print( - 'training: {} shots, {} disruptive'.format( - len(shot_list_train), - shot_list_train.num_disruptive())) + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) + print('training: {} shots, {} disruptive'.format( + len(shot_list_train), shot_list_train.num_disruptive())) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules @@ -59,9 +55,8 @@ def train(conf, shot_list_train, shot_list_validate, loader, specific_builder = builder.ModelBuilder(conf) train_model = specific_builder.build_model(False) print('Compile model', end='') - train_model.compile( - optimizer=optimizer_class(), - loss=conf['data']['target'].loss) + train_model.compile(optimizer=optimizer_class(), + loss=conf['data']['target'].loss) print('...done') # load the latest epoch we did. Returns -1 if none exist yet @@ -87,7 +82,7 @@ def train(conf, shot_list_train, shot_list_validate, loader, best_so_far = np.inf cmp_fn = min - while e < num_epochs-1: + while e < (num_epochs - 1): e += 1 print('\nEpoch {}/{}'.format(e+1, num_epochs)) pbar = Progbar(len(shot_list_train)) @@ -114,10 +109,8 @@ def train(conf, shot_list_train, shot_list_validate, loader, if np.any(batches_to_reset): reset_states(train_model, batches_to_reset) if not is_warmup_period: - num_so_far = num_so_far_accum+num_so_far_curr - + num_so_far = num_so_far_accum + num_so_far_curr num_batches_current += 1 - loss = train_model.train_on_batch(batch_xs, batch_ys) training_losses_tmp.append(loss) pbar.add(num_so_far - num_so_far_old, @@ -127,7 +120,7 @@ def train(conf, shot_list_train, shot_list_validate, loader, _ = train_model.predict( batch_xs, batch_size=conf['training']['batch_size']) - e = e_start+1.0*num_so_far/num_total + e = e_start + 1.0*num_so_far/num_total sys.stdout.flush() ave_loss = np.mean(training_losses_tmp) training_losses.append(ave_loss) @@ -144,13 +137,13 @@ def train(conf, shot_list_train, shot_list_validate, loader, epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss - best_so_far = cmp_fn( - epoch_logs[conf['callbacks']['monitor']], best_so_far) + best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']], + best_so_far) # only save model weights if quantity we are tracking is improving if best_so_far != epoch_logs[conf['callbacks']['monitor']]: print("Not saving model weights") - specific_builder.delete_model_weights( - train_model, int(round(e))) + specific_builder.delete_model_weights(train_model, + int(round(e))) if conf['training']['ranking_difficulty_fac'] != 1.0: (_, _, _, roc_area_train, @@ -174,12 +167,8 @@ def train(conf, shot_list_train, shot_list_validate, loader, # plot_losses(conf,[training_losses],specific_builder,name='training') if conf['training']['validation_frac'] > 0.0: - plot_losses(conf, - [training_losses, - validation_losses, - validation_roc], - specific_builder, - name='training_validation_roc') + plot_losses(conf, [training_losses, validation_losses, validation_roc], + specific_builder, name='training_validation_roc') batch_iterator.__exit__() print('...done') @@ -190,30 +179,22 @@ def optimizer_class(): if conf['model']['optimizer'] == 'sgd': return SGD(lr=conf['model']['lr'], clipnorm=conf['model']['clipnorm']) elif conf['model']['optimizer'] == 'momentum_sgd': - return SGD( - lr=conf['model']['lr'], - clipnorm=conf['model']['clipnorm'], - decay=1e-6, - momentum=0.9) + return SGD(lr=conf['model']['lr'], clipnorm=conf['model']['clipnorm'], + decay=1e-6, momentum=0.9) elif conf['model']['optimizer'] == 'tf_momentum_sgd': - return TFOptimizer( - tf.train.MomentumOptimizer( - learning_rate=conf['model']['lr'], - momentum=0.9)) + return TFOptimizer(tf.train.MomentumOptimizer( + learning_rate=conf['model']['lr'], momentum=0.9)) elif conf['model']['optimizer'] == 'adam': return Adam(lr=conf['model']['lr'], clipnorm=conf['model']['clipnorm']) elif conf['model']['optimizer'] == 'tf_adam': - return TFOptimizer( - tf.train.AdamOptimizer( - learning_rate=conf['model']['lr'])) + return TFOptimizer(tf.train.AdamOptimizer( + learning_rate=conf['model']['lr'])) elif conf['model']['optimizer'] == 'rmsprop': - return RMSprop( - lr=conf['model']['lr'], - clipnorm=conf['model']['clipnorm']) + return RMSprop(lr=conf['model']['lr'], + clipnorm=conf['model']['clipnorm']) elif conf['model']['optimizer'] == 'nadam': - return Nadam( - lr=conf['model']['lr'], - clipnorm=conf['model']['clipnorm']) + return Nadam(lr=conf['model']['lr'], + clipnorm=conf['model']['clipnorm']) else: print("Optimizer not implemented yet") exit(1) @@ -232,9 +213,8 @@ def keras_fmin_fnct(self, space): specific_builder = builder.ModelBuilder(self.conf) train_model = specific_builder.hyper_build_model(space, False) - train_model.compile( - optimizer=optimizer_class(), - loss=conf['data']['target'].loss) + train_model.compile(optimizer=optimizer_class(), + loss=conf['data']['target'].loss) np.random.seed(1) validation_losses = [] @@ -267,17 +247,10 @@ def keras_fmin_fnct(self, space): X_list, y_list = self.loader.load_as_X_y_list(shot_sublist) for j, (X, y) in enumerate(zip(X_list, y_list)): history = builder.LossHistory() - train_model.fit( - X, - y, - batch_size=Loader.get_batch_size( - self.conf['training']['batch_size'], - prediction_mode=False), - epochs=1, - shuffle=False, - verbose=0, - validation_split=0.0, - callbacks=[history]) + train_model.fit(X, y, + batch_size=Loader.get_batch_size(self.conf['training']['batch_size'], prediction_mode=False), # noqa + epochs=1, shuffle=False, verbose=0, + validation_split=0.0, callbacks=[history]) train_model.reset_states() train_loss = np.mean(history.losses) training_losses_tmp.append(train_loss) @@ -288,12 +261,10 @@ def keras_fmin_fnct(self, space): sys.stdout.flush() training_losses.append(np.mean(training_losses_tmp)) specific_builder.save_model_weights(train_model, e) - _, _, _, roc_area, loss = make_predictions_and_evaluate_gpu( self.conf, shot_list_validate, self.loader) - print( - "Epoch: {}, loss: {}, validation_losses_size: {}".format( - e, loss, len(validation_losses))) + print("Epoch: {}, loss: {}, validation_losses_size: {}".format( + e, loss, len(validation_losses))) validation_losses.append(loss) validation_roc.append(roc_area) resulting_dict['loss'] = loss @@ -306,20 +277,13 @@ def keras_fmin_fnct(self, space): return resulting_dict def get_space(self): - return { - 'Dropout': hp.uniform('Dropout', 0, 1), - } + return {'Dropout': hp.uniform('Dropout', 0, 1), } def frnn_minimize(self, algo, max_evals, trials, rseed=1337): from hyperopt import fmin - - best_run = fmin(self.keras_fmin_fnct, - space=self.get_space(), - algo=algo, - max_evals=max_evals, - trials=trials, + best_run = fmin(self.keras_fmin_fnct, space=self.get_space(), + algo=algo, max_evals=max_evals, trials=trials, rstate=np.random.RandomState(rseed)) - best_model = None for trial in trials: vals = trial.get('misc').get('vals') @@ -373,20 +337,16 @@ def make_predictions(conf, shot_list, loader): disruptive = [] model = specific_builder.build_model(True) - model.compile( - optimizer=optimizer_class(), - loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(), + loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model_save_path = specific_builder.get_latest_save_path() start_time = time.time() pool = mp.Pool(use_cores) - fn = partial( - make_single_prediction, - builder=specific_builder, - loader=loader, - model_save_path=model_save_path) + fn = partial(make_single_prediction, builder=specific_builder, + loader=loader, model_save_path=model_save_path) print('running in parallel on {} processes'.format(pool._processes)) for (i, (y_p, y, is_disruptive)) in enumerate(pool.imap(fn, shot_list)): @@ -405,19 +365,16 @@ def make_predictions(conf, shot_list, loader): def make_single_prediction(shot, specific_builder, loader, model_save_path): loader.set_inference_mode(True) model = specific_builder.build_model(True) - model.compile( - optimizer=optimizer_class(), - loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(), + loss=conf['data']['target'].loss) model.load_weights(model_save_path) model.reset_states() X, y = loader.load_as_X_y(shot, prediction_mode=True) assert(X.shape[0] == y.shape[0]) y_p = model.predict( - X, - batch_size=Loader.get_batch_size(conf['training']['batch_size'], - prediction_mode=True), - verbose=0) + X, batch_size=Loader.get_batch_size(conf['training']['batch_size'], + prediction_mode=True), verbose=0) answer_dims = y_p.shape[-1] if conf['model']['return_sequences']: shot_length = y_p.shape[0]*y_p.shape[1] @@ -433,7 +390,6 @@ def make_single_prediction(shot, specific_builder, loader, model_save_path): def make_predictions_gpu(conf, shot_list, loader, custom_path=None): loader.set_inference_mode(True) - if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules if first_time: @@ -462,10 +418,8 @@ def make_predictions_gpu(conf, shot_list, loader, custom_path=None): model.reset_states() pbar = Progbar(len(shot_list)) - shot_sublists = shot_list.sublists( - conf['model']['pred_batch_size'], - do_shuffle=False, - equal_size=True) + shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'], + do_shuffle=False, equal_size=True) for (i, shot_sublist) in enumerate(shot_sublists): X, y, shot_lengths, disr = loader.load_as_X_y_pred(shot_sublist) # load data and fit on data @@ -496,9 +450,8 @@ def make_predictions_and_evaluate_gpu( conf, shot_list, loader, custom_path) analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime, y_gold, disruptive) - shot_list.set_weights( - analyzer.get_shot_difficulty( - y_prime, y_gold, disruptive)) + shot_list.set_weights(analyzer.get_shot_difficulty( + y_prime, y_gold, disruptive)) loss = get_loss_from_list(y_prime, y_gold, conf['data']['target']) return y_prime, y_gold, disruptive, roc_area, loss @@ -528,10 +481,8 @@ def make_evaluations_gpu(conf, shot_list, loader): batch_size = min(len(shot_list), conf['model']['pred_batch_size']) pbar = Progbar(len(shot_list)) - print( - 'evaluating {} shots using batchsize {}'.format( - len(shot_list), - batch_size)) + print('evaluating {} shots using batchsize {}'.format( + len(shot_list), batch_size)) shot_sublists = shot_list.sublists(batch_size, equal_size=False) all_metrics = [] @@ -540,21 +491,16 @@ def make_evaluations_gpu(conf, shot_list, loader): batch_size = len(shot_sublist) model = specific_builder.build_model( True, custom_batch_size=batch_size) - model.compile( - optimizer=optimizer_class(), - loss=conf['data']['target'].loss) + model.compile(optimizer=optimizer_class(), + loss=conf['data']['target'].loss) specific_builder.load_model_weights(model) model.reset_states() X, y, shot_lengths, disr = loader.load_as_X_y_pred( shot_sublist, custom_batch_size=batch_size) # load data and fit on data - all_metrics.append( - model.evaluate( - X, - y, - batch_size=batch_size, - verbose=False)) + all_metrics.append(model.evaluate(X, y, batch_size=batch_size, + verbose=False)) all_weights.append(batch_size) model.reset_states() From f13f95b997b28dc967c23893129508d0ccc828d7 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 10 Oct 2019 15:29:45 -0500 Subject: [PATCH 584/744] Fix missing tensorflow import and lr definition in runner.py --- plasma/models/mpi_runner.py | 117 ++++++++++++------------------------ plasma/models/runner.py | 10 ++- 2 files changed, 49 insertions(+), 78 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 4a9b97d0..5cfab424 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -59,9 +59,8 @@ os.environ['KERAS_BACKEND'] = 'tensorflow' import tensorflow as tf from keras.backend.tensorflow_backend import set_session - gpu_options = tf.GPUOptions( - per_process_gpu_memory_fraction=0.95, - allow_growth=True) + gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95, + allow_growth=True) config = tf.ConfigProto(gpu_options=gpu_options) set_session(tf.Session(config=config)) else: @@ -206,10 +205,8 @@ def __init__(self, model, optimizer, comm, batch_iterator, batch_size, self.num_replicas = self.num_workers else: self.num_replicas = num_replicas - self.lr = ( - lr/(1.0 + self.num_replicas/100.0) if (lr < self.max_lr) - else self.max_lr/(1.0+self.num_replicas/100.0) - ) + self.lr = (lr/(1.0 + self.num_replicas/100.0) if (lr < self.max_lr) + else self.max_lr/(1.0 + self.num_replicas/100.0)) def set_batch_iterator_func(self): if (self.conf is not None @@ -238,22 +235,16 @@ def compile(self, optimizer, clipnorm, loss='mse'): if optimizer == 'sgd': optimizer_class = SGD(lr=self.DUMMY_LR, clipnorm=clipnorm) elif optimizer == 'momentum_sgd': - optimizer_class = SGD( - lr=self.DUMMY_LR, - clipnorm=clipnorm, - decay=1e-6, - momentum=0.9) + optimizer_class = SGD(lr=self.DUMMY_LR, clipnorm=clipnorm, + decay=1e-6, momentum=0.9) elif optimizer == 'tf_momentum_sgd': - optimizer_class = TFOptimizer( - tf.train.MomentumOptimizer( - learning_rate=self.DUMMY_LR, - momentum=0.9)) + optimizer_class = TFOptimizer(tf.train.MomentumOptimizer( + learning_rate=self.DUMMY_LR, momentum=0.9)) elif optimizer == 'adam': optimizer_class = Adam(lr=self.DUMMY_LR, clipnorm=clipnorm) elif optimizer == 'tf_adam': - optimizer_class = TFOptimizer( - tf.train.AdamOptimizer( - learning_rate=self.DUMMY_LR)) + optimizer_class = TFOptimizer(tf.train.AdamOptimizer( + learning_rate=self.DUMMY_LR)) elif optimizer == 'rmsprop': optimizer_class = RMSprop(lr=self.DUMMY_LR, clipnorm=clipnorm) elif optimizer == 'nadam': @@ -372,9 +363,8 @@ def sync_deltas(self, deltas, num_replicas=None): global_deltas = [] # default is to reduce the deltas from all workers for delta in deltas: - global_deltas.append( - self.mpi_average_gradients( - delta, num_replicas)) + global_deltas.append(self.mpi_average_gradients( + delta, num_replicas)) return global_deltas def set_new_weights(self, deltas, num_replicas=None): @@ -442,11 +432,8 @@ def build_callbacks(self, conf, callbacks_list): datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")))] if "earlystop" in callbacks_list: - callbacks += [ - cbks.EarlyStopping( - patience=patience, - monitor=monitor, - mode=mode)] + callbacks += [cbks.EarlyStopping( + patience=patience, monitor=monitor, mode=mode)] if "lr_scheduler" in callbacks_list: pass @@ -496,11 +483,8 @@ def train_epoch(self): t1 = 0 t2 = 0 - while ( - self.num_so_far - - self.epoch - * num_total) < num_total or step < self.num_batches_minimum: - + while ((self.num_so_far - self.epoch * num_total) < num_total + or step < self.num_batches_minimum): try: (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, num_total, is_warmup_period) = next(batch_iterator_func) @@ -531,9 +515,8 @@ def train_epoch(self): batch_xs, batch_ys, verbose) self.comm.Barrier() sys.stdout.flush() - print_unique( - 'Compilation finished in {:.2f}s'.format( - time.time()-t0_comp)) + print_unique('Compilation finished in {:.2f}s'.format( + time.time()-t0_comp)) t_start = time.time() sys.stdout.flush() @@ -548,7 +531,6 @@ def train_epoch(self): self.set_new_weights(deltas, num_replicas) t2 = time.time() write_str_0 = self.calculate_speed(t0, t1, t2, num_replicas) - curr_loss = self.mpi_average_scalars(1.0*loss, num_replicas) # if self.task_index == 0: # print(self.model.get_weights()[0][0][:4]) @@ -606,18 +588,13 @@ def calculate_speed(self, t0, t_after_deltas, t_after_update, num_replicas, frac_calculate = t_calculate/t_tot frac_sync = t_sync/t_tot - print_str = ( - '{:.2E} Examples/sec | {:.2E} sec/batch '.format(examples_per_sec, - t_tot) - + '[{:.1%} calc., {:.1%} synch.]'.format(frac_calculate, - frac_sync)) + print_str = ('{:.2E} Examples/sec | {:.2E} sec/batch '.format( + examples_per_sec, t_tot) + + '[{:.1%} calc., {:.1%} synch.]'.format( + frac_calculate, frac_sync)) print_str += '[batch = {} = {}*{}] [lr = {:.2E} = {:.2E}*{}]'.format( - effective_batch_size, - self.batch_size, - num_replicas, - self.get_effective_lr(num_replicas), - self.lr, - num_replicas) + effective_batch_size, self.batch_size, num_replicas, + self.get_effective_lr(num_replicas), self.lr, num_replicas) if verbose: print_unique(print_str) return print_str @@ -653,11 +630,9 @@ def get_shot_list_path(conf): def save_shotlists(conf, shot_list_train, shot_list_validate, shot_list_test): path = get_shot_list_path(conf) - np.savez( - path, - shot_list_train=shot_list_train, - shot_list_validate=shot_list_validate, - shot_list_test=shot_list_test) + np.savez(path, shot_list_train=shot_list_train, + shot_list_validate=shot_list_validate, + shot_list_test=shot_list_test) def load_shotlists(conf): @@ -696,11 +671,8 @@ def mpi_make_predictions(conf, shot_list, loader, custom_path=None): model.reset_states() if task_index == 0: pbar = Progbar(len(shot_list)) - shot_sublists = shot_list.sublists( - conf['model']['pred_batch_size'], - do_shuffle=False, - equal_size=True) - + shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'], + do_shuffle=False, equal_size=True) y_prime_global = [] y_gold_global = [] disruptive_global = [] @@ -708,7 +680,6 @@ def mpi_make_predictions(conf, shot_list, loader, custom_path=None): loader.verbose = False for (i, shot_sublist) in enumerate(shot_sublists): - if i % num_workers == task_index: X, y, shot_lengths, disr = loader.load_as_X_y_pred(shot_sublist) @@ -756,8 +727,7 @@ def mpi_make_predictions_and_evaluate(conf, shot_list, loader, analyzer = PerformanceAnalyzer(conf=conf) roc_area = analyzer.get_roc_area(y_prime, y_gold, disruptive) shot_list.set_weights( - analyzer.get_shot_difficulty( - y_prime, y_gold, disruptive)) + analyzer.get_shot_difficulty(y_prime, y_gold, disruptive)) loss = get_loss_from_list(y_prime, y_gold, conf['data']['target']) return y_prime, y_gold, disruptive, roc_area, loss @@ -826,20 +796,15 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, mpi_model = MPIModel(train_model, optimizer, comm, batch_generator, batch_size, lr=lr, warmup_steps=warmup_steps, num_batches_minimum=num_batches_minimum, conf=conf) - mpi_model.compile( - conf['model']['optimizer'], - clipnorm, - conf['data']['target'].loss) - + mpi_model.compile(conf['model']['optimizer'], clipnorm, + conf['data']['target'].loss) tensorboard = None if backend != "theano" and task_index == 0: tensorboard_save_path = conf['paths']['tensorboard_save_path'] write_grads = conf['callbacks']['write_grads'] - tensorboard = TensorBoard( - log_dir=tensorboard_save_path, - histogram_freq=1, - write_graph=True, - write_grads=write_grads) + tensorboard = TensorBoard(log_dir=tensorboard_save_path, + histogram_freq=1, write_graph=True, + write_grads=write_grads) tensorboard.set_model(mpi_model.model) mpi_model.model.summary() @@ -905,8 +870,8 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss epoch_logs['train_loss'] = ave_loss - best_so_far = cmp_fn( - epoch_logs[conf['callbacks']['monitor']], best_so_far) + best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']], + best_so_far) if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) @@ -992,9 +957,8 @@ def set_model(self, model): def is_indexed_slices(grad): return type(grad).__name__ == 'IndexedSlices' - grads = [ - grad.values if is_indexed_slices(grad) else grad - for grad in grads] + grads = [grad.values if is_indexed_slices(grad) else + grad for grad in grads] for grad in grads: tf.summary.histogram( '{}_grad'.format(mapped_weight_name), grad) @@ -1023,8 +987,7 @@ def on_epoch_end(self, val_generator, val_steps, epoch, logs=None): self.writer.add_summary(summary, epoch) self.writer.flush() - tensors = (self.model.inputs - + self.model.targets + tensors = (self.model.inputs + self.model.targets + self.model.sample_weights) if self.model.uses_learning_phase: diff --git a/plasma/models/runner.py b/plasma/models/runner.py index f616f54a..5b3f1d5a 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -87,6 +87,9 @@ def train(conf, shot_list_train, shot_list_validate, loader, print('\nEpoch {}/{}'.format(e+1, num_epochs)) pbar = Progbar(len(shot_list_train)) + # TODO(KGF): check this fix; lr, tf were undefined in neglected + # serial runner.py, since mpi_runner.py has been the main tool + lr = conf['model']['lr'] # decay learning rate each epoch: K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) @@ -175,6 +178,9 @@ def train(conf, shot_list_train, shot_list_validate, loader, def optimizer_class(): from keras.optimizers import SGD, Adam, RMSprop, Nadam, TFOptimizer + # TODO(KGF): check this fix; lr, tf were undefined in neglected + # serial runner.py, since mpi_runner.py has been the main tool + import tensorflow as tf if conf['model']['optimizer'] == 'sgd': return SGD(lr=conf['model']['lr'], clipnorm=conf['model']['clipnorm']) @@ -241,7 +247,9 @@ def keras_fmin_fnct(self, space): shot_list_train.shuffle() shot_sublists = shot_list_train.sublists(num_at_once)[:1] training_losses_tmp = [] - + # TODO(KGF): check this fix; lr, tf were undefined in neglected + # serial runner.py, since mpi_runner.py has been the main tool + lr = conf['model']['lr'] K.set_value(train_model.optimizer.lr, lr*lr_decay**(e)) for (i, shot_sublist) in enumerate(shot_sublists): X_list, y_list = self.loader.load_as_X_y_list(shot_sublist) From f10ec50938368128708ee500be4912dba2eaa00a Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 10 Oct 2019 16:43:39 -0400 Subject: [PATCH 585/744] Ignore output files from cluster job schedulers --- .gitignore | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.gitignore b/.gitignore index 139f148f..0125b4ab 100644 --- a/.gitignore +++ b/.gitignore @@ -95,3 +95,16 @@ ENV/ # Rope project settings .ropeproject + +# Job scheduler output +# Slurm +*.out + +# Cobalt +*.output +*.error +*.cobaltlog + +# PBS +# *.o* +# *.e* \ No newline at end of file From 3ec70373f6a741b37a88ed2a67fec4c7197f853b Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Mon, 14 Oct 2019 15:30:10 -0400 Subject: [PATCH 586/744] Install scikit-learn, not dummy sklearn, from pip See https://github.com/scikit-learn/scikit-learn/issues/8215#issue-201818378 --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5c8fec7f..8df361cd 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,9 @@ 'matplotlib==2.0.2', 'hyperopt', 'mpi4py', - 'xgboost'], + 'xgboost', + 'scikit-learn', + ], tests_require=[], classifiers=["Development Status :: 3 - Alpha", "Environment :: Console", From 32af980b231f9b52e31cbcabfb2148c8f2f31c84 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 15 Oct 2019 10:48:46 -0400 Subject: [PATCH 587/744] Return default conf.yaml to use shallow=False --- examples/conf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index b9116a5c..2b977191 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -57,7 +57,7 @@ model: loss_scale_factor: 1.0 use_batch_norm: false torch: False - shallow: True + shallow: False shallow_model: num_samples: 1000000 #1000000 #the number of samples to use for training type: "xgboost" #"xgboost" #"xgboost" #"random_forest" "xgboost" From 3942ddcbad7434c1651dedb4bff2754062190212 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 15 Oct 2019 10:06:02 -0500 Subject: [PATCH 588/744] Import joblib module directly, not through sklearn Starting with scikit-learn v0.21.0 (2019-05-09), Joblib is no longer vendored in scikit-learn, and becomes a dependency. Minimal supported version is joblib 0.11, however using version >= 0.13 is strongly recommended Addresses warning from shallow_runner.py: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+. --- plasma/models/shallow_runner.py | 2 +- setup.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 84e6121a..77fe074e 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -3,7 +3,7 @@ import keras.callbacks as cbks from sklearn.metrics import classification_report # accuracy_score, auc, confusion_matrix -from sklearn.externals import joblib +import joblib from sklearn.ensemble import RandomForestClassifier import hashlib from plasma.utils.downloading import makedirs_process_safe diff --git a/setup.py b/setup.py index 8df361cd..3f6b58ce 100644 --- a/setup.py +++ b/setup.py @@ -33,6 +33,7 @@ 'mpi4py', 'xgboost', 'scikit-learn', + 'joblib', ], tests_require=[], classifiers=["Development Status :: 3 - Alpha", From c410f2ae3888ab378d674d3f85b15e7a302b5718 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 15 Oct 2019 18:05:31 -0400 Subject: [PATCH 589/744] Fix shallow_runner.py; ttd is not imported from plasma.utils.evaluation --- plasma/models/shallow_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 77fe074e..5d459a43 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -8,7 +8,7 @@ import hashlib from plasma.utils.downloading import makedirs_process_safe # from plasma.utils.state_reset import reset_states -from plasma.utils.evaluation import ttd, get_loss_from_list +from plasma.utils.evaluation import get_loss_from_list from plasma.utils.performance import PerformanceAnalyzer # from plasma.models.loader import Loader, ProcessGenerator # from plasma.conf import conf @@ -156,7 +156,7 @@ def get_X(self, shot): shot.ttd = np.expand_dims(shot.ttd, axis=1) length = sig_sample.shape[0] if length < self.timesteps: - print(ttd, shot, shot.number) + print(shot.ttd, shot.number) print("Shot must be at least as long as the RNN length.") exit(1) assert(len(sig_sample.shape) == len(shot.ttd.shape) == 2) From d7ad340a01200f0e66a57c4b883951d1911a57fe Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 15 Oct 2019 18:06:14 -0400 Subject: [PATCH 590/744] Fix bug introduced by #39 in mpi_runner.py In jdev branch, instead of broadcasting the class member mpi_model.model.stop_training directly, a conditional based on hasattr() was added to bind the value to a local variable "stop_training" for broadcast, which was undefined on MPI ranks other than the master rank 0. Set local variable to default False on all ranks --- plasma/models/mpi_runner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 5cfab424..db5e0d67 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -568,9 +568,9 @@ def estimate_remaining_time(self, time_so_far, work_so_far, work_total): def get_effective_lr(self, num_replicas): effective_lr = self.lr * num_replicas if effective_lr > self.max_lr: - print_unique('Warning: effective learning rate set to {}, '.format( - effective_lr) + 'larger than maximum {}. Clipping.'.format( - self.max_lr)) + print_unique( + 'Warning: effective learning rate set to {}, '.format(effective_lr) + + 'larger than maximum {}. Clipping.'.format(self.max_lr)) effective_lr = self.max_lr return effective_lr @@ -872,7 +872,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, epoch_logs['train_loss'] = ave_loss best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']], best_so_far) - + stop_training = False if task_index == 0: print('=========Summary======== for epoch{}'.format(step)) print('Training Loss numpy: {:.3e}'.format(ave_loss)) From f8b2cbb76511688f30dc4f01dc8eb8ac6bdf30b3 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 15 Oct 2019 18:14:34 -0400 Subject: [PATCH 591/744] Only build the master branch (and PRs) on Travis CI --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d16ec7c2..31c7f70b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: python - +branches: + only: + - master os: - linux From 69f59c9c90a220234daf82f9b47e645d23f4ae44 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 15 Oct 2019 18:18:53 -0400 Subject: [PATCH 592/744] Undo formatting change --- plasma/models/mpi_runner.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index db5e0d67..e3807709 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -568,9 +568,9 @@ def estimate_remaining_time(self, time_so_far, work_so_far, work_total): def get_effective_lr(self, num_replicas): effective_lr = self.lr * num_replicas if effective_lr > self.max_lr: - print_unique( - 'Warning: effective learning rate set to {}, '.format(effective_lr) - + 'larger than maximum {}. Clipping.'.format(self.max_lr)) + print_unique('Warning: effective learning rate set to {}, '.format( + effective_lr) + 'larger than maximum {}. Clipping.'.format( + self.max_lr)) effective_lr = self.max_lr return effective_lr From 24de29b5daedd47ece9ae2cb0e5c88f8ca0a4de0 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 16 Oct 2019 10:32:42 -0500 Subject: [PATCH 593/744] Update module versions, X11 info, OpenMPI BTL https://www.open-mpi.org/faq/?category=openfabrics#ib-btl NOTE: Prior versions of Open MPI used an sm BTL for shared memory. sm was effectively replaced with vader starting in Open MPI v3.0.0. Switching to "vader" BTL from "sm" prevents runtime error: # -------------------------------------------------------------------------- # As of version 3.0.0, the "sm" BTL is no longer available in Open MPI. # Efficient, high-speed same-node shared memory communication support in # Open MPI is available in the "vader" BTL. To use the vader BTL, you # can re-run your job with: # mpirun --mca btl vader,self,... your_mpi_application # -------------------------------------------------------------------------- --- docs/PrincetonUTutorial.md | 46 +++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index b9a97565..7da0f44e 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -1,4 +1,5 @@ ## Tutorials +*Last updated 2019-10-16* ### Login to TigerGPU @@ -6,6 +7,7 @@ First, login to TigerGPU cluster headnode via ssh: ``` ssh -XC @tigergpu.princeton.edu ``` +Note, `-XC` is optional; it is only necessary if you are planning on performing remote visualization, e.g. the output `.png` files from the below [section](#Learning-curves-and-ROC-per-epoch). Trusted X11 forwarding can be used with `-Y` instead of `-X` and may prevent timeouts, but it disables X11 SECURITY extension controls. Compression `-C` reduces the bandwidth usage and may be useful on slow connections. ### Sample usage on TigerGPU @@ -15,21 +17,29 @@ git clone https://github.com/PPPLDeepLearning/plasma-python cd plasma-python ``` -After that, create an isolated Anaconda environment and load CUDA drivers: +After that, create an isolated Anaconda environment and load CUDA drivers, an MPI compiler, and the HDF5 library: ``` #cd plasma-python -module load anaconda3/4.4.0 +module load anaconda3 conda create --name my_env --file requirements-travis.txt source activate my_env -export OMPI_MCA_btl="tcp,self,sm" -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.5.239 +export OMPI_MCA_btl="tcp,self,vader" +# replace "vader" with "sm" for OpenMPI versions prior to 3.0.0 +module load cudatoolkit cudann +module load openmpi/cuda-8.0/intel-17.0/3.0.0/64 +module load intel +module load hdf5/intel-17.0/intel-mpi/1.10.0 +``` +As of the latest update of this document, the above modules correspond to the following versions on the TigerGPU system, given by `module list`: +``` +Currently Loaded Modulefiles: + 1) anaconda3/2019.3 4) openmpi/cuda-8.0/intel-17.0/3.0.0/64 7) hdf5/intel-17.0/intel-mpi/1.10.0 + 2) cudatoolkit/10.1 5) intel-mkl/2019.3/3/64 + 3) cudnn/cuda-9.2/7.6.3 6) intel/19.0/64/19.0.3.199 ``` -and install the `plasma-python` package: +Next, install the `plasma-python` package: ```bash #source activate my_env @@ -44,7 +54,7 @@ Common issue is Intel compiler mismatch in the `PATH` and what you use in the mo you should see something like this: ``` $ which mpicc -/usr/local/openmpi/cuda-8.0/2.1.0/intel170/x86_64/bin/mpicc +/usr/local/openmpi/cuda-8.0/3.0.0/intel170/x86_64/bin/mpicc ``` If you source activate the Anaconda environment after loading the openmpi, you would pick the MPI from Anaconda, which is not good and could lead to errors. @@ -93,20 +103,20 @@ For batch analysis, make sure to allocate 1 MPI process per GPU. Save the follow #SBATCH -c 4 #SBATCH --mem-per-cpu=0 -module load anaconda3/4.4.0 +module load anaconda3 source activate my_env -export OMPI_MCA_btl="tcp,self,sm" -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 +export OMPI_MCA_btl="tcp,self,vader" +module load cudatoolkit cudann +module load openmpi/cuda-8.0/intel-17.0/3.0.0/64 +module load intel +module load hdf5/intel-17.0/intel-mpi/1.10.0 srun python mpi_learn.py ``` where `X` is the number of nodes for distibuted training. -Submit the job with: +Submit the job with (assuming you are still in the `examples/` subdirectory): ```bash #cd examples sbatch slurm.cmd @@ -131,7 +141,7 @@ where the number of GPUs is X * 4. Then launch the application from the command line: ```bash -mpirun -npernode 4 python examples/mpi_learn.py +mpirun -npernode 4 python mpi_learn.py ``` ### Understanding the data @@ -205,7 +215,7 @@ python -m tensorflow.tensorboard --logdir /mnt/ Date: Wed, 16 Oct 2019 11:37:46 -0500 Subject: [PATCH 594/744] Add comments about the mpirun vs. srun behavior --- docs/PrincetonUTutorial.md | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index 7da0f44e..37709662 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -1,5 +1,5 @@ ## Tutorials -*Last updated 2019-10-16* +*Last updated 2019-10-16.* ### Login to TigerGPU @@ -57,13 +57,13 @@ $ which mpicc /usr/local/openmpi/cuda-8.0/3.0.0/intel170/x86_64/bin/mpicc ``` -If you source activate the Anaconda environment after loading the openmpi, you would pick the MPI from Anaconda, which is not good and could lead to errors. +If you `source activate` the Anaconda environment **after** loading the OpenMPI library, your application would be built with the MPI library from Anaconda, which has worse performance on this cluster and could lead to errors. See [On Computing Well: Installing and Running ‘mpi4py’ on the Cluster](https://oncomputingwell.princeton.edu/2018/11/installing-and-running-mpi4py-on-the-cluster/) for a related discussion. #### Location of the data on Tigress -The JET and D3D datasets containing multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions are located on `/tigress/FRNN` filesystem on Princeton U clusters. -Fo convenience, create following symbolic links: +The JET and D3D datasets contain multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions. The datasets are located in the `/tigress/FRNN` project directory of the [GPFS](https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsights.product.doc/doc/bi_gpfs_overview.html) filesystem on Princeton University clusters. +For convenience, create following symbolic links: ```bash cd /tigress/ ln -s /tigress/FRNN/shot_lists shot_lists @@ -76,14 +76,14 @@ ln -s /tigress/FRNN/signal_data signal_data cd examples/ python guarantee_preprocessed.py ``` -This will preprocess the data and save it in `/tigress//processed_shots`, `/tigress//processed_shotlists` and `/tigress//normalization` +This will preprocess the data and save rescaled copies of the signals in `/tigress//processed_shots`, `/tigress//processed_shotlists` and `/tigress//normalization` You would only have to run preprocessing once for each dataset. The dataset is specified in the config file `examples/conf.yaml`: ```yaml paths: data: jet_data_0D ``` -It take takes about 20 minutes to preprocess in parallel and can normally be done on the cluster headnode. +Preprocessing this dataset takes about 20 minutes to preprocess in parallel and can normally be done on the cluster headnode. #### Training and inference @@ -91,7 +91,7 @@ Use Slurm scheduler to perform batch or interactive analysis on TigerGPU cluster ##### Batch analysis -For batch analysis, make sure to allocate 1 MPI process per GPU. Save the following to slurm.cmd file (or make changes to the existing `examples/slurm.cmd`): +For batch analysis, make sure to allocate 1 MPI process per GPU. Save the following to `slurm.cmd` file (or make changes to the existing `examples/slurm.cmd`): ```bash #!/bin/bash @@ -114,7 +114,9 @@ module load hdf5/intel-17.0/intel-mpi/1.10.0 srun python mpi_learn.py ``` -where `X` is the number of nodes for distibuted training. +where `X` is the number of nodes for distibuted training and the total number of GPUs is `X * 4`. This configuration guarantees 1 MPI process per GPU, regardless of the value of `X`. + +Update the `num_gpus` value in `conf.yaml` to correspond to the total number of GPUs specified for your Slurm allocation. Submit the job with (assuming you are still in the `examples/` subdirectory): ```bash @@ -126,7 +128,11 @@ And monitor it's completion via: ```bash squeue -u ``` -Optionally, add an email notification option in the Slurm about the job completion. +Optionally, add an email notification option in the Slurm configuration about the job completion: +``` +#SBATCH --mail-user=@princeton.edu +#SBATCH --mail-type=ALL +``` ##### Interactive analysis @@ -136,13 +142,18 @@ The workflow is to request an interactive session: ```bash salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -c 4 --mem-per-cpu=0 -t 0-6:00 ``` -where the number of GPUs is X * 4. - -Then launch the application from the command line: +Then, launch the application from the command line: ```bash -mpirun -npernode 4 python mpi_learn.py +mpirun -N 4 python mpi_learn.py ``` +where `-N` is a synonym for `-npernode` in OpenMPI. Do **not** use `srun` to launch the job inside an interactive session. +[//]: # (This option appears to be redundant given the salloc options; "mpirun python mpi_learn.py" appears to work just the same. HOWEVER, "srun python mpi_learn.py", "srun --ntasks-per-node python mpi_learn.py", etc. NEVER works--- it just hangs without any output. Why?) + +[//]: # (Consistent with https://www.open-mpi.org/faq/?category=slurm ?) + +[//]: # (certain output seems to be repeated by ntasks-per-node, e.g. echoing the conf.yaml. Expected?) + ### Understanding the data From c76ce9865347d5ae9c95073e2439d4ffbdc7e1f2 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 16 Oct 2019 12:13:56 -0500 Subject: [PATCH 595/744] Update PrincetonUTutorial.md - "conda activate" is preferred to "source activate since v4.4 (December 2017) https://www.anaconda.com/how-to-get-ready-for-the-release-of-conda-4-4/ - Replace "python -m tensorflow.tensorboard ..." with "python -m tensorboard.main" (when / which version changed this?) --- docs/PrincetonUTutorial.md | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index 37709662..71402a17 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -22,7 +22,7 @@ After that, create an isolated Anaconda environment and load CUDA drivers, an MP #cd plasma-python module load anaconda3 conda create --name my_env --file requirements-travis.txt -source activate my_env +conda activate my_env export OMPI_MCA_btl="tcp,self,vader" # replace "vader" with "sm" for OpenMPI versions prior to 3.0.0 @@ -42,7 +42,7 @@ Currently Loaded Modulefiles: Next, install the `plasma-python` package: ```bash -#source activate my_env +#conda activate my_env python setup.py install ``` @@ -57,7 +57,7 @@ $ which mpicc /usr/local/openmpi/cuda-8.0/3.0.0/intel170/x86_64/bin/mpicc ``` -If you `source activate` the Anaconda environment **after** loading the OpenMPI library, your application would be built with the MPI library from Anaconda, which has worse performance on this cluster and could lead to errors. See [On Computing Well: Installing and Running ‘mpi4py’ on the Cluster](https://oncomputingwell.princeton.edu/2018/11/installing-and-running-mpi4py-on-the-cluster/) for a related discussion. +If you `conda activate` the Anaconda environment **after** loading the OpenMPI library, your application would be built with the MPI library from Anaconda, which has worse performance on this cluster and could lead to errors. See [On Computing Well: Installing and Running ‘mpi4py’ on the Cluster](https://oncomputingwell.princeton.edu/2018/11/installing-and-running-mpi4py-on-the-cluster/) for a related discussion. #### Location of the data on Tigress @@ -104,7 +104,7 @@ For batch analysis, make sure to allocate 1 MPI process per GPU. Save the follow #SBATCH --mem-per-cpu=0 module load anaconda3 -source activate my_env +conda activate my_env export OMPI_MCA_btl="tcp,self,vader" module load cudatoolkit cudann module load openmpi/cuda-8.0/intel-17.0/3.0.0/64 @@ -148,7 +148,10 @@ Then, launch the application from the command line: mpirun -N 4 python mpi_learn.py ``` where `-N` is a synonym for `-npernode` in OpenMPI. Do **not** use `srun` to launch the job inside an interactive session. -[//]: # (This option appears to be redundant given the salloc options; "mpirun python mpi_learn.py" appears to work just the same. HOWEVER, "srun python mpi_learn.py", "srun --ntasks-per-node python mpi_learn.py", etc. NEVER works--- it just hangs without any output. Why?) + +[//]: # (This option appears to be redundant given the salloc options; "mpirun python mpi_learn.py" appears to work just the same.) + +[//]: # (HOWEVER, "srun python mpi_learn.py", "srun --ntasks-per-node python mpi_learn.py", etc. NEVER works--- it just hangs without any output. Why?) [//]: # (Consistent with https://www.open-mpi.org/faq/?category=slurm ?) @@ -210,20 +213,23 @@ A regular FRNN run will produce several outputs and callbacks. Currently supports graph visualization, histograms of weights, activations and biases, and scalar variable summaries of losses and accuracies. -The summaries are written real time to `/tigress//Graph`. For MacOS, you can set up the `sshfs` mount of /tigress filesystem and view those summaries in your browser. +The summaries are written in real time to `/tigress//Graph`. For macOS, you can set up the `sshfs` mount of the `/tigress` filesystem and view those summaries in your browser. -For Mac, you could follow the instructions here: +To install SSHFS on a macOS system, you could follow the instructions here: https://github.com/osxfuse/osxfuse/wiki/SSHFS +Or use [Homebrew](https://brew.sh/), `brew cask install osxfuse; brew install sshfs`. Note, to install and/or use `osxfuse` you may need to enable its kernel extension in: System Preferences → Security & Privacy → General then do something like: ``` -sshfs -o allow_other,defer_permissions netid@tigergpu.princeton.edu:/tigress/netid/ /mnt// +sshfs -o allow_other,defer_permissions netid@tigergpu.princeton.edu:/tigress// / ``` -Launch TensorBoard locally: +Launch TensorBoard locally (assuming that it is installed on your local computer): ``` -python -m tensorflow.tensorboard --logdir /mnt//Graph +python -m tensorboard.main --logdir /Graph ``` +A URL should be emitted to the console output. Navigate to this link in your browser. If the TensorBoard interface does not open, try directing your browser to `localhost:6006`. + You should see something like: ![tensorboard example](https://github.com/PPPLDeepLearning/plasma-python/blob/master/docs/tb.png) @@ -237,7 +243,7 @@ python performance_analysis.py ``` this uses the resulting file produced as a result of training the neural network as an input, and produces several `.png` files with plots as an output. -In addition, you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress/netid/csv_logs` (each run will produce a new log file with a timestamp in name). +In addition, you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress//csv_logs` (each run will produce a new log file with a timestamp in name). A sample code to analyze can be found in `examples/notebooks`. For instance: @@ -266,5 +272,4 @@ show(p, notebook_handle=True) ### Learning curve summaries per mini-batch -To extract per mini-batch summaries, use the output produced by FRNN logged to the standard out (in case of the batch jobs, it will all be contained in the Slurm output file). Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: -https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb +To extract per mini-batch summaries, use the output produced by FRNN logged to the standard out (in case of the batch jobs, it will all be contained in the Slurm output file). Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: [FRNN_scaling.ipynb](https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb) From 8756dda3bf3506284d0fb915b263ed0167d46a40 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 16 Oct 2019 12:14:27 -0500 Subject: [PATCH 596/744] Update PrincetonUTutorial.md --- docs/PrincetonUTutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index 71402a17..0e9f35d5 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -252,7 +252,7 @@ import pandas as pd import numpy as np from bokeh.plotting import figure, show, output_file, save -data = pd.read_csv("/mnt//csv_logs/.csv") +data = pd.read_csv("/csv_logs/.csv") from bokeh.io import output_notebook output_notebook() From 5dd58c81837d46bacf65bc76d60193eec47253f6 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 16 Oct 2019 14:27:43 -0400 Subject: [PATCH 597/744] Update module versions, etc. in slurm.cmd Make the script consistent with https://github.com/PPPLDeepLearning/plasma-python/blob/master/docs/PrincetonUTutorial.md --- examples/slurm.cmd | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index 1e22ad99..3dcae884 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -1,25 +1,29 @@ #!/bin/bash #SBATCH -t 01:00:00 -#SBATCH -N 3 +#SBATCH -N 4 #SBATCH --ntasks-per-node=4 #SBATCH --ntasks-per-socket=2 #SBATCH --gres=gpu:4 #SBATCH -c 4 #SBATCH --mem-per-cpu=0 -module load anaconda/4.4.0 -source activate PPPL -module load cudatoolkit/8.0 -module load cudnn/cuda-8.0/6.0 -module load openmpi/cuda-8.0/intel-17.0/2.1.0/64 -module load intel/17.0/64/17.0.4.196 +# Example Slurm configuration for TigerGPU nodes (4 nodes, 16 GPUs total) +# Each node = 2.4 GHz Xeon Broadwell E5-2680 v4 + 4x 1328 MHz P100 GPU -#remove checkpoints for a benchmark run -rm /scratch/gpfs/$USER/model_checkpoints/* -rm /scratch/gpfs/$USER/results/* -rm /scratch/gpfs/$USER/csv_logs/* -rm /scratch/gpfs/$USER/Graph/* -rm /scratch/gpfs/$USER/normalization/* +module load anaconda3 +conda activate my_env +module load cudatoolkit +module load cudnn +module load openmpi/cuda-8.0/intel-17.0/3.0.0/64 +module load intel/19.0/64/19.0.3.199 +module load hdf5/intel-17.0/intel-mpi/1.10.0 -export OMPI_MCA_btl="tcp,self,sm" +# remove checkpoints for a benchmark run +rm /tigress/$USER/model_checkpoints/* +rm /tigress/$USER/results/* +rm /tigress/$USER/csv_logs/* +rm /tigress/$USER/Graph/* +rm /tigress/$USER/normalization/* + +export OMPI_MCA_btl="tcp,self,vader" srun python mpi_learn.py From 2c4143ab6902c381bc7d87cb74fd2e3d6e70bde3 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 16 Oct 2019 15:01:49 -0400 Subject: [PATCH 598/744] Only call batch_iterator_func.__exit__() if defined in conf.yaml Another bug introduced in #39 merging "jdev" branch. Originally, MPIModel class member "batch_iterator_func" was unconditionally set to ProcessGenerator(self.batch_iterator()). Now, may only be set to self.batch_iterator() if conf['training']['use_process_generator'] == False --- examples/slurm.cmd | 2 +- plasma/models/mpi_runner.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index 3dcae884..65272017 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -11,7 +11,7 @@ # Each node = 2.4 GHz Xeon Broadwell E5-2680 v4 + 4x 1328 MHz P100 GPU module load anaconda3 -conda activate my_env +conda activate frnn-tf13.1 module load cudatoolkit module load cudnn module load openmpi/cuda-8.0/intel-17.0/3.0.0/64 diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index e3807709..e1d55ba6 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -217,7 +217,10 @@ def set_batch_iterator_func(self): self.batch_iterator_func = self.batch_iterator() def close(self): - self.batch_iterator_func.__exit__() + if (self.conf is not None + and 'use_process_generator' in conf['training'] + and conf['training']['use_process_generator']): + self.batch_iterator_func.__exit__() def set_lr(self, lr): self.lr = lr @@ -918,6 +921,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, def get_stop_training(callbacks): + # TODO(KGF): this funciton is unused for cb in callbacks.callbacks: if isinstance(cb, cbks.EarlyStopping): print("Checking for early stopping") From e0e347485d71fca8adf9416126241f8ebf7435be Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 17 Oct 2019 11:00:34 -0400 Subject: [PATCH 599/744] Revert conda env name change in parent commit [skip ci] --- examples/slurm.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/slurm.cmd b/examples/slurm.cmd index 65272017..3dcae884 100644 --- a/examples/slurm.cmd +++ b/examples/slurm.cmd @@ -11,7 +11,7 @@ # Each node = 2.4 GHz Xeon Broadwell E5-2680 v4 + 4x 1328 MHz P100 GPU module load anaconda3 -conda activate frnn-tf13.1 +conda activate my_env module load cudatoolkit module load cudnn module load openmpi/cuda-8.0/intel-17.0/3.0.0/64 From 1ed2ca0300a4a079775a0f6a78d08ed894cb2c89 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 17 Oct 2019 11:22:02 -0500 Subject: [PATCH 600/744] Add more details about SSHFS mounting --- docs/PrincetonUTutorial.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index 0e9f35d5..c1b74c15 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -213,16 +213,17 @@ A regular FRNN run will produce several outputs and callbacks. Currently supports graph visualization, histograms of weights, activations and biases, and scalar variable summaries of losses and accuracies. -The summaries are written in real time to `/tigress//Graph`. For macOS, you can set up the `sshfs` mount of the `/tigress` filesystem and view those summaries in your browser. +The summaries are written in real time to `/tigress//Graph`. For macOS, you can set up the `sshfs` mount of the [`/tigress`](https://researchcomputing.princeton.edu/storage/tigress) filesystem and view those summaries in your browser. To install SSHFS on a macOS system, you could follow the instructions here: https://github.com/osxfuse/osxfuse/wiki/SSHFS Or use [Homebrew](https://brew.sh/), `brew cask install osxfuse; brew install sshfs`. Note, to install and/or use `osxfuse` you may need to enable its kernel extension in: System Preferences → Security & Privacy → General -then do something like: +After installation, execute: ``` sshfs -o allow_other,defer_permissions netid@tigergpu.princeton.edu:/tigress// / ``` +The local destination folder may be an existing (possibly nonempty) folder. If it does not exist, SSHFS will create the folder. You can confirm that the operation succeeded via the `mount` command, which prints the list of currently mounted filesystems if no arguments are given. Launch TensorBoard locally (assuming that it is installed on your local computer): ``` @@ -234,6 +235,19 @@ You should see something like: ![tensorboard example](https://github.com/PPPLDeepLearning/plasma-python/blob/master/docs/tb.png) +When you are finished with analyzing the summaries in TensorBoard, you may wish to unmount the remote filesystem: +``` +umount +``` +The local destination folder will remain present, but it will no longer contain the remote files. It will be returned to its previous state, either empty or containing the original local files. Note, the `umount` command is appropriate for macOS systems; some Linux systems instead offer the `fusermount` command. + +These commands may be useful when the SSH connection is lost and an existing mount point cannot be re-mounted, e.g. errors such as: +``` +mount_osxfuse: mount point is itself on a OSXFUSE volume +``` + +More aggressive options such as `umount -f ` and alternative approaches may be necessary; see [discussion here](https://github.com/osxfuse/osxfuse/issues/45#issuecomment-21943107). + #### Learning curves and ROC per epoch Besides TensorBoard summaries you can produce the ROC curves for validation and test data as well as visualizations of shots: From 575b8350694b977780a0159e194bead3c003efca Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 17 Oct 2019 15:25:45 -0400 Subject: [PATCH 601/744] Need to use allow_pickle=True when loading data in performance.py --- plasma/utils/performance.py | 52 ++++++++++++------------------------- 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/plasma/utils/performance.py b/plasma/utils/performance.py index 5699bc62..b4edf9cd 100644 --- a/plasma/utils/performance.py +++ b/plasma/utils/performance.py @@ -359,10 +359,9 @@ def load_ith_file(self): results_files = os.listdir(self.results_dir) print(results_files) dat = np.load(self.results_dir + results_files[self.i], - allow_pickle=False) + allow_pickle=True) print("Loading results file {}".format( self.results_dir + results_files[self.i])) - if self.verbose: print('configuration: {} '.format(dat['conf'])) @@ -399,7 +398,7 @@ def assert_same_lists(self, shot_list, truth_arr, disr_arr): print(shot_list.shots[i].number) print((s.shape, truth_arr[i].shape, disr_arr[i])) assert(truth_arr[i].shape[0] == s.shape[0]-30) - print("Same Shape!") + print("Same shape!") def print_conf(self): pprint(self.saved_conf) @@ -505,26 +504,23 @@ def compute_tradeoffs_and_print(self, mode): P_thresh_opt = P_thresh_range[idx] self.summarize_shot_prediction_stats_by_mode( P_thresh_opt, mode, verbose=True) - print( - '============= AT P_THRESH = {} ============='.format( - P_thresh_opt)) + print('============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: print('No such P_thresh found') print('') # last index where for missed_thresh in missed_threshs: - print( - '============= MISSED RATE < {} ============='.format( - missed_thresh)) + print('============= MISSED RATE < {} ============='.format( + missed_thresh)) if(any(missed_range < missed_thresh)): idx = np.where(missed_range <= missed_thresh)[0][-1] P_thresh_opt = P_thresh_range[idx] self.summarize_shot_prediction_stats_by_mode( P_thresh_opt, mode, verbose=True) - print( - '============= AT P_THRESH = {} ============='.format( - P_thresh_opt)) + print('============= AT P_THRESH = {} ============='.format( + P_thresh_opt)) else: print('No such P_thresh found') print('') @@ -554,7 +550,6 @@ def compute_tradeoffs_and_print_from_training(self): # first index where... for fp_thresh in fp_threshs: - print('============= TRAINING FP RATE < {} ============='.format( fp_thresh)) print('============= TEST PERFORMANCE: =============') @@ -660,7 +655,6 @@ def plot_individual_shot(self, P_thresh_opt, shot_num, normalize=True, def get_prediction_type_for_individual_shot(self, P_thresh, shot, mode='test'): p, t, is_disr = self.get_pred_truth_disr_by_shot(shot) - TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( P_thresh, p, t, is_disr) prediction_type = self.get_prediction_type(TP, FP, FN, TN, early, late) @@ -687,7 +681,6 @@ def example_plots(self, P_thresh_opt, mode='test', types_to_plot=['FP'], p = pred[i] is_disr = is_disruptive[i] shot = shot_list.shots[i] - TP, FP, FN, TN, early, late = self.get_shot_prediction_stats( P_thresh_opt, p, t, is_disr) prediction_type = self.get_prediction_type( @@ -802,20 +795,12 @@ def plot_shot(self, shot, save_fig=True, normalize=True, truth=None, # ax.axvline(len(truth)-T_max_warn,color='r')#,label='max # warning time') # ,label='min warning time') - ax.axvline( - len(truth) - - self.T_min_warn, - color='r', - linewidth=0.5) + ax.axvline(len(truth) - self.T_min_warn, color='r', + linewidth=0.5) ax.set_xlabel('T [ms]', size=fontsize) # ax.axvline(2400) - ax.legend( - loc=( - 0.5, - 0.7), - fontsize=fontsize-5, - labelspacing=0.1, - frameon=False) + ax.legend(loc=(0.5, 0.7), fontsize=fontsize-5, + labelspacing=0.1, frameon=False) plt.setp(ax.get_yticklabels(), fontsize=fontsize) plt.setp(ax.get_xticklabels(), fontsize=fontsize) # plt.xlim(0,200) @@ -890,15 +875,10 @@ def plot_shot_old(self, shot, save_fig=True, normalize=True, truth=None, # ax.set_ylim([1e-5,1.1e0]) ax.set_ylim([-2, 2]) if len(truth)-self.T_max_warn >= 0: - ax.axvline( - len(truth)-self.T_max_warn, - color='r', - label='min warning time') - ax.axvline( - len(truth) - - self.T_min_warn, - color='r', - label='max warning time') + ax.axvline(len(truth)-self.T_max_warn, color='r', + label='min warning time') + ax.axvline(len(truth) - self.T_min_warn, color='r', + label='max warning time') ax.set_xlabel('T [ms]') # ax.legend(loc = 'lower left',fontsize=10) plt.setp(ax.get_yticklabels(), fontsize=7) From 80f3a72d53e44ee5109363c5121def7d55cd4bd3 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 22 Oct 2019 11:59:43 -0500 Subject: [PATCH 602/744] Update PrincetonUTutorial.md --- docs/PrincetonUTutorial.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index c1b74c15..e65f516a 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -56,6 +56,7 @@ you should see something like this: $ which mpicc /usr/local/openmpi/cuda-8.0/3.0.0/intel170/x86_64/bin/mpicc ``` +Especially note the presence of the CUDA directory in this path. This indicates that the loaded OpenMPI library is [CUDA-aware](https://www.open-mpi.org/faq/?category=runcuda). If you `conda activate` the Anaconda environment **after** loading the OpenMPI library, your application would be built with the MPI library from Anaconda, which has worse performance on this cluster and could lead to errors. See [On Computing Well: Installing and Running ‘mpi4py’ on the Cluster](https://oncomputingwell.princeton.edu/2018/11/installing-and-running-mpi4py-on-the-cluster/) for a related discussion. @@ -142,12 +143,25 @@ The workflow is to request an interactive session: ```bash salloc -N [X] --ntasks-per-node=4 --ntasks-per-socket=2 --gres=gpu:4 -c 4 --mem-per-cpu=0 -t 0-6:00 ``` + +[//]: # (Note, the modules might not/are not inherited from the shell that spawns the interactive Slurm session. Need to reload anaconda module, activate environment, and reload other compiler/library modules) + +Re-load the above modules and reactivate your conda environment. Confirm that the correct CUDA-aware OpenMPI library is in your interactive Slurm sessions's shell search path: +```bash +$ which mpirun +/usr/local/openmpi/cuda-8.0/3.0.0/intel170/x86_64/bin/mpirun +``` Then, launch the application from the command line: ```bash mpirun -N 4 python mpi_learn.py ``` -where `-N` is a synonym for `-npernode` in OpenMPI. Do **not** use `srun` to launch the job inside an interactive session. +where `-N` is a synonym for `-npernode` in OpenMPI. Do **not** use `srun` to launch the job inside an interactive session. If +you an encounter an error such as "unrecognized argument N", it is likely that your modules are incorrect and point to an Intel MPI distribution instead of CUDA-aware OpenMPI. Intel MPI is based on MPICH, which does not offer the `-npernode` option. You can confirm this by checking: +```bash +$ which mpirun +/opt/intel/compilers_and_libraries_2019.3.199/linux/mpi/intel64/bin/mpirun +``` [//]: # (This option appears to be redundant given the salloc options; "mpirun python mpi_learn.py" appears to work just the same.) @@ -155,7 +169,7 @@ where `-N` is a synonym for `-npernode` in OpenMPI. Do **not** use `srun` to lau [//]: # (Consistent with https://www.open-mpi.org/faq/?category=slurm ?) -[//]: # (certain output seems to be repeated by ntasks-per-node, e.g. echoing the conf.yaml. Expected?) +[//]: # (certain output seems to be repeated by ntasks-per-node, e.g. echoing the conf.yaml. Expected? Or, replace the print calls with print_unique) ### Understanding the data From c09d7015a71ff745eeeac8da95ab89a42d1f5a01 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 22 Oct 2019 18:29:42 -0400 Subject: [PATCH 603/744] Add outputs of performance_analysis.py to gitignore --- .gitignore | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0125b4ab..3b24d3a7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,11 @@ # Generated by test plot_*.html +# Outputs from analysis scripts +*.png +out.txt +*.npz + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -97,6 +102,7 @@ ENV/ .ropeproject # Job scheduler output +################ # Slurm *.out @@ -107,4 +113,7 @@ ENV/ # PBS # *.o* -# *.e* \ No newline at end of file +# *.e* + +# Etc +*.local \ No newline at end of file From 67f2cdbe632113e96bdbe2cc8c6930a11ee45825 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 22 Oct 2019 18:30:53 -0400 Subject: [PATCH 604/744] Pass allow_pickle=True to final np.savez() call in MPI script (even though option is not documented for this function, and deprecation should not cause an error until v1.18.0, which has not been released) Prevents the following error with numpy v1.16.2, tf v1.3.0: /home/kfelker/.conda/envs/frnn-tf1.3.0/lib/python3.6/site-packages/numpy/lib/npyio.py:750: FutureWarning: Object arrays will not be saved by default in the future because `allow_pickle` will default to False. You should add `allow_pickle=True` explicitly to eliminate this warning. pickle_kwargs=pickle_kwargs) Traceback (most recent call last): File "./mpi_learn.py", line 151, in shot_list_test=shot_list_test, conf=conf) File "/home/kfelker/.conda/envs/frnn-tf1.3.0/lib/python3.6/site-packages/numpy/lib/npyio.py", line 639, in savez _savez(file, args, kwds, False, allow_pickle=_allow_pickle) File "/home/kfelker/.conda/envs/frnn-tf1.3.0/lib/python3.6/site-packages/numpy/lib/npyio.py", line 750, in _savez pickle_kwargs=pickle_kwargs) File "/home/kfelker/.conda/envs/frnn-tf1.3.0/lib/python3.6/site-packages/numpy/lib/format.py", line 637, in write_array raise ValueError("Object arrays cannot be saved when " ValueError: Object arrays cannot be saved when allow_pickle=False --- examples/mpi_learn.py | 5 ++++- plasma/models/mpi_runner.py | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 79a6d783..97b2c691 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -148,7 +148,10 @@ y_prime_test=y_prime_test, disruptive=disruptive, disruptive_train=disruptive_train, disruptive_test=disruptive_test, shot_list_train=shot_list_train, - shot_list_test=shot_list_test, conf=conf) + shot_list_test=shot_list_test, conf=conf, + # TODO(KGF): changing allow_pickle behavior not documented for + # https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez.html + allow_pickle=True) sys.stdout.flush() if task_index == 0: diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index e1d55ba6..29eb1573 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -217,6 +217,8 @@ def set_batch_iterator_func(self): self.batch_iterator_func = self.batch_iterator() def close(self): + # TODO(KGF): extend __exit__() fn capability when this member + # = self.batch_iterator() (i.e. is not a ProcessGenerator()) if (self.conf is not None and 'use_process_generator' in conf['training'] and conf['training']['use_process_generator']): From b4b147c195120f638c492d3fbffe2f5b7d98f5cb Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 22 Oct 2019 18:43:11 -0400 Subject: [PATCH 605/744] Clean up default conf.yaml --- examples/conf.yaml | 103 +++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index 2b977191..e125a391 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -1,56 +1,57 @@ -#conf.py will parse the yaml and extract parameters based on what is specified +# conf.py will parse the yaml and extract parameters based on what is specified -#will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. +# will do stuff in fs_path / [username] / signal_data | shot_lists | processed shots, etc. fs_path: '/tigress' -target: 'hinge' #'maxhinge' #'maxhinge' #'binary' #'hinge' +target: 'hinge' # 'maxhinge' # 'maxhinge' # 'binary' # 'hinge' num_gpus: 4 paths: - signal_prepath: '/signal_data/' #/signal_data/jet/ + signal_prepath: '/signal_data/' # /signal_data/jet/ shot_list_dir: '/shot_lists/' tensorboard_save_path: '/Graph/' - data: d3d_data_0D #'d3d_to_jet_data' #'d3d_to_jet_data' # 'jet_to_d3d_data' #jet_data - specific_signals: [] #['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] #if left empty will use all valid signals defined on a machine. Only use if need a custom set + data: d3d_data_0D # 'd3d_to_jet_data' # 'd3d_to_jet_data' # 'jet_to_d3d_data' # jet_data + # if specific_signals: [] left empty, it will use all valid signals defined on a machine. Only use if need a custom set + specific_signals: [] # ['q95','li','ip','betan','energy','lm','pradcore','pradedge','pradtot','pin','torquein','tmamp1','tmamp2','tmfreq1','tmfreq2','pechin','energydt','ipdirect','etemp_profile','edens_profile'] executable: "mpi_learn.py" shallow_executable: "learn.py" data: - bleed_in: 0 #how many shots from the test sit to use in training? - bleed_in_repeat_fac: 1 #how many times to repeat shots in training and validation? + bleed_in: 0 # how many shots from the test sit to use in training? + bleed_in_repeat_fac: 1 # how many times to repeat shots in training and validation? bleed_in_remove_from_test: True bleed_in_equalize_sets: False - signal_to_augment: None #'plasma current' #or None + # TODO(KGF): make next parameter use 'none' instead of None + signal_to_augment: None # 'plasma current' # or None augmentation_mode: 'none' augment_during_training: False cut_shot_ends: True T_min_warn: 30 recompute: False recompute_normalization: False - #specifies which of the signals in the signals_dirs order contains the plasma current info + # specifies which of the signals in the signals_dirs order contains the plasma current info current_index: 0 plotting: False - #train/validate split - #how many shots to use - use_shots: 200000 #1000 #200000 - positive_example_penalty: 1.0 #by what factor to upweight positive examples? - #normalization timescale + # how many shots to use + use_shots: 200000 # 1000 # 200000 + positive_example_penalty: 1.0 # by what factor to upweight positive examples? + # normalization timescale dt: 0.001 - #maximum TTD considered + # maximum TTD considered T_max: 1000.0 - #The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 - T_warning: 1.024 #1.024 #1.024 #0.512 #0.25 #1.0 #1.0 #warning time in seconds + # The shortest works best so far: less overfitting. log TTd prediction also works well. 0.5 better than 0.2 + T_warning: 1.024 # 1.024 # 1.024 # 0.512 # 0.25 # 1.0 # 1.0 # warning time in seconds current_thresh: 750000 current_end_thresh: 10000 - #the characteristic decay length of the decaying moving average window + # the characteristic decay length of the decaying moving average window window_decay: 2 - #the width of the actual window + # the width of the actual window window_size: 10 - #TODO optimize + # TODO(KGF): optimize the normalizer parameters normalizer: 'var' norm_stat_range: 100.0 equalize_classes: False - # shallow_sample_prob: 0.01 #the fraction of samples with which to train the shallow model + # shallow_sample_prob: 0.01 # the fraction of samples with which to train the shallow model floatx: 'float32' model: @@ -59,31 +60,31 @@ model: torch: False shallow: False shallow_model: - num_samples: 1000000 #1000000 #the number of samples to use for training - type: "xgboost" #"xgboost" #"xgboost" #"random_forest" "xgboost" - n_estimators: 100 #for random forest - max_depth: 3 #for random forest and xgboost (def = 3) - C: 1.0 #for svm - kernel: "rbf" #rbf, sigmoid, linear, poly, for svm - learning_rate: 0.1 #xgboost - scale_pos_weight: 10.0 #xgboost - final_hidden_layer_size: 10 #final layers has this many neurons, every layer before twice as many + num_samples: 1000000 # 1000000 # the number of samples to use for training + type: "xgboost" # "xgboost" #"random_forest" + n_estimators: 100 # for random forest + max_depth: 3 # for random forest and xgboost (def = 3) + C: 1.0 # for svm + kernel: "rbf" # rbf, sigmoid, linear, poly, for svm + learning_rate: 0.1 # used in xgboost + scale_pos_weight: 10.0 # used in xgboost + final_hidden_layer_size: 10 # final layers has this many neurons, every layer before twice as many num_hidden_layers: 3 learning_rate_mlp: 0.0001 mlp_regularization: 0.0001 - skip_train: False #should a finished model be loaded if available - #length of LSTM memory + skip_train: False # should a finished model be loaded if available + # length of LSTM memory pred_length: 200 pred_batch_size: 128 - #TODO optimize + # TODO(KGF): optimize length of LSTM memory length: 128 skip: 1 - #hidden layer size - #TODO optimize + # hidden layer size + # TODO(KGF): optimize size of RNN layers rnn_size: 200 - #size 100 slight overfitting, size 20 no overfitting. 200 is not better than 100. Prediction much better with size 100, size 20 cannot capture the data. + # size 100 slight overfitting, size 20 no overfitting. 200 is not better than 100. Prediction much better with size 100, size 20 cannot capture the data. rnn_type: 'LSTM' - #TODO optimize + # TODO(KGF): optimize number of RNN layers rnn_layers: 2 num_conv_filters: 128 size_conv_filters: 3 @@ -91,39 +92,41 @@ model: pool_size: 2 dense_size: 128 extra_dense_input: False - #have not found a difference yet + # have not found a difference yet optimizer: 'adam' clipnorm: 10.0 regularization: 0.001 dense_regularization: 0.001 - #1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset and ~10 epochs, and lr decay of 0.90. 1e-4 also works well if we decay a lot (i.e ~0.7 or more) - lr: 0.00002 #0.00001 #0.0005 #for adam plots 0.0000001 #0.00005 #0.00005 #0.00005 - lr_decay: 0.97 #0.98 #0.9 + # lr=1e-4 is too high, 5e-7 is too low. 5e-5 seems best at 256 batch size, full dataset + # and ~10 epochs, and lr decay of 0.90 + # lr=1e-4 also works well if we decay a lot (i.e ~0.7 or more) + lr: 0.00002 # 0.00001 # 0.0005 # for adam plots 0.0000001 # 0.00005 # 0.00005 # 0.00005 + lr_decay: 0.97 # 0.98 # 0.9 stateful: True return_sequences: True dropout_prob: 0.1 - #only relevant if we want to do mpi training. The number of steps with a single replica + # only relevant if we want to do mpi training. The number of steps with a single replica warmup_steps: 0 - ignore_timesteps: 100 #how many initial timesteps to ignore during evaluation (to let the internal state settle) + ignore_timesteps: 100 # how many initial timesteps to ignore during evaluation (to let the internal state settle) backend: 'tensorflow' training: as_array_of_shots: True shuffle_training: True train_frac: 0.75 validation_frac: 0.33 - batch_size: 128 #256 - #THIS WAS THE CULPRIT FOR NO TRAINING! Lower than 1000 performs very poorly + batch_size: 128 # 256 + # THE MAX_PATCH_LENGTH WAS THE CULPRIT FOR NO TRAINING! Lower than 1000 performs very poorly max_patch_length: 100000 - #How many shots are we loading at once? + # How many shots are we loading at once? num_shots_at_once: 200 - num_epochs: 1000 + num_epochs: 1000 # large number = maximum number of epochs. Early stopping will occur if loss does not decrease use_mock_data: False data_parallel: False hyperparam_tuning: False batch_generator_warmup_steps: 0 use_process_generator: False - num_batches_minimum: 20 #minimum number of batches per epoch - ranking_difficulty_fac: 1.0 #how much to upweight incorrectly classified shots during training + num_batches_minimum: 20 # minimum number of batches per epoch + ranking_difficulty_fac: 1.0 # how much to upweight incorrectly classified shots during training callbacks: list: ['earlystop'] metrics: ['val_loss','val_roc','train_loss'] From 1bcf9622e3ead9c3ea814995d51b6da2ff398737 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 23 Oct 2019 12:03:41 -0400 Subject: [PATCH 606/744] Revert change from 67f2cdbe63 API change only occurred for Intel NumPy distribution --- examples/mpi_learn.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 97b2c691..8c4e7828 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -148,10 +148,12 @@ y_prime_test=y_prime_test, disruptive=disruptive, disruptive_train=disruptive_train, disruptive_test=disruptive_test, shot_list_train=shot_list_train, - shot_list_test=shot_list_test, conf=conf, - # TODO(KGF): changing allow_pickle behavior not documented for - # https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez.html - allow_pickle=True) + shot_list_test=shot_list_test, conf=conf) + + # TODO(KGF): Intel NumPy fork + # https://conda.anaconda.org/intel/linux-64/numpy-1.16.2-py36h7b7c402_0.tar.bz2 + # applies cve_2019_6446_fix.patch, which unlike main NumPy, adds + # requirement for "allow_pickle=True" to savez() calls sys.stdout.flush() if task_index == 0: From 79738ae2f524fe463ba64b5434c8bc2838f652ff Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 23 Oct 2019 12:19:50 -0400 Subject: [PATCH 607/744] Add flake8 to Conda requirements file (eventually will be environments.yaml) --- requirements-travis.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-travis.txt b/requirements-travis.txt index 5da3c8a5..77056dd9 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -1,5 +1,6 @@ scipy pandas +flake8 h5py pyparsing pyyaml From 43110e7be42f32ca2bc6f35a3ac7ab090c6f97e5 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 23 Oct 2019 12:44:40 -0400 Subject: [PATCH 608/744] Loosen version requirements for matplotlib, keras --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 3f6b58ce..da722f07 100644 --- a/setup.py +++ b/setup.py @@ -26,9 +26,9 @@ # license = "Apache Software License v2", test_suite="tests", install_requires=[ - 'keras>2.0.8', + 'keras>=2.0.5', 'pathos', - 'matplotlib==2.0.2', + 'matplotlib>=2.0.2', 'hyperopt', 'mpi4py', 'xgboost', From d0139802b22f9a0ac7e722ac435275fe7ecc65a9 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 24 Oct 2019 14:53:51 -0500 Subject: [PATCH 609/744] Reorganize sections --- docs/PrincetonUTutorial.md | 151 +++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 74 deletions(-) diff --git a/docs/PrincetonUTutorial.md b/docs/PrincetonUTutorial.md index e65f516a..6493b7a1 100644 --- a/docs/PrincetonUTutorial.md +++ b/docs/PrincetonUTutorial.md @@ -1,6 +1,7 @@ -## Tutorials -*Last updated 2019-10-16.* +# TigerGPU Tutorial +*Last updated 2019-10-24.* +## Building the package ### Login to TigerGPU First, login to TigerGPU cluster headnode via ssh: @@ -9,7 +10,7 @@ ssh -XC @tigergpu.princeton.edu ``` Note, `-XC` is optional; it is only necessary if you are planning on performing remote visualization, e.g. the output `.png` files from the below [section](#Learning-curves-and-ROC-per-epoch). Trusted X11 forwarding can be used with `-Y` instead of `-X` and may prevent timeouts, but it disables X11 SECURITY extension controls. Compression `-C` reduces the bandwidth usage and may be useful on slow connections. -### Sample usage on TigerGPU +### Sample installation on TigerGPU Next, check out the source code from github: ``` @@ -48,7 +49,7 @@ python setup.py install Where `my_env` should contain the Python packages as per `requirements-travis.txt` file. -#### Common issue +### Common build issue: cluster's MPI library and `mpi4py` Common issue is Intel compiler mismatch in the `PATH` and what you use in the module. With the modules loaded as above, you should see something like this: @@ -60,7 +61,9 @@ Especially note the presence of the CUDA directory in this path. This indicates If you `conda activate` the Anaconda environment **after** loading the OpenMPI library, your application would be built with the MPI library from Anaconda, which has worse performance on this cluster and could lead to errors. See [On Computing Well: Installing and Running ‘mpi4py’ on the Cluster](https://oncomputingwell.princeton.edu/2018/11/installing-and-running-mpi4py-on-the-cluster/) for a related discussion. -#### Location of the data on Tigress + +## Understanding and preparing the input data +### Location of the data on Tigress The JET and D3D datasets contain multi-modal time series of sensory measurements leading up to deleterious events called plasma disruptions. The datasets are located in the `/tigress/FRNN` project directory of the [GPFS](https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsights.product.doc/doc/bi_gpfs_overview.html) filesystem on Princeton University clusters. @@ -71,7 +74,29 @@ ln -s /tigress/FRNN/shot_lists shot_lists ln -s /tigress/FRNN/signal_data signal_data ``` -#### Preprocessing +### Configuring the dataset +All the configuration parameters are summarised in `examples/conf.yaml`. In this section, we highlight the important ones used to control the input data. + +Currently, FRNN is capable of working with JET and D3D data as well as thecross-machine regime. The switch is done in the configuration file: + +```yaml +paths: + ... + data: 'jet_data_0D' +``` +use `d3d_data` for D3D signals, use `jet_to_d3d_data` ir `d3d_to_jet_data` for cross-machine regime. + +By default, FRNN will select, preprocess, and normalize all valid signals available in the above dataset. To chose only specific signals use: +```yaml +paths: + ... + specific_signals: [q95,ip] +``` +if left empty `[]` will use all valid signals defined on a machine. Only set this variable if you need a custom set of signals. + +Other parameters configured in the `conf.yaml` include batch size, learning rate, neural network topology and special conditions foir hyperparameter sweeps. + +### Preprocessing the input data ```bash cd examples/ @@ -79,20 +104,45 @@ python guarantee_preprocessed.py ``` This will preprocess the data and save rescaled copies of the signals in `/tigress//processed_shots`, `/tigress//processed_shotlists` and `/tigress//normalization` -You would only have to run preprocessing once for each dataset. The dataset is specified in the config file `examples/conf.yaml`: +Preprocessing must be performed only once per each dataset. For example, consider the following dataset specified in the config file `examples/conf.yaml`: ```yaml paths: data: jet_data_0D ``` Preprocessing this dataset takes about 20 minutes to preprocess in parallel and can normally be done on the cluster headnode. -#### Training and inference +### Current signals and notations + +Signal name | Description +--- | --- +q95 | q95 safety factor +ip | plasma current +li | internal inductance +lm | Locked mode amplitude +dens | Plasma density +energy | stored energy +pin | Input Power (beam for d3d) +pradtot | Radiated Power +pradcore | Radiated Power Core +pradedge | Radiated Power Edge +pechin | ECH input power, not always on +pechin | ECH input power, not always on +betan | Normalized Beta +energydt | stored energy time derivative +torquein | Input Beam Torque +tmamp1 | Tearing Mode amplitude (rotating 2/1) +tmamp2 | Tearing Mode amplitude (rotating 3/2) +tmfreq1 | Tearing Mode frequency (rotating 2/1) +tmfreq2 | Tearing Mode frequency (rotating 3/2) +ipdirect | plasma current direction + +## Training and inference -Use Slurm scheduler to perform batch or interactive analysis on TigerGPU cluster. +Use the Slurm job scheduler to perform batch or interactive analysis on TigerGPU cluster. -##### Batch analysis +### Batch job -For batch analysis, make sure to allocate 1 MPI process per GPU. Save the following to `slurm.cmd` file (or make changes to the existing `examples/slurm.cmd`): +For non-interactive batch analysis, make sure to allocate exactly 1 MPI process per GPU. Save the following to `slurm.cmd` file (or make changes to the existing `examples/slurm.cmd`): ```bash #!/bin/bash @@ -135,7 +185,7 @@ Optionally, add an email notification option in the Slurm configuration about th #SBATCH --mail-type=ALL ``` -##### Interactive analysis +### Interactive job Interactive option is preferred for **debugging** or running in the **notebook**, for all other case batch is preferred. The workflow is to request an interactive session: @@ -165,65 +215,13 @@ $ which mpirun [//]: # (This option appears to be redundant given the salloc options; "mpirun python mpi_learn.py" appears to work just the same.) -[//]: # (HOWEVER, "srun python mpi_learn.py", "srun --ntasks-per-node python mpi_learn.py", etc. NEVER works--- it just hangs without any output. Why?) - -[//]: # (Consistent with https://www.open-mpi.org/faq/?category=slurm ?) - -[//]: # (certain output seems to be repeated by ntasks-per-node, e.g. echoing the conf.yaml. Expected? Or, replace the print calls with print_unique) +[//]: # (HOWEVER, "srun python mpi_learn.py", "srun --ntasks-per-node python mpi_learn.py", etc. NEVER works--- it just hangs without any output. Why? ANSWER: salloc starts a session on the node using srun under the covers, which may consume a GPU in the allocation. Next srun call will hang due to a lack of required resources. Wrapper fix to this may have been extended from mpirun to srun on 2019-10-22) - -### Understanding the data - -All the configuration parameters are summarised in `examples/conf.yaml`. Highlighting the important ones to control the data. -Currently, FRNN is capable of working with JET and D3D data as well as cross-machine regime. The switch is done in the configuration file: - -```yaml -paths: - ... - data: 'jet_data_0D' -``` -use `d3d_data` for D3D signals, use `jet_to_d3d_data` ir `d3d_to_jet_data` for cross-machine regime. - -By default, FRNN will select, preprocess and normalize all valid signals available. To chose only specific signals use: -```yaml -paths: - ... - specific_signals: [q95,ip] -``` -if left empty `[]` will use all valid signals defined on a machine. Only use if need a custom set. - -Other parameters configured in the conf.yaml include batch size, learning rate, neural network topology and special conditions foir hyperparameter sweeps. - -### Current signals and notations - -Signal name | Description ---- | --- -q95 | q95 safety factor -ip | plasma current -li | internal inductance -lm | Locked mode amplitude -dens | Plasma density -energy | stored energy -pin | Input Power (beam for d3d) -pradtot | Radiated Power -pradcore | Radiated Power Core -pradedge | Radiated Power Edge -pechin | ECH input power, not always on -pechin | ECH input power, not always on -betan | Normalized Beta -energydt | stored energy time derivative -torquein | Input Beam Torque -tmamp1 | Tearing Mode amplitude (rotating 2/1) -tmamp2 | Tearing Mode amplitude (rotating 3/2) -tmfreq1 | Tearing Mode frequency (rotating 2/1) -tmfreq2 | Tearing Mode frequency (rotating 3/2) -ipdirect | plasma current direction - -### Visualizing learning +## Visualizing learning A regular FRNN run will produce several outputs and callbacks. -#### TensorBoard visualization +### TensorBoard visualization Currently supports graph visualization, histograms of weights, activations and biases, and scalar variable summaries of losses and accuracies. @@ -262,19 +260,23 @@ mount_osxfuse: mount point is itself on More aggressive options such as `umount -f ` and alternative approaches may be necessary; see [discussion here](https://github.com/osxfuse/osxfuse/issues/45#issuecomment-21943107). -#### Learning curves and ROC per epoch +## Custom visualization +Besides TensorBoard summaries, you can visualize the accuracy of the trained FRNN model using the custom Python scripts and notebooks included in the repository. + +### Learning curves, example shots, and ROC per epoch -Besides TensorBoard summaries you can produce the ROC curves for validation and test data as well as visualizations of shots: +You can produce the ROC curves for validation and test data as well as visualizations of shots by using: ``` cd examples/ python performance_analysis.py ``` -this uses the resulting file produced as a result of training the neural network as an input, and produces several `.png` files with plots as an output. +The `performance_analysis.py` script uses the file produced as a result of training the neural network as an input, and produces several `.png` files with plots as an output. -In addition, you can check the scalar variable summaries for training loss, validation loss and validation ROC logged at `/tigress//csv_logs` (each run will produce a new log file with a timestamp in name). +[//]: # (Add details about sig_161308test.npz, disruptive_alarms_test.npz, 4x metric* png, accum_disruptions.png, test_roc.npz) -A sample code to analyze can be found in `examples/notebooks`. For instance: +In addition, you can check the scalar variable summaries for training loss, validation loss, and validation ROC logged at `/tigress//csv_logs` (each run will produce a new log file with a timestamp in name). +Sample notebooks for analyzing the files in this directory can be found in `examples/notebooks/`. For instance, the [LearningCurves.ipynb](https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/LearningCurves.ipynb) notebook contains a variation on the following code snippet: ```python import pandas as pd import numpy as np @@ -297,7 +299,8 @@ p.line(data['epoch'].values, data['train_loss'].values, legend="Test description p.legend.location = "top_right" show(p, notebook_handle=True) ``` +The resulting plot should match the `train_loss` plot in the Scalars tab of the TensorBoard summary. -### Learning curve summaries per mini-batch +#### Learning curve summaries per mini-batch -To extract per mini-batch summaries, use the output produced by FRNN logged to the standard out (in case of the batch jobs, it will all be contained in the Slurm output file). Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: [FRNN_scaling.ipynb](https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb) +To extract per mini-batch summaries, we require a finer granularity of checkpoint data than what it is logged to the per-epoch lines of `csv_logs/` files. We must directly use the output produced by FRNN logged to the standard output stream. In the case of the non-interactive Slurm batch jobs, it will all be contained in the Slurm output file, e.g. `slurm-3842170.out`. Refer to the following notebook to perform the analysis of learning curve on a mini-batch level: [FRNN_scaling.ipynb](https://github.com/PPPLDeepLearning/plasma-python/blob/master/examples/notebooks/FRNN_scaling.ipynb) From f25721736a54d4e707e849debf379b9ada124be6 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Mon, 28 Oct 2019 13:50:00 -0500 Subject: [PATCH 610/744] Try fixing general_object_hash() By swapping order of frozenset(sorted( to sorted(frozenset(, which is then converted to a tuple and hashed with myhash(). The previous setup returned different unique_id from the same conf.yaml input between different invocations of the Python kernel. Root cause was an arbitrary reordering of the items in all nested dictionaries: E.g. the conf['training'] nested dictionary was hashed twice as: < (('data_parallel', 289442542916728710689234258135348595619), ('num_shots_at_once', 89470398321342590012591641233937892196), ('shuffle_training', 199116753875903447238788905392232456494), ('max_patch_length', 28194631872103329448916222404393283486), ('hyperparam_tuning', 289442542916728710689234258135348595619), ('num_batches_minimum', 241470210063517338676282364296715124371), ('ranking_difficulty_fac', 212610832367597099128411062743096585095), ('batch_generator_warmup_steps', 220016661218577614175283909151483631217), ('train_frac', 74563758320577896151616107095405697202), ('validation_frac', 313419366237728314877788597545102977126), ('as_array_of_shots', 199116753875903447238788905392232456494), ('use_mock_data', 289442542916728710689234258135348595619), ('batch_size', 205743917378578649043592219116698884292), ('num_epochs', 201299305426511499865320550659865534950), ('use_process_generator', 289442542916728710689234258135348595619)) < final_hash = 238379894380234523292314865703766581029 --- > (('max_patch_length', 28194631872103329448916222404393283486), ('batch_generator_warmup_steps', 220016661218577614175283909151483631217), ('ranking_difficulty_fac', 212610832367597099128411062743096585095), ('use_mock_data', 289442542916728710689234258135348595619), ('num_batches_minimum', 241470210063517338676282364296715124371), ('validation_frac', 313419366237728314877788597545102977126), ('hyperparam_tuning', 289442542916728710689234258135348595619), ('shuffle_training', 199116753875903447238788905392232456494), ('as_array_of_shots', 199116753875903447238788905392232456494), ('num_shots_at_once', 89470398321342590012591641233937892196), ('use_process_generator', 289442542916728710689234258135348595619), ('batch_size', 205743917378578649043592219116698884292), ('data_parallel', 289442542916728710689234258135348595619), ('train_frac', 74563758320577896151616107095405697202), ('num_epochs', 201299305426511499865320550659865534950)) > final_hash = 326207239196943809073363948252009087299 --- plasma/utils/downloading.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index 27c9fb93..b81457a4 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -37,7 +37,7 @@ def general_object_hash(o): Makes a hash from a dictionary, list, tuple or set to any level, that contains only other hashable types (including any lists, tuples, sets, and dictionaries). Relies on dill for serialization -""" + """ if isinstance(o, (set, tuple, list)): return tuple([general_object_hash(e) for e in o]) @@ -46,19 +46,17 @@ def general_object_hash(o): return myhash(o) new_o = deepcopy(o) + # recursively call this function when given a dictionary for k, v in new_o.items(): + # replace the dict entry value with its hash new_o[k] = general_object_hash(v) - return myhash(tuple(frozenset(sorted(new_o.items())))) + return myhash(tuple(sorted(frozenset(new_o.items())))) def myhash(x): return int(hashlib.md5((dill.dumps(x).decode('unicode_escape')).encode( 'utf-8')).hexdigest(), 16) - # return int(hashlib.md5((dill.dumps(x))).hexdigest(),16) - # return - # int(hashlib.md5((dill.dumps(x))))#.decode('unicode_escape')).encode( - # 'utf-8')).hexdigest(),16) def get_missing_value_array(): From 0acdaf95415c28dead7032f54031d0c26f7e6364 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Mon, 28 Oct 2019 14:40:29 -0500 Subject: [PATCH 611/744] Fix formatting of some signal preprocessing print statements --- data/signals.py | 2 +- plasma/conf_parser.py | 2 +- plasma/models/builder.py | 7 ++---- plasma/utils/downloading.py | 43 +++++++++++++------------------------ 4 files changed, 19 insertions(+), 35 deletions(-) diff --git a/data/signals.py b/data/signals.py index a4f9f4c3..34a53db2 100644 --- a/data/signals.py +++ b/data/signals.py @@ -361,7 +361,7 @@ def fetch_nstx_data(signal_path, shot_num, c): all_signals_restricted = all_signals -print('all signals (determines which signals are downloaded & preprocessed):') +print('All signals (determines which signals are downloaded & preprocessed):') print(all_signals.values()) fully_defined_signals = { diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 057c1391..c41431b9 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -368,7 +368,7 @@ def parameters(input_file): params['paths']['all_signals'] = sort_by_channels( list(params['paths']['all_signals_dict'].values())) - print("Selected signals (determines which signals are used for ", + print("Selected signals (determines which signals are used for", "training):\n{}".format(params['paths']['use_signals'])) params['paths']['shot_files_all'] = ( diff --git a/plasma/models/builder.py b/plasma/models/builder.py index d7b2c0a8..9e643d37 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -37,15 +37,12 @@ def __init__(self, conf): self.conf = conf def get_unique_id(self): - # num_epochs = self.conf['training']['num_epochs'] this_conf = deepcopy(self.conf) - # don't make hash dependent on number of epochs or T_min_warn - # (they can both be modified) + # ignore hash depednecy on number of epochs or T_min_warn (they are + # both modifiable). Map local copy of all confs to the same values this_conf['training']['num_epochs'] = 0 this_conf['data']['T_min_warn'] = 30 unique_id = general_object_hash(this_conf) - # unique_id = int(hashlib.md5((dill.dumps(this_conf).decode( - # 'unicode_escape')).encode('utf-8')).hexdigest(), 16) return unique_id def get_0D_1D_indices(self): diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index b81457a4..f8db18da 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -12,7 +12,7 @@ # import gadata # from plasma.primitives.shots import ShotList -''' +'''MDSplus references: http://www.mdsplus.org/index.php?title=Documentation:Tutorial:RemoteAccess&open=76203664636339686324830207&page=Documentation%2FThe+MDSplus+tutorial%2FRemote+data+access+in+MDSplus http://piscope.psfc.mit.edu/index.php/MDSplus_%26_python#Simple_example_of_reading_MDSplus_data http://www.mdsplus.org/documentation/beginners/expressions.shtml @@ -112,8 +112,8 @@ def save_shot(shot_num_queue, c, signals, save_prepath, machine, sentinel=-1): shot_complete = True for signal in signals: signal_path = signal.get_path(machine) - save_path_full = signal.get_file_path( - save_prepath, machine, shot_num) + save_path_full = signal.get_file_path(save_prepath, machine, + shot_num) success = False mapping = None if os.path.isfile(save_path_full): @@ -121,10 +121,9 @@ def save_shot(shot_num_queue, c, signals, save_prepath, machine, sentinel=-1): print('-', end='') success = True else: - print( - 'Signal {}, shot {} '.format(signal_path, shot_num), - 'was downloaded incorrectly (empty file). ', - 'Redownloading.') + print('Signal {}, shot {} '.format(signal_path, shot_num), + 'was downloaded incorrectly (empty file). ', + 'Redownloading.') if not success: try: try: @@ -159,9 +158,8 @@ def save_shot(shot_num_queue, c, signals, save_prepath, machine, sentinel=-1): fmt='%.5e') print('.', end='') except BaseException: - print( - 'Could not save shot {}, signal {}'.format( - shot_num, signal_path)) + print('Could not save shot {}, signal {}'.format( + shot_num, signal_path)) print('Warning: Incomplete!!!') raise sys.stdout.flush() @@ -195,12 +193,8 @@ def download_shot_numbers(shot_numbers, save_prepath, machine, signals): for i in range(num_cores): queue.put(sentinel) connections = [Connection(machine.server) for _ in range(num_cores)] - processes = [ - mp.Process( - target=fn, - args=( - queue, - connections[i])) for i in range(num_cores)] + processes = [mp.Process(target=fn, args=(queue, connections[i])) + for i in range(num_cores)] print('running in parallel on {} processes'.format(num_cores)) @@ -210,13 +204,9 @@ def download_shot_numbers(shot_numbers, save_prepath, machine, signals): p.join() -def download_all_shot_numbers( - prepath, - save_path, - shot_list_files, - signals_full): +def download_all_shot_numbers(prepath, save_path, shot_list_files, + signals_full): max_len = 30000 - machine = shot_list_files.machine signals = [] for sig in signals_full: @@ -226,18 +216,15 @@ def download_all_shot_numbers( sig, machine)) else: signals.append(sig) - save_prepath = prepath+save_path + '/' + save_prepath = prepath + save_path + '/' shot_numbers, _ = shot_list_files.get_shot_numbers_and_disruption_times() # can only use queue of max size 30000 shot_numbers_chunks = [shot_numbers[i:i+max_len] for i in np.xrange(0, len(shot_numbers), max_len)] start_time = time.time() for shot_numbers_chunk in shot_numbers_chunks: - download_shot_numbers( - shot_numbers_chunk, - save_prepath, - machine, - signals) + download_shot_numbers(shot_numbers_chunk, save_prepath, machine, + signals) print('Finished downloading {} shots in {} seconds'.format( len(shot_numbers), time.time()-start_time)) From 2d4dad842a4cb36488cad9bad0630752e032961d Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 29 Oct 2019 11:49:14 -0500 Subject: [PATCH 612/744] Move all hashing into a single, new file --- plasma/conf_parser.py | 13 +---- plasma/models/builder.py | 3 +- plasma/primitives/data.py | 21 +++----- plasma/utils/downloading.py | 30 ----------- plasma/utils/hashing.py | 99 +++++++++++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 55 deletions(-) create mode 100644 plasma/utils/hashing.py diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index c41431b9..13b9932f 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -1,13 +1,12 @@ from plasma.primitives.shots import ShotListFiles import data.signals as sig +from plasma.utils.hashing import myhash_signals # from data.signals import ( # all_signals, fully_defined_signals_1D, # jet, d3d) # nstx import getpass import yaml -import hashlib - def parameters(input_file): """Parse yaml file of configuration parameters.""" @@ -28,7 +27,7 @@ def parameters(input_file): params['paths']['shot_list_dir'] = ( base_path + params['paths']['shot_list_dir']) params['paths']['output_path'] = output_path - h = get_unique_signal_hash(sig.all_signals.values()) + h = myhash_signals(sig.all_signals.values()) params['paths']['global_normalizer_path'] = ( output_path + '/normalization/normalization_signal_group_{}.npz'.format(h)) @@ -384,14 +383,6 @@ def parameters(input_file): return params -def get_unique_signal_hash(signals): - return int(hashlib.md5(''.join(tuple(map(lambda x: "{}".format( - x.__hash__()), sorted(signals)))).encode('utf-8')).hexdigest(), 16) - # return int(hashlib.md5(''.join( - # tuple(map(lambda x: x.description, sorted(signals)))).encode( - # 'utf-8')).hexdigest(), 16) - - def sort_by_channels(list_of_signals): # make sure 1D signals come last! This is necessary for model builder. return sorted(list_of_signals, key=lambda x: x.num_channels) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 9e643d37..535a0f00 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -21,7 +21,8 @@ import sys import numpy as np from copy import deepcopy -from plasma.utils.downloading import makedirs_process_safe, general_object_hash +from plasma.utils.downloading import makedirs_process_safe +from plasma.utils.hashing import general_object_hash class LossHistory(Callback): diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 4710ff77..63d30abc 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -8,6 +8,7 @@ from plasma.utils.processing import get_individual_shot_file from plasma.utils.downloading import get_missing_value_array +from plasma.utils.hashing import myhash # class SignalCollection: # """GA Data Obj""" @@ -65,10 +66,8 @@ def is_saved(self, prepath, shot): def load_data_from_txt_safe(self, prepath, shot, dtype='float32'): file_path = self.get_file_path(prepath, shot.machine, shot.number) if not self.is_saved(prepath, shot): - print( - 'Signal {}, shot {} was never downloaded'.format( - self.description, - shot.number)) + print('Signal {}, shot {} was never downloaded'.format( + self.description, shot.number)) return None, False if os.path.getsize(file_path) == 0: @@ -79,15 +78,13 @@ def load_data_from_txt_safe(self, prepath, shot, dtype='float32'): try: data = np.loadtxt(file_path, dtype=dtype) if np.all(data == get_missing_value_array()): - print( - 'Signal {}, shot {} contains no data'.format( - self.description, shot.number)) + print('Signal {}, shot {} contains no data'.format( + self.description, shot.number)) return None, False except Exception as e: print(e) - print( - 'Couldnt load signal {} shot {}. Removing.'.format( - file_path, shot.number)) + print('Couldnt load signal {} shot {}. Removing.'.format( + file_path, shot.number)) os.remove(file_path) return None, False @@ -210,9 +207,7 @@ def __lt__(self, other): other.description_plus_paths()) def __hash__(self): - import hashlib - return int(hashlib.md5( - self.description_plus_paths().encode('utf-8')).hexdigest(), 16) + return myhash(self.description_plus_paths()) def __str__(self): return self.description diff --git a/plasma/utils/downloading.py b/plasma/utils/downloading.py index f8db18da..ae940c66 100644 --- a/plasma/utils/downloading.py +++ b/plasma/utils/downloading.py @@ -6,9 +6,6 @@ import sys import time import numpy as np -import dill -import hashlib -from copy import deepcopy # import gadata # from plasma.primitives.shots import ShotList @@ -32,33 +29,6 @@ pass -def general_object_hash(o): - """ - Makes a hash from a dictionary, list, tuple or set to any level, that - contains only other hashable types (including any lists, tuples, sets, and - dictionaries). Relies on dill for serialization - """ - - if isinstance(o, (set, tuple, list)): - return tuple([general_object_hash(e) for e in o]) - - elif not isinstance(o, dict): - return myhash(o) - - new_o = deepcopy(o) - # recursively call this function when given a dictionary - for k, v in new_o.items(): - # replace the dict entry value with its hash - new_o[k] = general_object_hash(v) - - return myhash(tuple(sorted(frozenset(new_o.items())))) - - -def myhash(x): - return int(hashlib.md5((dill.dumps(x).decode('unicode_escape')).encode( - 'utf-8')).hexdigest(), 16) - - def get_missing_value_array(): return np.array([-1.0]) diff --git a/plasma/utils/hashing.py b/plasma/utils/hashing.py new file mode 100644 index 00000000..85e7d91e --- /dev/null +++ b/plasma/utils/hashing.py @@ -0,0 +1,99 @@ +from __future__ import print_function +import dill +import hashlib +import copy + + +def general_object_hash(o): + """ + Serialize and hash a dictionary, list, tuple, or set (nested to any level), + containing only other hashable types (including any lists, tuples, sets, & + dictionaries). Relies on myhash(), which relies on dill for serialization + + Reference: https://stackoverflow.com/questions/5884066/hashing-a-dictionary + + Requirements: + - Supports nested dictionaries (possibly with str keys only?) + - Well-defined for a given object beyond its lifetime + - Stable for multiple invocations of the Python kernel and across different + machines + """ + + # TODO(KGF): currently, likely no unordered set/frozenset dict vals in conf + # dictionary passed to this fn. There is no sorting in this 1st branch, so + # resulting tuple of hashes would have arbitrary ordering... + if isinstance(o, (set, frozenset, tuple, list)): + # for (possibly mutable) ordered sequence types (list, tuple) and + # unordered set types (set, frozenset): independently hash each element + # in the container, and convert to immutable tuple + return tuple([general_object_hash(e) for e in o]) + + elif not isinstance(o, dict): + # sequence and set types handled above, mapping types (dict) handled below. + # Other objs can be directly serialized and hashed, including: + # - Text sequence (str) + # - Binary sequence (bytes) + # - Numeric types + return myhash_obj(o) + + new_o = copy.deepcopy(o) + # recursively call this function when given a dictionary + for k, v in new_o.items(): + # in the deep copy, replace the value of dict entry with its hash (int) + new_o[k] = general_object_hash(v) + + # TODO(KGF): consider alternative suggested in above post. Instead of + # sorted + frozenset + dill.dumps(), json.dumps() can do 1st + 3rd steps + # Keys must all be strings in this method. Add explicit check of this cond. + + # import json + # json.dumps(new_o, sort_keys=True, ensure_ascii=True) # or False? + + # With all values of the (possibly nested) dict obj replaced by integer + # hashes or tuples of hashes, sort a list of unique (key, hash) items, and + # convert to immutable tuple obj before passing to serialize+hash method + return myhash_obj(tuple(sorted(frozenset(new_o.items())))) + # TODO(KGF): sorted() is stable, so it won't swap relative order of + # elements that compare equal. However, if the initial aribtrary ordering + # changes between kernel invocations, then two "equal" items will remain + # reordered after sorted(), thus changing the final hash. Probably fine if + # the lowest level of hashed object in nested struct avoids hash collisions + + +def myhash_obj(x): + ''' + Serialize a generic Python object using dill, decode the bytes obj, + then pass the Unicode string to the particular hash function. + ''' + return myhash(dill.dumps(x).decode('unicode_escape')) + + +def myhash_signals(signals): + ''' + Given a List of Signal class instances, sort by their str representations + (descriptions), concatenate their hexadecimal hashes (converted to + base-10), and hash the resulting str + ''' + return myhash(''.join(tuple(map(lambda x: "{}".format(x.__hash__()), + sorted(signals))))) + + +def myhash(x): + ''' + Hash a str with MD5 and return as a decimal (integer) + + hashlib is used instead of Python built-in method hash() + in order to guarantee a stable/well-defined hash algorithm + + Since Python 3.3, PYTHONHASHSEED=random is the default setting, which + randomizes the seed used for salting the hash() function to prevent DoS + attacks that exploit hash collisions. + + See http://ocert.org/advisories/ocert-2011-003.html. + + Python 3.4 further improves the default hash algorithm (PEP 456). + ''' + # re-encode the string into bytes object with UTF-8, create hash class obj + # using MD5 algorithm, then return hex digits as str type, which finally + # int(..., 16) ---> convert hexadecimal hash to base-10 integer + return int(hashlib.md5(x.encode('utf-8')).hexdigest(), 16) From b38eb1107ea017b0146a5d82fa702df7a259a1b2 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 29 Oct 2019 11:54:00 -0500 Subject: [PATCH 613/744] Shorten line --- plasma/utils/hashing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/hashing.py b/plasma/utils/hashing.py index 85e7d91e..b5c5a1d4 100644 --- a/plasma/utils/hashing.py +++ b/plasma/utils/hashing.py @@ -29,7 +29,7 @@ def general_object_hash(o): return tuple([general_object_hash(e) for e in o]) elif not isinstance(o, dict): - # sequence and set types handled above, mapping types (dict) handled below. + # sequence and set types handled above, mapping types (dict) below. # Other objs can be directly serialized and hashed, including: # - Text sequence (str) # - Binary sequence (bytes) From 8137d79212515d812f95823ee27e958cb8c5a2cf Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 29 Oct 2019 16:35:35 -0400 Subject: [PATCH 614/744] Try ignoring NumPy>=1.17.0 incompatibility with TensorFlow<2.0.0 As a test, only suppressing single import of Keras (and hence TF backend) that occurs when importing conf directly. Reference: https://github.com/tensorflow/tensorflow/issues/30427 --- plasma/models/builder.py | 5 ++--- plasma/models/mpi_runner.py | 18 +++++++++--------- plasma/models/targets.py | 10 ++++++++-- plasma/utils/state_reset.py | 4 +--- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 535a0f00..5e2c9eb0 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -72,9 +72,8 @@ def get_0D_1D_indices(self): num_0D += 1 is_1D_region = False curr_idx += num_channels - return np.array(indices_0d).astype( - np.int32), np.array(indices_1d).astype( - np.int32), num_0D, num_1D + return (np.array(indices_0d).astype(np.int32), + np.array(indices_1d).astype(np.int32), num_0D, num_1D) def build_model(self, predict, custom_batch_size=None): conf = self.conf diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 29eb1573..0be18ebf 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -5,12 +5,10 @@ from plasma.utils.evaluation import get_loss_from_list from plasma.models import builder from plasma.models.loader import ProcessGenerator -from plasma.utils.state_reset import reset_states # , get_states +from plasma.utils.state_reset import reset_states from plasma.conf import conf from pprint import pprint from mpi4py import MPI -# import mpi4py -# import getpass ''' ######################################################### This file trains a deep learning model to predict @@ -56,7 +54,7 @@ if NUM_GPUS > 1: os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU) # ,mode=NanGuardMode' - os.environ['KERAS_BACKEND'] = 'tensorflow' + os.environ['KERAS_BACKEND'] = 'tensorflow' # default setting import tensorflow as tf from keras.backend.tensorflow_backend import set_session gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95, @@ -71,7 +69,7 @@ 'device=gpu{},floatX=float32,base_compiledir={}'.format( MY_GPU, base_compile_dir)) # ,mode=NanGuardMode' # import theano -# import keras + # import keras for i in range(num_workers): comm.Barrier() if i == task_index: @@ -862,13 +860,15 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, if ('monitor_test' in conf['callbacks'].keys() and conf['callbacks']['monitor_test']): times = conf['callbacks']['monitor_times'] - roc_areas, losses = mpi_make_predictions_and_evaluate_multiple_times(conf, shot_list_validate, loader, times) # noqa - for roc, t in zip(roc_areas, times): + areas, _ = mpi_make_predictions_and_evaluate_multiple_times( + conf, shot_list_validate, loader, times) + for roc, t in zip(areas, times): print_unique('epoch {}, val_roc_{} = {}'.format( int(round(e)), t, roc)) if shot_list_test is not None: - roc_areas, losses = mpi_make_predictions_and_evaluate_multiple_times(conf, shot_list_test, loader, times) # noqa - for roc, t in zip(roc_areas, times): + areas, _ = mpi_make_predictions_and_evaluate_multiple_times( + conf, shot_list_test, loader, times) + for roc, t in zip(areas, times): print_unique('epoch {}, test_roc_{} = {}'.format( int(round(e)), t, roc)) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 558d644f..1960ea23 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -1,12 +1,18 @@ import numpy as np import abc -from keras.losses import hinge # squared_hinge, mean_absolute_percentage_error from plasma.utils.evaluation import ( mse_np, binary_crossentropy_np, hinge_np, # mae_np, squared_hinge_np, ) -import keras.backend as K + +import warnings +# TODO(KGF): temporarily suppress numpy>=1.17.0 warning with TF<2.0.0 +# ~6x tensorflow/python/framework/dtypes.py:529: FutureWarning ... +warnings.filterwarnings('ignore', category=FutureWarning) +import keras.backend as K # noqa +from keras.losses import hinge # noqa +warnings.resetwarnings() # Requirement: larger value must mean disruption more likely. diff --git a/plasma/utils/state_reset.py b/plasma/utils/state_reset.py index 172023bf..2d4591a3 100644 --- a/plasma/utils/state_reset.py +++ b/plasma/utils/state_reset.py @@ -1,5 +1,4 @@ from __future__ import print_function -import keras.backend as K def get_states(model): @@ -8,10 +7,9 @@ def get_states(model): if hasattr(layer, "states"): layer_states = [] for state in layer.states: - # print(K.get_value(state)[0][0:3]) + import keras.backend as K layer_states.append(K.get_value(state)) all_states.append(layer_states) - # print(all_states) return all_states From a171f7bc963df2c31f422c39214552a8fdc9b7c4 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 30 Oct 2019 16:49:06 -0400 Subject: [PATCH 615/744] Do not call warnings.resetwarnings(); use context manager Narrowly-tailor regex for excluding particular FutureWarning message encountered in the TensorFlow module import Need default filtered warnings and additional filters added by other modules. --- plasma/models/targets.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 1960ea23..384bb35e 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,14 +5,16 @@ mse_np, binary_crossentropy_np, hinge_np, # mae_np, squared_hinge_np, ) - import warnings # TODO(KGF): temporarily suppress numpy>=1.17.0 warning with TF<2.0.0 # ~6x tensorflow/python/framework/dtypes.py:529: FutureWarning ... -warnings.filterwarnings('ignore', category=FutureWarning) -import keras.backend as K # noqa -from keras.losses import hinge # noqa -warnings.resetwarnings() +with warnings.catch_warnings(record=True) as w: + warnings.filterwarnings('ignore', + category=FutureWarning, + message=r"passing \(type, 1\) or '1type' as a synonym of type is deprecated", # noqa + module="tensorflow") + import keras.backend as K # noqa + from keras.losses import hinge # noqa # Requirement: larger value must mean disruption more likely. From ac79e252bcb9be6407617ca85731d9f4636df717 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Mon, 4 Nov 2019 15:54:20 -0600 Subject: [PATCH 616/744] Remove debugging print() calls and commented out __init__.py content --- plasma/__init__.py | 15 --------------- plasma/conf_parser.py | 4 ++++ plasma/models/mpi_runner.py | 13 ++++++++----- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/plasma/__init__.py b/plasma/__init__.py index 0e21193f..e69de29b 100644 --- a/plasma/__init__.py +++ b/plasma/__init__.py @@ -1,15 +0,0 @@ -# from plasma.conf import * -# from plasma.jet_signals import * - -# from plasma.model.builder import * -# from plasma.model.runner import * -# from plasma.model.targets import * - -# from plasma.preprocessor.load import * -# from plasma.preprocessor.normalize import * -# from plasma.preprocessor.preprocess import * - -# from plasma.primitives.shots import * - -# from plasma.utils.preprocessing import * -# from plasma.utils.performance_analysis_utils import * diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 13b9932f..06436c72 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -10,6 +10,10 @@ def parameters(input_file): """Parse yaml file of configuration parameters.""" + # TODO(KGF): the following line imports TensorFlow as a Keras backend + # by default (absent env variable KERAS_BACKEND and/or config file + # $HOME/.keras/keras.json) "from plasma.conf import conf" + # via "import keras.backend as K" in targets.py from plasma.models.targets import ( HingeTarget, MaxHingeTarget, BinaryTarget, TTDTarget, TTDInvTarget, TTDLinearTarget diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 0be18ebf..df527f00 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -519,7 +519,7 @@ def train_epoch(self): self.comm.Barrier() sys.stdout.flush() print_unique('Compilation finished in {:.2f}s'.format( - time.time()-t0_comp)) + time.time() - t0_comp)) t_start = time.time() sys.stdout.flush() @@ -627,7 +627,8 @@ def add_params(params1, params2): def get_shot_list_path(conf): - # KGF: not compatible with flexible conf.py hierarchy + # TODO(KGF): incompatible with flexible conf.py hierarchy; see setting of + # 'normalizer_path', 'global_normalizer_path' return conf['paths']['base_path'] + '/normalization/shot_lists.npz' @@ -761,6 +762,9 @@ def mpi_make_predictions_and_evaluate_multiple_times(conf, shot_list, loader, def mpi_train(conf, shot_list_train, shot_list_validate, loader, callbacks_list=None, shot_list_test=None): loader.set_inference_mode(False) + + # TODO(KGF): this is not defined in conf.yaml, but added to processed dict + # for the first time here: conf['num_workers'] = comm.Get_size() specific_builder = builder.ModelBuilder(conf) @@ -827,7 +831,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, cmp_fn = min while e < num_epochs-1: - print_unique("begin epoch {} 0".format(e)) + print_unique("begin epoch {}".format(e)) if task_index == 0: callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) @@ -908,9 +912,8 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, tensorboard.on_epoch_end(val_generator, val_steps, int(round(e)), epoch_logs) - print_unique("end epoch {} 0".format(e)) stop_training = comm.bcast(stop_training, root=0) - print_unique("end epoch {} 1".format(e)) + print_unique("end epoch {}".format(e)) if stop_training: print("Stopping training due to early stopping") break From b1ff7e6106b0ac4a22541d32c80c77a572c4877c Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 14:17:36 -0500 Subject: [PATCH 617/744] Move TF warning suppression to top-level __init__.py --- plasma/__init__.py | 7 +++++++ plasma/models/targets.py | 10 ---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/plasma/__init__.py b/plasma/__init__.py index e69de29b..963dded2 100644 --- a/plasma/__init__.py +++ b/plasma/__init__.py @@ -0,0 +1,7 @@ +import warnings +# TODO(KGF): temporarily suppress numpy>=1.17.0 warning with TF<2.0.0 +# ~6x tensorflow/python/framework/dtypes.py:529: FutureWarning ... +warnings.filterwarnings('ignore', + category=FutureWarning, + message=r"passing \(type, 1\) or '1type' as a synonym of type is deprecated", # noqa + module="tensorflow") diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 384bb35e..a478125a 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,16 +5,6 @@ mse_np, binary_crossentropy_np, hinge_np, # mae_np, squared_hinge_np, ) -import warnings -# TODO(KGF): temporarily suppress numpy>=1.17.0 warning with TF<2.0.0 -# ~6x tensorflow/python/framework/dtypes.py:529: FutureWarning ... -with warnings.catch_warnings(record=True) as w: - warnings.filterwarnings('ignore', - category=FutureWarning, - message=r"passing \(type, 1\) or '1type' as a synonym of type is deprecated", # noqa - module="tensorflow") - import keras.backend as K # noqa - from keras.losses import hinge # noqa # Requirement: larger value must mean disruption more likely. From 87a275afab59794b3d8a4c9feb56536f9884c5d0 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 13:18:12 -0600 Subject: [PATCH 618/744] Use more print_unique() in mpi_runner.py --- examples/conf.yaml | 4 ++-- plasma/models/mpi_runner.py | 34 +++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/examples/conf.yaml b/examples/conf.yaml index e125a391..dfda1145 100644 --- a/examples/conf.yaml +++ b/examples/conf.yaml @@ -4,7 +4,7 @@ fs_path: '/tigress' target: 'hinge' # 'maxhinge' # 'maxhinge' # 'binary' # 'hinge' -num_gpus: 4 +num_gpus: 4 # per node paths: signal_prepath: '/signal_data/' # /signal_data/jet/ @@ -105,7 +105,7 @@ model: stateful: True return_sequences: True dropout_prob: 0.1 - # only relevant if we want to do mpi training. The number of steps with a single replica + # only relevant if we want to do MPI training. The number of steps with a single replica warmup_steps: 0 ignore_timesteps: 100 # how many initial timesteps to ignore during evaluation (to let the internal state settle) backend: 'tensorflow' diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index df527f00..c9593468 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -7,7 +7,6 @@ from plasma.models.loader import ProcessGenerator from plasma.utils.state_reset import reset_states from plasma.conf import conf -from pprint import pprint from mpi4py import MPI ''' ######################################################### @@ -25,6 +24,7 @@ ######################################################### ''' + import os import sys import time @@ -37,6 +37,13 @@ import socket sys.setrecursionlimit(10000) + +def pprint_unique(obj): + from pprint import pprint + if task_index == 0: + pprint(obj) + + # import keras sequentially because it otherwise reads from ~/.keras/keras.json # with too many threads: # from mpi_launch_tensorflow import get_mpi_task_index @@ -80,8 +87,7 @@ import keras.callbacks as cbks -if task_index == 0: - pprint(conf) +pprint_unique(conf) class MPIOptimizer(object): @@ -492,7 +498,7 @@ def train_epoch(self): (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, num_total, is_warmup_period) = next(batch_iterator_func) except StopIteration: - print("Resetting batch iterator.") + print_unique("Resetting batch iterator.") self.num_so_far_accum = self.num_so_far_indiv self.set_batch_iterator_func() batch_iterator_func = self.batch_iterator_func @@ -535,13 +541,12 @@ def train_epoch(self): t2 = time.time() write_str_0 = self.calculate_speed(t0, t1, t2, num_replicas) curr_loss = self.mpi_average_scalars(1.0*loss, num_replicas) - # if self.task_index == 0: - # print(self.model.get_weights()[0][0][:4]) + # print_unique(self.model.get_weights()[0][0][:4]) loss_averager.add_val(curr_loss) ave_loss = loss_averager.get_val() - eta = self.estimate_remaining_time( - t0 - t_start, - self.num_so_far - self.epoch*num_total, num_total) + eta = self.estimate_remaining_time(t0 - t_start, + self.num_so_far - self.epoch*num_total, + num_total) write_str = ( '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], '.format( self.task_index, step, eta, @@ -793,13 +798,12 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, print("Optimizer not implemented yet") exit(1) - print('{} epochs left to go'.format(num_epochs - 1 - e)) + print_unique('{} epochs left to go'.format(num_epochs - 1 - e)) - batch_generator = partial( - loader.training_batch_generator_partial_reset, - shot_list=shot_list_train) + batch_generator = partial(loader.training_batch_generator_partial_reset, + shot_list=shot_list_train) - print("warmup {}".format(warmup_steps)) + print_unique("warmup steps = {}".format(warmup_steps)) mpi_model = MPIModel(train_model, optimizer, comm, batch_generator, batch_size, lr=lr, warmup_steps=warmup_steps, num_batches_minimum=num_batches_minimum, conf=conf) @@ -915,7 +919,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, stop_training = comm.bcast(stop_training, root=0) print_unique("end epoch {}".format(e)) if stop_training: - print("Stopping training due to early stopping") + print_unique("Stopping training due to early stopping") break if task_index == 0: From b90d579932a6e5fcf97350af1b74bafb096a9ef5 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 13:44:46 -0600 Subject: [PATCH 619/744] Replace accidentally-removed imports from targets.py --- plasma/models/targets.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plasma/models/targets.py b/plasma/models/targets.py index a478125a..7f80187d 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -5,7 +5,8 @@ mse_np, binary_crossentropy_np, hinge_np, # mae_np, squared_hinge_np, ) - +import keras.backend as K +from keras.losses import hinge # Requirement: larger value must mean disruption more likely. From 9962727cad897b70c78e6c11c6ace6f214be7f98 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 14:19:26 -0600 Subject: [PATCH 620/744] Attempt dedpulication of code in mpi_learn.py from mpi_runner.py Also, call mpi_runner.print_unique() fn instead of print() in mpi_learn.py --- examples/mpi_learn.py | 58 ++++++++++++++++++++----------------- plasma/models/mpi_runner.py | 28 +++++++++--------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 8c4e7828..753edca1 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -1,11 +1,12 @@ from plasma.models.mpi_runner import ( - mpi_train, mpi_make_predictions_and_evaluate + mpi_train, mpi_make_predictions_and_evaluate, + comm, task_index, print_unique ) -from mpi4py import MPI +# from mpi4py import MPI from plasma.preprocessor.preprocess import guarantee_preprocessed from plasma.models.loader import Loader from plasma.conf import conf -from pprint import pprint +# from pprint import pprint ''' ######################################################### This file trains a deep learning model to predict @@ -37,9 +38,8 @@ if conf['model']['shallow']: - print( - "Shallow learning using MPI is not supported yet. ", - "Set conf['model']['shallow'] to False.") + print("Shallow learning using MPI is not supported yet. ", + "Set conf['model']['shallow'] to False.") exit(1) if conf['data']['normalizer'] == 'minmax': from plasma.preprocessor.normalize import MinMaxNormalizer as Normalizer @@ -57,23 +57,29 @@ print('unkown normalizer. exiting') exit(1) -comm = MPI.COMM_WORLD -task_index = comm.Get_rank() -num_workers = comm.Get_size() -NUM_GPUS = conf['num_gpus'] -MY_GPU = task_index % NUM_GPUS +# TODO(KGF): this part of the code is duplicated in mpi_runner.py +# comm = MPI.COMM_WORLD +# task_index = comm.Get_rank() +# num_workers = comm.Get_size() +# NUM_GPUS = conf['num_gpus'] +# MY_GPU = task_index % NUM_GPUS +# backend = conf['model']['backend'] + +# if task_index == 0: +# pprint(conf) + +# TODO(KGF): confirm that this second PRNG seed setting is not needed +# (before normalization; done again before MPI training) +# np.random.seed(task_index) +# random.seed(task_index) -np.random.seed(task_index) -random.seed(task_index) -if task_index == 0: - pprint(conf) only_predict = len(sys.argv) > 1 custom_path = None if only_predict: custom_path = sys.argv[1] - print("predicting using path {}".format(custom_path)) + print_unique("predicting using path {}".format(custom_path)) ##################################################### @@ -89,11 +95,11 @@ shot_list_test) = guarantee_preprocessed(conf) -print("normalization", end='') +print_unique("normalization", end='') normalizer = Normalizer(conf) normalizer.train() loader = Loader(conf, normalizer) -print("...done") +print_unique("...done") # ensure training has a separate random seed for every worker np.random.seed(task_index) @@ -104,7 +110,7 @@ # load last model for testing loader.set_inference_mode(True) -print('saving results') +print_unique('saving results') y_prime = [] y_gold = [] disruptive = [] @@ -117,12 +123,11 @@ loss_test) = mpi_make_predictions_and_evaluate(conf, shot_list_test, loader, custom_path) -if task_index == 0: - print('=========Summary========') - print('Train Loss: {:.3e}'.format(loss_train)) - print('Train ROC: {:.4f}'.format(roc_train)) - print('Test Loss: {:.3e}'.format(loss_test)) - print('Test ROC: {:.4f}'.format(roc_test)) +print_unique('=========Summary========') +print_unique('Train Loss: {:.3e}'.format(loss_train)) +print_unique('Train ROC: {:.4f}'.format(roc_train)) +print_unique('Test Loss: {:.3e}'.format(loss_test)) +print_unique('Test ROC: {:.4f}'.format(roc_test)) if task_index == 0: @@ -156,5 +161,4 @@ # requirement for "allow_pickle=True" to savez() calls sys.stdout.flush() -if task_index == 0: - print('finished.') +print_unique('finished.') diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index c9593468..1a794f7f 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -38,12 +38,6 @@ sys.setrecursionlimit(10000) -def pprint_unique(obj): - from pprint import pprint - if task_index == 0: - pprint(obj) - - # import keras sequentially because it otherwise reads from ~/.keras/keras.json # with too many threads: # from mpi_launch_tensorflow import get_mpi_task_index @@ -51,12 +45,18 @@ def pprint_unique(obj): task_index = comm.Get_rank() num_workers = comm.Get_size() - NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS - backend = conf['model']['backend'] + +def pprint_unique(obj): + from pprint import pprint + if task_index == 0: + pprint(obj) + + +# initialization code for mpi_runner.py module: if backend == 'tf' or backend == 'tensorflow': if NUM_GPUS > 1: os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU) @@ -544,13 +544,13 @@ def train_epoch(self): # print_unique(self.model.get_weights()[0][0][:4]) loss_averager.add_val(curr_loss) ave_loss = loss_averager.get_val() - eta = self.estimate_remaining_time(t0 - t_start, - self.num_so_far - self.epoch*num_total, - num_total) + eta = self.estimate_remaining_time( + t0 - t_start, self.num_so_far - self.epoch*num_total, + num_total) write_str = ( '\r[{}] step: {} [ETA: {:.2f}s] [{:.2f}/{}], '.format( - self.task_index, step, eta, - 1.0*self.num_so_far, num_total) + self.task_index, step, eta, 1.0*self.num_so_far, + num_total) + 'loss: {:.5f} [{:.5f}] | '.format(ave_loss, curr_loss) + 'walltime: {:.4f} | '.format( time.time() - self.start_time)) @@ -834,7 +834,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, best_so_far = np.inf cmp_fn = min - while e < num_epochs-1: + while e < (num_epochs - 1): print_unique("begin epoch {}".format(e)) if task_index == 0: callbacks.on_epoch_begin(int(round(e))) From 6583004621181f0be0b48e59d9dc7248549cb3a1 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 14:22:26 -0600 Subject: [PATCH 621/744] Create new class method for printing final summary of loaded/saved shots --- plasma/preprocessor/normalize.py | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 97d819e8..a19ccad1 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -73,6 +73,10 @@ def save_stats(self): def load_stats(self): pass + @abc.abstractmethod + def print_summary(self, action='loaded'): + pass + def set_inference_mode(self, val): self.inference_mode = val @@ -256,8 +260,9 @@ def incorporate_stats(self, stats): self.stds[machine] = np.concatenate( (self.stds[machine], stds), axis=0) self.num_processed[machine] = self.num_processed[machine] + 1 - self.num_disruptive[machine] = self.num_disruptive[machine] + \ - (1 if stats.is_disruptive else 0) + self.num_disruptive[machine] = ( + self.num_disruptive[machine] + + (1 if stats.is_disruptive else 0)) def apply(self, shot): apply_positivity(shot) @@ -286,17 +291,10 @@ def save_stats(self): # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] self.ensure_save_directory() - np.savez( - self.path, - means=self.means, - stds=self.stds, - num_processed=self.num_processed, - num_disruptive=self.num_disruptive, - machines=self.machines) - print( - 'saved normalization data from {} shots ( {} disruptive )'.format( - self.num_processed, - self.num_disruptive)) + np.savez(self.path, means=self.means, stds=self.stds, + num_processed=self.num_processed, + num_disruptive=self.num_disruptive, machines=self.machines) + self.print_summary(action='saved') def load_stats(self): assert self.previously_saved_stats()[0], "stats not saved before" @@ -308,9 +306,11 @@ def load_stats(self): self.machines = dat['machines'][()] for machine in self.means: print('Machine {}:'.format(machine)) - print('loaded normalization data from ', - '{} shots ( {} disruptive )'.format(self.num_processed, - self.num_disruptive)) + self.print_summary() + + def print_summary(self, action='loaded'): + print('{} normalization data from {} shots ( {} disruptive )'.format( + action, self.num_processed, self.num_disruptive)) class VarNormalizer(MeanVarNormalizer): @@ -416,8 +416,8 @@ def incorporate_stats(self, stats): self.maximums[m] = (self.num_processed[m]*self.maximums + maximums)/(self.num_processed[m] + 1.0) self.num_processed[m] = self.num_processed[m] + 1 - self.num_disruptive[m] = self.num_disruptive[m] + \ - (1 if stats.is_disruptive else 0) + self.num_disruptive[m] = (self.num_disruptive[m] + + (1 if stats.is_disruptive else 0)) def apply(self, shot): apply_positivity(shot) From 7ced7587bf6803abd310a562a580ab1e9855f8f5 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 15:13:04 -0600 Subject: [PATCH 622/744] Use two different fns for controlling MPI printint to stdout --- examples/mpi_learn.py | 1 - plasma/models/mpi_runner.py | 57 ++++++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 753edca1..7f590979 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -129,7 +129,6 @@ print_unique('Test Loss: {:.3e}'.format(loss_test)) print_unique('Test ROC: {:.4f}'.format(roc_test)) - if task_index == 0: disruptive_train = np.array(disruptive_train) disruptive_test = np.array(disruptive_test) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 1a794f7f..b6038c76 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -554,16 +554,16 @@ def train_epoch(self): + 'loss: {:.5f} [{:.5f}] | '.format(ave_loss, curr_loss) + 'walltime: {:.4f} | '.format( time.time() - self.start_time)) - print_unique(write_str + write_str_0) + write_unique(write_str + write_str_0) step += 1 else: - print_unique('\r[{}] warmup phase, num so far: {}'.format( + write_unique('\r[{}] warmup phase, num so far: {}'.format( self.task_index, self.num_so_far)) effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch self.epoch = effective_epochs - print_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed)'.format( + write_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed)'.format( 1.0 * self.epoch, self.epoch - epoch_previous) + ' in {:.2f} seconds.\n'.format(t2 - t_start)) return (step, ave_loss, curr_loss, self.num_so_far, effective_epochs) @@ -576,7 +576,7 @@ def estimate_remaining_time(self, time_so_far, work_so_far, work_total): def get_effective_lr(self, num_replicas): effective_lr = self.lr * num_replicas if effective_lr > self.max_lr: - print_unique('Warning: effective learning rate set to {}, '.format( + write_unique('Warning: effective learning rate set to {}, '.format( effective_lr) + 'larger than maximum {}. Clipping.'.format( self.max_lr)) effective_lr = self.max_lr @@ -604,18 +604,41 @@ def calculate_speed(self, t0, t_after_deltas, t_after_update, num_replicas, effective_batch_size, self.batch_size, num_replicas, self.get_effective_lr(num_replicas), self.lr, num_replicas) if verbose: - print_unique(print_str) + write_unique(print_str) return print_str -def print_unique(print_str): +def print_unique(print_output, end='\n', flush=False): + """ + Only master MPI rank 0 calls print(). + + Trivial wrapper function to print() + """ + if task_index == 0: + print(print_output, end=end, flush=flush) + + +def write_unique(write_str): + """ + Only master MPI rank 0 writes to and flushes stdout. + + A specialized case of print_unique(). Unlike print(), sys.stdout.write(): + - Must pass a string; will not cast argument + - end='\n' kwarg of print() is not available + (often the argument here is prepended with \r=carriage return in order to + simulate a terminal output that overwrites itself) + """ + # TODO(KGF): \r carriage returns appear as ^M in Unix-encoded .out files + # from non-interactive Slurm batch jobs. Convert these to true Unix + # line feeds / newlines (^J, \n) when we can detect such a stdout if task_index == 0: - sys.stdout.write(print_str) + sys.stdout.write(write_str) sys.stdout.flush() -def print_all(print_str): - sys.stdout.write('[{}] '.format(task_index) + print_str) +def write_all(write_str): + '''All MPI ranks write to stdout, appending [rank]''' + sys.stdout.write('[{}] '.format(task_index) + write_str) sys.stdout.flush() @@ -798,12 +821,12 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, print("Optimizer not implemented yet") exit(1) - print_unique('{} epochs left to go'.format(num_epochs - 1 - e)) + write_unique('{} epochs left to go'.format(num_epochs - 1 - e)) batch_generator = partial(loader.training_batch_generator_partial_reset, shot_list=shot_list_train) - print_unique("warmup steps = {}".format(warmup_steps)) + write_unique("warmup steps = {}".format(warmup_steps)) mpi_model = MPIModel(train_model, optimizer, comm, batch_generator, batch_size, lr=lr, warmup_steps=warmup_steps, num_batches_minimum=num_batches_minimum, conf=conf) @@ -835,11 +858,11 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, cmp_fn = min while e < (num_epochs - 1): - print_unique("begin epoch {}".format(e)) + write_unique("begin epoch {}".format(e)) if task_index == 0: callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) - print_unique('\nEpoch {}/{}'.format(e, num_epochs)) + write_unique('\nEpoch {}/{}'.format(e, num_epochs)) (step, ave_loss, curr_loss, num_so_far, effective_epochs) = mpi_model.train_epoch() @@ -871,13 +894,13 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, areas, _ = mpi_make_predictions_and_evaluate_multiple_times( conf, shot_list_validate, loader, times) for roc, t in zip(areas, times): - print_unique('epoch {}, val_roc_{} = {}'.format( + write_unique('epoch {}, val_roc_{} = {}'.format( int(round(e)), t, roc)) if shot_list_test is not None: areas, _ = mpi_make_predictions_and_evaluate_multiple_times( conf, shot_list_test, loader, times) for roc, t in zip(areas, times): - print_unique('epoch {}, test_roc_{} = {}'.format( + write_unique('epoch {}, test_roc_{} = {}'.format( int(round(e)), t, roc)) epoch_logs['val_roc'] = roc_area @@ -917,9 +940,9 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, int(round(e)), epoch_logs) stop_training = comm.bcast(stop_training, root=0) - print_unique("end epoch {}".format(e)) + write_unique("end epoch {}".format(e)) if stop_training: - print_unique("Stopping training due to early stopping") + write_unique("Stopping training due to early stopping") break if task_index == 0: From 052b345c084642e52f7b2f570c387e9c8212bf36 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 15:21:38 -0600 Subject: [PATCH 623/744] Re-add newline to end of "normalization" stdout May have made sense to suppress it and later add "...done" to indicate progress, but only if nothing is written to stdout in the meantime. --- examples/mpi_learn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 7f590979..d6e45e40 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -95,7 +95,7 @@ shot_list_test) = guarantee_preprocessed(conf) -print_unique("normalization", end='') +print_unique("begin normalization...") # , end='') normalizer = Normalizer(conf) normalizer.train() loader = Loader(conf, normalizer) From 55639ce76331095c81c37bf6b5a3dd9431d5b9ee Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 15:30:39 -0600 Subject: [PATCH 624/744] Prepare to call print_unique() or analog in normalize.py --- examples/mpi_learn.py | 18 +---------------- plasma/preprocessor/normalize.py | 34 ++++++++++---------------------- 2 files changed, 11 insertions(+), 41 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index d6e45e40..de819b69 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -2,11 +2,9 @@ mpi_train, mpi_make_predictions_and_evaluate, comm, task_index, print_unique ) -# from mpi4py import MPI from plasma.preprocessor.preprocess import guarantee_preprocessed from plasma.models.loader import Loader from plasma.conf import conf -# from pprint import pprint ''' ######################################################### This file trains a deep learning model to predict @@ -57,24 +55,11 @@ print('unkown normalizer. exiting') exit(1) -# TODO(KGF): this part of the code is duplicated in mpi_runner.py -# comm = MPI.COMM_WORLD -# task_index = comm.Get_rank() -# num_workers = comm.Get_size() - -# NUM_GPUS = conf['num_gpus'] -# MY_GPU = task_index % NUM_GPUS -# backend = conf['model']['backend'] - -# if task_index == 0: -# pprint(conf) - # TODO(KGF): confirm that this second PRNG seed setting is not needed # (before normalization; done again before MPI training) # np.random.seed(task_index) # random.seed(task_index) - only_predict = len(sys.argv) > 1 custom_path = None if only_predict: @@ -94,8 +79,7 @@ (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf) - -print_unique("begin normalization...") # , end='') +print_unique("begin normalization...") normalizer = Normalizer(conf) normalizer.train() loader = Loader(conf, normalizer) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index a19ccad1..1008bde7 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -73,9 +73,9 @@ def save_stats(self): def load_stats(self): pass - @abc.abstractmethod def print_summary(self, action='loaded'): - pass + print('{} normalization data from {} shots ( {} disruptive )'.format( + action, self.num_processed, self.num_disruptive)) def set_inference_mode(self, val): self.inference_mode = val @@ -132,8 +132,7 @@ def train_on_files(self, shot_files, use_shots, all_machines): start_time = time.time() for (i, stats) in enumerate(pool.imap_unordered( - self.train_on_single_shot, - shot_list_picked)): + self.train_on_single_shot, shot_list_picked)): # for (i,stats) in # enumerate(map(self.train_on_single_shot,shot_list_picked)): if stats.machine in machines_to_compute: @@ -308,10 +307,6 @@ def load_stats(self): print('Machine {}:'.format(machine)) self.print_summary() - def print_summary(self, action='loaded'): - print('{} normalization data from {} shots ( {} disruptive )'.format( - action, self.num_processed, self.num_disruptive)) - class VarNormalizer(MeanVarNormalizer): def apply(self, shot): @@ -341,7 +336,6 @@ def __str__(self): class AveragingVarNormalizer(VarNormalizer): - def apply(self, shot): apply_positivity(shot) super(AveragingVarNormalizer, self).apply(shot) @@ -444,17 +438,10 @@ def save_stats(self): # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] self.ensure_save_directory() - np.savez( - self.path, - minimums=self.minimums, - maximums=self.maximums, - num_processed=self.num_processed, - num_disruptive=self.num_disruptive, - machines=self.machines) - print( - 'saved normalization data from {} shots ( {} disruptive )'.format( - self.num_processed, - self.num_disruptive)) + np.savez(self.path, minimums=self.minimums, maximums=self.maximums, + num_processed=self.num_processed, + num_disruptive=self.num_disruptive, machines=self.machines) + self.print_summary(action='saved') def load_stats(self): assert(self.previously_saved_stats()[0]) @@ -464,10 +451,9 @@ def load_stats(self): self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] - print( - 'loaded normalization data from {} shots ( {} disruptive )'.format( - self.num_processed, - self.num_disruptive)) + for machine in self.means: + print('Machine {}:'.format(machine)) + self.print_summary() def get_individual_shot_file(prepath, shot_num, ext='.txt'): From 39709fde190c349892259777f73049aa19bb3ca8 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 16:09:10 -0600 Subject: [PATCH 625/744] Extract all MPI variables to separate, global/shared module Uncomment setting of NumPy random number seed at top of mpi_learn.py --- examples/mpi_learn.py | 51 ++++++---- plasma/global_vars.py | 63 ++++++++++++ plasma/models/mpi_runner.py | 186 ++++++++++++++---------------------- 3 files changed, 166 insertions(+), 134 deletions(-) create mode 100644 plasma/global_vars.py diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index de819b69..935be33e 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -1,6 +1,6 @@ +import plasma.global_vars as g from plasma.models.mpi_runner import ( - mpi_train, mpi_make_predictions_and_evaluate, - comm, task_index, print_unique + mpi_train, mpi_make_predictions_and_evaluate ) from plasma.preprocessor.preprocess import guarantee_preprocessed from plasma.models.loader import Loader @@ -55,46 +55,55 @@ print('unkown normalizer. exiting') exit(1) -# TODO(KGF): confirm that this second PRNG seed setting is not needed -# (before normalization; done again before MPI training) -# np.random.seed(task_index) -# random.seed(task_index) +# set PRNG seed, unique for each worker, based on MPI task index for +# reproducible shuffling in guranteed_preprocessed() and training steps +np.random.seed(g.task_index) +random.seed(g.task_index) only_predict = len(sys.argv) > 1 custom_path = None if only_predict: custom_path = sys.argv[1] - print_unique("predicting using path {}".format(custom_path)) + g.print_unique("predicting using path {}".format(custom_path)) ##################################################### # NORMALIZATION # ##################################################### # make sure preprocessing has been run, and is saved as a file -if task_index == 0: +if g.task_index == 0: # TODO(KGF): check tuple unpack (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf) -comm.Barrier() +g.comm.Barrier() (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf) -print_unique("begin normalization...") +g.print_unique("begin normalization...") normalizer = Normalizer(conf) normalizer.train() loader = Loader(conf, normalizer) -print_unique("...done") +g.print_unique("...done") + +##################################################### +# TRAINING # +##################################################### # ensure training has a separate random seed for every worker -np.random.seed(task_index) -random.seed(task_index) +# TODO(KGF): can probably delete the next two lines. Check. +np.random.seed(g.task_index) +random.seed(g.task_index) if not only_predict: mpi_train(conf, shot_list_train, shot_list_validate, loader, shot_list_test=shot_list_test) +##################################################### +# TESTING # +##################################################### + # load last model for testing loader.set_inference_mode(True) -print_unique('saving results') +g.print_unique('saving results') y_prime = [] y_gold = [] disruptive = [] @@ -107,13 +116,13 @@ loss_test) = mpi_make_predictions_and_evaluate(conf, shot_list_test, loader, custom_path) -print_unique('=========Summary========') -print_unique('Train Loss: {:.3e}'.format(loss_train)) -print_unique('Train ROC: {:.4f}'.format(roc_train)) -print_unique('Test Loss: {:.3e}'.format(loss_test)) -print_unique('Test ROC: {:.4f}'.format(roc_test)) +g.print_unique('=========Summary========') +g.print_unique('Train Loss: {:.3e}'.format(loss_train)) +g.print_unique('Train ROC: {:.4f}'.format(roc_train)) +g.print_unique('Test Loss: {:.3e}'.format(loss_test)) +g.print_unique('Test ROC: {:.4f}'.format(roc_test)) -if task_index == 0: +if g.task_index == 0: disruptive_train = np.array(disruptive_train) disruptive_test = np.array(disruptive_test) @@ -144,4 +153,4 @@ # requirement for "allow_pickle=True" to savez() calls sys.stdout.flush() -print_unique('finished.') +g.print_unique('finished.') diff --git a/plasma/global_vars.py b/plasma/global_vars.py new file mode 100644 index 00000000..a97c8a83 --- /dev/null +++ b/plasma/global_vars.py @@ -0,0 +1,63 @@ +import sys + +# global variable defaults for non-MPI runs +comm = None +task_index = 0 +num_workers = 1 +NUM_GPUS = 0 +MY_GPU = 0 +backend = '' + + +def init_MPI(conf): + from mpi4py import MPI + global comm, task_index, num_workers + global NUM_GPUS, MY_GPU, backend + + comm = MPI.COMM_WORLD + task_index = comm.Get_rank() + num_workers = comm.Get_size() + + NUM_GPUS = conf['num_gpus'] + MY_GPU = task_index % NUM_GPUS + backend = conf['model']['backend'] + + +def pprint_unique(obj): + from pprint import pprint + if task_index == 0: + pprint(obj) + + +def print_unique(print_output, end='\n', flush=False): + """ + Only master MPI rank 0 calls print(). + + Trivial wrapper function to print() + """ + if task_index == 0: + print(print_output, end=end, flush=flush) + + +def write_unique(write_str): + """ + Only master MPI rank 0 writes to and flushes stdout. + + A specialized case of print_unique(). Unlike print(), sys.stdout.write(): + - Must pass a string; will not cast argument + - end='\n' kwarg of print() is not available + (often the argument here is prepended with \r=carriage return in order to + simulate a terminal output that overwrites itself) + """ + # TODO(KGF): \r carriage returns appear as ^M in Unix-encoded .out files + # from non-interactive Slurm batch jobs. Convert these to true Unix + # line feeds / newlines (^J, \n) when we can detect such a stdout + if task_index == 0: + sys.stdout.write(write_str) + sys.stdout.flush() + + +def write_all(write_str): + '''All MPI ranks write to stdout, appending [rank]''' + sys.stdout.write('[{}] '.format(task_index) + write_str) + sys.stdout.flush() diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index b6038c76..898e4de1 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -1,4 +1,5 @@ from __future__ import print_function +import plasma.global_vars as g from plasma.primitives.ops import mpi_sum_f16 from plasma.utils.performance import PerformanceAnalyzer from plasma.utils.processing import concatenate_sublists @@ -41,25 +42,16 @@ # import keras sequentially because it otherwise reads from ~/.keras/keras.json # with too many threads: # from mpi_launch_tensorflow import get_mpi_task_index -comm = MPI.COMM_WORLD -task_index = comm.Get_rank() -num_workers = comm.Get_size() - -NUM_GPUS = conf['num_gpus'] -MY_GPU = task_index % NUM_GPUS -backend = conf['model']['backend'] - - -def pprint_unique(obj): - from pprint import pprint - if task_index == 0: - pprint(obj) +# set global variables for entire module regarding MPI environment +# TODO(KGF): consider moving this fn/init call to mpi_learn.py and/or +# setting "mpi_initialized" global bool flag, since that is client-facing +g.init_MPI() # initialization code for mpi_runner.py module: -if backend == 'tf' or backend == 'tensorflow': - if NUM_GPUS > 1: - os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(MY_GPU) +if g.backend == 'tf' or g.backend == 'tensorflow': + if g.NUM_GPUS > 1: + os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(g.MY_GPU) # ,mode=NanGuardMode' os.environ['KERAS_BACKEND'] = 'tensorflow' # default setting import tensorflow as tf @@ -71,23 +63,23 @@ def pprint_unique(obj): else: os.environ['KERAS_BACKEND'] = 'theano' base_compile_dir = '{}/tmp/{}-{}'.format( - conf['paths']['output_path'], socket.gethostname(), task_index) + conf['paths']['output_path'], socket.gethostname(), g.task_index) os.environ['THEANO_FLAGS'] = ( 'device=gpu{},floatX=float32,base_compiledir={}'.format( - MY_GPU, base_compile_dir)) # ,mode=NanGuardMode' + g.MY_GPU, base_compile_dir)) # ,mode=NanGuardMode' # import theano # import keras -for i in range(num_workers): - comm.Barrier() - if i == task_index: - print('[{}] importing Keras'.format(task_index)) +for i in range(g.num_workers): + g.comm.Barrier() + if i == g.task_index: + print('[{}] importing Keras'.format(g.task_index)) from keras import backend as K # from keras.optimizers import * from keras.utils.generic_utils import Progbar import keras.callbacks as cbks -pprint_unique(conf) +g.pprint_unique(conf) class MPIOptimizer(object): @@ -108,8 +100,8 @@ def __init__(self, lr): def get_deltas(self, raw_deltas): deltas = [] - for g in raw_deltas: - deltas.append(self.lr*g) + for grad in raw_deltas: + deltas.append(self.lr*grad) self.iterations += 1 return deltas @@ -126,9 +118,9 @@ def get_deltas(self, raw_deltas): if self.iterations == 0: self.velocity_list = [np.zeros_like(g) for g in raw_deltas] - for (i, g) in enumerate(raw_deltas): + for (i, grad) in enumerate(raw_deltas): self.velocity_list[i] = ( - self.momentum * self.velocity_list[i] + self.lr * g) + self.momentum * self.velocity_list[i] + self.lr * grad) deltas.append(self.velocity_list[i]) self.iterations += 1 @@ -146,15 +138,15 @@ def __init__(self, lr): def get_deltas(self, raw_deltas): if self.iterations == 0: - self.m_list = [np.zeros_like(g) for g in raw_deltas] - self.v_list = [np.zeros_like(g) for g in raw_deltas] + self.m_list = [np.zeros_like(grad) for grad in raw_deltas] + self.v_list = [np.zeros_like(grad) for grad in raw_deltas] t = self.iterations + 1 lr_t = self.lr * np.sqrt(1-self.beta_2**t)/(1-self.beta_1**t) deltas = [] - for (i, g) in enumerate(raw_deltas): - m_t = (self.beta_1 * self.m_list[i]) + (1 - self.beta_1) * g - v_t = (self.beta_2 * self.v_list[i]) + (1 - self.beta_2) * (g**2) + for (i, grad) in enumerate(raw_deltas): + m_t = (self.beta_1 * self.m_list[i]) + (1-self.beta_1) * grad + v_t = (self.beta_2 * self.v_list[i]) + (1-self.beta_2) * (grad**2) delta_t = lr_t * m_t / (np.sqrt(v_t) + self.eps) deltas.append(delta_t) self.m_list[i] = m_t @@ -182,8 +174,8 @@ class MPIModel(): def __init__(self, model, optimizer, comm, batch_iterator, batch_size, num_replicas=None, warmup_steps=1000, lr=0.01, num_batches_minimum=100, conf=None): - random.seed(task_index) - np.random.seed(task_index) + random.seed(g.task_index) + np.random.seed(g.task_index) self.conf = conf self.start_time = time.time() self.epoch = 0 @@ -194,12 +186,13 @@ def __init__(self, model, optimizer, comm, batch_iterator, batch_size, self.optimizer = optimizer self.max_lr = 0.1 self.DUMMY_LR = 0.001 - self.comm = comm self.batch_size = batch_size self.batch_iterator = batch_iterator self.set_batch_iterator_func() self.warmup_steps = warmup_steps self.num_batches_minimum = num_batches_minimum + # TODO(KGF): duplicate/may be in conflict with global_vars.py + self.comm = comm self.num_workers = comm.Get_size() self.task_index = comm.Get_rank() self.history = cbks.History() @@ -265,11 +258,11 @@ def compile(self, optimizer, clipnorm, loss='mse'): self.ensure_equal_weights() def ensure_equal_weights(self): - if task_index == 0: + if g.task_index == 0: new_weights = self.model.get_weights() else: new_weights = None - nw = comm.bcast(new_weights, root=0) + nw = g.comm.bcast(new_weights, root=0) self.model.set_weights(nw) def train_on_batch_and_get_deltas(self, X_batch, Y_batch, verbose=False): @@ -498,7 +491,7 @@ def train_epoch(self): (batch_xs, batch_ys, batches_to_reset, num_so_far_curr, num_total, is_warmup_period) = next(batch_iterator_func) except StopIteration: - print_unique("Resetting batch iterator.") + g.print_unique("Resetting batch iterator.") self.num_so_far_accum = self.num_so_far_indiv self.set_batch_iterator_func() batch_iterator_func = self.batch_iterator_func @@ -524,7 +517,7 @@ def train_epoch(self): batch_xs, batch_ys, verbose) self.comm.Barrier() sys.stdout.flush() - print_unique('Compilation finished in {:.2f}s'.format( + g.print_unique('Compilation finished in {:.2f}s'.format( time.time() - t0_comp)) t_start = time.time() sys.stdout.flush() @@ -541,7 +534,7 @@ def train_epoch(self): t2 = time.time() write_str_0 = self.calculate_speed(t0, t1, t2, num_replicas) curr_loss = self.mpi_average_scalars(1.0*loss, num_replicas) - # print_unique(self.model.get_weights()[0][0][:4]) + # g.print_unique(self.model.get_weights()[0][0][:4]) loss_averager.add_val(curr_loss) ave_loss = loss_averager.get_val() eta = self.estimate_remaining_time( @@ -554,16 +547,16 @@ def train_epoch(self): + 'loss: {:.5f} [{:.5f}] | '.format(ave_loss, curr_loss) + 'walltime: {:.4f} | '.format( time.time() - self.start_time)) - write_unique(write_str + write_str_0) + g.write_unique(write_str + write_str_0) step += 1 else: - write_unique('\r[{}] warmup phase, num so far: {}'.format( + g.write_unique('\r[{}] warmup phase, num so far: {}'.format( self.task_index, self.num_so_far)) effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch self.epoch = effective_epochs - write_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed)'.format( + g.write_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed)'.format( 1.0 * self.epoch, self.epoch - epoch_previous) + ' in {:.2f} seconds.\n'.format(t2 - t_start)) return (step, ave_loss, curr_loss, self.num_so_far, effective_epochs) @@ -576,9 +569,10 @@ def estimate_remaining_time(self, time_so_far, work_so_far, work_total): def get_effective_lr(self, num_replicas): effective_lr = self.lr * num_replicas if effective_lr > self.max_lr: - write_unique('Warning: effective learning rate set to {}, '.format( - effective_lr) + 'larger than maximum {}. Clipping.'.format( - self.max_lr)) + g.write_unique( + 'Warning: effective learning rate set to {}, '.format( + effective_lr) + + 'larger than maximum {}. Clipping.'.format(self.max_lr)) effective_lr = self.max_lr return effective_lr @@ -604,44 +598,10 @@ def calculate_speed(self, t0, t_after_deltas, t_after_update, num_replicas, effective_batch_size, self.batch_size, num_replicas, self.get_effective_lr(num_replicas), self.lr, num_replicas) if verbose: - write_unique(print_str) + g.write_unique(print_str) return print_str -def print_unique(print_output, end='\n', flush=False): - """ - Only master MPI rank 0 calls print(). - - Trivial wrapper function to print() - """ - if task_index == 0: - print(print_output, end=end, flush=flush) - - -def write_unique(write_str): - """ - Only master MPI rank 0 writes to and flushes stdout. - - A specialized case of print_unique(). Unlike print(), sys.stdout.write(): - - Must pass a string; will not cast argument - - end='\n' kwarg of print() is not available - (often the argument here is prepended with \r=carriage return in order to - simulate a terminal output that overwrites itself) - """ - # TODO(KGF): \r carriage returns appear as ^M in Unix-encoded .out files - # from non-interactive Slurm batch jobs. Convert these to true Unix - # line feeds / newlines (^J, \n) when we can detect such a stdout - if task_index == 0: - sys.stdout.write(write_str) - sys.stdout.flush() - - -def write_all(write_str): - '''All MPI ranks write to stdout, appending [rank]''' - sys.stdout.write('[{}] '.format(task_index) + write_str) - sys.stdout.flush() - - def multiply_params(params, eps): return [el*eps for el in params] @@ -680,7 +640,7 @@ def load_shotlists(conf): def mpi_make_predictions(conf, shot_list, loader, custom_path=None): loader.set_inference_mode(True) - np.random.seed(task_index) + np.random.seed(g.task_index) shot_list.sort() # make sure all replicas have the same list specific_builder = builder.ModelBuilder(conf) @@ -693,26 +653,26 @@ def mpi_make_predictions(conf, shot_list, loader, custom_path=None): # broadcast model weights then set it explicitely: fix for Py3.6 if sys.version_info[0] > 2: - if task_index == 0: + if g.task_index == 0: new_weights = model.get_weights() else: new_weights = None - nw = comm.bcast(new_weights, root=0) + nw = g.comm.bcast(new_weights, root=0) model.set_weights(nw) model.reset_states() - if task_index == 0: + if g.task_index == 0: pbar = Progbar(len(shot_list)) shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'], do_shuffle=False, equal_size=True) y_prime_global = [] y_gold_global = [] disruptive_global = [] - if task_index != 0: + if g.task_index != 0: loader.verbose = False for (i, shot_sublist) in enumerate(shot_sublists): - if i % num_workers == task_index: + if i % g.num_workers == g.task_index: X, y, shot_lengths, disr = loader.load_as_X_y_pred(shot_sublist) # load data and fit on data @@ -730,18 +690,19 @@ def mpi_make_predictions(conf, shot_list, loader, custom_path=None): disruptive += disr # print_all('\nFinished with i = {}'.format(i)) - if i % num_workers == num_workers - 1 or i == len(shot_sublists) - 1: - comm.Barrier() - y_prime_global += concatenate_sublists(comm.allgather(y_prime)) - y_gold_global += concatenate_sublists(comm.allgather(y_gold)) + if (i % g.num_workers == g.num_workers - 1 + or i == len(shot_sublists) - 1): + g.comm.Barrier() + y_prime_global += concatenate_sublists(g.comm.allgather(y_prime)) + y_gold_global += concatenate_sublists(g.comm.allgather(y_gold)) disruptive_global += concatenate_sublists( - comm.allgather(disruptive)) - comm.Barrier() + g.comm.allgather(disruptive)) + g.comm.Barrier() y_prime = [] y_gold = [] disruptive = [] - if task_index == 0: + if g.task_index == 0: pbar.add(1.0*len(shot_sublist)) y_prime_global = y_prime_global[:len(shot_list)] @@ -793,7 +754,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, # TODO(KGF): this is not defined in conf.yaml, but added to processed dict # for the first time here: - conf['num_workers'] = comm.Get_size() + conf['num_workers'] = g.comm.Get_size() specific_builder = builder.ModelBuilder(conf) train_model = specific_builder.build_model(False) @@ -821,19 +782,19 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, print("Optimizer not implemented yet") exit(1) - write_unique('{} epochs left to go'.format(num_epochs - 1 - e)) + g.write_unique('{} epochs left to go'.format(num_epochs - 1 - e)) batch_generator = partial(loader.training_batch_generator_partial_reset, shot_list=shot_list_train) - write_unique("warmup steps = {}".format(warmup_steps)) - mpi_model = MPIModel(train_model, optimizer, comm, batch_generator, + g.write_unique("warmup steps = {}".format(warmup_steps)) + mpi_model = MPIModel(train_model, optimizer, g.comm, batch_generator, batch_size, lr=lr, warmup_steps=warmup_steps, num_batches_minimum=num_batches_minimum, conf=conf) mpi_model.compile(conf['model']['optimizer'], clipnorm, conf['data']['target'].loss) tensorboard = None - if backend != "theano" and task_index == 0: + if g.backend != "theano" and g.task_index == 0: tensorboard_save_path = conf['paths']['tensorboard_save_path'] write_grads = conf['callbacks']['write_grads'] tensorboard = TensorBoard(log_dir=tensorboard_save_path, @@ -842,7 +803,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, tensorboard.set_model(mpi_model.model) mpi_model.model.summary() - if task_index == 0: + if g.task_index == 0: callbacks = mpi_model.build_callbacks(conf, callbacks_list) callbacks.set_model(mpi_model.model) callback_metrics = conf['callbacks']['metrics'] @@ -858,18 +819,18 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, cmp_fn = min while e < (num_epochs - 1): - write_unique("begin epoch {}".format(e)) - if task_index == 0: + g.write_unique("begin epoch {}".format(e)) + if g.task_index == 0: callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) - write_unique('\nEpoch {}/{}'.format(e, num_epochs)) + g.write_unique('\nEpoch {}/{}'.format(e, num_epochs)) (step, ave_loss, curr_loss, num_so_far, effective_epochs) = mpi_model.train_epoch() e = e_old + effective_epochs loader.verbose = False # True during the first iteration - if task_index == 0: + if g.task_index == 0: specific_builder.save_model_weights(train_model, int(round(e))) epoch_logs = {} @@ -894,13 +855,13 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, areas, _ = mpi_make_predictions_and_evaluate_multiple_times( conf, shot_list_validate, loader, times) for roc, t in zip(areas, times): - write_unique('epoch {}, val_roc_{} = {}'.format( + g.write_unique('epoch {}, val_roc_{} = {}'.format( int(round(e)), t, roc)) if shot_list_test is not None: areas, _ = mpi_make_predictions_and_evaluate_multiple_times( conf, shot_list_test, loader, times) for roc, t in zip(areas, times): - write_unique('epoch {}, test_roc_{} = {}'.format( + g.write_unique('epoch {}, test_roc_{} = {}'.format( int(round(e)), t, roc)) epoch_logs['val_roc'] = roc_area @@ -909,7 +870,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']], best_so_far) stop_training = False - if task_index == 0: + if g.task_index == 0: print('=========Summary======== for epoch{}'.format(step)) print('Training Loss numpy: {:.3e}'.format(ave_loss)) print('Validation Loss: {:.3e}'.format(loss)) @@ -932,20 +893,19 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, train_model, int(round(e))) # tensorboard - if backend != 'theano': + if g.backend != 'theano': val_generator = partial(loader.training_batch_generator, shot_list=shot_list_validate)() val_steps = 1 tensorboard.on_epoch_end(val_generator, val_steps, int(round(e)), epoch_logs) - - stop_training = comm.bcast(stop_training, root=0) - write_unique("end epoch {}".format(e)) + stop_training = g.comm.bcast(stop_training, root=0) + g.write_unique("end epoch {}".format(e)) if stop_training: - write_unique("Stopping training due to early stopping") + g.write_unique("Stopping training due to early stopping") break - if task_index == 0: + if g.task_index == 0: callbacks.on_train_end() tensorboard.on_train_end() From 8a30ddd53bf8da6c77f6ad5104f4ea267850bcf5 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 16:12:18 -0600 Subject: [PATCH 626/744] Forgot to pass conf to MPI init fn --- plasma/models/mpi_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 898e4de1..08b9c765 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -46,7 +46,7 @@ # set global variables for entire module regarding MPI environment # TODO(KGF): consider moving this fn/init call to mpi_learn.py and/or # setting "mpi_initialized" global bool flag, since that is client-facing -g.init_MPI() +g.init_MPI(conf) # initialization code for mpi_runner.py module: if g.backend == 'tf' or g.backend == 'tensorflow': From 168075047c59d896819112e38c1eea802cb6b863 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 16:32:02 -0600 Subject: [PATCH 627/744] Suppress duplicated stdout output from guarantee_preprocessed() --- examples/mpi_learn.py | 3 ++- plasma/preprocessor/preprocess.py | 27 ++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 935be33e..fc6ab95d 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -76,8 +76,9 @@ (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf) g.comm.Barrier() +# TODO(KGF): why call guarantee_preprocessed() a second time with all ranks? (shot_list_train, shot_list_validate, - shot_list_test) = guarantee_preprocessed(conf) + shot_list_test) = guarantee_preprocessed(conf, verbose=True) g.print_unique("begin normalization...") normalizer = Normalizer(conf) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 9861f4a4..e93e7309 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -9,6 +9,7 @@ ''' from __future__ import print_function +import plasma.global_vars as g from os import listdir # , remove import time import sys @@ -230,14 +231,16 @@ def apply_bleed_in(conf, shot_list_train, shot_list_validate, shot_list_test): return shot_list_train, shot_list_validate, shot_list_test -def guarantee_preprocessed(conf): +def guarantee_preprocessed(conf, verbose=False): pp = Preprocessor(conf) if pp.all_are_preprocessed(): - print("shots already processed.") + if verbose: + g.print_unique("shots already processed.") (shot_list_train, shot_list_validate, shot_list_test) = pp.load_shotlists() else: - print("preprocessing all shots", end='') + if verbose: + g.print_unique("preprocessing all shots...") # , end='') pp.clean_shot_lists() shot_list = pp.preprocess_all() shot_list.sort() @@ -245,18 +248,20 @@ def guarantee_preprocessed(conf): # num_shots = len(shot_list_train) + len(shot_list_test) validation_frac = conf['training']['validation_frac'] if validation_frac <= 0.05: - print('Setting validation to a minimum of 0.05') + if verbose: + g.print_unique('Setting validation to a minimum of 0.05') validation_frac = 0.05 shot_list_train, shot_list_validate = shot_list_train.split_direct( 1.0-validation_frac, do_shuffle=True) pp.save_shotlists(shot_list_train, shot_list_validate, shot_list_test) shot_list_train, shot_list_validate, shot_list_test = apply_bleed_in( conf, shot_list_train, shot_list_validate, shot_list_test) - print('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) - print('training: {} shots, {} disruptive'.format( - len(shot_list_train), shot_list_train.num_disruptive())) - print('testing: {} shots, {} disruptive'.format( - len(shot_list_test), shot_list_test.num_disruptive())) - print("...done") + if verbose: + g.print_unique('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) + g.print_unique('training: {} shots, {} disruptive'.format( + len(shot_list_train), shot_list_train.num_disruptive())) + g.print_unique('testing: {} shots, {} disruptive'.format( + len(shot_list_test), shot_list_test.num_disruptive())) + g.print_unique("...done") return shot_list_train, shot_list_validate, shot_list_test From df41970222185665bdec6aa7ae9fa56d91c5cbd7 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 17:01:22 -0600 Subject: [PATCH 628/744] Suppress duplicated stdout output from normalize.py --- examples/mpi_learn.py | 14 ++++++++++++++ plasma/models/mpi_runner.py | 4 ++-- plasma/preprocessor/normalize.py | 13 +++++++------ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index fc6ab95d..b938f23a 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -80,12 +80,26 @@ (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf, verbose=True) +# TODO(KGF): shouldn't normalize.train() be called like guaranteed_preprocessed +# above? I.e. if Normalizer.previously_saved_stats() does not load a computed +# normalizer for all machines ("loaded normalization data from {d3d: 3449, jet: 2918} # noqa +# shots ( {d3d: 810, jet: 74} disruptive )" ), then only the master MPI rank +# calls normalizer.train() ??? g.print_unique("begin normalization...") normalizer = Normalizer(conf) normalizer.train() loader = Loader(conf, normalizer) g.print_unique("...done") +# TODO(KGF): note, "python examples/guaranteed_preprocessed.py" does NOT train +# the normalizer. Try deleting the previously-computed file, e.g. +# normalization/normalization_signal_group_250640798211266795112500621861190558178.npz # noqa +# or set conf['data']['recompute_normalization'] = True to see example stdout + +# TODO(KGF): both preprocess.py and normalize.py are littered with print() +# calls that should probably be replaced with print_unique() when they are not +# purely loading previously-computed quantities from file + ##################################################### # TRAINING # ##################################################### diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 08b9c765..e22d36bd 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -782,12 +782,12 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, print("Optimizer not implemented yet") exit(1) - g.write_unique('{} epochs left to go'.format(num_epochs - 1 - e)) + g.print_unique('{} epochs left to go'.format(num_epochs - 1 - e)) batch_generator = partial(loader.training_batch_generator_partial_reset, shot_list=shot_list_train) - g.write_unique("warmup steps = {}".format(warmup_steps)) + g.print_unique("warmup steps = {}".format(warmup_steps)) mpi_model = MPIModel(train_model, optimizer, g.comm, batch_generator, batch_size, lr=lr, warmup_steps=warmup_steps, num_batches_minimum=num_batches_minimum, conf=conf) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 1008bde7..e57a79d7 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -9,6 +9,7 @@ ''' from __future__ import print_function +import plasma.global_vars as g import os import time import sys @@ -74,7 +75,7 @@ def load_stats(self): pass def print_summary(self, action='loaded'): - print('{} normalization data from {} shots ( {} disruptive )'.format( + g.print_unique('{} normalization data from {} shots ( {} disruptive )'.format( action, self.num_processed, self.num_disruptive)) def set_inference_mode(self, val): @@ -149,7 +150,7 @@ def train_on_files(self, shot_files, use_shots, all_machines): self.save_stats() else: self.load_stats() - print(self) + g.print_unique(self) def cut_end_of_shot(self, shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] @@ -222,7 +223,7 @@ def __str__(self): for machine in self.means: means = np.median(self.means[machine], axis=0) stds = np.median(self.stds[machine], axis=0) - s += 'Machine: {}:\nMean Var Normalizer.\n'.format(machine) + s += 'Machine = {}:\nMean Var Normalizer.\n'.format(machine) s += 'means: {}\nstds: {}'.format(means, stds) return s @@ -304,8 +305,8 @@ def load_stats(self): self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] for machine in self.means: - print('Machine {}:'.format(machine)) - self.print_summary() + g.print_unique('Machine = {}:'.format(machine)) + self.print_summary() class VarNormalizer(MeanVarNormalizer): @@ -452,7 +453,7 @@ def load_stats(self): self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] for machine in self.means: - print('Machine {}:'.format(machine)) + g.print_unique('Machine {}:'.format(machine)) self.print_summary() From 409d5d5cc4a58fd5441e1887bb2da97ebb4e214a Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 17:04:30 -0600 Subject: [PATCH 629/744] Shorten line --- plasma/preprocessor/normalize.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index e57a79d7..65067508 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -75,8 +75,9 @@ def load_stats(self): pass def print_summary(self, action='loaded'): - g.print_unique('{} normalization data from {} shots ( {} disruptive )'.format( - action, self.num_processed, self.num_disruptive)) + g.print_unique( + '{} normalization data from {} shots ( {} disruptive )'.format( + action, self.num_processed, self.num_disruptive)) def set_inference_mode(self, val): self.inference_mode = val From a571715e41ba0019da0219f182c722a7bfe8dd89 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 17:43:34 -0600 Subject: [PATCH 630/744] Try ensuring that computing normalizer is only performed by master rank --- examples/mpi_learn.py | 29 ++++++++++------------------- plasma/models/mpi_runner.py | 3 ++- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index b938f23a..5b96efbe 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -70,44 +70,35 @@ ##################################################### # NORMALIZATION # ##################################################### -# make sure preprocessing has been run, and is saved as a file +normalizer = Normalizer(conf) + if g.task_index == 0: - # TODO(KGF): check tuple unpack + # make sure preprocessing has been run, and results are saved to files + # if not, only master MPI rank spawns thread pool to perform preprocessing (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf) + # similarly, train normalizer (if necessary) w/ master MPI rank only + normalizer.train() g.comm.Barrier() -# TODO(KGF): why call guarantee_preprocessed() a second time with all ranks? +g.print_unique("begin preprocessor+normalization (all MPI ranks)...") +# second call has ALL MPI ranks load preprocessed shots from .npz files (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf, verbose=True) - -# TODO(KGF): shouldn't normalize.train() be called like guaranteed_preprocessed -# above? I.e. if Normalizer.previously_saved_stats() does not load a computed -# normalizer for all machines ("loaded normalization data from {d3d: 3449, jet: 2918} # noqa -# shots ( {d3d: 810, jet: 74} disruptive )" ), then only the master MPI rank -# calls normalizer.train() ??? -g.print_unique("begin normalization...") -normalizer = Normalizer(conf) +# second call to normalizer training normalizer.train() loader = Loader(conf, normalizer) g.print_unique("...done") -# TODO(KGF): note, "python examples/guaranteed_preprocessed.py" does NOT train -# the normalizer. Try deleting the previously-computed file, e.g. -# normalization/normalization_signal_group_250640798211266795112500621861190558178.npz # noqa -# or set conf['data']['recompute_normalization'] = True to see example stdout - # TODO(KGF): both preprocess.py and normalize.py are littered with print() # calls that should probably be replaced with print_unique() when they are not # purely loading previously-computed quantities from file +# (or we can continue to ensure that they are only ever executed by 1 rank) ##################################################### # TRAINING # ##################################################### # ensure training has a separate random seed for every worker -# TODO(KGF): can probably delete the next two lines. Check. -np.random.seed(g.task_index) -random.seed(g.task_index) if not only_predict: mpi_train(conf, shot_list_train, shot_list_validate, loader, shot_list_test=shot_list_test) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index e22d36bd..4a9d8b65 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -517,7 +517,8 @@ def train_epoch(self): batch_xs, batch_ys, verbose) self.comm.Barrier() sys.stdout.flush() - g.print_unique('Compilation finished in {:.2f}s'.format( + # TODO(KGF): check line feed/carriage returns around this + g.print_unique('\nCompilation finished in {:.2f}s'.format( time.time() - t0_comp)) t_start = time.time() sys.stdout.flush() From 706f44d153e13de35dbaeb62ab0e57955d95374d Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 18:01:19 -0600 Subject: [PATCH 631/744] Always set recompute_normalization to False inside Normalizer after compute --- examples/mpi_learn.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 5b96efbe..3d0d4545 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -71,7 +71,6 @@ # NORMALIZATION # ##################################################### normalizer = Normalizer(conf) - if g.task_index == 0: # make sure preprocessing has been run, and results are saved to files # if not, only master MPI rank spawns thread pool to perform preprocessing @@ -85,7 +84,10 @@ (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf, verbose=True) # second call to normalizer training +normalizer.conf['data']['recompute_normalization'] = False normalizer.train() +# KGF: may want to set it back... +# normalizer.conf['data']['recompute_normalization'] = conf['data']['recompute_normalization'] # noqa loader = Loader(conf, normalizer) g.print_unique("...done") From 2fc80892143bc9dd8881530c84cd9882158c420c Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Tue, 5 Nov 2019 18:29:50 -0600 Subject: [PATCH 632/744] Suppress duplicate output from 2x calls to Normalizer.train() Using new verbose kwarg --- examples/mpi_learn.py | 4 +-- plasma/preprocessor/normalize.py | 53 ++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 3d0d4545..a23e251a 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -77,7 +77,7 @@ (shot_list_train, shot_list_validate, shot_list_test) = guarantee_preprocessed(conf) # similarly, train normalizer (if necessary) w/ master MPI rank only - normalizer.train() + normalizer.train() # verbose=False only suppresses if purely loading g.comm.Barrier() g.print_unique("begin preprocessor+normalization (all MPI ranks)...") # second call has ALL MPI ranks load preprocessed shots from .npz files @@ -85,7 +85,7 @@ shot_list_test) = guarantee_preprocessed(conf, verbose=True) # second call to normalizer training normalizer.conf['data']['recompute_normalization'] = False -normalizer.train() +normalizer.train(verbose=True) # KGF: may want to set it back... # normalizer.conf['data']['recompute_normalization'] = conf['data']['recompute_normalization'] # noqa loader = Loader(conf, normalizer) diff --git a/plasma/preprocessor/normalize.py b/plasma/preprocessor/normalize.py index 65067508..19606121 100644 --- a/plasma/preprocessor/normalize.py +++ b/plasma/preprocessor/normalize.py @@ -67,11 +67,11 @@ def apply(self, shot): pass @abc.abstractmethod - def save_stats(self): + def save_stats(self, verbose=False): pass @abc.abstractmethod - def load_stats(self): + def load_stats(self, verbose=False): pass def print_summary(self, action='loaded'): @@ -88,7 +88,7 @@ def ensure_machine(self, machine): self.num_disruptive[machine] = 0 # Modify the above to change the specifics of the normalization scheme - def train(self): + def train(self, verbose=False): conf = self.conf # only use training shots here!! "Don't touch testing shots" # + conf['paths']['shot_files_test'] @@ -106,9 +106,11 @@ def train(self): # shot_list_dir = conf['paths']['shot_list_dir'] use_shots = max(400, conf['data']['use_shots']) - return self.train_on_files(shot_files_use, use_shots, all_machines) + return self.train_on_files(shot_files_use, use_shots, all_machines, + verbose=verbose) - def train_on_files(self, shot_files, use_shots, all_machines): + def train_on_files(self, shot_files, use_shots, all_machines, + verbose=False): conf = self.conf all_signals = conf['paths']['all_signals'] shot_list = ShotList() @@ -121,10 +123,9 @@ def train_on_files(self, shot_files, use_shots, all_machines): if recompute: machines_to_compute = all_machines previously_saved = False - if not previously_saved or len(machines_to_compute) > 0: if previously_saved: - self.load_stats() + self.load_stats(verbose=True) print('computing normalization for machines {}'.format( machines_to_compute)) use_cores = max(1, mp.cpu_count()-2) @@ -142,16 +143,18 @@ def train_on_files(self, shot_files, use_shots, all_machines): self.machines.add(stats.machine) sys.stdout.write('\r' + '{}/{}'.format(i, len(shot_list_picked))) - pool.close() pool.join() - print('Finished Training Normalizer on ', + print('\nFinished Training Normalizer on ', '{} files in {} seconds'.format(len(shot_list_picked), time.time()-start_time)) - self.save_stats() + self.save_stats(verbose=True) else: - self.load_stats() - g.print_unique(self) + self.load_stats(verbose=verbose) + # print representation of trained Normalizer to stdout: + # Machine, NormalizerName, per-signal normalization stats/params + if verbose: + g.print_unique(self) def cut_end_of_shot(self, shot): cut_shot_ends = self.conf['data']['cut_shot_ends'] @@ -287,7 +290,7 @@ def apply(self, shot): # self.apply_positivity_mask(shot) # self.apply_mask(shot) - def save_stats(self): + def save_stats(self, verbose=False): # standard_deviations = dat['standard_deviations'] # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] @@ -295,9 +298,10 @@ def save_stats(self): np.savez(self.path, means=self.means, stds=self.stds, num_processed=self.num_processed, num_disruptive=self.num_disruptive, machines=self.machines) - self.print_summary(action='saved') + if verbose: + self.print_summary(action='saved') - def load_stats(self): + def load_stats(self, verbose=False): assert self.previously_saved_stats()[0], "stats not saved before" dat = np.load(self.path, encoding="latin1", allow_pickle=True) self.means = dat['means'][()] @@ -305,9 +309,10 @@ def load_stats(self): self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] - for machine in self.means: - g.print_unique('Machine = {}:'.format(machine)) - self.print_summary() + # for machine in self.means: + # g.print_unique('Machine = {}:'.format(machine)) + if verbose: + self.print_summary() class VarNormalizer(MeanVarNormalizer): @@ -435,7 +440,7 @@ def apply(self, shot): # self.apply_positivity_mask(shot) # self.apply_mask(shot) - def save_stats(self): + def save_stats(self, verbose=False): # standard_deviations = dat['standard_deviations'] # num_processed = dat['num_processed'] # num_disruptive = dat['num_disruptive'] @@ -443,9 +448,10 @@ def save_stats(self): np.savez(self.path, minimums=self.minimums, maximums=self.maximums, num_processed=self.num_processed, num_disruptive=self.num_disruptive, machines=self.machines) - self.print_summary(action='saved') + if verbose: + self.print_summary(action='saved') - def load_stats(self): + def load_stats(self, verbose=False): assert(self.previously_saved_stats()[0]) dat = np.load(self.path, encoding="latin1", allow_pickle=True) self.minimums = dat['minimums'][()] @@ -453,8 +459,9 @@ def load_stats(self): self.num_processed = dat['num_processed'][()] self.num_disruptive = dat['num_disruptive'][()] self.machines = dat['machines'][()] - for machine in self.means: - g.print_unique('Machine {}:'.format(machine)) + # for machine in self.means: + # g.print_unique('Machine {}:'.format(machine)) + if verbose: self.print_summary() From 64bfa8a4731a30b9c97adfd16df612f94ec45404 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 11:56:06 -0500 Subject: [PATCH 633/744] Conditionally import deprecated TensorFlow V1 APIs Based on a rough sketch of which versions started deprecating them --- plasma/conf_parser.py | 1 - plasma/models/mpi_runner.py | 14 +++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 06436c72..3e9a3cf3 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -20,7 +20,6 @@ def parameters(input_file): ) with open(input_file, 'r') as yaml_file: params = yaml.load(yaml_file, Loader=yaml.SafeLoader) - params['user_name'] = getpass.getuser() output_path = params['fs_path'] + "/" + params['user_name'] base_path = output_path diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 4a9d8b65..3910be74 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -9,6 +9,7 @@ from plasma.utils.state_reset import reset_states from plasma.conf import conf from mpi4py import MPI +from pkg_resources import parse_version, get_distribution ''' ######################################################### This file trains a deep learning model to predict @@ -54,7 +55,18 @@ os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(g.MY_GPU) # ,mode=NanGuardMode' os.environ['KERAS_BACKEND'] = 'tensorflow' # default setting - import tensorflow as tf + tf_ver = parse_version(get_distribution('tensorflow').version) + # compat/compat.py first committed on 2018-06-29 for Py 2 vs 3 + # (around, but not present in, the release of v1.9.0) + # v2 compatiblity code added, then moved from compat.py in Nov and Dec 2018 + # compat.v1 first mentioned in RELEASE.md in v1.13.0. + # But many TF deprecation warnings in 1.14.0, e.g.: + # "The name tf.GPUOptions is deprecated. Please use tf.compat.v1.GPUOptions + # instead". See tf_export.py + if tf_ver > parse_version('1.13.0'): + import tensorflow.compat.v1 as tf + else: + import tensorflow as tf from keras.backend.tensorflow_backend import set_session gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95, allow_growth=True) From 2c86e395e72f4d1838f83a524613977bea2d002d Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 12:24:22 -0500 Subject: [PATCH 634/744] Call new MPI init fn in mpi_learn.py; call print_unique() about signals --- data/signals.py | 16 +++++++++------- examples/mpi_learn.py | 1 + plasma/conf_parser.py | 20 ++++++++++++-------- plasma/global_vars.py | 8 +++++--- plasma/models/mpi_runner.py | 10 +++++----- setup.cfg | 5 ++++- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/data/signals.py b/data/signals.py index 34a53db2..4c1c9b8e 100644 --- a/data/signals.py +++ b/data/signals.py @@ -1,4 +1,5 @@ from __future__ import print_function +import plasma.global_vars as g import numpy as np import sys @@ -57,27 +58,27 @@ def get_units(str): found = True except Exception as e: - print(e) + g.print_unique(e) sys.stdout.flush() pass # Retrieve data from PTDATA if node not found if not found: - # print("not in full path {}".format(signal)) + # g.print_unique("not in full path {}".format(signal)) data = c.get('_s = ptdata2("'+signal+'",'+str(shot)+')').data() if len(data) != 1: rank = np.ndim(data) found = True # Retrieve data from Pseudo-pointname if not in ptdata if not found: - # print("not in PTDATA {}".format(signal)) + # g.print_unique("not in PTDATA {}".format(signal)) data = c.get('_s = pseudo("'+signal+'",'+str(shot)+')').data() if len(data) != 1: rank = np.ndim(data) found = True # this means the signal wasn't found if not found: - print("No such signal: {}".format(signal)) + g.print_unique("No such signal: {}".format(signal)) pass # get time base @@ -125,7 +126,7 @@ def fetch_jet_data(signal_path, shot_num, c): signal_path, shot_num)).data() found = True except Exception as e: - print(e) + g.print_unique(e) sys.stdout.flush() # pass return time, data, ydata, found @@ -361,8 +362,9 @@ def fetch_nstx_data(signal_path, shot_num, c): all_signals_restricted = all_signals -print('All signals (determines which signals are downloaded & preprocessed):') -print(all_signals.values()) +g.print_unique('All signals (determines which signals are downloaded' + ' & preprocessed):') +g.print_unique(all_signals.values()) fully_defined_signals = { sig_name: sig for (sig_name, sig) in all_signals_restricted.items() if ( diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index a23e251a..59737219 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -1,4 +1,5 @@ import plasma.global_vars as g +g.init_MPI() from plasma.models.mpi_runner import ( mpi_train, mpi_make_predictions_and_evaluate ) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 3e9a3cf3..4dd9bbec 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -1,3 +1,5 @@ +from __future__ import print_function +import plasma.global_vars as g from plasma.primitives.shots import ShotListFiles import data.signals as sig from plasma.utils.hashing import myhash_signals @@ -74,7 +76,7 @@ def parameters(input_file): elif params['target'] == 'ttdlinear': params['data']['target'] = TTDLinearTarget else: - print('Unkown type of target. Exiting') + g.print_unique('Unkown type of target. Exiting') exit(1) # params['model']['output_activation'] = @@ -344,15 +346,17 @@ def parameters(input_file): params['paths']['use_signals_dict'] = sig.fully_defined_signals_1D else: - print("Unkown data set {}".format(params['paths']['data'])) + g.print_unique("Unknown dataset {}".format( + params['paths']['data'])) exit(1) if len(params['paths']['specific_signals']): for s in params['paths']['specific_signals']: if s not in params['paths']['use_signals_dict'].keys(): - print("Signal {} is not fully defined for {} machine. ", - "Skipping...".format( - s, params['paths']['data'].split("_")[0])) + g.print_unique( + "Signal {} is not fully defined for {} machine. ", + "Skipping...".format( + s, params['paths']['data'].split("_")[0])) params['paths']['specific_signals'] = list( filter( lambda x: x in params['paths']['use_signals_dict'].keys(), @@ -370,9 +374,9 @@ def parameters(input_file): params['paths']['all_signals'] = sort_by_channels( list(params['paths']['all_signals_dict'].values())) - print("Selected signals (determines which signals are used for", - "training):\n{}".format(params['paths']['use_signals'])) - + g.print_unique("Selected signals (determines which signals are used", + " for training):\n{}".format( + params['paths']['use_signals'])) params['paths']['shot_files_all'] = ( params['paths']['shot_files'] + params['paths']['shot_files_test']) params['paths']['all_machines'] = list( diff --git a/plasma/global_vars.py b/plasma/global_vars.py index a97c8a83..1b569036 100644 --- a/plasma/global_vars.py +++ b/plasma/global_vars.py @@ -1,3 +1,4 @@ +from __future__ import print_function import sys # global variable defaults for non-MPI runs @@ -9,15 +10,16 @@ backend = '' -def init_MPI(conf): +def init_MPI(): from mpi4py import MPI global comm, task_index, num_workers - global NUM_GPUS, MY_GPU, backend - comm = MPI.COMM_WORLD task_index = comm.Get_rank() num_workers = comm.Get_size() + +def init_GPU_backend(conf): + global NUM_GPUS, MY_GPU, backend NUM_GPUS = conf['num_gpus'] MY_GPU = task_index % NUM_GPUS backend = conf['model']['backend'] diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 3910be74..1746f29b 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -39,15 +39,15 @@ import socket sys.setrecursionlimit(10000) - # import keras sequentially because it otherwise reads from ~/.keras/keras.json # with too many threads: # from mpi_launch_tensorflow import get_mpi_task_index -# set global variables for entire module regarding MPI environment -# TODO(KGF): consider moving this fn/init call to mpi_learn.py and/or -# setting "mpi_initialized" global bool flag, since that is client-facing -g.init_MPI(conf) +# set global variables for entire module regarding MPI & GPU environment +g.init_GPU_backend(conf) +# moved this fn/init call to client-facing mpi_learn.py +# g.init_MPI() +# TODO(KGF): set "mpi_initialized" global bool flag? # initialization code for mpi_runner.py module: if g.backend == 'tf' or g.backend == 'tensorflow': diff --git a/setup.cfg b/setup.cfg index 912ef080..5896f227 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,4 +26,7 @@ ignore = E731, # W5: Line break warning # W503: line break before binary operator (use mutually exclusive W504) - W503 \ No newline at end of file + W503 +# suppres linter warning about MPI init fn call before module-level imports +per-file-ignores = + examples/mpi_learn.py:E402 From 676621b91ef615633e5d35def45653efd0f648fe Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 12:43:35 -0500 Subject: [PATCH 635/744] Only specify filename, not relative path, when using per-file-ignores Allows flake8 to be run within examples/ directory Note, Emacs flycheck appears to not pickup this (or --exclude) flake8 option/config --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 5896f227..b106c53d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,4 +29,4 @@ ignore = W503 # suppres linter warning about MPI init fn call before module-level imports per-file-ignores = - examples/mpi_learn.py:E402 + mpi_learn.py:E402 From fec3e5ae379a8c57c8923e9dc67659aafe80a241 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 12:55:28 -0500 Subject: [PATCH 636/744] Cleanup setup.cfg comments --- setup.cfg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index b106c53d..db3e245d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,6 @@ description-file = README.md [flake8] max-line-length = 79 -# exclude = cpplint.py ignore = # Subset of DEFAULT_IGNORE error codes from pycodestyle # (not universally accepted / not enforced by PEP 8 document) @@ -27,6 +26,6 @@ ignore = # W5: Line break warning # W503: line break before binary operator (use mutually exclusive W504) W503 -# suppres linter warning about MPI init fn call before module-level imports +# suppress linter warning about MPI init fn call before module-level imports per-file-ignores = mpi_learn.py:E402 From b4bc1d139e5b9feb88a34f51801cfc7371c46895 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 15:37:53 -0500 Subject: [PATCH 637/744] Fix bug in output--- was passing part of printed obj as "end" --- plasma/conf_parser.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plasma/conf_parser.py b/plasma/conf_parser.py index 4dd9bbec..9c338fb7 100644 --- a/plasma/conf_parser.py +++ b/plasma/conf_parser.py @@ -365,7 +365,6 @@ def parameters(input_file): for k in params['paths']['specific_signals']} params['paths']['use_signals'] = sort_by_channels( list(selected_signals.values())) - else: # default case params['paths']['use_signals'] = sort_by_channels( @@ -374,8 +373,8 @@ def parameters(input_file): params['paths']['all_signals'] = sort_by_channels( list(params['paths']['all_signals_dict'].values())) - g.print_unique("Selected signals (determines which signals are used", - " for training):\n{}".format( + g.print_unique("Selected signals (determines which signals are used" + + " for training):\n{}".format( params['paths']['use_signals'])) params['paths']['shot_files_all'] = ( params['paths']['shot_files'] + params['paths']['shot_files_test']) From 5f0cb09150bf4321ada4db0145384f81c3c6b82f Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 15:39:18 -0500 Subject: [PATCH 638/744] Add fn for flushing BOTH stderr and stdout, in MPI rank order --- plasma/global_vars.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plasma/global_vars.py b/plasma/global_vars.py index 1b569036..6aaa6f3f 100644 --- a/plasma/global_vars.py +++ b/plasma/global_vars.py @@ -37,6 +37,7 @@ def print_unique(print_output, end='\n', flush=False): Trivial wrapper function to print() """ + # TODO(KGF): maybe only allow end='','\r','\n' to prevent bugs? if task_index == 0: print(print_output, end=end, flush=flush) @@ -63,3 +64,17 @@ def write_all(write_str): '''All MPI ranks write to stdout, appending [rank]''' sys.stdout.write('[{}] '.format(task_index) + write_str) sys.stdout.flush() + + +def flush_all_inorder(stdout=True, stderr=True): + """Force each MPI rank to flush its buffered writes to one or both of + the standard streams, in order of rank. + """ + for i in range(num_workers): + comm.Barrier() + if i == task_index: + if stdout: + sys.stdout.flush() + if stderr: + sys.stderr.flush() + comm.Barrier() From c5dfa9d8d5a1fa0af2a6fe998705d95ecf428cea Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 15:40:58 -0500 Subject: [PATCH 639/744] Completely sort out order of initial Keras and/or TensorFlow init msgs Dont forget about stderr! --- plasma/models/builder.py | 27 ++++++++++++++++++++++++--- plasma/models/mpi_runner.py | 18 +++++++++++++++++- plasma/models/targets.py | 9 ++++++++- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index 5e2c9eb0..cdb5faa8 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -1,4 +1,8 @@ -from __future__ import division +from __future__ import division, print_function +import plasma.global_vars as g +# KGF: the first time Keras is ever imported via mpi_learn.py -> mpi_runner.py +import keras.backend as K +# KGF: see below synchronization--- output is launched here from keras.models import Sequential, Model from keras.layers import Input from keras.layers.core import ( @@ -14,8 +18,6 @@ from keras.callbacks import Callback from keras.regularizers import l2 # l1, l1_l2 -import keras.backend as K - import re import os import sys @@ -24,6 +26,23 @@ from plasma.utils.downloading import makedirs_process_safe from plasma.utils.hashing import general_object_hash +# Synchronize 2x stderr msg from TensorFlow initialization via Keras backend +# "Succesfully opened dynamic library... libcudart" "Using TensorFlow backend." +if g.comm is not None: + g.flush_all_inorder() +# if g.comm is not None: +# g.comm.Barrier() +# if g.task_index == 0: +# sys.stdout.flush() +# sys.stderr.flush() +# if g.comm is not None: +# g.comm.Barrier() +# TODO(KGF): need to create wrapper .py file (or place in some __init__.py) +# that detects, for an arbitrary import, if tensorflow has been initialized +# either directly from "import tensorflow ..." and/or via backend of +# "from keras.layers ..." +# OR if this is the first time. See below "first_time" variable. + class LossHistory(Callback): def on_train_begin(self, logs=None): @@ -262,6 +281,8 @@ def slicer_output_shape(input_shape, indices): x_out = Dense(1, activation=output_activation)(x_in) model = Model(inputs=x_input, outputs=x_out) # bug with tensorflow/Keras + # TODO(KGF): what is this bug? this is the only direct "tensorflow" + # import outside of mpi_runner.py and runner.py if (conf['model']['backend'] == 'tf' or conf['model']['backend'] == 'tensorflow'): first_time = "tensorflow" not in sys.modules diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 1746f29b..f29d4697 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -4,9 +4,12 @@ from plasma.utils.performance import PerformanceAnalyzer from plasma.utils.processing import concatenate_sublists from plasma.utils.evaluation import get_loss_from_list +# KGF: this is the first module that imports Keras: from plasma.models import builder from plasma.models.loader import ProcessGenerator from plasma.utils.state_reset import reset_states +# KGF: plasma.conf calls print_unique() for "Selected signals". Ensure that +# Keras "Using TensorFlow backend" stderr messages do not interfere in stdout from plasma.conf import conf from mpi4py import MPI from pkg_resources import parse_version, get_distribution @@ -39,6 +42,7 @@ import socket sys.setrecursionlimit(10000) +# TODO(KGF): remove the next 3 lines? # import keras sequentially because it otherwise reads from ~/.keras/keras.json # with too many threads: # from mpi_launch_tensorflow import get_mpi_task_index @@ -49,6 +53,8 @@ # g.init_MPI() # TODO(KGF): set "mpi_initialized" global bool flag? +g.flush_all_inorder() # see above about conf_parser.py stdout writes + # initialization code for mpi_runner.py module: if g.backend == 'tf' or g.backend == 'tensorflow': if g.NUM_GPUS > 1: @@ -67,11 +73,20 @@ import tensorflow.compat.v1 as tf else: import tensorflow as tf + # TODO(KGF): above, builder.py (bug workaround), mpi_launch_tensorflow.py, + # and runner.py are the only files that import tensorflow directly + from keras.backend.tensorflow_backend import set_session + # KGF: next 3 lines dump many TensorFlow diagnostics to stderr. + # All MPI ranks first "Successfully opened dynamic library libcuda" + # then, one by one: ID GPU, libcudart, libcublas, libcufft, ... + # Finally, "Device interconnect StreamExecutor with strength 1 edge matrix" gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95, allow_growth=True) config = tf.ConfigProto(gpu_options=gpu_options) set_session(tf.Session(config=config)) + g.flush_all_inorder() + g.comm.Barrier() else: os.environ['KERAS_BACKEND'] = 'theano' base_compile_dir = '{}/tmp/{}-{}'.format( @@ -90,8 +105,9 @@ from keras.utils.generic_utils import Progbar import keras.callbacks as cbks - g.pprint_unique(conf) +g.flush_all_inorder() +g.comm.Barrier() class MPIOptimizer(object): diff --git a/plasma/models/targets.py b/plasma/models/targets.py index 7f80187d..567fb43b 100644 --- a/plasma/models/targets.py +++ b/plasma/models/targets.py @@ -1,3 +1,5 @@ +from __future__ import print_function +import plasma.global_vars as g import numpy as np import abc @@ -7,9 +9,14 @@ ) import keras.backend as K from keras.losses import hinge -# Requirement: larger value must mean disruption more likely. + +# synchronize output from TensorFlow initialization via Keras backend +if g.comm is not None: + g.flush_all_inorder() + g.comm.Barrier() +# Requirement: larger value must mean disruption more likely. class Target(object): activation = 'linear' loss = 'mse' From 66e1c5cd1bf64ea3efeee9d2226e12d1d50b892f Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 6 Nov 2019 16:12:18 -0500 Subject: [PATCH 640/744] Workaround for "WARNING: Logging before flag parsing goes to stderr." Encountered with TensorFlow v1.14.0 on Traverse https://github.com/tensorflow/tensorflow/issues/26691 --- plasma/__init__.py | 10 ++++++++++ plasma/models/mpi_runner.py | 4 +--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/plasma/__init__.py b/plasma/__init__.py index 963dded2..55cff6db 100644 --- a/plasma/__init__.py +++ b/plasma/__init__.py @@ -1,3 +1,13 @@ +import logging +try: + import absl.logging + # https://github.com/abseil/abseil-py/issues/99 + logging.root.removeHandler(absl.logging._absl_handler) + # https://github.com/abseil/abseil-py/issues/102 + absl.logging._warn_preinit_stderr = False +except Exception: + pass + import warnings # TODO(KGF): temporarily suppress numpy>=1.17.0 warning with TF<2.0.0 # ~6x tensorflow/python/framework/dtypes.py:529: FutureWarning ... diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index f29d4697..2c15b405 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -105,6 +105,7 @@ from keras.utils.generic_utils import Progbar import keras.callbacks as cbks +g.flush_all_inorder() g.pprint_unique(conf) g.flush_all_inorder() g.comm.Barrier() @@ -164,11 +165,9 @@ def __init__(self, lr): self.eps = 1e-8 def get_deltas(self, raw_deltas): - if self.iterations == 0: self.m_list = [np.zeros_like(grad) for grad in raw_deltas] self.v_list = [np.zeros_like(grad) for grad in raw_deltas] - t = self.iterations + 1 lr_t = self.lr * np.sqrt(1-self.beta_2**t)/(1-self.beta_1**t) deltas = [] @@ -179,7 +178,6 @@ def get_deltas(self, raw_deltas): deltas.append(delta_t) self.m_list[i] = m_t self.v_list[i] = v_t - self.iterations += 1 return deltas From aa2fd04563daeff11a2edfec3c2ba1053c3523fc Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 10:57:09 -0500 Subject: [PATCH 641/744] Suppress most TensorFlow deprecation warnings with external Keras --- plasma/__init__.py | 10 ++++++++++ plasma/models/mpi_runner.py | 31 ++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/plasma/__init__.py b/plasma/__init__.py index 55cff6db..ac888c0e 100644 --- a/plasma/__init__.py +++ b/plasma/__init__.py @@ -1,3 +1,4 @@ +import os import logging try: import absl.logging @@ -15,3 +16,12 @@ category=FutureWarning, message=r"passing \(type, 1\) or '1type' as a synonym of type is deprecated", # noqa module="tensorflow") + +# Optional: disable the C-based library diagnostic info and warning messages: +# 2019-11-06 18:27:31.698908: I ... dynamic library libcublas.so.10 +# (independent from tf.logging.set_verbosity() diagnostic control) +# Must be set before first import of tensorflow v0.12+ +# (either directly or via Keras backend) +# os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' +# Ref: https://github.com/tensorflow/tensorflow/issues/1258 +# https://stackoverflow.com/questions/35911252/disable-tensorflow-debugging-information/38645250#38645250 # noqa diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 2c15b405..f0e6de92 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -69,7 +69,7 @@ # But many TF deprecation warnings in 1.14.0, e.g.: # "The name tf.GPUOptions is deprecated. Please use tf.compat.v1.GPUOptions # instead". See tf_export.py - if tf_ver > parse_version('1.13.0'): + if tf_ver >= parse_version('1.13.0'): import tensorflow.compat.v1 as tf else: import tensorflow as tf @@ -86,7 +86,6 @@ config = tf.ConfigProto(gpu_options=gpu_options) set_session(tf.Session(config=config)) g.flush_all_inorder() - g.comm.Barrier() else: os.environ['KERAS_BACKEND'] = 'theano' base_compile_dir = '{}/tmp/{}-{}'.format( @@ -143,7 +142,6 @@ def __init__(self, lr): def get_deltas(self, raw_deltas): deltas = [] - if self.iterations == 0: self.velocity_list = [np.zeros_like(g) for g in raw_deltas] @@ -784,7 +782,34 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, conf['num_workers'] = g.comm.Get_size() specific_builder = builder.ModelBuilder(conf) + + # TODO(KGF): next line suppresses ALL info and warning messages, not just + # deprecation warnings... + # tf.logging.set_verbosity(tf.logging.ERROR) + + # Internal TensorFlow flags, subject to change (v1.14.0+ only?) + try: + from tensorflow.python.util import module_wrapper as deprecation + except ImportError: + from tensorflow.python.util import deprecation_wrapper as deprecation + # deprecation._PRINT_DEPRECATION_WARNINGS = False # does nothing + deprecation._PER_MODULE_WARNING_LIMIT = 0 + # Suppresses warnings from "keras/backend/tensorflow_backend.py", except: + # "Rate should be set to `rate = 1 - keep_prob`" + # Also suppresses warnings from "keras/optimizers.py + # does NOT suppresses warn from "/tensorflow/python/ops/math_grad.py" + + # TODO(KGF): for TF>v1.13.0 (esp v1.14.0), this next line prompts a ton of + # deprecation warnings with externally-packaged Keras, e.g.: + # WARNING:tensorflow:From .../keras/backend/tensorflow_backend.py:174: + # The name tf.get_default_session is deprecated. + # Please use tf.compat.v1.get_default_session instead. train_model = specific_builder.build_model(False) + # Cannot fix these Keras internals via "import tensorflow.compat.v1 as tf" + # + # TODO(KGF): note, these are different than C-based info diagnostics e.g.: + # 2019-11-06 18:27:31.698908: I ... dynamic library libcublas.so.10 + # which are NOT suppressed by set_verbosity. See top level __init__.py # load the latest epoch we did. Returns -1 if none exist yet e = specific_builder.load_model_weights(train_model) From af09d4fac73487c84bbc8a4899fc1ed7fbee5559 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 11:10:12 -0500 Subject: [PATCH 642/744] Share TF version as a global variable Previous deprecation warning suppression approach only works for v1.14.0+ --- plasma/__init__.py | 2 +- plasma/global_vars.py | 1 + plasma/models/mpi_runner.py | 37 ++++++++++++++++++------------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/plasma/__init__.py b/plasma/__init__.py index ac888c0e..3be7f58e 100644 --- a/plasma/__init__.py +++ b/plasma/__init__.py @@ -1,4 +1,4 @@ -import os +# import os import logging try: import absl.logging diff --git a/plasma/global_vars.py b/plasma/global_vars.py index 6aaa6f3f..1c667f9a 100644 --- a/plasma/global_vars.py +++ b/plasma/global_vars.py @@ -8,6 +8,7 @@ NUM_GPUS = 0 MY_GPU = 0 backend = '' +tf_ver = None def init_MPI(): diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index f0e6de92..aa0763c0 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -61,7 +61,7 @@ os.environ['CUDA_VISIBLE_DEVICES'] = '{}'.format(g.MY_GPU) # ,mode=NanGuardMode' os.environ['KERAS_BACKEND'] = 'tensorflow' # default setting - tf_ver = parse_version(get_distribution('tensorflow').version) + g.tf_ver = parse_version(get_distribution('tensorflow').version) # compat/compat.py first committed on 2018-06-29 for Py 2 vs 3 # (around, but not present in, the release of v1.9.0) # v2 compatiblity code added, then moved from compat.py in Nov and Dec 2018 @@ -69,7 +69,7 @@ # But many TF deprecation warnings in 1.14.0, e.g.: # "The name tf.GPUOptions is deprecated. Please use tf.compat.v1.GPUOptions # instead". See tf_export.py - if tf_ver >= parse_version('1.13.0'): + if g.tf_ver >= parse_version('1.14.0'): import tensorflow.compat.v1 as tf else: import tensorflow as tf @@ -782,23 +782,22 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, conf['num_workers'] = g.comm.Get_size() specific_builder = builder.ModelBuilder(conf) - - # TODO(KGF): next line suppresses ALL info and warning messages, not just - # deprecation warnings... - # tf.logging.set_verbosity(tf.logging.ERROR) - - # Internal TensorFlow flags, subject to change (v1.14.0+ only?) - try: - from tensorflow.python.util import module_wrapper as deprecation - except ImportError: - from tensorflow.python.util import deprecation_wrapper as deprecation - # deprecation._PRINT_DEPRECATION_WARNINGS = False # does nothing - deprecation._PER_MODULE_WARNING_LIMIT = 0 - # Suppresses warnings from "keras/backend/tensorflow_backend.py", except: - # "Rate should be set to `rate = 1 - keep_prob`" - # Also suppresses warnings from "keras/optimizers.py - # does NOT suppresses warn from "/tensorflow/python/ops/math_grad.py" - + if g.tf_ver >= parse_version('1.14.0'): + # Internal TensorFlow flags, subject to change (v1.14.0+ only?) + try: + from tensorflow.python.util import module_wrapper as depr + except ImportError: + from tensorflow.python.util import deprecation_wrapper as depr + # depr._PRINT_DEPRECATION_WARNINGS = False # does nothing + depr._PER_MODULE_WARNING_LIMIT = 0 + # Suppresses warnings from "keras/backend/tensorflow_backend.py" + # except: "Rate should be set to `rate = 1 - keep_prob`" + # Also suppresses warnings from "keras/optimizers.py + # does NOT suppresses warn from "/tensorflow/python/ops/math_grad.py" + else: + # TODO(KGF): next line suppresses ALL info and warning messages, + # not just deprecation warnings... + tf.logging.set_verbosity(tf.logging.ERROR) # TODO(KGF): for TF>v1.13.0 (esp v1.14.0), this next line prompts a ton of # deprecation warnings with externally-packaged Keras, e.g.: # WARNING:tensorflow:From .../keras/backend/tensorflow_backend.py:174: From 425ff0bedfdfb747830fa15d9a2d3cadce5da38c Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 14:14:27 -0500 Subject: [PATCH 643/744] Make write_all() safe for use in non-MPI contexts --- plasma/global_vars.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plasma/global_vars.py b/plasma/global_vars.py index 1c667f9a..a07b0d7e 100644 --- a/plasma/global_vars.py +++ b/plasma/global_vars.py @@ -62,8 +62,14 @@ def write_unique(write_str): def write_all(write_str): - '''All MPI ranks write to stdout, appending [rank]''' - sys.stdout.write('[{}] '.format(task_index) + write_str) + '''All MPI ranks write to stdout, appending [rank]. + + No MPI barriers, no guaranteed ordering of output. + ''' + if comm is not None: + sys.stdout.write('[{}] '.format(task_index) + write_str) + else: + sys.stdout.write(write_str) sys.stdout.flush() From 4b549efc99fd7304ec90fafa5d92bd9a1b03d074 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 14:15:21 -0500 Subject: [PATCH 644/744] Use write_all() for ModelBuilder.load_model_weights() diagnostics instead of print() --- plasma/models/builder.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index cdb5faa8..b2e29ed7 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -30,13 +30,6 @@ # "Succesfully opened dynamic library... libcudart" "Using TensorFlow backend." if g.comm is not None: g.flush_all_inorder() -# if g.comm is not None: -# g.comm.Barrier() -# if g.task_index == 0: -# sys.stdout.flush() -# sys.stderr.flush() -# if g.comm is not None: -# g.comm.Barrier() # TODO(KGF): need to create wrapper .py file (or place in some __init__.py) # that detects, for an arbitrary import, if tensorflow has been initialized # either directly from "import tensorflow ..." and/or via backend of @@ -318,20 +311,21 @@ def load_model_weights(self, model, custom_path=None): if custom_path is None: epochs = self.get_all_saved_files() if len(epochs) == 0: - print('no previous checkpoint found') + g.write_all('no previous checkpoint found\n') return -1 else: max_epoch = max(epochs) - print('loading from epoch {}'.format(max_epoch)) + g.write_all('loading from epoch {}\n'.format(max_epoch)) model.load_weights(self.get_save_path(max_epoch)) return max_epoch else: epoch = self.extract_id_and_epoch_from_filename( os.path.basename(custom_path))[1] model.load_weights(custom_path) - print("Loading from custom epoch {}".format(epoch)) + g.write_all("Loading from custom epoch {}\n".format(epoch)) return epoch + # TODO(KGF): method only called in non-MPI runner.py. Deduplicate? def get_latest_save_path(self): epochs = self.get_all_saved_files() if len(epochs) == 0: From 90007275d7f406742de2ac0cd9a3413c920e8e5d Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 14:16:17 -0500 Subject: [PATCH 645/744] Fix and improve diagnostics within main mpi_train() loop over epochs Preparing to re-index epochs with 1-based indexing --- plasma/models/mpi_runner.py | 49 +++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index aa0763c0..88d9a2f2 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -450,7 +450,6 @@ def build_callbacks(self, conf, callbacks_list): os.makedirs(csvlog_save_path) callbacks_list = conf['callbacks']['list'] - callbacks = [cbks.BaseLogger()] callbacks += [self.history] callbacks += [cbks.CSVLogger("{}callbacks-{}.log".format( @@ -581,9 +580,10 @@ def train_epoch(self): effective_epochs = 1.0*self.num_so_far/num_total epoch_previous = self.epoch self.epoch = effective_epochs - g.write_unique('\nEpoch {:.2f} finished ({:.2f} epochs passed)'.format( - 1.0 * self.epoch, self.epoch - epoch_previous) - + ' in {:.2f} seconds.\n'.format(t2 - t_start)) + g.write_unique( + '\nEpoch {:.2f} finished training ({:.2f} epochs passed)'.format( + 1.0 * self.epoch, self.epoch - epoch_previous) + + ' in {:.2f} seconds.\n'.format(t2 - t_start)) return (step, ave_loss, curr_loss, self.num_so_far, effective_epochs) def estimate_remaining_time(self, time_so_far, work_so_far, work_total): @@ -687,6 +687,10 @@ def mpi_make_predictions(conf, shot_list, loader, custom_path=None): model.reset_states() if g.task_index == 0: + # TODO(KGF): this appears to prepend a \n, resulting in: + # [2] loading from epoch 7 + # + # 128/862 [===>..........................] - ETA: 2:20 pbar = Progbar(len(shot_list)) shot_sublists = shot_list.sublists(conf['model']['pred_batch_size'], do_shuffle=False, equal_size=True) @@ -870,12 +874,13 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, cmp_fn = min while e < (num_epochs - 1): - g.write_unique("begin epoch {}".format(e)) + g.write_unique('\nBegin training from epoch {:.2f}/{}'.format( + e, num_epochs)) if g.task_index == 0: callbacks.on_epoch_begin(int(round(e))) mpi_model.set_lr(lr*lr_decay**e) - g.write_unique('\nEpoch {}/{}'.format(e, num_epochs)) + # KGF: core work of loop performed in next line (step, ave_loss, curr_loss, num_so_far, effective_epochs) = mpi_model.train_epoch() e = e_old + effective_epochs @@ -885,9 +890,16 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, specific_builder.save_model_weights(train_model, int(round(e))) epoch_logs = {} + g.write_unique('Begin evaluation of epoch {:.2f}/{}\n'.format( + e, num_epochs)) + # TODO(KGF): flush output/ MPI barrier? + # g.flush_all_inorder() + # TODO(KGF): is there a way to avoid Keras.Models.load_weights() + # repeated calls throughout mpi_make_pred*() fn calls? _, _, _, roc_area, loss = mpi_make_predictions_and_evaluate( conf, shot_list_validate, loader) + if conf['training']['ranking_difficulty_fac'] != 1.0: (_, _, _, roc_area_train, loss_train) = mpi_make_predictions_and_evaluate( @@ -905,15 +917,18 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, times = conf['callbacks']['monitor_times'] areas, _ = mpi_make_predictions_and_evaluate_multiple_times( conf, shot_list_validate, loader, times) - for roc, t in zip(areas, times): - g.write_unique('epoch {}, val_roc_{} = {}'.format( - int(round(e)), t, roc)) + epoch_str = 'epoch {}, '.format(int(round(e))) + g.write_unique(epoch_str + ' '.join( + ['val_roc_{} = {}'.format(t, roc) for t, roc in zip( + times, areas)] + ) + '\n') if shot_list_test is not None: areas, _ = mpi_make_predictions_and_evaluate_multiple_times( conf, shot_list_test, loader, times) - for roc, t in zip(areas, times): - g.write_unique('epoch {}, test_roc_{} = {}'.format( - int(round(e)), t, roc)) + g.write_unique(epoch_str + ' '.join( + ['test_roc_{} = {}'.format(t, roc) for t, roc in zip( + times, areas)] + ) + '\n') epoch_logs['val_roc'] = roc_area epoch_logs['val_loss'] = loss @@ -921,15 +936,16 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, best_so_far = cmp_fn(epoch_logs[conf['callbacks']['monitor']], best_so_far) stop_training = False + g.flush_all_inorder() if g.task_index == 0: - print('=========Summary======== for epoch{}'.format(step)) + print('=========Summary======== for epoch {:.2f}'.format(e)) print('Training Loss numpy: {:.3e}'.format(ave_loss)) print('Validation Loss: {:.3e}'.format(loss)) print('Validation ROC: {:.4f}'.format(roc_area)) if conf['training']['ranking_difficulty_fac'] != 1.0: print('Training Loss: {:.3e}'.format(loss_train)) print('Training ROC: {:.4f}'.format(roc_area_train)) - + print('======================== ') callbacks.on_epoch_end(int(round(e)), epoch_logs) if hasattr(mpi_model.model, 'stop_training'): stop_training = mpi_model.model.stop_training @@ -951,7 +967,10 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, tensorboard.on_epoch_end(val_generator, val_steps, int(round(e)), epoch_logs) stop_training = g.comm.bcast(stop_training, root=0) - g.write_unique("end epoch {}".format(e)) + g.write_unique('Finished evaluation of epoch {:.2f}/{}'.format( + e, num_epochs)) + # TODO(KGF): compare to old diagnostic: + # g.write_unique("end epoch {}".format(e_old)) if stop_training: g.write_unique("Stopping training due to early stopping") break From b036c0bb2c215750760d6f8784b09950ac4c2205 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 14:31:42 -0500 Subject: [PATCH 646/744] Make it explicit that diagnostic within train_epoch() refers to local progress --- examples/mpi_learn.py | 9 +++++++-- plasma/models/mpi_runner.py | 14 +++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/examples/mpi_learn.py b/examples/mpi_learn.py index 59737219..f4d6da39 100644 --- a/examples/mpi_learn.py +++ b/examples/mpi_learn.py @@ -67,7 +67,6 @@ custom_path = sys.argv[1] g.print_unique("predicting using path {}".format(custom_path)) - ##################################################### # NORMALIZATION # ##################################################### @@ -101,10 +100,16 @@ # TRAINING # ##################################################### -# ensure training has a separate random seed for every worker +# Prevent Keras TF backend deprecation messages from mpi_train() from +# appearing jumbled with stdout, stderr msgs from above steps +g.comm.Barrier() +g.flush_all_inorder() + +# reminder: ensure training has a separate random seed for every worker if not only_predict: mpi_train(conf, shot_list_train, shot_list_validate, loader, shot_list_test=shot_list_test) +g.flush_all_inorder() ##################################################### # TESTING # diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 88d9a2f2..4a659da0 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -581,9 +581,14 @@ def train_epoch(self): epoch_previous = self.epoch self.epoch = effective_epochs g.write_unique( - '\nEpoch {:.2f} finished training ({:.2f} epochs passed)'.format( - 1.0 * self.epoch, self.epoch - epoch_previous) - + ' in {:.2f} seconds.\n'.format(t2 - t_start)) + # TODO(KGF): "a total of X epochs within this session" ? + '\nFinished training epoch {:.2f} '.format(self.epoch) + # TODO(KGF): "precisely/exactly X epochs just passed"? + + 'during this session ({:.2f} epochs passed)'.format( + self.epoch - epoch_previous) + # '\nEpoch {:.2f} finished training ({:.2f} epochs passed)'.format( + # 1.0 * self.epoch, self.epoch - epoch_previous) + + ' in {:.2f} seconds\n'.format(t2 - t_start)) return (step, ave_loss, curr_loss, self.num_so_far, effective_epochs) def estimate_remaining_time(self, time_so_far, work_so_far, work_total): @@ -884,7 +889,10 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, (step, ave_loss, curr_loss, num_so_far, effective_epochs) = mpi_model.train_epoch() e = e_old + effective_epochs + g.write_unique('Finished training of epoch {:.2f}/{}\n'.format( + e, num_epochs)) + # TODO(KGF): add diagnostic about "saving to epoch X"? loader.verbose = False # True during the first iteration if g.task_index == 0: specific_builder.save_model_weights(train_model, int(round(e))) From df88d1a3251a68c2b381df8dcb00b1a5aa7a8f69 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 7 Nov 2019 14:49:07 -0500 Subject: [PATCH 647/744] Use 1-based indexing for epochs --- plasma/models/builder.py | 4 +++- plasma/models/mpi_runner.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plasma/models/builder.py b/plasma/models/builder.py index b2e29ed7..e47f6588 100644 --- a/plasma/models/builder.py +++ b/plasma/models/builder.py @@ -312,7 +312,9 @@ def load_model_weights(self, model, custom_path=None): epochs = self.get_all_saved_files() if len(epochs) == 0: g.write_all('no previous checkpoint found\n') - return -1 + # TODO(KGF): port indexing change (from "return -1") to parts + # of the code other than mpi_runner.py + return 0 else: max_epoch = max(epochs) g.write_all('loading from epoch {}\n'.format(max_epoch)) diff --git a/plasma/models/mpi_runner.py b/plasma/models/mpi_runner.py index 4a659da0..30e0caed 100644 --- a/plasma/models/mpi_runner.py +++ b/plasma/models/mpi_runner.py @@ -819,7 +819,7 @@ def mpi_train(conf, shot_list_train, shot_list_validate, loader, # 2019-11-06 18:27:31.698908: I ... dynamic library libcublas.so.10 # which are NOT suppressed by set_verbosity. See top level __init__.py - # load the latest epoch we did. Returns -1 if none exist yet + # load the latest epoch we did. Returns 0 if none exist yet e = specific_builder.load_model_weights(train_model) e_old = e From 9935ff79eab0d6cf3674be2a24f5656301745921 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Wed, 13 Nov 2019 15:49:07 -0500 Subject: [PATCH 648/744] Restrict Conda TensorFlow dependency to <2.0.0 This version is now generally available on Anaconda Cloud and should be avoided. --- requirements-travis.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-travis.txt b/requirements-travis.txt index 77056dd9..69dfd817 100644 --- a/requirements-travis.txt +++ b/requirements-travis.txt @@ -4,4 +4,4 @@ flake8 h5py pyparsing pyyaml -tensorflow-gpu>=1.3 +tensorflow-gpu>=1.3,<2.0.0 From 3a3a9f27444ea77c17034fa8740c520bc7d870fb Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 14:05:08 -0500 Subject: [PATCH 649/744] Print out total shot counts in preprocess.py --- plasma/preprocessor/preprocess.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index e93e7309..2c6384e4 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -257,6 +257,11 @@ def guarantee_preprocessed(conf, verbose=False): shot_list_train, shot_list_validate, shot_list_test = apply_bleed_in( conf, shot_list_train, shot_list_validate, shot_list_test) if verbose: + g.print_unique('total: {} shots, {} disruptive'.format( + len(shot_list_validate)+len(shot_list_train)+len(shot_list_test), + shot_list_validate.num_disruptive() + + shot_list_train.num_disruptive() + + shot_list_test.num_disruptive())) g.print_unique('validate: {} shots, {} disruptive'.format( len(shot_list_validate), shot_list_validate.num_disruptive())) g.print_unique('training: {} shots, {} disruptive'.format( From 09c4d6771c7883c195b3f1b26fb6155e88b4469e Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 14:25:12 -0500 Subject: [PATCH 650/744] Always print # train shots before # validate shots in diagnostics Canonical order: train, validate, test --- plasma/models/runner.py | 4 ++-- plasma/models/shallow_runner.py | 6 +++--- plasma/models/torch_runner.py | 5 ++--- plasma/preprocessor/preprocess.py | 4 ++-- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 5b3f1d5a..29c42c3c 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -29,10 +29,10 @@ def train(conf, shot_list_train, shot_list_validate, loader, validation_losses = [] validation_roc = [] training_losses = [] - print('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format( len(shot_list_train), shot_list_train.num_disruptive())) + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index 5d459a43..cdfe2c32 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -324,12 +324,12 @@ def build_callbacks(conf): def train(conf, shot_list_train, shot_list_validate, loader, shot_list_test=None): np.random.seed(1) - print('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), - shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format( len(shot_list_train), shot_list_train.num_disruptive())) + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), + shot_list_validate.num_disruptive())) num_samples = conf['model']['shallow_model']['num_samples'] feature_extractor = FeatureExtractor(loader) diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py index 5c85e134..a4fde559 100644 --- a/plasma/models/torch_runner.py +++ b/plasma/models/torch_runner.py @@ -414,11 +414,10 @@ def train(conf, shot_list_train, shot_list_validate, loader): data_gen = partial( loader.training_batch_generator_full_shot_partial_reset, shot_list=shot_list_train)() - print('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) print('training: {} shots, {} disruptive'.format( len(shot_list_train), shot_list_train.num_disruptive())) - + print('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) loader.set_inference_mode(False) train_model = build_torch_model(conf) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 2c6384e4..deaccee3 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -262,10 +262,10 @@ def guarantee_preprocessed(conf, verbose=False): shot_list_validate.num_disruptive() + shot_list_train.num_disruptive() + shot_list_test.num_disruptive())) - g.print_unique('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) g.print_unique('training: {} shots, {} disruptive'.format( len(shot_list_train), shot_list_train.num_disruptive())) + g.print_unique('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) g.print_unique('testing: {} shots, {} disruptive'.format( len(shot_list_test), shot_list_test.num_disruptive())) g.print_unique("...done") From df7228ea17915ffb5d7c34f7449b421ab3768861 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 14:40:33 -0500 Subject: [PATCH 651/744] Encapsulate printing of shot set sizes in new fn, in new file diagnostics.py --- plasma/models/runner.py | 6 ++---- plasma/models/shallow_runner.py | 2 ++ plasma/models/torch_runner.py | 6 ++---- plasma/preprocessor/preprocess.py | 16 ++++------------ plasma/utils/diagnostics.py | 28 ++++++++++++++++++++++++++++ 5 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 plasma/utils/diagnostics.py diff --git a/plasma/models/runner.py b/plasma/models/runner.py index 29c42c3c..c2008817 100644 --- a/plasma/models/runner.py +++ b/plasma/models/runner.py @@ -1,6 +1,7 @@ from plasma.utils.state_reset import reset_states from plasma.utils.evaluation import get_loss_from_list from plasma.utils.performance import PerformanceAnalyzer +from plasma.utils.diagnostics import print_shot_list_sizes from plasma.models.loader import Loader, ProcessGenerator from plasma.conf import conf import pathos.multiprocessing as mp @@ -29,10 +30,7 @@ def train(conf, shot_list_train, shot_list_validate, loader, validation_losses = [] validation_roc = [] training_losses = [] - print('training: {} shots, {} disruptive'.format( - len(shot_list_train), shot_list_train.num_disruptive())) - print('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) + print_shot_list_sizes(shot_list_train, shot_list_validate) if backend == 'tf' or backend == 'tensorflow': first_time = "tensorflow" not in sys.modules diff --git a/plasma/models/shallow_runner.py b/plasma/models/shallow_runner.py index cdfe2c32..0ea4962b 100644 --- a/plasma/models/shallow_runner.py +++ b/plasma/models/shallow_runner.py @@ -10,6 +10,7 @@ # from plasma.utils.state_reset import reset_states from plasma.utils.evaluation import get_loss_from_list from plasma.utils.performance import PerformanceAnalyzer +from plasma.utils.diagnostics import print_shot_list_sizes # from plasma.models.loader import Loader, ProcessGenerator # from plasma.conf import conf from sklearn.neural_network import MLPClassifier @@ -324,6 +325,7 @@ def build_callbacks(conf): def train(conf, shot_list_train, shot_list_validate, loader, shot_list_test=None): np.random.seed(1) + print_shot_list_sizes(shot_list_train, shot_list_validate) print('training: {} shots, {} disruptive'.format( len(shot_list_train), shot_list_train.num_disruptive())) diff --git a/plasma/models/torch_runner.py b/plasma/models/torch_runner.py index a4fde559..195b5275 100644 --- a/plasma/models/torch_runner.py +++ b/plasma/models/torch_runner.py @@ -5,6 +5,7 @@ from torch.autograd import Variable import torch.nn as nn import torch +from plasma.utils.diagnostics import print_shot_list_sizes from plasma.utils.downloading import makedirs_process_safe from plasma.utils.performance import PerformanceAnalyzer from plasma.utils.evaluation import get_loss_from_list @@ -414,10 +415,7 @@ def train(conf, shot_list_train, shot_list_validate, loader): data_gen = partial( loader.training_batch_generator_full_shot_partial_reset, shot_list=shot_list_train)() - print('training: {} shots, {} disruptive'.format( - len(shot_list_train), shot_list_train.num_disruptive())) - print('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) + print_shot_list_sizes(shot_list_train, shot_list_validate) loader.set_inference_mode(False) train_model = build_torch_model(conf) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index deaccee3..0e649c2d 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -1,6 +1,6 @@ ''' ######################################################### -This file containts classes to handle data processing +This file contains classes to handle data processing Author: Julian Kates-Harbeck, jkatesharbeck@g.harvard.edu @@ -19,6 +19,7 @@ import pathos.multiprocessing as mp from plasma.utils.processing import append_to_filename +from plasma.utils.diagnostics import print_shot_list_sizes from plasma.primitives.shots import ShotList from plasma.utils.downloading import mkdirdepth @@ -257,16 +258,7 @@ def guarantee_preprocessed(conf, verbose=False): shot_list_train, shot_list_validate, shot_list_test = apply_bleed_in( conf, shot_list_train, shot_list_validate, shot_list_test) if verbose: - g.print_unique('total: {} shots, {} disruptive'.format( - len(shot_list_validate)+len(shot_list_train)+len(shot_list_test), - shot_list_validate.num_disruptive() - + shot_list_train.num_disruptive() - + shot_list_test.num_disruptive())) - g.print_unique('training: {} shots, {} disruptive'.format( - len(shot_list_train), shot_list_train.num_disruptive())) - g.print_unique('validate: {} shots, {} disruptive'.format( - len(shot_list_validate), shot_list_validate.num_disruptive())) - g.print_unique('testing: {} shots, {} disruptive'.format( - len(shot_list_test), shot_list_test.num_disruptive())) + print_shot_list_sizes(shot_list_train, shot_list_validate, + shot_list_test) g.print_unique("...done") return shot_list_train, shot_list_validate, shot_list_test diff --git a/plasma/utils/diagnostics.py b/plasma/utils/diagnostics.py new file mode 100644 index 00000000..6f632887 --- /dev/null +++ b/plasma/utils/diagnostics.py @@ -0,0 +1,28 @@ +''' +######################################################### +This file contains fns for printing diagnostic messages +######################################################### +''' + +from __future__ import print_function +import plasma.global_vars as g + + +def print_shot_list_sizes(shot_list_train, shot_list_validate, + shot_list_test=None): + nshots = len(shot_list_train) + len(shot_list_validate) + nshots_disrupt = (shot_list_train.num_disruptive() + + shot_list_validate.num_disruptive()) + if shot_list_test is not None: + nshots += len(shot_list_test) + nshots_disrupt += shot_list_test.num_disruptive() + g.print_unique('total: {} shots, {} disruptive'.format(nshots, + nshots_disrupt) + g.print_unique('training: {} shots, {} disruptive'.format( + len(shot_list_train), shot_list_train.num_disruptive())) + g.print_unique('validate: {} shots, {} disruptive'.format( + len(shot_list_validate), shot_list_validate.num_disruptive())) + if shot_list_test is not None: + g.print_unique('testing: {} shots, {} disruptive'.format( + len(shot_list_test), shot_list_test.num_disruptive())) + return From cbc31b42aac55e1d2fce646925176a309e1ccb5f Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 14:42:02 -0500 Subject: [PATCH 652/744] Add missing bracket --- plasma/utils/diagnostics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/utils/diagnostics.py b/plasma/utils/diagnostics.py index 6f632887..d38d6e78 100644 --- a/plasma/utils/diagnostics.py +++ b/plasma/utils/diagnostics.py @@ -17,7 +17,7 @@ def print_shot_list_sizes(shot_list_train, shot_list_validate, nshots += len(shot_list_test) nshots_disrupt += shot_list_test.num_disruptive() g.print_unique('total: {} shots, {} disruptive'.format(nshots, - nshots_disrupt) + nshots_disrupt)) g.print_unique('training: {} shots, {} disruptive'.format( len(shot_list_train), shot_list_train.num_disruptive())) g.print_unique('validate: {} shots, {} disruptive'.format( From 366de2d8084e3bd5386c417790e5f4c2a143f98c Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 14:11:17 -0600 Subject: [PATCH 653/744] Comment out unused fn --- plasma/utils/processing.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plasma/utils/processing.py b/plasma/utils/processing.py index d6995bcb..12938c1b 100644 --- a/plasma/utils/processing.py +++ b/plasma/utils/processing.py @@ -90,15 +90,15 @@ def train_test_split_robust(x, frac, do_shuffle=False): return train, test -def train_test_split_all(x, frac, do_shuffle=True): - groups = [] - length = len(x[0]) - mask = np.array(range(length)) < frac*length - if do_shuffle: - np.random.shuffle(mask) - for item in x: - groups.append((item[mask], item[~mask])) - return groups +# def train_test_split_all(x, frac, do_shuffle=True): +# groups = [] +# length = len(x[0]) +# mask = np.array(range(length)) < frac*length +# if do_shuffle: +# np.random.shuffle(mask) +# for item in x: +# groups.append((item[mask], item[~mask])) +# return groups def concatenate_sublists(superlist): From e527c38d215610ce714135d8bb0d050ce8c13fbb Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 15:21:11 -0500 Subject: [PATCH 654/744] Add details about how many omitted shots were disruptive to preprocess.py --- plasma/preprocessor/preprocess.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 0e649c2d..871a27fc 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -101,12 +101,16 @@ def preprocess_from_files(self, shot_files, use_shots): pool.close() pool.join() - print('Finished Preprocessing {} files in {} seconds'.format( + print('Finished preprocessing {} files in {} seconds'.format( len(shot_list_picked), time.time() - start_time)) + print('Using {}/{} disruptive shots'.format( + used_shots.num_disruptive(), len(used_shots))) print('Omitted {} shots of {} total.'.format( len(shot_list_picked) - len(used_shots), len(shot_list_picked))) - print('{}/{} disruptive shots'.format(used_shots.num_disruptive(), - len(used_shots))) + print('Omitted {} disruptive shots of {} total disruptive.'.format( + shot_list_picked.num_disruptive() - used_shots.num_disruptive, + shot_list_picked.num_disruptive())) + if len(used_shots) == 0: print("WARNING: All shots were omitted, please ensure raw data " " is complete and available at {}.".format( From 286dc8793feda0bd58ddd9c0cf7d2fc37ae7ed08 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 15:32:28 -0500 Subject: [PATCH 655/744] Typo --- plasma/preprocessor/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index 871a27fc..eaf99604 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -108,7 +108,7 @@ def preprocess_from_files(self, shot_files, use_shots): print('Omitted {} shots of {} total.'.format( len(shot_list_picked) - len(used_shots), len(shot_list_picked))) print('Omitted {} disruptive shots of {} total disruptive.'.format( - shot_list_picked.num_disruptive() - used_shots.num_disruptive, + shot_list_picked.num_disruptive() - used_shots.num_disruptive(), shot_list_picked.num_disruptive())) if len(used_shots) == 0: From 300966252320fd792fc7616bc5962bdf69270139 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 15:52:43 -0600 Subject: [PATCH 656/744] Remove stray diagnostic print --- plasma/primitives/shots.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index cafb76ed..a9e95df9 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -121,7 +121,6 @@ def split_train_test(self, conf): shot_numbers_train = [shot.number for shot in shot_list_train] shot_numbers_test = [shot.number for shot in shot_list_test] - print(len(shot_numbers_train), len(shot_numbers_test)) # make sure we only use pre-filtered valid shots shots_train = self.filter_by_number(shot_numbers_train) shots_test = self.filter_by_number(shot_numbers_test) From 0e4715b78e5e73bb0de220c1e7818a0648d1ed47 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Thu, 21 Nov 2019 17:10:36 -0500 Subject: [PATCH 657/744] Reformat diagnostics --- plasma/preprocessor/preprocess.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/plasma/preprocessor/preprocess.py b/plasma/preprocessor/preprocess.py index eaf99604..18cf3114 100644 --- a/plasma/preprocessor/preprocess.py +++ b/plasma/preprocessor/preprocess.py @@ -101,15 +101,17 @@ def preprocess_from_files(self, shot_files, use_shots): pool.close() pool.join() - print('Finished preprocessing {} files in {} seconds'.format( + print('\nFinished preprocessing {} files in {} seconds'.format( len(shot_list_picked), time.time() - start_time)) - print('Using {}/{} disruptive shots'.format( - used_shots.num_disruptive(), len(used_shots))) - print('Omitted {} shots of {} total.'.format( + print('Using {} shots ({} disruptive shots)'.format( + len(used_shots), used_shots.num_disruptive())) + print('Omitted {} shots of {} total shots'.format( len(shot_list_picked) - len(used_shots), len(shot_list_picked))) - print('Omitted {} disruptive shots of {} total disruptive.'.format( - shot_list_picked.num_disruptive() - used_shots.num_disruptive(), - shot_list_picked.num_disruptive())) + print( + 'Omitted {} disruptive shots of {} total disruptive shots'.format( + shot_list_picked.num_disruptive() + - used_shots.num_disruptive(), + shot_list_picked.num_disruptive())) if len(used_shots) == 0: print("WARNING: All shots were omitted, please ensure raw data " From a99c01acf94d71a75d4249ba20a8d2cdbee94688 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 22 Nov 2019 10:25:44 -0600 Subject: [PATCH 658/744] Reduce number of lines --- plasma/primitives/data.py | 16 ++++------- plasma/primitives/shots.py | 57 +++++++++++++------------------------- 2 files changed, 25 insertions(+), 48 deletions(-) diff --git a/plasma/primitives/data.py b/plasma/primitives/data.py index 63d30abc..5d84fb0b 100644 --- a/plasma/primitives/data.py +++ b/plasma/primitives/data.py @@ -5,7 +5,6 @@ import re from scipy.interpolate import UnivariateSpline - from plasma.utils.processing import get_individual_shot_file from plasma.utils.downloading import get_missing_value_array from plasma.utils.hashing import myhash @@ -123,17 +122,14 @@ def load_data(self, prepath, shot, dtype='float32'): if self.is_ip: print('shot {} has no current'.format(shot.number)) else: - print( - 'Signal {}, shot {} contains no data'.format( - self.description, shot.number)) + print('Signal {}, shot {} contains no data'.format( + self.description, shot.number)) return None, None, False # make sure data doesn't contain nan if np.any(np.isnan(t)) or np.any(np.isnan(sig)): - print( - 'Signal {}, shot {} contains NAN'.format( - self.description, - shot.number)) + print('Signal {}, shot {} contains NAN'.format( + self.description, shot.number)) return None, None, False return t, sig, True @@ -278,8 +274,8 @@ def load_data(self, prepath, shot, dtype='float32'): return t, sig_interp, True def fetch_data(self, machine, shot_num, c): - time, data, mapping, success = self.fetch_data_basic(machine, shot_num, - c) + time, data, mapping, success = self.fetch_data_basic( + machine, shot_num, c) path = self.get_path(machine) mapping_path = self.get_mapping_path(machine) diff --git a/plasma/primitives/shots.py b/plasma/primitives/shots.py index a9e95df9..3079b8b2 100644 --- a/plasma/primitives/shots.py +++ b/plasma/primitives/shots.py @@ -13,7 +13,6 @@ import os.path import sys import random as rnd - import numpy as np from plasma.utils.processing import train_test_split, cut_and_resample_signal @@ -36,11 +35,9 @@ def __repr__(self): return self.__str__() def get_single_shot_numbers_and_disruption_times(self, full_path): - data = np.loadtxt( - full_path, ndmin=1, dtype={ - 'names': ( - 'num', 'disrupt_times'), 'formats': ( - 'i4', 'f4')}) + data = np.loadtxt(full_path, ndmin=1, + dtype={'names': ('num', 'disrupt_times'), + 'formats': ('i4', 'f4')}) shots = np.array(list(zip(*data))[0]) disrupt_times = np.array(list(zip(*data))[1]) return shots, disrupt_times @@ -77,21 +74,18 @@ def __init__(self, shots=None): assert(all([isinstance(shot, Shot) for shot in shots])) self.shots = [shot for shot in shots] - def load_from_shot_list_files_object( - self, shot_list_files_object, signals): + def load_from_shot_list_files_object(self, shot_list_files_object, + signals): machine = shot_list_files_object.machine shot_numbers, disruption_times = ( shot_list_files_object.get_shot_numbers_and_disruption_times()) for number, t in list(zip(shot_numbers, disruption_times)): - self.append( - Shot(number=number, t_disrupt=t, machine=machine, - signals=[s for s in signals if - s.is_defined_on_machine(machine)] - ) - ) - - def load_from_shot_list_files_objects( - self, shot_list_files_objects, signals): + self.append(Shot(number=number, t_disrupt=t, machine=machine, + signals=[s for s in signals if + s.is_defined_on_machine(machine)])) + + def load_from_shot_list_files_objects(self, shot_list_files_objects, + signals): for obj in shot_list_files_objects: self.load_from_shot_list_files_object(obj, signals) @@ -276,16 +270,9 @@ class Shot(object): property. ''' - def __init__( - self, - number=None, - machine=None, - signals=None, - signals_dict=None, - ttd=None, - valid=None, - is_disruptive=None, - t_disrupt=None): + def __init__(self, number=None, machine=None, signals=None, + signals_dict=None, ttd=None, valid=None, is_disruptive=None, + t_disrupt=None): ''' Shot objects contain following attributes: @@ -415,8 +402,7 @@ def get_signals_and_times_from_file(self, conf): if self.is_disruptive and self.t_disrupt > np.max(t): t_max_total = ( np.max(t) + signal.get_data_avail_tolerance( - self.machine) - ) + self.machine)) if (self.t_disrupt > t_max_total): print('Shot {}: disruption event '.format(self.number), 'is not contained in valid time region of ', @@ -425,8 +411,8 @@ def get_signals_and_times_from_file(self, conf): self.t_disrupt - np.max(t))) valid = False else: - t_max = np.max( - t) + signal.get_data_avail_tolerance(self.machine) + t_max = np.max(t) + signal.get_data_avail_tolerance( + self.machine) else: t_max = min(t_max, np.max(t)) @@ -449,13 +435,8 @@ def get_signals_and_times_from_file(self, conf): return time_arrays, signal_arrays, t_min, t_max, valid - def cut_and_resample_signals( - self, - time_arrays, - signal_arrays, - t_min, - t_max, - conf): + def cut_and_resample_signals(self, time_arrays, signal_arrays, t_min, + t_max, conf): dt = conf['data']['dt'] signals_dict = dict() From 31fafa34e0e4aeafc5ad04e40c7d5e61ecc65892 Mon Sep 17 00:00:00 2001 From: Kyle Gerard Felker Date: Fri, 22 Nov 2019 11:35:43 -0600 Subject: [PATCH 659/744] Drop Rick Zamora's ALCF notes into docs/ --- docs/ALCF.md | 366 +++++++++++++++++++++++++++++++++++++++++++++ examples/conf.yaml | 6 +- 2 files changed, 369 insertions(+), 3 deletions(-) create mode 100644 docs/ALCF.md diff --git a/docs/ALCF.md b/docs/ALCF.md new file mode 100644 index 00000000..63877423 --- /dev/null +++ b/docs/ALCF.md @@ -0,0 +1,366 @@ +# ALCF Theta `plasma-python` FRNN Notes + +**Author: Rick Zamora (rzamora@anl.gov)** + +This document is intended to act as a tutorial for running the [plasma-python](https://github.com/PPPLDeepLearning/plasma-python) implementation of the Fusion recurrent neural network (FRNN) on the ALCF Theta supercomputer (Cray XC40; Intel KNL processors). The steps followed in these notes are based on the Princeton [Tiger-GPU tutorial](https://github.com/PPPLDeepLearning/plasma-python/blob/master/docs/PrincetonUTutorial.md#location-of-the-data-on-tigress), hosted within the main GitHub repository for the project. + +## Environment Setup + + +Choose a *root* directory for FRNN-related installations on Theta: + +``` +export FRNN_ROOT= +cd $FRNN_ROOT +``` + +*Personal Note: Using FRNN_ROOT=/home/zamora/ESP* + +Create a simple directory structure allowing experimental *builds* of the `plasma-python` python code/library: + +``` +mkdir build +mkdir build/miniconda-3.6-4.5.4 +cd build/miniconda-3.6-4.5.4 +``` + +### Custom Miniconda Environment Setup + +Copy miniconda installation script to working directory (and install): + +``` +cp /lus/theta-fs0/projects/fusiondl_aesp/FRNN/rzamora/scripts/install_miniconda-3.6-4.5.4.sh . +./install_miniconda-3.6-4.5.4.sh +``` + +The `install_miniconda-3.6-4.5.4.sh` script will install `miniconda-4.5.4` (using `Python-3.6`), as well as `Tensorflow-1.12.0` and `Keras 2.2.4`. + + +Update your environment variables to use miniconda: + +``` +export PATH=${FRNN_ROOT}/build/miniconda-3.6-4.5.4/miniconda3/4.5.4/bin:$PATH +export PYTHONPATH=${FRNN_ROOT}/build/miniconda-3.6-4.5.4/miniconda3/4.5.4/lib/python3.6/site-packages/:$PYTHONPATH +``` + +Note that the previous lines (as well as the definition of `FRNN_ROOT`) can be appended to your `$HOME/.bashrc` file if you want to use this environment on Theta by default. + + +## Installing `plasma-python` + +Here, we assume the installation is within the custom miniconda environment installed in the previous steps. We also assume the following commands have already been executed: + +``` +export FRNN_ROOT= +export PATH=${FRNN_ROOT}/build/miniconda-3.6-4.5.4/miniconda3/4.5.4/bin:$PATH +export PYTHONPATH=${FRNN_ROOT}/build/miniconda-3.6-4.5.4/miniconda3/4.5.4/lib/python3.6/site-packages/:$PYTHONPATH +``` + +*Personal Note: Using `export FRNN_ROOT=/lus/theta-fs0/projects/fusiondl_aesp/zamora/FRNN_project`* + +If the environment is set up correctly, installation of `plasma-python` is straightforward: + +``` +cd ${FRNN_ROOT}/build/miniconda-3.6-4.5.4 +git clone https://github.com/PPPLDeepLearning/plasma-python.git +cd plasma-python +python setup.py build +python setup.py install +``` + +## Data Access + +Sample data and metadata is available in `/lus/theta-fs0/projects/FRNN/tigress/alexeys/signal_data` and `/lus/theta-fs0/projects/FRNN/tigress/alexeys/shot_lists`, respectively. It is recommended that users create their own symbolic links to these directories. I recommend that you do this within a directory called `/lus/theta-fs0/projects/fusiondl_aesp//`. For example: + +``` +ln -s /lus/theta-fs0/projects/fusiondl_aesp/FRNN/tigress/alexeys/shot_lists  /lus/theta-fs0/projects/fusiondl_aesp//shot_lists +ln -s /lus/theta-fs0/projects/fusiondl_aesp/FRNN/tigress/alexeys/signal_data  /lus/theta-fs0/projects/fusiondl_aesp//signal_data +``` + +For the examples included in `plasma-python`, there is a configuration file that specifies the root directory of the raw data. Change the `fs_path: '/tigress'` line in `examples/conf.yaml` to reflect the following: + +``` +fs_path: '/lus/theta-fs0/projects/fusiondl_aesp' +``` + +Its also a good idea to change `num_gpus: 4` to `num_gpus: 1`. I am also using the `jet_data_0D` dataset: + +``` +paths: + data: jet_data_0D +``` + + +### Data Preprocessing + +#### The SLOW Way (On Theta) + +Theta is KNL-based, and is **not** the best resource for processing many text files in python. However, the preprocessing step *can* be used by using the following steps (although it may need to be repeated many times to get through the whole dataset in a 60-minute debug queues): + +``` +cd ${FRNN_ROOT}/build/miniconda-3.6-4.5.4/plasma-python/examples +cp /lus/theta-fs0/projects/fusiondl_aesp/FRNN/rzamora/scripts/submit_guarantee_preprocessed.sh . +``` + +Modify the paths defined in `submit_guarantee_preprocessed.sh` to match your environment. + +Note that the preprocessing module will use Pathos multiprocessing (not MPI/mpi4py). Therefore, the script will see every compute core (all 256 per node) as an available resource. Since the LUSTRE file system is unlikely to perform well with 256 processes (on the same node) opening/closing/creating files at once, it might improve performance if you make a slight change to line 85 in the `vi ~/plasma-python/plasma/preprocessor/preprocess.py` file: + +``` +line 85: use_cores = min( , max(1,mp.cpu_count()-2) ) +``` + +After optionally re-building and installing plasm-python with this change, submit the preprocessing job: + +``` +qsub submit_guarantee_preprocessed.sh +``` + +#### The FAST Way (On Cooley) + +You will fine it much less painful to preprocess the data on Cooley, because the Haswell processors are much better suited for this... Log onto the ALCF Cooley Machine: + +``` +ssh @cooley.alcf.anl.gov +``` + +Copy my `cooley_preprocess` example directory to whatever directory you choose to work in: + +``` +cp -r /lus/theta-fs0/projects/fusiondl_aesp/FRNN/rzamora/scripts/cooley_preprocess . +cd cooley_preprocess +``` + +This directory has a Singularity image with everything you need to run your code on Cooley. Assuming you have created symbolic links to the `shot_lists` and `signal_data` directories in `/lus/theta-fs0/projects/fusiondl_aesp//`, you can just submit the included `COBALT` script (to specify the data you want to process, just modify the included `conf.yaml` file): + +``` +qsub submit.sh +``` + +For me, this finishes in less than 10 minutes, and creates 5523 `.npz` files in the `/lus/theta-fs0/projects/fusiondl_aesp//processed_shots/` directory. The output file of the COBALT submission ends with the following message: + +``` +5522/5523Finished Preprocessing 5523 files in 406.94421911239624 seconds +Omitted 5523 shots of 5523 total. +0/0 disruptive shots +WARNING: All shots were omitted, please ensure raw data is complete and available at /lus/theta-fs0/projects/fusiondl_aesp/zamora/signal_data/. +4327 1196 +``` + + +# Notes on Revisiting Pre-Processes + +## Preprocessing Information + +To understand what might be going wrong with the preprocessing step, let's investigate what the code is actually doing. + +**Step 1** Call `guarentee_preprocessed( conf )`, which is defined in `plasma/preprocessor/preprocess.py`. This function first initializes a `Preprocessor()` object (whose class definition is in the same file), and then checks if the preprocessing was already done (by looking for a file). The preprocessor object is called `pp`. + +**Step 2** Assuming preprocessing is needed, we call `pp.clean_shot_lists()`, which loops through each file in the `shot_lists` directory and calls `self.clean_shot_list()` (not plural) for each text-file item. I do not believe this function is doing any thing when I run it, because all the shot list files have been "cleaned." The cleaning of a shot-list file just means the data is corrected to have two columns, and the file is renamed (to have "clear" in the name). + +**Step 3** We call `pp.preprocess_all()`, which parses some of the config file, and ultimately calls `self.preprocess_from_files(shot_files_all,use_shots)` (where I believe `shot_files_all` is the output directory, and `use_shots` is the number of shots to use). + +**Step 4** The `preprocess_from_files()` function is used to do the actual preprocessing. It does this by creating a multiprocessing pool, and mapping the processes to the `self.preprocess_single_file` function (note that the code for `ShotList` class is in `plasma/primitives/shots.py`, and the preprocessing code is still in `plasma/preprocessor/preprocess.py`). + +**Important:** It looks like the code uses the path definitions in `data/shot_lists/signals.py` to define the location/path of signal data. I believe that some of the signal data is missing, which is causing every "shot" to be labeled as incomplete (and consequently thrown out). + +### Possible Issues + +From the preprocessing output, it is clear that the *Signal Radiated Power Core* data was not downloaded correctly. According to the `data/shot_lists/signals.py` file, the data *should* be in `/lus/theta-fs0/projects/fusiondl_aesp//signal_data/jet/ppf/bolo/kb5h/channel14`. However, the only subdirectory of `~/jet/ppf/` is `~/jet/ppf/efit` + +Another possible issue is that the `data/shot_lists/signals.py` file specifies the **name** of the directory containing the *Radiated Power* data incorrectly (*I THINK*). Instead of the following line: + +`pradtot = Signal("Radiated Power",['jpf/db/b5r-ptot>out'],[jet])` + +We might need this: + +`pradtot = Signal("Radiated Power",['jpf/db/b5r-ptot\>out'],[jet])` + +The issue has to do with the `>` character in the directory name (without the proper `\` escape character, python may be looking in the wrong path). **NOTE: I need to confirm that there is actually an issue with the way the code is actually using the string.** + + +## Singularity/Docker Notes + +Recall that the data preprocessing step was PAINFULLY slow on Theta, and so I decided to use Cooley. To simplify the process of using Cooley, I created a Docker image with the necessary environment. **Personal Note:** I performed this work on my local machine (Mac) in `/Users/rzamora/container-recipes`. + + +In order to use a Docker image within a Singularity container (required on ALCF machines), it is useful to build the image on your local machine and push it to "Docker Hub": + + +**Step 1:** Install Docker if you don't have it. [Docker-Mac](https://www.docker.com/docker-mac) works well for Mac. + +**Step 2:** Build a Docker image using the recipe discussed below. + +``` +export IMAGENAME="test_image" +export RECIPENAME="Docker.centos7-cuda-tf1.12.0" +docker build -t $IMAGENAME -f $RECIPENAME . +``` + +You can check that the image is functional by starting an interactive shell session, and checking that the necessary python modules are available. For example (using `-it` for an interactive session): + +``` +docker run --rm -it -v $PWD:/tmp -w /tmp $IMAGENAME:latest bash +# python -c "import keras; import plasma; print(plasma.__file__)" +``` + +Note that the `plasma-python` source code will be located in `/root/plasma-python/` for the recipe described below. + +**Step 3:** Push the image to [Docker Hub](https://hub.docker.com/). + +Using your docker-hub username: + +``` +docker login --username= +``` + +Then, "tag" the image using the `IMAGE ID` value displayed with `docker image ls`: + +``` +docker tag /: