From 0ebe0cad84d0d8cf36f2fdfa3258250d6cf23753 Mon Sep 17 00:00:00 2001 From: jfsScience Date: Wed, 18 Nov 2020 14:30:09 +0100 Subject: [PATCH] first commit --- CCDfiles.py | 74 + CCDhelp.py | 231 +++ CCDmenusetup.py | 45 + CCDpanelsetup.py | 340 +++++ CCDplots.py | 62 + CCDserial.py | 235 +++ config.py | 30 + latest.dat | 3698 ++++++++++++++++++++++++++++++++++++++++++++++ newout.dat | 3698 ++++++++++++++++++++++++++++++++++++++++++++++ output.dat | 3698 ++++++++++++++++++++++++++++++++++++++++++++++ pyCCDGUI.py | 54 + 11 files changed, 12165 insertions(+) create mode 100644 CCDfiles.py create mode 100644 CCDhelp.py create mode 100644 CCDmenusetup.py create mode 100644 CCDpanelsetup.py create mode 100644 CCDplots.py create mode 100644 CCDserial.py create mode 100644 config.py create mode 100644 latest.dat create mode 100644 newout.dat create mode 100644 output.dat create mode 100644 pyCCDGUI.py diff --git a/CCDfiles.py b/CCDfiles.py new file mode 100644 index 0000000..f21c453 --- /dev/null +++ b/CCDfiles.py @@ -0,0 +1,74 @@ +# Copyright (c) 2019 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + + +#python imports +import numpy as np +from tkinter import filedialog +from tkinter import messagebox +import tkinter as tk +import csv + +#application imports +import config +import CCDpanelsetup + +def openfile(self, CCDplot): + filename = filedialog.askopenfilename(defaultextension=".dat", title="Open file", parent=self) + line_count = 0 + try: + with open(filename) as csvfile: + readCSV = csv.reader(csvfile, delimiter=' ') + + for row in readCSV: + if (line_count == 3): + config.SHsent = int(row[1]) + config.ICGsent = int(row[6]) + if (line_count > 3): + config.rxData16[line_count-4] = int(row[1]) + line_count += 1 + CCDpanelsetup.buildpanel.updateplot(self, CCDplot) + + + except IOError: + messagebox.showerror("By the great otter!","There's a problem opening the file.") + + +def savefile(self): + filename = filedialog.asksaveasfilename(defaultextension=".dat", title="Save file as", parent=self) + try: + with open(filename, mode='w') as csvfile: + writeCSV = csv.writer(csvfile, delimiter=' ') + writeCSV.writerow(["#Data","from","the","TCD1304","linear","CCD"]) + writeCSV.writerow(["#column","1","=","pixelnumber",",","column","2","=","pixelvalue"]) + writeCSV.writerow(["#Pixel","1-32","and","3679-3694","and","are","dummy","pixels"]) + writeCSV.writerow(["#SH-period:",str(config.SHsent),"","","","ICG-period:",str(config.ICGsent),"","","","Integration","time:",str(config.SHsent/2),"µs"]) + for i in range (3694): + writeCSV.writerow([str(i+1),str(config.rxData16[i])]) + + + except IOError: + messagebox.showerror("By the great otter!","There's a problem saving the file.") diff --git a/CCDhelp.py b/CCDhelp.py new file mode 100644 index 0000000..0437091 --- /dev/null +++ b/CCDhelp.py @@ -0,0 +1,231 @@ +# Copyright (c) 2019 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + +import tkinter as tk + + +def helpme(helpfor): + top = tk.Toplevel() + top.title("Help") + scrolling = tk.Scrollbar(top) + scrolling.pack(side=tk.RIGHT, fill=tk.Y) + helptext = tk.Text(top, height=20, width=80, wrap=tk.WORD) + helptext.pack(side=tk.LEFT, fill=tk.Y) + scrolling.config(command=helptext.yview) + helptext.config(yscrollcommand=scrolling.set) + + helptext.tag_configure('it', font=('Arial', 10, 'italic')) + helptext.tag_configure('h1', font=('Verdana', 16, 'bold')) + helptext.tag_configure('h2', font=('Verdana', 12, 'bold')) + helptext.tag_configure('h3', font=('Verdana', 10, 'bold')) + + if (helpfor == 0): #do you need help with the device? + helptext.insert(tk.END, " Communication device\n", 'h1') + helptext.insert(tk.END, "\nThe communication device is the identifier for the USB->serial connection. The label under the entrybox states if the given device is accessible or not. Beware that the label only updates during startup and editing of the entry. If the nucleo is attached after starting the application, the label may or may not be correct.\n") + helptext.insert(tk.END, "\nIf a valid device is not selected, an error message will appear, when pressing Collect. \n") + helptext.insert(tk.END, "\n Linux \n", "h2") + helptext.insert(tk.END, "\nOn Linux the STM32 Nucleo board attaches as a tty-device. The default on Debian-based systems is: \n") + helptext.insert(tk.END, "\n /dev/ttyACM0 \n") + helptext.insert(tk.END, "\nIf the nucleo does not attach as the default device, check the output of dmesg or the contents of /dev/\n") + helptext.insert(tk.END, "\nYou may find that the device exists, but you still get an error message when pressing collect. This is likely a permission-problem. It can be solved by adding your user to the dialout group. Type:\n") + helptext.insert(tk.END, "\n sudo adduser esben dialout \n") + helptext.insert(tk.END, "\n macOS \n", "h2") + helptext.insert(tk.END, "\nOn macOS the STM32 Nucleo board attaches itself as a device called:\n") + helptext.insert(tk.END, "\n /dev/cu.usbmodemXYZ \n") + helptext.insert(tk.END, "\nCheck the contents of /dev/ to find out what to replace XYZ with. In case this directory is hidden from view in Finder, you will need to open a terminal and type:\n") + helptext.insert(tk.END, "\n ls /dev/ \n") + helptext.insert(tk.END, "\n Windows\n", "h2") + helptext.insert(tk.END, "\nWindows uses an entirely different subsystem for serial communication than *NIX-systems. The STM32 Nucleo is attached as a COM-port (if the STM32 Virtual COM port driver is installed). Try with \n") + helptext.insert(tk.END, "\n COMn \n") + helptext.insert(tk.END, "\nWhere n is an integer, eg. COM6\n") + helptext.insert(tk.END, "\n \n") + helptext.insert(tk.END, "\n \n") + + elif (helpfor == 1): #do you need help with the SH and ICG pulses? + helptext.insert(tk.END, " Driving pulses\n", 'h1') + helptext.insert(tk.END, "\nThe TCD1304 requires 3 driving pulses: \n") + helptext.insert(tk.END, "\n - MCLK (master clock)") + helptext.insert(tk.END, "\n - SH (shift gate)") + helptext.insert(tk.END, "\n - ICG (integration clear gate)\n") + helptext.insert(tk.END, "\nThe following is for STM32F40x firmwares. If you use the STM32F103 make sure to also read the final paragraph.\n") + helptext.insert(tk.END, "\n MCLK - The master clock\n", "h2") + helptext.insert(tk.END, "\nThe MCLK (sometimes called fM or φM) is the CCD's clock speed. It defines the time-base which the TCD1304 operates in, and for the unmodified CCD driver firmware MCLK has the value:\n") + helptext.tag_add("fm", "13.28", "13.29", "13.34","13.35") + helptext.tag_config("fm" , offset=-4) + helptext.insert(tk.END, "\n MCLK = 2,0 MHz \n") + helptext.insert(tk.END, "\nThe value of MCLK is used to derive the integration time from the SH-pulse\n") + + helptext.insert(tk.END, "\n SH - The shift gate\n", "h2") + helptext.insert(tk.END, "\nThe SH-pulse defines the integration time, tint, which for the TCD1304 cannot be shorter than 10 µs. The user controls the SH-period, which together with MCLK, determines the frequency of the SH-pulse: \n") + helptext.tag_add("tint2", "21.44", "21.47") + helptext.tag_config("tint2" , offset=-4) + helptext.insert(tk.END, "\n SH-frequency = MCLK / SH-period \n") + helptext.insert(tk.END, "\n tint = 1 / SH-frequency = SH-period / MCLK \n") + helptext.tag_add("tint1", "25.3", "25.6") + helptext.tag_config("tint1" , offset=-4) + helptext.insert(tk.END, "\nBecause the CCD has a minimum integration time of 10 µs, the SH-period cannot be smaller than: \n") + helptext.insert(tk.END, "\n SH-period = tint · MCLK \n") + helptext.tag_add("tint3", "29.15", "29.18") + helptext.tag_config("tint3" , offset=-4) + helptext.insert(tk.END, " = 10 µs · 2,0 MHz = 20 \n") + helptext.insert(tk.END, "\nBecause the timer controlling the SH-pulse is 32-bit, the largest value for the SH-period is \n") + helptext.insert(tk.END, "\n 2³² - 1 = 4294967295 \n") + helptext.insert(tk.END, "\nCorresponding to a max. integration time of: \n") + helptext.insert(tk.END, "\n tint = (2³² - 1) / 2,0 MHz = 35 min \n") + helptext.tag_add("tint4", "38.3", "38.6") + helptext.tag_config("tint4" , offset=-4) + helptext.insert(tk.END, "\n Example: \n", "h3") + helptext.insert(tk.END, "\nSay one whishes to make a collection with an integration time, tint, of 15 ms, what should the SH-period then be?\n") + helptext.tag_add("tint5", "42.64", "42.67") + helptext.tag_config("tint5" , offset=-4) + helptext.insert(tk.END, "\nThe integration time and the MCLK gives the SH-period as:\n") + helptext.insert(tk.END, "\n SH-period = tint · MCLK \n") + helptext.insert(tk.END, " = 15 ms · 2,0 MHz = 0,015 s · 2000000 Hz = 30000 \n") + helptext.tag_add("tint5", "46.15", "46.18") + helptext.tag_config("tint5" , offset=-4) + helptext.insert(tk.END, "\n ICG - The integration clear gate \n", "h2") + helptext.insert(tk.END, "\nThe ICG-pulse defines the moment when the pixels are dumped to the output-pin of the CCD. The ICG-pulse must coincide with an SH-pulse, so the following relation must be obeyed: \n") + helptext.insert(tk.END, "\n ICG-period = n · SH-period \n") + helptext.insert(tk.END, "\nwhere n is an integer. When n equals 1, the CCD is said to operate in normal mode. When n is larger than 1, the CCD runs in electronic shutter mode.\n") + helptext.insert(tk.END, "\nBecause it takes 4 MCLK cycles for the TCD1304 to output 1 pixel, and the chip has 3694 pixels the minimum value for the ICG-period becomes: \n") + helptext.insert(tk.END, "\n 4 · 3694 = 14776\n") + helptext.insert(tk.END, "\nThis in turn defines the read-out time for the CCD, and is of course dependent on MCLK: \n") + helptext.insert(tk.END, "\n tread = 14776 / MCLK = 14776 / 2,0 MHz = 7,4 ms\n") + helptext.tag_add("tread", "63.4", "63.8") + helptext.tag_config("tread" , offset=-4) + helptext.insert(tk.END, "\nIn the unmodified CCD driver firmware, the user LED blinks with half the frequency of the ICG-pulse.\n") + helptext.insert(tk.END, "\n STM32F103-specifics\n", "h2") + helptext.insert(tk.END, "\nThe firmware for the STM32F103 differs from the STM32F40x firmwares in that:\n") + helptext.insert(tk.END, "\n MCLK = 800 kHz\n") + helptext.insert(tk.END, "\nand since the chip only has 16-bit timers, the maximum allowed values for the SH- and ICG-period is:\n") + helptext.insert(tk.END, "\n 2¹⁶ - 1 = 65535\n") + helptext.insert(tk.END, "\nmeaning that the longest integration time is:\n") + helptext.insert(tk.END, "\n tint = 65535 / 800 kHz = 82 ms\n") + helptext.insert(tk.END, "\nThe minimum ICG-period is unaffected by MCLK and remains 14776, however the minimum SH-period becomes:\n") + helptext.insert(tk.END, "\n SH-period = 10 µs · 800 kHz = 8") + + + + + + + elif (helpfor == 2): #do you need help with averaging + helptext.insert(tk.END, "Averaging\n", 'h1') + helptext.insert(tk.END, "\nS/N may be increased by collecting n identical recordings and averaging them to cancel out noise. In theory the signal should improve with √n.\n") + helptext.insert(tk.END, "\nHowever CCD's are subject to readout noise, so it may be preferable to collect a single recording with longer integration time.\n") + helptext.insert(tk.END, "\nThe CCD driver firmware features on-board averaging of 2-15 identical recordings without the penalty of having to perform n transmissions.\n") + helptext.insert(tk.END, "\nStoring the individual recordings is not instantaneous, and using the average-feature requires a slight overhead in the ICG-period compared to the readout time.\n") + helptext.insert(tk.END, "\nSTM32F40x\n", 'h2') + helptext.insert(tk.END, "\nTo ensure that the MCU has time to store the individual integrations, the following condition should be met:\n") + helptext.insert(tk.END, "\n ICG-period = n·SH-period ≥ 30 000\n") + helptext.insert(tk.END, "\nfor a CCD running with an MCLK of 2.0 MHz.\n") + helptext.insert(tk.END, "\nSTM32F103\n", 'h2') + helptext.insert(tk.END, "\nTo ensure that the MCU has time to store the individual integrations, the following condition should be met:\n") + helptext.insert(tk.END, "\n ICG-period = n·SH-period ≥ 32 000\n") + helptext.insert(tk.END, "\nfor a CCD running with an MCLK of 800 kHz.") + + elif (helpfor == 3): #do you need help for inverting data + helptext.insert(tk.END, "Options\n", 'h1') + helptext.insert(tk.END, "\nPlot raw data\n", 'h2') + helptext.insert(tk.END, "\nThe potential of a pixel is inversely related to the light intensity on the CCD, so the collected data should be inverted:\n") + helptext.insert(tk.END, "\n Ipixel = ADCmax - ADCpixel = 4095 - ADCpixel (1)\n") + helptext.tag_add("ipixel", "7.5", "7.10", "7.16", "7.19", "7.25", "7.30", "7.43", "7.48") + helptext.tag_config("ipixel" , offset=-4) + helptext.insert(tk.END, "\nTaking the CCD's dark-current into account, it becomes:\n") + helptext.insert(tk.END, "\n Ipixel = ADCdark - ADCpixel (2)\n") + helptext.tag_add("idark", "11.5", "11.10", "11.16", "11.20", "11.26", "11.31") + helptext.tag_config("idark" , offset=-4) + helptext.insert(tk.END, "\nThe ADC-count for the dark-current is given by the ADC-count for the CCD's dummy-pixels.\n") + helptext.insert(tk.END, "\nBy default, the application plots Ipixel as calculated in equation 2.\n") + helptext.tag_add("iplot", "15.35", "15.40") + helptext.tag_config("iplot" , offset=-4) + helptext.insert(tk.END, "\nChecking the 'Plot raw data' checkbox, the application plots ADCpixel directly.\n") + helptext.tag_add("iplotu", "17.64", "17.69") + helptext.tag_config("iplotu" , offset=-4) + helptext.insert(tk.END, "\nNotice that it's the raw data that is saved, and that it's up to the user to perform the operations above when using a different application.\n") + + #elif (helpfor == 4): #what is save and opened + helptext.insert(tk.END, "\nBalanced output\n", 'h2') + helptext.insert(tk.END, "\nOdd and even pixels on the TCD1304 are sent to different output shift registers in the CCD. Because of this, CCD-output may look noisier than it actually is.\n") + helptext.insert(tk.END, "\nWith the 'Balanced output' box checked, the application estimates the register imbalance (RI) and compensates for the difference when plotting the data.\n") + helptext.insert(tk.END, "\nThe register imbalance is calculated as the average of the differences between the output from the odd and even of the first 32 dummypixels.\n") + helptext.insert(tk.END, "\nRI = (Σ[even] - Σ[odd])/16\n") + helptext.insert(tk.END, "\nNotice that it's the raw data that is saved, and that it's up to the user to perform the operations above when using a different application.\n") + + + elif (helpfor == 5): #what is save and opened + helptext.insert(tk.END, "Saving files\n", 'h2') + helptext.insert(tk.END, "When saving, the raw data from the CCD is written to a file with the following gnuplot-compatible format: The lines 1-3 contain general information. Line 4 contains the CCD's settings. Lines 5-3698 contain the raw data from the CCD, as shown here:\n") + helptext.insert(tk.END, "\n#Data from the TCD1304 linear CCD\n") + helptext.insert(tk.END, "#column 1 = pixelnumber, column 2 = pixelvalue\n") + helptext.insert(tk.END, "#Pixel 1-32 and 3679-3694 and are dummy pixels\n") + helptext.insert(tk.END, "#SH-period: 40 ICG-period: 20000 Integration time: 20 us\n") + helptext.insert(tk.END, "1 3936\n") + helptext.insert(tk.END, "2 3934\n") + helptext.insert(tk.END, ".. ..\n") + helptext.insert(tk.END, ".. ..\n") + helptext.insert(tk.END, "3694 3934\n") + helptext.insert(tk.END, "\nNotice that it's the raw data that's saved. The raw data is not plottet by default. Instead the plotted intensities are calculated like this:\n") + helptext.insert(tk.END, "\n Ipixel = ADCdark - ADCpixel\n") + helptext.tag_add("isave", "16.5", "16.10", "16.16", "16.20", "16.26", "16.31") + helptext.tag_config("isave" , offset=-4) + helptext.insert(tk.END, "\nThe ADC-count for the dark-current is given by the ADC-count for the CCD's dummy-pixels.\n") + helptext.insert(tk.END, "\nOpening files\n", 'h2') + helptext.insert(tk.END, "The application expects a data-format identical to the one outlined in the 'Saving files' section.\n") + helptext.insert(tk.END, "\nThe command-line interface writes CCD-data to file in the same format, so the application can be used to open data collected with the CLI.\n") + + elif (helpfor == 6): + helptext.insert(tk.END, "Capture mode\n", 'h1') + helptext.insert(tk.END, "\nSingle\n", 'h2') + helptext.insert(tk.END, "\nExactly what it says. The MCU returns one dataset. If averaging is enabled it will collect and average n times before returning the dataset.\n") + helptext.insert(tk.END, "\nContinuous\n", 'h2') + helptext.insert(tk.END, "\nAlmost exactly what it says. The MCU reads the CCD and returns datasets with a framerate determined by the ICG-period and the averaging setting. \n \nIt's not possible to change settings on the fly.\n") + helptext.insert(tk.END, "\nImportant\n", 'h2') + helptext.insert(tk.END, "\nNotice that the MCU can read the CCD much faster than it can transmit a dataset. To avoid overwriting data before transmission is complete and/or crashing consider the following:\n") + helptext.insert(tk.END, "\nUART\n", 'h3') + helptext.insert(tk.END, "If you're running the TCD1304 of off an STM32 Nucleo F401 the communication protocol is UART, which is slow. Transmission takes at least 641 ms, so the ICG-period should be at least:\n") + helptext.insert(tk.END, "\nICG-period > 641 ms · 2.0 MHz = 1.282 · 10⁶\n") + helptext.insert(tk.END, "\nUSB\n", 'h3') + helptext.insert(tk.END, "If you're running the TCD1304 of off an STM32F103 or STM32F405, the communication protocol is full-speed USB. While FS-USB potentially runs at 12 Mbps, don't expect an actual speed this high.\n") + helptext.insert(tk.END, "\nSTM32F103\n", 'h3') + helptext.insert(tk.END, "I've been able to run the STM32F103 in continuous mode with an ICG-period as low as 44 000 with averaging set to 2, but not faster than that.\n") + + helptext.insert(tk.END, "\nThis corresponds to a max fps of: \n") + helptext.insert(tk.END, "\nfps = 800 kHz / (2 · 42 000) = 9.5 Hz\n") + helptext.insert(tk.END, "\nObserve that averaging is not instantaneous, and requires its own overhead with regards to the ICG-period, so keep the ICG-period ≥ 32 000.\n") + helptext.insert(tk.END, "\nSTM32F405\n", 'h3') + + elif (helpfor == 10): #about + helptext.insert(tk.END, "About\n", 'h1') + helptext.insert(tk.END, "\nCopyright (c) 2019 Esben Rossel") + helptext.insert(tk.END, "\nAll rights reserved.\n") + helptext.insert(tk.END, "\nAuthor: Esben Rossel \n") + helptext.insert(tk.END, "\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n") + helptext.insert(tk.END, "\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.") + helptext.insert(tk.END, "\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n") + helptext.insert(tk.END, "\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n") + + helptext.config(state=tk.DISABLED) diff --git a/CCDmenusetup.py b/CCDmenusetup.py new file mode 100644 index 0000000..f7e05c4 --- /dev/null +++ b/CCDmenusetup.py @@ -0,0 +1,45 @@ +# Copyright (c) 2019 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + +import tkinter as tk +from CCDhelp import * +from sys import exit + +class buildmenu(tk.Frame): + + + def __init__(self, master): + tk.Frame.__init__(self, master) + + self.menubar = tk.Menu(master) + + self.menubar.add_command(label="Exit", command=exit) + self.menubar.add_command(label="About", command=lambda helpfor=10: helpme(helpfor)) + + master.config(menu=self.menubar) + + + diff --git a/CCDpanelsetup.py b/CCDpanelsetup.py new file mode 100644 index 0000000..b481d89 --- /dev/null +++ b/CCDpanelsetup.py @@ -0,0 +1,340 @@ +# Copyright (c) 2019 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + +#python imports +import tkinter as tk +from tkinter import ttk +import numpy as np +import serial + +#application imports +import config +from CCDhelp import * +import CCDserial +import CCDfiles + +class buildpanel(tk.Frame): + def __init__(self, master, CCDplot, SerQueue): + #geometry-rows for packing the grid + device_row = 10 + shicg_row = 20 + continuous_row = 30 + avg_row = 40 + collect_row = 50 + plotmode_row = 60 + save_row = 70 + update_row = 80 + progress_var = tk.IntVar() + + tk.Frame.__init__(self, master=None) + + + #Create all widgets and space between them + self.devicefields(device_row) + #insert vertical space + self.grid_rowconfigure(device_row+3, minsize=30) + self.CCDparamfields(shicg_row) + #insert vertical space + self.grid_rowconfigure(shicg_row+4, minsize=30) + self.collectmodefields(continuous_row) + self.avgfields(avg_row) + #insert vertical space + self.grid_rowconfigure(avg_row+2, minsize=30) + self.collectfields(collect_row, SerQueue, progress_var) + #vertical space + self.grid_rowconfigure(collect_row+2, minsize=30) + self.plotmodefields(plotmode_row, CCDplot) + self.saveopenfields(save_row, CCDplot) + self.updateplotfields(update_row, CCDplot) + + + + + + + + + def devicefields(self, device_row): + #device setup - variables, widgets and traces associated with the device entrybox + #variables + self.device_address = tk.StringVar() + self.device_status = tk.StringVar() + self.device_statuscolor = tk.StringVar() + #widgets + self.ldevice = tk.Label(self, text="COM-device:") + self.ldevice.grid(column=0, row=device_row) + self.edevice = tk.Entry(self, textvariable=self.device_address, justify='left') + self.edevice.grid(column=1, row=device_row) + self.ldevicestatus = tk.Label(self, textvariable=self.device_status, fg="green") + #setup trace to check if the device exists + self.device_address.trace("w", lambda name, index, mode, Device=self.device_address, status=self.device_status, colr=self.ldevicestatus: self.DEVcallback(name, index, mode, Device, status, colr)) + self.device_address.set(config.port) + self.ldevicestatus.grid(columnspan=2, row=device_row+1) + #help button + self.bhdev = tk.Button(self, text="?", command=lambda helpfor=0: helpme(helpfor)) + self.bhdev.grid(row=device_row, column=3) + + + + def CCDparamfields(self, shicg_row): + #CCD parameters - variables, widgets and traces associated with setting ICG and SH for the CCD + self.SHvalue = tk.StringVar() + self.SHvalue.set("200") + self.ICGvalue = tk.StringVar() + self.ICGvalue.set("100000") + self.tint = tk.StringVar() + self.tint.set("Integration time is 0.1 ms") + self.ICGSHstatus = tk.StringVar() + self.ICGSHstatus.set("Correct CCD pulse timing.") + self.ICGSHstatuscolor = tk.StringVar() + #pulse timing tip + self.ltipSHICG = tk.Label(self, text="ICG = n·SH") + self.ltipSHICG.grid(columnspan=2, row=shicg_row-1) + #setup SH-entry + self.lSH = tk.Label(self, text="SH-period:") + self.lSH.grid(column=0, row=shicg_row) + self.eSH = tk.Entry(self, textvariable=self.SHvalue, justify='right') + self.eSH.grid(column=1, row=shicg_row) + #setup ICG-entry + self.lICG = tk.Label(self, text="ICG-period:") + self.lICG.grid(column=0, row=shicg_row+1) + self.eICG = tk.Entry(self, textvariable=self.ICGvalue, justify='right') + self.eICG.grid(column=1, row=shicg_row+1) + #setup ICGSH-status label + self.lICGSH = tk.Label(self, textvariable=self.ICGSHstatus, fg="green") + self.lICGSH.grid(columnspan=2, row=shicg_row+2) + #integration time label + self.ltint = tk.Label(self, textvariable=self.tint) + self.ltint.grid(columnspan=2, row=shicg_row+3) + #help button + self.bhtiming = tk.Button(self, text="?", command=lambda helpfor=1: helpme(helpfor)) + self.bhtiming.grid(row=shicg_row, rowspan=2, column=3) + #setup traces to update tx-data + self.SHvalue.trace("w", lambda name, index, mode, status=self.ICGSHstatus, tint=self.tint, colr=self.lICGSH, SH=self.SHvalue, ICG=self.ICGvalue: self.ICGSHcallback(name, index, mode, status, tint, colr, SH, ICG)) + self.ICGvalue.trace("w", lambda name, index, mode, status=self.ICGSHstatus, tint=self.tint, colr=self.lICGSH, SH=self.SHvalue, ICG=self.ICGvalue: self.ICGSHcallback(name, index, mode, status, tint, colr, SH, ICG)) + + + def collectmodefields(self, continuous_row): + #setup continuous vs one-shot + self.collectmode_frame = tk.Frame(self) + self.collectmode_frame.grid(row=continuous_row, columnspan=2) + self.CONTvar = tk.IntVar() + self.rcontinuous = tk.Radiobutton(self.collectmode_frame, text="Continuous", variable=self.CONTvar, value=1, command=lambda CONTvar=self.CONTvar: self.modeset(CONTvar)) + self.rcontinuous.grid(row=0, column=2, sticky="W") + self.roneshot = tk.Radiobutton(self.collectmode_frame, text="Single", variable=self.CONTvar, value=0, command=lambda CONTvar=self.CONTvar: self.modeset(CONTvar)) + self.roneshot.grid(row=0, column=1, sticky="W") + #help button + self.bhcollectmode = tk.Button(self, text="?", command=lambda helpfor=6: helpme(helpfor)) + self.bhcollectmode.grid(row=continuous_row, column=3) + + + def avgfields(self, avg_row): + #setup AVG entry + self.lAVG = tk.Label(self, text="Average:") + self.lAVG.grid(column=0, row=avg_row) + self.AVGscale = tk.Scale(self, orient='horizontal', from_=1, to=15) + self.AVGscale.configure(command=self.AVGcallback) + self.AVGscale.grid(column=1, row=avg_row, sticky="we") + #help button + self.bhavg = tk.Button(self, text="?", command=lambda helpfor=2: helpme(helpfor)) + self.bhavg.grid(row=avg_row, column=3) + + + def collectfields(self, collect_row, SerQueue, progress_var): + #setup collect and stop buttons + self.progress = ttk.Progressbar(self, orient="horizontal", maximum=10, mode="determinate", var=progress_var) + self.bcollect = tk.Button(self, text="Collect", command=lambda panel=self, SerQueue=SerQueue, progress_var=progress_var: CCDserial.rxtx(panel, SerQueue, progress_var)) + self.bcollect.event_generate('', when='tail') + self.bcollect.grid(row=collect_row, columnspan=3, sticky="EW", padx=5) + self.bstop = tk.Button(self, text="Stop", state=tk.DISABLED, command=lambda queue=SerQueue: CCDserial.rxtxcancel(queue)) + self.bstop.grid(row=collect_row, column=3) + self.progress.grid(row=collect_row+1, columnspan=3, sticky="EW", padx=5) + + + def plotmodefields(self, plotmode_row, CCDplot): + #setup plot mode checkbuttons + self.plotmode_frame = tk.Frame(self) + self.plotmode_frame.grid(row=plotmode_row, columnspan=2) + self.balance_var = tk.IntVar() + self.rawplot_var = tk.IntVar() + self.cinvert = tk.Checkbutton(self.plotmode_frame, text="Plot raw data", variable=self.rawplot_var, offvalue=1, onvalue=0)#, state=tk.ACTIVE) + self.cinvert.deselect() + self.cinvert.grid(row=0, column=1, sticky="W") + self.cbalance = tk.Checkbutton(self.plotmode_frame, text="Balance output", variable=self.balance_var, offvalue=0, onvalue=1)#, state=tk.ACTIVE) + self.cbalance.select() + self.cbalance.grid(row=0, column=2, sticky="W") + self.grid_rowconfigure(plotmode_row+2, minsize=50) + #help button + self.bhinv = tk.Button(self, text="?", command=lambda helpfor=3: helpme(helpfor)) + self.bhinv.grid(row=plotmode_row, column=3) + #setup traces + self.rawplot_var.trace("w", lambda name, index, mode, invert=self.rawplot_var, plot=CCDplot: self.RAWcallback(name, index, mode, invert, plot)) + self.balance_var.trace("w", lambda name, index, mode, balance=self.balance_var, plot=CCDplot: self.BALcallback(name, index, mode, balance, plot)) + + + def saveopenfields(self, save_row, CCDplot): + #setup save/open buttons + self.fileframe = tk.Frame(self) + self.fileframe.grid(row=save_row, columnspan=2) + self.bopen = tk.Button(self.fileframe, text="Open", width=11, command=lambda self=self, CCDplot=CCDplot: CCDfiles.openfile(self, CCDplot)) + self.bsave = tk.Button(self.fileframe, text="Save", width=11, state=tk.DISABLED,command=lambda self=self: CCDfiles.savefile(self)) + self.bopen.pack(side=tk.LEFT) + self.bsave.pack(side=tk.LEFT) + #help button + self.bhsav = tk.Button(self, text="?", command=lambda helpfor=5: helpme(helpfor)) + self.bhsav.grid(row=save_row, column=3) + + def updateplotfields(self, update_row, CCDplot): + self.bupdate = tk.Button(self, text="Update plot", command=lambda CCDplot=CCDplot: self.updateplot(CCDplot)) + #setup an event on the invisible update-plot button with a callback this thread can invoke in the mainloop + self.bupdate.event_generate('', when='tail') + + #commented out, it's needed to inject an event into the tk.mainloop for updating the plot from the 'checkfordata' thread + #self.bupdate.grid(row=update_row, columnspan=3, sticky="EW", padx=5) + + + + ### Callbacks for traces, buttons, etc ### + def callback(self): + self.bopen.config(state=tk.DISABLED) + return() + + + def ICGSHcallback(self, name, index, mode, status, tint, colr, SH, ICG): + try: + config.SHperiod = np.uint32(int(SH.get())) + config.ICGperiod = np.uint32(int(ICG.get())) + except: + print("SH or ICG not an integer") + self.print_tint = tk.StringVar() + + + + if (config.SHperiod < 1): + config.SHperiod = 1 + if (config.ICGperiod < 1): + config.ICGperiod = 1 + + + if ((config.ICGperiod % config.SHperiod) or (config.SHperiod < 20) or (config.ICGperiod < 14776)): + status.set("CCD pulse timing violation!") + colr.configure(fg="red") + self.print_tint.set("invalid") + else: + status.set("Correct CCD pulse timing.") + colr.configure(fg="green") + if (config.SHperiod < 20000000): + self.print_tint.set(str(config.SHperiod/2000) + " ms") + elif (config.SHperiod <= 1200000000): + self.print_tint.set(str(config.SHperiod/2000000) + " s") + elif (config.SHperiod > 1200000000): + self.print_tint.set(str(round(config.SHperiod/120000000,2)) + " min") + + + #tint.set("Integration time is " + + " ms") + tint.set("Integration time is " + self.print_tint.get()) + + def modeset(self, CONTvar): + config.AVGn[0]=CONTvar.get() + + + def AVGcallback(self,AVGscale): + config.AVGn[1] = np.uint8(self.AVGscale.get()) + + + def RAWcallback(self, name, index, mode, invert, CCDplot): + config.datainvert = invert.get() + if (config.datainvert == 0): + self.cbalance.config(state=tk.DISABLED) + else: + self.cbalance.config(state=tk.NORMAL) + self.updateplot(CCDplot) + + def BALcallback(self, name, index, mode, balanced, CCDplot): + config.balanced = balanced.get() + self.updateplot(CCDplot) + + def DEVcallback(self, name, index, mode, Device, status, colr): + config.port = Device.get() + try: + ser = serial.Serial(config.port, config.baudrate, timeout=1) + status.set("Device exist") + ser.close() + colr.configure(fg="green") + except serial.SerialException: + status.set("Device doesn't exist") + colr.configure(fg="red") + + def updateplot_old(self, CCDplot): + #This subtracts the ADC-pixel from ADC-dark + if (config.datainvert==1): + config.pltData16 = (config.rxData16[10]+config.rxData16[11])/2 - config.rxData16 + #This subtracts the average difference between even and odd pixels from the even pixels + if (config.balanced==1): + config.offset = (config.pltData16[18]+config.pltData16[20]+config.pltData16[22]+config.pltData16[24]-config.pltData16[19]-config.pltData16[21]-config.pltData16[23]-config.pltData16[24])/4 + for i in range (1847): + config.pltData16[2*i] = config.pltData16[2*i] - config.offset + CCDplot.a.clear() + #plot intensities + if (config.datainvert == 1): + CCDplot.a.plot(config.pltData16) + CCDplot.a.set_ylabel("Intensity") + CCDplot.a.axis([0,3694,-10,2250]) + else: + #plot raw data + CCDplot.a.plot(config.rxData16) + CCDplot.a.set_ylabel("ADCcount") + CCDplot.a.axis([0,3694,-10,4095]) + CCDplot.a.set_xlabel("Pixelnumber") + + CCDplot.canvas.draw() + + def updateplot(self, CCDplot): + #This subtracts the ADC-pixel from ADC-dark + print("update plot "+str(config.datainvert)) + if (config.datainvert==1): + config.pltData16 = (config.rxData16[10]+config.rxData16[11])/2 - config.rxData16 + #This subtracts the average difference between even and odd pixels from the even pixels + if (config.balanced==1): + config.offset = (config.pltData16[18]+config.pltData16[20]+config.pltData16[22]+config.pltData16[24]-config.pltData16[19]-config.pltData16[21]-config.pltData16[23]-config.pltData16[24])/4 + for i in range (1847): + config.pltData16[2*i] = config.pltData16[2*i] - config.offset + CCDplot.a.clear() + #plot intensities + if (config.datainvert == 1): + CCDplot.a.plot(config.pltData16) + CCDplot.a.set_ylabel("Intensity") + CCDplot.a.axis([0,3694,-10,2250]) + else: + #plot raw data + CCDplot.a.plot(config.rxData16) + CCDplot.a.set_ylabel("ADCcount") + CCDplot.a.axis([0,3694,-10,4095]) + CCDplot.a.set_xlabel("Pixelnumber") + + CCDplot.canvas.draw() + + \ No newline at end of file diff --git a/CCDplots.py b/CCDplots.py new file mode 100644 index 0000000..713baf6 --- /dev/null +++ b/CCDplots.py @@ -0,0 +1,62 @@ +# Copyright (c) 2018 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + +#plotting is derived from https://matplotlib.org/examples/user_interfaces/embedding_in_tk.html +import matplotlib +import tkinter as tk +import config +matplotlib.use('TkAgg') + +from numpy import arange, sin, pi +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk +# implement the default mpl key bindings +from matplotlib.backend_bases import key_press_handler + +from matplotlib.figure import Figure + +class buildplot(tk.Frame): + def __init__(self, master): + #create canvas + self.f = Figure(figsize=(10, 5), dpi=100, tight_layout=True) + self.a = self.f.add_subplot(111) + t = arange(0.0, 3.0, 0.01) + s = sin(2*pi*t) + + self.a.plot(t, s, linewidth=0.6) + + # a tk.DrawingArea + self.canvas = FigureCanvasTkAgg(self.f, master=master) + self.canvas.draw() + self.canvas.get_tk_widget().grid(row=0, columnspan=2) + + toolbarFrame = tk.Frame(master=master) + toolbarFrame.grid(row=1,columnspan=2, sticky="w") + toolbar1 = NavigationToolbar2Tk(self.canvas, toolbarFrame) + + def on_key_event(event): + print('you pressed %s' % event.key) + key_press_handler(event, canvas, toolbar) + diff --git a/CCDserial.py b/CCDserial.py new file mode 100644 index 0000000..6f469c4 --- /dev/null +++ b/CCDserial.py @@ -0,0 +1,235 @@ +# Copyright (c) 2019 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + + +#python imports +from tkinter import messagebox +import serial +import numpy as np + +#application imports + +import config +import threading +import tkinter as tk +import time + +# The firmware expects 12 bytes from the computer and will not do anything until 12 bytes have been received. +# The format is: +# byte[1-2]: The characters E and R. Defines where the firmware should start reading in its circular input-buffer. +# byte[3-6]: The 4 bytes constituting the 32-bit int holding the SH-period +# byte[7-10]: The 4 bytes constituting the 32-bit int holding the ICG-period +# byte[11]: Continuous flag: 0 equals one acquisition, 1 equals continuous mode +# byte[12]: The number of integrations to average +def rxtx(panel, SerQueue, progress_var): + if (config.AVGn[0] == 0): + threadser = threading.Thread(target=rxtxoncethread, args=(panel, SerQueue, progress_var), daemon=True) + elif (config.AVGn[0] == 1): + threadser = threading.Thread(target=rxtxcontthread, args=(panel, progress_var), daemon=True) + threadser.start() + + +def rxtxoncethread(panel, SerQueue, progress_var): + #open serial port + try: + ser = serial.Serial(config.port, config.baudrate) + #share the serial handle with the stop-thread so cancel_read may be called + SerQueue.put(ser) + #disable controls + panelsleep(panel) + config.stopsignal = 0 + + #start the progressbar + panel.progress.config(mode="determinate") + threadprogress = threading.Thread(target=progressthread, args=(progress_var,), daemon=True) + threadprogress.start() + + #wait to clear the input and output buffers, if they're not empty data is corrupted + while (ser.in_waiting > 0): + ser.reset_input_buffer() + ser.reset_output_buffer() + time.sleep(0.01) + + + #Transmit key 'ER' + config.txfull[0] = 69 + config.txfull[1] = 82 + #split 32-bit integers to be sent into 8-bit data + config.txfull[2] = (config.SHperiod >> 24) & 0xff + config.txfull[3] = (config.SHperiod >> 16) & 0xff + config.txfull[4] = (config.SHperiod >> 8) & 0xff + config.txfull[5] = config.SHperiod & 0xff + config.txfull[6] = (config.ICGperiod >> 24) & 0xff + config.txfull[7] = (config.ICGperiod >> 16) & 0xff + config.txfull[8] = (config.ICGperiod >> 8) & 0xff + config.txfull[9] = config.ICGperiod & 0xff + #averages to perfom + config.txfull[10] = config.AVGn[0] + config.txfull[11] = config.AVGn[1] + + #transmit everything at once (the USB-firmware does not work if all bytes are not transmitted in one go) + ser.write(config.txfull) + + #wait for the firmware to return data + config.rxData8 = ser.read(7388) + + #close serial port + ser.close() + + #enable all buttons + panelwakeup(panel) + + if (config.stopsignal == 0): + #combine received bytes into 16-bit data + for rxi in range(3694): + config.rxData16[rxi] = (config.rxData8[2*rxi+1] << 8) + config.rxData8[2*rxi] + + #plot the new data + panel.bupdate.invoke() + #hold values for saving data to file as the SHperiod and ICGperiod may be updated after acquisition + config.SHsent = config.SHperiod + config.ICGsent = config.ICGperiod + + SerQueue.queue.clear() + + except serial.SerialException: + messagebox.showerror("By the great otter!","There's a problem with the specified serial connection.") + +def rxtxcontthread(panel, progress_var): + #open serial port + try: + ser = serial.Serial(config.port, config.baudrate) + #disable controls + panelsleep(panel) + config.stopsignal = 0 + + #restart the progressbar for each acquisition + panel.progress.config(mode="indeterminate") + panel.progress.start(100) +# threadprogress = threading.Thread(target=progressthread, args=(progress_var), daemon=True) +# threadprogress.start() + + #wait to clear the input and output buffers, if they're not empty data is corrupted + while (ser.in_waiting > 0): + ser.reset_input_buffer() + ser.reset_output_buffer() + time.sleep(0.1) + + #Transmit key 'ER' + config.txfull[0] = 69 + config.txfull[1] = 82 + #split 32-bit integers to be sent into 8-bit data + config.txfull[2] = (config.SHperiod >> 24) & 0xff + config.txfull[3] = (config.SHperiod >> 16) & 0xff + config.txfull[4] = (config.SHperiod >> 8) & 0xff + config.txfull[5] = config.SHperiod & 0xff + config.txfull[6] = (config.ICGperiod >> 24) & 0xff + config.txfull[7] = (config.ICGperiod >> 16) & 0xff + config.txfull[8] = (config.ICGperiod >> 8) & 0xff + config.txfull[9] = config.ICGperiod & 0xff + #averages to perfom + config.txfull[10] = config.AVGn[0] + config.txfull[11] = config.AVGn[1] + + #transmit everything at once (the USB-firmware does not work if all bytes are not transmittet in one go) + ser.write(config.txfull) + + #loop to acquire and plot data continuously + while (config.stopsignal == 0): + #wait for the firmware to return data + config.rxData8 = ser.read(7388) + + if (config.stopsignal == 0): + #combine received bytes into 16-bit data + for rxi in range(3694): + config.rxData16[rxi] = (config.rxData8[2*rxi+1] << 8) + config.rxData8[2*rxi] + + #plot the new data + panel.bupdate.invoke() + #hold values for saving data to file + config.SHsent = config.SHperiod + config.ICGsent = config.ICGperiod + + #resend settings with continuous transmission disabled to avoid flooding of the serial port + config.txfull[10] = 0 + ser.write(config.txfull) + + #wait until data is received to close the serial port + while (ser.out_waiting > 0): + time.sleep(0.1) + + #close serial port + ser.close() + panelwakeup(panel) + panel.progress.stop() + + except serial.SerialException: + messagebox.showerror("By the great otter!","There's a problem with the specified serial connection.") + +def progressthread(progress_var): + progress_var.set(0) + for i in range (1,11): + progress_var.set(i) + #wait 1/10th of the time the acquisition requires before adding to progress bar + time.sleep(config.ICGperiod*config.AVGn[1]/config.MCLK/10) + +def rxtxcancel(SerQueue): + config.stopsignal = 1 + #Are we stopping one very long measurement, or the continuous real-time view? + if (config.AVGn[0]==0): + ser = SerQueue.get() + ser.cancel_read() + + +def panelsleep(panel): + panel.bstop.config(state=tk.NORMAL) + panel.bopen.config(state=tk.DISABLED) + panel.bsave.config(state=tk.DISABLED) + panel.bcollect.config(state=tk.DISABLED) + panel.AVGscale.config(state=tk.DISABLED) + panel.rcontinuous.config(state=tk.DISABLED) + panel.roneshot.config(state=tk.DISABLED) + panel.eICG.config(state=tk.DISABLED) + panel.eSH.config(state=tk.DISABLED) + panel.edevice.config(state=tk.DISABLED) + panel.cinvert.config(state=tk.DISABLED) + panel.cbalance.config(state=tk.DISABLED) + +def panelwakeup(panel): + panel.bstop.config(state=tk.DISABLED) + panel.bopen.config(state=tk.NORMAL) + panel.bsave.config(state=tk.NORMAL) + panel.bcollect.config(state=tk.NORMAL) + panel.AVGscale.config(state=tk.NORMAL) + panel.rcontinuous.config(state=tk.NORMAL) + panel.roneshot.config(state=tk.NORMAL) + panel.eICG.config(state=tk.NORMAL) + panel.eSH.config(state=tk.NORMAL) + panel.edevice.config(state=tk.NORMAL) + panel.cinvert.config(state=tk.NORMAL) + if (config.datainvert == 1): + panel.cbalance.config(state=tk.NORMAL) + diff --git a/config.py b/config.py new file mode 100644 index 0000000..bff3369 --- /dev/null +++ b/config.py @@ -0,0 +1,30 @@ +import numpy as np + + +#serial definitions +port = 'COM3' #'/dev/ttyACM0' +baudrate = 115200 + +#Data as the program handles +SHperiod = np.uint32(200) +ICGperiod = np.uint32(100000) +AVGn = np.uint8([0,1]) +MCLK = 2000000 +SHsent = np.uint32(200) +ICGsent = np.uint32(100000) +stopsignal = 0 + +#Data arrays for received bytes +rxData8 = np.zeros(7388, np.uint8) +rxData16 = np.zeros(3694, np.uint16) +pltData16 = np.zeros(3694, np.uint16) + +#Arrays for data to transmit +txsh = np.uint8([0,0,0,0]) +txicg = np.uint8([0,0,0,0]) +txfull = np.uint8([0,0,0,0,0,0,0,0,0,0,0,0]) + +#Invert data +datainvert = 1 +offset = 0 +balanced = 0 diff --git a/latest.dat b/latest.dat new file mode 100644 index 0000000..b68b7ac --- /dev/null +++ b/latest.dat @@ -0,0 +1,3698 @@ +#Data from the TCD1304 linear CCD +#column 1 = pixelnumber , column 2 = pixelvalue +#Pixel 1-32 and 3679-3694 and are dummy pixels +#SH-period: 100 ICG-period: 100000 Integration time: 50.0 µs +1 1776 +2 3658 +3 3661 +4 3662 +5 3664 +6 3661 +7 3663 +8 3661 +9 3663 +10 3661 +11 3663 +12 3660 +13 3664 +14 3661 +15 3664 +16 3661 +17 3664 +18 3660 +19 3663 +20 3661 +21 3663 +22 3660 +23 3663 +24 3660 +25 3664 +26 3662 +27 3662 +28 3661 +29 3664 +30 3660 +31 3662 +32 3316 +33 2472 +34 2506 +35 2519 +36 2513 +37 2517 +38 2512 +39 2519 +40 2509 +41 2514 +42 2508 +43 2512 +44 2504 +45 2506 +46 2501 +47 2507 +48 2498 +49 2501 +50 2492 +51 2503 +52 2489 +53 2493 +54 2489 +55 2488 +56 2484 +57 2488 +58 2479 +59 2487 +60 2477 +61 2481 +62 2472 +63 2478 +64 2470 +65 2475 +66 2471 +67 2475 +68 2462 +69 2470 +70 2461 +71 2468 +72 2457 +73 2464 +74 2456 +75 2463 +76 2460 +77 2456 +78 2454 +79 2464 +80 2450 +81 2460 +82 2455 +83 2459 +84 2451 +85 2458 +86 2455 +87 2463 +88 2453 +89 2458 +90 2460 +91 2459 +92 2454 +93 2459 +94 2454 +95 2458 +96 2451 +97 2457 +98 2455 +99 2459 +100 2453 +101 2461 +102 2449 +103 2459 +104 2455 +105 2464 +106 2453 +107 2462 +108 2455 +109 2462 +110 2452 +111 2464 +112 2452 +113 2458 +114 2451 +115 2459 +116 2452 +117 2458 +118 2451 +119 2457 +120 2448 +121 2452 +122 2443 +123 2453 +124 2444 +125 2450 +126 2443 +127 2450 +128 2444 +129 2451 +130 2445 +131 2453 +132 2445 +133 2450 +134 2444 +135 2452 +136 2444 +137 2446 +138 2445 +139 2448 +140 2441 +141 2451 +142 2438 +143 2449 +144 2439 +145 2447 +146 2436 +147 2445 +148 2437 +149 2440 +150 2434 +151 2441 +152 2432 +153 2441 +154 2430 +155 2441 +156 2431 +157 2439 +158 2434 +159 2441 +160 2434 +161 2441 +162 2434 +163 2438 +164 2433 +165 2437 +166 2430 +167 2438 +168 2431 +169 2433 +170 2429 +171 2436 +172 2426 +173 2431 +174 2427 +175 2434 +176 2423 +177 2432 +178 2426 +179 2430 +180 2427 +181 2433 +182 2429 +183 2432 +184 2428 +185 2435 +186 2426 +187 2435 +188 2426 +189 2429 +190 2423 +191 2432 +192 2424 +193 2431 +194 2424 +195 2434 +196 2425 +197 2431 +198 2426 +199 2433 +200 2423 +201 2435 +202 2422 +203 2436 +204 2426 +205 2430 +206 2431 +207 2436 +208 2429 +209 2434 +210 2431 +211 2436 +212 2432 +213 2439 +214 2432 +215 2446 +216 2435 +217 2444 +218 2440 +219 2445 +220 2439 +221 2445 +222 2442 +223 2446 +224 2439 +225 2451 +226 2443 +227 2449 +228 2447 +229 2452 +230 2444 +231 2452 +232 2447 +233 2451 +234 2447 +235 2457 +236 2446 +237 2452 +238 2446 +239 2455 +240 2449 +241 2453 +242 2447 +243 2451 +244 2445 +245 2448 +246 2440 +247 2452 +248 2440 +249 2447 +250 2444 +251 2449 +252 2436 +253 2443 +254 2439 +255 2443 +256 2436 +257 2443 +258 2435 +259 2445 +260 2432 +261 2441 +262 2430 +263 2440 +264 2432 +265 2433 +266 2428 +267 2437 +268 2428 +269 2435 +270 2425 +271 2434 +272 2420 +273 2430 +274 2421 +275 2429 +276 2426 +277 2424 +278 2421 +279 2425 +280 2420 +281 2424 +282 2419 +283 2427 +284 2419 +285 2426 +286 2417 +287 2431 +288 2422 +289 2430 +290 2428 +291 2432 +292 2425 +293 2431 +294 2425 +295 2435 +296 2424 +297 2430 +298 2425 +299 2436 +300 2425 +301 2434 +302 2427 +303 2430 +304 2426 +305 2431 +306 2425 +307 2431 +308 2426 +309 2432 +310 2427 +311 2438 +312 2432 +313 2437 +314 2432 +315 2438 +316 2433 +317 2440 +318 2430 +319 2438 +320 2430 +321 2437 +322 2430 +323 2439 +324 2432 +325 2441 +326 2432 +327 2437 +328 2429 +329 2435 +330 2428 +331 2432 +332 2424 +333 2430 +334 2423 +335 2430 +336 2423 +337 2428 +338 2418 +339 2424 +340 2413 +341 2420 +342 2411 +343 2418 +344 2407 +345 2413 +346 2409 +347 2414 +348 2410 +349 2415 +350 2408 +351 2416 +352 2407 +353 2414 +354 2408 +355 2413 +356 2405 +357 2413 +358 2410 +359 2416 +360 2410 +361 2412 +362 2405 +363 2412 +364 2404 +365 2412 +366 2402 +367 2409 +368 2396 +369 2407 +370 2400 +371 2405 +372 2399 +373 2406 +374 2398 +375 2407 +376 2400 +377 2402 +378 2401 +379 2406 +380 2397 +381 2405 +382 2397 +383 2403 +384 2398 +385 2403 +386 2395 +387 2405 +388 2395 +389 2401 +390 2398 +391 2397 +392 2396 +393 2399 +394 2391 +395 2399 +396 2391 +397 2399 +398 2394 +399 2404 +400 2394 +401 2398 +402 2392 +403 2394 +404 2387 +405 2396 +406 2385 +407 2391 +408 2383 +409 2389 +410 2382 +411 2393 +412 2381 +413 2383 +414 2379 +415 2385 +416 2377 +417 2381 +418 2376 +419 2384 +420 2376 +421 2386 +422 2379 +423 2389 +424 2380 +425 2387 +426 2382 +427 2385 +428 2379 +429 2382 +430 2373 +431 2380 +432 2371 +433 2376 +434 2367 +435 2374 +436 2364 +437 2374 +438 2366 +439 2373 +440 2366 +441 2372 +442 2365 +443 2373 +444 2366 +445 2367 +446 2363 +447 2369 +448 2358 +449 2369 +450 2359 +451 2366 +452 2355 +453 2364 +454 2357 +455 2361 +456 2352 +457 2357 +458 2349 +459 2357 +460 2347 +461 2349 +462 2341 +463 2351 +464 2338 +465 2347 +466 2341 +467 2350 +468 2341 +469 2349 +470 2345 +471 2354 +472 2343 +473 2349 +474 2350 +475 2357 +476 2347 +477 2357 +478 2352 +479 2356 +480 2344 +481 2355 +482 2348 +483 2354 +484 2348 +485 2353 +486 2344 +487 2350 +488 2341 +489 2344 +490 2336 +491 2344 +492 2330 +493 2339 +494 2331 +495 2335 +496 2325 +497 2334 +498 2325 +499 2334 +500 2327 +501 2333 +502 2325 +503 2334 +504 2323 +505 2332 +506 2329 +507 2339 +508 2327 +509 2336 +510 2327 +511 2334 +512 2327 +513 2332 +514 2331 +515 2336 +516 2326 +517 2330 +518 2329 +519 2333 +520 2327 +521 2328 +522 2322 +523 2326 +524 2321 +525 2330 +526 2322 +527 2327 +528 2321 +529 2326 +530 2316 +531 2325 +532 2314 +533 2325 +534 2316 +535 2325 +536 2316 +537 2325 +538 2322 +539 2324 +540 2319 +541 2327 +542 2320 +543 2330 +544 2321 +545 2327 +546 2322 +547 2327 +548 2322 +549 2324 +550 2324 +551 2328 +552 2317 +553 2324 +554 2320 +555 2324 +556 2312 +557 2321 +558 2314 +559 2323 +560 2310 +561 2314 +562 2306 +563 2317 +564 2309 +565 2311 +566 2305 +567 2312 +568 2304 +569 2308 +570 2300 +571 2310 +572 2300 +573 2306 +574 2299 +575 2306 +576 2301 +577 2304 +578 2301 +579 2308 +580 2301 +581 2304 +582 2295 +583 2305 +584 2301 +585 2312 +586 2301 +587 2307 +588 2304 +589 2309 +590 2305 +591 2311 +592 2303 +593 2309 +594 2301 +595 2310 +596 2304 +597 2308 +598 2300 +599 2310 +600 2300 +601 2306 +602 2299 +603 2302 +604 2294 +605 2304 +606 2293 +607 2303 +608 2295 +609 2304 +610 2291 +611 2300 +612 2293 +613 2299 +614 2295 +615 2303 +616 2293 +617 2300 +618 2295 +619 2305 +620 2296 +621 2306 +622 2294 +623 2305 +624 2297 +625 2303 +626 2301 +627 2304 +628 2300 +629 2304 +630 2299 +631 2305 +632 2298 +633 2305 +634 2298 +635 2307 +636 2296 +637 2300 +638 2300 +639 2300 +640 2290 +641 2296 +642 2290 +643 2299 +644 2288 +645 2296 +646 2281 +647 2290 +648 2282 +649 2290 +650 2286 +651 2291 +652 2284 +653 2291 +654 2288 +655 2290 +656 2282 +657 2294 +658 2284 +659 2296 +660 2288 +661 2294 +662 2290 +663 2296 +664 2290 +665 2296 +666 2288 +667 2300 +668 2290 +669 2298 +670 2289 +671 2301 +672 2290 +673 2295 +674 2290 +675 2300 +676 2291 +677 2296 +678 2294 +679 2299 +680 2292 +681 2297 +682 2288 +683 2295 +684 2285 +685 2294 +686 2287 +687 2291 +688 2282 +689 2292 +690 2284 +691 2291 +692 2285 +693 2293 +694 2284 +695 2294 +696 2287 +697 2292 +698 2285 +699 2289 +700 2284 +701 2296 +702 2284 +703 2291 +704 2278 +705 2290 +706 2283 +707 2291 +708 2283 +709 2286 +710 2283 +711 2289 +712 2281 +713 2289 +714 2282 +715 2289 +716 2282 +717 2290 +718 2283 +719 2288 +720 2283 +721 2287 +722 2279 +723 2288 +724 2279 +725 2282 +726 2277 +727 2282 +728 2278 +729 2282 +730 2277 +731 2284 +732 2275 +733 2286 +734 2276 +735 2285 +736 2278 +737 2287 +738 2276 +739 2286 +740 2275 +741 2284 +742 2280 +743 2285 +744 2275 +745 2284 +746 2278 +747 2284 +748 2273 +749 2280 +750 2278 +751 2287 +752 2279 +753 2289 +754 2279 +755 2289 +756 2281 +757 2289 +758 2281 +759 2292 +760 2285 +761 2287 +762 2281 +763 2289 +764 2282 +765 2292 +766 2285 +767 2292 +768 2286 +769 2295 +770 2289 +771 2299 +772 2293 +773 2302 +774 2296 +775 2306 +776 2305 +777 2307 +778 2303 +779 2307 +780 2301 +781 2309 +782 2303 +783 2308 +784 2304 +785 2314 +786 2307 +787 2312 +788 2308 +789 2315 +790 2309 +791 2319 +792 2305 +793 2321 +794 2308 +795 2313 +796 2309 +797 2311 +798 2309 +799 2310 +800 2298 +801 2306 +802 2298 +803 2302 +804 2293 +805 2295 +806 2287 +807 2295 +808 2285 +809 2289 +810 2284 +811 2292 +812 2282 +813 2289 +814 2279 +815 2287 +816 2277 +817 2288 +818 2279 +819 2287 +820 2282 +821 2286 +822 2278 +823 2285 +824 2280 +825 2286 +826 2281 +827 2289 +828 2282 +829 2287 +830 2284 +831 2288 +832 2282 +833 2288 +834 2284 +835 2293 +836 2282 +837 2288 +838 2285 +839 2290 +840 2279 +841 2287 +842 2283 +843 2288 +844 2278 +845 2282 +846 2276 +847 2281 +848 2272 +849 2276 +850 2271 +851 2285 +852 2268 +853 2281 +854 2270 +855 2279 +856 2271 +857 2274 +858 2273 +859 2278 +860 2273 +861 2279 +862 2271 +863 2275 +864 2265 +865 2273 +866 2266 +867 2272 +868 2264 +869 2267 +870 2254 +871 2268 +872 2256 +873 2260 +874 2257 +875 2262 +876 2258 +877 2261 +878 2259 +879 2263 +880 2260 +881 2271 +882 2262 +883 2272 +884 2266 +885 2274 +886 2265 +887 2277 +888 2269 +889 2275 +890 2270 +891 2280 +892 2267 +893 2277 +894 2271 +895 2276 +896 2268 +897 2270 +898 2264 +899 2272 +900 2266 +901 2270 +902 2259 +903 2271 +904 2256 +905 2265 +906 2257 +907 2261 +908 2254 +909 2259 +910 2250 +911 2260 +912 2253 +913 2257 +914 2250 +915 2261 +916 2255 +917 2259 +918 2255 +919 2260 +920 2251 +921 2259 +922 2256 +923 2259 +924 2254 +925 2258 +926 2252 +927 2257 +928 2246 +929 2253 +930 2245 +931 2254 +932 2244 +933 2248 +934 2237 +935 2249 +936 2237 +937 2244 +938 2238 +939 2250 +940 2243 +941 2248 +942 2247 +943 2253 +944 2245 +945 2256 +946 2249 +947 2260 +948 2251 +949 2255 +950 2252 +951 2258 +952 2252 +953 2257 +954 2254 +955 2260 +956 2251 +957 2257 +958 2250 +959 2258 +960 2246 +961 2252 +962 2246 +963 2250 +964 2242 +965 2250 +966 2243 +967 2249 +968 2244 +969 2246 +970 2244 +971 2247 +972 2237 +973 2240 +974 2235 +975 2239 +976 2231 +977 2236 +978 2230 +979 2239 +980 2230 +981 2236 +982 2227 +983 2237 +984 2227 +985 2234 +986 2229 +987 2231 +988 2225 +989 2230 +990 2226 +991 2229 +992 2222 +993 2227 +994 2222 +995 2231 +996 2220 +997 2229 +998 2219 +999 2228 +1000 2219 +1001 2230 +1002 2222 +1003 2232 +1004 2222 +1005 2230 +1006 2225 +1007 2230 +1008 2225 +1009 2227 +1010 2226 +1011 2230 +1012 2225 +1013 2227 +1014 2221 +1015 2231 +1016 2219 +1017 2231 +1018 2216 +1019 2228 +1020 2217 +1021 2227 +1022 2220 +1023 2228 +1024 2220 +1025 2227 +1026 2220 +1027 2229 +1028 2221 +1029 2226 +1030 2219 +1031 2229 +1032 2221 +1033 2227 +1034 2223 +1035 2232 +1036 2221 +1037 2229 +1038 2223 +1039 2232 +1040 2222 +1041 2231 +1042 2223 +1043 2229 +1044 2221 +1045 2231 +1046 2227 +1047 2228 +1048 2222 +1049 2232 +1050 2220 +1051 2233 +1052 2222 +1053 2226 +1054 2226 +1055 2229 +1056 2221 +1057 2230 +1058 2220 +1059 2228 +1060 2223 +1061 2226 +1062 2220 +1063 2226 +1064 2214 +1065 2222 +1066 2215 +1067 2220 +1068 2213 +1069 2216 +1070 2212 +1071 2222 +1072 2207 +1073 2220 +1074 2209 +1075 2218 +1076 2210 +1077 2214 +1078 2209 +1079 2218 +1080 2211 +1081 2218 +1082 2211 +1083 2221 +1084 2212 +1085 2221 +1086 2215 +1087 2220 +1088 2216 +1089 2223 +1090 2215 +1091 2223 +1092 2214 +1093 2220 +1094 2208 +1095 2222 +1096 2213 +1097 2217 +1098 2213 +1099 2218 +1100 2211 +1101 2220 +1102 2209 +1103 2221 +1104 2212 +1105 2220 +1106 2214 +1107 2224 +1108 2216 +1109 2223 +1110 2218 +1111 2226 +1112 2216 +1113 2224 +1114 2217 +1115 2227 +1116 2220 +1117 2225 +1118 2220 +1119 2228 +1120 2216 +1121 2223 +1122 2217 +1123 2228 +1124 2216 +1125 2220 +1126 2212 +1127 2222 +1128 2209 +1129 2215 +1130 2210 +1131 2220 +1132 2208 +1133 2214 +1134 2207 +1135 2210 +1136 2205 +1137 2214 +1138 2207 +1139 2214 +1140 2206 +1141 2212 +1142 2209 +1143 2216 +1144 2211 +1145 2212 +1146 2213 +1147 2219 +1148 2212 +1149 2220 +1150 2213 +1151 2220 +1152 2209 +1153 2214 +1154 2205 +1155 2210 +1156 2205 +1157 2208 +1158 2201 +1159 2206 +1160 2203 +1161 2206 +1162 2205 +1163 2209 +1164 2200 +1165 2206 +1166 2205 +1167 2211 +1168 2201 +1169 2212 +1170 2201 +1171 2213 +1172 2210 +1173 2214 +1174 2210 +1175 2218 +1176 2211 +1177 2211 +1178 2210 +1179 2213 +1180 2204 +1181 2210 +1182 2201 +1183 2210 +1184 2201 +1185 2208 +1186 2196 +1187 2206 +1188 2197 +1189 2200 +1190 2194 +1191 2202 +1192 2193 +1193 2200 +1194 2193 +1195 2203 +1196 2192 +1197 2198 +1198 2192 +1199 2193 +1200 2192 +1201 2200 +1202 2187 +1203 2199 +1204 2188 +1205 2194 +1206 2189 +1207 2197 +1208 2187 +1209 2199 +1210 2194 +1211 2196 +1212 2191 +1213 2202 +1214 2194 +1215 2205 +1216 2194 +1217 2204 +1218 2200 +1219 2209 +1220 2196 +1221 2208 +1222 2200 +1223 2205 +1224 2198 +1225 2205 +1226 2198 +1227 2202 +1228 2195 +1229 2204 +1230 2194 +1231 2201 +1232 2192 +1233 2195 +1234 2194 +1235 2203 +1236 2187 +1237 2197 +1238 2187 +1239 2191 +1240 2182 +1241 2192 +1242 2181 +1243 2187 +1244 2182 +1245 2187 +1246 2179 +1247 2188 +1248 2176 +1249 2185 +1250 2180 +1251 2191 +1252 2178 +1253 2184 +1254 2180 +1255 2183 +1256 2179 +1257 2182 +1258 2176 +1259 2188 +1260 2182 +1261 2187 +1262 2176 +1263 2185 +1264 2177 +1265 2185 +1266 2176 +1267 2177 +1268 2174 +1269 2177 +1270 2173 +1271 2177 +1272 2168 +1273 2174 +1274 2166 +1275 2178 +1276 2170 +1277 2177 +1278 2172 +1279 2179 +1280 2173 +1281 2180 +1282 2173 +1283 2182 +1284 2173 +1285 2180 +1286 2167 +1287 2181 +1288 2171 +1289 2177 +1290 2170 +1291 2177 +1292 2164 +1293 2172 +1294 2166 +1295 2175 +1296 2167 +1297 2175 +1298 2166 +1299 2171 +1300 2167 +1301 2175 +1302 2164 +1303 2175 +1304 2163 +1305 2172 +1306 2166 +1307 2174 +1308 2168 +1309 2176 +1310 2172 +1311 2179 +1312 2166 +1313 2179 +1314 2168 +1315 2175 +1316 2168 +1317 2170 +1318 2164 +1319 2169 +1320 2164 +1321 2165 +1322 2154 +1323 2160 +1324 2150 +1325 2158 +1326 2152 +1327 2154 +1328 2147 +1329 2155 +1330 2147 +1331 2156 +1332 2150 +1333 2153 +1334 2147 +1335 2154 +1336 2148 +1337 2153 +1338 2146 +1339 2154 +1340 2146 +1341 2154 +1342 2145 +1343 2159 +1344 2144 +1345 2155 +1346 2150 +1347 2157 +1348 2146 +1349 2154 +1350 2145 +1351 2154 +1352 2146 +1353 2150 +1354 2140 +1355 2151 +1356 2142 +1357 2149 +1358 2144 +1359 2145 +1360 2139 +1361 2144 +1362 2138 +1363 2144 +1364 2132 +1365 2139 +1366 2129 +1367 2136 +1368 2124 +1369 2133 +1370 2125 +1371 2135 +1372 2125 +1373 2128 +1374 2124 +1375 2128 +1376 2120 +1377 2123 +1378 2121 +1379 2131 +1380 2120 +1381 2128 +1382 2121 +1383 2120 +1384 2119 +1385 2126 +1386 2119 +1387 2122 +1388 2117 +1389 2123 +1390 2116 +1391 2126 +1392 2111 +1393 2120 +1394 2117 +1395 2121 +1396 2117 +1397 2122 +1398 2112 +1399 2121 +1400 2113 +1401 2118 +1402 2108 +1403 2117 +1404 2112 +1405 2117 +1406 2109 +1407 2116 +1408 2107 +1409 2114 +1410 2107 +1411 2114 +1412 2106 +1413 2111 +1414 2104 +1415 2114 +1416 2107 +1417 2106 +1418 2102 +1419 2108 +1420 2104 +1421 2110 +1422 2105 +1423 2107 +1424 2103 +1425 2112 +1426 2104 +1427 2110 +1428 2106 +1429 2110 +1430 2104 +1431 2117 +1432 2100 +1433 2113 +1434 2104 +1435 2108 +1436 2106 +1437 2109 +1438 2105 +1439 2107 +1440 2101 +1441 2109 +1442 2100 +1443 2108 +1444 2097 +1445 2107 +1446 2099 +1447 2105 +1448 2097 +1449 2103 +1450 2097 +1451 2101 +1452 2092 +1453 2102 +1454 2093 +1455 2095 +1456 2091 +1457 2102 +1458 2089 +1459 2093 +1460 2087 +1461 2088 +1462 2084 +1463 2086 +1464 2079 +1465 2092 +1466 2082 +1467 2087 +1468 2080 +1469 2083 +1470 2081 +1471 2083 +1472 2079 +1473 2083 +1474 2076 +1475 2081 +1476 2077 +1477 2083 +1478 2076 +1479 2082 +1480 2072 +1481 2085 +1482 2077 +1483 2081 +1484 2074 +1485 2084 +1486 2077 +1487 2081 +1488 2073 +1489 2083 +1490 2075 +1491 2084 +1492 2076 +1493 2082 +1494 2074 +1495 2077 +1496 2074 +1497 2079 +1498 2073 +1499 2078 +1500 2075 +1501 2079 +1502 2068 +1503 2083 +1504 2067 +1505 2079 +1506 2069 +1507 2074 +1508 2070 +1509 2073 +1510 2069 +1511 2071 +1512 2066 +1513 2070 +1514 2063 +1515 2069 +1516 2057 +1517 2061 +1518 2057 +1519 2063 +1520 2057 +1521 2063 +1522 2057 +1523 2061 +1524 2052 +1525 2060 +1526 2051 +1527 2058 +1528 2051 +1529 2056 +1530 2054 +1531 2060 +1532 2051 +1533 2062 +1534 2058 +1535 2067 +1536 2053 +1537 2063 +1538 2055 +1539 2068 +1540 2062 +1541 2065 +1542 2061 +1543 2069 +1544 2060 +1545 2069 +1546 2060 +1547 2071 +1548 2057 +1549 2067 +1550 2058 +1551 2065 +1552 2050 +1553 2060 +1554 2051 +1555 2057 +1556 2052 +1557 2055 +1558 2045 +1559 2054 +1560 2045 +1561 2045 +1562 2043 +1563 2051 +1564 2043 +1565 2042 +1566 2040 +1567 2046 +1568 2039 +1569 2043 +1570 2034 +1571 2039 +1572 2033 +1573 2039 +1574 2036 +1575 2041 +1576 2034 +1577 2035 +1578 2029 +1579 2038 +1580 2025 +1581 2035 +1582 2026 +1583 2033 +1584 2023 +1585 2030 +1586 2028 +1587 2033 +1588 2029 +1589 2034 +1590 2028 +1591 2039 +1592 2029 +1593 2040 +1594 2033 +1595 2041 +1596 2038 +1597 2044 +1598 2041 +1599 2041 +1600 2038 +1601 2043 +1602 2039 +1603 2050 +1604 2040 +1605 2051 +1606 2043 +1607 2050 +1608 2045 +1609 2042 +1610 2042 +1611 2047 +1612 2038 +1613 2046 +1614 2042 +1615 2050 +1616 2032 +1617 2047 +1618 2040 +1619 2046 +1620 2044 +1621 2049 +1622 2045 +1623 2050 +1624 2050 +1625 2055 +1626 2050 +1627 2060 +1628 2054 +1629 2061 +1630 2055 +1631 2062 +1632 2058 +1633 2063 +1634 2057 +1635 2067 +1636 2059 +1637 2067 +1638 2060 +1639 2067 +1640 2061 +1641 2067 +1642 2060 +1643 2066 +1644 2059 +1645 2064 +1646 2057 +1647 2065 +1648 2055 +1649 2063 +1650 2054 +1651 2061 +1652 2051 +1653 2060 +1654 2052 +1655 2061 +1656 2052 +1657 2061 +1658 2054 +1659 2059 +1660 2054 +1661 2056 +1662 2053 +1663 2056 +1664 2050 +1665 2057 +1666 2047 +1667 2055 +1668 2047 +1669 2052 +1670 2040 +1671 2052 +1672 2039 +1673 2044 +1674 2038 +1675 2044 +1676 2038 +1677 2040 +1678 2036 +1679 2041 +1680 2029 +1681 2037 +1682 2025 +1683 2036 +1684 2027 +1685 2032 +1686 2024 +1687 2030 +1688 2023 +1689 2032 +1690 2024 +1691 2032 +1692 2027 +1693 2034 +1694 2024 +1695 2034 +1696 2026 +1697 2035 +1698 2030 +1699 2037 +1700 2030 +1701 2037 +1702 2033 +1703 2039 +1704 2034 +1705 2043 +1706 2037 +1707 2046 +1708 2038 +1709 2046 +1710 2039 +1711 2046 +1712 2039 +1713 2046 +1714 2043 +1715 2054 +1716 2044 +1717 2053 +1718 2047 +1719 2054 +1720 2047 +1721 2056 +1722 2051 +1723 2065 +1724 2058 +1725 2067 +1726 2058 +1727 2068 +1728 2056 +1729 2066 +1730 2062 +1731 2069 +1732 2062 +1733 2070 +1734 2064 +1735 2070 +1736 2061 +1737 2068 +1738 2060 +1739 2071 +1740 2060 +1741 2065 +1742 2059 +1743 2066 +1744 2055 +1745 2062 +1746 2051 +1747 2059 +1748 2050 +1749 2056 +1750 2046 +1751 2047 +1752 2038 +1753 2045 +1754 2040 +1755 2041 +1756 2035 +1757 2037 +1758 2031 +1759 2040 +1760 2029 +1761 2034 +1762 2029 +1763 2037 +1764 2031 +1765 2034 +1766 2027 +1767 2036 +1768 2032 +1769 2036 +1770 2029 +1771 2038 +1772 2032 +1773 2037 +1774 2027 +1775 2035 +1776 2031 +1777 2036 +1778 2029 +1779 2036 +1780 2027 +1781 2032 +1782 2022 +1783 2031 +1784 2021 +1785 2025 +1786 2019 +1787 2026 +1788 2015 +1789 2025 +1790 2018 +1791 2019 +1792 2012 +1793 2017 +1794 2010 +1795 2018 +1796 2011 +1797 2016 +1798 2010 +1799 2013 +1800 2009 +1801 2012 +1802 2001 +1803 2014 +1804 1999 +1805 2003 +1806 1998 +1807 2004 +1808 1995 +1809 2003 +1810 1993 +1811 1999 +1812 1990 +1813 1992 +1814 1987 +1815 1994 +1816 1979 +1817 1988 +1818 1981 +1819 1990 +1820 1979 +1821 1985 +1822 1980 +1823 1984 +1824 1977 +1825 1986 +1826 1982 +1827 1988 +1828 1978 +1829 1991 +1830 1979 +1831 1989 +1832 1980 +1833 1986 +1834 1982 +1835 1987 +1836 1981 +1837 1986 +1838 1983 +1839 1986 +1840 1976 +1841 1983 +1842 1976 +1843 1979 +1844 1975 +1845 1979 +1846 1970 +1847 1978 +1848 1973 +1849 1973 +1850 1971 +1851 1980 +1852 1964 +1853 1978 +1854 1970 +1855 1975 +1856 1966 +1857 1974 +1858 1971 +1859 1973 +1860 1968 +1861 1973 +1862 1966 +1863 1973 +1864 1965 +1865 1971 +1866 1961 +1867 1968 +1868 1957 +1869 1965 +1870 1960 +1871 1966 +1872 1958 +1873 1969 +1874 1960 +1875 1966 +1876 1958 +1877 1968 +1878 1960 +1879 1965 +1880 1955 +1881 1965 +1882 1956 +1883 1964 +1884 1955 +1885 1961 +1886 1954 +1887 1959 +1888 1954 +1889 1961 +1890 1953 +1891 1958 +1892 1952 +1893 1957 +1894 1946 +1895 1956 +1896 1945 +1897 1954 +1898 1946 +1899 1953 +1900 1950 +1901 1953 +1902 1947 +1903 1954 +1904 1945 +1905 1955 +1906 1946 +1907 1954 +1908 1946 +1909 1951 +1910 1948 +1911 1952 +1912 1940 +1913 1949 +1914 1943 +1915 1948 +1916 1940 +1917 1946 +1918 1936 +1919 1942 +1920 1934 +1921 1935 +1922 1929 +1923 1934 +1924 1925 +1925 1932 +1926 1924 +1927 1927 +1928 1922 +1929 1925 +1930 1919 +1931 1926 +1932 1916 +1933 1922 +1934 1913 +1935 1919 +1936 1908 +1937 1916 +1938 1909 +1939 1915 +1940 1910 +1941 1913 +1942 1907 +1943 1912 +1944 1904 +1945 1910 +1946 1901 +1947 1907 +1948 1903 +1949 1907 +1950 1902 +1951 1907 +1952 1896 +1953 1907 +1954 1898 +1955 1906 +1956 1897 +1957 1906 +1958 1897 +1959 1904 +1960 1895 +1961 1902 +1962 1899 +1963 1902 +1964 1894 +1965 1896 +1966 1895 +1967 1899 +1968 1892 +1969 1900 +1970 1889 +1971 1900 +1972 1894 +1973 1899 +1974 1894 +1975 1900 +1976 1897 +1977 1901 +1978 1899 +1979 1903 +1980 1899 +1981 1905 +1982 1901 +1983 1907 +1984 1897 +1985 1910 +1986 1900 +1987 1907 +1988 1899 +1989 1908 +1990 1901 +1991 1904 +1992 1900 +1993 1903 +1994 1899 +1995 1900 +1996 1895 +1997 1898 +1998 1892 +1999 1900 +2000 1889 +2001 1898 +2002 1887 +2003 1900 +2004 1890 +2005 1899 +2006 1895 +2007 1895 +2008 1891 +2009 1896 +2010 1890 +2011 1896 +2012 1886 +2013 1894 +2014 1885 +2015 1893 +2016 1881 +2017 1891 +2018 1880 +2019 1886 +2020 1880 +2021 1884 +2022 1878 +2023 1884 +2024 1876 +2025 1881 +2026 1874 +2027 1880 +2028 1872 +2029 1878 +2030 1871 +2031 1878 +2032 1869 +2033 1874 +2034 1866 +2035 1874 +2036 1870 +2037 1873 +2038 1866 +2039 1873 +2040 1864 +2041 1873 +2042 1867 +2043 1875 +2044 1866 +2045 1874 +2046 1868 +2047 1872 +2048 1865 +2049 1876 +2050 1868 +2051 1876 +2052 1869 +2053 1877 +2054 1870 +2055 1877 +2056 1869 +2057 1875 +2058 1869 +2059 1873 +2060 1869 +2061 1872 +2062 1865 +2063 1874 +2064 1868 +2065 1877 +2066 1869 +2067 1876 +2068 1871 +2069 1874 +2070 1871 +2071 1880 +2072 1868 +2073 1875 +2074 1874 +2075 1881 +2076 1874 +2077 1883 +2078 1875 +2079 1881 +2080 1874 +2081 1883 +2082 1875 +2083 1884 +2084 1875 +2085 1884 +2086 1874 +2087 1880 +2088 1875 +2089 1883 +2090 1879 +2091 1879 +2092 1875 +2093 1879 +2094 1871 +2095 1876 +2096 1869 +2097 1878 +2098 1864 +2099 1877 +2100 1869 +2101 1869 +2102 1864 +2103 1867 +2104 1860 +2105 1867 +2106 1861 +2107 1866 +2108 1860 +2109 1868 +2110 1860 +2111 1864 +2112 1857 +2113 1865 +2114 1856 +2115 1864 +2116 1854 +2117 1859 +2118 1850 +2119 1860 +2120 1851 +2121 1859 +2122 1849 +2123 1855 +2124 1850 +2125 1854 +2126 1850 +2127 1854 +2128 1845 +2129 1853 +2130 1847 +2131 1852 +2132 1846 +2133 1848 +2134 1843 +2135 1850 +2136 1838 +2137 1847 +2138 1837 +2139 1847 +2140 1837 +2141 1844 +2142 1837 +2143 1843 +2144 1836 +2145 1842 +2146 1837 +2147 1841 +2148 1835 +2149 1842 +2150 1834 +2151 1843 +2152 1835 +2153 1843 +2154 1837 +2155 1841 +2156 1834 +2157 1842 +2158 1831 +2159 1842 +2160 1832 +2161 1837 +2162 1832 +2163 1832 +2164 1830 +2165 1833 +2166 1828 +2167 1832 +2168 1826 +2169 1831 +2170 1821 +2171 1828 +2172 1821 +2173 1827 +2174 1821 +2175 1825 +2176 1816 +2177 1824 +2178 1817 +2179 1826 +2180 1816 +2181 1823 +2182 1818 +2183 1823 +2184 1819 +2185 1825 +2186 1820 +2187 1827 +2188 1820 +2189 1831 +2190 1826 +2191 1830 +2192 1824 +2193 1832 +2194 1827 +2195 1832 +2196 1828 +2197 1834 +2198 1825 +2199 1834 +2200 1823 +2201 1835 +2202 1826 +2203 1833 +2204 1828 +2205 1831 +2206 1823 +2207 1830 +2208 1824 +2209 1829 +2210 1822 +2211 1828 +2212 1818 +2213 1826 +2214 1817 +2215 1823 +2216 1815 +2217 1821 +2218 1814 +2219 1821 +2220 1815 +2221 1819 +2222 1815 +2223 1820 +2224 1811 +2225 1819 +2226 1811 +2227 1816 +2228 1811 +2229 1814 +2230 1808 +2231 1813 +2232 1806 +2233 1813 +2234 1807 +2235 1814 +2236 1807 +2237 1810 +2238 1808 +2239 1808 +2240 1805 +2241 1813 +2242 1805 +2243 1815 +2244 1804 +2245 1814 +2246 1806 +2247 1813 +2248 1810 +2249 1814 +2250 1810 +2251 1815 +2252 1812 +2253 1818 +2254 1812 +2255 1819 +2256 1812 +2257 1823 +2258 1812 +2259 1823 +2260 1818 +2261 1822 +2262 1815 +2263 1822 +2264 1820 +2265 1822 +2266 1816 +2267 1827 +2268 1814 +2269 1826 +2270 1813 +2271 1823 +2272 1815 +2273 1822 +2274 1818 +2275 1821 +2276 1819 +2277 1823 +2278 1817 +2279 1823 +2280 1815 +2281 1823 +2282 1814 +2283 1821 +2284 1814 +2285 1819 +2286 1814 +2287 1818 +2288 1812 +2289 1822 +2290 1813 +2291 1819 +2292 1810 +2293 1816 +2294 1809 +2295 1816 +2296 1807 +2297 1814 +2298 1805 +2299 1813 +2300 1806 +2301 1812 +2302 1805 +2303 1810 +2304 1805 +2305 1813 +2306 1806 +2307 1815 +2308 1808 +2309 1814 +2310 1806 +2311 1811 +2312 1806 +2313 1812 +2314 1809 +2315 1817 +2316 1809 +2317 1820 +2318 1813 +2319 1818 +2320 1814 +2321 1821 +2322 1814 +2323 1822 +2324 1814 +2325 1822 +2326 1815 +2327 1821 +2328 1812 +2329 1822 +2330 1814 +2331 1822 +2332 1815 +2333 1821 +2334 1813 +2335 1821 +2336 1814 +2337 1821 +2338 1815 +2339 1823 +2340 1816 +2341 1824 +2342 1816 +2343 1825 +2344 1815 +2345 1823 +2346 1813 +2347 1819 +2348 1812 +2349 1821 +2350 1812 +2351 1820 +2352 1813 +2353 1822 +2354 1817 +2355 1825 +2356 1815 +2357 1823 +2358 1818 +2359 1826 +2360 1815 +2361 1826 +2362 1815 +2363 1819 +2364 1814 +2365 1819 +2366 1817 +2367 1816 +2368 1810 +2369 1819 +2370 1809 +2371 1820 +2372 1811 +2373 1818 +2374 1813 +2375 1818 +2376 1815 +2377 1821 +2378 1816 +2379 1822 +2380 1816 +2381 1826 +2382 1825 +2383 1829 +2384 1825 +2385 1830 +2386 1822 +2387 1830 +2388 1825 +2389 1830 +2390 1824 +2391 1832 +2392 1821 +2393 1833 +2394 1829 +2395 1834 +2396 1826 +2397 1835 +2398 1826 +2399 1836 +2400 1828 +2401 1840 +2402 1829 +2403 1842 +2404 1835 +2405 1841 +2406 1840 +2407 1846 +2408 1840 +2409 1846 +2410 1843 +2411 1850 +2412 1840 +2413 1850 +2414 1843 +2415 1853 +2416 1843 +2417 1853 +2418 1847 +2419 1853 +2420 1846 +2421 1851 +2422 1844 +2423 1849 +2424 1840 +2425 1845 +2426 1838 +2427 1841 +2428 1832 +2429 1838 +2430 1837 +2431 1836 +2432 1833 +2433 1838 +2434 1832 +2435 1840 +2436 1836 +2437 1837 +2438 1833 +2439 1836 +2440 1831 +2441 1834 +2442 1831 +2443 1836 +2444 1834 +2445 1839 +2446 1834 +2447 1840 +2448 1834 +2449 1843 +2450 1839 +2451 1846 +2452 1838 +2453 1845 +2454 1839 +2455 1846 +2456 1839 +2457 1846 +2458 1839 +2459 1845 +2460 1840 +2461 1852 +2462 1842 +2463 1849 +2464 1843 +2465 1850 +2466 1845 +2467 1854 +2468 1848 +2469 1854 +2470 1847 +2471 1857 +2472 1850 +2473 1856 +2474 1850 +2475 1853 +2476 1850 +2477 1855 +2478 1851 +2479 1855 +2480 1846 +2481 1856 +2482 1849 +2483 1857 +2484 1848 +2485 1858 +2486 1848 +2487 1851 +2488 1846 +2489 1851 +2490 1844 +2491 1849 +2492 1841 +2493 1847 +2494 1839 +2495 1844 +2496 1840 +2497 1844 +2498 1839 +2499 1846 +2500 1840 +2501 1849 +2502 1839 +2503 1846 +2504 1838 +2505 1849 +2506 1844 +2507 1849 +2508 1843 +2509 1852 +2510 1844 +2511 1853 +2512 1844 +2513 1856 +2514 1848 +2515 1854 +2516 1845 +2517 1854 +2518 1848 +2519 1854 +2520 1849 +2521 1854 +2522 1849 +2523 1857 +2524 1850 +2525 1859 +2526 1851 +2527 1857 +2528 1847 +2529 1859 +2530 1848 +2531 1856 +2532 1850 +2533 1857 +2534 1850 +2535 1854 +2536 1852 +2537 1857 +2538 1851 +2539 1855 +2540 1848 +2541 1854 +2542 1851 +2543 1858 +2544 1847 +2545 1858 +2546 1849 +2547 1856 +2548 1851 +2549 1857 +2550 1850 +2551 1858 +2552 1845 +2553 1853 +2554 1843 +2555 1851 +2556 1843 +2557 1843 +2558 1841 +2559 1847 +2560 1839 +2561 1846 +2562 1837 +2563 1846 +2564 1836 +2565 1844 +2566 1839 +2567 1844 +2568 1839 +2569 1842 +2570 1837 +2571 1847 +2572 1838 +2573 1843 +2574 1836 +2575 1846 +2576 1836 +2577 1844 +2578 1841 +2579 1842 +2580 1840 +2581 1846 +2582 1840 +2583 1846 +2584 1837 +2585 1847 +2586 1841 +2587 1847 +2588 1839 +2589 1840 +2590 1838 +2591 1841 +2592 1833 +2593 1839 +2594 1835 +2595 1841 +2596 1835 +2597 1842 +2598 1829 +2599 1840 +2600 1832 +2601 1839 +2602 1831 +2603 1841 +2604 1831 +2605 1841 +2606 1833 +2607 1840 +2608 1833 +2609 1841 +2610 1832 +2611 1839 +2612 1833 +2613 1839 +2614 1833 +2615 1838 +2616 1832 +2617 1839 +2618 1832 +2619 1838 +2620 1834 +2621 1838 +2622 1834 +2623 1837 +2624 1831 +2625 1841 +2626 1833 +2627 1842 +2628 1835 +2629 1842 +2630 1833 +2631 1842 +2632 1835 +2633 1838 +2634 1832 +2635 1837 +2636 1831 +2637 1835 +2638 1829 +2639 1835 +2640 1825 +2641 1834 +2642 1826 +2643 1834 +2644 1824 +2645 1832 +2646 1824 +2647 1830 +2648 1825 +2649 1830 +2650 1822 +2651 1830 +2652 1823 +2653 1831 +2654 1822 +2655 1832 +2656 1821 +2657 1831 +2658 1822 +2659 1830 +2660 1825 +2661 1829 +2662 1824 +2663 1833 +2664 1824 +2665 1832 +2666 1826 +2667 1833 +2668 1827 +2669 1833 +2670 1825 +2671 1830 +2672 1823 +2673 1829 +2674 1823 +2675 1826 +2676 1822 +2677 1827 +2678 1823 +2679 1828 +2680 1820 +2681 1828 +2682 1820 +2683 1826 +2684 1821 +2685 1826 +2686 1820 +2687 1823 +2688 1822 +2689 1825 +2690 1818 +2691 1827 +2692 1820 +2693 1824 +2694 1817 +2695 1824 +2696 1815 +2697 1823 +2698 1817 +2699 1820 +2700 1815 +2701 1824 +2702 1814 +2703 1822 +2704 1814 +2705 1821 +2706 1814 +2707 1821 +2708 1815 +2709 1817 +2710 1810 +2711 1816 +2712 1810 +2713 1818 +2714 1810 +2715 1816 +2716 1810 +2717 1818 +2718 1809 +2719 1817 +2720 1808 +2721 1813 +2722 1805 +2723 1811 +2724 1806 +2725 1810 +2726 1808 +2727 1813 +2728 1806 +2729 1816 +2730 1809 +2731 1812 +2732 1808 +2733 1814 +2734 1809 +2735 1814 +2736 1810 +2737 1814 +2738 1810 +2739 1819 +2740 1809 +2741 1815 +2742 1811 +2743 1818 +2744 1811 +2745 1818 +2746 1811 +2747 1817 +2748 1809 +2749 1815 +2750 1808 +2751 1816 +2752 1805 +2753 1814 +2754 1807 +2755 1814 +2756 1805 +2757 1814 +2758 1807 +2759 1815 +2760 1809 +2761 1816 +2762 1806 +2763 1812 +2764 1808 +2765 1814 +2766 1810 +2767 1812 +2768 1808 +2769 1811 +2770 1808 +2771 1813 +2772 1805 +2773 1813 +2774 1804 +2775 1813 +2776 1807 +2777 1810 +2778 1807 +2779 1812 +2780 1807 +2781 1813 +2782 1808 +2783 1814 +2784 1808 +2785 1819 +2786 1806 +2787 1817 +2788 1808 +2789 1818 +2790 1809 +2791 1817 +2792 1811 +2793 1820 +2794 1814 +2795 1822 +2796 1816 +2797 1820 +2798 1819 +2799 1819 +2800 1816 +2801 1823 +2802 1814 +2803 1822 +2804 1819 +2805 1823 +2806 1820 +2807 1824 +2808 1817 +2809 1826 +2810 1817 +2811 1825 +2812 1817 +2813 1825 +2814 1817 +2815 1824 +2816 1818 +2817 1824 +2818 1818 +2819 1822 +2820 1815 +2821 1822 +2822 1813 +2823 1822 +2824 1811 +2825 1819 +2826 1813 +2827 1816 +2828 1810 +2829 1816 +2830 1810 +2831 1814 +2832 1805 +2833 1811 +2834 1809 +2835 1811 +2836 1804 +2837 1810 +2838 1802 +2839 1811 +2840 1799 +2841 1809 +2842 1801 +2843 1807 +2844 1801 +2845 1808 +2846 1801 +2847 1807 +2848 1800 +2849 1807 +2850 1798 +2851 1808 +2852 1799 +2853 1805 +2854 1800 +2855 1806 +2856 1799 +2857 1803 +2858 1801 +2859 1805 +2860 1799 +2861 1805 +2862 1796 +2863 1802 +2864 1795 +2865 1805 +2866 1796 +2867 1803 +2868 1796 +2869 1802 +2870 1797 +2871 1802 +2872 1794 +2873 1802 +2874 1794 +2875 1800 +2876 1795 +2877 1799 +2878 1795 +2879 1799 +2880 1791 +2881 1797 +2882 1790 +2883 1800 +2884 1792 +2885 1798 +2886 1792 +2887 1796 +2888 1796 +2889 1798 +2890 1797 +2891 1799 +2892 1793 +2893 1801 +2894 1795 +2895 1799 +2896 1792 +2897 1797 +2898 1792 +2899 1798 +2900 1795 +2901 1799 +2902 1792 +2903 1798 +2904 1791 +2905 1799 +2906 1791 +2907 1799 +2908 1791 +2909 1796 +2910 1791 +2911 1795 +2912 1786 +2913 1793 +2914 1789 +2915 1796 +2916 1789 +2917 1797 +2918 1790 +2919 1797 +2920 1790 +2921 1794 +2922 1787 +2923 1794 +2924 1787 +2925 1795 +2926 1787 +2927 1795 +2928 1786 +2929 1792 +2930 1786 +2931 1791 +2932 1786 +2933 1788 +2934 1783 +2935 1788 +2936 1780 +2937 1786 +2938 1777 +2939 1784 +2940 1776 +2941 1782 +2942 1777 +2943 1780 +2944 1775 +2945 1780 +2946 1774 +2947 1778 +2948 1773 +2949 1777 +2950 1771 +2951 1777 +2952 1773 +2953 1776 +2954 1774 +2955 1777 +2956 1771 +2957 1778 +2958 1771 +2959 1779 +2960 1770 +2961 1777 +2962 1769 +2963 1776 +2964 1771 +2965 1775 +2966 1769 +2967 1775 +2968 1768 +2969 1774 +2970 1767 +2971 1772 +2972 1765 +2973 1769 +2974 1764 +2975 1769 +2976 1763 +2977 1769 +2978 1761 +2979 1769 +2980 1761 +2981 1768 +2982 1762 +2983 1767 +2984 1762 +2985 1767 +2986 1762 +2987 1767 +2988 1766 +2989 1770 +2990 1765 +2991 1773 +2992 1764 +2993 1771 +2994 1765 +2995 1771 +2996 1766 +2997 1770 +2998 1766 +2999 1771 +3000 1764 +3001 1769 +3002 1760 +3003 1767 +3004 1760 +3005 1765 +3006 1758 +3007 1764 +3008 1757 +3009 1762 +3010 1755 +3011 1762 +3012 1754 +3013 1761 +3014 1755 +3015 1761 +3016 1754 +3017 1760 +3018 1755 +3019 1760 +3020 1753 +3021 1759 +3022 1751 +3023 1758 +3024 1748 +3025 1756 +3026 1749 +3027 1755 +3028 1749 +3029 1752 +3030 1748 +3031 1751 +3032 1746 +3033 1752 +3034 1746 +3035 1752 +3036 1746 +3037 1751 +3038 1745 +3039 1751 +3040 1745 +3041 1750 +3042 1744 +3043 1748 +3044 1745 +3045 1748 +3046 1745 +3047 1749 +3048 1743 +3049 1748 +3050 1742 +3051 1750 +3052 1741 +3053 1748 +3054 1742 +3055 1748 +3056 1741 +3057 1746 +3058 1740 +3059 1747 +3060 1742 +3061 1748 +3062 1742 +3063 1749 +3064 1745 +3065 1751 +3066 1745 +3067 1752 +3068 1746 +3069 1751 +3070 1746 +3071 1749 +3072 1746 +3073 1751 +3074 1745 +3075 1753 +3076 1749 +3077 1753 +3078 1749 +3079 1754 +3080 1749 +3081 1754 +3082 1749 +3083 1755 +3084 1748 +3085 1755 +3086 1748 +3087 1753 +3088 1746 +3089 1752 +3090 1745 +3091 1752 +3092 1746 +3093 1752 +3094 1746 +3095 1750 +3096 1744 +3097 1749 +3098 1743 +3099 1748 +3100 1742 +3101 1747 +3102 1743 +3103 1746 +3104 1741 +3105 1747 +3106 1740 +3107 1746 +3108 1739 +3109 1744 +3110 1739 +3111 1743 +3112 1739 +3113 1744 +3114 1740 +3115 1742 +3116 1740 +3117 1743 +3118 1738 +3119 1743 +3120 1736 +3121 1742 +3122 1734 +3123 1740 +3124 1732 +3125 1739 +3126 1733 +3127 1737 +3128 1733 +3129 1737 +3130 1731 +3131 1736 +3132 1728 +3133 1735 +3134 1729 +3135 1735 +3136 1730 +3137 1734 +3138 1729 +3139 1733 +3140 1729 +3141 1735 +3142 1731 +3143 1735 +3144 1729 +3145 1736 +3146 1730 +3147 1735 +3148 1730 +3149 1734 +3150 1730 +3151 1735 +3152 1729 +3153 1734 +3154 1728 +3155 1736 +3156 1729 +3157 1735 +3158 1729 +3159 1734 +3160 1728 +3161 1735 +3162 1727 +3163 1735 +3164 1729 +3165 1734 +3166 1729 +3167 1734 +3168 1726 +3169 1734 +3170 1727 +3171 1733 +3172 1727 +3173 1731 +3174 1727 +3175 1731 +3176 1727 +3177 1731 +3178 1725 +3179 1731 +3180 1725 +3181 1730 +3182 1723 +3183 1729 +3184 1721 +3185 1728 +3186 1721 +3187 1726 +3188 1721 +3189 1725 +3190 1719 +3191 1723 +3192 1718 +3193 1721 +3194 1715 +3195 1718 +3196 1713 +3197 1717 +3198 1711 +3199 1716 +3200 1711 +3201 1717 +3202 1711 +3203 1715 +3204 1711 +3205 1716 +3206 1711 +3207 1716 +3208 1713 +3209 1717 +3210 1714 +3211 1719 +3212 1714 +3213 1720 +3214 1714 +3215 1720 +3216 1714 +3217 1719 +3218 1714 +3219 1718 +3220 1712 +3221 1717 +3222 1711 +3223 1715 +3224 1708 +3225 1714 +3226 1706 +3227 1711 +3228 1705 +3229 1710 +3230 1703 +3231 1708 +3232 1701 +3233 1707 +3234 1701 +3235 1706 +3236 1700 +3237 1705 +3238 1701 +3239 1706 +3240 1702 +3241 1706 +3242 1702 +3243 1706 +3244 1702 +3245 1706 +3246 1701 +3247 1706 +3248 1701 +3249 1705 +3250 1702 +3251 1707 +3252 1702 +3253 1705 +3254 1703 +3255 1705 +3256 1701 +3257 1706 +3258 1701 +3259 1706 +3260 1701 +3261 1708 +3262 1702 +3263 1707 +3264 1703 +3265 1707 +3266 1703 +3267 1708 +3268 1703 +3269 1708 +3270 1703 +3271 1708 +3272 1701 +3273 1707 +3274 1702 +3275 1707 +3276 1701 +3277 1705 +3278 1700 +3279 1705 +3280 1700 +3281 1704 +3282 1700 +3283 1705 +3284 1699 +3285 1705 +3286 1699 +3287 1704 +3288 1699 +3289 1704 +3290 1697 +3291 1703 +3292 1695 +3293 1703 +3294 1694 +3295 1701 +3296 1694 +3297 1699 +3298 1692 +3299 1698 +3300 1691 +3301 1698 +3302 1691 +3303 1698 +3304 1691 +3305 1697 +3306 1691 +3307 1696 +3308 1689 +3309 1695 +3310 1690 +3311 1694 +3312 1689 +3313 1694 +3314 1689 +3315 1694 +3316 1690 +3317 1695 +3318 1690 +3319 1694 +3320 1692 +3321 1695 +3322 1690 +3323 1695 +3324 1691 +3325 1695 +3326 1691 +3327 1694 +3328 1690 +3329 1694 +3330 1688 +3331 1694 +3332 1687 +3333 1692 +3334 1687 +3335 1692 +3336 1685 +3337 1690 +3338 1686 +3339 1690 +3340 1684 +3341 1689 +3342 1683 +3343 1687 +3344 1682 +3345 1687 +3346 1680 +3347 1685 +3348 1678 +3349 1683 +3350 1677 +3351 1683 +3352 1676 +3353 1682 +3354 1676 +3355 1682 +3356 1676 +3357 1681 +3358 1676 +3359 1681 +3360 1676 +3361 1680 +3362 1676 +3363 1681 +3364 1676 +3365 1681 +3366 1678 +3367 1682 +3368 1677 +3369 1682 +3370 1677 +3371 1681 +3372 1677 +3373 1681 +3374 1676 +3375 1680 +3376 1678 +3377 1681 +3378 1677 +3379 1682 +3380 1676 +3381 1681 +3382 1676 +3383 1680 +3384 1675 +3385 1679 +3386 1674 +3387 1678 +3388 1674 +3389 1679 +3390 1675 +3391 1678 +3392 1674 +3393 1678 +3394 1673 +3395 1678 +3396 1673 +3397 1678 +3398 1672 +3399 1678 +3400 1672 +3401 1678 +3402 1671 +3403 1677 +3404 1672 +3405 1677 +3406 1671 +3407 1676 +3408 1670 +3409 1675 +3410 1669 +3411 1674 +3412 1667 +3413 1673 +3414 1667 +3415 1673 +3416 1666 +3417 1672 +3418 1666 +3419 1671 +3420 1666 +3421 1670 +3422 1665 +3423 1669 +3424 1665 +3425 1669 +3426 1665 +3427 1669 +3428 1664 +3429 1669 +3430 1663 +3431 1668 +3432 1663 +3433 1668 +3434 1662 +3435 1667 +3436 1662 +3437 1666 +3438 1662 +3439 1667 +3440 1661 +3441 1666 +3442 1660 +3443 1665 +3444 1660 +3445 1664 +3446 1659 +3447 1664 +3448 1659 +3449 1664 +3450 1659 +3451 1665 +3452 1658 +3453 1664 +3454 1658 +3455 1663 +3456 1658 +3457 1663 +3458 1656 +3459 1662 +3460 1657 +3461 1661 +3462 1655 +3463 1660 +3464 1655 +3465 1660 +3466 1655 +3467 1659 +3468 1654 +3469 1659 +3470 1653 +3471 1659 +3472 1652 +3473 1657 +3474 1652 +3475 1656 +3476 1651 +3477 1655 +3478 1650 +3479 1654 +3480 1648 +3481 1653 +3482 1648 +3483 1652 +3484 1647 +3485 1651 +3486 1645 +3487 1649 +3488 1644 +3489 1650 +3490 1643 +3491 1649 +3492 1643 +3493 1648 +3494 1642 +3495 1647 +3496 1642 +3497 1646 +3498 1641 +3499 1646 +3500 1640 +3501 1647 +3502 1641 +3503 1645 +3504 1641 +3505 1644 +3506 1641 +3507 1644 +3508 1640 +3509 1644 +3510 1640 +3511 1643 +3512 1639 +3513 1643 +3514 1639 +3515 1643 +3516 1639 +3517 1643 +3518 1637 +3519 1642 +3520 1638 +3521 1642 +3522 1637 +3523 1642 +3524 1637 +3525 1641 +3526 1637 +3527 1641 +3528 1636 +3529 1641 +3530 1636 +3531 1640 +3532 1635 +3533 1639 +3534 1635 +3535 1638 +3536 1634 +3537 1637 +3538 1632 +3539 1637 +3540 1632 +3541 1637 +3542 1632 +3543 1637 +3544 1632 +3545 1636 +3546 1631 +3547 1635 +3548 1631 +3549 1635 +3550 1630 +3551 1635 +3552 1630 +3553 1635 +3554 1630 +3555 1634 +3556 1629 +3557 1633 +3558 1629 +3559 1633 +3560 1628 +3561 1632 +3562 1627 +3563 1632 +3564 1628 +3565 1632 +3566 1627 +3567 1632 +3568 1626 +3569 1631 +3570 1626 +3571 1630 +3572 1626 +3573 1631 +3574 1625 +3575 1630 +3576 1626 +3577 1629 +3578 1625 +3579 1629 +3580 1625 +3581 1629 +3582 1625 +3583 1629 +3584 1624 +3585 1628 +3586 1624 +3587 1628 +3588 1624 +3589 1628 +3590 1624 +3591 1628 +3592 1624 +3593 1628 +3594 1624 +3595 1628 +3596 1623 +3597 1628 +3598 1624 +3599 1628 +3600 1623 +3601 1628 +3602 1622 +3603 1627 +3604 1623 +3605 1627 +3606 1622 +3607 1627 +3608 1622 +3609 1626 +3610 1622 +3611 1626 +3612 1621 +3613 1625 +3614 1621 +3615 1625 +3616 1620 +3617 1624 +3618 1620 +3619 1624 +3620 1619 +3621 1623 +3622 1619 +3623 1623 +3624 1618 +3625 1624 +3626 1620 +3627 1622 +3628 1620 +3629 1622 +3630 1619 +3631 1622 +3632 1619 +3633 1622 +3634 1619 +3635 1622 +3636 1619 +3637 1621 +3638 1618 +3639 1621 +3640 1619 +3641 1622 +3642 1619 +3643 1622 +3644 1619 +3645 1622 +3646 1619 +3647 1622 +3648 1619 +3649 1622 +3650 1619 +3651 1623 +3652 1619 +3653 1622 +3654 1619 +3655 1622 +3656 1619 +3657 1622 +3658 1618 +3659 1622 +3660 1618 +3661 1622 +3662 1617 +3663 1621 +3664 1618 +3665 1621 +3666 1617 +3667 1621 +3668 1617 +3669 1621 +3670 1618 +3671 1622 +3672 1618 +3673 1621 +3674 1617 +3675 1621 +3676 1618 +3677 1620 +3678 1617 +3679 1620 +3680 1616 +3681 1621 +3682 1616 +3683 1620 +3684 1616 +3685 1620 +3686 1616 +3687 1891 +3688 2640 +3689 3661 +3690 3660 +3691 3664 +3692 3660 +3693 3663 +3694 3660 diff --git a/newout.dat b/newout.dat new file mode 100644 index 0000000..186efe9 --- /dev/null +++ b/newout.dat @@ -0,0 +1,3698 @@ +#Data from the TCD1304 linear CCD +#column 1 = pixelnumber , column 2 = pixelvalue +#Pixel 1-32 and 3679-3694 and are dummy pixels +#SH-period: 100 ICG-period: 2000000 Integration time: 50.0 µs +1 1027 +2 411 +3 561 +4 690 +5 782 +6 851 +7 901 +8 935 +9 957 +10 978 +11 1002 +12 1012 +13 1019 +14 1026 +15 1027 +16 1024 +17 1030 +18 1028 +19 1023 +20 1028 +21 1027 +22 1027 +23 1033 +24 1025 +25 1033 +26 1005 +27 1049 +28 1034 +29 1035 +30 1029 +31 1027 +32 1035 +33 1035 +34 1031 +35 1030 +36 1020 +37 1031 +38 1034 +39 1022 +40 1030 +41 1021 +42 1031 +43 1026 +44 1025 +45 1034 +46 1025 +47 1035 +48 1030 +49 1029 +50 1029 +51 1006 +52 1045 +53 1031 +54 1028 +55 1026 +56 1033 +57 1025 +58 1038 +59 1031 +60 1028 +61 1029 +62 1019 +63 1027 +64 1028 +65 1030 +66 1038 +67 1029 +68 1023 +69 1033 +70 1021 +71 1024 +72 1023 +73 1029 +74 1032 +75 1031 +76 1008 +77 1050 +78 1044 +79 1032 +80 1029 +81 1028 +82 1030 +83 1025 +84 1024 +85 1023 +86 1028 +87 1038 +88 1030 +89 1029 +90 1030 +91 1028 +92 1029 +93 1032 +94 1024 +95 1030 +96 1029 +97 1034 +98 1025 +99 1027 +100 1032 +101 1007 +102 1049 +103 1031 +104 1028 +105 1027 +106 1034 +107 1032 +108 1037 +109 1030 +110 1028 +111 1033 +112 1031 +113 1024 +114 1036 +115 1025 +116 1025 +117 1033 +118 1026 +119 1032 +120 1029 +121 1027 +122 1029 +123 1027 +124 1025 +125 1032 +126 1017 +127 1041 +128 1028 +129 1026 +130 1032 +131 1030 +132 1031 +133 1031 +134 1029 +135 1023 +136 1030 +137 1034 +138 1031 +139 1030 +140 1029 +141 1024 +142 1024 +143 1033 +144 1030 +145 1028 +146 1036 +147 1030 +148 1025 +149 1030 +150 1029 +151 1008 +152 1042 +153 1036 +154 1035 +155 1028 +156 1030 +157 1032 +158 1030 +159 1032 +160 1026 +161 1034 +162 1026 +163 1031 +164 1027 +165 1034 +166 1029 +167 1028 +168 1028 +169 1025 +170 1027 +171 1031 +172 1018 +173 1033 +174 1038 +175 1022 +176 1012 +177 1046 +178 1033 +179 1024 +180 1023 +181 1027 +182 1027 +183 1019 +184 1034 +185 1031 +186 1024 +187 1029 +188 1028 +189 1028 +190 1030 +191 1027 +192 1029 +193 1027 +194 1027 +195 1022 +196 1027 +197 1029 +198 1030 +199 1030 +200 1031 +201 1012 +202 1044 +203 1028 +204 1033 +205 1020 +206 1027 +207 1033 +208 1026 +209 1024 +210 1026 +211 1027 +212 1028 +213 1034 +214 1027 +215 1032 +216 1026 +217 1029 +218 1026 +219 1027 +220 1019 +221 1032 +222 1035 +223 1031 +224 1031 +225 1036 +226 1007 +227 1053 +228 1035 +229 1028 +230 1026 +231 1032 +232 1035 +233 1019 +234 1027 +235 1025 +236 1027 +237 1029 +238 1038 +239 1027 +240 1026 +241 1032 +242 1033 +243 1027 +244 1026 +245 1027 +246 1031 +247 1028 +248 1031 +249 1026 +250 1025 +251 1015 +252 1043 +253 1031 +254 1024 +255 1025 +256 1030 +257 1032 +258 1026 +259 1031 +260 1027 +261 1033 +262 1029 +263 1028 +264 1026 +265 1025 +266 1033 +267 1022 +268 1021 +269 1030 +270 1029 +271 1034 +272 1028 +273 1020 +274 1028 +275 1027 +276 1010 +277 1052 +278 1037 +279 1032 +280 1031 +281 1027 +282 1024 +283 1031 +284 1035 +285 1027 +286 1032 +287 1023 +288 1030 +289 1027 +290 1029 +291 1028 +292 1030 +293 1029 +294 1031 +295 1020 +296 1029 +297 1036 +298 1025 +299 1026 +300 1028 +301 1006 +302 1044 +303 1035 +304 1034 +305 1029 +306 1030 +307 1020 +308 1032 +309 1033 +310 1024 +311 1043 +312 1032 +313 1030 +314 1025 +315 1022 +316 1031 +317 1028 +318 1025 +319 1034 +320 1030 +321 1027 +322 1030 +323 1031 +324 1027 +325 1032 +326 1017 +327 1043 +328 1024 +329 1034 +330 1026 +331 1031 +332 1035 +333 1027 +334 1021 +335 1032 +336 1023 +337 1031 +338 1029 +339 1027 +340 1027 +341 1034 +342 1025 +343 1023 +344 1026 +345 1031 +346 1029 +347 1028 +348 1024 +349 1028 +350 1031 +351 1006 +352 1044 +353 1035 +354 1029 +355 1031 +356 1027 +357 1027 +358 1035 +359 1028 +360 1030 +361 1039 +362 1028 +363 1028 +364 1025 +365 1028 +366 1027 +367 1025 +368 1019 +369 1032 +370 1025 +371 1023 +372 1031 +373 1032 +374 1023 +375 1027 +376 1009 +377 1048 +378 1044 +379 1035 +380 1026 +381 1034 +382 1028 +383 1023 +384 1028 +385 1028 +386 1036 +387 1025 +388 1024 +389 1029 +390 1030 +391 1036 +392 1024 +393 1029 +394 1023 +395 1031 +396 1025 +397 1030 +398 1020 +399 1031 +400 1028 +401 1007 +402 1045 +403 1040 +404 1032 +405 1029 +406 1024 +407 1024 +408 1024 +409 1031 +410 1028 +411 1026 +412 1027 +413 1030 +414 1035 +415 1030 +416 1024 +417 1025 +418 1032 +419 1025 +420 1029 +421 1027 +422 1022 +423 1032 +424 1025 +425 1025 +426 1009 +427 1054 +428 1046 +429 1040 +430 1034 +431 1026 +432 1026 +433 1025 +434 1030 +435 1024 +436 1025 +437 1030 +438 1027 +439 1028 +440 1020 +441 1020 +442 1033 +443 1024 +444 1020 +445 1038 +446 1032 +447 1023 +448 1036 +449 1027 +450 1025 +451 1010 +452 1039 +453 1030 +454 1031 +455 1023 +456 1024 +457 1027 +458 1026 +459 1026 +460 1024 +461 1034 +462 1027 +463 1035 +464 1031 +465 1031 +466 1025 +467 1029 +468 1030 +469 1036 +470 1024 +471 1025 +472 1029 +473 1031 +474 1029 +475 1026 +476 1005 +477 1039 +478 1018 +479 1038 +480 1030 +481 1032 +482 1027 +483 1033 +484 1035 +485 1039 +486 1033 +487 1028 +488 1022 +489 1022 +490 1030 +491 1032 +492 1027 +493 1029 +494 1030 +495 1029 +496 1036 +497 1032 +498 1029 +499 1027 +500 1031 +501 1014 +502 1042 +503 1033 +504 1034 +505 1027 +506 1028 +507 1029 +508 1030 +509 1024 +510 1031 +511 1024 +512 1028 +513 1027 +514 1024 +515 1033 +516 1025 +517 1037 +518 1027 +519 1029 +520 1033 +521 1020 +522 1020 +523 1025 +524 1030 +525 1023 +526 1011 +527 1039 +528 1030 +529 1032 +530 1024 +531 1028 +532 1023 +533 1031 +534 1027 +535 1024 +536 1025 +537 1034 +538 1026 +539 1028 +540 1029 +541 1021 +542 1026 +543 1031 +544 1026 +545 1035 +546 1028 +547 1029 +548 1033 +549 1024 +550 1026 +551 1009 +552 1043 +553 1031 +554 1038 +555 1026 +556 1019 +557 1035 +558 1023 +559 1025 +560 1033 +561 1020 +562 1029 +563 1034 +564 1024 +565 1032 +566 1034 +567 1029 +568 1035 +569 1036 +570 1028 +571 1026 +572 1032 +573 1028 +574 1035 +575 1033 +576 1008 +577 1046 +578 1033 +579 1036 +580 1030 +581 1033 +582 1022 +583 1025 +584 1034 +585 1025 +586 1031 +587 1029 +588 1028 +589 1034 +590 1020 +591 1029 +592 1023 +593 1028 +594 1032 +595 1031 +596 1031 +597 1028 +598 1026 +599 1029 +600 1033 +601 1000 +602 1048 +603 1034 +604 1032 +605 1027 +606 1032 +607 1027 +608 1024 +609 1024 +610 1031 +611 1033 +612 1018 +613 1026 +614 1030 +615 1030 +616 1028 +617 1029 +618 1022 +619 1035 +620 1028 +621 1030 +622 1032 +623 1028 +624 1034 +625 1025 +626 1009 +627 1044 +628 1031 +629 1025 +630 1027 +631 1029 +632 1026 +633 1034 +634 1024 +635 1031 +636 1030 +637 1033 +638 1031 +639 1029 +640 1028 +641 1020 +642 1024 +643 1024 +644 1024 +645 1032 +646 1025 +647 1030 +648 1028 +649 1025 +650 1030 +651 1019 +652 1046 +653 1037 +654 1037 +655 1031 +656 1016 +657 1031 +658 1022 +659 1034 +660 1030 +661 1022 +662 1032 +663 1027 +664 1028 +665 1027 +666 1025 +667 1031 +668 1026 +669 1031 +670 1029 +671 1030 +672 1030 +673 1032 +674 1030 +675 1025 +676 1015 +677 1049 +678 1032 +679 1035 +680 1031 +681 1033 +682 1030 +683 1024 +684 1034 +685 1030 +686 1034 +687 1032 +688 1031 +689 1020 +690 1035 +691 1025 +692 1028 +693 1031 +694 1029 +695 1017 +696 1030 +697 1028 +698 1034 +699 1033 +700 1030 +701 1006 +702 1044 +703 1035 +704 1035 +705 1026 +706 1018 +707 1030 +708 1028 +709 1032 +710 1022 +711 1031 +712 1024 +713 1024 +714 1029 +715 1030 +716 1026 +717 1030 +718 1022 +719 1030 +720 1033 +721 1028 +722 1027 +723 1027 +724 1026 +725 1023 +726 1008 +727 1042 +728 1037 +729 1039 +730 1028 +731 1032 +732 1027 +733 1023 +734 1036 +735 1037 +736 1026 +737 1030 +738 1021 +739 1024 +740 1031 +741 1032 +742 1030 +743 1025 +744 1027 +745 1032 +746 1027 +747 1030 +748 1029 +749 1034 +750 1031 +751 1010 +752 1045 +753 1036 +754 1031 +755 1029 +756 1029 +757 1025 +758 1031 +759 1027 +760 1030 +761 1035 +762 1030 +763 1020 +764 1037 +765 1030 +766 1029 +767 1028 +768 1028 +769 1030 +770 1031 +771 1032 +772 1029 +773 1028 +774 1030 +775 1033 +776 1003 +777 1041 +778 1039 +779 1033 +780 1024 +781 1027 +782 1025 +783 1038 +784 1029 +785 1030 +786 1032 +787 1027 +788 1024 +789 1024 +790 1029 +791 1031 +792 1026 +793 1017 +794 1027 +795 1027 +796 1035 +797 1030 +798 1021 +799 1033 +800 1033 +801 1004 +802 1043 +803 1026 +804 1030 +805 1028 +806 1027 +807 1035 +808 1033 +809 1030 +810 1024 +811 1031 +812 1031 +813 1029 +814 1026 +815 1027 +816 1037 +817 1029 +818 1022 +819 1036 +820 1027 +821 1033 +822 1026 +823 1032 +824 1034 +825 1029 +826 1008 +827 1049 +828 1035 +829 1032 +830 1031 +831 1029 +832 1023 +833 1031 +834 1030 +835 1028 +836 1029 +837 1034 +838 1030 +839 1029 +840 1026 +841 1028 +842 1029 +843 1022 +844 1026 +845 1033 +846 1031 +847 1022 +848 1037 +849 1026 +850 1035 +851 1012 +852 1045 +853 1030 +854 1033 +855 1022 +856 1030 +857 1029 +858 1031 +859 1027 +860 1031 +861 1031 +862 1021 +863 1031 +864 1028 +865 1024 +866 1030 +867 1024 +868 1029 +869 1029 +870 1033 +871 1031 +872 1025 +873 1030 +874 1029 +875 1027 +876 1008 +877 1041 +878 1024 +879 1024 +880 1028 +881 1025 +882 1028 +883 1029 +884 1024 +885 1028 +886 1030 +887 1028 +888 1025 +889 1034 +890 1027 +891 1028 +892 1029 +893 1030 +894 1024 +895 1028 +896 1032 +897 1027 +898 1024 +899 1028 +900 1026 +901 1011 +902 1049 +903 1032 +904 1027 +905 1031 +906 1035 +907 1031 +908 1026 +909 1033 +910 1030 +911 1027 +912 1028 +913 1030 +914 1032 +915 1026 +916 1024 +917 1032 +918 1030 +919 1031 +920 1032 +921 1031 +922 1028 +923 1029 +924 1022 +925 1034 +926 1008 +927 1044 +928 1038 +929 1031 +930 1027 +931 1028 +932 1028 +933 1033 +934 1032 +935 1027 +936 1028 +937 1027 +938 1030 +939 1033 +940 1024 +941 1032 +942 1023 +943 1034 +944 1027 +945 1026 +946 1026 +947 1024 +948 1029 +949 1035 +950 1028 +951 1015 +952 1048 +953 1031 +954 1031 +955 1029 +956 1021 +957 1036 +958 1024 +959 1029 +960 1020 +961 1030 +962 1026 +963 1031 +964 1030 +965 1028 +966 1030 +967 1026 +968 1027 +969 1025 +970 1027 +971 1025 +972 1023 +973 1030 +974 1027 +975 1024 +976 1009 +977 1045 +978 1035 +979 1033 +980 1037 +981 1030 +982 1025 +983 1022 +984 1030 +985 1027 +986 1033 +987 1028 +988 1033 +989 1022 +990 1027 +991 1031 +992 1032 +993 1029 +994 1032 +995 1015 +996 1033 +997 1033 +998 1028 +999 1023 +1000 1032 +1001 1011 +1002 1050 +1003 1040 +1004 1031 +1005 1021 +1006 1028 +1007 1024 +1008 1028 +1009 1023 +1010 1029 +1011 1027 +1012 1027 +1013 1026 +1014 1036 +1015 1020 +1016 1034 +1017 1034 +1018 1022 +1019 1030 +1020 1031 +1021 1028 +1022 1027 +1023 1024 +1024 1021 +1025 1029 +1026 1009 +1027 1052 +1028 1037 +1029 1024 +1030 1028 +1031 1027 +1032 1032 +1033 1027 +1034 1036 +1035 1027 +1036 1030 +1037 1029 +1038 1034 +1039 1026 +1040 1031 +1041 1027 +1042 1024 +1043 1025 +1044 1029 +1045 1025 +1046 1029 +1047 1029 +1048 1034 +1049 1034 +1050 1025 +1051 1012 +1052 1043 +1053 1032 +1054 1035 +1055 1031 +1056 1026 +1057 1032 +1058 1026 +1059 1032 +1060 1025 +1061 1040 +1062 1023 +1063 1027 +1064 1034 +1065 1020 +1066 1040 +1067 1029 +1068 1031 +1069 1027 +1070 1035 +1071 1030 +1072 1028 +1073 1026 +1074 1027 +1075 1034 +1076 1007 +1077 1047 +1078 1036 +1079 1034 +1080 1024 +1081 1034 +1082 1025 +1083 1032 +1084 1030 +1085 1030 +1086 1025 +1087 1031 +1088 1029 +1089 1023 +1090 1031 +1091 1027 +1092 1025 +1093 1028 +1094 1030 +1095 1032 +1096 1031 +1097 1029 +1098 1027 +1099 1029 +1100 1023 +1101 1012 +1102 1039 +1103 1028 +1104 1033 +1105 1025 +1106 1030 +1107 1028 +1108 1018 +1109 1027 +1110 1033 +1111 1029 +1112 1030 +1113 1025 +1114 1026 +1115 1030 +1116 1022 +1117 1028 +1118 1025 +1119 1030 +1120 1028 +1121 1029 +1122 1027 +1123 1034 +1124 1028 +1125 1024 +1126 1009 +1127 1044 +1128 1036 +1129 1028 +1130 1034 +1131 1028 +1132 1026 +1133 1025 +1134 1027 +1135 1029 +1136 1032 +1137 1030 +1138 1024 +1139 1022 +1140 1025 +1141 1026 +1142 1039 +1143 1024 +1144 1032 +1145 1031 +1146 1022 +1147 1030 +1148 1032 +1149 1029 +1150 1026 +1151 1010 +1152 1037 +1153 1024 +1154 1028 +1155 1029 +1156 1017 +1157 1031 +1158 1026 +1159 1021 +1160 1026 +1161 1022 +1162 1028 +1163 1028 +1164 1030 +1165 1027 +1166 1029 +1167 1031 +1168 1026 +1169 1028 +1170 1025 +1171 1023 +1172 1030 +1173 1040 +1174 1030 +1175 1022 +1176 1017 +1177 1048 +1178 1031 +1179 1040 +1180 1026 +1181 1029 +1182 1027 +1183 1020 +1184 1022 +1185 1030 +1186 1024 +1187 1029 +1188 1027 +1189 1028 +1190 1029 +1191 1028 +1192 1029 +1193 1036 +1194 1030 +1195 1025 +1196 1026 +1197 1022 +1198 1027 +1199 1026 +1200 1026 +1201 1009 +1202 1040 +1203 1031 +1204 1031 +1205 1032 +1206 1026 +1207 1026 +1208 1033 +1209 1029 +1210 1036 +1211 1024 +1212 1029 +1213 1029 +1214 1029 +1215 1022 +1216 1029 +1217 1027 +1218 1023 +1219 1036 +1220 1027 +1221 1029 +1222 1030 +1223 1025 +1224 1023 +1225 1031 +1226 1013 +1227 1037 +1228 1030 +1229 1035 +1230 1032 +1231 1026 +1232 1026 +1233 1028 +1234 1033 +1235 1030 +1236 1026 +1237 1028 +1238 1030 +1239 1026 +1240 1028 +1241 1031 +1242 1028 +1243 1030 +1244 1022 +1245 1029 +1246 1028 +1247 1022 +1248 1018 +1249 1033 +1250 1034 +1251 1003 +1252 1044 +1253 1036 +1254 1029 +1255 1031 +1256 1026 +1257 1027 +1258 1030 +1259 1027 +1260 1029 +1261 1024 +1262 1027 +1263 1027 +1264 1038 +1265 1026 +1266 1025 +1267 1029 +1268 1028 +1269 1026 +1270 1027 +1271 1031 +1272 1030 +1273 1030 +1274 1028 +1275 1026 +1276 1011 +1277 1045 +1278 1035 +1279 1028 +1280 1027 +1281 1024 +1282 1028 +1283 1020 +1284 1026 +1285 1030 +1286 1023 +1287 1029 +1288 1030 +1289 1027 +1290 1031 +1291 1020 +1292 1026 +1293 1024 +1294 1029 +1295 1035 +1296 1030 +1297 1029 +1298 1027 +1299 1029 +1300 1023 +1301 1018 +1302 1041 +1303 1037 +1304 1042 +1305 1030 +1306 1032 +1307 1027 +1308 1025 +1309 1029 +1310 1028 +1311 1027 +1312 1027 +1313 1019 +1314 1024 +1315 1033 +1316 1021 +1317 1025 +1318 1029 +1319 1034 +1320 1021 +1321 1025 +1322 1030 +1323 1031 +1324 1026 +1325 1026 +1326 1008 +1327 1044 +1328 1034 +1329 1029 +1330 1035 +1331 1025 +1332 1025 +1333 1032 +1334 1029 +1335 1023 +1336 1031 +1337 1030 +1338 1021 +1339 1035 +1340 1031 +1341 1026 +1342 1040 +1343 1025 +1344 1027 +1345 1027 +1346 1024 +1347 1029 +1348 1022 +1349 1028 +1350 1031 +1351 1014 +1352 1049 +1353 1036 +1354 1032 +1355 1018 +1356 1030 +1357 1035 +1358 1019 +1359 1031 +1360 1028 +1361 1028 +1362 1028 +1363 1029 +1364 1028 +1365 1030 +1366 1028 +1367 1032 +1368 1029 +1369 1025 +1370 1031 +1371 1020 +1372 1023 +1373 1032 +1374 1023 +1375 1025 +1376 1008 +1377 1049 +1378 1037 +1379 1041 +1380 1029 +1381 1020 +1382 1032 +1383 1029 +1384 1031 +1385 1033 +1386 1027 +1387 1027 +1388 1033 +1389 1033 +1390 1029 +1391 1023 +1392 1033 +1393 1026 +1394 1027 +1395 1019 +1396 1031 +1397 1031 +1398 1029 +1399 1030 +1400 1033 +1401 1004 +1402 1037 +1403 1028 +1404 1038 +1405 1029 +1406 1030 +1407 1024 +1408 1025 +1409 1039 +1410 1029 +1411 1029 +1412 1029 +1413 1028 +1414 1026 +1415 1031 +1416 1030 +1417 1026 +1418 1032 +1419 1030 +1420 1027 +1421 1026 +1422 1026 +1423 1024 +1424 1038 +1425 1030 +1426 1012 +1427 1040 +1428 1025 +1429 1033 +1430 1028 +1431 1031 +1432 1030 +1433 1028 +1434 1030 +1435 1030 +1436 1028 +1437 1031 +1438 1032 +1439 1023 +1440 1023 +1441 1033 +1442 1032 +1443 1030 +1444 1029 +1445 1027 +1446 1033 +1447 1031 +1448 1025 +1449 1033 +1450 1031 +1451 1003 +1452 1047 +1453 1034 +1454 1022 +1455 1031 +1456 1021 +1457 1028 +1458 1026 +1459 1025 +1460 1027 +1461 1028 +1462 1025 +1463 1028 +1464 1026 +1465 1026 +1466 1026 +1467 1036 +1468 1024 +1469 1025 +1470 1022 +1471 1028 +1472 1021 +1473 1037 +1474 1029 +1475 1028 +1476 1017 +1477 1049 +1478 1040 +1479 1036 +1480 1029 +1481 1027 +1482 1018 +1483 1027 +1484 1028 +1485 1021 +1486 1036 +1487 1025 +1488 1026 +1489 1024 +1490 1024 +1491 1028 +1492 1032 +1493 1031 +1494 1021 +1495 1037 +1496 1029 +1497 1021 +1498 1027 +1499 1034 +1500 1017 +1501 1013 +1502 1039 +1503 1029 +1504 1028 +1505 1021 +1506 1032 +1507 1032 +1508 1029 +1509 1030 +1510 1028 +1511 1027 +1512 1027 +1513 1028 +1514 1023 +1515 1027 +1516 1030 +1517 1024 +1518 1033 +1519 1024 +1520 1023 +1521 1029 +1522 1031 +1523 1025 +1524 1030 +1525 1024 +1526 1010 +1527 1043 +1528 1023 +1529 1028 +1530 1025 +1531 1026 +1532 1025 +1533 1029 +1534 1026 +1535 1023 +1536 1023 +1537 1031 +1538 1026 +1539 1028 +1540 1033 +1541 1020 +1542 1030 +1543 1029 +1544 1021 +1545 1039 +1546 1028 +1547 1028 +1548 1033 +1549 1018 +1550 1023 +1551 1005 +1552 1045 +1553 1033 +1554 1034 +1555 1028 +1556 1028 +1557 1028 +1558 1027 +1559 1023 +1560 1026 +1561 1024 +1562 1027 +1563 1028 +1564 1030 +1565 1023 +1566 1032 +1567 1021 +1568 1029 +1569 1027 +1570 1019 +1571 1029 +1572 1029 +1573 1020 +1574 1032 +1575 1019 +1576 1012 +1577 1058 +1578 1045 +1579 1034 +1580 1031 +1581 1028 +1582 1030 +1583 1025 +1584 1030 +1585 1026 +1586 1024 +1587 1029 +1588 1023 +1589 1027 +1590 1019 +1591 1026 +1592 1026 +1593 1032 +1594 1021 +1595 1036 +1596 1026 +1597 1035 +1598 1031 +1599 1031 +1600 1034 +1601 1007 +1602 1053 +1603 1039 +1604 1031 +1605 1023 +1606 1027 +1607 1026 +1608 1022 +1609 1032 +1610 1022 +1611 1025 +1612 1028 +1613 1032 +1614 1019 +1615 1023 +1616 1030 +1617 1029 +1618 1036 +1619 1030 +1620 1028 +1621 1035 +1622 1032 +1623 1018 +1624 1034 +1625 1019 +1626 1001 +1627 1043 +1628 1037 +1629 1026 +1630 1030 +1631 1036 +1632 1028 +1633 1029 +1634 1031 +1635 1030 +1636 1031 +1637 1025 +1638 1031 +1639 1029 +1640 1028 +1641 1027 +1642 1028 +1643 1034 +1644 1033 +1645 1033 +1646 1024 +1647 1032 +1648 1031 +1649 1024 +1650 1035 +1651 1009 +1652 1048 +1653 1042 +1654 1029 +1655 1026 +1656 1033 +1657 1031 +1658 1028 +1659 1027 +1660 1032 +1661 1029 +1662 1027 +1663 1025 +1664 1026 +1665 1020 +1666 1031 +1667 1024 +1668 1028 +1669 1021 +1670 1031 +1671 1031 +1672 1029 +1673 1029 +1674 1031 +1675 1022 +1676 1017 +1677 1042 +1678 1035 +1679 1032 +1680 1028 +1681 1030 +1682 1031 +1683 1031 +1684 1026 +1685 1029 +1686 1027 +1687 1032 +1688 1032 +1689 1026 +1690 1031 +1691 1025 +1692 1030 +1693 1024 +1694 1033 +1695 1025 +1696 1025 +1697 1030 +1698 1025 +1699 1028 +1700 1029 +1701 1004 +1702 1046 +1703 1036 +1704 1037 +1705 1033 +1706 1027 +1707 1035 +1708 1029 +1709 1021 +1710 1033 +1711 1031 +1712 1033 +1713 1032 +1714 1031 +1715 1024 +1716 1027 +1717 1027 +1718 1027 +1719 1036 +1720 1034 +1721 1028 +1722 1024 +1723 1030 +1724 1025 +1725 1017 +1726 1012 +1727 1039 +1728 1038 +1729 1033 +1730 1021 +1731 1029 +1732 1034 +1733 1030 +1734 1035 +1735 1026 +1736 1016 +1737 1034 +1738 1029 +1739 1032 +1740 1036 +1741 1027 +1742 1028 +1743 1025 +1744 1028 +1745 1025 +1746 1033 +1747 1028 +1748 1028 +1749 1026 +1750 1023 +1751 1011 +1752 1039 +1753 1026 +1754 1034 +1755 1021 +1756 1029 +1757 1029 +1758 1027 +1759 1020 +1760 1028 +1761 1030 +1762 1032 +1763 1034 +1764 1029 +1765 1025 +1766 1029 +1767 1031 +1768 1026 +1769 1032 +1770 1028 +1771 1034 +1772 1021 +1773 1025 +1774 1031 +1775 1029 +1776 1009 +1777 1052 +1778 1035 +1779 1036 +1780 1035 +1781 1031 +1782 1030 +1783 1030 +1784 1026 +1785 1023 +1786 1035 +1787 1027 +1788 1031 +1789 1027 +1790 1027 +1791 1027 +1792 1032 +1793 1026 +1794 1025 +1795 1028 +1796 1028 +1797 1025 +1798 1031 +1799 1030 +1800 1029 +1801 1003 +1802 1049 +1803 1037 +1804 1035 +1805 1025 +1806 1029 +1807 1030 +1808 1034 +1809 1035 +1810 1026 +1811 1027 +1812 1024 +1813 1027 +1814 1032 +1815 1021 +1816 1025 +1817 1028 +1818 1032 +1819 1027 +1820 1032 +1821 1024 +1822 1032 +1823 1024 +1824 1030 +1825 1030 +1826 1011 +1827 1055 +1828 1043 +1829 1029 +1830 1030 +1831 1025 +1832 1025 +1833 1023 +1834 1034 +1835 1020 +1836 1032 +1837 1021 +1838 1022 +1839 1033 +1840 1024 +1841 1022 +1842 1032 +1843 1024 +1844 1028 +1845 1029 +1846 1023 +1847 1026 +1848 1028 +1849 1027 +1850 1033 +1851 1011 +1852 1057 +1853 1041 +1854 1036 +1855 1026 +1856 1023 +1857 1030 +1858 1025 +1859 1026 +1860 1023 +1861 1022 +1862 1026 +1863 1031 +1864 1021 +1865 1029 +1866 1031 +1867 1022 +1868 1029 +1869 1021 +1870 1024 +1871 1025 +1872 1027 +1873 1037 +1874 1026 +1875 1021 +1876 1010 +1877 1053 +1878 1036 +1879 1035 +1880 1028 +1881 1012 +1882 1031 +1883 1029 +1884 1032 +1885 1028 +1886 1026 +1887 1028 +1888 1023 +1889 1031 +1890 1029 +1891 1034 +1892 1031 +1893 1036 +1894 1027 +1895 1023 +1896 1031 +1897 1031 +1898 1021 +1899 1033 +1900 1020 +1901 1007 +1902 1048 +1903 1033 +1904 1033 +1905 1031 +1906 1023 +1907 1030 +1908 1028 +1909 1029 +1910 1026 +1911 1026 +1912 1036 +1913 1031 +1914 1030 +1915 1027 +1916 1027 +1917 1030 +1918 1020 +1919 1036 +1920 1030 +1921 1025 +1922 1023 +1923 1027 +1924 1024 +1925 1023 +1926 1010 +1927 1046 +1928 1036 +1929 1031 +1930 1021 +1931 1035 +1932 1027 +1933 1029 +1934 1026 +1935 1030 +1936 1026 +1937 1030 +1938 1033 +1939 1019 +1940 1035 +1941 1029 +1942 1033 +1943 1035 +1944 1025 +1945 1023 +1946 1019 +1947 1031 +1948 1023 +1949 1032 +1950 1030 +1951 1006 +1952 1036 +1953 1032 +1954 1031 +1955 1025 +1956 1027 +1957 1033 +1958 1026 +1959 1026 +1960 1023 +1961 1028 +1962 1030 +1963 1034 +1964 1030 +1965 1025 +1966 1035 +1967 1029 +1968 1028 +1969 1025 +1970 1029 +1971 1023 +1972 1035 +1973 1026 +1974 1025 +1975 1022 +1976 1018 +1977 1050 +1978 1034 +1979 1038 +1980 1027 +1981 1030 +1982 1028 +1983 1031 +1984 1020 +1985 1021 +1986 1025 +1987 1027 +1988 1034 +1989 1024 +1990 1032 +1991 1026 +1992 1032 +1993 1035 +1994 1032 +1995 1027 +1996 1028 +1997 1026 +1998 1027 +1999 1029 +2000 1028 +2001 1006 +2002 1041 +2003 1033 +2004 1027 +2005 1028 +2006 1037 +2007 1027 +2008 1028 +2009 1034 +2010 1026 +2011 1032 +2012 1028 +2013 1034 +2014 1037 +2015 1028 +2016 1022 +2017 1024 +2018 1029 +2019 1034 +2020 1036 +2021 1023 +2022 1027 +2023 1026 +2024 1024 +2025 1023 +2026 1006 +2027 1044 +2028 1029 +2029 1032 +2030 1029 +2031 1031 +2032 1026 +2033 1026 +2034 1031 +2035 1025 +2036 1029 +2037 1033 +2038 1024 +2039 1026 +2040 1033 +2041 1034 +2042 1029 +2043 1029 +2044 1027 +2045 1028 +2046 1031 +2047 1026 +2048 1025 +2049 1029 +2050 1031 +2051 1003 +2052 1043 +2053 1032 +2054 1028 +2055 1026 +2056 1026 +2057 1028 +2058 1033 +2059 1024 +2060 1032 +2061 1032 +2062 1032 +2063 1035 +2064 1030 +2065 1028 +2066 1037 +2067 1028 +2068 1029 +2069 1030 +2070 1021 +2071 1025 +2072 1031 +2073 1032 +2074 1019 +2075 1030 +2076 1006 +2077 1049 +2078 1040 +2079 1029 +2080 1022 +2081 1026 +2082 1030 +2083 1024 +2084 1031 +2085 1030 +2086 1022 +2087 1029 +2088 1033 +2089 1024 +2090 1033 +2091 1020 +2092 1035 +2093 1028 +2094 1034 +2095 1019 +2096 1033 +2097 1016 +2098 1035 +2099 1023 +2100 1032 +2101 1016 +2102 1048 +2103 1033 +2104 1035 +2105 1032 +2106 1030 +2107 1024 +2108 1031 +2109 1026 +2110 1023 +2111 1039 +2112 1020 +2113 1027 +2114 1031 +2115 1031 +2116 1027 +2117 1024 +2118 1029 +2119 1032 +2120 1027 +2121 1032 +2122 1026 +2123 1024 +2124 1032 +2125 1028 +2126 1001 +2127 1045 +2128 1031 +2129 1026 +2130 1032 +2131 1023 +2132 1035 +2133 1029 +2134 1028 +2135 1035 +2136 1029 +2137 1026 +2138 1032 +2139 1022 +2140 1026 +2141 1030 +2142 1036 +2143 1027 +2144 1030 +2145 1024 +2146 1032 +2147 1026 +2148 1029 +2149 1026 +2150 1029 +2151 1010 +2152 1049 +2153 1032 +2154 1034 +2155 1026 +2156 1026 +2157 1039 +2158 1026 +2159 1028 +2160 1026 +2161 1029 +2162 1027 +2163 1030 +2164 1028 +2165 1029 +2166 1032 +2167 1026 +2168 1028 +2169 1025 +2170 1029 +2171 1032 +2172 1035 +2173 1031 +2174 1027 +2175 1024 +2176 998 +2177 1043 +2178 1029 +2179 1034 +2180 1031 +2181 1019 +2182 1027 +2183 1029 +2184 1027 +2185 1023 +2186 1026 +2187 1027 +2188 1025 +2189 1024 +2190 1027 +2191 1025 +2192 1028 +2193 1029 +2194 1023 +2195 1030 +2196 1029 +2197 1022 +2198 1035 +2199 1029 +2200 1032 +2201 1011 +2202 1037 +2203 1017 +2204 1024 +2205 1028 +2206 1033 +2207 1030 +2208 1026 +2209 1024 +2210 1032 +2211 1023 +2212 1028 +2213 1029 +2214 1025 +2215 1030 +2216 1026 +2217 1023 +2218 1031 +2219 1029 +2220 1026 +2221 1032 +2222 1028 +2223 1034 +2224 1030 +2225 1032 +2226 1002 +2227 1047 +2228 1028 +2229 1025 +2230 1027 +2231 1031 +2232 1026 +2233 1029 +2234 1036 +2235 1029 +2236 1032 +2237 1031 +2238 1031 +2239 1025 +2240 1033 +2241 1032 +2242 1025 +2243 1026 +2244 1032 +2245 1026 +2246 1028 +2247 1034 +2248 1030 +2249 1028 +2250 1032 +2251 1016 +2252 1049 +2253 1033 +2254 1022 +2255 1026 +2256 1022 +2257 1030 +2258 1033 +2259 1026 +2260 1023 +2261 1025 +2262 1032 +2263 1022 +2264 1028 +2265 1022 +2266 1027 +2267 1033 +2268 1030 +2269 1032 +2270 1026 +2271 1037 +2272 1025 +2273 1022 +2274 1027 +2275 1034 +2276 1015 +2277 1043 +2278 1031 +2279 1034 +2280 1029 +2281 1034 +2282 1029 +2283 1031 +2284 1034 +2285 1021 +2286 1022 +2287 1033 +2288 1022 +2289 1026 +2290 1035 +2291 1026 +2292 1024 +2293 1023 +2294 1024 +2295 1027 +2296 1030 +2297 1034 +2298 1029 +2299 1027 +2300 1033 +2301 1007 +2302 1046 +2303 1035 +2304 1035 +2305 1031 +2306 1025 +2307 1032 +2308 1030 +2309 1019 +2310 1036 +2311 1027 +2312 1020 +2313 1033 +2314 1028 +2315 1028 +2316 1038 +2317 1027 +2318 1032 +2319 1027 +2320 1027 +2321 1028 +2322 1028 +2323 1021 +2324 1034 +2325 1029 +2326 1000 +2327 1033 +2328 1024 +2329 1032 +2330 1023 +2331 1023 +2332 1030 +2333 1022 +2334 1027 +2335 1032 +2336 1025 +2337 1030 +2338 1033 +2339 1019 +2340 1030 +2341 1026 +2342 1025 +2343 1030 +2344 1024 +2345 1036 +2346 1023 +2347 1031 +2348 1025 +2349 1029 +2350 1029 +2351 1019 +2352 1039 +2353 1032 +2354 1026 +2355 1027 +2356 1026 +2357 1028 +2358 1029 +2359 1032 +2360 1031 +2361 1021 +2362 1027 +2363 1022 +2364 1030 +2365 1027 +2366 1022 +2367 1028 +2368 1033 +2369 1025 +2370 1033 +2371 1027 +2372 1030 +2373 1031 +2374 1026 +2375 1027 +2376 1009 +2377 1045 +2378 1039 +2379 1027 +2380 1036 +2381 1026 +2382 1036 +2383 1025 +2384 1023 +2385 1027 +2386 1033 +2387 1028 +2388 1025 +2389 1028 +2390 1030 +2391 1027 +2392 1029 +2393 1020 +2394 1038 +2395 1027 +2396 1032 +2397 1036 +2398 1028 +2399 1024 +2400 1025 +2401 1012 +2402 1043 +2403 1036 +2404 1034 +2405 1030 +2406 1029 +2407 1036 +2408 1023 +2409 1023 +2410 1028 +2411 1030 +2412 1033 +2413 1024 +2414 1025 +2415 1034 +2416 1031 +2417 1033 +2418 1028 +2419 1026 +2420 1027 +2421 1030 +2422 1032 +2423 1027 +2424 1028 +2425 1030 +2426 1011 +2427 1038 +2428 1033 +2429 1030 +2430 1015 +2431 1029 +2432 1027 +2433 1029 +2434 1030 +2435 1023 +2436 1028 +2437 1029 +2438 1025 +2439 1022 +2440 1031 +2441 1022 +2442 1035 +2443 1039 +2444 1022 +2445 1027 +2446 1026 +2447 1030 +2448 1028 +2449 1029 +2450 1024 +2451 1006 +2452 1053 +2453 1042 +2454 1029 +2455 1022 +2456 1029 +2457 1035 +2458 1028 +2459 1029 +2460 1030 +2461 1025 +2462 1023 +2463 1034 +2464 1031 +2465 1030 +2466 1024 +2467 1029 +2468 1027 +2469 1027 +2470 1032 +2471 1026 +2472 1031 +2473 1021 +2474 1029 +2475 1037 +2476 1009 +2477 1053 +2478 1047 +2479 1030 +2480 1023 +2481 1024 +2482 1033 +2483 1023 +2484 1022 +2485 1033 +2486 1021 +2487 1030 +2488 1029 +2489 1019 +2490 1036 +2491 1022 +2492 1030 +2493 1023 +2494 1029 +2495 1026 +2496 1033 +2497 1024 +2498 1033 +2499 1034 +2500 1034 +2501 1006 +2502 1046 +2503 1036 +2504 1036 +2505 1025 +2506 1028 +2507 1032 +2508 1022 +2509 1017 +2510 1036 +2511 1028 +2512 1029 +2513 1026 +2514 1035 +2515 1030 +2516 1022 +2517 1026 +2518 1031 +2519 1025 +2520 1028 +2521 1030 +2522 1029 +2523 1029 +2524 1027 +2525 1025 +2526 1014 +2527 1039 +2528 1035 +2529 1035 +2530 1017 +2531 1029 +2532 1029 +2533 1028 +2534 1030 +2535 1028 +2536 1030 +2537 1034 +2538 1022 +2539 1031 +2540 1032 +2541 1018 +2542 1029 +2543 1024 +2544 1032 +2545 1031 +2546 1021 +2547 1030 +2548 1026 +2549 1024 +2550 1037 +2551 1011 +2552 1047 +2553 1035 +2554 1034 +2555 1030 +2556 1021 +2557 1030 +2558 1024 +2559 1024 +2560 1027 +2561 1026 +2562 1032 +2563 1030 +2564 1029 +2565 1035 +2566 1025 +2567 1024 +2568 1036 +2569 1024 +2570 1022 +2571 1027 +2572 1033 +2573 1029 +2574 1026 +2575 1031 +2576 1010 +2577 1046 +2578 1033 +2579 1033 +2580 1035 +2581 1028 +2582 1021 +2583 1026 +2584 1023 +2585 1033 +2586 1030 +2587 1025 +2588 1029 +2589 1030 +2590 1021 +2591 1034 +2592 1026 +2593 1027 +2594 1021 +2595 1029 +2596 1024 +2597 1027 +2598 1029 +2599 1024 +2600 1037 +2601 1006 +2602 1047 +2603 1032 +2604 1029 +2605 1019 +2606 1022 +2607 1031 +2608 1023 +2609 1036 +2610 1031 +2611 1025 +2612 1034 +2613 1029 +2614 1024 +2615 1023 +2616 1028 +2617 1024 +2618 1031 +2619 1026 +2620 1027 +2621 1034 +2622 1028 +2623 1025 +2624 1029 +2625 1024 +2626 1015 +2627 1040 +2628 1020 +2629 1029 +2630 1024 +2631 1028 +2632 1033 +2633 1023 +2634 1030 +2635 1030 +2636 1025 +2637 1026 +2638 1038 +2639 1024 +2640 1024 +2641 1031 +2642 1018 +2643 1034 +2644 1033 +2645 1026 +2646 1027 +2647 1024 +2648 1023 +2649 1028 +2650 1031 +2651 1002 +2652 1045 +2653 1036 +2654 1030 +2655 1021 +2656 1032 +2657 1034 +2658 1025 +2659 1030 +2660 1025 +2661 1030 +2662 1032 +2663 1023 +2664 1026 +2665 1028 +2666 1033 +2667 1036 +2668 1024 +2669 1025 +2670 1026 +2671 1034 +2672 1030 +2673 1026 +2674 1026 +2675 1030 +2676 996 +2677 1038 +2678 1032 +2679 1033 +2680 1028 +2681 1022 +2682 1037 +2683 1024 +2684 1032 +2685 1035 +2686 1030 +2687 1021 +2688 1033 +2689 1032 +2690 1026 +2691 1032 +2692 1024 +2693 1031 +2694 1035 +2695 1027 +2696 1031 +2697 1027 +2698 1031 +2699 1027 +2700 1030 +2701 1005 +2702 1049 +2703 1034 +2704 1033 +2705 1036 +2706 1028 +2707 1022 +2708 1028 +2709 1029 +2710 1026 +2711 1031 +2712 1027 +2713 1031 +2714 1028 +2715 1028 +2716 1031 +2717 1029 +2718 1032 +2719 1019 +2720 1030 +2721 1037 +2722 1029 +2723 1030 +2724 1025 +2725 1026 +2726 1015 +2727 1049 +2728 1037 +2729 1037 +2730 1029 +2731 1027 +2732 1031 +2733 1029 +2734 1027 +2735 1024 +2736 1029 +2737 1027 +2738 1031 +2739 1031 +2740 1021 +2741 1031 +2742 1020 +2743 1026 +2744 1028 +2745 1024 +2746 1030 +2747 1025 +2748 1028 +2749 1030 +2750 1027 +2751 1009 +2752 1043 +2753 1027 +2754 1031 +2755 1019 +2756 1025 +2757 1033 +2758 1022 +2759 1025 +2760 1034 +2761 1025 +2762 1030 +2763 1024 +2764 1027 +2765 1024 +2766 1023 +2767 1033 +2768 1025 +2769 1031 +2770 1024 +2771 1027 +2772 1026 +2773 1022 +2774 1026 +2775 1029 +2776 1008 +2777 1041 +2778 1034 +2779 1036 +2780 1024 +2781 1025 +2782 1030 +2783 1026 +2784 1030 +2785 1038 +2786 1022 +2787 1029 +2788 1032 +2789 1017 +2790 1028 +2791 1025 +2792 1028 +2793 1026 +2794 1032 +2795 1025 +2796 1030 +2797 1032 +2798 1028 +2799 1038 +2800 1030 +2801 1008 +2802 1046 +2803 1032 +2804 1030 +2805 1034 +2806 1022 +2807 1030 +2808 1029 +2809 1027 +2810 1027 +2811 1024 +2812 1024 +2813 1023 +2814 1025 +2815 1025 +2816 1028 +2817 1024 +2818 1033 +2819 1023 +2820 1027 +2821 1033 +2822 1024 +2823 1024 +2824 1027 +2825 1025 +2826 1009 +2827 1040 +2828 1034 +2829 1029 +2830 1029 +2831 1030 +2832 1032 +2833 1031 +2834 1024 +2835 1023 +2836 1024 +2837 1028 +2838 1029 +2839 1023 +2840 1034 +2841 1032 +2842 1029 +2843 1040 +2844 1030 +2845 1024 +2846 1037 +2847 1031 +2848 1027 +2849 1025 +2850 1030 +2851 1006 +2852 1042 +2853 1032 +2854 1026 +2855 1030 +2856 1032 +2857 1030 +2858 1028 +2859 1035 +2860 1018 +2861 1024 +2862 1029 +2863 1027 +2864 1028 +2865 1025 +2866 1035 +2867 1032 +2868 1027 +2869 1026 +2870 1036 +2871 1028 +2872 1025 +2873 1029 +2874 1031 +2875 1021 +2876 1009 +2877 1044 +2878 1029 +2879 1036 +2880 1032 +2881 1028 +2882 1029 +2883 1031 +2884 1026 +2885 1026 +2886 1027 +2887 1029 +2888 1017 +2889 1035 +2890 1028 +2891 1026 +2892 1031 +2893 1025 +2894 1027 +2895 1029 +2896 1030 +2897 1026 +2898 1022 +2899 1030 +2900 1023 +2901 1009 +2902 1040 +2903 1036 +2904 1035 +2905 1023 +2906 1031 +2907 1027 +2908 1025 +2909 1030 +2910 1030 +2911 1024 +2912 1026 +2913 1028 +2914 1024 +2915 1031 +2916 1024 +2917 1024 +2918 1032 +2919 1031 +2920 1023 +2921 1031 +2922 1026 +2923 1032 +2924 1027 +2925 1025 +2926 1009 +2927 1038 +2928 1025 +2929 1022 +2930 1025 +2931 1025 +2932 1030 +2933 1031 +2934 1028 +2935 1024 +2936 1028 +2937 1027 +2938 1031 +2939 1029 +2940 1023 +2941 1026 +2942 1031 +2943 1029 +2944 1030 +2945 1020 +2946 1033 +2947 1024 +2948 1021 +2949 1029 +2950 1029 +2951 1011 +2952 1054 +2953 1040 +2954 1032 +2955 1024 +2956 1030 +2957 1034 +2958 1027 +2959 1033 +2960 1031 +2961 1031 +2962 1023 +2963 1028 +2964 1036 +2965 1028 +2966 1020 +2967 1031 +2968 1029 +2969 1026 +2970 1027 +2971 1030 +2972 1019 +2973 1025 +2974 1023 +2975 1023 +2976 1011 +2977 1052 +2978 1040 +2979 1033 +2980 1036 +2981 1023 +2982 1024 +2983 1027 +2984 1026 +2985 1031 +2986 1028 +2987 1034 +2988 1023 +2989 1029 +2990 1026 +2991 1018 +2992 1037 +2993 1024 +2994 1030 +2995 1025 +2996 1030 +2997 1030 +2998 1025 +2999 1022 +3000 1036 +3001 1003 +3002 1046 +3003 1033 +3004 1025 +3005 1035 +3006 1024 +3007 1020 +3008 1034 +3009 1024 +3010 1024 +3011 1032 +3012 1019 +3013 1027 +3014 1033 +3015 1029 +3016 1024 +3017 1027 +3018 1030 +3019 1027 +3020 1021 +3021 1032 +3022 1031 +3023 1025 +3024 1032 +3025 1024 +3026 1006 +3027 1049 +3028 1030 +3029 1033 +3030 1028 +3031 1041 +3032 1031 +3033 1030 +3034 1024 +3035 1028 +3036 1026 +3037 1032 +3038 1035 +3039 1027 +3040 1028 +3041 1035 +3042 1031 +3043 1021 +3044 1029 +3045 1029 +3046 1025 +3047 1022 +3048 1030 +3049 1026 +3050 1027 +3051 1006 +3052 1043 +3053 1033 +3054 1037 +3055 1022 +3056 1040 +3057 1022 +3058 1022 +3059 1032 +3060 1030 +3061 1031 +3062 1023 +3063 1022 +3064 1032 +3065 1033 +3066 1032 +3067 1026 +3068 1031 +3069 1029 +3070 1028 +3071 1026 +3072 1032 +3073 1037 +3074 1032 +3075 1018 +3076 1009 +3077 1052 +3078 1035 +3079 1033 +3080 1031 +3081 1029 +3082 1029 +3083 1023 +3084 1032 +3085 1029 +3086 1029 +3087 1036 +3088 1019 +3089 1029 +3090 1030 +3091 1020 +3092 1037 +3093 1027 +3094 1021 +3095 1034 +3096 1029 +3097 1032 +3098 1031 +3099 1027 +3100 1020 +3101 1011 +3102 1048 +3103 1038 +3104 1026 +3105 1027 +3106 1021 +3107 1027 +3108 1030 +3109 1027 +3110 1027 +3111 1026 +3112 1028 +3113 1034 +3114 1033 +3115 1021 +3116 1032 +3117 1025 +3118 1027 +3119 1024 +3120 1020 +3121 1030 +3122 1029 +3123 1030 +3124 1028 +3125 1025 +3126 1011 +3127 1042 +3128 1038 +3129 1038 +3130 1024 +3131 1027 +3132 1035 +3133 1024 +3134 1032 +3135 1032 +3136 1024 +3137 1022 +3138 1029 +3139 1027 +3140 1016 +3141 1034 +3142 1023 +3143 1026 +3144 1032 +3145 1022 +3146 1022 +3147 1028 +3148 1016 +3149 1034 +3150 1027 +3151 1007 +3152 1044 +3153 1032 +3154 1032 +3155 1031 +3156 1020 +3157 1034 +3158 1023 +3159 1030 +3160 1023 +3161 1021 +3162 1032 +3163 1031 +3164 1028 +3165 1026 +3166 1031 +3167 1020 +3168 1031 +3169 1024 +3170 1024 +3171 1028 +3172 1026 +3173 1035 +3174 1025 +3175 1030 +3176 1014 +3177 1050 +3178 1033 +3179 1039 +3180 1023 +3181 1026 +3182 1027 +3183 1023 +3184 1029 +3185 1029 +3186 1028 +3187 1022 +3188 1031 +3189 1026 +3190 1032 +3191 1026 +3192 1029 +3193 1022 +3194 1023 +3195 1033 +3196 1028 +3197 1029 +3198 1021 +3199 1030 +3200 1028 +3201 1010 +3202 1043 +3203 1030 +3204 1021 +3205 1029 +3206 1015 +3207 1028 +3208 1027 +3209 1027 +3210 1032 +3211 1026 +3212 1032 +3213 1032 +3214 1025 +3215 1025 +3216 1031 +3217 1026 +3218 1024 +3219 1030 +3220 1026 +3221 1024 +3222 1024 +3223 1036 +3224 1033 +3225 1028 +3226 1011 +3227 1043 +3228 1037 +3229 1040 +3230 1029 +3231 1024 +3232 1036 +3233 1027 +3234 1022 +3235 1027 +3236 1039 +3237 1030 +3238 1028 +3239 1026 +3240 1028 +3241 1027 +3242 1027 +3243 1026 +3244 1026 +3245 1033 +3246 1029 +3247 1019 +3248 1029 +3249 1023 +3250 1031 +3251 1006 +3252 1039 +3253 1029 +3254 1027 +3255 1024 +3256 1032 +3257 1031 +3258 1024 +3259 1024 +3260 1028 +3261 1021 +3262 1030 +3263 1028 +3264 1031 +3265 1026 +3266 1028 +3267 1029 +3268 1026 +3269 1027 +3270 1015 +3271 1033 +3272 1028 +3273 1025 +3274 1035 +3275 1017 +3276 1011 +3277 1040 +3278 1026 +3279 1035 +3280 1027 +3281 1024 +3282 1028 +3283 1026 +3284 1027 +3285 1025 +3286 1031 +3287 1029 +3288 1029 +3289 1028 +3290 1027 +3291 1028 +3292 1033 +3293 1030 +3294 1028 +3295 1033 +3296 1025 +3297 1027 +3298 1028 +3299 1024 +3300 1030 +3301 1011 +3302 1047 +3303 1036 +3304 1036 +3305 1027 +3306 1025 +3307 1032 +3308 1027 +3309 1030 +3310 1027 +3311 1025 +3312 1029 +3313 1025 +3314 1025 +3315 1033 +3316 1023 +3317 1032 +3318 1029 +3319 1035 +3320 1035 +3321 1035 +3322 1031 +3323 1032 +3324 1027 +3325 1033 +3326 1009 +3327 1051 +3328 1036 +3329 1033 +3330 1029 +3331 1030 +3332 1032 +3333 1028 +3334 1036 +3335 1026 +3336 1030 +3337 1028 +3338 1034 +3339 1029 +3340 1023 +3341 1026 +3342 1024 +3343 1024 +3344 1026 +3345 1027 +3346 1033 +3347 1028 +3348 1031 +3349 1034 +3350 1027 +3351 1012 +3352 1052 +3353 1037 +3354 1036 +3355 1029 +3356 1027 +3357 1034 +3358 1025 +3359 1026 +3360 1027 +3361 1021 +3362 1032 +3363 1030 +3364 1031 +3365 1022 +3366 1024 +3367 1021 +3368 1025 +3369 1034 +3370 1019 +3371 1030 +3372 1028 +3373 1027 +3374 1032 +3375 1027 +3376 1008 +3377 1047 +3378 1030 +3379 1032 +3380 1031 +3381 1024 +3382 1028 +3383 1029 +3384 1034 +3385 1029 +3386 1023 +3387 1027 +3388 1031 +3389 1026 +3390 1029 +3391 1030 +3392 1024 +3393 1028 +3394 1028 +3395 1029 +3396 1020 +3397 1032 +3398 1026 +3399 1024 +3400 1035 +3401 1014 +3402 1046 +3403 1038 +3404 1036 +3405 1024 +3406 1029 +3407 1029 +3408 1028 +3409 1030 +3410 1033 +3411 1024 +3412 1030 +3413 1027 +3414 1028 +3415 1023 +3416 1032 +3417 1030 +3418 1031 +3419 1026 +3420 1032 +3421 1027 +3422 1028 +3423 1026 +3424 1027 +3425 1036 +3426 1010 +3427 1040 +3428 1032 +3429 1032 +3430 1028 +3431 1030 +3432 1036 +3433 1033 +3434 1024 +3435 1029 +3436 1031 +3437 1026 +3438 1028 +3439 1028 +3440 1035 +3441 1025 +3442 1022 +3443 1034 +3444 1034 +3445 1025 +3446 1024 +3447 1027 +3448 1026 +3449 1039 +3450 1028 +3451 1007 +3452 1053 +3453 1037 +3454 1035 +3455 1027 +3456 1027 +3457 1029 +3458 1034 +3459 1028 +3460 1022 +3461 1029 +3462 1026 +3463 1027 +3464 1029 +3465 1035 +3466 1036 +3467 1020 +3468 1028 +3469 1030 +3470 1020 +3471 1033 +3472 1022 +3473 1038 +3474 1025 +3475 1030 +3476 1007 +3477 1050 +3478 1041 +3479 1031 +3480 1033 +3481 1024 +3482 1022 +3483 1027 +3484 1025 +3485 1030 +3486 1032 +3487 1026 +3488 1023 +3489 1031 +3490 1029 +3491 1037 +3492 1029 +3493 1024 +3494 1023 +3495 1025 +3496 1032 +3497 1032 +3498 1021 +3499 1033 +3500 1023 +3501 1011 +3502 1051 +3503 1043 +3504 1032 +3505 1026 +3506 1034 +3507 1032 +3508 1023 +3509 1022 +3510 1031 +3511 1030 +3512 1029 +3513 1026 +3514 1030 +3515 1029 +3516 1026 +3517 1028 +3518 1027 +3519 1028 +3520 1029 +3521 1023 +3522 1021 +3523 1025 +3524 1030 +3525 1025 +3526 1006 +3527 1043 +3528 1029 +3529 1035 +3530 1027 +3531 1022 +3532 1035 +3533 1030 +3534 1024 +3535 1024 +3536 1032 +3537 1022 +3538 1036 +3539 1033 +3540 1028 +3541 1034 +3542 1030 +3543 1028 +3544 1028 +3545 1026 +3546 1027 +3547 1028 +3548 1033 +3549 1029 +3550 1030 +3551 1004 +3552 1048 +3553 1035 +3554 1026 +3555 1024 +3556 1028 +3557 1024 +3558 1028 +3559 1028 +3560 1031 +3561 1023 +3562 1024 +3563 1027 +3564 1029 +3565 1034 +3566 1032 +3567 1031 +3568 1025 +3569 1031 +3570 1030 +3571 1020 +3572 1036 +3573 1026 +3574 1032 +3575 1031 +3576 1000 +3577 1043 +3578 1024 +3579 1030 +3580 1038 +3581 1030 +3582 1024 +3583 1033 +3584 1029 +3585 1031 +3586 1026 +3587 1033 +3588 1025 +3589 1029 +3590 1029 +3591 1023 +3592 1032 +3593 1030 +3594 1027 +3595 1032 +3596 1031 +3597 1029 +3598 1030 +3599 1026 +3600 1023 +3601 1020 +3602 1046 +3603 1037 +3604 1041 +3605 1028 +3606 1020 +3607 1036 +3608 1020 +3609 1024 +3610 1033 +3611 1025 +3612 1036 +3613 1028 +3614 1029 +3615 1034 +3616 1031 +3617 1029 +3618 1031 +3619 1030 +3620 1028 +3621 1028 +3622 1029 +3623 1022 +3624 1024 +3625 1028 +3626 1006 +3627 1045 +3628 1038 +3629 1034 +3630 1023 +3631 1025 +3632 1021 +3633 1036 +3634 1023 +3635 1033 +3636 1025 +3637 1028 +3638 1026 +3639 1027 +3640 1033 +3641 1028 +3642 1033 +3643 1035 +3644 1030 +3645 1024 +3646 1028 +3647 1033 +3648 1024 +3649 1032 +3650 1042 +3651 1012 +3652 1047 +3653 1036 +3654 1029 +3655 1028 +3656 1028 +3657 1023 +3658 1035 +3659 1034 +3660 1023 +3661 1030 +3662 1032 +3663 1024 +3664 1033 +3665 1024 +3666 1024 +3667 1029 +3668 1028 +3669 1025 +3670 1024 +3671 1026 +3672 1026 +3673 1037 +3674 1026 +3675 1028 +3676 1012 +3677 1049 +3678 1031 +3679 1029 +3680 1022 +3681 1034 +3682 1026 +3683 1024 +3684 1036 +3685 1033 +3686 1021 +3687 1036 +3688 1025 +3689 1024 +3690 1033 +3691 1028 +3692 1030 +3693 1034 +3694 1030 diff --git a/output.dat b/output.dat new file mode 100644 index 0000000..42f5963 --- /dev/null +++ b/output.dat @@ -0,0 +1,3698 @@ +#Data from the TCD1304 linear CCD +#column 1 = pixelnumber, column 2 = pixelvalue +#Pixel 1-32 and 3679-3694 and are dummy pixels +#SH-period: 100 ICG-period: 2000000 Integration time: 50 us +1 1027 +2 411 +3 561 +4 690 +5 782 +6 851 +7 901 +8 935 +9 957 +10 978 +11 1002 +12 1012 +13 1019 +14 1026 +15 1027 +16 1024 +17 1030 +18 1028 +19 1023 +20 1028 +21 1027 +22 1027 +23 1033 +24 1025 +25 1033 +26 1005 +27 1049 +28 1034 +29 1035 +30 1029 +31 1027 +32 1035 +33 1035 +34 1031 +35 1030 +36 1020 +37 1031 +38 1034 +39 1022 +40 1030 +41 1021 +42 1031 +43 1026 +44 1025 +45 1034 +46 1025 +47 1035 +48 1030 +49 1029 +50 1029 +51 1006 +52 1045 +53 1031 +54 1028 +55 1026 +56 1033 +57 1025 +58 1038 +59 1031 +60 1028 +61 1029 +62 1019 +63 1027 +64 1028 +65 1030 +66 1038 +67 1029 +68 1023 +69 1033 +70 1021 +71 1024 +72 1023 +73 1029 +74 1032 +75 1031 +76 1008 +77 1050 +78 1044 +79 1032 +80 1029 +81 1028 +82 1030 +83 1025 +84 1024 +85 1023 +86 1028 +87 1038 +88 1030 +89 1029 +90 1030 +91 1028 +92 1029 +93 1032 +94 1024 +95 1030 +96 1029 +97 1034 +98 1025 +99 1027 +100 1032 +101 1007 +102 1049 +103 1031 +104 1028 +105 1027 +106 1034 +107 1032 +108 1037 +109 1030 +110 1028 +111 1033 +112 1031 +113 1024 +114 1036 +115 1025 +116 1025 +117 1033 +118 1026 +119 1032 +120 1029 +121 1027 +122 1029 +123 1027 +124 1025 +125 1032 +126 1017 +127 1041 +128 1028 +129 1026 +130 1032 +131 1030 +132 1031 +133 1031 +134 1029 +135 1023 +136 1030 +137 1034 +138 1031 +139 1030 +140 1029 +141 1024 +142 1024 +143 1033 +144 1030 +145 1028 +146 1036 +147 1030 +148 1025 +149 1030 +150 1029 +151 1008 +152 1042 +153 1036 +154 1035 +155 1028 +156 1030 +157 1032 +158 1030 +159 1032 +160 1026 +161 1034 +162 1026 +163 1031 +164 1027 +165 1034 +166 1029 +167 1028 +168 1028 +169 1025 +170 1027 +171 1031 +172 1018 +173 1033 +174 1038 +175 1022 +176 1012 +177 1046 +178 1033 +179 1024 +180 1023 +181 1027 +182 1027 +183 1019 +184 1034 +185 1031 +186 1024 +187 1029 +188 1028 +189 1028 +190 1030 +191 1027 +192 1029 +193 1027 +194 1027 +195 1022 +196 1027 +197 1029 +198 1030 +199 1030 +200 1031 +201 1012 +202 1044 +203 1028 +204 1033 +205 1020 +206 1027 +207 1033 +208 1026 +209 1024 +210 1026 +211 1027 +212 1028 +213 1034 +214 1027 +215 1032 +216 1026 +217 1029 +218 1026 +219 1027 +220 1019 +221 1032 +222 1035 +223 1031 +224 1031 +225 1036 +226 1007 +227 1053 +228 1035 +229 1028 +230 1026 +231 1032 +232 1035 +233 1019 +234 1027 +235 1025 +236 1027 +237 1029 +238 1038 +239 1027 +240 1026 +241 1032 +242 1033 +243 1027 +244 1026 +245 1027 +246 1031 +247 1028 +248 1031 +249 1026 +250 1025 +251 1015 +252 1043 +253 1031 +254 1024 +255 1025 +256 1030 +257 1032 +258 1026 +259 1031 +260 1027 +261 1033 +262 1029 +263 1028 +264 1026 +265 1025 +266 1033 +267 1022 +268 1021 +269 1030 +270 1029 +271 1034 +272 1028 +273 1020 +274 1028 +275 1027 +276 1010 +277 1052 +278 1037 +279 1032 +280 1031 +281 1027 +282 1024 +283 1031 +284 1035 +285 1027 +286 1032 +287 1023 +288 1030 +289 1027 +290 1029 +291 1028 +292 1030 +293 1029 +294 1031 +295 1020 +296 1029 +297 1036 +298 1025 +299 1026 +300 1028 +301 1006 +302 1044 +303 1035 +304 1034 +305 1029 +306 1030 +307 1020 +308 1032 +309 1033 +310 1024 +311 1043 +312 1032 +313 1030 +314 1025 +315 1022 +316 1031 +317 1028 +318 1025 +319 1034 +320 1030 +321 1027 +322 1030 +323 1031 +324 1027 +325 1032 +326 1017 +327 1043 +328 1024 +329 1034 +330 1026 +331 1031 +332 1035 +333 1027 +334 1021 +335 1032 +336 1023 +337 1031 +338 1029 +339 1027 +340 1027 +341 1034 +342 1025 +343 1023 +344 1026 +345 1031 +346 1029 +347 1028 +348 1024 +349 1028 +350 1031 +351 1006 +352 1044 +353 1035 +354 1029 +355 1031 +356 1027 +357 1027 +358 1035 +359 1028 +360 1030 +361 1039 +362 1028 +363 1028 +364 1025 +365 1028 +366 1027 +367 1025 +368 1019 +369 1032 +370 1025 +371 1023 +372 1031 +373 1032 +374 1023 +375 1027 +376 1009 +377 1048 +378 1044 +379 1035 +380 1026 +381 1034 +382 1028 +383 1023 +384 1028 +385 1028 +386 1036 +387 1025 +388 1024 +389 1029 +390 1030 +391 1036 +392 1024 +393 1029 +394 1023 +395 1031 +396 1025 +397 1030 +398 1020 +399 1031 +400 1028 +401 1007 +402 1045 +403 1040 +404 1032 +405 1029 +406 1024 +407 1024 +408 1024 +409 1031 +410 1028 +411 1026 +412 1027 +413 1030 +414 1035 +415 1030 +416 1024 +417 1025 +418 1032 +419 1025 +420 1029 +421 1027 +422 1022 +423 1032 +424 1025 +425 1025 +426 1009 +427 1054 +428 1046 +429 1040 +430 1034 +431 1026 +432 1026 +433 1025 +434 1030 +435 1024 +436 1025 +437 1030 +438 1027 +439 1028 +440 1020 +441 1020 +442 1033 +443 1024 +444 1020 +445 1038 +446 1032 +447 1023 +448 1036 +449 1027 +450 1025 +451 1010 +452 1039 +453 1030 +454 1031 +455 1023 +456 1024 +457 1027 +458 1026 +459 1026 +460 1024 +461 1034 +462 1027 +463 1035 +464 1031 +465 1031 +466 1025 +467 1029 +468 1030 +469 1036 +470 1024 +471 1025 +472 1029 +473 1031 +474 1029 +475 1026 +476 1005 +477 1039 +478 1018 +479 1038 +480 1030 +481 1032 +482 1027 +483 1033 +484 1035 +485 1039 +486 1033 +487 1028 +488 1022 +489 1022 +490 1030 +491 1032 +492 1027 +493 1029 +494 1030 +495 1029 +496 1036 +497 1032 +498 1029 +499 1027 +500 1031 +501 1014 +502 1042 +503 1033 +504 1034 +505 1027 +506 1028 +507 1029 +508 1030 +509 1024 +510 1031 +511 1024 +512 1028 +513 1027 +514 1024 +515 1033 +516 1025 +517 1037 +518 1027 +519 1029 +520 1033 +521 1020 +522 1020 +523 1025 +524 1030 +525 1023 +526 1011 +527 1039 +528 1030 +529 1032 +530 1024 +531 1028 +532 1023 +533 1031 +534 1027 +535 1024 +536 1025 +537 1034 +538 1026 +539 1028 +540 1029 +541 1021 +542 1026 +543 1031 +544 1026 +545 1035 +546 1028 +547 1029 +548 1033 +549 1024 +550 1026 +551 1009 +552 1043 +553 1031 +554 1038 +555 1026 +556 1019 +557 1035 +558 1023 +559 1025 +560 1033 +561 1020 +562 1029 +563 1034 +564 1024 +565 1032 +566 1034 +567 1029 +568 1035 +569 1036 +570 1028 +571 1026 +572 1032 +573 1028 +574 1035 +575 1033 +576 1008 +577 1046 +578 1033 +579 1036 +580 1030 +581 1033 +582 1022 +583 1025 +584 1034 +585 1025 +586 1031 +587 1029 +588 1028 +589 1034 +590 1020 +591 1029 +592 1023 +593 1028 +594 1032 +595 1031 +596 1031 +597 1028 +598 1026 +599 1029 +600 1033 +601 1000 +602 1048 +603 1034 +604 1032 +605 1027 +606 1032 +607 1027 +608 1024 +609 1024 +610 1031 +611 1033 +612 1018 +613 1026 +614 1030 +615 1030 +616 1028 +617 1029 +618 1022 +619 1035 +620 1028 +621 1030 +622 1032 +623 1028 +624 1034 +625 1025 +626 1009 +627 1044 +628 1031 +629 1025 +630 1027 +631 1029 +632 1026 +633 1034 +634 1024 +635 1031 +636 1030 +637 1033 +638 1031 +639 1029 +640 1028 +641 1020 +642 1024 +643 1024 +644 1024 +645 1032 +646 1025 +647 1030 +648 1028 +649 1025 +650 1030 +651 1019 +652 1046 +653 1037 +654 1037 +655 1031 +656 1016 +657 1031 +658 1022 +659 1034 +660 1030 +661 1022 +662 1032 +663 1027 +664 1028 +665 1027 +666 1025 +667 1031 +668 1026 +669 1031 +670 1029 +671 1030 +672 1030 +673 1032 +674 1030 +675 1025 +676 1015 +677 1049 +678 1032 +679 1035 +680 1031 +681 1033 +682 1030 +683 1024 +684 1034 +685 1030 +686 1034 +687 1032 +688 1031 +689 1020 +690 1035 +691 1025 +692 1028 +693 1031 +694 1029 +695 1017 +696 1030 +697 1028 +698 1034 +699 1033 +700 1030 +701 1006 +702 1044 +703 1035 +704 1035 +705 1026 +706 1018 +707 1030 +708 1028 +709 1032 +710 1022 +711 1031 +712 1024 +713 1024 +714 1029 +715 1030 +716 1026 +717 1030 +718 1022 +719 1030 +720 1033 +721 1028 +722 1027 +723 1027 +724 1026 +725 1023 +726 1008 +727 1042 +728 1037 +729 1039 +730 1028 +731 1032 +732 1027 +733 1023 +734 1036 +735 1037 +736 1026 +737 1030 +738 1021 +739 1024 +740 1031 +741 1032 +742 1030 +743 1025 +744 1027 +745 1032 +746 1027 +747 1030 +748 1029 +749 1034 +750 1031 +751 1010 +752 1045 +753 1036 +754 1031 +755 1029 +756 1029 +757 1025 +758 1031 +759 1027 +760 1030 +761 1035 +762 1030 +763 1020 +764 1037 +765 1030 +766 1029 +767 1028 +768 1028 +769 1030 +770 1031 +771 1032 +772 1029 +773 1028 +774 1030 +775 1033 +776 1003 +777 1041 +778 1039 +779 1033 +780 1024 +781 1027 +782 1025 +783 1038 +784 1029 +785 1030 +786 1032 +787 1027 +788 1024 +789 1024 +790 1029 +791 1031 +792 1026 +793 1017 +794 1027 +795 1027 +796 1035 +797 1030 +798 1021 +799 1033 +800 1033 +801 1004 +802 1043 +803 1026 +804 1030 +805 1028 +806 1027 +807 1035 +808 1033 +809 1030 +810 1024 +811 1031 +812 1031 +813 1029 +814 1026 +815 1027 +816 1037 +817 1029 +818 1022 +819 1036 +820 1027 +821 1033 +822 1026 +823 1032 +824 1034 +825 1029 +826 1008 +827 1049 +828 1035 +829 1032 +830 1031 +831 1029 +832 1023 +833 1031 +834 1030 +835 1028 +836 1029 +837 1034 +838 1030 +839 1029 +840 1026 +841 1028 +842 1029 +843 1022 +844 1026 +845 1033 +846 1031 +847 1022 +848 1037 +849 1026 +850 1035 +851 1012 +852 1045 +853 1030 +854 1033 +855 1022 +856 1030 +857 1029 +858 1031 +859 1027 +860 1031 +861 1031 +862 1021 +863 1031 +864 1028 +865 1024 +866 1030 +867 1024 +868 1029 +869 1029 +870 1033 +871 1031 +872 1025 +873 1030 +874 1029 +875 1027 +876 1008 +877 1041 +878 1024 +879 1024 +880 1028 +881 1025 +882 1028 +883 1029 +884 1024 +885 1028 +886 1030 +887 1028 +888 1025 +889 1034 +890 1027 +891 1028 +892 1029 +893 1030 +894 1024 +895 1028 +896 1032 +897 1027 +898 1024 +899 1028 +900 1026 +901 1011 +902 1049 +903 1032 +904 1027 +905 1031 +906 1035 +907 1031 +908 1026 +909 1033 +910 1030 +911 1027 +912 1028 +913 1030 +914 1032 +915 1026 +916 1024 +917 1032 +918 1030 +919 1031 +920 1032 +921 1031 +922 1028 +923 1029 +924 1022 +925 1034 +926 1008 +927 1044 +928 1038 +929 1031 +930 1027 +931 1028 +932 1028 +933 1033 +934 1032 +935 1027 +936 1028 +937 1027 +938 1030 +939 1033 +940 1024 +941 1032 +942 1023 +943 1034 +944 1027 +945 1026 +946 1026 +947 1024 +948 1029 +949 1035 +950 1028 +951 1015 +952 1048 +953 1031 +954 1031 +955 1029 +956 1021 +957 1036 +958 1024 +959 1029 +960 1020 +961 1030 +962 1026 +963 1031 +964 1030 +965 1028 +966 1030 +967 1026 +968 1027 +969 1025 +970 1027 +971 1025 +972 1023 +973 1030 +974 1027 +975 1024 +976 1009 +977 1045 +978 1035 +979 1033 +980 1037 +981 1030 +982 1025 +983 1022 +984 1030 +985 1027 +986 1033 +987 1028 +988 1033 +989 1022 +990 1027 +991 1031 +992 1032 +993 1029 +994 1032 +995 1015 +996 1033 +997 1033 +998 1028 +999 1023 +1000 1032 +1001 1011 +1002 1050 +1003 1040 +1004 1031 +1005 1021 +1006 1028 +1007 1024 +1008 1028 +1009 1023 +1010 1029 +1011 1027 +1012 1027 +1013 1026 +1014 1036 +1015 1020 +1016 1034 +1017 1034 +1018 1022 +1019 1030 +1020 1031 +1021 1028 +1022 1027 +1023 1024 +1024 1021 +1025 1029 +1026 1009 +1027 1052 +1028 1037 +1029 1024 +1030 1028 +1031 1027 +1032 1032 +1033 1027 +1034 1036 +1035 1027 +1036 1030 +1037 1029 +1038 1034 +1039 1026 +1040 1031 +1041 1027 +1042 1024 +1043 1025 +1044 1029 +1045 1025 +1046 1029 +1047 1029 +1048 1034 +1049 1034 +1050 1025 +1051 1012 +1052 1043 +1053 1032 +1054 1035 +1055 1031 +1056 1026 +1057 1032 +1058 1026 +1059 1032 +1060 1025 +1061 1040 +1062 1023 +1063 1027 +1064 1034 +1065 1020 +1066 1040 +1067 1029 +1068 1031 +1069 1027 +1070 1035 +1071 1030 +1072 1028 +1073 1026 +1074 1027 +1075 1034 +1076 1007 +1077 1047 +1078 1036 +1079 1034 +1080 1024 +1081 1034 +1082 1025 +1083 1032 +1084 1030 +1085 1030 +1086 1025 +1087 1031 +1088 1029 +1089 1023 +1090 1031 +1091 1027 +1092 1025 +1093 1028 +1094 1030 +1095 1032 +1096 1031 +1097 1029 +1098 1027 +1099 1029 +1100 1023 +1101 1012 +1102 1039 +1103 1028 +1104 1033 +1105 1025 +1106 1030 +1107 1028 +1108 1018 +1109 1027 +1110 1033 +1111 1029 +1112 1030 +1113 1025 +1114 1026 +1115 1030 +1116 1022 +1117 1028 +1118 1025 +1119 1030 +1120 1028 +1121 1029 +1122 1027 +1123 1034 +1124 1028 +1125 1024 +1126 1009 +1127 1044 +1128 1036 +1129 1028 +1130 1034 +1131 1028 +1132 1026 +1133 1025 +1134 1027 +1135 1029 +1136 1032 +1137 1030 +1138 1024 +1139 1022 +1140 1025 +1141 1026 +1142 1039 +1143 1024 +1144 1032 +1145 1031 +1146 1022 +1147 1030 +1148 1032 +1149 1029 +1150 1026 +1151 1010 +1152 1037 +1153 1024 +1154 1028 +1155 1029 +1156 1017 +1157 1031 +1158 1026 +1159 1021 +1160 1026 +1161 1022 +1162 1028 +1163 1028 +1164 1030 +1165 1027 +1166 1029 +1167 1031 +1168 1026 +1169 1028 +1170 1025 +1171 1023 +1172 1030 +1173 1040 +1174 1030 +1175 1022 +1176 1017 +1177 1048 +1178 1031 +1179 1040 +1180 1026 +1181 1029 +1182 1027 +1183 1020 +1184 1022 +1185 1030 +1186 1024 +1187 1029 +1188 1027 +1189 1028 +1190 1029 +1191 1028 +1192 1029 +1193 1036 +1194 1030 +1195 1025 +1196 1026 +1197 1022 +1198 1027 +1199 1026 +1200 1026 +1201 1009 +1202 1040 +1203 1031 +1204 1031 +1205 1032 +1206 1026 +1207 1026 +1208 1033 +1209 1029 +1210 1036 +1211 1024 +1212 1029 +1213 1029 +1214 1029 +1215 1022 +1216 1029 +1217 1027 +1218 1023 +1219 1036 +1220 1027 +1221 1029 +1222 1030 +1223 1025 +1224 1023 +1225 1031 +1226 1013 +1227 1037 +1228 1030 +1229 1035 +1230 1032 +1231 1026 +1232 1026 +1233 1028 +1234 1033 +1235 1030 +1236 1026 +1237 1028 +1238 1030 +1239 1026 +1240 1028 +1241 1031 +1242 1028 +1243 1030 +1244 1022 +1245 1029 +1246 1028 +1247 1022 +1248 1018 +1249 1033 +1250 1034 +1251 1003 +1252 1044 +1253 1036 +1254 1029 +1255 1031 +1256 1026 +1257 1027 +1258 1030 +1259 1027 +1260 1029 +1261 1024 +1262 1027 +1263 1027 +1264 1038 +1265 1026 +1266 1025 +1267 1029 +1268 1028 +1269 1026 +1270 1027 +1271 1031 +1272 1030 +1273 1030 +1274 1028 +1275 1026 +1276 1011 +1277 1045 +1278 1035 +1279 1028 +1280 1027 +1281 1024 +1282 1028 +1283 1020 +1284 1026 +1285 1030 +1286 1023 +1287 1029 +1288 1030 +1289 1027 +1290 1031 +1291 1020 +1292 1026 +1293 1024 +1294 1029 +1295 1035 +1296 1030 +1297 1029 +1298 1027 +1299 1029 +1300 1023 +1301 1018 +1302 1041 +1303 1037 +1304 1042 +1305 1030 +1306 1032 +1307 1027 +1308 1025 +1309 1029 +1310 1028 +1311 1027 +1312 1027 +1313 1019 +1314 1024 +1315 1033 +1316 1021 +1317 1025 +1318 1029 +1319 1034 +1320 1021 +1321 1025 +1322 1030 +1323 1031 +1324 1026 +1325 1026 +1326 1008 +1327 1044 +1328 1034 +1329 1029 +1330 1035 +1331 1025 +1332 1025 +1333 1032 +1334 1029 +1335 1023 +1336 1031 +1337 1030 +1338 1021 +1339 1035 +1340 1031 +1341 1026 +1342 1040 +1343 1025 +1344 1027 +1345 1027 +1346 1024 +1347 1029 +1348 1022 +1349 1028 +1350 1031 +1351 1014 +1352 1049 +1353 1036 +1354 1032 +1355 1018 +1356 1030 +1357 1035 +1358 1019 +1359 1031 +1360 1028 +1361 1028 +1362 1028 +1363 1029 +1364 1028 +1365 1030 +1366 1028 +1367 1032 +1368 1029 +1369 1025 +1370 1031 +1371 1020 +1372 1023 +1373 1032 +1374 1023 +1375 1025 +1376 1008 +1377 1049 +1378 1037 +1379 1041 +1380 1029 +1381 1020 +1382 1032 +1383 1029 +1384 1031 +1385 1033 +1386 1027 +1387 1027 +1388 1033 +1389 1033 +1390 1029 +1391 1023 +1392 1033 +1393 1026 +1394 1027 +1395 1019 +1396 1031 +1397 1031 +1398 1029 +1399 1030 +1400 1033 +1401 1004 +1402 1037 +1403 1028 +1404 1038 +1405 1029 +1406 1030 +1407 1024 +1408 1025 +1409 1039 +1410 1029 +1411 1029 +1412 1029 +1413 1028 +1414 1026 +1415 1031 +1416 1030 +1417 1026 +1418 1032 +1419 1030 +1420 1027 +1421 1026 +1422 1026 +1423 1024 +1424 1038 +1425 1030 +1426 1012 +1427 1040 +1428 1025 +1429 1033 +1430 1028 +1431 1031 +1432 1030 +1433 1028 +1434 1030 +1435 1030 +1436 1028 +1437 1031 +1438 1032 +1439 1023 +1440 1023 +1441 1033 +1442 1032 +1443 1030 +1444 1029 +1445 1027 +1446 1033 +1447 1031 +1448 1025 +1449 1033 +1450 1031 +1451 1003 +1452 1047 +1453 1034 +1454 1022 +1455 1031 +1456 1021 +1457 1028 +1458 1026 +1459 1025 +1460 1027 +1461 1028 +1462 1025 +1463 1028 +1464 1026 +1465 1026 +1466 1026 +1467 1036 +1468 1024 +1469 1025 +1470 1022 +1471 1028 +1472 1021 +1473 1037 +1474 1029 +1475 1028 +1476 1017 +1477 1049 +1478 1040 +1479 1036 +1480 1029 +1481 1027 +1482 1018 +1483 1027 +1484 1028 +1485 1021 +1486 1036 +1487 1025 +1488 1026 +1489 1024 +1490 1024 +1491 1028 +1492 1032 +1493 1031 +1494 1021 +1495 1037 +1496 1029 +1497 1021 +1498 1027 +1499 1034 +1500 1017 +1501 1013 +1502 1039 +1503 1029 +1504 1028 +1505 1021 +1506 1032 +1507 1032 +1508 1029 +1509 1030 +1510 1028 +1511 1027 +1512 1027 +1513 1028 +1514 1023 +1515 1027 +1516 1030 +1517 1024 +1518 1033 +1519 1024 +1520 1023 +1521 1029 +1522 1031 +1523 1025 +1524 1030 +1525 1024 +1526 1010 +1527 1043 +1528 1023 +1529 1028 +1530 1025 +1531 1026 +1532 1025 +1533 1029 +1534 1026 +1535 1023 +1536 1023 +1537 1031 +1538 1026 +1539 1028 +1540 1033 +1541 1020 +1542 1030 +1543 1029 +1544 1021 +1545 1039 +1546 1028 +1547 1028 +1548 1033 +1549 1018 +1550 1023 +1551 1005 +1552 1045 +1553 1033 +1554 1034 +1555 1028 +1556 1028 +1557 1028 +1558 1027 +1559 1023 +1560 1026 +1561 1024 +1562 1027 +1563 1028 +1564 1030 +1565 1023 +1566 1032 +1567 1021 +1568 1029 +1569 1027 +1570 1019 +1571 1029 +1572 1029 +1573 1020 +1574 1032 +1575 1019 +1576 1012 +1577 1058 +1578 1045 +1579 1034 +1580 1031 +1581 1028 +1582 1030 +1583 1025 +1584 1030 +1585 1026 +1586 1024 +1587 1029 +1588 1023 +1589 1027 +1590 1019 +1591 1026 +1592 1026 +1593 1032 +1594 1021 +1595 1036 +1596 1026 +1597 1035 +1598 1031 +1599 1031 +1600 1034 +1601 1007 +1602 1053 +1603 1039 +1604 1031 +1605 1023 +1606 1027 +1607 1026 +1608 1022 +1609 1032 +1610 1022 +1611 1025 +1612 1028 +1613 1032 +1614 1019 +1615 1023 +1616 1030 +1617 1029 +1618 1036 +1619 1030 +1620 1028 +1621 1035 +1622 1032 +1623 1018 +1624 1034 +1625 1019 +1626 1001 +1627 1043 +1628 1037 +1629 1026 +1630 1030 +1631 1036 +1632 1028 +1633 1029 +1634 1031 +1635 1030 +1636 1031 +1637 1025 +1638 1031 +1639 1029 +1640 1028 +1641 1027 +1642 1028 +1643 1034 +1644 1033 +1645 1033 +1646 1024 +1647 1032 +1648 1031 +1649 1024 +1650 1035 +1651 1009 +1652 1048 +1653 1042 +1654 1029 +1655 1026 +1656 1033 +1657 1031 +1658 1028 +1659 1027 +1660 1032 +1661 1029 +1662 1027 +1663 1025 +1664 1026 +1665 1020 +1666 1031 +1667 1024 +1668 1028 +1669 1021 +1670 1031 +1671 1031 +1672 1029 +1673 1029 +1674 1031 +1675 1022 +1676 1017 +1677 1042 +1678 1035 +1679 1032 +1680 1028 +1681 1030 +1682 1031 +1683 1031 +1684 1026 +1685 1029 +1686 1027 +1687 1032 +1688 1032 +1689 1026 +1690 1031 +1691 1025 +1692 1030 +1693 1024 +1694 1033 +1695 1025 +1696 1025 +1697 1030 +1698 1025 +1699 1028 +1700 1029 +1701 1004 +1702 1046 +1703 1036 +1704 1037 +1705 1033 +1706 1027 +1707 1035 +1708 1029 +1709 1021 +1710 1033 +1711 1031 +1712 1033 +1713 1032 +1714 1031 +1715 1024 +1716 1027 +1717 1027 +1718 1027 +1719 1036 +1720 1034 +1721 1028 +1722 1024 +1723 1030 +1724 1025 +1725 1017 +1726 1012 +1727 1039 +1728 1038 +1729 1033 +1730 1021 +1731 1029 +1732 1034 +1733 1030 +1734 1035 +1735 1026 +1736 1016 +1737 1034 +1738 1029 +1739 1032 +1740 1036 +1741 1027 +1742 1028 +1743 1025 +1744 1028 +1745 1025 +1746 1033 +1747 1028 +1748 1028 +1749 1026 +1750 1023 +1751 1011 +1752 1039 +1753 1026 +1754 1034 +1755 1021 +1756 1029 +1757 1029 +1758 1027 +1759 1020 +1760 1028 +1761 1030 +1762 1032 +1763 1034 +1764 1029 +1765 1025 +1766 1029 +1767 1031 +1768 1026 +1769 1032 +1770 1028 +1771 1034 +1772 1021 +1773 1025 +1774 1031 +1775 1029 +1776 1009 +1777 1052 +1778 1035 +1779 1036 +1780 1035 +1781 1031 +1782 1030 +1783 1030 +1784 1026 +1785 1023 +1786 1035 +1787 1027 +1788 1031 +1789 1027 +1790 1027 +1791 1027 +1792 1032 +1793 1026 +1794 1025 +1795 1028 +1796 1028 +1797 1025 +1798 1031 +1799 1030 +1800 1029 +1801 1003 +1802 1049 +1803 1037 +1804 1035 +1805 1025 +1806 1029 +1807 1030 +1808 1034 +1809 1035 +1810 1026 +1811 1027 +1812 1024 +1813 1027 +1814 1032 +1815 1021 +1816 1025 +1817 1028 +1818 1032 +1819 1027 +1820 1032 +1821 1024 +1822 1032 +1823 1024 +1824 1030 +1825 1030 +1826 1011 +1827 1055 +1828 1043 +1829 1029 +1830 1030 +1831 1025 +1832 1025 +1833 1023 +1834 1034 +1835 1020 +1836 1032 +1837 1021 +1838 1022 +1839 1033 +1840 1024 +1841 1022 +1842 1032 +1843 1024 +1844 1028 +1845 1029 +1846 1023 +1847 1026 +1848 1028 +1849 1027 +1850 1033 +1851 1011 +1852 1057 +1853 1041 +1854 1036 +1855 1026 +1856 1023 +1857 1030 +1858 1025 +1859 1026 +1860 1023 +1861 1022 +1862 1026 +1863 1031 +1864 1021 +1865 1029 +1866 1031 +1867 1022 +1868 1029 +1869 1021 +1870 1024 +1871 1025 +1872 1027 +1873 1037 +1874 1026 +1875 1021 +1876 1010 +1877 1053 +1878 1036 +1879 1035 +1880 1028 +1881 1012 +1882 1031 +1883 1029 +1884 1032 +1885 1028 +1886 1026 +1887 1028 +1888 1023 +1889 1031 +1890 1029 +1891 1034 +1892 1031 +1893 1036 +1894 1027 +1895 1023 +1896 1031 +1897 1031 +1898 1021 +1899 1033 +1900 1020 +1901 1007 +1902 1048 +1903 1033 +1904 1033 +1905 1031 +1906 1023 +1907 1030 +1908 1028 +1909 1029 +1910 1026 +1911 1026 +1912 1036 +1913 1031 +1914 1030 +1915 1027 +1916 1027 +1917 1030 +1918 1020 +1919 1036 +1920 1030 +1921 1025 +1922 1023 +1923 1027 +1924 1024 +1925 1023 +1926 1010 +1927 1046 +1928 1036 +1929 1031 +1930 1021 +1931 1035 +1932 1027 +1933 1029 +1934 1026 +1935 1030 +1936 1026 +1937 1030 +1938 1033 +1939 1019 +1940 1035 +1941 1029 +1942 1033 +1943 1035 +1944 1025 +1945 1023 +1946 1019 +1947 1031 +1948 1023 +1949 1032 +1950 1030 +1951 1006 +1952 1036 +1953 1032 +1954 1031 +1955 1025 +1956 1027 +1957 1033 +1958 1026 +1959 1026 +1960 1023 +1961 1028 +1962 1030 +1963 1034 +1964 1030 +1965 1025 +1966 1035 +1967 1029 +1968 1028 +1969 1025 +1970 1029 +1971 1023 +1972 1035 +1973 1026 +1974 1025 +1975 1022 +1976 1018 +1977 1050 +1978 1034 +1979 1038 +1980 1027 +1981 1030 +1982 1028 +1983 1031 +1984 1020 +1985 1021 +1986 1025 +1987 1027 +1988 1034 +1989 1024 +1990 1032 +1991 1026 +1992 1032 +1993 1035 +1994 1032 +1995 1027 +1996 1028 +1997 1026 +1998 1027 +1999 1029 +2000 1028 +2001 1006 +2002 1041 +2003 1033 +2004 1027 +2005 1028 +2006 1037 +2007 1027 +2008 1028 +2009 1034 +2010 1026 +2011 1032 +2012 1028 +2013 1034 +2014 1037 +2015 1028 +2016 1022 +2017 1024 +2018 1029 +2019 1034 +2020 1036 +2021 1023 +2022 1027 +2023 1026 +2024 1024 +2025 1023 +2026 1006 +2027 1044 +2028 1029 +2029 1032 +2030 1029 +2031 1031 +2032 1026 +2033 1026 +2034 1031 +2035 1025 +2036 1029 +2037 1033 +2038 1024 +2039 1026 +2040 1033 +2041 1034 +2042 1029 +2043 1029 +2044 1027 +2045 1028 +2046 1031 +2047 1026 +2048 1025 +2049 1029 +2050 1031 +2051 1003 +2052 1043 +2053 1032 +2054 1028 +2055 1026 +2056 1026 +2057 1028 +2058 1033 +2059 1024 +2060 1032 +2061 1032 +2062 1032 +2063 1035 +2064 1030 +2065 1028 +2066 1037 +2067 1028 +2068 1029 +2069 1030 +2070 1021 +2071 1025 +2072 1031 +2073 1032 +2074 1019 +2075 1030 +2076 1006 +2077 1049 +2078 1040 +2079 1029 +2080 1022 +2081 1026 +2082 1030 +2083 1024 +2084 1031 +2085 1030 +2086 1022 +2087 1029 +2088 1033 +2089 1024 +2090 1033 +2091 1020 +2092 1035 +2093 1028 +2094 1034 +2095 1019 +2096 1033 +2097 1016 +2098 1035 +2099 1023 +2100 1032 +2101 1016 +2102 1048 +2103 1033 +2104 1035 +2105 1032 +2106 1030 +2107 1024 +2108 1031 +2109 1026 +2110 1023 +2111 1039 +2112 1020 +2113 1027 +2114 1031 +2115 1031 +2116 1027 +2117 1024 +2118 1029 +2119 1032 +2120 1027 +2121 1032 +2122 1026 +2123 1024 +2124 1032 +2125 1028 +2126 1001 +2127 1045 +2128 1031 +2129 1026 +2130 1032 +2131 1023 +2132 1035 +2133 1029 +2134 1028 +2135 1035 +2136 1029 +2137 1026 +2138 1032 +2139 1022 +2140 1026 +2141 1030 +2142 1036 +2143 1027 +2144 1030 +2145 1024 +2146 1032 +2147 1026 +2148 1029 +2149 1026 +2150 1029 +2151 1010 +2152 1049 +2153 1032 +2154 1034 +2155 1026 +2156 1026 +2157 1039 +2158 1026 +2159 1028 +2160 1026 +2161 1029 +2162 1027 +2163 1030 +2164 1028 +2165 1029 +2166 1032 +2167 1026 +2168 1028 +2169 1025 +2170 1029 +2171 1032 +2172 1035 +2173 1031 +2174 1027 +2175 1024 +2176 998 +2177 1043 +2178 1029 +2179 1034 +2180 1031 +2181 1019 +2182 1027 +2183 1029 +2184 1027 +2185 1023 +2186 1026 +2187 1027 +2188 1025 +2189 1024 +2190 1027 +2191 1025 +2192 1028 +2193 1029 +2194 1023 +2195 1030 +2196 1029 +2197 1022 +2198 1035 +2199 1029 +2200 1032 +2201 1011 +2202 1037 +2203 1017 +2204 1024 +2205 1028 +2206 1033 +2207 1030 +2208 1026 +2209 1024 +2210 1032 +2211 1023 +2212 1028 +2213 1029 +2214 1025 +2215 1030 +2216 1026 +2217 1023 +2218 1031 +2219 1029 +2220 1026 +2221 1032 +2222 1028 +2223 1034 +2224 1030 +2225 1032 +2226 1002 +2227 1047 +2228 1028 +2229 1025 +2230 1027 +2231 1031 +2232 1026 +2233 1029 +2234 1036 +2235 1029 +2236 1032 +2237 1031 +2238 1031 +2239 1025 +2240 1033 +2241 1032 +2242 1025 +2243 1026 +2244 1032 +2245 1026 +2246 1028 +2247 1034 +2248 1030 +2249 1028 +2250 1032 +2251 1016 +2252 1049 +2253 1033 +2254 1022 +2255 1026 +2256 1022 +2257 1030 +2258 1033 +2259 1026 +2260 1023 +2261 1025 +2262 1032 +2263 1022 +2264 1028 +2265 1022 +2266 1027 +2267 1033 +2268 1030 +2269 1032 +2270 1026 +2271 1037 +2272 1025 +2273 1022 +2274 1027 +2275 1034 +2276 1015 +2277 1043 +2278 1031 +2279 1034 +2280 1029 +2281 1034 +2282 1029 +2283 1031 +2284 1034 +2285 1021 +2286 1022 +2287 1033 +2288 1022 +2289 1026 +2290 1035 +2291 1026 +2292 1024 +2293 1023 +2294 1024 +2295 1027 +2296 1030 +2297 1034 +2298 1029 +2299 1027 +2300 1033 +2301 1007 +2302 1046 +2303 1035 +2304 1035 +2305 1031 +2306 1025 +2307 1032 +2308 1030 +2309 1019 +2310 1036 +2311 1027 +2312 1020 +2313 1033 +2314 1028 +2315 1028 +2316 1038 +2317 1027 +2318 1032 +2319 1027 +2320 1027 +2321 1028 +2322 1028 +2323 1021 +2324 1034 +2325 1029 +2326 1000 +2327 1033 +2328 1024 +2329 1032 +2330 1023 +2331 1023 +2332 1030 +2333 1022 +2334 1027 +2335 1032 +2336 1025 +2337 1030 +2338 1033 +2339 1019 +2340 1030 +2341 1026 +2342 1025 +2343 1030 +2344 1024 +2345 1036 +2346 1023 +2347 1031 +2348 1025 +2349 1029 +2350 1029 +2351 1019 +2352 1039 +2353 1032 +2354 1026 +2355 1027 +2356 1026 +2357 1028 +2358 1029 +2359 1032 +2360 1031 +2361 1021 +2362 1027 +2363 1022 +2364 1030 +2365 1027 +2366 1022 +2367 1028 +2368 1033 +2369 1025 +2370 1033 +2371 1027 +2372 1030 +2373 1031 +2374 1026 +2375 1027 +2376 1009 +2377 1045 +2378 1039 +2379 1027 +2380 1036 +2381 1026 +2382 1036 +2383 1025 +2384 1023 +2385 1027 +2386 1033 +2387 1028 +2388 1025 +2389 1028 +2390 1030 +2391 1027 +2392 1029 +2393 1020 +2394 1038 +2395 1027 +2396 1032 +2397 1036 +2398 1028 +2399 1024 +2400 1025 +2401 1012 +2402 1043 +2403 1036 +2404 1034 +2405 1030 +2406 1029 +2407 1036 +2408 1023 +2409 1023 +2410 1028 +2411 1030 +2412 1033 +2413 1024 +2414 1025 +2415 1034 +2416 1031 +2417 1033 +2418 1028 +2419 1026 +2420 1027 +2421 1030 +2422 1032 +2423 1027 +2424 1028 +2425 1030 +2426 1011 +2427 1038 +2428 1033 +2429 1030 +2430 1015 +2431 1029 +2432 1027 +2433 1029 +2434 1030 +2435 1023 +2436 1028 +2437 1029 +2438 1025 +2439 1022 +2440 1031 +2441 1022 +2442 1035 +2443 1039 +2444 1022 +2445 1027 +2446 1026 +2447 1030 +2448 1028 +2449 1029 +2450 1024 +2451 1006 +2452 1053 +2453 1042 +2454 1029 +2455 1022 +2456 1029 +2457 1035 +2458 1028 +2459 1029 +2460 1030 +2461 1025 +2462 1023 +2463 1034 +2464 1031 +2465 1030 +2466 1024 +2467 1029 +2468 1027 +2469 1027 +2470 1032 +2471 1026 +2472 1031 +2473 1021 +2474 1029 +2475 1037 +2476 1009 +2477 1053 +2478 1047 +2479 1030 +2480 1023 +2481 1024 +2482 1033 +2483 1023 +2484 1022 +2485 1033 +2486 1021 +2487 1030 +2488 1029 +2489 1019 +2490 1036 +2491 1022 +2492 1030 +2493 1023 +2494 1029 +2495 1026 +2496 1033 +2497 1024 +2498 1033 +2499 1034 +2500 1034 +2501 1006 +2502 1046 +2503 1036 +2504 1036 +2505 1025 +2506 1028 +2507 1032 +2508 1022 +2509 1017 +2510 1036 +2511 1028 +2512 1029 +2513 1026 +2514 1035 +2515 1030 +2516 1022 +2517 1026 +2518 1031 +2519 1025 +2520 1028 +2521 1030 +2522 1029 +2523 1029 +2524 1027 +2525 1025 +2526 1014 +2527 1039 +2528 1035 +2529 1035 +2530 1017 +2531 1029 +2532 1029 +2533 1028 +2534 1030 +2535 1028 +2536 1030 +2537 1034 +2538 1022 +2539 1031 +2540 1032 +2541 1018 +2542 1029 +2543 1024 +2544 1032 +2545 1031 +2546 1021 +2547 1030 +2548 1026 +2549 1024 +2550 1037 +2551 1011 +2552 1047 +2553 1035 +2554 1034 +2555 1030 +2556 1021 +2557 1030 +2558 1024 +2559 1024 +2560 1027 +2561 1026 +2562 1032 +2563 1030 +2564 1029 +2565 1035 +2566 1025 +2567 1024 +2568 1036 +2569 1024 +2570 1022 +2571 1027 +2572 1033 +2573 1029 +2574 1026 +2575 1031 +2576 1010 +2577 1046 +2578 1033 +2579 1033 +2580 1035 +2581 1028 +2582 1021 +2583 1026 +2584 1023 +2585 1033 +2586 1030 +2587 1025 +2588 1029 +2589 1030 +2590 1021 +2591 1034 +2592 1026 +2593 1027 +2594 1021 +2595 1029 +2596 1024 +2597 1027 +2598 1029 +2599 1024 +2600 1037 +2601 1006 +2602 1047 +2603 1032 +2604 1029 +2605 1019 +2606 1022 +2607 1031 +2608 1023 +2609 1036 +2610 1031 +2611 1025 +2612 1034 +2613 1029 +2614 1024 +2615 1023 +2616 1028 +2617 1024 +2618 1031 +2619 1026 +2620 1027 +2621 1034 +2622 1028 +2623 1025 +2624 1029 +2625 1024 +2626 1015 +2627 1040 +2628 1020 +2629 1029 +2630 1024 +2631 1028 +2632 1033 +2633 1023 +2634 1030 +2635 1030 +2636 1025 +2637 1026 +2638 1038 +2639 1024 +2640 1024 +2641 1031 +2642 1018 +2643 1034 +2644 1033 +2645 1026 +2646 1027 +2647 1024 +2648 1023 +2649 1028 +2650 1031 +2651 1002 +2652 1045 +2653 1036 +2654 1030 +2655 1021 +2656 1032 +2657 1034 +2658 1025 +2659 1030 +2660 1025 +2661 1030 +2662 1032 +2663 1023 +2664 1026 +2665 1028 +2666 1033 +2667 1036 +2668 1024 +2669 1025 +2670 1026 +2671 1034 +2672 1030 +2673 1026 +2674 1026 +2675 1030 +2676 996 +2677 1038 +2678 1032 +2679 1033 +2680 1028 +2681 1022 +2682 1037 +2683 1024 +2684 1032 +2685 1035 +2686 1030 +2687 1021 +2688 1033 +2689 1032 +2690 1026 +2691 1032 +2692 1024 +2693 1031 +2694 1035 +2695 1027 +2696 1031 +2697 1027 +2698 1031 +2699 1027 +2700 1030 +2701 1005 +2702 1049 +2703 1034 +2704 1033 +2705 1036 +2706 1028 +2707 1022 +2708 1028 +2709 1029 +2710 1026 +2711 1031 +2712 1027 +2713 1031 +2714 1028 +2715 1028 +2716 1031 +2717 1029 +2718 1032 +2719 1019 +2720 1030 +2721 1037 +2722 1029 +2723 1030 +2724 1025 +2725 1026 +2726 1015 +2727 1049 +2728 1037 +2729 1037 +2730 1029 +2731 1027 +2732 1031 +2733 1029 +2734 1027 +2735 1024 +2736 1029 +2737 1027 +2738 1031 +2739 1031 +2740 1021 +2741 1031 +2742 1020 +2743 1026 +2744 1028 +2745 1024 +2746 1030 +2747 1025 +2748 1028 +2749 1030 +2750 1027 +2751 1009 +2752 1043 +2753 1027 +2754 1031 +2755 1019 +2756 1025 +2757 1033 +2758 1022 +2759 1025 +2760 1034 +2761 1025 +2762 1030 +2763 1024 +2764 1027 +2765 1024 +2766 1023 +2767 1033 +2768 1025 +2769 1031 +2770 1024 +2771 1027 +2772 1026 +2773 1022 +2774 1026 +2775 1029 +2776 1008 +2777 1041 +2778 1034 +2779 1036 +2780 1024 +2781 1025 +2782 1030 +2783 1026 +2784 1030 +2785 1038 +2786 1022 +2787 1029 +2788 1032 +2789 1017 +2790 1028 +2791 1025 +2792 1028 +2793 1026 +2794 1032 +2795 1025 +2796 1030 +2797 1032 +2798 1028 +2799 1038 +2800 1030 +2801 1008 +2802 1046 +2803 1032 +2804 1030 +2805 1034 +2806 1022 +2807 1030 +2808 1029 +2809 1027 +2810 1027 +2811 1024 +2812 1024 +2813 1023 +2814 1025 +2815 1025 +2816 1028 +2817 1024 +2818 1033 +2819 1023 +2820 1027 +2821 1033 +2822 1024 +2823 1024 +2824 1027 +2825 1025 +2826 1009 +2827 1040 +2828 1034 +2829 1029 +2830 1029 +2831 1030 +2832 1032 +2833 1031 +2834 1024 +2835 1023 +2836 1024 +2837 1028 +2838 1029 +2839 1023 +2840 1034 +2841 1032 +2842 1029 +2843 1040 +2844 1030 +2845 1024 +2846 1037 +2847 1031 +2848 1027 +2849 1025 +2850 1030 +2851 1006 +2852 1042 +2853 1032 +2854 1026 +2855 1030 +2856 1032 +2857 1030 +2858 1028 +2859 1035 +2860 1018 +2861 1024 +2862 1029 +2863 1027 +2864 1028 +2865 1025 +2866 1035 +2867 1032 +2868 1027 +2869 1026 +2870 1036 +2871 1028 +2872 1025 +2873 1029 +2874 1031 +2875 1021 +2876 1009 +2877 1044 +2878 1029 +2879 1036 +2880 1032 +2881 1028 +2882 1029 +2883 1031 +2884 1026 +2885 1026 +2886 1027 +2887 1029 +2888 1017 +2889 1035 +2890 1028 +2891 1026 +2892 1031 +2893 1025 +2894 1027 +2895 1029 +2896 1030 +2897 1026 +2898 1022 +2899 1030 +2900 1023 +2901 1009 +2902 1040 +2903 1036 +2904 1035 +2905 1023 +2906 1031 +2907 1027 +2908 1025 +2909 1030 +2910 1030 +2911 1024 +2912 1026 +2913 1028 +2914 1024 +2915 1031 +2916 1024 +2917 1024 +2918 1032 +2919 1031 +2920 1023 +2921 1031 +2922 1026 +2923 1032 +2924 1027 +2925 1025 +2926 1009 +2927 1038 +2928 1025 +2929 1022 +2930 1025 +2931 1025 +2932 1030 +2933 1031 +2934 1028 +2935 1024 +2936 1028 +2937 1027 +2938 1031 +2939 1029 +2940 1023 +2941 1026 +2942 1031 +2943 1029 +2944 1030 +2945 1020 +2946 1033 +2947 1024 +2948 1021 +2949 1029 +2950 1029 +2951 1011 +2952 1054 +2953 1040 +2954 1032 +2955 1024 +2956 1030 +2957 1034 +2958 1027 +2959 1033 +2960 1031 +2961 1031 +2962 1023 +2963 1028 +2964 1036 +2965 1028 +2966 1020 +2967 1031 +2968 1029 +2969 1026 +2970 1027 +2971 1030 +2972 1019 +2973 1025 +2974 1023 +2975 1023 +2976 1011 +2977 1052 +2978 1040 +2979 1033 +2980 1036 +2981 1023 +2982 1024 +2983 1027 +2984 1026 +2985 1031 +2986 1028 +2987 1034 +2988 1023 +2989 1029 +2990 1026 +2991 1018 +2992 1037 +2993 1024 +2994 1030 +2995 1025 +2996 1030 +2997 1030 +2998 1025 +2999 1022 +3000 1036 +3001 1003 +3002 1046 +3003 1033 +3004 1025 +3005 1035 +3006 1024 +3007 1020 +3008 1034 +3009 1024 +3010 1024 +3011 1032 +3012 1019 +3013 1027 +3014 1033 +3015 1029 +3016 1024 +3017 1027 +3018 1030 +3019 1027 +3020 1021 +3021 1032 +3022 1031 +3023 1025 +3024 1032 +3025 1024 +3026 1006 +3027 1049 +3028 1030 +3029 1033 +3030 1028 +3031 1041 +3032 1031 +3033 1030 +3034 1024 +3035 1028 +3036 1026 +3037 1032 +3038 1035 +3039 1027 +3040 1028 +3041 1035 +3042 1031 +3043 1021 +3044 1029 +3045 1029 +3046 1025 +3047 1022 +3048 1030 +3049 1026 +3050 1027 +3051 1006 +3052 1043 +3053 1033 +3054 1037 +3055 1022 +3056 1040 +3057 1022 +3058 1022 +3059 1032 +3060 1030 +3061 1031 +3062 1023 +3063 1022 +3064 1032 +3065 1033 +3066 1032 +3067 1026 +3068 1031 +3069 1029 +3070 1028 +3071 1026 +3072 1032 +3073 1037 +3074 1032 +3075 1018 +3076 1009 +3077 1052 +3078 1035 +3079 1033 +3080 1031 +3081 1029 +3082 1029 +3083 1023 +3084 1032 +3085 1029 +3086 1029 +3087 1036 +3088 1019 +3089 1029 +3090 1030 +3091 1020 +3092 1037 +3093 1027 +3094 1021 +3095 1034 +3096 1029 +3097 1032 +3098 1031 +3099 1027 +3100 1020 +3101 1011 +3102 1048 +3103 1038 +3104 1026 +3105 1027 +3106 1021 +3107 1027 +3108 1030 +3109 1027 +3110 1027 +3111 1026 +3112 1028 +3113 1034 +3114 1033 +3115 1021 +3116 1032 +3117 1025 +3118 1027 +3119 1024 +3120 1020 +3121 1030 +3122 1029 +3123 1030 +3124 1028 +3125 1025 +3126 1011 +3127 1042 +3128 1038 +3129 1038 +3130 1024 +3131 1027 +3132 1035 +3133 1024 +3134 1032 +3135 1032 +3136 1024 +3137 1022 +3138 1029 +3139 1027 +3140 1016 +3141 1034 +3142 1023 +3143 1026 +3144 1032 +3145 1022 +3146 1022 +3147 1028 +3148 1016 +3149 1034 +3150 1027 +3151 1007 +3152 1044 +3153 1032 +3154 1032 +3155 1031 +3156 1020 +3157 1034 +3158 1023 +3159 1030 +3160 1023 +3161 1021 +3162 1032 +3163 1031 +3164 1028 +3165 1026 +3166 1031 +3167 1020 +3168 1031 +3169 1024 +3170 1024 +3171 1028 +3172 1026 +3173 1035 +3174 1025 +3175 1030 +3176 1014 +3177 1050 +3178 1033 +3179 1039 +3180 1023 +3181 1026 +3182 1027 +3183 1023 +3184 1029 +3185 1029 +3186 1028 +3187 1022 +3188 1031 +3189 1026 +3190 1032 +3191 1026 +3192 1029 +3193 1022 +3194 1023 +3195 1033 +3196 1028 +3197 1029 +3198 1021 +3199 1030 +3200 1028 +3201 1010 +3202 1043 +3203 1030 +3204 1021 +3205 1029 +3206 1015 +3207 1028 +3208 1027 +3209 1027 +3210 1032 +3211 1026 +3212 1032 +3213 1032 +3214 1025 +3215 1025 +3216 1031 +3217 1026 +3218 1024 +3219 1030 +3220 1026 +3221 1024 +3222 1024 +3223 1036 +3224 1033 +3225 1028 +3226 1011 +3227 1043 +3228 1037 +3229 1040 +3230 1029 +3231 1024 +3232 1036 +3233 1027 +3234 1022 +3235 1027 +3236 1039 +3237 1030 +3238 1028 +3239 1026 +3240 1028 +3241 1027 +3242 1027 +3243 1026 +3244 1026 +3245 1033 +3246 1029 +3247 1019 +3248 1029 +3249 1023 +3250 1031 +3251 1006 +3252 1039 +3253 1029 +3254 1027 +3255 1024 +3256 1032 +3257 1031 +3258 1024 +3259 1024 +3260 1028 +3261 1021 +3262 1030 +3263 1028 +3264 1031 +3265 1026 +3266 1028 +3267 1029 +3268 1026 +3269 1027 +3270 1015 +3271 1033 +3272 1028 +3273 1025 +3274 1035 +3275 1017 +3276 1011 +3277 1040 +3278 1026 +3279 1035 +3280 1027 +3281 1024 +3282 1028 +3283 1026 +3284 1027 +3285 1025 +3286 1031 +3287 1029 +3288 1029 +3289 1028 +3290 1027 +3291 1028 +3292 1033 +3293 1030 +3294 1028 +3295 1033 +3296 1025 +3297 1027 +3298 1028 +3299 1024 +3300 1030 +3301 1011 +3302 1047 +3303 1036 +3304 1036 +3305 1027 +3306 1025 +3307 1032 +3308 1027 +3309 1030 +3310 1027 +3311 1025 +3312 1029 +3313 1025 +3314 1025 +3315 1033 +3316 1023 +3317 1032 +3318 1029 +3319 1035 +3320 1035 +3321 1035 +3322 1031 +3323 1032 +3324 1027 +3325 1033 +3326 1009 +3327 1051 +3328 1036 +3329 1033 +3330 1029 +3331 1030 +3332 1032 +3333 1028 +3334 1036 +3335 1026 +3336 1030 +3337 1028 +3338 1034 +3339 1029 +3340 1023 +3341 1026 +3342 1024 +3343 1024 +3344 1026 +3345 1027 +3346 1033 +3347 1028 +3348 1031 +3349 1034 +3350 1027 +3351 1012 +3352 1052 +3353 1037 +3354 1036 +3355 1029 +3356 1027 +3357 1034 +3358 1025 +3359 1026 +3360 1027 +3361 1021 +3362 1032 +3363 1030 +3364 1031 +3365 1022 +3366 1024 +3367 1021 +3368 1025 +3369 1034 +3370 1019 +3371 1030 +3372 1028 +3373 1027 +3374 1032 +3375 1027 +3376 1008 +3377 1047 +3378 1030 +3379 1032 +3380 1031 +3381 1024 +3382 1028 +3383 1029 +3384 1034 +3385 1029 +3386 1023 +3387 1027 +3388 1031 +3389 1026 +3390 1029 +3391 1030 +3392 1024 +3393 1028 +3394 1028 +3395 1029 +3396 1020 +3397 1032 +3398 1026 +3399 1024 +3400 1035 +3401 1014 +3402 1046 +3403 1038 +3404 1036 +3405 1024 +3406 1029 +3407 1029 +3408 1028 +3409 1030 +3410 1033 +3411 1024 +3412 1030 +3413 1027 +3414 1028 +3415 1023 +3416 1032 +3417 1030 +3418 1031 +3419 1026 +3420 1032 +3421 1027 +3422 1028 +3423 1026 +3424 1027 +3425 1036 +3426 1010 +3427 1040 +3428 1032 +3429 1032 +3430 1028 +3431 1030 +3432 1036 +3433 1033 +3434 1024 +3435 1029 +3436 1031 +3437 1026 +3438 1028 +3439 1028 +3440 1035 +3441 1025 +3442 1022 +3443 1034 +3444 1034 +3445 1025 +3446 1024 +3447 1027 +3448 1026 +3449 1039 +3450 1028 +3451 1007 +3452 1053 +3453 1037 +3454 1035 +3455 1027 +3456 1027 +3457 1029 +3458 1034 +3459 1028 +3460 1022 +3461 1029 +3462 1026 +3463 1027 +3464 1029 +3465 1035 +3466 1036 +3467 1020 +3468 1028 +3469 1030 +3470 1020 +3471 1033 +3472 1022 +3473 1038 +3474 1025 +3475 1030 +3476 1007 +3477 1050 +3478 1041 +3479 1031 +3480 1033 +3481 1024 +3482 1022 +3483 1027 +3484 1025 +3485 1030 +3486 1032 +3487 1026 +3488 1023 +3489 1031 +3490 1029 +3491 1037 +3492 1029 +3493 1024 +3494 1023 +3495 1025 +3496 1032 +3497 1032 +3498 1021 +3499 1033 +3500 1023 +3501 1011 +3502 1051 +3503 1043 +3504 1032 +3505 1026 +3506 1034 +3507 1032 +3508 1023 +3509 1022 +3510 1031 +3511 1030 +3512 1029 +3513 1026 +3514 1030 +3515 1029 +3516 1026 +3517 1028 +3518 1027 +3519 1028 +3520 1029 +3521 1023 +3522 1021 +3523 1025 +3524 1030 +3525 1025 +3526 1006 +3527 1043 +3528 1029 +3529 1035 +3530 1027 +3531 1022 +3532 1035 +3533 1030 +3534 1024 +3535 1024 +3536 1032 +3537 1022 +3538 1036 +3539 1033 +3540 1028 +3541 1034 +3542 1030 +3543 1028 +3544 1028 +3545 1026 +3546 1027 +3547 1028 +3548 1033 +3549 1029 +3550 1030 +3551 1004 +3552 1048 +3553 1035 +3554 1026 +3555 1024 +3556 1028 +3557 1024 +3558 1028 +3559 1028 +3560 1031 +3561 1023 +3562 1024 +3563 1027 +3564 1029 +3565 1034 +3566 1032 +3567 1031 +3568 1025 +3569 1031 +3570 1030 +3571 1020 +3572 1036 +3573 1026 +3574 1032 +3575 1031 +3576 1000 +3577 1043 +3578 1024 +3579 1030 +3580 1038 +3581 1030 +3582 1024 +3583 1033 +3584 1029 +3585 1031 +3586 1026 +3587 1033 +3588 1025 +3589 1029 +3590 1029 +3591 1023 +3592 1032 +3593 1030 +3594 1027 +3595 1032 +3596 1031 +3597 1029 +3598 1030 +3599 1026 +3600 1023 +3601 1020 +3602 1046 +3603 1037 +3604 1041 +3605 1028 +3606 1020 +3607 1036 +3608 1020 +3609 1024 +3610 1033 +3611 1025 +3612 1036 +3613 1028 +3614 1029 +3615 1034 +3616 1031 +3617 1029 +3618 1031 +3619 1030 +3620 1028 +3621 1028 +3622 1029 +3623 1022 +3624 1024 +3625 1028 +3626 1006 +3627 1045 +3628 1038 +3629 1034 +3630 1023 +3631 1025 +3632 1021 +3633 1036 +3634 1023 +3635 1033 +3636 1025 +3637 1028 +3638 1026 +3639 1027 +3640 1033 +3641 1028 +3642 1033 +3643 1035 +3644 1030 +3645 1024 +3646 1028 +3647 1033 +3648 1024 +3649 1032 +3650 1042 +3651 1012 +3652 1047 +3653 1036 +3654 1029 +3655 1028 +3656 1028 +3657 1023 +3658 1035 +3659 1034 +3660 1023 +3661 1030 +3662 1032 +3663 1024 +3664 1033 +3665 1024 +3666 1024 +3667 1029 +3668 1028 +3669 1025 +3670 1024 +3671 1026 +3672 1026 +3673 1037 +3674 1026 +3675 1028 +3676 1012 +3677 1049 +3678 1031 +3679 1029 +3680 1022 +3681 1034 +3682 1026 +3683 1024 +3684 1036 +3685 1033 +3686 1021 +3687 1036 +3688 1025 +3689 1024 +3690 1033 +3691 1028 +3692 1030 +3693 1034 +3694 1030 diff --git a/pyCCDGUI.py b/pyCCDGUI.py new file mode 100644 index 0000000..85a9ca3 --- /dev/null +++ b/pyCCDGUI.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2019 Esben Rossel + # All rights reserved. + # + # Author: Esben Rossel + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: + # 1. Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # 2. Redistributions in binary form must reproduce the above copyright + # notice, this list of conditions and the following disclaimer in the + # documentation and/or other materials provided with the distribution. + # + # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + +#python imports +import tkinter as tk +import threading +import queue +import matplotlib as plt + +#application imports +import config +import CCDpanelsetup +import CCDmenusetup +import CCDplots + + + +if __name__ == '__main__': + root = tk.Tk() + root.title("The Otter pyCCDGUI") + + SerQueue = queue.Queue() + + menu = CCDmenusetup.buildmenu(root) + CCDplot = CCDplots.buildplot(root) + panel = CCDpanelsetup.buildpanel(root, CCDplot, SerQueue) + panel.grid(row=0, column=2) + + root.mainloop()