josm-plugins-0.0.svn30137/0000755000175000017500000000000012275270074014533 5ustar andrewandrewjosm-plugins-0.0.svn30137/svn-info.xml0000644000175000017500000000064412275270075017021 0ustar andrewandrew http://svn.openstreetmap.org/applications/editors/josm/plugins http://svn.openstreetmap.org b9d5c4c9-76e1-0310-9c85-f3177eceb1e4 bastik 2014-02-07T20:03:23.467262Z josm-plugins-0.0.svn30137/colorscheme/0000755000175000017500000000000012275270063017034 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/.settings/0000755000175000017500000000000012275270062020751 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000000055412204774241025737 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.6 josm-plugins-0.0.svn30137/colorscheme/src/0000755000175000017500000000000012275270062017622 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/src/at/0000755000175000017500000000000012275270062020226 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/0000755000175000017500000000000012275270062022531 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/0000755000175000017500000000000012275270062023501 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/plugin/0000755000175000017500000000000012275270062024777 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/plugin/colorscheme/0000755000175000017500000000000012275270062027302 5ustar andrewandrew././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/plugin/colorscheme/ColorSchemePreference.javajosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/plugin/colorscheme/ColorSchemePreferen0000644000175000017500000002104012205016044033103 0ustar andrewandrew/** * Copyright by Christof Dallermassl * This program is free software and licensed under GPL. */ package at.dallermassl.josm.plugin.colorscheme; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.preferences.PreferenceSetting; import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane; import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting; import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting; import org.openstreetmap.josm.gui.preferences.display.ColorPreference; import org.openstreetmap.josm.tools.GBC; public class ColorSchemePreference implements SubPreferenceSetting { private static final String PREF_KEY_SCHEMES_PREFIX = "colorschemes."; private static final String PREF_KEY_SCHEMES_NAMES = PREF_KEY_SCHEMES_PREFIX + "names"; public static final String PREF_KEY_COLOR_PREFIX = "color."; private JList schemesList; private DefaultListModel listModel; private ListcolorKeys; private ColorPreference colorPreference; /** * Default Constructor */ public ColorSchemePreference() { } /* (non-Javadoc) * @see org.openstreetmap.josm.gui.preferences.PreferenceSetting#addGui(org.openstreetmap.josm.gui.preferences.PreferenceDialog) */ @Override public void addGui(final PreferenceTabbedPane gui) { JPanel panel = new JPanel(new GridBagLayout()); panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); Map colorMap = Main.pref.getAllPrefix(PREF_KEY_COLOR_PREFIX); colorKeys = new ArrayList(colorMap.keySet()); Collections.sort(colorKeys); listModel = new DefaultListModel(); schemesList = new JList(listModel); String schemes = Main.pref.get(PREF_KEY_SCHEMES_NAMES); StringTokenizer st = new StringTokenizer(schemes, ";"); String schemeName; while (st.hasMoreTokens()) { schemeName = st.nextToken(); listModel.addElement(schemeName); } JButton useScheme = new JButton(tr("Use")); useScheme.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (schemesList.getSelectedIndex() == -1) JOptionPane.showMessageDialog(Main.parent, tr("Please select a scheme to use.")); else { String schemeName = (String) listModel.get(schemesList.getSelectedIndex()); getColorPreference(gui).setColorModel(getColorMap(schemeName)); } } }); JButton addScheme = new JButton(tr("Add")); addScheme.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { String schemeName = JOptionPane.showInputDialog(Main.parent, tr("Color Scheme")); if (schemeName == null) return; schemeName = schemeName.replaceAll("\\.", "_"); setColorScheme(schemeName, getColorPreference(gui).getColorModel()); listModel.addElement(schemeName); saveSchemeNamesToPref(); } }); JButton deleteScheme = new JButton(tr("Delete")); deleteScheme.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if (schemesList.getSelectedIndex() == -1) JOptionPane.showMessageDialog(Main.parent, tr("Please select the scheme to delete.")); else { String schemeName = (String) listModel.get(schemesList.getSelectedIndex()); removeColorSchemeFromPreferences(schemeName); listModel.remove(schemesList.getSelectedIndex()); saveSchemeNamesToPref(); } } }); schemesList.setVisibleRowCount(3); //schemesList.setToolTipText(tr("The sources (url or filename) of annotation preset definition files. See http://josm.eigenheimstrasse.de/wiki/AnnotationPresets for help.")); useScheme.setToolTipText(tr("Use the selected scheme from the list.")); addScheme.setToolTipText(tr("Use the current colors as a new color scheme.")); deleteScheme.setToolTipText(tr("Delete the selected scheme from the list.")); panel.add(new JLabel(tr("Color Schemes")), GBC.eol().insets(0,5,0,0)); panel.add(new JScrollPane(schemesList), GBC.eol().fill(GBC.BOTH)); JPanel buttonPanel = new JPanel(new GridBagLayout()); panel.add(buttonPanel, GBC.eol().fill(GBC.HORIZONTAL)); buttonPanel.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL)); buttonPanel.add(useScheme, GBC.std().insets(0,5,5,0)); buttonPanel.add(addScheme, GBC.std().insets(0,5,5,0)); buttonPanel.add(deleteScheme, GBC.std().insets(0,5,5,0)); JScrollPane scrollpane = new JScrollPane(panel); scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 )); gui.getDisplayPreference().getTabPane().addTab(tr("Color Schemes"), scrollpane); } @Override public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) { return gui.getDisplayPreference(); } /** * Saves the names of the schemes to the preferences. */ public void saveSchemeNamesToPref() { if (schemesList.getModel().getSize() > 0) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < schemesList.getModel().getSize(); ++i) sb.append(";"+schemesList.getModel().getElementAt(i)); Main.pref.put(PREF_KEY_SCHEMES_NAMES, sb.toString().substring(1)); } else Main.pref.put(PREF_KEY_SCHEMES_NAMES, null); } @Override public boolean ok() { return false;// nothing to do } @Override public boolean isExpert() { return false; } /** * Remove all color entries for the given scheme from the preferences. * @param schemeName the name of the scheme. */ public void removeColorSchemeFromPreferences(String schemeName) { // delete color entries for scheme in preferences: Map colors = Main.pref.getAllPrefix(PREF_KEY_SCHEMES_PREFIX + schemeName + "."); for(String key : colors.keySet()) { Main.pref.put(key, null); } } /** * Copy all color entries from the given map to entries in preferences with the scheme name. * @param schemeName the name of the scheme. * @param the map containing the color key (without prefix) and the html color values. */ public void setColorScheme(String schemeName, Map colorMap) { String key; for(String colorKey : colorMap.keySet()) { key = PREF_KEY_SCHEMES_PREFIX + schemeName + "." + PREF_KEY_COLOR_PREFIX + colorKey; Main.pref.put(key, colorMap.get(colorKey)); } } /** * Reads all colors for a scheme and returns them in a map (key = color key without prefix, * value = html color code). * @param schemeName the name of the scheme. */ public Map getColorMap(String schemeName) { String colorKey; String prefix = PREF_KEY_SCHEMES_PREFIX + schemeName + "." + PREF_KEY_COLOR_PREFIX; MapcolorMap = new HashMap(); for(String schemeColorKey : Main.pref.getAllPrefix(prefix).keySet()) { colorKey = schemeColorKey.substring(prefix.length()); colorMap.put(colorKey, Main.pref.get(schemeColorKey)); } return colorMap; } public ColorPreference getColorPreference(PreferenceTabbedPane gui) { if(colorPreference == null) { for(PreferenceSetting setting : gui.getSettings()) { if(setting instanceof ColorPreference) { colorPreference = (ColorPreference) setting; break; } } } return colorPreference; } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/plugin/colorscheme/ColorSchemePlugin.javajosm-plugins-0.0.svn30137/colorscheme/src/at/dallermassl/josm/plugin/colorscheme/ColorSchemePlugin.j0000644000175000017500000000125011444175611033036 0ustar andrewandrew/** * Copyright by Christof Dallermassl * This program is free software and licensed under GPL. */ package at.dallermassl.josm.plugin.colorscheme; import org.openstreetmap.josm.gui.preferences.PreferenceSetting; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; /** * ColorScheme Plugin for JOSM. * @author cdaller * */ public class ColorSchemePlugin extends Plugin { /** * Default Constructor */ public ColorSchemePlugin(PluginInformation info) { super(info); } @Override public PreferenceSetting getPreferenceSetting() { return new ColorSchemePreference(); } } josm-plugins-0.0.svn30137/colorscheme/.project0000644000175000017500000000056711273507120020505 0ustar andrewandrew JOSM-colorscheme org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature josm-plugins-0.0.svn30137/colorscheme/GPL-v2.0.txt0000644000175000017500000004310312116201065020671 0ustar andrewandrew GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. josm-plugins-0.0.svn30137/colorscheme/.classpath0000644000175000017500000000056612204774241021025 0ustar andrewandrew josm-plugins-0.0.svn30137/colorscheme/GPL-v3.0.txt0000644000175000017500000010451312116201065020675 0ustar andrewandrew GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . josm-plugins-0.0.svn30137/colorscheme/data/0000755000175000017500000000000012275270063017745 5ustar andrewandrewjosm-plugins-0.0.svn30137/colorscheme/build.xml0000644000175000017500000000167612205016044020655 0ustar andrewandrew josm-plugins-0.0.svn30137/colorscheme/LICENSE0000644000175000017500000000031212116201065020023 0ustar andrewandrewPlugin colorscheme This plugin is copyrighted 2008-2009 by Christof Dallermassl . It is distributed under GPL-v3 or later license (see file gpl-3.0.txt in this directory). josm-plugins-0.0.svn30137/build-common.xml0000644000175000017500000003204612161561455017647 0ustar andrewandrew Building against core revision ${coreversion.info.entry.revision}. Plugin-Mainversion is set to ${plugin.main.version}. Commiting the plugin source with message '${commit.message}' ... Updating plugin source ... Updating ${plugin.jar} ... ***** Properties of published ${plugin.jar} ***** Commit message : '${commit.message}' Plugin-Mainversion: ${plugin.main.version} JOSM build version: ${coreversion.info.entry.revision} Plugin-Version : ${version.entry.commit.revision} ***** / Properties of published ${plugin.jar} ***** Now commiting ${plugin.jar} ... You can use following targets: * dist This default target builds the plugin jar file * clean Cleanup automatical created files * publish Checkin source code, build jar and checkin plugin jar (requires proper entry for SVN commit message!) * install Install the plugin in current system * runjosm Install plugin and start josm * profilejosm Install plugin and start josm in profiling mode There are other targets, which usually should not be called manually. josm-plugins-0.0.svn30137/editgpx/0000755000175000017500000000000012275270066016200 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/.settings/0000755000175000017500000000000012275270066020116 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/.settings/org.eclipse.jdt.ui.prefs0000644000175000017500000001176411456531276024601 0ustar andrewandrew#Sat Oct 16 19:07:29 CEST 2010 cleanup.add_default_serial_version_id=true cleanup.add_generated_serial_version_id=false cleanup.add_missing_annotations=true cleanup.add_missing_deprecated_annotations=true cleanup.add_missing_methods=false cleanup.add_missing_nls_tags=false cleanup.add_missing_override_annotations=true cleanup.add_serial_version_id=false cleanup.always_use_blocks=true cleanup.always_use_parentheses_in_expressions=false cleanup.always_use_this_for_non_static_field_access=false cleanup.always_use_this_for_non_static_method_access=false cleanup.convert_to_enhanced_for_loop=false cleanup.correct_indentation=false cleanup.format_source_code=false cleanup.format_source_code_changes_only=false cleanup.make_local_variable_final=true cleanup.make_parameters_final=false cleanup.make_private_fields_final=true cleanup.make_type_abstract_if_missing_method=false cleanup.make_variable_declarations_final=false cleanup.never_use_blocks=false cleanup.never_use_parentheses_in_expressions=true cleanup.organize_imports=false cleanup.qualify_static_field_accesses_with_declaring_class=false cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true cleanup.qualify_static_member_accesses_with_declaring_class=true cleanup.qualify_static_method_accesses_with_declaring_class=false cleanup.remove_private_constructors=true cleanup.remove_trailing_whitespaces=false cleanup.remove_trailing_whitespaces_all=true cleanup.remove_trailing_whitespaces_ignore_empty=false cleanup.remove_unnecessary_casts=true cleanup.remove_unnecessary_nls_tags=true cleanup.remove_unused_imports=true cleanup.remove_unused_local_variables=false cleanup.remove_unused_private_fields=true cleanup.remove_unused_private_members=false cleanup.remove_unused_private_methods=true cleanup.remove_unused_private_types=true cleanup.sort_members=false cleanup.sort_members_all=false cleanup.use_blocks=false cleanup.use_blocks_only_for_return_and_throw=false cleanup.use_parentheses_in_expressions=false cleanup.use_this_for_non_static_field_access=false cleanup.use_this_for_non_static_field_access_only_if_necessary=true cleanup.use_this_for_non_static_method_access=false cleanup.use_this_for_non_static_method_access_only_if_necessary=true cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile cleanup_settings_version=2 eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true formatter_profile=_Eclipse [built-in] + spaces for indent formatter_settings_version=11 sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=true sp_cleanup.add_missing_deprecated_annotations=true sp_cleanup.add_missing_methods=false sp_cleanup.add_missing_nls_tags=false sp_cleanup.add_missing_override_annotations=false sp_cleanup.add_serial_version_id=false sp_cleanup.always_use_blocks=true sp_cleanup.always_use_parentheses_in_expressions=false sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=true sp_cleanup.format_source_code=false sp_cleanup.format_source_code_changes_only=false sp_cleanup.make_local_variable_final=false sp_cleanup.make_parameters_final=false sp_cleanup.make_private_fields_final=true sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=false sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=true sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=false sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true sp_cleanup.remove_trailing_whitespaces=true sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=false sp_cleanup.remove_unused_imports=false sp_cleanup.remove_unused_local_variables=false sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_blocks=false sp_cleanup.use_blocks_only_for_return_and_throw=false sp_cleanup.use_parentheses_in_expressions=false sp_cleanup.use_this_for_non_static_field_access=false sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true josm-plugins-0.0.svn30137/editgpx/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000006711112135470424025101 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=0 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 org.eclipse.jdt.core.formatter.blank_lines_before_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.jdt.core.formatter.blank_lines_before_package=0 org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false org.eclipse.jdt.core.formatter.comment.format_block_comments=true org.eclipse.jdt.core.formatter.comment.format_header=false org.eclipse.jdt.core.formatter.comment.format_html=true org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true org.eclipse.jdt.core.formatter.comment.format_line_comments=true org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.jdt.core.formatter.comment.line_length=80 org.eclipse.jdt.core.formatter.compact_else_if=true org.eclipse.jdt.core.formatter.continuation_indentation=2 org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_empty_lines=false org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=4 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.join_lines_in_comments=true org.eclipse.jdt.core.formatter.join_wrapped_lines=true org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false org.eclipse.jdt.core.formatter.lineSplit=80 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=4 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true josm-plugins-0.0.svn30137/editgpx/src/0000755000175000017500000000000012275270065016766 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/0000755000175000017500000000000012275270065017555 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/0000755000175000017500000000000012275270065022443 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/0000755000175000017500000000000012275270065023413 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/0000755000175000017500000000000012275270065025074 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/0000755000175000017500000000000012275270066026541 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxPlugin.java0000644000175000017500000000346412015535255032132 0ustar andrewandrew/** * License: GPL. Copyright 2008. Martin Garbe (leo at running-sheep dot com) */ package org.openstreetmap.josm.plugins.editgpx; import static org.openstreetmap.josm.tools.I18n.tr; import java.net.URL; import javax.swing.ImageIcon; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.IconToggleButton; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; /** * Provides an editable GPX layer. Editable layer here means the deletion of points is supported. * This plugin can be used to prepare tracks for upload to OSM eg. delete uninteresting parts * of the track. * Additionally while converting the track back to a normal GPX layer the time can be made * anonymous. This feature sets all time stamps to 1970-01-01 00:00. * * TODO: * - BUG: when importing eGpxLayer is shown as RawGpxLayer?? * - implement reset if user made mistake while marking * * */ public class EditGpxPlugin extends Plugin { private IconToggleButton btn; private EditGpxMode mode; public EditGpxPlugin(PluginInformation info) { super(info); mode = new EditGpxMode(Main.map, "editgpx", tr("edit gpx tracks")); btn = new IconToggleButton(mode); btn.setVisible(true); } /** * initialize button. if button is pressed create new layer. */ @Override public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) { mode.setFrame(newFrame); if (oldFrame == null && newFrame != null) { if (Main.map != null) Main.map.addMapMode(btn); } } public static ImageIcon loadIcon(String name) { URL url = EditGpxPlugin.class.getResource("/images/editgpx.png"); return new ImageIcon(url); } } josm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxLayer.java0000644000175000017500000001324712135470424031747 0ustar andrewandrew/** * License: GPL. Copyright 2008. Martin Garbe (leo at running-sheep dot com) */ package org.openstreetmap.josm.plugins.editgpx; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.ImageIcon; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.dialogs.LayerListDialog; import org.openstreetmap.josm.gui.dialogs.LayerListPopup; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrack; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrackSegment; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxWayPoint; import org.openstreetmap.josm.tools.ImageProvider; public class EditGpxLayer extends Layer { private static Icon icon = new ImageIcon(Toolkit.getDefaultToolkit().createImage(EditGpxPlugin.class.getResource("/images/editgpx_layer.png"))); public final EditGpxData data; private GPXLayerImportAction layerImport; public EditGpxLayer(String str, EditGpxData gpxData) { super(str); data = gpxData; layerImport = new GPXLayerImportAction(data); } /** * check if dataSet is empty * if so show import dialog to user */ public void initializeImport() { try { if(data.isEmpty()) { layerImport.activateImport(); } } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } @Override public Icon getIcon() { return icon; } @Override public Object getInfoComponent() { return getToolTipText(); } @Override public Action[] getMenuEntries() { return new Action[] { LayerListDialog.getInstance().createShowHideLayerAction(), LayerListDialog.getInstance().createDeleteLayerAction(), SeparatorLayerAction.INSTANCE, layerImport, new ConvertToGpxLayerAction(), new ConvertToAnonTimeGpxLayerAction(), SeparatorLayerAction.INSTANCE, new LayerListPopup.InfoAction(this)}; } @Override public String getToolTipText() { return tr("Layer for editing GPX tracks"); } @Override public boolean isMergable(Layer other) { // TODO return false; } @Override public void mergeFrom(Layer from) { // TODO } @Override public void paint(Graphics2D g, MapView mv, Bounds bounds) { g.setColor(Color.yellow); //don't iterate through dataSet whiling making changes synchronized(layerImport.importing) { for (EditGpxTrack track: data.getTracks()) { for (EditGpxTrackSegment segment: track.getSegments()) { for (EditGpxWayPoint wayPoint: segment.getWayPoints()) { if (!wayPoint.isDeleted()) { Point pnt = mv.getPoint(wayPoint.getCoor().getEastNorth()); g.drawOval(pnt.x - 2, pnt.y - 2, 4, 4); } } } } } } public void reset(){ //TODO implement a reset } @Override public void visitBoundingBox(BoundingXYVisitor v) { // TODO Auto-generated method stub } /** * convert a DataSet to GPX * * @param boolean anonTime If true set all time and date in GPX to 01/01/1970 00:00 ? * @return GPXData */ private GpxData toGpxData(boolean anonTime) { return data.createGpxData(anonTime); } /** * Context item "Convert to GPX layer" */ public class ConvertToGpxLayerAction extends AbstractAction { public ConvertToGpxLayerAction() { super(tr("Convert to GPX layer"), ImageProvider.get("converttogpx")); } @Override public void actionPerformed(ActionEvent e) { if (Main.map.mapMode instanceof EditGpxMode) { if (!Main.map.selectSelectTool(false)) { Main.map.selectZoomTool(false); // Select tool might not be support of active layer, zoom is always supported } } Main.main.addLayer(new GpxLayer(toGpxData(false), tr("Converted from: {0}", getName()))); Main.main.removeLayer(EditGpxLayer.this); } } /** * Context item "Convert to GPX layer with anonymised time" */ public class ConvertToAnonTimeGpxLayerAction extends AbstractAction { public ConvertToAnonTimeGpxLayerAction() { super(tr("Convert to GPX layer with anonymised time"), ImageProvider.get("converttogpx")); } @Override public void actionPerformed(ActionEvent e) { if (Main.map.mapMode instanceof EditGpxMode) { if (!Main.map.selectSelectTool(false)) { Main.map.selectZoomTool(false); // Select tool might not be support of active layer, zoom is always supported } } Main.main.addLayer(new GpxLayer(toGpxData(true), tr("Converted from: {0}", getName()))); Main.main.removeLayer(EditGpxLayer.this); } } } josm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/EditGpxMode.java0000644000175000017500000001320012144521552031543 0ustar andrewandrew/** * License: GPL. Copyright 2008. Martin Garbe (leo at running-sheep dot com) */ package org.openstreetmap.josm.plugins.editgpx; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.mapmode.MapMode; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.MapView.LayerChangeListener; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrack; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxTrackSegment; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxWayPoint; public class EditGpxMode extends MapMode implements LayerChangeListener { private static final long serialVersionUID = 7940589057093872411L; Point pointPressed; MapFrame mapFrame; Rectangle oldRect; MapFrame frame; EditGpxLayer currentEditLayer; public EditGpxMode(MapFrame mapFrame, String name, String desc) { super(name, "editgpx_mode.png", desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } @Override public void enterMode() { super.enterMode(); Main.map.mapView.addMouseListener(this); Main.map.mapView.addMouseMotionListener(this); MapView.addLayerChangeListener(this); updateLayer(); } @Override public void exitMode() { super.exitMode(); Main.map.mapView.removeMouseListener(this); Main.map.mapView.removeMouseMotionListener(this); } @Override public void mousePressed(MouseEvent e) { pointPressed = new Point(e.getPoint()); } @Override public void mouseDragged(MouseEvent e) { if ( (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == InputEvent.BUTTON1_DOWN_MASK) { //if button1 is hold, draw the rectangle. paintRect(pointPressed, e.getPoint()); } } @Override public void mouseReleased(MouseEvent e) { if (e.getButton() != MouseEvent.BUTTON1) { return; } requestFocusInMapView(); Point pointReleased = e.getPoint(); Rectangle r = createRect(pointReleased, pointPressed); //go through nodes and mark the ones in the selection rect as deleted if (currentEditLayer != null) { for (EditGpxTrack track: currentEditLayer.data.getTracks()) { for (EditGpxTrackSegment segment: track.getSegments()) { for (EditGpxWayPoint wayPoint: segment.getWayPoints()) { Point p = Main.map.mapView.getPoint(wayPoint.getCoor().getEastNorth()); if (r.contains(p)) { wayPoint.setDeleted(true); } } } } } oldRect = null; Main.map.mapView.repaint(); } /** * create rectangle out of two given corners */ public Rectangle createRect(Point p1, Point p2) { int x,y,w,h; if (p1.x == p2.x && p1.y == p2.y) { //if p1 and p2 same points draw a small rectangle around them x = p1.x -1; y = p1.y -1; w = 3; h = 3; } else { if (p1.x < p2.x){ x = p1.x; w = p2.x-p1.x; } else { x = p2.x; w = p1.x-p2.x; } if (p1.y < p2.y) { y = p1.y; h = p2.y-p1.y; } else { y = p2.y; h = p1.y-p2.y; } } return new Rectangle(x,y,w,h); } /** * Draw a selection rectangle on screen. */ private void paintRect(Point p1, Point p2) { if (frame != null) { Graphics g = frame.getGraphics(); Rectangle r = oldRect; if (r != null) { //overwrite old rct g.setXORMode(Color.BLACK); g.setColor(Color.WHITE); g.drawRect(r.x,r.y,r.width,r.height); } g.setXORMode(Color.BLACK); g.setColor(Color.WHITE); r = createRect(p1,p2); g.drawRect(r.x,r.y,r.width,r.height); oldRect = r; } } public void setFrame(MapFrame mapFrame) { frame = mapFrame; } /** * create new layer, add listeners and try importing gpx data. */ private void updateLayer() { List layers = Main.map.mapView.getLayersOfType(EditGpxLayer.class); currentEditLayer = layers.isEmpty()?null:layers.get(0); if(currentEditLayer == null) { currentEditLayer = new EditGpxLayer(tr("EditGpx"), new EditGpxData()); Main.main.addLayer(currentEditLayer); currentEditLayer.initializeImport(); } Main.map.mapView.repaint(); } public void activeLayerChange(Layer oldLayer, Layer newLayer) { } public void layerAdded(Layer newLayer) { } public void layerRemoved(Layer oldLayer) { if (oldLayer instanceof EditGpxLayer) { currentEditLayer = null; if(Main.map.mapMode instanceof EditGpxMode) Main.map.selectSelectTool(false); } } @Override public void destroy() { super.destroy(); MapView.removeLayerChangeListener(this); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/GPXLayerImportAction.javajosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/GPXLayerImportAction.ja0000644000175000017500000001031111737367620033042 0ustar andrewandrew/** * License: GPL. Copyright 2008. Martin Garbe (leo at running-sheep dot com) * * other source from mesurement plugin written by Raphael Mack * */ package org.openstreetmap.josm.plugins.editgpx; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.awt.event.ActionEvent; import java.util.Collection; import javax.swing.AbstractAction; import javax.swing.Box; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.plugins.editgpx.data.EditGpxData; import org.openstreetmap.josm.tools.ImageProvider; /** * Import GPX data from available layers * * */ class GPXLayerImportAction extends AbstractAction { private static final long serialVersionUID = 5794897888911798168L; private EditGpxData data; public Object importing = new Object(); //used for synchronization public GPXLayerImportAction(EditGpxData data) { //TODO what is icon at the end? super(tr("Import path from GPX layer"), ImageProvider.get("dialogs", "edit")); this.data = data; } /** * shows a list of GPX layers. if user selects one the data from this layer is * imported. */ public void activateImport() { Box panel = Box.createVerticalBox(); DefaultListModel dModel= new DefaultListModel(); final JList layerList = new JList(dModel); Collection data = Main.map.mapView.getAllLayers(); int layerCnt = 0; for (Layer l : data){ if(l instanceof GpxLayer){ dModel.addElement(l); layerCnt++; } } if(layerCnt > 0){ layerList.setSelectionInterval(0, layerCnt-1); layerList.setCellRenderer(new DefaultListCellRenderer(){ @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Layer layer = (Layer)value; JLabel label = (JLabel)super.getListCellRendererComponent(list, layer.getName(), index, isSelected, cellHasFocus); Icon icon = layer.getIcon(); label.setIcon(icon); label.setToolTipText(layer.getToolTipText()); return label; } }); JCheckBox dropFirst = new JCheckBox(tr("Drop existing path")); dropFirst.setEnabled(!this.data.getTracks().isEmpty()); panel.add(layerList); panel.add(dropFirst); final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){ @Override public void selectInitialValue() { layerList.requestFocusInWindow(); } }; final JDialog dlg = optionPane.createDialog(Main.parent, tr("Import path from GPX layer")); dlg.setVisible(true); Object answer = optionPane.getValue(); if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) { return; } if (dropFirst.isSelected()) { this.data.getTracks().clear(); } synchronized(importing) { for (Object o : layerList.getSelectedValues()) { GpxLayer gpx = (GpxLayer )o; this.data.load(gpx.data); } } Main.map.mapView.repaint(); } else { // no gps layer JOptionPane.showMessageDialog(Main.parent,tr("No GPX data layer found.")); } } /** * called when pressing "Import.." from context menu of EditGpx layer * */ public void actionPerformed(ActionEvent arg0) { activateImport(); } } josm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/0000755000175000017500000000000012275270066027452 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java0000644000175000017500000000730512021322142032631 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.editgpx.data; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.TimeZone; import org.openstreetmap.josm.data.gpx.GpxTrack; import org.openstreetmap.josm.data.gpx.GpxTrackSegment; import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack; import org.openstreetmap.josm.data.gpx.WayPoint; public class EditGpxTrack { private final List segments = new ArrayList(); private final Map attributes = new HashMap(); private boolean isDeleted; public EditGpxTrack(GpxTrack track) { attributes.putAll(track.getAttributes()); for (GpxTrackSegment segment: track.getSegments()) { segments.add(new EditGpxTrackSegment(segment)); } } public List getSegments() { return segments; } public Map getAttributes() { return attributes; } public GpxTrack createGpxTrack(boolean anonTime, double minTime) { Collection> wayPoints = new ArrayList>(); final DateFormat iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); final TimeZone utc = TimeZone.getTimeZone("UTC"); iso8601.setTimeZone(utc); for (EditGpxTrackSegment segment: segments) { if (!segment.isDeleted()) { List points = segment.getNonDeletedWaypoints(); if (!points.isEmpty()) { if (anonTime) { // convert to anonymous time for (WayPoint w : points) { double t = w.time - minTime; w.attr.put("time", iso8601.format( new Date((long)(t * 1000)))); w.setTime(); assert w.time == t; if (w.attr.containsKey("name")) { w.attr.put("name", "anon"); //time information can also be in "name" field. so delete time information } } } wayPoints.add(points); } } } if (anonTime) { if (attributes.containsKey("name")) { attributes.put("name", "anon");//time information can also be in "name" field. so delete time information } } return new ImmutableGpxTrack(wayPoints, attributes); } public void setDeleted(boolean isDeleted) { this.isDeleted = isDeleted; } public boolean isDeleted() { return isDeleted; } /** * time of the oldest waypoint in the set of non-deleted waypoints * in this track (in seconds since Epoch) */ public double minNonDeletedTime() { boolean foundOne = false; double minTime = 0.0; for (EditGpxTrackSegment segment: segments) { if (!segment.isDeleted()) { try { double t = segment.minNonDeletedTime(); if ((!foundOne) || (t < minTime)) { minTime = t; } foundOne = true; } catch (NoSuchElementException e) { continue; } } } if (!foundOne) { throw new NoSuchElementException(); } return minTime; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.javajosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegmen0000644000175000017500000000252212021322142033044 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.editgpx.data; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.openstreetmap.josm.data.gpx.GpxTrackSegment; import org.openstreetmap.josm.data.gpx.WayPoint; public class EditGpxTrackSegment { private final List wayPoints = new ArrayList(); private boolean deleted; public EditGpxTrackSegment(GpxTrackSegment segment) { for (WayPoint wayPoint: segment.getWayPoints()) { wayPoints.add(new EditGpxWayPoint(wayPoint)); } } public List getWayPoints() { return wayPoints; } public List getNonDeletedWaypoints() { List result = new ArrayList(); for (EditGpxWayPoint wp: wayPoints) { if (!wp.isDeleted()) { result.add(wp.createWayPoint()); } } return result; } public void setDeleted(boolean deleted) { this.deleted = deleted; } public boolean isDeleted() { return deleted; } /** * time of the oldest waypoint in the set of non-deleted waypoints * in this segment (in seconds since Epoch) */ public double minNonDeletedTime() { return Collections.min(getNonDeletedWaypoints()).time; } } josm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java0000644000175000017500000000553012021322142032434 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.editgpx.data; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.data.gpx.GpxRoute; import org.openstreetmap.josm.data.gpx.GpxTrack; import org.openstreetmap.josm.data.gpx.WayPoint; public class EditGpxData { private final List tracks = new ArrayList(); // Only copy of routes and waypoints to preserve all info when converting back to gpx track private final List routes = new ArrayList(); private final List waypoints = new ArrayList(); public void load(GpxData data) { for (GpxTrack track: data.tracks) { tracks.add(new EditGpxTrack(track)); } routes.clear(); routes.addAll(data.routes); waypoints.clear(); waypoints.addAll(data.waypoints); } public boolean isEmpty() { for (EditGpxTrack track: tracks) { for (EditGpxTrackSegment segment: track.getSegments()) { if (!segment.getWayPoints().isEmpty()) { return false; } } } return true; } public List getTracks() { return tracks; } public GpxData createGpxData(boolean anonTime) { GpxData result = new GpxData(); double minTime = 0.0; if (anonTime) { try { minTime = minNonDeletedTime(); } catch (NoSuchElementException e) { // minTime won't be used, so ignore the exception } } for (EditGpxTrack track: tracks) { if (!track.isDeleted()) { GpxTrack newTrack = track.createGpxTrack(anonTime, minTime); if (!newTrack.getSegments().isEmpty()) { result.tracks.add(newTrack); } } } result.routes.addAll(routes); result.waypoints.addAll(waypoints); return result; } /** * time of the oldest waypoint in the set of non-deleted waypoints * in this data (in seconds since Epoch) */ public double minNonDeletedTime() { boolean foundOne = false; double minTime = 0.0; for (EditGpxTrack track: tracks) { if (!track.isDeleted()) { try { double t = track.minNonDeletedTime(); if ((!foundOne) || (t < minTime)) { minTime = t; } foundOne = true; } catch (NoSuchElementException e) { continue; } } } if (!foundOne) { throw new NoSuchElementException(); } return minTime; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.javajosm-plugins-0.0.svn30137/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.ja0000644000175000017500000000237212021322142033007 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.editgpx.data; import java.util.HashMap; import java.util.Map; import org.openstreetmap.josm.data.coor.CachedLatLon; import org.openstreetmap.josm.data.gpx.WayPoint; public class EditGpxWayPoint implements Comparable { private final double time; private final CachedLatLon coor; private boolean deleted; private Map attributes; public EditGpxWayPoint(WayPoint wayPoint) { this.time = wayPoint.time; this.coor = new CachedLatLon(wayPoint.getCoor()); this.attributes = new HashMap(wayPoint.attr); } public WayPoint createWayPoint() { WayPoint result = new WayPoint(getCoor()); result.time = time; result.attr = attributes; return result; } public void setDeleted(boolean deleted) { this.deleted = deleted; } public boolean isDeleted() { return deleted; } /** * returns this waypoint's time in seconds since Epoch */ public double getTime() { return time; } public CachedLatLon getCoor() { return coor; } public int compareTo(EditGpxWayPoint o) { return Double.compare(getTime(), o.getTime()); } } josm-plugins-0.0.svn30137/editgpx/images/0000755000175000017500000000000012275270065017444 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/images/editgpx_layer.png0000644000175000017500000000057111161736510023010 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYs  tIME v$߮ 6Vz͵ l(Vҫ 6 珘o8/=IENDB`josm-plugins-0.0.svn30137/editgpx/images/mapmode/0000755000175000017500000000000012275270065021066 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/images/mapmode/editgpx_mode.png0000644000175000017500000000216311161736510024241 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYs  tIME IDATHŕ]Leoiii˂0c) ,!`L6ÕF/K65z$,BcdXtci :ʇBaF]y9y<#=.QnZ>LǾp)&%1c 'Ov ΍#//f4A, Kܸ9cGE*ݍA @v'/i?/fzrF‘^x%~_XWST\-48Xd''ωnG11~PT^sm.M+?#݂ɔN,(%,YYznruxk"J723hS-ϱD`1 @VmYcyue]Tb&܍zk nND݌7}^V+kBg&Xi %Ey9BQo>FZmVnGUמfuXx<$qDQDE6 '<\=4׋L @}:z2 2 N~΀˙PNUǘ\KsjsC <$iM4jz]h4j,j^U{U}7D"ABe*\f4z_b`#FwyZ\>h]s @\zcs=֐̣#Q񐬪;A!զ{{לy9t_Ts[m^l<Nۉ e:SZ` 8^VVU.$ ׁj5`(6%jT tP=`xC ӝV`@EH Ik$dZޫ@u吔 Pd.74E/cvS)Fɯ",Q"IENDB`josm-plugins-0.0.svn30137/editgpx/.project0000644000175000017500000000105112205101701017622 0ustar andrewandrew JOSM-editgpx org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature src-common 2 C:/Users/leo/dev/josm/core/src josm-plugins-0.0.svn30137/editgpx/.classpath0000644000175000017500000000056311456531276020172 0ustar andrewandrew josm-plugins-0.0.svn30137/editgpx/data/0000755000175000017500000000000012275270066017111 5ustar andrewandrewjosm-plugins-0.0.svn30137/editgpx/build.xml0000644000175000017500000000213512205016044020005 0ustar andrewandrew josm-plugins-0.0.svn30137/routing/0000755000175000017500000000000012275270073016221 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/.settings/0000755000175000017500000000000012275270073020137 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000001504312143734466025131 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 josm-plugins-0.0.svn30137/routing/src/0000755000175000017500000000000012275270072017007 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/0000755000175000017500000000000012275270072017565 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/0000755000175000017500000000000012275270072021421 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/0000755000175000017500000000000012275270073022372 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/0000755000175000017500000000000012275270072023667 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/0000755000175000017500000000000012275270073025357 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/RoutingModel.java0000644000175000017500000000774211732704400030635 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import com.innovant.josm.jrt.core.RoutingGraph; import com.innovant.josm.jrt.core.RoutingGraph.Algorithm; import com.innovant.josm.jrt.osm.OsmEdge; /** * This class holds all the routing data and operations * @author juangui * @author Jose Vidal * */ public class RoutingModel { /** * Logger */ static Logger logger = Logger.getLogger(RoutingModel.class); /** * Graph to calculate route */ public RoutingGraph routingGraph=null; /** * List of nodes that the route has to traverse */ private List nodes=null; private List path=null; /** * Flag to advise about changes in the selected nodes. */ private boolean changeNodes=false; /** * Flag to advise about changes in ways. */ private boolean changeOneway=false; /** * Default Constructor. */ public RoutingModel(DataSet data) { nodes = new ArrayList(); System.out.println("gr " + data); routingGraph = new RoutingGraph(data); } /** * Method that returns the selected nodes to calculate route. * @return the selectedNodes */ public List getSelectedNodes() { return nodes; } /** * Adds a node to the route node list. * @param node the node to add. */ public void addNode(Node node) { nodes.add(node); this.changeNodes=true; } /** * Removes a node from the route node list. * @param index the index of the node to remove. */ public void removeNode(int index) { if (nodes.size()>index) { nodes.remove(index); this.changeNodes=true; } } /** * Inserts a node in the route node list. * @param index the index where the node will be inserted * @param node the node to be inserted */ public void insertNode(int index, Node node) { if (nodes.size()>=index) { nodes.add(index, node); this.changeNodes=true; } } /** * Reverse list of nodes */ public void reverseNodes() { List aux = new ArrayList(); for (Node n : nodes) { aux.add(0,n); } nodes = aux; this.changeNodes=true; } /** * Get the edges of the route. * @return A list of edges forming the shortest path */ public List getRouteEdges() { if (this.changeNodes || path==null) { path=this.routingGraph.applyAlgorithm(nodes, Algorithm.ROUTING_ALG_DIJKSTRA); this.changeNodes=false; this.changeOneway=false; } return path; } /** * Marks that some node or the node order has changed so the path should be computed again */ public void setNodesChanged() { this.changeNodes = true; } /** * Marks that "Ignore oneway" option has changed so the path should be computed again */ public void setOnewayChanged() { this.changeOneway = true; } /** * Marks that "Ignore oneway" option has changed so the path should be computed again */ public boolean getOnewayChanged() { return this.changeOneway; } /** * Resets all data. */ public void reset() { nodes.clear(); this.changeNodes=true; } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/RoutingPlugin.java0000644000175000017500000002310612143734466031037 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing; import static org.openstreetmap.josm.tools.I18n.tr; import java.io.File; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter; import org.openstreetmap.josm.data.osm.event.DatasetEventManager; import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode; import org.openstreetmap.josm.gui.IconToggleButton; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.MapView.LayerChangeListener; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.gui.preferences.PreferenceSetting; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; import com.innovant.josm.plugin.routing.actions.AddRouteNodeAction; import com.innovant.josm.plugin.routing.actions.MoveRouteNodeAction; import com.innovant.josm.plugin.routing.actions.RemoveRouteNodeAction; import com.innovant.josm.plugin.routing.gui.RoutingDialog; import com.innovant.josm.plugin.routing.gui.RoutingMenu; import com.innovant.josm.plugin.routing.gui.RoutingPreferenceDialog; /** * The main class of the routing plugin * @author juangui * @author Jose Vidal * @author cdaller * * @version 0.3 */ public class RoutingPlugin extends Plugin implements LayerChangeListener,DataSetListenerAdapter.Listener { /** * Logger */ static Logger logger = Logger.getLogger(RoutingPlugin.class); /** * The list of routing layers */ private final ArrayList layers; /** * The side dialog where nodes are listed */ private RoutingDialog routingDialog; /** * Preferences Settings Dialog. */ private final PreferenceSetting preferenceSettings; /** * MapMode for adding route nodes. * We use this field to enable or disable the mode automatically. */ private AddRouteNodeAction addRouteNodeAction; /** * MapMode for removing route nodes. * We use this field to enable or disable the mode automatically. */ private RemoveRouteNodeAction removeRouteNodeAction; /** * MapMode for moving route nodes. * We use this field to enable or disable the mode automatically. */ private MoveRouteNodeAction moveRouteNodeAction; /** * IconToggleButton for adding route nodes, we use this field to show or hide the button. */ private IconToggleButton addRouteNodeButton; /** * IconToggleButton for removing route nodes, we use this field to show or hide the button. */ private IconToggleButton removeRouteNodeButton; /** * IconToggleButton for moving route nodes, we use this field to show or hide the button. */ private IconToggleButton moveRouteNodeButton; /** * IconToggleButton for moving route nodes, we use this field to show or hide the button. */ private final RoutingMenu menu; /** * Reference for the plugin class (as if it were a singleton) */ private static RoutingPlugin plugin; private final DataSetListenerAdapter datasetAdapter; /** * Default Constructor */ public RoutingPlugin(PluginInformation info) { super(info); datasetAdapter = new DataSetListenerAdapter(this); plugin = this; // Assign reference to the plugin class File log4jConfigFile = new java.io.File("log4j.xml"); if (log4jConfigFile.exists()) { DOMConfigurator.configure(log4jConfigFile.getPath()); } else { System.err.println("Routing plugin warning: log4j configuration not found"); } logger.debug("Loading routing plugin..."); preferenceSettings=new RoutingPreferenceDialog(); // Initialize layers list layers = new ArrayList(); // Add menu menu = new RoutingMenu(); // Register this class as LayerChangeListener MapView.addLayerChangeListener(this); DatasetEventManager.getInstance().addDatasetListener(datasetAdapter, FireMode.IN_EDT_CONSOLIDATED); logger.debug("Finished loading plugin"); } /** * Provides static access to the plugin instance, to enable access to the plugin methods * @return the instance of the plugin */ public static RoutingPlugin getInstance() { return plugin; } /** * Get the routing side dialog * @return The instance of the routing side dialog */ public RoutingDialog getRoutingDialog() { return routingDialog; } public void addLayer() { OsmDataLayer osmLayer = Main.map.mapView.getEditLayer(); if (osmLayer != null) { RoutingLayer layer = new RoutingLayer(tr("Routing") + " [" + osmLayer.getName() + "]", osmLayer); layers.add(layer); Main.main.addLayer(layer); } } /* * (non-Javadoc) * @see org.openstreetmap.josm.plugins.Plugin#mapFrameInitialized(org.openstreetmap.josm.gui.MapFrame, org.openstreetmap.josm.gui.MapFrame) */ @Override public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) { if (newFrame != null) { // Create plugin map modes addRouteNodeAction = new AddRouteNodeAction(newFrame); removeRouteNodeAction = new RemoveRouteNodeAction(newFrame); moveRouteNodeAction = new MoveRouteNodeAction(newFrame); // Create plugin buttons and add them to the toolbar addRouteNodeButton = new IconToggleButton(addRouteNodeAction); removeRouteNodeButton = new IconToggleButton(removeRouteNodeAction); moveRouteNodeButton = new IconToggleButton(moveRouteNodeAction); addRouteNodeButton.setAutoHideDisabledButton(true); removeRouteNodeButton.setAutoHideDisabledButton(true); moveRouteNodeButton.setAutoHideDisabledButton(true); newFrame.addMapMode(addRouteNodeButton); newFrame.addMapMode(removeRouteNodeButton); newFrame.addMapMode(moveRouteNodeButton); // Enable menu menu.enableStartItem(); newFrame.addToggleDialog(routingDialog = new RoutingDialog()); } else { addRouteNodeAction = null; removeRouteNodeAction = null; moveRouteNodeAction = null; addRouteNodeButton = null; removeRouteNodeButton = null; moveRouteNodeButton = null; routingDialog = null; } } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener#activeLayerChange(org.openstreetmap.josm.gui.layer.Layer, org.openstreetmap.josm.gui.layer.Layer) */ public void activeLayerChange(Layer oldLayer, Layer newLayer) { if (newLayer instanceof RoutingLayer) { /* show Routing toolbar and dialog window */ menu.enableRestOfItems(); if (routingDialog != null) { routingDialog.showDialog(); routingDialog.refresh(); } }else{ /* hide Routing toolbar and dialog window */ menu.disableRestOfItems(); if (routingDialog != null) { routingDialog.hideDialog(); } } } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener#layerAdded(org.openstreetmap.josm.gui.layer.Layer) */ public void layerAdded(Layer newLayer) { // Add button(s) to the tool bar when the routing layer is added if (newLayer instanceof RoutingLayer) { menu.enableRestOfItems(); // Set layer on top and select layer, also refresh toggleDialog to reflect selection Main.map.mapView.moveLayer(newLayer, 0); logger.debug("Added routing layer."); } } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener#layerRemoved(org.openstreetmap.josm.gui.layer.Layer) */ public void layerRemoved(Layer oldLayer) { if ((oldLayer instanceof RoutingLayer) & (layers.size()==1)) { // Remove button(s) from the tool bar when the last routing layer is removed addRouteNodeButton.setVisible(false); removeRouteNodeButton.setVisible(false); moveRouteNodeButton.setVisible(false); menu.disableRestOfItems(); layers.remove(oldLayer); logger.debug("Removed routing layer."); } else if (oldLayer instanceof OsmDataLayer) { // Remove all associated routing layers // Convert to Array to prevent ConcurrentModificationException when removing layers from ArrayList // FIXME: can't remove associated routing layers without triggering exceptions in some cases RoutingLayer[] layersArray = layers.toArray(new RoutingLayer[0]); for (int i=0;i" +"Graph Vertex: "+this.routingModel.routingGraph.getVertexCount()+"
" +"Graph Edges: "+this.routingModel.routingGraph.getEdgeCount()+"
" + "" + ""; return info; } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#getMenuEntries() */ @Override public Action[] getMenuEntries() { Collection components = new ArrayList(); components.add(LayerListDialog.getInstance().createShowHideLayerAction()); // components.add(new JMenuItem(new LayerListDialog.ShowHideMarkerText(this))); components.add(LayerListDialog.getInstance().createDeleteLayerAction()); components.add(SeparatorLayerAction.INSTANCE); components.add(new RenameLayerAction(getAssociatedFile(), this)); components.add(SeparatorLayerAction.INSTANCE); components.add(new LayerListPopup.InfoAction(this)); return components.toArray(new Action[0]); } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#getToolTipText() */ @Override public String getToolTipText() { String tooltip = this.routingModel.routingGraph.getVertexCount() + " vertices, " + this.routingModel.routingGraph.getEdgeCount() + " edges"; return tooltip; } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#isMergable(org.openstreetmap.josm.gui.layer.Layer) */ @Override public boolean isMergable(Layer other) { return false; } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#mergeFrom(org.openstreetmap.josm.gui.layer.Layer) */ @Override public void mergeFrom(Layer from) { // This layer is not mergable, so do nothing } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#paint(java.awt.Graphics, org.openstreetmap.josm.gui.MapView) */ @Override public void paint(Graphics2D g, MapView mv, Bounds bounds) { boolean isActiveLayer = (mv.getActiveLayer().equals(this)); // Get routing nodes (start, middle, end) List nodes = routingModel.getSelectedNodes(); // Get path stroke color from preferences // Color is different for active and inactive layers Color color; if (isActiveLayer) { color = Main.pref.getColor(PreferencesKeys.KEY_ACTIVE_ROUTE_COLOR.key, Color.RED); } else { color = Main.pref.getColor(PreferencesKeys.KEY_INACTIVE_ROUTE_COLOR.key, Color.decode("#dd2222")); } // Get path stroke width from preferences String widthString = Main.pref.get(PreferencesKeys.KEY_ROUTE_WIDTH.key); if (widthString.length() == 0) { widthString = "2"; /* I think 2 is better */ // FIXME add after good width is found: Main.pref.put(KEY_ROUTE_WIDTH, widthString); } int width = Integer.parseInt(widthString); // draw our graph if (isActiveLayer) { if(routingModel != null) { if(routingModel.routingGraph != null && routingModel.routingGraph.getGraph() != null) { Set graphEdges = routingModel.routingGraph.getGraph().edgeSet(); if (!graphEdges.isEmpty()) { Color color2 = ColorHelper.html2color("#00ff00"); /* just green for now */ OsmEdge firstedge = (OsmEdge) graphEdges.toArray()[0]; Point from = mv.getPoint(firstedge.fromEastNorth()); g.drawRect(from.x-4, from.y+4, from.x+4, from.y-4); for(OsmEdge edge : graphEdges) { drawGraph(g, mv, edge, color2, width); } } } } } if(nodes == null || nodes.size() == 0) return; // Paint routing path List routeEdges = routingModel.getRouteEdges(); if(routeEdges != null) { for(OsmEdge edge : routeEdges) { drawEdge(g, mv, edge, color, width, true); } } // paint start icon Node node = nodes.get(0); Point screen = mv.getPoint(node); startIcon.paintIcon(mv, g, screen.x - startIcon.getIconWidth()/2, screen.y - startIcon.getIconHeight()); // paint middle icons for(int index = 1; index < nodes.size() - 1; ++index) { node = nodes.get(index); screen = mv.getPoint(node); middleIcon.paintIcon(mv, g, screen.x - startIcon.getIconWidth()/2, screen.y - middleIcon.getIconHeight()); } // paint end icon if(nodes.size() > 1) { node = nodes.get(nodes.size() - 1); screen = mv.getPoint(node); endIcon.paintIcon(mv, g, screen.x - startIcon.getIconWidth()/2, screen.y - endIcon.getIconHeight()); } } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#visitBoundingBox(org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor) */ @Override public void visitBoundingBox(BoundingXYVisitor v) { for (Node node : routingModel.getSelectedNodes()) { v.visit(node); } } /* * (non-Javadoc) * @see org.openstreetmap.josm.gui.layer.Layer#destroy() */ @Override public void destroy() { routingModel.reset(); // layerAdded = false; } /** * Draw a line with the given color. */ private void drawEdge(Graphics g, MapView mv, OsmEdge edge, Color col, int width, boolean showDirection) { g.setColor(col); Point from; Point to; from = mv.getPoint(edge.fromEastNorth()); to = mv.getPoint(edge.toEastNorth()); Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Anti-alias! Stroke oldStroke = g2d.getStroke(); g2d.setStroke(new BasicStroke(width)); // thickness g2d.drawLine(from.x, from.y, to.x, to.y); if (showDirection) { double t = Math.atan2(to.y-from.y, to.x-from.x) + Math.PI; g.drawLine(to.x,to.y, (int)(to.x + 10*Math.cos(t-ARROW_PHI)), (int)(to.y + 10*Math.sin(t-ARROW_PHI))); g.drawLine(to.x,to.y, (int)(to.x + 10*Math.cos(t+ARROW_PHI)), (int)(to.y + 10*Math.sin(t+ARROW_PHI))); } g2d.setStroke(oldStroke); } private void drawGraph(Graphics g, MapView mv, OsmEdge edge, Color col, int width) { g.setColor(col); Point from; Point to; from = mv.getPoint(edge.fromEastNorth()); to = mv.getPoint(edge.toEastNorth()); Graphics2D g2d = (Graphics2D)g; Stroke oldStroke = g2d.getStroke(); g2d.setStroke(new BasicStroke(width)); // thickness g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); // Anti-alias! g2d.drawLine(from.x, from.y, to.x, to.y); g2d.drawRect(to.x- 4, to.y+4, 4, 4); g2d.setStroke(oldStroke); } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/0000755000175000017500000000000012275270073027017 5ustar andrewandrew././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/AddRouteNodeAction.javajosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/AddRouteNodeAction.ja0000644000175000017500000000635712143734466033026 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing.actions; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.MouseEvent; import org.apache.log4j.Logger; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.mapmode.MapMode; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.tools.ImageProvider; import com.innovant.josm.plugin.routing.RoutingLayer; import com.innovant.josm.plugin.routing.RoutingPlugin; /** * Accounts for the selection or unselection of the routing tool in the tool bar, * and the mouse events when this tool is selected * @author Juangui * @author Jose Vidal * */ public class AddRouteNodeAction extends MapMode { /** * Logger. */ static Logger logger = Logger.getLogger(AddRouteNodeAction.class); /** * Constructor * @param mapFrame */ public AddRouteNodeAction(MapFrame mapFrame) { // TODO Use constructor with shortcut super(tr("Routing"), "add", tr("Click to add destination."), mapFrame, ImageProvider.getCursor("crosshair", null)); } @Override public void enterMode() { super.enterMode(); Main.map.mapView.addMouseListener(this); } @Override public void exitMode() { super.exitMode(); Main.map.mapView.removeMouseListener(this); } @Override public void mouseClicked(MouseEvent e) { // If left button is clicked if (e.getButton() == MouseEvent.BUTTON1) { // Search for nearest highway node Node node = null; if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); node = layer.getNearestHighwayNode(e.getPoint()); if(node == null) { logger.debug("no selected node"); return; } logger.debug("selected node " + node); layer.getRoutingModel().addNode(node); RoutingPlugin.getInstance().getRoutingDialog().addNode(node); } } Main.map.repaint(); } @Override public boolean layerIsSupported(Layer l) { return l instanceof RoutingLayer; } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/MoveRouteNodeAction.javajosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/MoveRouteNodeAction.j0000644000175000017500000001214212144521552033057 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing.actions; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Point; import java.awt.event.MouseEvent; import java.util.List; import org.apache.log4j.Logger; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.mapmode.MapMode; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.tools.ImageProvider; import org.openstreetmap.josm.gui.layer.Layer; import com.innovant.josm.plugin.routing.RoutingLayer; import com.innovant.josm.plugin.routing.RoutingModel; import com.innovant.josm.plugin.routing.RoutingPlugin; import com.innovant.josm.plugin.routing.gui.RoutingDialog; /** * Accounts for the selection or unselection of the routing tool in the tool bar, * and the mouse events when this tool is selected * @author Juangui * @author Jose Vidal * */ public class MoveRouteNodeAction extends MapMode { /** * Square of the distance radius where route nodes can be selected for dragging */ private static final int DRAG_SQR_RADIUS = 100; /** * Logger. */ static Logger logger = Logger.getLogger(RoutingLayer.class); /** * Index of dragged node */ private int index; /** * Constructor * @param mapFrame */ public MoveRouteNodeAction(MapFrame mapFrame) { // TODO Use constructor with shortcut super(tr("Routing"), "move", tr("Click and drag to move destination"), mapFrame, ImageProvider.getCursor("normal", "move")); } @Override public void enterMode() { super.enterMode(); Main.map.mapView.addMouseListener(this); } @Override public void exitMode() { super.exitMode(); Main.map.mapView.removeMouseListener(this); } @Override public void mousePressed(MouseEvent e) { // If left button is pressed if (e.getButton() == MouseEvent.BUTTON1) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { requestFocusInMapView(); RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); // Search for the nearest node in the list List nl = routingModel.getSelectedNodes(); index = -1; double dmax = DRAG_SQR_RADIUS; // maximum distance, in pixels for (int i=0;i=0) logger.debug("Moved from node " + nl.get(index)); } } } @Override public void mouseReleased(MouseEvent e) { // If left button is released and a route node is being dragged if ((e.getButton() == MouseEvent.BUTTON1) && (index>=0)) { searchAndReplaceNode(e.getPoint()); } } @Override public void mouseDragged(MouseEvent e) { } private void searchAndReplaceNode(Point point) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); RoutingDialog routingDialog = RoutingPlugin.getInstance().getRoutingDialog(); // Search for nearest highway node Node node = null; node = layer.getNearestHighwayNode(point); if (node == null) { logger.debug("Didn't found a close node to move to."); return; } logger.debug("Moved to node " + node); routingModel.removeNode(index); routingDialog.removeNode(index); routingModel.insertNode(index, node); routingDialog.insertNode(index, node); Main.map.repaint(); } } @Override public boolean layerIsSupported(Layer l) { return l instanceof RoutingLayer; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/RemoveRouteNodeAction.javajosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/actions/RemoveRouteNodeAction0000644000175000017500000001003412143734466033165 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing.actions; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.MouseEvent; import java.util.List; import org.apache.log4j.Logger; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.mapmode.MapMode; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.tools.ImageProvider; import com.innovant.josm.plugin.routing.RoutingLayer; import com.innovant.josm.plugin.routing.RoutingModel; import com.innovant.josm.plugin.routing.RoutingPlugin; /** * Accounts for the selection or unselection of the remove route nodes tool in the tool bar, * and the mouse events when this tool is selected * @author Juangui * @author Jose Vidal * */ public class RemoveRouteNodeAction extends MapMode { /** * Square of the distance radius where route nodes can be removed */ private static final int REMOVE_SQR_RADIUS = 100; /** * Logger. */ static Logger logger = Logger.getLogger(RoutingLayer.class); public RemoveRouteNodeAction(MapFrame mapFrame) { // TODO Use constructor with shortcut super(tr("Routing"), "remove", tr("Click to remove destination"), mapFrame, ImageProvider.getCursor("normal", "delete")); } @Override public void enterMode() { super.enterMode(); Main.map.mapView.addMouseListener(this); } @Override public void exitMode() { super.exitMode(); Main.map.mapView.removeMouseListener(this); } @Override public void mouseClicked(MouseEvent e) { // If left button is clicked if (e.getButton() == MouseEvent.BUTTON1) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); // Search for the nearest node in the list List nl = routingModel.getSelectedNodes(); int index = -1; double dmax = REMOVE_SQR_RADIUS; // maximum distance, in pixels for (int i=0;i= 0) { // Remove node logger.debug("Removing node " + nl.get(index)); routingModel.removeNode(index); RoutingPlugin.getInstance().getRoutingDialog().removeNode(index); Main.map.repaint(); } else { logger.debug("Can't find a node to remove."); } } } } @Override public boolean layerIsSupported(Layer l) { return l instanceof RoutingLayer; } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/package.html0000644000175000017500000000025511163156043027635 0ustar andrewandrew Package Main classes of Plugin. josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/gui/0000755000175000017500000000000012275270073026143 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/gui/RoutingDialog.java0000644000175000017500000000716611742247041031564 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.ComponentOrientation; import java.awt.event.KeyEvent; import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.JScrollPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.gui.dialogs.ToggleDialog; import org.openstreetmap.josm.tools.Shortcut; import com.innovant.josm.plugin.routing.RoutingLayer; import com.innovant.josm.plugin.routing.RoutingModel; /** * @author jose * */ public class RoutingDialog extends ToggleDialog { private final DefaultListModel model; private JList jList = null; private JScrollPane jScrollPane = null; /** * Serial UID */ private static final long serialVersionUID = 8625615652900341987L; public RoutingDialog() { super(tr("Routing"), "routing", tr("Open a list of routing nodes"), Shortcut.registerShortcut("subwindow:routing", tr("Toggle: {0}", tr("Routing")), KeyEvent.VK_R, Shortcut.ALT_CTRL_SHIFT), 150); model = new DefaultListModel(); createLayout(getJScrollPane(), false, null); } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); jScrollPane.setViewportView(getJList()); } return jScrollPane; } /** * This method initializes jList * * @return javax.swing.JList */ private JList getJList() { if (jList == null) { jList = new JList(); jList.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); jList.setModel(model); } return jList; } /** * Remove item from the list of nodes * @param index */ public void removeNode(int index) { model.remove(index); } /** * Add item to the list of nodes * @param obj */ public void addNode(Node n) { model.addElement(n.getId()+" ["+n.getCoor().toDisplayString()+"]"); } /** * Insert item to the list of nodes * @param index * @param obj */ public void insertNode(int index, Node n) { model.insertElementAt(n.getId()+" ["+n.getCoor().toDisplayString()+"]", index); } /** * Clear list of nodes */ public void clearNodes() { model.clear(); } public void refresh() { clearNodes(); if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer routingLayer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = routingLayer.getRoutingModel(); for (Node n : routingModel.getSelectedNodes()) { addNode(n); } } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/gui/RoutingPreferenceDialog.javajosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/gui/RoutingPreferenceDialog.j0000644000175000017500000001610711742247041033066 0ustar andrewandrew/* * * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.ComponentOrientation; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Map; import java.util.Map.Entry; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; import org.apache.log4j.Logger; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting; import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane; import org.openstreetmap.josm.tools.GBC; import com.innovant.josm.jrt.osm.OsmWayTypes; public class RoutingPreferenceDialog extends DefaultTabPreferenceSetting { /** * Logger */ static Logger logger = Logger.getLogger(RoutingPreferenceDialog.class); private Map orig; private DefaultTableModel model; /** * Constructor */ public RoutingPreferenceDialog() { super("routing", tr("Routing Plugin Preferences"), tr("Configure routing preferences.")); readPreferences(); } public void addGui(final PreferenceTabbedPane gui) { JPanel principal = gui.createPreferenceTab(this); JPanel p = new JPanel(); p.setLayout(new GridBagLayout()); model = new DefaultTableModel(new String[] { tr("Highway type"), tr("Speed (Km/h)") }, 0) { private static final long serialVersionUID = 4253339034781567453L; @Override public boolean isCellEditable(int row, int column) { return column != 0; } }; final JTable list = new JTable(model); loadSpeeds(model); JScrollPane scroll = new JScrollPane(list); p.add(scroll, GBC.eol().fill(GBC.BOTH)); scroll.setPreferredSize(new Dimension(200, 200)); JButton add = new JButton(tr("Add")); p.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL)); p.add(add, GBC.std().insets(0, 5, 0, 0)); add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JPanel p = new JPanel(new GridBagLayout()); p.add(new JLabel(tr("Weight")), GBC.std().insets(0, 0, 5, 0)); JComboBox key = new JComboBox(); for (OsmWayTypes pk : OsmWayTypes.values()) key.addItem(pk.getTag()); JTextField value = new JTextField(10); p.add(key, GBC.eop().insets(5, 0, 0, 0).fill(GBC.HORIZONTAL)); p.add(new JLabel(tr("Value")), GBC.std().insets(0, 0, 5, 0)); p.add(value, GBC.eol().insets(5, 0, 0, 0).fill(GBC.HORIZONTAL)); int answer = JOptionPane.showConfirmDialog(gui, p, tr("Enter weight values"), JOptionPane.OK_CANCEL_OPTION); if (answer == JOptionPane.OK_OPTION) { model .addRow(new String[] { key.getSelectedItem().toString(), value.getText() }); } } }); JButton delete = new JButton(tr("Delete")); p.add(delete, GBC.std().insets(0, 5, 0, 0)); delete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (list.getSelectedRow() == -1) JOptionPane.showMessageDialog(gui, tr("Please select the row to delete.")); else { Integer i; while ((i = list.getSelectedRow()) != -1) model.removeRow(i); } } }); JButton edit = new JButton(tr("Edit")); p.add(edit, GBC.std().insets(5, 5, 5, 0)); edit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { edit(gui, list); } }); JTabbedPane Opciones = new JTabbedPane(); Opciones.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); Opciones.addTab("Profile", null, p, null); // Opciones.addTab("Preferences", new JPanel()); list.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) edit(gui, list); } }); principal.add(Opciones, GBC.eol().fill(GBC.BOTH)); } public boolean ok() { for (int i = 0; i < model.getRowCount(); ++i) { String value = model.getValueAt(i, 1).toString(); if (value.length() != 0) { String key = model.getValueAt(i, 0).toString(); String origValue = orig.get(key); if (origValue == null || !origValue.equals(value)) Main.pref.put(key, value); orig.remove(key); // processed. } } for (Entry e : orig.entrySet()) Main.pref.put(e.getKey(), null); return false; } private void edit(final PreferenceTabbedPane gui, final JTable list) { if (list.getSelectedRowCount() != 1) { JOptionPane.showMessageDialog(gui, tr("Please select the row to edit.")); return; } String v = JOptionPane.showInputDialog(tr("New value for {0}", model .getValueAt(list.getSelectedRow(), 0)), model.getValueAt(list .getSelectedRow(), 1)); if (v != null) model.setValueAt(v, list.getSelectedRow(), 1); } private void loadSpeeds(DefaultTableModel model) { // Read dialog values from preferences readPreferences(); // Put these values in the model for (String tag : orig.keySet()) { model.addRow(new String[] { tag, orig.get(tag) }); } } private void readPreferences() { orig = Main.pref.getAllPrefix("routing.profile.default.speed"); if (orig.size() == 0) { // defaults logger.debug("Loading Default Preferences."); for (OsmWayTypes owt : OsmWayTypes.values()) { Main.pref.putInteger("routing.profile.default.speed." + owt.getTag(), owt.getSpeed()); } orig = Main.pref.getAllPrefix("routing.profile.default.speed"); } else logger.debug("Default preferences already exist."); } /* private String getKeyTag(String tag) { return tag.split(".", 5)[4]; } private String getTypeTag(String tag) { return tag.split(".", 5)[3]; } private String getNameTag(String tag) { return tag.split(".", 5)[2]; } */ } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/plugin/routing/gui/RoutingMenu.java0000644000175000017500000001527312174544314031272 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.plugin.routing.gui; import static org.openstreetmap.josm.gui.help.HelpUtil.ht; import static org.openstreetmap.josm.tools.I18n.marktr; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.MainMenu; import com.innovant.josm.jrt.core.RoutingGraph.RouteType; import com.innovant.josm.plugin.routing.RoutingLayer; import com.innovant.josm.plugin.routing.RoutingModel; import com.innovant.josm.plugin.routing.RoutingPlugin; /** * The menu bar from this plugin * @author jvidal * */ public class RoutingMenu extends JMenu { /** * Default serial version UID */ private static final long serialVersionUID = 3559922048225708480L; private final JMenuItem startMI; private final JMenuItem reverseMI; private final JMenuItem clearMI; private final JMenuItem regraphMI; private final JMenu criteriaM; private final JMenu menu; /** */ public RoutingMenu() { MainMenu mm = Main.main.menu; menu = mm.addMenu(marktr("Routing"), KeyEvent.VK_O, mm.getDefaultMenuPos(), ht("/Plugin/Routing")); startMI = new JMenuItem(tr("Add routing layer")); startMI.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { RoutingPlugin.getInstance().addLayer(); } }); menu.add(startMI); menu.addSeparator(); ButtonGroup group = new ButtonGroup(); criteriaM = new JMenu(tr("Criteria")); JRadioButtonMenuItem rshorter = new JRadioButtonMenuItem(tr("Shortest")); rshorter.setSelected(true); rshorter.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); if (e.getStateChange()==ItemEvent.SELECTED) { routingModel.routingGraph.setTypeRoute(RouteType.SHORTEST); } else { routingModel.routingGraph.setTypeRoute(RouteType.FASTEST); } // routingModel.routingGraph.resetGraph(); // routingModel.routingGraph.createGraph(); //TODO: Change this way //FIXME: do not change node but recalculate routing. routingModel.setNodesChanged(); Main.map.repaint(); } } }); JRadioButtonMenuItem rfaster = new JRadioButtonMenuItem(tr("Fastest")); group.add(rshorter); group.add(rfaster); criteriaM.add(rshorter); criteriaM.add(rfaster); criteriaM.addSeparator(); JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(tr("Ignore oneways")); cbmi.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); if (e.getStateChange()==ItemEvent.SELECTED) routingModel.routingGraph.getRoutingProfile().setOnewayUse(false); else routingModel.routingGraph.getRoutingProfile().setOnewayUse(true); routingModel.setNodesChanged(); routingModel.setOnewayChanged(); Main.map.repaint(); } } }); criteriaM.add(cbmi); menu.add(criteriaM); menu.addSeparator(); reverseMI = new JMenuItem(tr("Reverse route")); reverseMI.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); routingModel.reverseNodes(); Main.map.repaint(); } } }); menu.add(reverseMI); clearMI = new JMenuItem(tr("Clear route")); clearMI.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); // Reset routing nodes and paths routingModel.reset(); RoutingPlugin.getInstance().getRoutingDialog().clearNodes(); Main.map.repaint(); } } }); menu.add(clearMI); regraphMI = new JMenuItem(tr("Reconstruct Graph")); regraphMI.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (Main.map.mapView.getActiveLayer() instanceof RoutingLayer) { RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); routingModel.routingGraph.resetGraph(); routingModel.routingGraph.createGraph(); } } }); menu.add(regraphMI); // Initially disabled disableAllItems(); } public void disableAllItems() { startMI.setEnabled(false); reverseMI.setEnabled(false); clearMI.setEnabled(false); criteriaM.setEnabled(false); regraphMI.setEnabled(false); } public void enableStartItem() { startMI.setEnabled(true); } public void enableRestOfItems() { reverseMI.setEnabled(true); clearMI.setEnabled(true); criteriaM.setEnabled(true); regraphMI.setEnabled(true); } public void disableRestOfItems() { reverseMI.setEnabled(false); clearMI.setEnabled(false); criteriaM.setEnabled(false); regraphMI.setEnabled(false); } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/0000755000175000017500000000000012275270073023171 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/gtfs/0000755000175000017500000000000012275270073024134 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/gtfs/GTFSTransportModes.java0000644000175000017500000000305111212550273030437 0ustar andrewandrewpackage com.innovant.josm.jrt.gtfs; /** * Constants for parsing GTFS and to use in Routing Profiles * @author juangui * TODO Using integers is suitable to parse gtfs feeds but * Routing Profile keys should be Strings */ public class GTFSTransportModes { /** * 0 - Tram, Streetcar, Light rail. Any light rail or street level system within * a metropolitan area. */ public static final int TRAM = 0; public static final int STREETCAR = 0; public static final int LIGHT_RAIL = 0; /** * 1 - Subway, Metro. Any underground rail system within a metropolitan area. */ public static final int SUBWAY = 1; public static final int METRO = 1; /** * 2 - Rail. Used for intercity or long-distance travel. */ public static final int RAIL = 2; /** * 3 - Bus. Used for short- and long-distance bus routes. */ public static final int BUS = 3; /** * 4 - Ferry. Used for short- and long-distance boat service. */ public static final int FERRY = 4; /** * 5 - Cable car. Used for street-level cable cars where the cable runs beneath the car. */ public static final int CABLE_CAR = 5; /** * 6 - Gondola, Suspended cable car. Typically used for aerial cable cars where * the car is suspended from the cable. */ public static final int GONDOLA = 6; public static final int SUSPENDED_CABLE_CAR = 6; /** * 7 - Funicular. Any rail system designed for steep inclines. */ public static final int FUNICULAR = 7; } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/osm/0000755000175000017500000000000012275270073023767 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/osm/OsmEdge.java0000644000175000017500000000455711444174765026200 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.jrt.osm; import org.jgrapht.graph.DefaultWeightedEdge; import org.openstreetmap.josm.data.coor.EastNorth; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.Way; /** * Class that represents an edge of the graph. * @author jose */ public class OsmEdge extends DefaultWeightedEdge { /** * Serial */ private static final long serialVersionUID = 1L; /** * Way associated */ private Way way; /** * Nodes in the edge */ private Node from, to; /** * Length edge */ private double length; /** * Speed edge. */ private double speed; /** * Constructor * @param way * @param length */ public OsmEdge(Way way, Node from, Node to) { super(); this.way = way; this.from = from; this.to = to; this.length = from.getCoor().greatCircleDistance(to.getCoor()); } /** * @return the way */ public Way getWay() { return this.way; } public EastNorth fromEastNorth() { return this.from.getEastNorth(); } public EastNorth toEastNorth() { return this.to.getEastNorth(); } /** * Returns length of segment in meters * @return length of segment in meters. */ public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getSpeed() { return speed; } public void setSpeed(double speed) { this.speed = speed; } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/osm/OsmWayTypes.java0000644000175000017500000000412511212550273027071 0ustar andrewandrew/* * * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.jrt.osm; /** * @author jvidal * */ public enum OsmWayTypes { MOTORWAY ("motorway",120), MOTORWAY_LINK ("motorway_link",120), TRUNK ("trunk",120), TRUNK_LINK ("trunk_link",120), PRIMARY ("primary",100), PRIMARY_LINK ("primary_link",100), SECONDARY ("secondary",90), TERTIARY ("tertiary",90), UNCLASSIFIED ("unclassified",50), ROAD ("road",100), RESIDENTIAL ("residential",50), LIVING_STREET ("living_street",30), SERVICE ("service",30), TRACK ("track",50), PEDESTRIAN ("pedestrian",30), BUS_GUIDEWAY ("bus_guideway",50), PATH ("path",40), CYCLEWAY ("cycleway",40), FOOTWAY ("footway",20), BRIDLEWAY ("bridleway",40), BYWAY ("byway",50), STEPS ("steps",10); /** * Default Constructor * @param tag */ OsmWayTypes(String tag,int speed) { this.tag = tag; this.speed = speed; } /** * Tag */ private final String tag; private final int speed; /** * @return */ public String getTag() {return tag;}; public int getSpeed() {return speed;}; } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/core/0000755000175000017500000000000012275270073024121 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/core/RoutingGraphDelegator.java0000644000175000017500000000241511444174765031236 0ustar andrewandrew/** * */ package com.innovant.josm.jrt.core; import org.apache.log4j.Logger; import org.jgrapht.Graph; import org.jgrapht.graph.GraphDelegator; import org.openstreetmap.josm.data.osm.Node; import com.innovant.josm.jrt.core.RoutingGraphDelegator; import com.innovant.josm.jrt.core.RoutingGraph.RouteType; import com.innovant.josm.jrt.osm.OsmEdge; /** * @author jose * */ public class RoutingGraphDelegator extends GraphDelegator { /** * Logger. */ static Logger logger = Logger.getLogger(RoutingGraphDelegator.class); /** * */ private RouteType routeType; public RoutingGraphDelegator(Graph arg0) { super(arg0); } public RouteType getRouteType() { return routeType; } public void setRouteType(RouteType routeType) { this.routeType = routeType; } /** * */ private static final long serialVersionUID = 1L; @Override public double getEdgeWeight(OsmEdge edge) { double weight=Double.MAX_VALUE; if (routeType==RouteType.SHORTEST) weight=edge.getLength(); if (routeType==RouteType.FASTEST) weight=edge.getLength() / edge.getSpeed(); // Return the time spent to traverse the way return weight; } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/core/RoutingGraph.java0000644000175000017500000002754312154206145027403 0ustar andrewandrew/* * Copyright (C) 2008 Innovant * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA. * * For more information, please contact: * * Innovant * juangui@gmail.com * vidalfree@gmail.com * * http://public.grupoinnovant.com/blog * */ package com.innovant.josm.jrt.core; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.jgrapht.Graph; import org.jgrapht.alg.BellmanFordShortestPath; import org.jgrapht.alg.DijkstraShortestPath; import org.jgrapht.graph.DirectedWeightedMultigraph; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.Way; import com.innovant.josm.jrt.osm.OsmEdge; import com.innovant.josm.plugin.routing.RoutingLayer; import com.innovant.josm.plugin.routing.RoutingModel; /** * Class utility to work with graph routers. * * @author Juangui * @author Jose Vidal * @author Hassan S */ public class RoutingGraph { /** * Routing Profile */ private final RoutingProfile routingProfile; /** * Diferent algorithms to apply to the graph. */ public enum Algorithm { ROUTING_ALG_DIJKSTRA, ROUTING_ALG_BELLMANFORD }; /** * Search criteria for the route. */ public enum RouteType {FASTEST,SHORTEST}; /** * */ private RouteType routeType; /** * Associated Osm DataSet */ private final DataSet data; /** * Logger. */ static Logger logger = Logger.getLogger(RoutingGraph.class); private static Collection excludedHighwayValues = Arrays.asList(new String[]{ "bus_stop", "traffic_signals", "street_lamp", "stop", "construction", "platform", "give_way", "proposed", "milestone", "speed_camera", "abandoned" }); /** * Graph state * true Graph in memory. * false Graph not created. */ // public boolean graphState; /** * OSM Graph. */ // private DirectedWeightedMultigraph graph; // private WeightedMultigraph graph; private Graph graph; private RoutingGraphDelegator rgDelegator=null; /** * Graph getter */ public Graph getGraph(){ return graph; } private void addEdgeBidirectional( Way way, Node from, Node to){ addEdge(way,from,to); addEdge(way,to,from); } private void addEdgeReverseOneway( Way way, Node from, Node to){ addEdge(way,to,from); } private void addEdgeNormalOneway( Way way, Node from, Node to){ addEdge(way,from,to); } /** * Speeds */ private Map waySpeeds; /** * Default Constructor. */ public RoutingGraph(DataSet data) { // this.graphState = false; this.graph = null; this.data = data; routeType=RouteType.SHORTEST; routingProfile=new RoutingProfile("default"); routingProfile.setOnewayUse(true); // Don't ignore oneways by default this.setWaySpeeds(routingProfile.getWaySpeeds()); logger.debug("Created RoutingGraph"); } /** * Create OSM graph for routing * * @return */ public void createGraph() { logger.debug("Creating Graph..."); graph = new DirectedWeightedMultigraph(OsmEdge.class); rgDelegator=new RoutingGraphDelegator(graph); rgDelegator.setRouteType(this.routeType); // iterate all ways and segments for all nodes: for (Way way : data.getWays()) { // skip way if not suitable for routing. if (way == null || way.isDeleted() || !this.isvalidWay(way) || way.getNodes().size() < 1) continue; // INIT Node from = null; Node to = null; List nodes = way.getNodes(); int nodes_count = nodes.size(); /* * Assume node is A B C D E. The procedure should be * * case 1 - bidirectional ways: * 1) Add vertex A B C D E * 2) Link A<->B, B<->C, C<->D, D<->E as Edges * * case 2 - oneway reverse: * 1) Add vertex A B C D E * 2) Link B->A,C->B,D->C,E->D as Edges. result: A<-B<-C<-D<-E * * case 3 - oneway normal: * 1) Add vertex A B C D E * 2) Link A->B, B->C, C->D, D->E as Edges. result: A->B->C->D->E * * */ String oneway_val = way.get("oneway"); /* get (oneway=?) tag for this way. */ String junction_val = way.get("junction"); /* get (junction=?) tag for this way. */ from = nodes.get(0); /* 1st node A */ graph.addVertex(from); /* add vertex A */ for (int i = 1; i < nodes_count; i++) { /* loop from B until E */ to = nodes.get(i); /* 2nd node B */ if (to != null && !to.isDeleted()) { graph.addVertex(to); /* add vertex B */ //this is where we link the vertices if (!routingProfile.isOnewayUsed()) { //"Ignore oneways" is selected addEdgeBidirectional(way, from, to); } else if (oneway_val == null && junction_val == "roundabout") { //Case (roundabout): oneway=implicit yes addEdgeNormalOneway(way, from, to); } else if (oneway_val == null || oneway_val == "false" || oneway_val == "no" || oneway_val == "0") { //Case (bi-way): oneway=false OR oneway=unset OR oneway=0 OR oneway=no addEdgeBidirectional(way, from, to); } else if (oneway_val == "-1") { //Case (oneway reverse): oneway=-1 addEdgeReverseOneway(way, from, to); } else if (oneway_val == "1" || oneway_val == "yes" || oneway_val == "true") { //Case (oneway normal): oneway=yes OR 1 OR true addEdgeNormalOneway(way, from, to); } from = to; /* we did A<->B, next loop we will do B<->C, so from=B,to=C for next loop. */ } } // end of looping thru nodes } // end of looping thru ways logger.debug("End Create Graph"); logger.debug("Vertex: "+graph.vertexSet().size()); logger.debug("Edges: "+graph.edgeSet().size()); } /** * Compute weight and add edge to the graph * @param way * @param from * @param to */ private void addEdge(Way way,Node from, Node to) { LatLon fromLL = from.getCoor(); LatLon toLL = from.getCoor(); if (fromLL == null || toLL == null) { return; } double length = fromLL.greatCircleDistance(toLL); OsmEdge edge = new OsmEdge(way, from, to); edge.setSpeed(12.1); graph.addEdge(from, to, edge); // weight = getWeight(way); double weight = getWeight(way, length); setWeight(edge, length); logger.debug("edge for way " + way.getId() + "(from node " + from.getId() + " to node " + to.getId() + ") has weight: " + weight); ((DirectedWeightedMultigraph)graph).setEdgeWeight(edge, weight); } /** * Set the weight for the given segment depending on the highway type * and the length of the segment. The higher the value, the less it is used * in routing. * * @param way * the way. * @return */ private void setWeight(OsmEdge osmedge, double length) { osmedge.setLength(length); if (this.waySpeeds.containsKey(osmedge.getWay().get("highway"))) osmedge.setSpeed(this.waySpeeds.get(osmedge.getWay().get("highway"))); } /** * Returns the weight for the given segment depending on the highway type * and the length of the segment. The higher the value, the less it is used * in routing. * * @param way * the way. * @return */ private double getWeight(Way way, double length) { // Default speed if no setting is found double speed = 1; switch (routeType) { case SHORTEST: // Same speed for all types of ways if (this.waySpeeds.containsKey("residential")) speed=this.waySpeeds.get("residential"); break; case FASTEST: // Each type of way may have a different speed if (this.waySpeeds.containsKey(way.get("highway"))) speed=this.waySpeeds.get(way.get("highway")); logger.debug("Speed="+speed); break; default: break; } // Return the time spent to traverse the way return length / speed; } /** * Check if a Way is correct. * * @param way * The way. * @return true is valid. false is not valid. */ public boolean isvalidWay(Way way) { //if (!way.isTagged()) <---not needed me thinks // return false; String highway = way.get("highway"); return (highway != null && !excludedHighwayValues.contains(highway)) || way.get("junction") != null || way.get("service") != null; } /** * Apply selected routing algorithm to the graph. * * @param nodes * Nodes used to calculate path. * @param algorithm * Algorithm used to compute the path, * RoutingGraph.Algorithm.ROUTING_ALG_DIJKSTRA or * RoutingGraph.Algorithm.ROUTING_ALG_BELLMANFORD * @return new path. */ public List applyAlgorithm(List nodes, Algorithm algorithm) { List path = new ArrayList(); Graph g; double totalWeight = 0; RoutingLayer layer = (RoutingLayer)Main.map.mapView.getActiveLayer(); RoutingModel routingModel = layer.getRoutingModel(); if (graph == null || routingModel.getOnewayChanged()) this.createGraph(); logger.debug("apply algorithm between nodes "); for (Node node : nodes) { logger.debug(node.getId()); } logger.debug("-----------------------------------"); // Assign the graph to g g = graph; switch (algorithm) { case ROUTING_ALG_DIJKSTRA: logger.debug("Using Dijkstra algorithm"); DijkstraShortestPath routingk = null; for (int index = 1; index < nodes.size(); ++index) { routingk = new DijkstraShortestPath(g, nodes .get(index - 1), nodes.get(index)); if (routingk.getPathEdgeList() == null) { logger.debug("no path found!"); break; } path.addAll(routingk.getPathEdgeList()); totalWeight += routingk.getPathLength(); } break; case ROUTING_ALG_BELLMANFORD: logger.debug("Using Bellman Ford algorithm"); for (int index = 1; index < nodes.size(); ++index) { path = BellmanFordShortestPath.findPathBetween(rgDelegator, nodes .get(index - 1), nodes.get(index)); if (path == null) { logger.debug("no path found!"); return null; } } break; default: logger.debug("Wrong algorithm"); break; } logger.debug("shortest path found: " + path + "\nweight: " + totalWeight); return path; } /** * Return the number of vertices. * @return the number of vertices. */ public int getVertexCount(){ int value=0; if (graph!=null) value=graph.vertexSet().size(); return value; } /** * Return the number of edges. * @return the number of edges. */ public int getEdgeCount(){ int value=0; if (graph!=null) value=graph.edgeSet().size(); return value; } /** * @param routeType the routeType to set */ public void setTypeRoute(RouteType routetype) { this.routeType = routetype; this.rgDelegator.setRouteType(routetype); } /** * @return the routeType */ public RouteType getTypeRoute() { return routeType; } public Map getWaySpeeds() { return waySpeeds; } public void setWaySpeeds(Map waySpeeds) { this.waySpeeds = waySpeeds; } public void resetGraph() { graph=null; } public RoutingProfile getRoutingProfile() { return routingProfile; } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/core/RoutingProfile.java0000644000175000017500000001145411212550273027732 0ustar andrewandrewpackage com.innovant.josm.jrt.core; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.openstreetmap.josm.Main; /** * This class holds information about a routing profile. * * A routing profile specifies the type of vehicle that will go through the route * and the conditions with respect to the traversal of different types of edges * * For instance, a pedestrian can traverse streets in both directions, walk through * pedestrian ways and almost all types of ways except motorways, climb steps, and * can ignore turn restrictions, while a handicapped person would have the same profile * except for climbing steps. A car can drive at the maximum allowed speed of the way, * and can not use cycleways nor pedestrian ways, while a bicycle can, but its maximum * speed for any type of way would be around 50km/h. * * When combined with public transit data, information of which types of transport modes * are allowed for the vehicle can be stored in the profile. For instance, bicycles are * usually allowed to travel on board of trains, trams and subways. * * @author juangui * */ public class RoutingProfile { /** * logger */ static Logger logger = Logger.getLogger(RoutingProfile.class); /** * True if oneway is used for routing (i.e. for cars). */ private boolean useOneway; /** * True if turn restrictions are used for routing (i.e. for cars). */ private boolean useRestrictions; /** * True if maximum allowed speed of ways is considered for routing (i.e. for cars). */ private boolean useMaxAllowedSpeed; /** * Name of the routing profile, for identification issues (i.e. "pedestrian"). */ private String name; /** * Holds traverse speed for each type of way, using the type as key. * A speed of zero means that this type of way cannot be traversed. */ private Map waySpeeds; /** * Holds permission of use for each type of transport mode, using the mode as key. */ private Map allowedModes; /** * Constructor * @param name The name for the routing profile. Please use a name that is * self descriptive, i.e., something that an application user would * understand (like "pedestrian", "motorbike", "bicycle", etc.) */ public RoutingProfile(String name) { logger.debug("Init RoutingProfile with name: "+name); this.name = name; waySpeeds=new HashMap(); Map prefs=Main.pref.getAllPrefix("routing.profile."+name+".speed"); for(String key:prefs.keySet()){ waySpeeds.put((key.split("\\.")[4]), Double.valueOf(prefs.get(key))); } for (String key:waySpeeds.keySet()) logger.debug(key+ "-- speed: "+waySpeeds.get(key)); logger.debug("End init RoutingProfile with name: "+name); } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setOnewayUse(boolean useOneway) { this.useOneway = useOneway; } public boolean isOnewayUsed() { return useOneway; } public void setRestrictionsUse(boolean useRestrictions) { this.useRestrictions = useRestrictions; } public boolean isRestrictionsUsed() { return useRestrictions; } public void setMaxAllowedSpeedUse(boolean useMaxAllowedSpeed) { this.useMaxAllowedSpeed = useMaxAllowedSpeed; } public boolean isMaxAllowedSpeedUsed() { return useMaxAllowedSpeed; } public void setWayTypeSpeed(String type, double speed) { waySpeeds.put(type, speed); } public void setTransportModePermission(String mode, boolean permission) { allowedModes.put(mode, permission); } /** * Return whether the driving profile specifies that a particular type of way * can be traversed * @param type Key for the way type * @return True if the way type can be traversed */ public boolean isWayTypeAllowed(String type) { if (waySpeeds.get(type) != 0.0) return true; return false; } /** * Return whether the driving profile specifies that a particular type of transport * mode can be used * @param mode Key for the way type * @return True if the way type can be traversed */ public boolean isTransportModeAllowed(String mode) { return allowedModes.get(mode); } public double getSpeed(String key){ if(!waySpeeds.containsKey(key)) return 0.0; return waySpeeds.get(key); } public Map getWaySpeeds() { return waySpeeds; } public void setWaySpeeds(Map waySpeeds) { this.waySpeeds = waySpeeds; } } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/core/RoutingEdge.java0000644000175000017500000000074311444174765027214 0ustar andrewandrewpackage com.innovant.josm.jrt.core; import org.openstreetmap.josm.data.coor.LatLon; public interface RoutingEdge { public LatLon fromLatLon(); public LatLon toLatLon(); public Object fromV(); public Object toV(); public double getLength(); public void setLength(double length); public double getSpeed(); public void setSpeed(double speed); public boolean isOneway(); public void setOneway(boolean isOneway); } josm-plugins-0.0.svn30137/routing/src/com/innovant/josm/jrt/core/EdgeIterator.java0000644000175000017500000000020711444174765027351 0ustar andrewandrewpackage com.innovant.josm.jrt.core; public interface EdgeIterator { public boolean hasNext(); public RoutingEdge next(); } josm-plugins-0.0.svn30137/routing/images/0000755000175000017500000000000012275270072017465 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/images/layer/0000755000175000017500000000000012275270072020601 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/images/layer/routing_small.png0000644000175000017500000000146211163156563024174 0ustar andrewandrewPNG  IHDRasRGBbKGD pHYsgRtIME$zӈWIDAT8}KkQsdfrk4)5ڦŢ H[**.nD7*\(Bō/Qklq:͜}<|'a~#s\0֛d =]ǎu4#>GZJ _EH$]]NgHm DKy'9iX|&3*169'.bM;Lь% @f=)P핲#k0ML,˪ lT @]TXшXVQ/2n/7~]Ce;'S |@UUY6 RPl.!`0.N%ww":_c5#Yx_h \/AP e$U !bY,VnP[e5-DE|#n_\\J(?X?\Hug¾R!# @ L0O?RA8#-oЋ*15+w`srH)N Gc'ٮ!GjcfD%0I)Bԅ v-^ Bpɚvb5qK-Ppu_dPZ;O<9oen.-h\0ofߵNIENDB`josm-plugins-0.0.svn30137/routing/images/mapmode/0000755000175000017500000000000012275270072021107 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/images/mapmode/add.png0000644000175000017500000000200611163156563022346 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYsgRtIMEOA=IDATHǭ[hUgfw4MҚd67E&OEE4$bxC ?w{E`iT>eHBNMְ<@?nv>["/G^}lG沢J!$qPva;*) |̩\l+Q]VS$] Жv6Z5B=vY__:1˱'otN–/v,y?(FЈB9Ѻ] Wo籅O0g~b!r,#d:z49۟%68-~zvxZλooHppej{RdLdFk=(dLe@X1'ZhO.tc.al9| R|[6 !2H|37( 혋 tȬHm%dr &"l p7_Lˤ6Drn@Zgo& > rZJ 3BXF><0|Û{[c4laNh3e|O9 ~H4N7_9ȟ-ZϦͱTp7%%RJc]Tu- -eGA_^7?? HJ/lƳϡIENDB`josm-plugins-0.0.svn30137/routing/images/mapmode/move.png0000644000175000017500000000170411163156563022570 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYsgRtIME3DIDATHǭ]hUwf?RnSѤf-.U"a1BŇ""݈Jk i@7}P BEVE!?hQi$9>$NBݔa9w= uuuYs:̀pxхIs7PX yuyٳm@;vzhp0=Z~UK+|3yC͎6Ԋ+R}/uuI mxb- N\dnhC[neKRXSSSG'y5{_w{XK"Tµ(R _?@8"Rjѓi r@pKg.# bHmDkB Fҩ7ρSokǓWN^a_-_,\{[^>|r'">9=᫝mOGCf:~b]konE"Hd2͟0>\ Lw%Lj@ rbFKͬq9 wc1h wiM~(" 5l6K4ޠA bHH$Ҟ "E{RLdxhv\>#>{RƵ{9100 ""o&noM`0A,*ayT6//=yoN6"Ow@fJʾ-oݘqb5kmF+Z6ezک! 8?+ ׫6?}~Z f["IENDB`josm-plugins-0.0.svn30137/routing/images/mapmode/routing.png0000644000175000017500000000212511163156563023307 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYsgRtIME V}IDATHǝ[L\U}\(0@)0rTF1ThSkx >㓉TjS MʹL%3眙9{Jo C aToBfƵ(/hce~$ϰyswl~Xr|m΀뻸>?.Kb36>\z¬QCQZ'PP҃½nؓ53J9 Un9ܞݞo&3Ws\Ԕ(myj<2퐆mTzF!:o1i. Po?uG0S4H`[L L !j+\|c٭eZIhBHjgA`c +m̫J e%QIe !bo*?  G9hm6>P J+0`.8j+V!7vIᗫi`v)QVҧ-PY ^<b% 6G1ʅ[ Mp8U _,ǫ\&13eɳ)~Q]\J16)u*Ho [Yj*Sm`ÏF"!$1#568555T~_IENDB`josm-plugins-0.0.svn30137/routing/images/mapmode/remove.png0000644000175000017500000000202311163156563023112 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYsgRtIME:^0BlIDATHǭ[LefgrXtم ʍ1'cƫV!HbF)"Q. ƘiL Ii^TĀC+ V3^.R7ccBH$8d- d/|vu閖 &&ХAx(lXl=ZCG..b7TJ0ԀHL'm P/oDP}iϛOF+UIipR'` -y~zf`ws (aGb EN~1jNkg3 \8gq_EǾ ^+gqfƙڊ+  %IENDB`josm-plugins-0.0.svn30137/routing/images/routing/middleflag.png0000644000175000017500000000100211163156563023746 0ustar andrewandrewPNG  IHDR szzsRGBbKGD pHYs  tIME5bwtEXtCommentCreated with The GIMPd%nYIDATX헱N`K">/E­bƑ7pcc]4 z]%@ҐpMϹ{ ~ T&VUMĉu^v_J잇ݱ>s~<xk6e̓O @Ez=}wN)UKF`eϓ:"3oaJ;niܒR0E<_Xk[1R'F2Ʉ.]DZqִ5 DQT"r90zE!۱4 VA (^Щ"CX"l w7[r0 I8J1 2Ud0IENDB`josm-plugins-0.0.svn30137/routing/images/routing/startflag.png0000644000175000017500000000071411163156563023656 0ustar andrewandrewPNG  IHDR szzsRGBbKGD pHYs  tIME51tEXtCommentCreated with The GIMPd%n#IDATX=N@E )5)I(|j7i#;:0%+( C:?z)d͛7# ā#DDĀIffu]{g攏}ŶPUL1oJnm n/eY4M\G=TD tK$@UUU~/@@+6]"A!|5ς06&_D#/bF r`f` 06U}gC9[ks/tlx2:\&;2Gv~sY7sIENDB`josm-plugins-0.0.svn30137/routing/images/preferences/0000755000175000017500000000000012275270072021766 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/images/preferences/routing.png0000644000175000017500000000212511163156563024166 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYsgRtIME V}IDATHǝ[L\U}\(0@)0rTF1ThSkx >㓉TjS MʹL%3眙9{Jo C aToBfƵ(/hce~$ϰyswl~Xr|m΀뻸>?.Kb36>\z¬QCQZ'PP҃½nؓ53J9 Un9ܞݞo&3Ws\Ԕ(myj<2퐆mTzF!:o1i. Po?uG0S4H`[L L !j+\|c٭eZIhBHjgA`c +m̫J e%QIe !bo*?  G9hm6>P J+0`.8j+V!7vIᗫi`v)QVҧ-PY ^<b% 6G1ʅ[ Mp8U _,ǫ\&13eɳ)~Q]\J16)u*Ho [Yj*Sm`ÏF"!$1#568555T~_IENDB`josm-plugins-0.0.svn30137/routing/images/dialogs/0000755000175000017500000000000012275270072021107 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/images/dialogs/routing.png0000644000175000017500000000212511163156563023307 0ustar andrewandrewPNG  IHDRw=sRGBbKGD pHYsgRtIME V}IDATHǝ[L\U}\(0@)0rTF1ThSkx >㓉TjS MʹL%3眙9{Jo C aToBfƵ(/hce~$ϰyswl~Xr|m΀뻸>?.Kb36>\z¬QCQZ'PP҃½nؓ53J9 Un9ܞݞo&3Ws\Ԕ(myj<2퐆mTzF!:o1i. Po?uG0S4H`[L L !j+\|c٭eZIhBHjgA`c +m̫J e%QIe !bo*?  G9hm6>P J+0`.8j+V!7vIᗫi`v)QVҧ-PY ^<b% 6G1ʅ[ Mp8U _,ǫ\&13eɳ)~Q]\J16)u*Ho [Yj*Sm`ÏF"!$1#568555T~_IENDB`josm-plugins-0.0.svn30137/routing/.project0000644000175000017500000000056311273510002017656 0ustar andrewandrew JOSM-routing org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature josm-plugins-0.0.svn30137/routing/resources/0000755000175000017500000000000012275270073020233 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/resources/log4j.xml0000644000175000017500000000124711163156043021773 0ustar andrewandrew josm-plugins-0.0.svn30137/routing/.classpath0000644000175000017500000000067312053261145020204 0ustar andrewandrew josm-plugins-0.0.svn30137/routing/data/0000755000175000017500000000000012275270073017132 5ustar andrewandrewjosm-plugins-0.0.svn30137/routing/build.xml0000644000175000017500000000664112205016044020036 0ustar andrewandrew josm-plugins-0.0.svn30137/routing/lib/0000755000175000017500000000000012275270075016771 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/0000755000175000017500000000000012275270071017047 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/.settings/0000755000175000017500000000000012275270071020765 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000001443012205016044025740 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning josm-plugins-0.0.svn30137/openvisible/src/0000755000175000017500000000000012275270071017636 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/src/at/0000755000175000017500000000000012275270071020242 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/0000755000175000017500000000000012275270071022545 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/0000755000175000017500000000000012275270071023515 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/0000755000175000017500000000000012275270071025013 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/openvisible/0000755000175000017500000000000012275270071027332 5ustar andrewandrew././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/openvisible/OpenVisibleAction.javajosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/openvisible/OpenVisibleAction.j0000644000175000017500000001264212102472047033063 0ustar andrewandrew/** * */ package at.dallermassl.josm.plugin.openvisible; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.zip.GZIPInputStream; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; import org.openstreetmap.josm.gui.progress.NullProgressMonitor; import org.openstreetmap.josm.io.GpxImporter; import org.openstreetmap.josm.io.GpxReader; import org.openstreetmap.josm.io.IllegalDataException; import org.openstreetmap.josm.io.OsmImporter; import org.openstreetmap.josm.io.OsmReader; import org.openstreetmap.josm.tools.Shortcut; import org.xml.sax.SAXException; import at.dallermassl.josm.plugin.openvisible.OsmGpxBounds; /** * @author cdaller * */ public class OpenVisibleAction extends JosmAction { private File lastDirectory; public OpenVisibleAction() { super(tr("Open Visible..."), "openvisible", tr("Open only files that are visible in current view."), Shortcut.registerShortcut("tools:openvisible", tr("Menu: {0}", tr("Open Visible...")), KeyEvent.VK_I, Shortcut.ALT_CTRL_SHIFT), true); } /* (non-Javadoc) * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { if(Main.map == null || Main.map.mapView == null) { JOptionPane.showMessageDialog(Main.parent, tr("No view open - cannot determine boundaries!")); return; } MapView view = Main.map.mapView; Rectangle bounds = view.getBounds(); LatLon bottomLeft = view.getLatLon(bounds.x, bounds.y + bounds.height); LatLon topRight = view.getLatLon(bounds.x + bounds.width, bounds.y); System.err.println("FileFind Bounds: " + bottomLeft + " to " + topRight); JFileChooser fileChooser; if(lastDirectory != null) { fileChooser = new JFileChooser(lastDirectory); } else { fileChooser = new JFileChooser(); } fileChooser.setMultiSelectionEnabled(true); fileChooser.showOpenDialog(Main.parent); File[] files = fileChooser.getSelectedFiles(); lastDirectory = fileChooser.getCurrentDirectory(); for(File file : files) { try { OsmGpxBounds parser = new OsmGpxBounds(); parser.parse(new BufferedInputStream(new FileInputStream(file))); if(parser.intersects(bottomLeft.lat(), topRight.lat(), bottomLeft.lon(), topRight.lon())) { System.out.println(file.getAbsolutePath()); // + "," + parser.minLat + "," + parser.maxLat + "," + parser.minLon + "," + parser.maxLon); if(file.getName().endsWith("osm")) { openAsData(file); } else if(file.getName().endsWith("gpx")) { openFileAsGpx(file); } } } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } catch (SAXException e1) { e1.printStackTrace(); } catch(IllegalDataException e1) { e1.printStackTrace(); } } } private void openAsData(File file) throws SAXException, IOException, FileNotFoundException, IllegalDataException { String fn = file.getName(); if (new OsmImporter().acceptFile(file)) { DataSet dataSet = OsmReader.parseDataSet(new FileInputStream(file), NullProgressMonitor.INSTANCE); OsmDataLayer layer = new OsmDataLayer(dataSet, fn, file); Main.main.addLayer(layer); } else JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(fn.lastIndexOf('.')+1))); } private void openFileAsGpx(File file) throws SAXException, IOException, FileNotFoundException { String fn = file.getName(); if (new GpxImporter().acceptFile(file)) { GpxReader r = null; if (file.getName().endsWith(".gpx.gz")) { r = new GpxReader(new GZIPInputStream(new FileInputStream(file))); } else{ r = new GpxReader(new FileInputStream(file)); } if (!r.parse(true)) { // input was not properly parsed, abort JOptionPane.showMessageDialog(Main.parent, tr("Parsing file \"{0}\" failed", file)); throw new IllegalStateException(); } r.getGpxData().storageFile = file; GpxLayer gpxLayer = new GpxLayer(r.getGpxData(), fn); Main.main.addLayer(gpxLayer); Main.main.addLayer(new MarkerLayer(r.getGpxData(), tr("Markers from {0}", fn), file, gpxLayer)); } else { throw new IllegalStateException(); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootjosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/openvisible/OpenVisiblePlugin.javajosm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/openvisible/OpenVisiblePlugin.j0000644000175000017500000000073712174301462033107 0ustar andrewandrew/** * */ package at.dallermassl.josm.plugin.openvisible; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.MainMenu; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; /** * @author cdaller * */ public class OpenVisiblePlugin extends Plugin { public OpenVisiblePlugin(PluginInformation info) { super(info); MainMenu.add(Main.main.menu.gpsMenu, new OpenVisibleAction()); } } josm-plugins-0.0.svn30137/openvisible/src/at/dallermassl/josm/plugin/openvisible/OsmGpxBounds.java0000644000175000017500000001011511141405442032554 0ustar andrewandrew/** * */ package at.dallermassl.josm.plugin.openvisible; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author cdaller * */ public class OsmGpxBounds extends DefaultHandler { private double minLat = 180.0; private double maxLat = -180.0; private double minLon = 90.0; private double maxLon = -90.0; public OsmGpxBounds() { } /** * Parses the given input stream (gpx or osm file). * @param in the stream to parse. * @throws IOException if the file cannot be read. * @throws SAXException if the file could not be parsed. */ public void parse(InputStream in) throws IOException, SAXException { try { SAXParserFactory.newInstance().newSAXParser().parse(in, this); } catch (ParserConfigurationException e1) { e1.printStackTrace(); // broken SAXException chaining throw new SAXException(e1); } } @Override public void startElement(String ns, String lname, String qname, Attributes a) { if (qname.equals("node") || qname.equals("trkpt")) { double lat = Double.parseDouble(a.getValue("lat")); double lon = Double.parseDouble(a.getValue("lon")); minLat = Math.min(minLat, lat); minLon = Math.min(minLon, lon); maxLat = Math.max(maxLat, lat); maxLon = Math.max(maxLon, lon); } } /** * Returns true, if the given coordinates intersect with the * parsed min/max latitude longitude. * @param minLat the minimum latitude. * @param maxLat the maximum latitude. * @param minLon the minimum longitude. * @param maxLon the maximum longitude. * @return true if the given rectangle intersects with the parsed min/max. */ public boolean intersects(double minLat, double maxLat, double minLon, double maxLon) { double lat1 = Math.max(this.minLat, minLat); double lon1 = Math.max(this.minLon, minLon); double lat2 = Math.min(this.maxLat, maxLat); double lon2 = Math.min(this.maxLon, maxLon); return ((lat2-lat1) > 0) && ((lon2-lon1) > 0); } public static void main(String[] args) { if(args.length < 5) { printHelp(); return; } double minLat = Double.parseDouble(args[0]); double maxLat = Double.parseDouble(args[1]); double minLon = Double.parseDouble(args[2]); double maxLon = Double.parseDouble(args[3]); String[] files = new String[args.length - 4]; System.arraycopy(args, 4, files, 0, args.length - 4); try { File file; for(String fileName : files) { file = new File(fileName); if(!file.isDirectory() && (file.getName().endsWith("gpx") || file.getName().endsWith("osm"))) { OsmGpxBounds parser = new OsmGpxBounds(); parser.parse(new BufferedInputStream(new FileInputStream(file))); if(parser.intersects(minLat, maxLat, minLon, maxLon)) { System.out.println(file.getAbsolutePath()); // + "," + parser.minLat + "," + parser.maxLat + "," + parser.minLon + "," + parser.maxLon); } // System.out.println(parser.intersects(47.0555, 47.09, 15.406, 15.4737)); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } /** * */ private static void printHelp() { System.out.println(OsmGpxBounds.class.getName() + " "); } } josm-plugins-0.0.svn30137/openvisible/images/0000755000175000017500000000000012275270071020314 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/images/openvisible.png0000644000175000017500000000142010707374273023345 0ustar andrewandrewPNG  IHDRw=bKGDC pHYs  tIME  ԸIDATHUOQޝ15&"4 4gAX-,oD/  2 B4T&$voߌ`vi}f ]ݝO<{3¶lӎ\! ;:Rx~tx5`~~.xٺ07PWwPg#V)rcj3.,@8@mRIa!X (gjSW^]0s|D66(r?8hWivv6jrƵC`Pt` è a#hk(mёB*p ._/ d]+%q!D˝Ύs c߅L j9dz\܂ 4_R[7μ\LZȤ34[rİm։t #] (2 Z܄.E "\y\03nwܴdۮ@)K)XJR R)se[ADS8pJ GSp9ο}7~OLǩ PJA2dYBJ TPR&#A_ROl 0{9z&yiqyyeeO5TL)/ s(y:^yjvIENDB`josm-plugins-0.0.svn30137/openvisible/.project0000644000175000017500000000056711230653047020524 0ustar andrewandrew JOSM-openvisible org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature josm-plugins-0.0.svn30137/openvisible/.classpath0000644000175000017500000000045011230653047021027 0ustar andrewandrew josm-plugins-0.0.svn30137/openvisible/gpl-3.0.txt0000644000175000017500000010451311307646311020673 0ustar andrewandrew GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . josm-plugins-0.0.svn30137/openvisible/copyright.txt0000644000175000017500000000031111307646256021622 0ustar andrewandrewPlugin openvisibl This plugin is copyrighted 2008-2009 by Christof Dallermassl . It is distributed under GPL-v3 or later license (see file gpl-3.0.txt in this directory). josm-plugins-0.0.svn30137/openvisible/gpl-2.0.txt0000644000175000017500000004310311307646311020667 0ustar andrewandrew GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. josm-plugins-0.0.svn30137/openvisible/data/0000755000175000017500000000000012275270071017760 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/build.xml0000644000175000017500000001642212205016044020664 0ustar andrewandrew Building against core revision ${coreversion.info.entry.revision}. Plugin-Mainversion is set to ${plugin.main.version}. Commiting the plugin source with message '${commit.message}' ... Updating plugin source ... Updating ${plugin.jar} ... ***** Properties of published ${plugin.jar} ***** Commit message : '${commit.message}' Plugin-Mainversion: ${plugin.main.version} JOSM build version: ${coreversion.info.entry.revision} Plugin-Version : ${version.entry.commit.revision} ***** / Properties of published ${plugin.jar} ***** Now commiting ${plugin.jar} ... josm-plugins-0.0.svn30137/openvisible/nbproject/0000755000175000017500000000000012275270071021035 5ustar andrewandrewjosm-plugins-0.0.svn30137/openvisible/nbproject/project.xml0000644000175000017500000000526212174301462023227 0ustar andrewandrew org.netbeans.modules.ant.freeform openvisible openvisible java src UTF-8 . UTF-8 compile clean install clean compile src build.xml src ../../core/src 1.6 josm-plugins-0.0.svn30137/lakewalker/0000755000175000017500000000000012275270067016657 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/.settings/0000755000175000017500000000000012275270067020575 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/.settings/org.eclipse.jdt.ui.prefs0000644000175000017500000000510411327367545025251 0ustar andrewandrew#Sun Jan 24 21:18:20 CET 2010 eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=true sp_cleanup.add_missing_deprecated_annotations=true sp_cleanup.add_missing_methods=false sp_cleanup.add_missing_nls_tags=false sp_cleanup.add_missing_override_annotations=true sp_cleanup.add_serial_version_id=false sp_cleanup.always_use_blocks=true sp_cleanup.always_use_parentheses_in_expressions=false sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=false sp_cleanup.format_source_code_changes_only=false sp_cleanup.make_local_variable_final=false sp_cleanup.make_parameters_final=false sp_cleanup.make_private_fields_final=true sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=false sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=true sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=false sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true sp_cleanup.remove_trailing_whitespaces=true sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=false sp_cleanup.remove_unused_imports=false sp_cleanup.remove_unused_local_variables=false sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_blocks=false sp_cleanup.use_blocks_only_for_return_and_throw=false sp_cleanup.use_parentheses_in_expressions=false sp_cleanup.use_this_for_non_static_field_access=false sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true josm-plugins-0.0.svn30137/lakewalker/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000001514512205016044025547 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 josm-plugins-0.0.svn30137/lakewalker/src/0000755000175000017500000000000012275270067017446 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/src/org/0000755000175000017500000000000012275270067020235 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/0000755000175000017500000000000012275270067023123 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/0000755000175000017500000000000012275270067024073 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/0000755000175000017500000000000012275270067025554 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/0000755000175000017500000000000012275270067027676 5ustar andrewandrew././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/BooleanConfigurer.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/BooleanConfigurer0000644000175000017500000000501511444175072033222 0ustar andrewandrew/* * $Id: BooleanConfigurer.java 705 2005-09-15 13:24:50 +0000 (Thu, 15 Sep 2005) rodneykinney $ * * Copyright (c) 2000-2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package org.openstreetmap.josm.plugins.lakewalker; /** * Configurer for Boolean values */ public class BooleanConfigurer extends Configurer { private javax.swing.JCheckBox box; public BooleanConfigurer() { this(false); } public BooleanConfigurer(boolean val) { this(null, "", val); } public BooleanConfigurer(String key, String name, Boolean val) { super(key, name, val); } public BooleanConfigurer(String key, String name, boolean val) { super(key, name, val ? Boolean.TRUE : Boolean.FALSE); } public BooleanConfigurer(String key, String name) { this(key, name, Boolean.FALSE); } @Override public String getValueString() { return booleanValue().toString(); } @Override public void setValue(Object o) { super.setValue(o); if (box != null && !o.equals(box.isSelected())) { box.setSelected(booleanValue().booleanValue()); } } @Override public void setValue(String s) { setValue(Boolean.valueOf(s)); } @Override public void setName(String s) { super.setName(s); if (box != null) { box.setText(s); } } @Override public java.awt.Component getControls() { if (box == null) { box = new javax.swing.JCheckBox(getName()); box.setSelected(booleanValue().booleanValue()); box.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent e) { setValue(box.isSelected()); } }); } return box; } public Boolean booleanValue() { return (Boolean) value; } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerPlugin.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerPlugin.0000644000175000017500000000143012174027305033127 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.tr; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.MainMenu; import org.openstreetmap.josm.gui.preferences.PreferenceSetting; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; /** * Interface to Darryl Shpak's Lakewalker python module * * @author Brent Easton */ public class LakewalkerPlugin extends Plugin { public LakewalkerPlugin(PluginInformation info) { super(info); MainMenu.add(Main.main.menu.moreToolsMenu, new LakewalkerAction(tr("Lake Walker"))); } @Override public PreferenceSetting getPreferenceSetting() { return new LakewalkerPreferences(); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/StringEnumConfigurer.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/StringEnumConfigu0000644000175000017500000000657011444175072033234 0ustar andrewandrew/* * $Id: StringEnumConfigurer.java 2472 2007-10-01 04:10:19 +0000 (Mon, 01 Oct 2007) rodneykinney $ * * Copyright (c) 2000-2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ /* * Created by IntelliJ IDEA. * User: rkinney * Date: Jul 20, 2002 * Time: 3:52:36 AM * To change template for new class use * Code Style | Class Templates options (Tools | IDE Options). */ package org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.JComboBox; import javax.swing.JLabel; /** * A Configurer that returns a String from among a list of possible values */ public class StringEnumConfigurer extends Configurer { protected String[] validValues; protected String[] transValues; protected JComboBox box; protected Box panel; protected String tooltipText = ""; public StringEnumConfigurer(String key, String name, String[] validValues) { super(key, name); this.validValues = validValues; transValues = new String[validValues.length]; for(int i = 0; i < validValues.length; ++i) transValues[i] = tr(validValues[i]); } public StringEnumConfigurer(String[] validValues) { this(null, "", validValues); } public void setToolTipText(String s) { tooltipText = s; } @Override public Component getControls() { if (panel == null) { panel = Box.createHorizontalBox(); panel.add(new JLabel(name)); box = new JComboBox(transValues); box.setToolTipText(tooltipText); box.setMaximumSize(new Dimension(box.getMaximumSize().width,box.getPreferredSize().height)); setValue(value); box.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { noUpdate = true; setValue(box.getSelectedIndex()); noUpdate = false; } }); panel.add(box); } return panel; } @Override public void setValue(Object o) { if(o == null) o = 0; super.setValue(o); if(!noUpdate && box != null) box.setSelectedIndex((Integer)o); } @Override public void setValue(String s) { Integer n = 0; for (int i = 0; i < transValues.length; ++i) { if (transValues[i].equals(s) || validValues[i].equals(s)){ n = i; break; } } setValue(n); } @Override public String getValueString() { return validValues[(Integer)value]; } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerException.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerExcepti0000644000175000017500000000047411444175072033227 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.tr; class LakewalkerException extends Exception { public LakewalkerException(){ super(tr("An unknown error has occurred")); } public LakewalkerException(String err){ super(err); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/IntConfigurer.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/IntConfigurer.jav0000644000175000017500000000377511444175072033167 0ustar andrewandrew/* * $Id: IntConfigurer.java 874 2006-03-15 14:20:56 +0000 (Wed, 15 Mar 2006) rodneykinney $ * * Copyright (c) 2000-2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package org.openstreetmap.josm.plugins.lakewalker; /** * A Configurer for Integer values */ public class IntConfigurer extends StringConfigurer { public IntConfigurer() { super(); } public IntConfigurer(String key, String name) { this(key, name, 0); } public IntConfigurer(String key, String name, Integer val) { super(key, name); if (val != null) { setValue(val); } } @Override public void setValue(String s) { Integer i = null; try { i = Integer.valueOf(s); } catch (NumberFormatException e) { i = null; } if (i != null) { setValue(i); } } public int getIntValue(int defaultValue) { if (getValue() instanceof Integer) { return ((Integer)getValue()).intValue(); } else { return defaultValue; } } @Override public void setValue(Object o) { if (!noUpdate && nameField != null && o != null) { nameField.setText(o.toString()); } super.setValue(o); } @Override public String getValueString() { return value == null ? null : value.toString(); } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerPreferences.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerPrefere0000644000175000017500000002470412205016044033205 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.marktr; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GridBagConstraints; import javax.swing.Box; import javax.swing.JLabel; import javax.swing.JPanel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting; import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.I18n; public class LakewalkerPreferences extends DefaultTabPreferenceSetting { public static final String[] DIRECTIONS = new String[] {marktr("east"), marktr("northeast"), marktr("north"), marktr("northwest"), marktr("west"), marktr("southwest"), marktr("south"), marktr("southeast")}; public static final String[] WAYTYPES = new String[] {marktr("water"), marktr("coastline"), marktr("land"), marktr("none")}; public static final String[] WMSLAYERS = new String[] {"IR1", "IR2", "IR3"}; public static final String PREF_MAX_SEG = "lakewalker.max_segs_in_way"; public static final String PREF_MAX_NODES = "lakewalker.max_nodes"; public static final String PREF_THRESHOLD_VALUE = "lakewalker.thresholdvalue"; public static final String PREF_EPSILON = "lakewalker.epsilon"; public static final String PREF_LANDSAT_RES = "lakewalker.landsat_res"; public static final String PREF_LANDSAT_SIZE = "lakewalker.landsat_size"; public static final String PREF_EAST_OFFSET = "lakewalker.east_offset"; public static final String PREF_NORTH_OFFSET = "lakewalker.north_offset"; public static final String PREF_START_DIR = "lakewalker.startdir"; public static final String PREF_WAYTYPE = "lakewalker.waytype"; public static final String PREF_WMS = "lakewalker.wms"; public static final String PREF_SOURCE = "lakewalker.source"; public static final String PREF_MAXCACHESIZE = "lakewalker.maxcachesize"; public static final String PREF_MAXCACHEAGE = "lakewalker.maxcacheage"; protected IntConfigurer maxSegsConfig = new IntConfigurer(); protected JLabel maxSegsLabel = new JLabel(tr("Maximum number of segments per way")); protected IntConfigurer maxNodesConfig = new IntConfigurer(); protected JLabel maxNodesLabel = new JLabel(tr("Maximum number of nodes in initial trace")); protected IntConfigurer thresholdConfig = new IntConfigurer(); protected JLabel thresholdLabel = new JLabel(tr("Maximum gray value to count as water (0-255)")); protected DoubleConfigurer epsilonConfig = new DoubleConfigurer(); protected JLabel epsilonLabel = new JLabel(tr("Line simplification accuracy (degrees)")); protected IntConfigurer landsatResConfig = new IntConfigurer(); protected JLabel landsatResLabel = new JLabel(tr("Resolution of Landsat tiles (pixels per degree)")); protected IntConfigurer landsatSizeConfig = new IntConfigurer(); protected JLabel landsatSizeLabel = new JLabel(tr("Size of Landsat tiles (pixels)")); protected DoubleConfigurer eastOffsetConfig = new DoubleConfigurer(); protected JLabel eastOffsetLabel = new JLabel(tr("Shift all traces to east (degrees)")); protected DoubleConfigurer northOffsetConfig = new DoubleConfigurer(); protected JLabel northOffsetLabel = new JLabel(tr("Shift all traces to north (degrees)")); protected StringEnumConfigurer startDirConfig = new StringEnumConfigurer(DIRECTIONS); protected JLabel startDirLabel = new JLabel(tr("Direction to search for land")); protected StringEnumConfigurer lakeTypeConfig = new StringEnumConfigurer(WAYTYPES); protected JLabel lakeTypeLabel = new JLabel(tr("Tag ways as")); protected StringEnumConfigurer wmsConfig = new StringEnumConfigurer(WMSLAYERS); protected JLabel wmsLabel = new JLabel(tr("WMS Layer")); protected IntConfigurer maxCacheSizeConfig = new IntConfigurer(); protected JLabel maxCacheSizeLabel = new JLabel(tr("Maximum cache size (MB)")); protected IntConfigurer maxCacheAgeConfig = new IntConfigurer(); protected JLabel maxCacheAgeLabel = new JLabel(tr("Maximum cache age (days)")); protected StringConfigurer sourceConfig = new StringConfigurer(); protected JLabel sourceLabel = new JLabel(tr("Source text")); public LakewalkerPreferences() { super("lakewalker.png", I18n.tr("Lakewalker Plugin Preferences"), tr("A plugin to trace water bodies on Landsat imagery.")); } public void addGui(PreferenceTabbedPane gui) { maxSegsConfig.setToolTipText(tr("Maximum number of segments allowed in each generated way. Default 250.")); maxNodesConfig.setToolTipText(tr("Maximum number of nodes to generate before bailing out (before simplifying lines). Default 50000.")); thresholdConfig.setToolTipText(tr("Maximum gray value to accept as water (based on Landsat IR-1 data). Can be in the range 0-255. Default 90.")); epsilonConfig.setToolTipText(tr("Accuracy of Douglas-Peucker line simplification, measured in degrees.
Lower values give more nodes, and more accurate lines. Default 0.0003.")); landsatResConfig.setToolTipText(tr("Resolution of Landsat tiles, measured in pixels per degree. Default 4000.")); landsatSizeConfig.setToolTipText(tr("Size of one landsat tile, measured in pixels. Default 2000.")); eastOffsetConfig.setToolTipText(tr("Offset all points in East direction (degrees). Default 0.")); northOffsetConfig.setToolTipText(tr("Offset all points in North direction (degrees). Default 0.")); startDirConfig.setToolTipText(tr("Direction to search for land. Default east.")); lakeTypeConfig.setToolTipText(tr("Tag ways as water, coastline, land or nothing. Default is water.")); wmsConfig.setToolTipText(tr("Which WMS layer to use for tracing against. Default is IR1.")); maxCacheSizeConfig.setToolTipText(tr("Maximum size of each cache directory in bytes. Default is 300MB")); maxCacheAgeConfig.setToolTipText(tr("Maximum age of each cached file in days. Default is 100")); sourceConfig.setToolTipText(tr("Data source text. Default is Landsat.")); /*String description =*/ tr("A plugin to trace water bodies on Landsat imagery."); JPanel prefPanel = gui.createPreferenceTab(this); buildPreferences(prefPanel); maxSegsConfig.setValue(Main.pref.getInteger(PREF_MAX_SEG, 500)); maxNodesConfig.setValue(Main.pref.getInteger(PREF_MAX_NODES, 50000)); thresholdConfig.setValue(Main.pref.getInteger(PREF_THRESHOLD_VALUE, 90)); epsilonConfig.setValue(Main.pref.getDouble(PREF_EPSILON, 0.0003)); landsatResConfig.setValue(Main.pref.getInteger(PREF_LANDSAT_RES, 4000)); landsatSizeConfig.setValue(Main.pref.getInteger(PREF_LANDSAT_SIZE, 2000)); eastOffsetConfig.setValue(Main.pref.getDouble(PREF_EAST_OFFSET, 0.0)); northOffsetConfig.setValue(Main.pref.getDouble(PREF_NORTH_OFFSET, 0.0)); startDirConfig.setValue(Main.pref.get(PREF_START_DIR, "east")); lakeTypeConfig.setValue(Main.pref.get(PREF_WAYTYPE, "water")); wmsConfig.setValue(Main.pref.get(PREF_WMS, "IR1")); sourceConfig.setValue(Main.pref.get(PREF_SOURCE, "Landsat")); maxCacheSizeConfig.setValue(Main.pref.getInteger(PREF_MAXCACHESIZE, 300)); maxCacheAgeConfig.setValue(Main.pref.getInteger(PREF_MAXCACHEAGE, 100)); } public void buildPreferences(JPanel prefPanel) { GBC labelConstraints = GBC.std().insets(10,5,5,0); GBC dataConstraints = GBC.eol().insets(0,5,0,0).fill(GridBagConstraints.HORIZONTAL); prefPanel.add(maxSegsLabel, labelConstraints); prefPanel.add(maxSegsConfig.getControls(), dataConstraints); prefPanel.add(maxNodesLabel, labelConstraints); prefPanel.add(maxNodesConfig.getControls(), dataConstraints); prefPanel.add(thresholdLabel, labelConstraints); prefPanel.add(thresholdConfig.getControls(), dataConstraints); prefPanel.add(epsilonLabel, labelConstraints); prefPanel.add(epsilonConfig.getControls(), dataConstraints); prefPanel.add(landsatResLabel, labelConstraints); prefPanel.add(landsatResConfig.getControls(), dataConstraints); prefPanel.add(landsatSizeLabel, labelConstraints); prefPanel.add(landsatSizeConfig.getControls(), dataConstraints); prefPanel.add(eastOffsetLabel, labelConstraints); prefPanel.add(eastOffsetConfig.getControls(), dataConstraints); prefPanel.add(northOffsetLabel, labelConstraints); prefPanel.add(northOffsetConfig.getControls(), dataConstraints); prefPanel.add(startDirLabel, labelConstraints); prefPanel.add(startDirConfig.getControls(), dataConstraints); prefPanel.add(lakeTypeLabel, labelConstraints); prefPanel.add(lakeTypeConfig.getControls(), dataConstraints); prefPanel.add(wmsLabel, labelConstraints); prefPanel.add(wmsConfig.getControls(), dataConstraints); prefPanel.add(maxCacheSizeLabel, labelConstraints); prefPanel.add(maxCacheSizeConfig.getControls(), dataConstraints); prefPanel.add(maxCacheAgeLabel, labelConstraints); prefPanel.add(maxCacheAgeConfig.getControls(), dataConstraints); prefPanel.add(sourceLabel, labelConstraints); prefPanel.add(sourceConfig.getControls(), dataConstraints); prefPanel.add(Box.createVerticalGlue(), GBC.eol().fill(GridBagConstraints.VERTICAL)); } /* * Save entered preference values on OK button */ public boolean ok() { Main.pref.put(PREF_MAX_SEG, maxSegsConfig.getValueString()); Main.pref.put(PREF_MAX_NODES, maxNodesConfig.getValueString()); Main.pref.put(PREF_THRESHOLD_VALUE, thresholdConfig.getValueString()); Main.pref.put(PREF_EPSILON, epsilonConfig.getValueString()); Main.pref.put(PREF_LANDSAT_RES, landsatResConfig.getValueString()); Main.pref.put(PREF_LANDSAT_SIZE, landsatSizeConfig.getValueString()); Main.pref.put(PREF_EAST_OFFSET, eastOffsetConfig.getValueString()); Main.pref.put(PREF_NORTH_OFFSET, northOffsetConfig.getValueString()); Main.pref.put(PREF_START_DIR, startDirConfig.getValueString()); Main.pref.put(PREF_WAYTYPE, lakeTypeConfig.getValueString()); Main.pref.put(PREF_WMS, wmsConfig.getValueString()); Main.pref.put(PREF_MAXCACHESIZE, maxCacheSizeConfig.getValueString()); Main.pref.put(PREF_MAXCACHEAGE, maxCacheAgeConfig.getValueString()); Main.pref.put(PREF_SOURCE, sourceConfig.getValueString()); return false; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerWMS.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerWMS.jav0000644000175000017500000001746611444175072033064 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Vector; import javax.imageio.ImageIO; import org.openstreetmap.josm.gui.progress.ProgressMonitor; public class LakewalkerWMS { private BufferedImage image; private int imagex; private int imagey; // Vector to cache images in memory private List images = new Vector(); // Hashmap to hold the mapping of cached images private Map imageindex = new HashMap(); private int resolution; private int tilesize; private String wmslayer; private File working_dir; public LakewalkerWMS(int resolution, int tilesize, String wmslayer, File workdir){ this.resolution = resolution; this.tilesize = tilesize; this.working_dir = workdir; this.wmslayer = wmslayer; } public BufferedImage getTile(int x, int y, ProgressMonitor progressMonitor) throws LakewalkerException { progressMonitor.beginTask(tr("Downloading image tile...")); try { String layer = "global_mosaic_base"; int[] bottom_left_xy = new int[2]; bottom_left_xy[0] = floor(x,this.tilesize); bottom_left_xy[1] = floor(y,this.tilesize); int[] top_right_xy = new int[2]; top_right_xy[0] = bottom_left_xy[0] + this.tilesize; top_right_xy[1] = bottom_left_xy[1] + this.tilesize; double[] topright_geo = xy_to_geo(top_right_xy[0],top_right_xy[1],this.resolution); double[] bottomleft_geo = xy_to_geo(bottom_left_xy[0],bottom_left_xy[1],this.resolution); String filename = this.wmslayer+"/landsat_"+this.resolution+"_"+this.tilesize+ "_xy_"+bottom_left_xy[0]+"_"+bottom_left_xy[1]+".png"; // The WMS server only understands decimal points using periods, so we need // to convert to a locale that uses that to build the proper URL NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH); DecimalFormat df = (DecimalFormat)nf; df.applyLocalizedPattern("0.000000"); String urlloc = "http://onearth.jpl.nasa.gov/wms.cgi?request=GetMap&layers="+layer+ "&styles="+wmslayer+"&srs=EPSG:4326&format=image/png"+ "&bbox="+df.format(bottomleft_geo[1])+","+df.format(bottomleft_geo[0])+ ","+df.format(topright_geo[1])+","+df.format(topright_geo[0])+ "&width="+this.tilesize+"&height="+this.tilesize; File file = new File(this.working_dir,filename); // Calculate the hashmap key String hashkey = Integer.toString(bottom_left_xy[0])+":"+Integer.toString(bottom_left_xy[1]); // See if this image is already loaded if(this.image != null){ if(this.imagex != bottom_left_xy[0] || this.imagey != bottom_left_xy[1]){ // Check if this image exists in the hashmap if(this.imageindex.containsKey(hashkey)){ // Store which image we have this.imagex = bottom_left_xy[0]; this.imagey = bottom_left_xy[1]; // Retrieve from cache this.image = this.images.get(this.imageindex.get(hashkey)); return this.image; } else { this.image = null; } } else { return this.image; } } try { System.out.println("Looking for image in disk cache: "+filename); // Read from a file this.image = ImageIO.read(file); this.images.add(this.image); this.imageindex.put(hashkey,this.images.size()-1); } catch(FileNotFoundException e){ System.out.println("Could not find cached image, downloading."); } catch(IOException e){ System.out.println(e.getMessage()); } catch(Exception e){ System.out.println(e.getMessage()); } if(this.image == null){ /** * Try downloading the image */ try { System.out.println("Downloading from "+urlloc); // Read from a URL URL url = new URL(urlloc); this.image = ImageIO.read(url); // this can return null! } catch(MalformedURLException e){ System.out.println(e.getMessage()); } catch(IOException e){ System.out.println(e.getMessage()); } catch(Exception e){ System.out.println(e.getMessage()); } if (this.image != null) { this.images.add(this.image); this.imageindex.put(hashkey,this.images.size()-1); this.saveimage(file,this.image); } } this.imagex = bottom_left_xy[0]; this.imagey = bottom_left_xy[1]; if(this.image == null){ throw new LakewalkerException(tr("Could not acquire image")); } return this.image; } finally { progressMonitor.finishTask(); } } public void saveimage(File file, BufferedImage image){ /** * Save the image to the cache */ try { ImageIO.write(image, "png", file); System.out.println("Saved image to cache"); } catch(Exception e){ System.out.println(e.getMessage()); } } public int getPixel(int x, int y, ProgressMonitor progressMonitor) throws LakewalkerException{ // Get the previously shown text BufferedImage image = null; try { image = this.getTile(x,y, progressMonitor); } catch(LakewalkerException e){ System.out.println(e.getMessage()); throw e; } int tx = floor(x,this.tilesize); int ty = floor(y,this.tilesize); int pixel_x = (x-tx); int pixel_y = (this.tilesize-1)-(y-ty); //System.out.println("("+x+","+y+") maps to ("+pixel_x+","+pixel_y+") by ("+tx+", "+ty+")"); int rgb = image.getRGB(pixel_x,pixel_y); int pixel; int r = (rgb >> 16) & 0xff; int g = (rgb >> 8) & 0xff; int b = (rgb >> 0) & 0xff; pixel = (int)((0.30 * r) + (0.59 * b) + (0.11 * g)); return pixel; } public int floor(int num, int precision){ double dnum = num/(double)precision; BigDecimal val = new BigDecimal(dnum) ; val = val.setScale(0, BigDecimal.ROUND_FLOOR); return val.intValue()*precision; } public double floor(double num) { BigDecimal val = new BigDecimal(num) ; val = val.setScale(0, BigDecimal.ROUND_FLOOR); return val.doubleValue() ; } public double[] xy_to_geo(int x, int y, double resolution){ double[] geo = new double[2]; geo[0] = y / resolution; geo[1] = x / resolution; return geo; } public int[] geo_to_xy(double lat, double lon, double resolution){ int[] xy = new int[2]; xy[0] = (int)Math.floor(lon * resolution + 0.5); xy[1] = (int)Math.floor(lat * resolution + 0.5); return xy; } } josm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/Lakewalker.java0000644000175000017500000003434411610361063032620 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.tr; import java.io.File; import java.util.ArrayList; import java.util.List; import org.openstreetmap.josm.gui.progress.ProgressMonitor; public class Lakewalker { protected boolean cancel; private int maxnode; private int threshold; private int resolution; private int tilesize; private String startdir; private String wmslayer; private File workingdir; private int[] dirslat = new int[] {0,1,1,1,0,-1,-1,-1}; private int[] dirslon = new int[] {1,1,0,-1,-1,-1,0,1}; double start_radius_big = 0.001; double start_radius_small = 0.0002; public Lakewalker(int waylen, int maxnode, int threshold, double epsilon, int resolution, int tilesize, String startdir, String wmslayer, File workingdir){ this.maxnode = maxnode; this.threshold = threshold; this.resolution = resolution; this.tilesize = tilesize; this.startdir = startdir; this.wmslayer = wmslayer; this.workingdir = workingdir; } /** * east = 0 * northeast = 1 * north = 2 * northwest = 3 * west = 4 * southwest = 5 * south = 6 * southeast = 7 */ private int getDirectionIndex(String direction) throws ArrayIndexOutOfBoundsException{ int i=0; if(direction.equals("East") || direction.equals("east")){ i = 0; } else if(direction.equals("Northeast") || direction.equals("northeast")){ i = 1; } else if(direction.equals("North") || direction.equals("north")){ i = 2; } else if(direction.equals("Northwest") || direction.equals("northwest")){ i = 3; } else if(direction.equals("West") || direction.equals("west")){ i = 4; } else if(direction.equals("Southwest") || direction.equals("southwest")){ i = 5; } else if(direction.equals("South") || direction.equals("south")){ i = 6; } else if(direction.equals("Southeast") || direction.equals("southeast")){ i = 7; } else { throw new ArrayIndexOutOfBoundsException(tr("Direction index ''{0}'' not found",direction)); } return i; } /** * Do a trace * * @param lat * @param lon * @param tl_lon * @param br_lon * @param tl_lat * @param br_lat */ public ArrayList trace(double lat, double lon, double tl_lon, double br_lon, double tl_lat, double br_lat, ProgressMonitor progressMonitor) throws LakewalkerException { progressMonitor.beginTask(null); try { LakewalkerWMS wms = new LakewalkerWMS(this.resolution, this.tilesize, this.wmslayer, this.workingdir); LakewalkerBBox bbox = new LakewalkerBBox(tl_lat,tl_lon,br_lat,br_lon); Boolean detect_loop = false; ArrayList nodelist = new ArrayList(); int[] xy = geo_to_xy(lat,lon,this.resolution); if(!bbox.contains(lat, lon)){ throw new LakewalkerException(tr("The starting location was not within the bbox")); } int v; progressMonitor.indeterminateSubTask(tr("Looking for shoreline...")); while(true){ double[] geo = xy_to_geo(xy[0],xy[1],this.resolution); if(bbox.contains(geo[0],geo[1])==false){ break; } v = wms.getPixel(xy[0], xy[1], progressMonitor.createSubTaskMonitor(0, false)); if(v > this.threshold){ break; } int delta_lat = this.dirslat[getDirectionIndex(this.startdir)]; int delta_lon = this.dirslon[getDirectionIndex(this.startdir)]; xy[0] = xy[0]+delta_lon; xy[1] = xy[1]+delta_lat; } int[] startxy = new int[] {xy[0], xy[1]}; double[] startgeo = xy_to_geo(xy[0],xy[1],this.resolution); //System.out.printf("Found shore at lat %.4f lon %.4f\n",lat,lon); int last_dir = this.getDirectionIndex(this.startdir); for(int i = 0; i < this.maxnode; i++){ // Print a counter if(i % 250 == 0){ progressMonitor.indeterminateSubTask(tr("{0} nodes so far...",i)); //System.out.println(i+" nodes so far..."); } // Some variables we need int d; int test_x=0; int test_y=0; int new_dir = 0; // Loop through all the directions we can go for(d = 1; d <= this.dirslat.length; d++){ // Decide which direction we want to look at from this pixel new_dir = (last_dir + d + 4) % 8; test_x = xy[0] + this.dirslon[new_dir]; test_y = xy[1] + this.dirslat[new_dir]; double[] geo = xy_to_geo(test_x,test_y,this.resolution); if(!bbox.contains(geo[0], geo[1])){ System.out.println("Outside bbox"); break; } v = wms.getPixel(test_x, test_y, progressMonitor.createSubTaskMonitor(0, false)); if(v > this.threshold){ break; } if(d == this.dirslat.length-1){ System.out.println("Got stuck"); break; } } // Remember this direction last_dir = new_dir; // Set the pixel we found as current xy[0] = test_x; xy[1] = test_y; // Break the loop if we managed to get back to our starting point if(xy[0] == startxy[0] && xy[1] == startxy[1]){ break; } // Store this node double[] geo = xy_to_geo(xy[0],xy[1],this.resolution); nodelist.add(geo); //System.out.println("Adding node at "+xy[0]+","+xy[1]+" ("+geo[1]+","+geo[0]+")"); // Check if we got stuck in a loop double start_proximity = Math.pow((geo[0] - startgeo[0]),2) + Math.pow((geo[1] - startgeo[1]),2); if(detect_loop){ if(start_proximity < Math.pow(start_radius_small,2)){ System.out.println("Detected loop"); break; } }else{ if(start_proximity > Math.pow(start_radius_big,2)){ detect_loop = true; } } } return nodelist; } finally { progressMonitor.finishTask(); } } /** * Remove duplicate nodes from the list * * @param nodes * @return */ public ArrayList duplicateNodeRemove(ArrayList nodes){ if(nodes.size() <= 1){ return nodes; } double lastnode[] = new double[] {nodes.get(0)[0], nodes.get(0)[1]}; for(int i = 1; i < nodes.size(); i++){ double[] thisnode = new double[] {nodes.get(i)[0], nodes.get(i)[1]}; if(thisnode[0] == lastnode[0] && thisnode[1] == lastnode[1]){ // Remove the node nodes.remove(i); // Shift back one index i = i - 1; } lastnode = thisnode; } return nodes; } /** * Reduce the number of vertices based on their proximity to each other * * @param nodes * @param proximity * @return */ public ArrayList vertexReduce(ArrayList nodes, double proximity){ // Check if node list is empty if(nodes.size()<=1){ return nodes; } double[] test_v = nodes.get(0); ArrayList reducednodes = new ArrayList(); double prox_sq = Math.pow(proximity, 2); for(int v = 0; v < nodes.size(); v++){ if(Math.pow(nodes.get(v)[0] - test_v[0],2) + Math.pow(nodes.get(v)[1] - test_v[1],2) > prox_sq){ reducednodes.add(nodes.get(v)); test_v = nodes.get(v); } } return reducednodes; } public double pointLineDistance(double[] p1, double[] p2, double[] p3){ double x0 = p1[0]; double y0 = p1[1]; double x1 = p2[0]; double y1 = p2[1]; double x2 = p3[0]; double y2 = p3[1]; if(x2 == x1 && y2 == y1){ return Math.sqrt(Math.pow(x1-x0,2) + Math.pow(y1-y0,2)); } else { return Math.abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / Math.sqrt(Math.pow(x2-x1,2) + Math.pow(y2-y1,2)); } } /* public ArrayList douglasPeuckerNR(ArrayList nodes, double epsilon){ command_stack = [(0, len(nodes) - 1)] Vector result_stack = new Vector(); while(command_stack.size() > 0){ cmd = command_stack.pop(); if(type(cmd) == tuple){ (start, end) = cmd (node, dist) = dp_findpoint(nodes, start, end) if(dist > epsilon){ command_stack.append("+") command_stack.append((start, node)) command_stack.append((node, end)) } else { result_stack.append((start, end)) } } elseif(cmd == "+"){ first = result_stack.pop() second = result_stack.pop() if(first[-1] == second[0]){ result_stack.append(first + second[1:]) //print "Added %s and %s; result is %s" % (first, second, result_stack[-1]) }else { error("ERROR: Cannot connect nodestrings!") #print first #print second return; } } else { error("ERROR: Can't understand command \"%s\"" % (cmd,)) return if(len(result_stack) == 1){ return [nodes[x] for x in result_stack[0]]; } else { error("ERROR: Command stack is empty but result stack has %d nodes!" % len(result_stack)); return; } farthest_node = None farthest_dist = 0 first = nodes[0] last = nodes[-1] for(i in xrange(1, len(nodes) - 1){ d = point_line_distance(nodes[i], first, last) if(d > farthest_dist){ farthest_dist = d farthest_node = i } } if(farthest_dist > epsilon){ seg_a = douglas_peucker(nodes[0:farthest_node+1], epsilon) seg_b = douglas_peucker(nodes[farthest_node:-1], epsilon) //print "Minimized %d nodes to %d + %d nodes" % (len(nodes), len(seg_a), len(seg_b)) nodes = seg_a[:-1] + seg_b } else { return [nodes[0], nodes[-1]]; } return nodes; } */ public ArrayList douglasPeucker(ArrayList nodes, double epsilon, int depth){ // Check if node list is empty if(nodes.size()<=1 || depth > 500){ return nodes; } int farthest_node = -1; double farthest_dist = 0; double[] first = nodes.get(0); double[] last = nodes.get(nodes.size()-1); ArrayList new_nodes = new ArrayList(); double d = 0; for(int i = 1; i < nodes.size(); i++){ d = pointLineDistance(nodes.get(i),first,last); if(d>farthest_dist){ farthest_dist = d; farthest_node = i; } } List seg_a; List seg_b; if(farthest_dist > epsilon){ seg_a = douglasPeucker(sublist(nodes,0,farthest_node+1),epsilon, depth+1); seg_b = douglasPeucker(sublist(nodes,farthest_node,nodes.size()-1),epsilon,depth+1); new_nodes.addAll(seg_a); new_nodes.addAll(seg_b); } else { new_nodes.add(nodes.get(0)); new_nodes.add(nodes.get(nodes.size()-1)); } return new_nodes; } private ArrayList sublist(ArrayList l, int i, int f) throws ArrayIndexOutOfBoundsException { ArrayList sub = new ArrayList(); if(f l.size()){ throw new ArrayIndexOutOfBoundsException(); } for(int j = i; j < f; j++){ sub.add(l.get(j)); } return sub; } public double[] xy_to_geo(int x, int y, double resolution){ double[] geo = new double[2]; geo[0] = y / resolution; geo[1] = x / resolution; return geo; } public int[] geo_to_xy(double lat, double lon, double resolution){ int[] xy = new int[2]; xy[0] = (int)Math.floor(lon * resolution + 0.5); xy[1] = (int)Math.floor(lat * resolution + 0.5); return xy; } /* * User has hit the cancel button */ public void cancel() { cancel = true; } /** * Class to do checking of whether the point is within our bbox * * @author Jason Reid */ private static class LakewalkerBBox { private double top = 90; private double left = -180; private double bottom = -90; private double right = 180; protected LakewalkerBBox(double top, double left, double bottom, double right){ this.left = left; this.right = right; this.top = top; this.bottom = bottom; } protected Boolean contains(double lat, double lon){ if(lat >= this.top || lat <= this.bottom){ return false; } if(lon >= this.right || lon <= this.left){ return false; } if((this.right - this.left) % 360 == 0){ return true; } return (lon - this.left) % 360 <= (this.right - this.left) % 360; } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/DoubleConfigurer.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/DoubleConfigurer.0000644000175000017500000000351411444175072033135 0ustar andrewandrew/* * $Id: DoubleConfigurer.java 5 2003-10-02 15:11:38 +0000 (Thu, 02 Oct 2003) rodneykinney $ * * Copyright (c) 2000-2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package org.openstreetmap.josm.plugins.lakewalker; /** * A Configurer for Double values */ public class DoubleConfigurer extends StringConfigurer { public DoubleConfigurer() { super(); } public DoubleConfigurer(String key, String name) { this(key, name, new Double(0)); } public DoubleConfigurer(String key, String name, Double val) { super(key, name, val == null ? null : val.toString()); } @Override public void setValue(String s) { Double d = null; try { d = Double.valueOf(s); } catch (NumberFormatException e) { d = null; } if (d != null) setValue(d); } @Override public void setValue(Object o) { if (!noUpdate && nameField != null && o != null) { nameField.setText(o.toString()); } super.setValue(o); } @Override public String getValueString() { if (value == null || value.equals("")) { return null; } return value.toString(); } } josm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/Configurer.java0000644000175000017500000000774311444175072032654 0ustar andrewandrew/* * $Id: Configurer.java 2175 2007-06-04 04:19:59 +0000 (Mon, 04 Jun 2007) rodneykinney $ * * Copyright (c) 2000-2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package org.openstreetmap.josm.plugins.lakewalker; import java.beans.PropertyChangeListener; /** * A property editor class. Wraps an Object value and provides * methods for saving and restoring the Object from a String. Also * includes a {@link java.awt.Component} that can be placed into a * property editing window, allowing the user to change the value * interactively. * */ public abstract class Configurer { // FIXME: maybe parameterize this so that value can have the right type // in subclasses? public static final String NAME_PROPERTY = "Configurer.name"; // public static final String VALUE_PROPERTY = "value"; /** A String the uniquely identifies this property */ protected String key; /** A String that provides a short description of the property to the user */ protected String name; /** The value */ protected Object value; protected java.beans.PropertyChangeSupport changeSupport; /** When noUpdate is true, setting the value programmatically will not * result in an update of the GUI Component */ protected boolean noUpdate = false; /** When frozen is true, setting the value programmatically will not * result in a PropertyChangeEvent being fired */ protected boolean frozen = false; public Configurer(String key, String name) { this(key, name, null); } public Configurer(String key, String name, Object val) { this.key = key; this.name = name; changeSupport = new java.beans.PropertyChangeSupport(this); setValue(val); } /** * Unique identifier */ public String getKey() { return key; } /** * Plain English description of the Object */ public String getName() { return name; } public void setName(String s) { String oldName = name; name = s; if (!frozen) { changeSupport.firePropertyChange(NAME_PROPERTY, oldName, name); } } /** * The Object value * May be null if the Object has not been initialized */ public Object getValue() { return value; } /** * @return a String representation of the Object value */ public abstract String getValueString(); /** * Set the Object value */ public void setValue(Object o) { Object oldValue = getValue(); value = o; if (!frozen) { changeSupport.firePropertyChange(key, oldValue, value); } } /** * If true, then don't fire PropertyChangeEvents when the value is reset */ public void setFrozen(boolean val) { frozen = val; } public boolean isFrozen() { return frozen; } /** * Fire a PropertyChangeEvent as if the value had been set from null */ public void fireUpdate() { changeSupport.firePropertyChange(key, null, value); } /** * Set the Object value from a String */ public abstract void setValue(String s); /** * GUI interface for setting the option in an editing window */ public abstract java.awt.Component getControls(); /** * Add a listener to be notified when the Object state changes */ public void addPropertyChangeListener(java.beans.PropertyChangeListener l) { changeSupport.addPropertyChangeListener(l); } public void removePropertyChangeListener(PropertyChangeListener l) { changeSupport.removePropertyChangeListener(l); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/StringConfigurer.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/StringConfigurer.0000644000175000017500000000451511444175072033173 0ustar andrewandrew/* * $Id: StringConfigurer.java 2073 2007-05-10 14:34:31 +0000 (Thu, 10 May 2007) rodneykinney $ * * Copyright (c) 2000-2007 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package org.openstreetmap.josm.plugins.lakewalker; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; /** * A Configurer for String values */ public class StringConfigurer extends Configurer { protected JPanel p; protected JTextField nameField = new JTextField(12); public StringConfigurer() { this(null, ""); } public StringConfigurer(String key, String name) { this(key, name, ""); } public StringConfigurer(String key, String name, String val) { super(key, name, val); } @Override public String getValueString() { return (String) value; } @Override public void setValue(String s) { if (!noUpdate && nameField != null) { nameField.setText(s); } setValue((Object) s); } public void setToolTipText(String s) { nameField.setToolTipText(s); } @Override public java.awt.Component getControls() { if (p == null) { p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel(getName())); nameField.setMaximumSize (new java.awt.Dimension(nameField.getMaximumSize().width, nameField.getPreferredSize().height)); nameField.setText(getValueString()); p.add(nameField); nameField.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyReleased(java.awt.event.KeyEvent evt) { noUpdate = true; setValue(nameField.getText()); noUpdate = false; } }); } return p; } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootjosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.javajosm-plugins-0.0.svn30137/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.0000644000175000017500000002721711717716124033127 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.lakewalker; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Cursor; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.LinkedList; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.command.AddCommand; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.command.SequenceCommand; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.tools.ImageProvider; import org.openstreetmap.josm.tools.Shortcut; import org.xml.sax.SAXException; /** * Interface to Darryl Shpak's Lakewalker module * * @author Brent Easton */ class LakewalkerAction extends JosmAction implements MouseListener { private static final long serialVersionUID = 1L; protected String name; protected Cursor oldCursor; protected Thread executeThread; protected boolean cancel; protected boolean active = false; protected Collection commands = new LinkedList(); protected Collection ways = new ArrayList(); public LakewalkerAction(String name) { super(name, "lakewalker-sml", tr("Lake Walker."), Shortcut.registerShortcut("tools:lakewalker", tr("Tool: {0}", tr("Lake Walker")), KeyEvent.VK_L, Shortcut.ALT_CTRL_SHIFT), true); this.name = name; setEnabled(true); } public void actionPerformed(ActionEvent e) { if(Main.map == null || Main.map.mapView == null || active) return; active = true; oldCursor = Main.map.mapView.getCursor(); Main.map.mapView.setCursor(ImageProvider.getCursor("crosshair", "lakewalker-sml")); Main.map.mapView.addMouseListener(this); } /** * check for presence of cache folder and trim cache to specified size. * size/age limit is on a per folder basis. */ private void cleanupCache() { final long maxCacheAge = System.currentTimeMillis()-Main.pref.getInteger(LakewalkerPreferences.PREF_MAXCACHEAGE, 100)*24*60*60*1000L; final long maxCacheSize = Main.pref.getInteger(LakewalkerPreferences.PREF_MAXCACHESIZE, 300)*1024*1024L; for (String wmsFolder : LakewalkerPreferences.WMSLAYERS) { String wmsCacheDirName = Main.pref.getPreferencesDir()+"plugins/Lakewalker/"+wmsFolder; File wmsCacheDir = new File(wmsCacheDirName); if (wmsCacheDir.exists() && wmsCacheDir.isDirectory()) { File wmsCache[] = wmsCacheDir.listFiles(); // sort files by date (most recent first) Arrays.sort(wmsCache, new Comparator() { public int compare(File f1, File f2) { return (int)(f2.lastModified()-f1.lastModified()); } }); // delete aged or oversized, keep newest. Once size/age limit was reached delete all older files long folderSize = 0; boolean quickdelete = false; for (File cacheEntry : wmsCache) { if (!cacheEntry.isFile()) continue; if (!quickdelete) { folderSize += cacheEntry.length(); if (folderSize > maxCacheSize) { quickdelete = true; } else if (cacheEntry.lastModified() < maxCacheAge) { quickdelete = true; } } if (quickdelete) { cacheEntry.delete(); } } } else { // create cache directory if (!wmsCacheDir.mkdirs()) { JOptionPane.showMessageDialog(Main.parent, tr("Error creating cache directory: {0}", wmsCacheDirName)); } } } } protected void lakewalk(Point clickPoint){ /** * Positional data */ final LatLon pos = Main.map.mapView.getLatLon(clickPoint.x, clickPoint.y); final LatLon topLeft = Main.map.mapView.getLatLon(0, 0); final LatLon botRight = Main.map.mapView.getLatLon(Main.map.mapView.getWidth(), Main.map.mapView.getHeight()); /** * Cache/working directory location */ final File working_dir = new File(Main.pref.getPreferencesDir(), "plugins/Lakewalker"); /* * Collect options */ final int waylen = Main.pref.getInteger(LakewalkerPreferences.PREF_MAX_SEG, 500); final int maxnode = Main.pref.getInteger(LakewalkerPreferences.PREF_MAX_NODES, 50000); final int threshold = Main.pref.getInteger(LakewalkerPreferences.PREF_THRESHOLD_VALUE, 90); final double epsilon = Main.pref.getDouble(LakewalkerPreferences.PREF_EPSILON, 0.0003); final int resolution = Main.pref.getInteger(LakewalkerPreferences.PREF_LANDSAT_RES, 4000); final int tilesize = Main.pref.getInteger(LakewalkerPreferences.PREF_LANDSAT_SIZE, 2000); final String startdir = Main.pref.get(LakewalkerPreferences.PREF_START_DIR, "east"); final String wmslayer = Main.pref.get(LakewalkerPreferences.PREF_WMS, "IR1"); try { PleaseWaitRunnable lakewalkerTask = new PleaseWaitRunnable(tr("Tracing")){ @Override protected void realRun() throws SAXException { progressMonitor.subTask(tr("checking cache...")); cleanupCache(); processnodelist(pos, topLeft, botRight, waylen, maxnode, threshold, epsilon,resolution,tilesize,startdir,wmslayer, working_dir, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); } @Override protected void finish() { } @Override protected void cancel() { LakewalkerAction.this.cancel(); } }; Thread executeThread = new Thread(lakewalkerTask); executeThread.start(); } catch (Exception ex) { System.out.println("Exception caught: " + ex.getMessage()); } } private void processnodelist(LatLon pos, LatLon topLeft, LatLon botRight, int waylen, int maxnode, int threshold, double epsilon, int resolution, int tilesize, String startdir, String wmslayer, File workingdir, ProgressMonitor progressMonitor){ progressMonitor.beginTask(null, 3); try { ArrayList nodelist = new ArrayList(); Lakewalker lw = new Lakewalker(waylen,maxnode,threshold,epsilon,resolution,tilesize,startdir,wmslayer,workingdir); try { nodelist = lw.trace(pos.lat(),pos.lon(),topLeft.lon(),botRight.lon(),topLeft.lat(),botRight.lat(), progressMonitor.createSubTaskMonitor(1, false)); } catch(LakewalkerException e){ System.out.println(e.getMessage()); } System.out.println(nodelist.size()+" nodes generated"); /** * Run the nodelist through a vertex reduction algorithm */ progressMonitor.subTask(tr("Running vertex reduction...")); nodelist = lw.vertexReduce(nodelist, epsilon); //System.out.println("After vertex reduction "+nodelist.size()+" nodes remain."); /** * And then through douglas-peucker approximation */ progressMonitor.worked(1); progressMonitor.subTask(tr("Running Douglas-Peucker approximation...")); nodelist = lw.douglasPeucker(nodelist, epsilon, 0); //System.out.println("After Douglas-Peucker approximation "+nodelist.size()+" nodes remain."); /** * And then through a duplicate node remover */ progressMonitor.worked(1); progressMonitor.subTask(tr("Removing duplicate nodes...")); nodelist = lw.duplicateNodeRemove(nodelist); //System.out.println("After removing duplicate nodes, "+nodelist.size()+" nodes remain."); // if for some reason (image loading failed, ...) nodelist is empty, no more processing required. if (nodelist.size() == 0) { return; } /** * Turn the arraylist into osm nodes */ Way way = new Way(); Node n = null; Node fn = null; double eastOffset = Main.pref.getDouble(LakewalkerPreferences.PREF_EAST_OFFSET, 0.0); double northOffset = Main.pref.getDouble(LakewalkerPreferences.PREF_NORTH_OFFSET, 0.0); int nodesinway = 0; for(int i = 0; i< nodelist.size(); i++){ if (cancel) { return; } try { LatLon ll = new LatLon(nodelist.get(i)[0]+northOffset, nodelist.get(i)[1]+eastOffset); n = new Node(ll); if(fn==null){ fn = n; } commands.add(new AddCommand(n)); } catch (Exception ex) { ex.printStackTrace(); } way.addNode(n); if(nodesinway > Main.pref.getInteger(LakewalkerPreferences.PREF_MAX_SEG, 500)){ String waytype = Main.pref.get(LakewalkerPreferences.PREF_WAYTYPE, "water"); if(!waytype.equals("none")){ way.put("natural",waytype); } way.put("source", Main.pref.get(LakewalkerPreferences.PREF_SOURCE, "Landsat")); commands.add(new AddCommand(way)); way = new Way(); way.addNode(n); nodesinway = 0; } nodesinway++; } String waytype = Main.pref.get(LakewalkerPreferences.PREF_WAYTYPE, "water"); if(!waytype.equals("none")){ way.put("natural",waytype); } way.put("source", Main.pref.get(LakewalkerPreferences.PREF_SOURCE, "Landsat")); way.addNode(fn); commands.add(new AddCommand(way)); if (!commands.isEmpty()) { Main.main.undoRedo.add(new SequenceCommand(tr("Lakewalker trace"), commands)); Main.main.getCurrentDataSet().setSelected(ways); } else { System.out.println("Failed"); } commands = new LinkedList(); ways = new ArrayList(); } finally { progressMonitor.finishTask(); } } public void cancel() { cancel = true; } public void mouseClicked(MouseEvent e) { if(active) { active = false; Main.map.mapView.removeMouseListener(this); Main.map.mapView.setCursor(oldCursor); lakewalk(e.getPoint()); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } josm-plugins-0.0.svn30137/lakewalker/images/0000755000175000017500000000000012275270067020124 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/images/cursor/0000755000175000017500000000000012275270067021441 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/images/cursor/modifier/0000755000175000017500000000000012275270067023237 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/images/cursor/modifier/lakewalker-sml.png0000644000175000017500000000202710656707157026667 0ustar andrewandrewPNG  IHDRw=bKGD pHYs  tIME ..CtEXtCommentCreated with The GIMPd%n{IDATxUMlEfv^8]'!]ˉ$UEUJ RDUr zq(Gz@%P P%*P!USr  1$Yk.@ZvV;>}yox^:119 Cp&ᥥ%W#|! RaQ E9its9xpUә{ܚ0I"QUA# (&空xaEW"#ɲ{U.8lXac!F& Ud/uA̓J7.ڥ||j]CF>i"k P*A TAiSPPk X.NzH[ͯOȴiǨ|]hvvQ{ݣʼn!E*"E;bFx,mXloeNBȶi͏ZǎYY O4>>NM=j h50Իh4Uq^{Yg(\9S$T r9-ǥC&#w&|ӋWVDhoo΂Y|~_"(?ZX}$ovg{_zyp_'_OďGI:m~dyii <*ٺ"n6^+r mAO0m%-/Q^: µo9s쇶t,cϙc[釡W)Xk79՜yƦ&Vc PJgנe@_2(/\.I~ ލ%~ix6wqѼC&0BdVogʓb9f.NY;*%$I*dVM&L&ӛ,1؇96_7=3=BUpIENDB`josm-plugins-0.0.svn30137/lakewalker/images/preferences/0000755000175000017500000000000012275270067022425 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/images/preferences/lakewalker.png0000644000175000017500000000211110656707157025256 0ustar andrewandrewPNG  IHDR szzbKGD pHYs  tIME . 3CtEXtCommentCreated with The GIMPd%nIDATxWAL#UڙN m@cmXԉY؋pⰗv7&Gmb4d5BR/tWcl x@[I-vq" -]B㗼˼}Wϳ-#@DtZp>#4MF1|xajr5L9^$Pu:M*Ab $5`0I&/eT*AՎh 5f;*_߹;kO"xMf2|] ð$Ea9C񈽜Dni֩@|w'fGo5cR/tK vf;4T{ 0ZPDv~@3/VibHN1Ot3 XtFL(hgEG(e/9y&nw<Ų _$I,,%P`_=@$P(ʲ Ma k'D37ZW4M矚@(_zmDJ6G Lz0S5"̆NY톜˩Mz//xSfZH"+\.ft&), ׏FoJ'UD{$#],7ۓW:PLt{*UG5SE!,/"s$ A-4.IRػd\WFtABvi(@ ug[ (c+&V(fޏ\;C5Í)mܿO% 0rxMC'IEQ+ʿ 5tvvƝNg`ee0̤ \%EZ~˞d}yox^:119 Cp&ᥥ%W#|! RaQ E9its9xpUә{ܚ0I"QUA# (&空xaEW"#ɲ{U.8lXac!F& Ud/uA̓J7.ڥ||j]CF>i"k P*A TAiSPPk X.NzH[ͯOȴiǨ|]hvvQ{ݣʼn!E*"E;bFx,mXloeNBȶi͏ZǎYY O4>>NM=j h50Իh4Uq^{Yg(\9S$T r9-ǥC&#w&|ӋWVDhoo΂Y|~_"(?ZX}$ovg{_zyp_'_OďGI:m~dyii <*ٺ"n6^+r mAO0m%-/Q^: µo9s쇶t,cϙc[釡W)Xk79՜yƦ&Vc PJgנe@_2(/\.I~ ލ%~ix6wqѼC&0BdVogʓb9f.NY;*%$I*dVM&L&ӛ,1؇96_7=3=BUpIENDB`josm-plugins-0.0.svn30137/lakewalker/.project0000644000175000017500000000060712204774241020324 0ustar andrewandrew JOSM-lakewalker org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature josm-plugins-0.0.svn30137/lakewalker/.classpath0000644000175000017500000000056612163422506020642 0ustar andrewandrew josm-plugins-0.0.svn30137/lakewalker/README0000644000175000017500000000137510756236166017551 0ustar andrewandrewREADME FOR Lakewalker ======================= The Lakewalker plugin can be used to generate traces of lakes, rivers or shoreline from LANDSAT imagery (or theoretically any imagery that is provided on a WMS server). Currently the plugin features 2 modes of operation: Native and Classic. The classic mode requires the Python lakewalker.py script to be downloaded into the lakewalker directory within the JOSM plugin directory. Common Features: - On-screen feedback to Lakewalker progress with cancel - Tag ways appropriately - limit ways to length - Manage Landsat image cache from Prefs screen Native Features: - Doesn't require Python Classic Features: - Access all lakewalker options via preferences - Read data in thread - ...josm-plugins-0.0.svn30137/lakewalker/data/0000755000175000017500000000000012275270067017570 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/build.xml0000644000175000017500000000225612205016044020467 0ustar andrewandrew josm-plugins-0.0.svn30137/lakewalker/nbproject/0000755000175000017500000000000012275270067020645 5ustar andrewandrewjosm-plugins-0.0.svn30137/lakewalker/nbproject/project.xml0000644000175000017500000000525712174027305023037 0ustar andrewandrew org.netbeans.modules.ant.freeform lakewalker lakewalker java src UTF-8 . UTF-8 compile clean runjosm clean compile src build.xml src ../../core/src 1.6 josm-plugins-0.0.svn30137/DirectUpload/0000755000175000017500000000000012275270064017111 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/.settings/0000755000175000017500000000000012275270064021027 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000001514512205016044026004 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 josm-plugins-0.0.svn30137/DirectUpload/src/0000755000175000017500000000000012275270064017700 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/src/org/0000755000175000017500000000000012275270064020467 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/0000755000175000017500000000000012275270064023355 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/0000755000175000017500000000000012275270064024325 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/0000755000175000017500000000000012275270064026006 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/0000755000175000017500000000000012275270064030365 5ustar andrewandrew././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadOsmConnection.javajosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadOsmConn0000644000175000017500000000565611470043047033040 0ustar andrewandrew// ... package org.openstreetmap.josm.plugins.DirectUpload; import java.net.HttpURLConnection; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.dialogs.LayerListDialog; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.io.OsmConnection; import org.openstreetmap.josm.io.OsmTransferException; /** * Work-around and utility class for DirectUpload. * * @author ax */ public class UploadOsmConnection extends OsmConnection { // singleton, see http://en.wikipedia.org/wiki/Singleton_pattern#Traditional_simple_way private static final UploadOsmConnection INSTANCE = new UploadOsmConnection(); // Private constructor prevents instantiation from other classes private UploadOsmConnection() { } public static UploadOsmConnection getInstance() { return UploadOsmConnection.INSTANCE; } // make protected OsmConnection::addAuth() available to others public void addAuthHack(HttpURLConnection connection) throws OsmTransferException { addAuth(connection); } /** * find which gpx layer holds the trace to upload. layers are tried in this order: * * 1. selected (*not* active - think "zoom to layer"), from first to last * 2. not selectd - if there is only one * 3. active * * @return data of the selected gpx layer, or null if there is none */ GpxData autoSelectTrace() { if (Main.map != null && Main.map.mapView != null) { MapView mv = Main.map.mapView; // List allLayers = new ArrayList(mv.getAllLayersAsList()); // modifiable List selectedLayers = LayerListDialog.getInstance().getModel().getSelectedLayers(); List gpxLayersRemaining = mv.getLayersOfType(GpxLayer.class); gpxLayersRemaining.removeAll(selectedLayers); GpxLayer traceLayer = null; // find the first gpx layer inside selected layers for (Layer l : LayerListDialog.getInstance().getModel().getSelectedLayers()) { if (l instanceof GpxLayer) { traceLayer = (GpxLayer) l; break; } } if (traceLayer == null) { // if there is none, try the none selected gpx layers. if there is only one, use it. if (gpxLayersRemaining.size() == 1) { traceLayer = gpxLayersRemaining.get(0); } // active layer else if (mv.getActiveLayer() instanceof GpxLayer) { traceLayer = (GpxLayer) mv.getActiveLayer(); } } if (traceLayer != null) { GpxData data = traceLayer.data; return data; } } return null; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadDataGui.formjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadDataGui0000644000175000017500000002077311110156516032774 0ustar andrewandrew
././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadDataGuiPlugin.javajosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadDataGui0000644000175000017500000000366312205672607033005 0ustar andrewandrew/* * Copyright by Subhodip Biswas * This program is free software and licensed under GPL. * */ package org.openstreetmap.josm.plugins.DirectUpload; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.gui.MainMenu; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; import org.openstreetmap.josm.tools.Shortcut; /** * * @author subhodip, ax */ public class UploadDataGuiPlugin extends Plugin { UploadAction openaction; public UploadDataGuiPlugin(PluginInformation info) { super(info); openaction = new UploadAction(); MainMenu.add(Main.main.menu.gpsMenu, openaction); } class UploadAction extends JosmAction { public UploadAction(){ super(tr("Upload Traces"), "UploadAction", tr("Uploads traces to openstreetmap.org"), Shortcut.registerShortcut("tools:uploadtraces", tr("Tool: {0}", tr("Upload Traces")), KeyEvent.VK_G, Shortcut.CTRL), false); } public void actionPerformed(ActionEvent e) { UploadDataGui go = new UploadDataGui(); go.setVisible(true); } // because LayerListDialog doesn't provide a way to hook into "layer selection changed" // but the layer selection (*not* activation) is how we determine the layer to be uploaded // we have to let the upload trace menu always be enabled // @Override // protected void updateEnabledState() { // // enable button if ... @see autoSelectTrace() // if (UploadOsmConnection.getInstance().autoSelectTrace() == null) { // setEnabled(false); // } else { // setEnabled(true); // } // } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadDataGui.javajosm-plugins-0.0.svn30137/DirectUpload/src/org/openstreetmap/josm/plugins/DirectUpload/UploadDataGui0000644000175000017500000004756012242540737033010 0ustar andrewandrew/* * UploadDataGui.java * * Created on August 17, 2008, 6:56 PM * Copyright by Subhodip Biswas * This program is free software and licensed under GPL. */ package org.openstreetmap.josm.plugins.DirectUpload; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.gpx.GpxConstants; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.data.gpx.GpxTrack; import org.openstreetmap.josm.gui.ExtendedDialog; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.gui.widgets.HistoryComboBox; import org.openstreetmap.josm.gui.widgets.JMultilineLabel; import org.openstreetmap.josm.gui.widgets.UrlLabel; import org.openstreetmap.josm.io.GpxWriter; import org.openstreetmap.josm.io.OsmApi; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.Utils; /** * * @author subhodip, xeen, ax */ public class UploadDataGui extends ExtendedDialog { /** * This enum contains the possible values for the visibility field and their * explanation. Provides some methods for easier handling. */ private enum visibility { PRIVATE (tr("Private (only shared as anonymous, unordered points)")), PUBLIC (tr("Public (shown in trace list and as anonymous, unordered points)")), TRACKABLE (tr("Trackable (only shared as anonymous, ordered points with timestamps)")), IDENTIFIABLE (tr("Identifiable (shown in trace list and as identifiable, ordered points with timestamps)")); public final String description; visibility(String description) { this.description = description; } /** * "Converts" a given description into the actual enum. Returns null if no matching description * is found. * @param desc The description to look for * @return visibility or null */ public static visibility desc2visi(Object desc) { for (visibility v : visibility.values()) { if(desc.equals(v.description)) return v; } return null; } @Override public String toString() { return this.name().toLowerCase(); } } // Fields are declared here for easy access // Do not remove the space in JMultilineLabel. Otherwise the label will be empty // as we don't know its contents yet and therefore have a height of 0. This will // lead to unnecessary scrollbars. private JMultilineLabel outputDisplay = new JMultilineLabel(" "); private HistoryComboBox descriptionField; private HistoryComboBox tagsField; private JComboBox visibilityCombo; // Constants used when generating upload request private static final String BOUNDARY = "----------------------------d10f7aa230e8"; private static final String LINE_END = "\r\n"; private static final String uploadTraceText = tr("Upload Trace"); private boolean canceled = false; public UploadDataGui() { // Initalizes ExtendedDialog super(Main.parent, tr("Upload Traces"), new String[] {uploadTraceText, tr("Cancel")}, true ); JPanel content = initComponents(); GpxData gpxData = UploadOsmConnection.getInstance().autoSelectTrace(); initTitleAndDescriptionFromGpxData(gpxData); // this is changing some dialog elements, so it (probably) must be before the following setContent(content); setButtonIcons(new String[] { "uploadtrace.png", "cancel.png" }); setupDialog(); buttons.get(0).setEnabled(gpxData != null); } /** * Sets up the dialog window elements * @return JPanel with components */ private JPanel initComponents() { // visibilty JLabel visibilityLabel = new JLabel(tr("Visibility")); visibilityLabel.setToolTipText(tr("Defines the visibility of your trace for other OSM users.")); visibilityCombo = new JComboBox(); visibilityCombo.setEditable(false); for(visibility v : visibility.values()) { visibilityCombo.addItem(v.description); } visibilityCombo.setSelectedItem(visibility.valueOf(Main.pref.get("directupload.visibility.last-used", visibility.PRIVATE.name())).description); UrlLabel visiUrl = new UrlLabel(tr("http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces"), tr("(What does that mean?)"), 2); // description JLabel descriptionLabel = new JLabel(tr("Description")); descriptionField = new HistoryComboBox(); descriptionField.setToolTipText(tr("Please enter Description about your trace.")); List descHistory = new LinkedList(Main.pref.getCollection("directupload.description.history", new LinkedList())); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement() // XXX this should be handled in HistoryComboBox Collections.reverse(descHistory); descriptionField.setPossibleItems(descHistory); // tags JLabel tagsLabel = new JLabel(tr("Tags (comma delimited)")); tagsField = new HistoryComboBox(); tagsField.setToolTipText(tr("Please enter tags about your trace.")); List tagsHistory = new LinkedList(Main.pref.getCollection("directupload.tags.history", new LinkedList())); // we have to reverse the history, because ComboBoxHistory will reverse it againin addElement() // XXX this should be handled in HistoryComboBox Collections.reverse(tagsHistory); tagsField.setPossibleItems(tagsHistory); JPanel p = new JPanel(new GridBagLayout()); outputDisplay.setMaxWidth(findMaxDialogSize().width-10); p.add(outputDisplay, GBC.eol()); p.add(tagsLabel, GBC.eol().insets(0,10,0,0)); p.add(tagsField, GBC.eol().fill(GBC.HORIZONTAL)); p.add(descriptionLabel, GBC.eol().insets(0,10,0,0)); p.add(descriptionField, GBC.eol().fill(GBC.HORIZONTAL)); p.add(visibilityLabel, GBC.std().insets(0,10,0,0)); p.add(visiUrl, GBC.eol().insets(5,10,0,0)); p.add(visibilityCombo, GBC.eol()); return p; } private void initTitleAndDescriptionFromGpxData(GpxData gpxData) { String description = "", title = "", tags = ""; if (gpxData != null) { GpxTrack firstTrack = gpxData.tracks.iterator().next(); Object meta_desc = gpxData.attr.get(GpxConstants.META_DESC); if (meta_desc != null) { description = meta_desc.toString(); } else if (firstTrack != null && gpxData.tracks.size() == 1 && firstTrack.get("desc") != null) { description = firstTrack.getString("desc"); } else if (gpxData.storageFile != null) { description = gpxData.storageFile.getName().replaceAll("[&?/\\\\]"," ").replaceAll("(\\.[^.]*)$",""); } if (gpxData.storageFile != null) { title = tr("Selected track: {0}", gpxData.storageFile.getName()); } Object meta_tags = gpxData.attr.get(GpxConstants.META_KEYWORDS); if (meta_tags != null) { tags = meta_tags.toString(); } } else { description = new SimpleDateFormat("yyMMddHHmmss").format(new Date()); title = tr("No GPX layer selected. Cannot upload a trace."); } outputDisplay.setText(title); descriptionField.setText(description); tagsField.setText(tags); } /** * This is the actual workhorse that manages the upload. * @param String Description of the GPX track being uploaded * @param String Tags associated with the GPX track being uploaded * @param boolean Shall the GPX track be public * @param GpxData The GPX Data to upload */ private void upload(String description, String tags, String visi, GpxData gpxData, ProgressMonitor progressMonitor) throws IOException { progressMonitor.beginTask(tr("Uploading trace ...")); try { if (checkForErrors(description, gpxData)) { return; } // Clean description/tags from disallowed chars description = description.replaceAll("[&?/\\\\]", " "); tags = tags.replaceAll("[&?/\\\\.;]", " "); // Set progress dialog to indeterminate while connecting progressMonitor.indeterminateSubTask(tr("Connecting...")); // Generate data for upload ByteArrayOutputStream baos = new ByteArrayOutputStream(); writeGpxFile(baos, "file", gpxData); writeField(baos, "description", description); writeField(baos, "tags", (tags != null && tags.length() > 0) ? tags : ""); writeField(baos, "visibility", visi); writeString(baos, "--" + BOUNDARY + "--" + LINE_END); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); HttpURLConnection conn = setupConnection(baos.size()); progressMonitor.setTicksCount(baos.size()); progressMonitor.subTask(null); flushToServer(bais, conn.getOutputStream(), progressMonitor); if (canceled) { conn.disconnect(); GuiHelper.runInEDT(new Runnable() { @Override public void run() { outputDisplay.setText(tr("Upload canceled")); buttons.get(0).setEnabled(true); } }); canceled = false; } else { final boolean success = finishUpConnection(conn); GuiHelper.runInEDT(new Runnable() { @Override public void run() { buttons.get(0).setEnabled(!success); if (success) { buttons.get(1).setText(tr("Close")); } } }); } } catch (Exception e) { GuiHelper.runInEDT(new Runnable() { @Override public void run() { outputDisplay.setText(tr("Error while uploading")); } }); e.printStackTrace(); } finally { progressMonitor.finishTask(); } } /** * This function sets up the upload URL and logs in using the username and password given * in the preferences. * @param int The length of the content to be sent to the server * @return HttpURLConnection The set up conenction */ private HttpURLConnection setupConnection(int contentLength) throws Exception { // Upload URL URL url = new URL(OsmApi.getOsmApi().getBaseUrl() + "gpx/create"); // Set up connection and log in HttpURLConnection c = Utils.openHttpConnection(url); c.setFixedLengthStreamingMode(contentLength); c.setConnectTimeout(15000); c.setRequestMethod("POST"); c.setDoOutput(true); // unfortunately, addAuth() is protected, so we need to subclass OsmConnection // XXX make addAuth public. UploadOsmConnection.getInstance().addAuthHack(c); c.addRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); c.addRequestProperty("Connection", "close"); // counterpart of keep-alive c.addRequestProperty("Expect", ""); c.connect(); return c; } /** * This function checks if the given connection finished up fine, closes it and returns the result. * It also posts the result (or errors) to OutputDisplay. * @param HttpURLConnection The connection to check/finish up */ private boolean finishUpConnection(HttpURLConnection c) throws Exception { String returnMsg = c.getResponseMessage(); final boolean success = returnMsg.equals("OK"); if (c.getResponseCode() != 200) { if (c.getHeaderField("Error") != null) returnMsg += "\n" + c.getHeaderField("Error"); } final String returnMsgEDT = returnMsg; GuiHelper.runInEDT(new Runnable() { @Override public void run() { outputDisplay.setText(success ? tr("GPX upload was successful") : tr("Upload failed. Server returned the following message: ") + returnMsgEDT); } }); c.disconnect(); return success; } /** * Uploads a given InputStream to a given OutputStream and sets progress * @param InputSteam * @param OutputStream */ private void flushToServer(InputStream in, OutputStream out, ProgressMonitor progressMonitor) throws Exception { // Upload in 10 kB chunks byte[] buffer = new byte[10000]; int nread; int cur = 0; synchronized (in) { while ((nread = in.read(buffer, 0, buffer.length)) >= 0) { out.write(buffer, 0, nread); cur += nread; out.flush(); progressMonitor.worked(nread); progressMonitor.subTask(getProgressText(cur, progressMonitor)); if(canceled) break; } } if(!canceled) out.flush(); progressMonitor.subTask("Waiting for server reply..."); buffer = null; } /** * Generates the output string displayed in the PleaseWaitDialog. * @param int Bytes already uploaded * @return String Message */ private String getProgressText(int cur, ProgressMonitor progressMonitor) { int max = progressMonitor.getTicksCount(); int percent = Math.round(cur * 100 / max); return tr("Uploading GPX track: {0}% ({1} of {2})", percent, formatBytes(cur), formatBytes(max)); } /** * Nicely calculates given bytes into MB, kB and B (with units) * @param int Bytes * @return String */ private String formatBytes(int bytes) { return (bytes > 1000 * 1000 // Rounds to 2 decimal places ? new DecimalFormat("0.00") .format((double)Math.round(bytes/(1000*10))/100) + " MB" : (bytes > 1000 ? Math.round(bytes/1000) + " kB" : bytes + " B")); } /** * Checks for common errors and displays them in OutputDisplay if it finds any. * Returns whether errors have been found or not. * @param String GPX track description * @param GpxData the GPX data to upload * @return boolean true if errors have been found */ private boolean checkForErrors(String description, GpxData gpxData) { String errors=""; if(description == null || description.length() == 0) errors += tr("No description provided. Please provide some description."); if(gpxData == null) errors += tr("No GPX layer selected. Cannot upload a trace."); final String errorsEDT = errors; GuiHelper.runInEDT(new Runnable() { @Override public void run() { outputDisplay.setText(errorsEDT); } }); return errors.length() > 0; } /** * This creates the uploadTask that does the actual work and hands it to the main.worker to be executed. */ private void setupUpload() { final GpxData gpxData = UploadOsmConnection.getInstance().autoSelectTrace(); if (gpxData == null) { return; } // Disable Upload button so users can't just upload that track again buttons.get(0).setEnabled(false); // save history Main.pref.put("directupload.visibility.last-used", visibility.desc2visi(visibilityCombo.getSelectedItem().toString()).name()); descriptionField.addCurrentItemToHistory(); Main.pref.putCollection("directupload.description.history", descriptionField.getHistory()); tagsField.addCurrentItemToHistory(); Main.pref.putCollection("directupload.tags.history", tagsField.getHistory()); PleaseWaitRunnable uploadTask = new PleaseWaitRunnable(tr("Uploading GPX Track")){ @Override protected void realRun() throws IOException { upload(descriptionField.getText(), tagsField.getText(), visibility.desc2visi(visibilityCombo.getSelectedItem()).toString(), gpxData, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false) ); } @Override protected void finish() {} @Override protected void cancel() { canceled = true; } }; Main.worker.execute(uploadTask); } /** * Writes textfields (like in webbrowser) to the given ByteArrayOutputStream * @param ByteArrayOutputStream * @param String The name of the "textbox" * @param String The value to write */ private void writeField(ByteArrayOutputStream baos, String name, String value) throws IOException { writeBoundary(baos); writeString(baos, "Content-Disposition: form-data; name=\"" + name + "\""); writeLineEnd(baos); writeLineEnd(baos); baos.write(value.getBytes("UTF-8")); writeLineEnd(baos); } /** * Writes gpxData (= file field in webbrowser) to the given ByteArrayOutputStream * @param ByteArrayOutputStream * @param String The name of the "upload field" * @param GpxData The GPX data to upload */ private void writeGpxFile(ByteArrayOutputStream baos, String name, GpxData gpxData) throws IOException { writeBoundary(baos); writeString(baos, "Content-Disposition: form-data; name=\"" + name + "\"; "); writeString(baos, "filename=\"" + gpxData.storageFile.getName() + "\""); writeLineEnd(baos); writeString(baos, "Content-Type: application/octet-stream"); writeLineEnd(baos); writeLineEnd(baos); new GpxWriter(baos).write(gpxData); writeLineEnd(baos); } /** * Writes a String to the given ByteArrayOutputStream * @param ByteArrayOutputStream * @param String */ private void writeString(ByteArrayOutputStream baos, String s) { try { baos.write(s.getBytes()); } catch(Exception e) {} } /** * Writes a newline to the given ByteArrayOutputStream * @param ByteArrayOutputStream */ private void writeLineEnd(ByteArrayOutputStream baos) { writeString(baos, LINE_END); } /** * Writes a boundary line to the given ByteArrayOutputStream * @param ByteArrayOutputStream */ private void writeBoundary(ByteArrayOutputStream baos) { writeString(baos, "--" + BOUNDARY); writeLineEnd(baos); } /** * Overrides the default actions. Will not close the window when upload trace is clicked */ @Override protected void buttonAction(int buttonIndex, ActionEvent evt) { String a = evt.getActionCommand(); if(uploadTraceText.equals(a)) setupUpload(); else setVisible(false); } } josm-plugins-0.0.svn30137/DirectUpload/test/0000755000175000017500000000000012275270064020070 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/images/0000755000175000017500000000000012275270064020356 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/images/UploadAction.png0000644000175000017500000031511711110156516023446 0ustar andrewandrewPNG  IHDRVsBIT|dGzTXtSoftwarexKLNU0г3QPL*KW(K-*S033TUMTQ020ProJTtEXtRaw profile type exif exif 3179 45786966000049492a000800000007000b0002000e000000620000000001040001000000 190000000101040001000000180000000d0102000e000000700000001201030001000000 01000000310102000e0000007e00000069870400010000008c000000aa00000064696769 4b616d2d302e392e340064726177696e672d382e706e6700646967694b616d2d302e392e 3400020002a00400010000001900000003a0040001000000180000000000000003000301 030001000000060000000102040001000000d40000000202040001000000910b00000000 0000ffd8ffe000104a46494600010102000000000000ffdb004300080606070605080707 070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20242e2720222c231c1c28 37292c30313434341f27393d38323c2e333432ffdb0043010909090c0b0c180d0d183221 1c2132323232323232323232323232323232323232323232323232323232323232323232 32323232323232323232323232323232ffc00011080078007c03012200021101031101ff c4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5 100002010303020403050504040000017d01020300041105122131410613516107227114 328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738 393a434445464748494a535455565758595a636465666768696a737475767778797a8384 85868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4 c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faff c4001f0100030101010101010101010000000000000102030405060708090a0bffc400b5 110002010204040304070504040001027700010203110405213106124151076171132232 8108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a353637 38393a434445464748494a535455565758595a636465666768696a737475767778797a82 838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2 c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faff da000c03010002110311003f00f7fa28aa97b762dd08e338acabd7850a6ea4de884dd82e 6fa3850f39358773a9b393826a95cde19a42b9a896d98fcc4d7c9d6c5e231b2d1f2c44df 564735dce49c0359f737b7014820d684b72908c100e2b3e79d670405fd2b92a50a695dea ccf9efb232c6ab35bbe467ad6f69de239ce1589c7d6b066d3da43900d4485a16dbce4569 4b17520bdc22539eed1e9b63ac42ebfbc93156e5d5ece15dcd2715e54f77223021d862a2 bad425ba8c46b23023debecb2bf698887355564455c52a50bbdceeaefc4c0cfb626256b2 b52f135e478f2413f8d7316e920c16626b452554c6f00fd6bd897b3835ecd731e5cb309c ddb6346c7c4fa834a3cd460bf5aebacfc45692a012bed7ae1c5d473af968801f502b36f2 cae125f396570179c035c8abd3a95392aae43aa9e26518dd6a7b0c5324e81e36054d3ebc dfc33e2968e65b7964f9436d39aed3fb76cffe7ac7ff007d8a7570d384ac95cefa55e152 3cc99a4ee110b1ed5ca6b17a4cac735d1ea0fe5da93ef8ae1b5193cc73cf7af8fcff0011 2e78d05b3dcd5b2781724487a5477d79b5b6c67ad3bccd965c75aad67686f645620f5ae2 7ee4146262fde616b693dcc9961906ba0b3d0564e1be5f7c56a69fa7ac3129c0ad2000e8 315e9e132853b54adf71aa8986fa24484a819e3ae2b1e7d1a28663248bf2d76b8ac4f134 c2df4c67e075e6bd8a19751534921cb48b679af884c6974160fbb9aab670994fca39aad2 5c7da642d9cf35afa201e6fe358e7b8e78682c351563e6aacdd5afcacb90d8bede9493db 347d457536d6e8e9924551d5edd5065707e95d5965254a9c6ace4f535ab86b42e8c2b58c 2cb9a96f5c1465f5aaad70627355e79a5932ea8c7e94b194dd5973c4ca8d4e58f298b762 6b472f1f1939aadfda77bfdeabb7772f20db2a9503d6a9662fefafe75ed6133394692556 3a8d427f6763de35938b1ff817f435c1ddbe1ce7d6bbfd5537d9903fbdfe35e7faa41229 6dab5f9de7c9fd653f23e8aa7c2c6c5741cf979aeaf40b542a0915c1d86f37c15857a1e9 b7305a443cd6dbc55e5779565196c4504dab1b8005181d296b1ae3c49a6c439b802a9a78 ab4f92708b700e6beb3992d0ec546a357b1d2d71df11ae7ecfa031071c1aeaadeea2b850 636ce6b91f89b034de1a6da32466ba70b6f6d1bf7319ad1a678ff87efbceb766639c0ae8 34bd5638a739f5af39d26ee4b485d1b83d2ad43a93aca493c66baf19c3d0c5e22529eccf 06a52b4dc91ecf6facab2641e2af4727dbd4e39e2bccf4fd5d7c9197adbb3f107d9f847e bef59e63974e9617d9d1e8654eac94fdfd8ddb9d225690919adad2b4a8d6d08953271deb 9c6d7a478815393f5ad7d33539ded4b3e7a57c654c6d45fbaa874d19d155344731e3eb55 b5b7dd0aed38af35f3e7fef9aef3c797b24f6f81cf15e73ba5f4afb6e1f8b9e0d36ae5cb de7789f5dba2baed61915897fa42bb3155f96b709c0cd626b5ae5ae9d13199b1c7ad7858 cc1d2c4c6d516c7b2a0e6ec8e46fecd74a737448e3b66b8cd77c7e09288d8edc566f8b3c 5335e5d491c12650f4e6b81b859dd8b3d461f2c9423cd05b1e9617eaf4269557a9b17fe2 1b8ba662b3b8cfbd56b1d5ee6dee92669dc81ef5919edde9eadc62b29a945ea7d4d274a7 1b4763dbfc23e3f57d88ec38e39af45bcf275dd1fcb664c3fa915f2b5a5ecb66ea636c73 5ea9e0ff001699248e0b8932bf5aeaa15da6ae78b98e59a73d3386f1968f2685aa345b48 1bc8ac427720c1e6bde7c59a1daf896de492de23e6aae436739af0dd4b45bed3aee412ae 101e38afbbcbf190ad4d26f547c857a0d4864576f171b8d5fb7d4db70f98d62f9c8a70dd 6a68ee225e735df3a6a4b638e50f23d1fc3f2fdae5542dfad759757a9a65b3a65738af24 d2b5e5b39836ec5694da95eeb17f1885b28c79af82c6f0ecea62f9b68914a835b6e6f42a de27ba6811493bb0302b47fe15a5e7fcfbcbff007c9aecbc0de121656d1df4cd8763bb6e daef6bb1623eaabd950d91ea53a2a31b339ed775e8b4fb591bcd50c3a0cd78578abc613e b123c5f3601c574bf102c7526bd631cce23c9c8af378ad99666f33939ac7058496267aec 8efaf88a784a575ac98b0db6f3e6375a5b955c11c56bc764cf08db546ef4b98e704d7d35 354292e46cf9dbd6af3e767397110462c2ab86e735a1776cf6f92fd2b3c8de722bcec7e5 30ab1f6948fa0cbf33a9876a35362657ddd4d5cb0bf6b39c3a93546381d8e056847a2cf2 20604d7cdacbab735ac7d24b3bc3a86acf64f03789e5b8b611e581618ce6bb6bff0008d9 ebda7a7da550c9cfce57923eb5e75f0e7c3f726247c9c01e95ed76d198add10f502ba231 a941dafaa3e7b135e9d7973c1591e39aa7c16f3199ed56363d86e03f9d7297bf0a358b49 369b3c67a1deb83f8e6be93a2bd1a79b6260ad7b9c6e9c59f3d69bf06f54b92af3da848c f769147e99af50f09fc3eb1f0ffcf3430ccfb7003286c7bf35dad15957cc6bd75693d06a 0908aaa8a154000740052d145709673fe24d220bab096461f37d2bc1b58b3fb35d498181 babe8ad5248dac6450ea49f7af0ef17c223919863935ed64f512938f73cfc72bab952d40 1660f7a8dbe7eb496cff00e88053906457cfe7352ad3c4d933d9cb214e546ed1cff89604 8ed370eb8ae56d017602bacf128dd6b8f6ae774e87f78bc57dae4edbc22e7773ccc738a9 bb1d5685a4c33f320fd2ba28ec6253b17a0acad3a5f2106076ad2b6badd3f4ae5c6548d1 bd47a24795ed1753d53c0d02c36831e95d8d717e0fbadb12ae3b57680e4035f36f111c43 f691ea7b38769d3560a28a291b05145140051451401e4771af5c6d2acf5caeb3235f7439 35ea937816094e7e5acfb8f01a40a59141fc6bc6c3d1c5e12afb5a6ee78f530f5d9e636d 6b28503b5586b49474aeb2e34492dc90b1138f415993c17699c40ff953c5e23178aa8a73 8aba3af098ca98683858e4b56d3e49a1c639accb5d2a488824575b2457aec47d9dff002a bb61a3dd5d48aad03007d457b94336c6d3a5ece11471d6756b4ae918fa7db6ec022ba3d3 fc3b3cb20755e0fb5759a6f81420579514679ea2bb0b0d362b38b68553f8579d5215f132 e6ad2b79174b0327f1999e1cd2cd9c43cc5e40ae868c628aea841423ca8f521151564145 14559414514500145145001484023046451450040f656eff007a306a23a5d9b758568a29 590b9509fd8f63ff003c16a58f4fb588e5215068a29859167a5145140c28a28a0028a28a 0028a28a0028a28a00ffd9 ڹCytEXtRaw profile type iptc iptc 47645 1c02410007646967694b616d1c02460005302e392e341c02ca80040000b9f0ffd8ffe000 104a46494600010102000000000000ffdb004300080606070605080707070909080a0c14 0d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20242e2720222c231c1c2837292c30313434 341f27393d38323c2e333432ffdb0043010909090c0b0c180d0d1832211c213232323232 323232323232323232323232323232323232323232323232323232323232323232323232 323232323232323232ffc00011080400042a03012200021101031101ffc4001f00000105 01010101010100000000000000000102030405060708090a0bffc400b510000201030302 0403050504040000017d01020300041105122131410613516107227114328191a1082342 b1c11552d1f02433627282090a161718191a25262728292a3435363738393a4344454647 48494a535455565758595a636465666768696a737475767778797a838485868788898a92 939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2 d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f01000301 01010101010101010000000000000102030405060708090a0bffc400b511000201020404 03040705040400010277000102031104052131061241510761711322328108144291a1b1 c109233352f0156272d10a162434e125f11718191a262728292a35363738393a43444546 4748494a535455565758595a636465666768696a737475767778797a8283848586878889 8a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9 cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002 110311003f00f7ea28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a 28a2800a4cd14526c028cd25266a5c843b3499a6e6909a9730b8fcd26ea616a696ac9d5b 0ae49ba9375465a9a5ab275ec17252f4d2f5117a697ac67890b8f2f4c2f4c2f4c2f5cb3a e21e5a985a985a985ab9275843cb530b530b530b5724ea0ac3cb530bd30b5465eb9a72b8 5890bd34bd445e9a5eb9a682c4a5e9a5ea22f4d2f584a216262f4d2f5097a42f584a02b1 297a37d405e937d64e98589f7d1beabefa4df4bd98ec58df46faafbe937d2f6632667a81 9e9acf50b3d6b4e9948733d42cf48cf50b3576d389698acd5186e69acd51eee6bb208b4c b6af532bd5257a915eba2226cbeb27bd4cb27bd67ac9522c95b4486cd2597dea7496b2d6 5a9925f7ade0c935526f7a9d26f7ac959bdea749abae1315cd649bdeac24def58e937bd4 e937bd75c2a8ae6b09bde944def59a26f7a789bdeba1550b9a025a7096b3c4b4f12d52a8 55cbc24a5f32a98929e24ab531dcb5bfde977d560f4e0f54a41727dd4b9a8835381aa4c0 933453452d318b45252e698051451400514525002e6933499a4cd3b00ecd1ba999a696a2 c224dd485ea22d4c2f55ca1727f3293cdaac64a6197de9f28ae5bf3bde8f3bdea89968f3 7de9f20b98bde77bd2f9bef547cda3cda390398bde6d1e6d53f368f37de9720b98b9e6d2 79def54ccb4c3353500e72f19fde93ed1ef59c67f7a61b8f7aa54c9f6869fda7de93ed3e f5926e7de99f69f7aaf642f686cfdabde8fb57bd637da7de8fb4fbd1ec43da1b3f6af7a3 ed3ef58ff69f7a3ed3ef47b10f686c7da7de97ed3ef58df69f7a70b8f7a3d907b4363ed1 ef4be7fbd648b8f7a789fdea7d994a66a79d4be6fbd6689bde9e25a5c83e62ff009bef4b e655312d384953c855cb61e9775560f4f0d4b947727dd466a30d4ecd4d863f34669b9a33 480751494b40052d252d0014514500145145001451450014514500145145001451450014 514500145145001451450014514500145145001451450014514500252529a69a89310134 d268269a4d6129085269a4d2134d26b194c5714b530b52134c2d5c752ad82e38b534b546 5a985ab8aa57b0ae485e985ea32f4c2f5c92c485c94bd30b5465e985ab17880242d4d2d5 196a696ac9d618f2d4c2d4c2d5196a8f6971d8797a617a616a8cb54f35c2c485e985ea32 f4c2f49a1d894bd34bd445e9a5ea5c456252f485ea12f485ea5c056252f49bea12f4d2f5 3ecc2c4dbe937d425e9a5e97b30b13efa4df5017a697a3d901333d44cf4c67a8d9eaa34c 63d9ea266a6b3d46cd5bc623b8acd4cddcd34b533756f143b9387a787aabbe977d6a8572 e0929c24aa7e652f995aa15cbc25f7a9565acd12fbd48b2fbd6a9926a2cdef532cdef596 b354ab37bd6aa62b9aab37bd4cb37bd64acd52acdef5a2aa4dcd659bdea559bdeb2966f7 a9566f7ada3541335165a9165f7acd596a5596b68d429334564a904954164a9964ada332 ae5d0f522bd5357a995ab65219683548a6ab2b54ca6b58b027069d9a8d4d3ab44c63a8a4 cd2d500b45252d3181a69a534d34d0084d349a09a6934c42934c2d484d319aa921033544 cf48ed55ddeb45125b1ed2546d2fbd42f2540f2d68a24365832d026aa0d2f3d6813569c8 4731a025f7a512d5012fbd384b4b905cc5f12fbd2896a88969c25f7a5c81cc5a697dea26 9aa0796ab3cd551810e65a69fdea16b8f7aa6f3fbd577b8f7ad634ccdd42f35c7bd446e7 9eb59af73ef501b9e7ad6ca919ba86cfda7de8fb57bd637dabde8fb4fbd57b117b4367ed 3ef47da7deb1fed3ef47da7de8f623f686cfda7dea45b9f7ac3173cf5a952e3de93a4355 0dc5b8f7a9567f7ac64b8f7a9d27f7ac9d3355335d66f7a9565aca49bdea7496b2703552 34d65a9564ace496a7492b270344cbeaf52ab55247a9d5ab2712d32d2b54a0d5646a981e 2b368b4499a5cd301a70a918ea5a68a70a402d2d20a5a401451450014514500145145001 45145001451450014514500145145001451450014514500145145001451450014519a334 0051499a334ae006986949a613594d898134c2682d4c2d5cb3992c526984d216a633571d 4a82066a8d9a866a899abcdad5442b3546cd4d66a8d9abcbad5988733d30bd46cd4c2d5e 7bacee04a5e9a5aa32d4d2d47b5652242d4c2d4c2d4d2d47b46521e5aa32d4d26984d691 932852d4c2f4d24d30e6b68b6314bd30bd34e698735aa43b0f2f4d2f4c20d348356a2161 e5e9a5e9a41a6906a94091c5e90bd30834d20d57b310f2f4d2f4c20d30e697b311217a69 7a8ce69a7347b340485e985e98734c39a39108717a616a69cd30e69d82e38b530b521cd3 0d5215c937d26fa889a6926ad05c9fcca4f32a024d34b1ad1315cb3e6fbd3d65aa3b8d3c 31aab85cd059aa459bdeb3c31a9158d27321b34566f7a9166f7ace563eb522b1f5a9752c 4b669a4def53a4def5948c7d6ac239ab85504cd4496a7497deb311cfad5847ae98542933 4924a9d24ace47ab08f5d50a85a66823d4e8d5411eac2495d3198ee5f46a9d0d51490558 490574c6432ead3aa049453fcd15ba6325a515179829c2415498c9296a3f3052890550c7 1a61a1a4151b482a908526a32691a4151b4a2ad215c71351b9e29a661513cc3156909b42 3b55591e9649455592515bc6266e481e4aacf2d2492d54924ade3132721ef373d6812d53 7739eb481cd6bc864e45f12fbd3c4b54039a787352e22e62f8969c25aa21ea40e6a5c45c c4f24b55249a895cd53958fad6908a3394c5927f7aab25c7bd472b1f5aa7296f5ae98451 84a64b25cfbd56373cf5aaf296f5aaa77e7ad744608c2536697da7de8fb4fbd66fcfeb47 cfeb57c91173b34fed3ef47da7deb37e7f5a5f9fd68e488f9d9a42e79eb53c773ef58e03 e7ad588f7fad4ca312e3366cc771ef56927f7ac68cb7ad5b8cb7ad6128a3a23235e39bde acc72d64c6c7d6adc6c6b9e514744646a24b56524acc8deacc72573ca28d948d347ab28d 59b1cb56a394561289aa66821ab00f154239855959d71584a2689a2c034e15009969c251 50d32ae4e29c2a1128a789054d985c9452d462414bbc52b0c7d14dde28dd480751499a33 400b4514500145145001451450014514500145145001451450014514500145145001494b 48693013346690d21359b9085cd2669a4d21359398ae2935196a0b5465ab9aa550b8a5a9 85a90b5465ab82a562452d4c66a42d51b3570d4ae2159aa266a19aa266ae29d4b8033546 cd433544cd5c93d476066a696a6b3534b573726a161c4d2134c2d499aa54c761c4d2134d cd21356a98c5269a68cd256b1a63b88698453e9315b4601723229a56a6c526dad5447721 db4d2b53eda42b56a22b9015a695ab1b293655a88ae57294c295676534a53b0ae562b4c2 b564ad34ad4b42b958ad30ad592b4c2b52c572b95a8cad5865a8d96a6e4dc808a8c8a9d8 546c2a6e2e6212298454ac2a334b985cc4669a69e69a6ad485cc30d34d38d34d6898ee36 9c29869c2adb15c956a45a88548b59b626c956a45a885482b27225b264a9d0d575a994d3 8c8572ca1a9d1aaaa9a955ab78d42932e2354eaf5495aa557ade354a522f2c9532c95415 ea41257542a9499a2b2d4eb37bd65acbef522cdef5d50aa5266b2cfef4f13fbd6509fde9 e27f7aea8d428d4135384def59826f7a789ab78c866909a9c26f7acd137bd3c4d5bc465d 69bdea269bdeaabcdef50bcdef5d11893265b69fdea169fdea9bcfef50b4fef5bc606529 975ae3dea17b8f7aa2d71ef50b5c7bd6f1a6632a85d79fdeabbcdef555a7f7a89a6f7ad5 5332754b0f2d57792a2696a267ad540c9d41ccfcd286a80b734a1aa9c4cfda164353c355 60d5206ace41ed0b01a9e1aab86a786ac64c5ce3e46aad254acd50bd0a44b915a4155a45 ab6e2a165ad15521b2848955cc7cd6832547e5f35a2ae66d153cba5f2aad88a9c22a4f10 528950454be555c115384552f125a8948435324556443ed4f11543c496a2448956116942 53c2d43af734487a54e86a11520352eadcd532cab54cb25530d8a709314b9ae5a91a0b2f bd4cb3fbd65897de9c27f7a7cb729543656e3dea65b9f7ac3171ef4f5b9f7a7ecae3554d d5b9f7a956e3deb0d6e7dea64b8f7a8748d15436967f7a9566f7ac759fdea759bdeb374c b5335566f7a904b598b37bd4cb2d66e068a4680929e1ea92c9532bd438949968353c1a81 5aa55359b45224a28a2a4614514500145145001451450014514500145145001451450014 51450014d34ea69a9900d34d2694d309ae59c89109a6934134c26b96732419aa32d43354 6cd5c356a85c19aa32d433546cd5e6d5ac214b546cd48cd51b3579b52bea00cd51b35233 546cd50aa5c68566a899a866a8d9aa96a5a405a9bba985a93755281561f9a3351eea335a aa64d87e69334ccd19ad634c43f345341a70ad15315c5a5c5029c055a80ae3714bb69e05 3b6d5a88ae43b68db536da4db4f942e43b693654fb68d94f9457202b4c295676534ad0d0 ae55294c2b564ad30ad66d0ae552b4c2b564ad30ad66c572ab2d44c2ad32d44cb59b64b6 556151b0ab0c2a16159b64391030a88d4cc2a26150e44b9119a61a90d30d5c641cc46698 69e6986b68b1f30d34e5a61a72d5b63b92ad482a21522d64d937255a916a21522d64e42b 92ad48a6a214f06a54857275352ab557069e1aad541dcb2ad5207aaa1a9fbead551f3164 494e12554f328f32ba6154b4cba25a709bdea879bef479def5d70aa6899a227f7a789fde b2fcff007a7acfef5d94ea168d513fbd3c4def596b37bd48b37bd77539146a09a9e26f7a cc59bdea459abba98cbaf3540f37bd4124def55649bdebb69a329b2cbcfef55de7f7aab2 4fef55a49fdebb29c0e49ccb6f71ef501b8e7ad5192e3dea0371cf5aec85338e750d233f bd219ab3bcff007a5f3bdeb4f6664ea978cbef4d3255512d28928e4337509f753835570f 4f0d4a5123da164353c35560d4f0d5cd31fb42c86a786aae1a9e1ab9a6c7ce4c5a986937 51583915cc308a615a9b146da8754772b14a6f97cd5ad94a23f6a875ca48ac22a788aac8 8a9e22aca588348c4aa22a788aad88bda9e22ac2589368c4a821a3caabc21a698ab358ad 4d394a7b28db564a54656b58d7b92d11519a534c26b58d5b92d8a5a90c95133544d25755 395c9722c1969a67f7aa6d2d42d3e3bd76d35725d4344dc7bd0b73cf5ac96b8f7a62dcfc dd6bb614ae89f6a742973ef5612e3deb9f8ee7deadc771ef532a46b1a86f24fef56127f7 ac48e7f7ab51cdef584a99d1199b493559496b1e39bdeadc72fbd61281bc646aa495651e b32392adc6f5cf289aa668235594354a36ab719ae6923544f45145665051451400514514 00514514005145140051451400514945002d14946695c05a61a5cd318d67396821a4d309 a56351b1ae1ab325884d464d0cd51b3579f56a92c19aa366a19aa266af3aad5b8819aa36 6a19aa266af2eac9b18acd513350cd5116af3a776c2c2b3546cd4134c26b5a69968466a8 d8d3cd30d765389688c9a4cd388a4c575c6255c4cd19a76da36d6f1892c6e4d2734fdb4b b6b58c4863453c50169c056964431c29e05340a78a2c896c7814fc5460d3b34684dc7628 c5377526ea340b8fda3d68da3d699ba937d01724da298545377d34bd26c00a8a8ca8a52f 4c2d594891196a32294b530b563210c615030a998d42c6b264b442c2a16153b542c2b164 34caec2a16156585444566c8b32022a322a72b4c2b57163b3203519ab0569852b58b1d99 5cd3969e52942568d8ec0b520a40b4f02b26c561cb520a8c53c564c562414e06a3069c0d 45988901a706a8c1a50696a04a1a9dbaa206973c50ae038bd34c94d26984d74d34cd10f3 21a6194d349a69aeda7166a87f9c69cb31aae69ca6bba9459a16d66352acc6a9a9a90357 a7460c398bab2d4ab2d510d522bd7a7460c39d162496aa4929a577aaced5e8d38d8c2a4c 6c931aa924c6a473559ebba9d91c15244524c6abf9c7352b8a836f35dd092b1c3524c956 5352094d42ab52aad372462db25590d481cd44a2a55152e4886d9206a786a628a78159ce 489bb240d4f0d51814f15c936526c9035481aa214f15c736526c941a78a8c538572cae68 992814e0b4c069e0d6124cd531e169e105301a786ae79291ac5920415208c5441aa40f5c d352378b44a231522c62a10f4f125734e32378c91388c62a374140938a633d6294ae68e4 ac46ea2a07152b3542c6ba61cc672640f50b9a9daa1615d509331915646355a47357245a ad22577d199949329bc86aac929abae955648ebd6a351193b94e499bdea259db7558922a 8445f357ab4aa46c64ef72c4539abb14c6a94698ab283144a7166b06cd08a6357629ab31 0e2acc6f58caccea848d68a5abb14b58d1c9576296b9e713a23336e292aec4f58b14b57a 296b92713a23236a26abd11158b14d57e29bdeb9271378c8d3c8f5a323d6aa79d479d587 2b34b96f23d68c8f5aa9e751e751cac2e5bc8f5a323d6aa79d479d472b0b9728a28a9185 145140051450680129294d254b620a4cd14950d80134c634e26a263585596821ac6a2634 e635131af2ab542588c6a266a563513357935ab12c466a899a866a899ab86556e08566a8 99a866a899ab193b9490335465a919aa32dcd64e176558933484d3334b9ada14c6148696 8aeb8402e3714629f8a5c574c6217198a36d49b6976d6a90ae47b6976d48169db6b54896 c8b6d2e2a4db498a6c963314b4b8a4a964b1734b9a666909a86c86c716a42d4c2d4c2d45 c090b5217a88b530bd2b8c98bd34bd425e9bbe93604c5e9a5aa22f485ab36c0796a696a6 6ea42d59b1d856351b1a526984d6720b0d6a89aa434d358b2794858546454e45308ac993 ca42569a56a72b4d2b5487ca572b4d29564ad34a55a63e52b14a36558294dd95770e522d b462a4db498a09711b4b9a0d252b12d0e06941a6034a0d2e526c480d381a8c1a50697285 8941a5cd460d2e6851d42c2934d268269a4d765281690134c34a4d34d7a14a99680d2834 d3466bd1a548a6480d3835459a3757a54a9194a4580f4e0f55b7d2efaf4e953319542667 a859a90bd465abad46c613a8231a85aa426a33569d8e59c8858545b79ab045376f354aad 8e690c0b5205a50b4f0b4fda99b002a4028029e051ed0960053c0a00a7014a5310a053c0 a4029c0573ca431453c5345385612650e14e14da506b268a4480d381a8b34ecd4b816992 834e0d50e6943543a45a91386a707aafba977d632a469199683d38495537d2efac2544da 332e7994d2f55bcca5df583a363453252d4c269bba8cd4f2587cc21a61152518a57b0f72 b3ad40e957596a164ada9d4b12e25074a81e3ad064a89a3aefa758cdc4cc78aa2f2b9ad2 68aa231735df4f1066e25554c54aa31526cc526315d31ad704ac2a9c548af8a8738a3762 b78cae52958b6b260d5b8a5ac91273566296b471d0b8ccdb8a5f7abd14bef58914b57629 6b9a703a613372296af4537bd61c52fbd5d8a6ae59c0ea848d7f3bde8f3bdea879def479 def59721a7317fcef7a3cef7aa1e77bd1e77bd1c81cc5ff3bde8f3bdea879def479def47 20731d5514515c2740514514005068a0d003690d29a69ace4c42521341a426b1932409a8 98d3c9a898d72d6968223635131a731a858d78b88a821acd50b35398d42cd5e1e22b1223 3544cd433544cd5c91ab729033544cd433544cd5d11772d2066a8f77348cd51eee6ba230 b9a244e0d381a841a901ae88d3132414e14c1520ade3021b0029c052814f0b5ba89171a1 69c169c05382d5a41718169c169e169e16ad215c84ad308ab0cb51b0a4c4c848a61a9185 46d593218c26984d2b1a8d8d66d92c0b530b5233544cd53701c5e985e98cd51b3d170242 f4ddf5097a4df49b1a27df46ea837d2eea96cb44bba8dd516ea3754329224269b9a4cd19 a891560a4a5a2b162e51b8a6eda931462b261ca45b68db52eda36d01ca43b693654fb68d 95571f295f6534ad5ad951b2d5260e2562b4c22a765a89855a21c488d30d3daa26ad1233 6801a70351834ecd5729362406941a8f34ecd2e50b12034b9a8c1a5cd0a3a8ac2e6909a4 cd266bbe8c0a485269b46692bd5a34ca40693345349af4e952096c2e69375349a696af4a 95238ea48937d26fa84bd34bd7a34a99c73a84fbe9375401e9c1ab59c2c73ba8499a29a0 d385724dd897213146da7814e0b5cd2ab664318169e169c169c16855496340a7814a0538 0ab5504c4029e05005380aae7244029c28c528a87218a29d48296a1b18b4514942570b8e cd19a6e69335a2805c93346ea8b346ead1520e624dd46fa88b534bd44a916a64fbe8f32a b97a4325652a25a9967cca707aa7e6548af584e8d8d2332d86a78355d5aa5535c352163a 22c9853c0a62d4ca2b86a3b1d111856a364ab2569a52b38d4b14e25368ea368eae94a698 eb78d6b10e25068aa268ab44c551bc5c56f0c46a43899ac98a85862af4898aab20c57a54 6b5cc64ac566350b362a490e2aa48f8af5e8cae63295871939ab114b598f27353452d77f 2e84467a9b514b576297deb16297deae452d63281d7099b714bef57629ab12296aec537b d61281d9091ade77bd1e77bd50f3a8f3ab2e436e62ff009def479def543cea3cea390398 bfe77bd1e77bd50f3a8f3a8e40e63d228a28af14ee0a28a2800a434b48686034d349a534 c26b9e72b12c09a6134134c26b9275096296e2a166a566a899ab8ab55d04359aa066a733 542cd5e36225701acd503353d9aa066af16bab8584635131a526984d614e234863546d4f 34c35dd4e25a226a601cd4869a0735dd4d1771ca2a5514c5152a8ae88a25b1ca2a4514d5 152a8ade28cd8e514f148a296b5440a2941a6d2668b8ae4a1a9c1ea0dd46fa3982e4acf5 133d319ea367a87215c733d44cf4d67a899eb36c42b3546cd4d66a8cb564d9361c4d4668 2690d4363b0c35191529a422a5c876202b49b2a6db4a12a79c691084a76ca982538251cc 5220094be5d58094e11d172d15bcba5f2eacf974be5d4b28ade5d2f9756bcba5f2ea1a0b 957cba5f2eacf974be5d4388157cba5f2fdaad79747974d40655f2e8f2eadf974be5d52a 6054f2ea368eaff975134756a903339a3a85a3ad168ea168eb58d225a339a3a85a3ad068 ea168eb58d321a2988e9447564474e11d69ec89b158454e1155a115384547b2158aa22a5 f2b8ab822a53171551a3a9362818e9856aeb4750b2d7a34688ae5622984d4cc2a06af5a8 d1173085a985a9acd4ddd5e9d3a564673a9a0e26984d04d3735d705638ea48434d34ea4a ea84ec70d462014f02900a7815156b188a054829a29e2bcdab5863853c53453c579d52be a3145380a414e02a5570b0a05380a00a7015aac40ac2014ec52814b8ad1570e51314b8a5 c52e29fb60b098a5c52e29714fda8586e29314fc536b5854134348a434ea4aeb84896869 a434ea4aea8bd091845348a79a691498d0c229a45498a691593652198e6a5414cc7352a0 ac2a3d0d224a82a7415120a9d2bccac754193254e950a54c95e655475c18f34869c69a6b 96c6b71a69a69c69a681086a393a53cd46fd2aa32d4965496a94b5765aa7257ad8791cd3 28ca2a94a2afca2a9ca2bdec3c8e49941c7352462871cd39057af196862b72cc66adc6d5 490d5846a9675419a11bd5b8e5acb47ab092d438dceb848d2f3bde8f3bdea8f9b479b53c 86bce5ef3bde8f3bdea8f9b479b47207397bcef7a3cef7aa3e6d1e6d1c81ce7b2d14515f 327ae1451450014869690d27b011b546c69ed5131ae2ab2258d6351b1a5635131af36ad4 21833542cd4acd50b3579d56a92233542cd4acd50b3579f5257290d66a859a9ccd50b357 9f515cb4809a613484d266a69c476034d34a69b5db4e221a6900e69c68039aec820b8e51 52a8a628a95456f144dc728a9545354548a2b68a131c05069e0714d6ad09630d309a7354 4c6b36c86296a697a633546cf50e426c7b3d46cf51b3d465ea1c8572467a899e9acf51b3 5436521ccf4cdd4c2d4cddcd4365589b34b5103520ac9b1d85a5c528a781594a41619b69 c12a40b4f0959f38ec46129c12a5094f0954a4322094e11d4e129e23aa4c0afe5d2f9756 4474e11d50cac23a5f2eacf974be5d5582e56f2e97cbab223a5f2ea944772b797479756b cba5f2eb48c00abe5d1e5d5bf2e8f2eb68d31957cba89a3ad0f2ea278eb65480ce78ea07 8eb45a3a85e3ad1520b19cd1d40d1d68bc7503c75a2a6162988e9e23a9d63a9163ad1521 389008a9e22ab2b1548b155aa44b4561152b45c55c58bda95e2f96b48d1d4868c9923aab 22d6a4b1d51956bd1a344c64ccf9055592aeca2a94b5ead1a26129159db9a66ea6c879a6 86aef54ac8e794c973466980d28352d58e794875140a5159b9d8e6930029e052014f02b9 2b56205029e2900a70af2ab5618e14f14d14e15e654afa943853c0a68a78150ab8ec2814 f02900a78156b1055800a5c5380a5c568b103e51b8a5c52e29715b46b0ac2628c52e2971 5ac6a858691498a7914d35d74aa12d0cc521a79a69aefa52336869a6d38d2577c1e866c6 e29314ec52628900d22908a7e2931593652198a91453715228ac2a32e24aa2a65a89454c a2bcfaa754192a54e950ad4cb5e755475c18f34c34f34c35c8d1adc69a69a71a69a86034 d46fd29e698fd2a14b5132ac95524ab7255592bd5c3c8e7994e415524157641556415eee 1e472cca2e39a14548e39a6e2bd884b439fa8e53522b5439a5dd5aad4da2cb2af522cb54 f7d1e6d6aa26d1917fcef7a3cef7aa1e6fbd1e6fbd5721a7397fcef7a3cef7aa1e6fbd1e 6fbd1c81ce5ff3bde8f3bdea879bef479bef4720739f41514515f1a7d08514519a00291a 9734d63c5296c044d5131a918d40c6bccaf2218c6350b1a7b9a81cd78b5ea10c6b3542cd 4e6350b1af2a7535250d66a859a9cc6a16358b95cd10d66a859a9cc6a1635935735485cd 19a8f34b9ab8441a1d45252d75c22430a5028c5380e6baa08cdb1ca2a5514c5152ad6c90 ae3d454aa2a35a954d6a82e3c0e298d5202315139aa7b09913540c6a57355ddab193218c 66a85de95daabbb561264314bd30bd30b5309359f3021c5e985e9a734c20d2b9aa14b520 6e69a41a45539a4d9a244ea6a55a8514d4e8a6b1931d8956a5514d44353a2573c9b1d815 6a555a72254aa958dddc2c30253d52a454a9552b55711184a788ea554a9152b557110f97 4ef2eac04a5095ac53115c474a23ab0129c12b68c58cafe5d2f97560252ecada3002bf97 4be5d58da29765744298cade5d2f975676d2edae9853195bcba89e3abdb6a274ae854868 cf78ea078eb45d2a074ab54ca4673c7503c75a2e9503c756a996914d63a9563a9963a915 2b48d313446b1d48b154aaa2a5502b68d221a2358bda8922f97a5595db448576d6f0a467 231e78fad674ebd6b62e08e6b2ee08e6bd0a3491c95199530eb59d3d694e7ad65dc57a74 69a386a48a12b734d0d49375a62e6bb6504a2724a64e0d3c1a856a45ae0ab6466e4482a4 02a35a94579b56a58cdb140a7814829c057975ab090a05385005380af26b562d0a29c280 b4e0a6bcaab59dca4851520148169e16b35599690a053c0a40b5205ab5559690014b8a70 5a5db5a46a48ab0dc518a7eda36d74c2a4856198a5c53b6d1b4d75426c2c308a6915215a 42b5df464c89223229a6a4229a457ab45b3192233494f229b5e9d3d8c98da314ea4c5390 86e28c53b1462b19318dc53d452629ea2b09b2e248a2a65151ad4ab5c350e98122d4cb51 2d4ab5c3511d50638d30d38d349ae49236b8d34c34e26984d73c8621a8dfa5389a631e2b 1bea05792ab3d597aaef5e9e1e46132ab8aad20ab6e2abbad7b78799cb329b8a888ab2eb 5032d7b34a6ac73f52226985a9ec0d42c0d7641a1a6297a6196a36cd42c4d764122d48b1 e751e7554c9a326b6e543e62df9d479d553268c9a39507316fcea3ceaa993464d1ca8398 fa6e9294d257c11f561452514ae20cd231e28cd358f15127a01139a81cd4ce6a0735e4e2 244b22735039a95cd40e6bc2c44c8644c6a1635239a85cd79329ea4a236350b1a7b9a85c d34cd10c635031a7b1a85cd5a46a85069c0d440d480d6b08832414e02982a415d30466c7 014e028029e0574c519b0029e29314b5a210f069e0d459a5cd5262b936ee2a276a4ddc54 6ed4db15c6bb55776a7bb540ed58c988639a81cd3ddaa07358c85613345341a70ac98d21 3146da7814f0b49b2d221d94ab1f35384a7ac7cd4dcb44691d4e91d3d23a9d23a2d7286a 4753a474e48ea748e9fb2b80d58ea454a9563a9025358719104a9152a5094f095ac70e22 3095205a784a785ada38715866da5db52eda5db5a2a01622db4bb6a5db46dad5510b0cdb 46da936d2edada3442c47b6976d49b68db5b4690ec47b69714fdb4bb6b78d30198a8d96a 7c53196b6501a2ab2d42c957196a364aa512914992a168eaf32546d1d528968a5b2976e2 ac14c530ad6b0892d91f4a5dd8a435196ae88c0c9b26df4c924f96a12f51492715d30a66 529114f275ace9deac4d255095ebae11b1c95195676eb59b3f7abd2b55096bb20ec70d46 5094734d029f20e6900ad6a54f74e490a054829a053c57935ea90d8f14f14c14f15e357a c436482a402a35a994579556b0e23945481691454cab5e6d5a86d14204a784a7aa54a12b ce9cf5365023094f095204a784ad69ab95ca46129e12a4094f095db4e95c76230b4bb6a5 0b4edb5d90c38ec43b68db536da36d74468058876d1b2a7d946cae88d1158ae569a56ac9 5a8cad76d2a644915cad308a9cad46457a14a36319221229b8a948a8c8af421b18343714 629d8a314a4161b8a314b8a3158498584c53d453714f5ae79b2e287ad4ab51ad48b5c933 a224ab522d44b520ae49a3a22c7134c269c4d464d72c91adc426a326949a613584a21710 9a8d8d29351b1ac1c750e618d50b54ac6a36aeba4ec652640c2a165ab2c2a365af42955b 18c915196a175ab8cb50bad7a34b1064e25265a81d6aebad40eb5e8d2ae2b14d96a075ab 8eb55dd6bd2a554441b68db4fdb46daeaf680336d1b69fb68db47b4019b68db4fdb46da3 da01f4a1a0d1495f14cfac0a4a292a1b105358d2d358f1594de8042e6a0735339a81cd78 f89912c85cd40e6a67355dcd7cfe2664b22735039a95cd40e6bc873f78488dcd40e6a473 5039ade0ee5a2373503b53dcd40e6baa08d10e53532d564353a1ae98c4193ad4aa2a24a9 96b78a3364aa2a4c714d4152e38ade28863314da7914c34c962668dd484d30b52b92d8e2 d51bb5216a899a9362b88cd50b352b3544cd59b6521ac6a1634e635131ac99490aa6a55a 850d4e959b1d891454aab4d4153a2d66d8ec22a54ab1d3d12a748ea2fa8c624753247522 c7532475d34d5c63163a9d23a7ac7532c75db4e95c63163a90254ca94f095d91c381084a 704a982538256ab0e322094f0b5204a705ad561c08f6d1b6a6db46dab5402c45b6976d49 b6976d5aa21622db46da976d1b6a9510b11eda36d49b68db56a905866da314fdb4b8ab50 191e29a56a6c5215abe402b95a614ab2569a529f28caa529863ab8529a63a7ca3283a557 75c568ca98aa72ad6d089326527e2abbb558978aa72b575c20612646ef55e4969257c554 925aea853309482492aa48f4e792ab3bd6aa363966c8a4354e4ab0ed559cd52763926caa e39a4029ee39a402b2ad53439640053c52014e15e2e22a99b1453c534538578588ac4364 a953a0a812ac20af2a758b81320a9d16a34156516b8e750eb821c8b532a508b561538ae5 73bb3aa3022094e095284a704af470eae3e523094e0b5284a705af6b0f4ae4d88c2d2eda 942d2edaf5a1434158876d2eca976d2edad9500b10eda5d9536da3656aa8858aecb5132d 5b65a8996b78532248aacb5130ab2cb50b0aea846c73c915d854647353b0a888e6ba23b1 8c90dc52629d8a315121586e28c53b1498ae7931d84c5380a4c538573c994878a78a60a9 057348da23c53c54629e2b9e68da2c56351b1a7b1a898d73c91771ac6a3634e635131ac6 5115c4635193431a8c9ac5c45cc389a61a5cd1427615c6114d2b52e2936d52ab615884ad 40eb574af150bad6d4b11a89c4a2eb55dd6aebad5775af5e8573368a4eb503ad5c75aaee b5ebd0aa43456c518a931462bb7da12478a3152628c51ed008f1462a4c518a3da01f461a 4a534d35f2ecfac034d341a426b26c414c634a4d318d633968222735039a95cd40e6bc5c 4c8922735039a91cd40e6be7b12c444e6a07352b9a81cd791af305885cd40e6a57a81ebb 2994885cd577353bd40f5e8532d30435610d57415612baa20d9612aca5564ab295bc4865 84153638a852a6ed5aa2191b544d523544c693218c635131a731a858d432188cd513352b 1a8c9a8624359aa263521a61150d9aa216351b54e569852a1b344323cd5a8c5471a55a8d 2a1943e35ab51ad3234ab51a5438b621d1a55948e9234ab28950a9bb88458ea654a555a9 556bd0a34d802a54ea948a2a5515ead1a631ca94f09428a7d7a5082b0c684a50b4ea5ad5 410c4db4bb69696b45143136d1b69d45572a18ddb46da751472a01b8a36d3a8a7ca806ed a36d3a8a2c804c518a5a28b2013149b69d451601bb68d94ea28b00cd946ca7d14580a932 75acf985694fdeb3673d6b7a68ce4674fdeb3a66abf39eb59939eb5db4d1cf26539dfad5 0924e6accedd6b3e46f98d76c23a1cf260cf50b350cd51b1a9968734d8d6350b53d8d46d 5cf2958e59b2261cd00529a0571d7a9a1ccd80a70a4a515e0e26a19b14538520a515e0e2 66c864b1d5a8c5558eadc75e5ca4cd699663156a35aad1d5b8eb193677532cc6b561538a 823ab2bd2b249dcee82d050b4a129453c0af6b0a81a1a169c169c053c0afa5c2c510d0c0 b4bb6a40b4bb6bdd8457291623db4bb6a4db4bb6b45141622db4bb6a5db4bb6a9243e52b bad40eb571d6abbad52b1128951d6a171569c540e2ad3473c9155c54447353b8a848e6af 991cf243714629692b294856128a33499ae7930169453334a0d6126522514e15106a706a c64689930a7035086a706ac648d131ec6a2634acd5133564e255c4635131a566a8d8d64e 22b8d6351e79a56351e79aca5026e480d385440d286ae7941949930a500543be9dbeb9e5 09169936062a17514799513bd4d38cb986ec46ea2ab38a99daa076af5e85d19b2bb8aaee 2ac39a81ebdaa1368c9a21c518a7628c576fb423946e28c53b14628f681ca3714629d8a3 147b40e53e8634d34e34c35e2c99f56c6934d2694d309ae69c89604d46c69c4d46c6b96a 4f42489cd40e6a5735039af2311219139aaee6a5735039af131016227350b1a91cd42c6b ccb7bc16226a85aa56350b575534042d50b54ed50b576d30b8882ac254095612baa2c4d9 3a5584aae95612b7889b2c254bdaa24a94f4add12c89aa16352bd5773499246e6a1634f7 35039a8621acd4dcd359b9a406b362487518a514a0564cb4336d1b2a50b4f0959366888e 34ab51a52469565129c752858d2ad4694d44ab31a574469dc43a34ab2a9c52469561538a e885001aab522ad382d3c2d76d3a36188a2a55148053c0aeea70b0c728a752014ec57645 68014b4515690c052d1455a0168a28a630a28a2800a28a2800a28a2800a28a2800a28a28 00a28a2800a28a2802b5c77acb9cf5ad3b8ef595707ad6f4cce666ce7ad65dc1eb5a5707 ad655c1eb5df4d1cb3667dc375ace76f98d5cb86eb59aedf31aee8ad0e69b14b5309a42d 4d26b9ea3b1cd3604d30d2934d35e7d49d8e59b1a6814502bcdad50e76c514e148294578 f5e643169c290528af16bb2592c756a3aad1d5a8eb819ad32d4756a3aab1d5b8ea1a3ba9 96a3ab2bd2ab475656a54753ba1b120a7814d152015ed61514c5029e050a2a4515f45852 6c205a76da785a76daf6e1b0ac47b6976d49b6976d5dc7ca47b6976d49b6976d3b8f94ae eb55dd6aebad5675a398ce5129b8aaee2adb8aaee28e639e48a8e2a061cd597155d87347 39cd2446690d38d30d66e643434d21341a69359391204d2835193466b36c13250d4bbaa2 dd4bbaa4a4c9835286a87751ba97296a44acd5196a696a616a8712b9852d5193416a8c9a cdc42e04d309a09a613593805c7668dd5196a42d59ba63b92efa4df5097a697acdd11f31 63cca8d9ea232530bd28d1b31f30f66a899a90b5309aeca71b008c6a16a909a61aeca72b 0586628c52d15bfb40e5131462968a3da072898a314b451ed0394fa08d30d3cd466b82a3 3e918d34c269c6a326b8aa48862135131a71351b1ae1a932489cd40e6a57355dcd7995a4 52237355dcd4ae6a0735e556292227350b1a7b9a898d705b51d86b1a89a9ed51b5744112 c8daa26a95aa36aea810d8895612a04a9d2baa2c9b93a54e950254e95d110b9612a43f76 a25a90f4ae888885eabb9a9dcd577349810b9aaee6a57355dcd43111b3734aa6a266e69e 86b39058996a55151a54e82b0914872ad48a94a8b53a266b0932d088956112844ab2895a d1d46089565129112aca257a9469dc62a255854e29112ac04e2bd2a540644169e169fb69 76d75468d82c340a7014b8a5c56d18586029680296b54804c52d14629d80294518a298c2 8a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a00ab73deb26 e0f5ad5b9ef591727ad7452329997707ad64dc1eb5a7727ad645c9eb5e852472cd99b70d d6b35dbe63576e5bad663b7cc6bbe2b43926c7eea4cd337519ae1aece69b1f9a4a6e696b c8af3b1cb3614a2929457915aa1ced8a29c290528af2eacc42d38520a515e65562258ead 4755a3ab51d729b532d4756a3aab1d5a8e8b1db4cb51d594e955a3ab494e31d4ed812ad4 aa2a35a95457af864683d454aa29aa2a6515efe182c2aad3b6d39569e16bd98ec3b11eda 76da7eda705a771a891eda5db526da50b45cae52bc8b555d6afc8b55245a972339c4a520 aab20abb20aab20a97239a68a720aaec39ab520aacc2a1cce592223519a91aa36a973326 88c9a8c9a7b544c6a5c8cd884d2669a4d26695c8b92668dd516ea3755a1dc97752eea877 51baa944ae6252d4c2d4c2d4d2d43895cc3cb5309a696a696acdc4698a4d349a4269a4d4 3815702d5196a18d44cd47b30b8e2f4c2f4c67a899ea95115c94c949beab99280f4fd8d8 6a44fba9375441a94354f2d8d50fcd252034e152e5635486e28c53b14628f685728dc518 a7628c51ed03946e28c53b14628f681ca7bfb546d523544d59d53dd631aa36a7b546d5e7 d564318d5139a7b544e6bceab22485cd40e6a6735039af3eab2910b9aaee6a6735039af3 ea96885cd464d39cd464d71db5298d26a3269e4d466b6899b1a6a334f34c35bc5993156a 653502d4ca6ba20c8b93a9a9d4d56535329ae9830b9655aa42dc55756a796e2ba62c771a e6abbd4ae6a0634363217aace2acbd42c2a58caac39a91168239a9516a18ec488b56516a 345ab28b5938dc761e8b56516988b56635ac9d2b8c722d5845a6a2d4e8b5d14690c7a0ab 082a3515320af5e84064a82a71d2a241528e95ead25a142d1452d6e0145145318b451453 00a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a4a5a4a0028a28 a0028a28a00a9747ad63dc9eb5af75deb12e8f5ae9a465332ae5bad635cbf5ad3ba6eb58 b74fd6bd2a48e5999d73275acb793e73566ea4eb594d27ce6bd08af74e49a2e0929c1aaa 2c9522bd79b884734d16435381a855aa5535e1e20e69a1e29d48b4eaf16aee73b414a28a 2bcfa88561c2941a6d2e6b82a4456268cd5a8cd548cd5a8cd73f29ad32e466ad466a9c66 ad46683b69972335650d548cd5943c5545ea7640b0a6a65355d4d4aa6bd6c31a5cb2ad53 2b55556a955abdfc30ee5a56a786aacad4f0d5ebc5683e6270f4e0d55f752eeaab0f98b1 ba9775401a97752b14a43e46aab21a91daabbb5672444a44321aad254ee6a07ac25239e4 559055671cd5b7155d8560e66124576150b0ab0c2a26142998ca2576151354ec2a16aae6 3171216a6d39a9b548cec2514515a2616128a292b54c760c518a514f0b44a452891eca3c ba9c254823ac65335502a795ed4861e3a55f117b538c3c564ea1a2a664b43ed513435acd 0fb544d0fb535541d3321a0a89a0f6ad7683daa1683daad5625d3325a1f6a4f2b15a4d0f b544d162afdb5c4a052d98a318ab0c98a8986295ee6b188cce28df8a6b1c542cf8a5ecee 6d12c79b479b557cca3cca5ec0b2d79b479b557cca3cca3d8016bcda3cdaabe651e651ec 00fa35aa26a95aa26ae7aa7b2c89aa36a91aa26af32ab2191b1a89cd48d50b9af36ac882 1735039a99cd57735c35196885cd40e6a67355dcd715434442e6a3269ee6a326b9ada94c 6934c34e26986ad18c869a61a79a61ad533190ab5229a885480d6d0645c994d4aa6a0069 e0d74c185cb0ad4f2dc5400d3b7715d11617158d44c69c4d30d55cb446d51b0a94d308a4 688808e6a68d69b8e6a78d682ac4b1ad598d6a38d6ad46b56a370b1246b56635a646b56a 35aa54842aad4cab42ad4aab5d34e90c1454ca29aa2a4515e853858a43d454a3a531453c 74aefa6b418b4514568014514b40c28a28a6014514500145145001451450014514500145 1450014514500145145001494b49400514514005145250053bb3d6b0aedbad6dde1eb581 787ad74d133998d76dd6b06edfad6c5e375ac0bc7eb5ea51472cd19377275e6b25a4fde1 e6ae5e49d6b1da4fde1af460bdd39a68d047a9d1ab3e392ad46f5e6e251cd245e46a9d0d 538daad466bc1c49cf24595a752274a7578957730684a28a2b8a6886828cd2519ae39c49 689a3356a3354e3356a335cee26b02e466ad466aa466ad466b3676532e466aca9e2aa466 aca9e2a53d4eb81329a914d420d3c1af5f0c55cb0ad522b55606a40d5f438626e590d4ed d55c352eeaf6a0b4173163752eea80352eeaab0f989c352eea83752eea561f312b3542c6 866a8d8d6353406c631a85aa526a26ae0a922190b0a858558615130ae29cf525a2b30a85 8559615038aa8ccc6512b30a85855871503d6f16652440d4da7b532b6465612929692ad3 1584a4341a435698587ad4c8b5147cd5a8d6a2723584472a54cb1d2c6956a38eb96733a6 102358aa4f278e956a38aa7f27e5e95cb2a874469994d0fb544d0fb56b343ed51341ed53 ed41d3325a0f6a89a0f6ad6683daa2683da8f6c43a664341ed55a48b1dab6de0e0f154a6 8b19ad29d6bb2790c79131552418ad3993159f30c57a149dc394a521aa923d5898e2b3e6 7eb5e8d2a771d87799ef4799ef557cca3ccae9f6005af33de8f33deaaf99479947b002d7 99ef4799ef557cca3cca3d801f51b542d533542d5f3d58f69913544d52b542d5e4d6666c 8daa173523542f5e5d56490b9aaee6a77aaef5c7265a217355dcd4cf503d7348d510b9a8 c9a73530d63629ec21a61a534d341848434d34a69a4d55ce790a29e0d460d381ad20ccee 480d3c1a881a706ae9831dc98353b75421a977574c585c909a6d26ea3357734881a4c52d 14ee6d11b8e6a78d6a3039ab118ab89a589e35ab51ad4318ab718ae98444c9a35ab51ad4 518ab718aea853258a16a40b4e029c057546982102d3c0a00a7015d1189485029e2900a7 0ae98a189462968aa1851451400514514005145140051451400514514005145140051451 40051451400514514005252d250014519a4cd0014519a4cd0051bdef5cf5e9eb5bf7a7ad 7397cdd6baa899c8c1bd6eb5cf5ebf5adbbe6eb5ce5f3f5af568a39e462dec9d6b18c9fb d35a17afd6b10bfef4d7a705ee9cf246a45255c89eb2a17abf0b579989473c91a51355d8 8d6742d57e135f3f89473c917a3e94ea6c478a7135e2545a9834252504d2135c92899b41 499a42d4d2d5cd28321a268cd5b8cd528daad46d5cf28334822ec66ad466a946e2ad46e2 b09419d702ec66aca9e2a9c6e2ac2b8c565cb2b9d51d89c1a783500714e0f5ec6162c1b2 70d4e0d5007a707afa2c2a666e4580d4bbaa00f4bbebdb82f748e627dd4edd55f7d287aa b0f98b1ba977557df4bbe9d87cc4c5a9a4d47be8dd5cb58a52149a69a334579559948691 51b0a97148cbc5799527a9562a38a81c55b75aaeeb570999ca2557155deadba9aaeeb5d7 0918ca2556a654cc8699b0d74a68c9c48cd21a79434850d5a92172919a434f28690a1aa5 21587c557625aa90a1ad0852b2a9236a712c44957628ea1852afc295c152676d38924515 59f27e5e94f85055b0a36f4ae29cd9db086867343ed51341ed5a6ca3d2a2641e958ba8c1 c0cc683daa2683dab4d90546c83d2a1d5666e065bc3c1e2b3ae22c66b7dd060f159774a3 9ad68556e466e073f7098cd655c0c66b72e97ad62dd0eb5f418577337131ee0e3359570f 8cd6a5d77ac5ba279afa2c2c1332645e651e6556c9a326bd2f64892cf99479955b268c9a 3d9202cf99479955b268c9a3d9203eb66a89aa56a89abe22b1ed3216a89aa56a89abc8ac 43216a85ea66a85ebcaabb9040f55dea77aaef5c92348903d40f53bd577ac246a881ea33 523d446b165310d30d38d30d2309084d349a526984d073485cd2e6999a335a4599926697 75459a5dd5bc5812eea706a8375286ae88c82e580d4a0d421a9e0d5f31ac4945385301a7 8a7cc6f11c0735623150a8e6acc62b483d4d0b118ab718aaf18ab518aefa622cc62adc62 ab462adc62bd0a4844a05380a314ec57528858053852014a2b548628a7520a5ad5141451 45300a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28 a2800a434b4d340099a4cd069a4d002e6909a6934d2680295f375ae6ef9bad7417cdd6b9 abe6eb5d940891817cdd6b9bbe6eb5bf7cdd6b9abe6eb5eb504612306f9bad6217fde9ad 5be6eb5885bf7a6bd582f74c248d285aafc2d5950b56842d5e6626273491ab0b74abf09a cc85ba568427a57818989cf234a23c5389a8a23c5389af1670d4c18a4d30b5216a8cb564 e91361e5a985a985aa32f50e80b94b51bd598deb391eac23d43c3dca8c4d28e4ab292566 24956524a87843689a6925585978acc492a759692c1ea6ca45f1253c495444952092bd1a 185b12e45d1253c3d52125481ebd8a146c66e45b0f4edf5583d2efaf4e31d08e62cefa37 d57df4bbe9341cc58df4bbeabefa37d4b1f31683d286aacaf52ab571576691913034e151 a9a916bc8aece888e0282bc5380a795e2bc9ab2d4dd22a3ad42c957196a264a23325c4a2 c950b4757992a268eba6350c9c0cf68e9863abcd1d33cbadd5533702998e93cbab9e5d21 8ead552790a463a431d5df2e93cbaa5545c84114757a24a6471d5c8d2a2752e6b0892c49 57625a8235ab91ad734e573b208b310ab43eed4118ab1dab9a48eb8ec46d51b0a95aa361 58b40c858546c2a66151b0ac999b2bb8e0d65dd0eb5aee383595743ad5d0f88ce461dd0e b58b743ad6e5d0eb58b743ad7d1e1198c8c3ba1d6b16e875adcba1d6b16e875afa5c2331 919d8a314ec518af52e40dc518a7628c51701b8a314ec518a2e07d68d51354ad51357c2d 63da642d51354ad50b5793588644d503d4ed503d7935772081eabb5587aaef5cb22e240f 55dea77a81eb091b22bb5466a47a88d62ca7b0d34c34e34c2691cf21a6984d38d309a473 c84cd19a6e69335516643f349ba999a4dd5b4588937501aa2dd406e6b64c2e5a56a954d5 656a994d5f31ac4b0b522d42b53ad3e63789228ab518aae82ad462b5a6f5362cc62adc62 ab462adc62bd4a20598c55b8c5568c55b8c57a945089314b8a5c52d76288094b452d5243 0a5a4a5aa430a28a29805145140051451400514514005145140051451400514514005145 14005145140051451400530d3e986801a4d309a526984d30109a6134134c268028df375a e6af9bad7437cdd6b99be6eb5d940891cfdf375ae6af9bad7417cdd6b99be6eb5ecd0463 2302f9bad61eff00df1ad5be6eb589bbf7c6bd6a6bdd309234e16e95a30b74ac881ba569 40dd2bcec444e79a35a16e95a309e95950374ad280f4af0311139a66a4478a56351c478a 5635e44a1ef1888cd513352b1a859aa9520b0acd51b35359aa266ab540ae52747ab08f54 15ea657ad161c7ca6824953a4959cb254cb2568b0a234924a9d65acd592a6596b58e0c39 8d1592a4592b3d64a9964ae88616c43917d64a955ea8ac952abd75428d8cdc8baaf4edf5 595e977d6fcba11cc58df4bbeabefa37d65243e62cefa37d57df46fac641cc5c57a991aa 8a3d5946ae0aecde9c8b886a64aac86acc75e2d7676d32751526de29a82a7dbc5791565a 9d905a15d96a364ab456a32959a98dc4a8c951b255c294c295a2a866e05231d37cbab863 a4f2eb455487029f9749e5d5cf2e93cbaa5549e429f9749e5d5df2e93cbab5545c8578e3 ab51a52a4753a253f6972e311634ab51ad3112a745a5cd73a228963153f6a8d054bda934 74448daa33529a61158c90990914c22a522a322b0912c85c706b2ae875ad771c1acbba1d 6aa87c46724615d0eb58b743ad6e5d0eb58b743ad7d0e159848c3ba1d6b12e875adcba1d 6b16e875afa5c2b30919d8a314ec518af4ee663714629d8a3145c06e28c53b14628b81f5 8b544d52b544d5f1558f6d90b542d533544d5e456443206a85ea76150b8af2aaad482b3d 40f565eabb8ae4922d159eabbd597155dc5612354577a89aa6715130ac596f62234c34f6 a8da91cf3186984d39aa3634ac73484269a4d04d309a69190a4d34b52134d26b54214b50 adcd309a14f35aa02d23558435550d598ea8d62594ab0955e3ab2829dcde24e82ad462ab c62ad462b5a4f5364598c55b8c5568c55b8c57af406598c55b8c5558eadc75ecd0192e28 c52d15db600c518a28a0028a290d002d149499a007514da2801d45373499a007d19a6669 37503b12668cd47ba937501625cd19a8b752eea02c49453334b408751494a2800a28a280 0a28a2800a8daa4a8da80236a8d8d48d51b5302326a326a46151914c0ccbf3d6b99be3d6 ba6bf1d6b98bfef5d940867337edd6b99be6eb5d2dff007ae66ffbd7b540c99cd5f375ac 3ddfbe35b57fdeb0c9fdf1af5e9fc263234606e95a50374ac980f4ad281ba570e22273cd 1af0374ad281ba563c0dd2b4a07e95e1e220734d1b109f96866a8227e2867af2dd2f78c6 da8acd50b350cf5033d6d1a45242b3542cd433d42cf5d30a468912abd4aaf54d5ea557ae 88524268baaf52ac95495ea557ae9852464d17564a9964aa2af52abd74c6944c997d64a9 d64aa08f53a3d3f668cddcbcaf53a3d5147a9d1a972a219755e9dbeabab53b75449104fb e8df50eea37573ca204dbe8df516ea375734a205b8deadc6d59d1b55a8debcfaf1674526 69466adc64715991c956a392bc5af067a1499a91e2ac803159b1cb5604dc75af1ab41dce f84958b240f5a6902a0f3a93cdf7ac39596e4898a8a69515179bef49e652b325b43ca0a4 d8299e65279945d92da24d829360a8fcca4f36a94992e489760a4d82a232d279bef54a4c 97245954152aa8aa4b2d4cb2d68a638c917540a9540aa6b254cb256b191b4648b8b5276a aaaf52efe2b55236521c69869a5ea32f594989c871a61a697a617ae79325c857e86b2aeb bd5f77e0d65dd3f5a747e23394919575deb12ebbd6b5d3f5ac6ba6eb5f43853193322ebb d625d77ad8ba6eb58b74dd6be8f0a61229514dcd19af4ec663a8a6e68cd1601d45373466 8b01f59b542d533544d5f1d58f7190b544d533544d5e5d6466c858542e2a76a85c579756 24959c540e2acb8aaee2b8e68a4567155dc55a7155dc5724cd5159c542c2ac38a818573d f529ec42d51354ad5135339e444c6a263523542c6a9239a4349a6934134c26ad233149a6 93484d349ab480526853cd309a10f35a2405c8cd5a8ea9c756e3a0d625b8ead462aac756 e3141b44b318ab518aaf18ab518ad293d4d51623156a3aaf18ab31d7b1406598ead4755a 3ab31d7b34064d45145770c28a28a00290d2d21a004a28a42681866933484d266900b9a4 cd349a42681d87669375309a42d40ec3f7526ea8cb5216a076250d4e0d5006a786a02c4c 0d381a881a783412d1253853053c74a6485145140051451400530d3e98680233519a94d4 669811114c22a522984500655f8eb5cbdff7aeaafc75ae5eff00bd76d0219cb5ff007ae6 2ffbd7517fdeb96bfef5ed503367317fdeb089fdf1adcbfef5824fef8d7b14be131917a1 3d2b4216acc84d5f85ab9ab46e61235616ad085eb2616e95a10bd7975a9dce79235a27e2 867aaf1bf1433d707b1d4c6c3d9ea167a6b3d42cf5ac691490e67a899e9acf5133d6d1a6 689132bd48af5515ea457ade34c4d1715ea557aa6af522bd6d1819345c57a991ea92bd4a 8f5ba899b45f47a9d1ea8a3d4e8f49a3268be8d53a355147ab08d50d19b45d56a76eaaea d4fdd59c911626dd4bbaa1dd4bbab19445626dd4bbaa1dd4bbab09400b28d5611ea92b54 aaf5c35e06b034124ab092566ac9532c95e457a675c246a24b5309b8acb596a5137bd793 5a96a75c2a1a1e77bd2f9bef5404def4a25ae59532fda17bcca3ccaa625f7a7092b19403 9cb7e6534c955fcca6992b2684e65832534c9558c9ef4c32d4b32750b465f7a6996aa196 9865a96cc9d434125f7a9d25aca496aca4b4e322a150d3492ac24959892559492b58c8e9 84cd147a977f15491ea6dfc56aa6744644a5ea32f5197a8d9ea1c81c890bd30bd44cf519 7ac9b33732477e0d665cbf5ab6efc1accb97eb5743e221ccceba7eb58d74dd6b4ae5fad6 3dcb75afa3c210d99972dd6b1ae9bad6a5cb75ac7b96eb5f4b844432ae68cd479a335ea5 85624cd19a8f34668b058933466a3cd19a2c163eba6a89aa56a8dabe2ea9ed3226a89aa5 6a8dabcdaa88642d5138a9d8542e2bceab120aee2abb8ab2e2a0715c151168ace2abb8ab 2e2a0715c350b456715038ab2e2abbd72df529ec577a81ea77a81ead1cf2206a85cd4ae6 a0735aa473c86134d26909a6935a24662934d26909a6935690c526843cd309a543f355a4 345d88d5c8aa8c46aec5da933445d8fb55c885538bb55d885433445a8c55a4150442aca0 aba4f53444e82aca54082aca0af670e52274ab2955d2aca57b540a25a28a2bb861451450 014869690d0021a6134e34c340c43484d04d309a450a4d349a4269a4d21a42934c2d484d 30b50558716a696a616a696a4558983548ad5555aa556a04d1641a914d40a6a553544344 cb4f1d2a35a9074a643168a28a041451450014c34fa69a008cd30d4869a6802322984548 45348a00c9bf1d6b97d43bd755a80eb5cb6a1debb70e4b395bfef5cb5ff7aeab50ef5cae a1debdac3993396bfef582c7f7c6b7b50ef5cfb1fdf1af6696c66cb711abd13567446aec 4d5138dcc248d289aaf44d5971355d89eb8ea5339e48d48df8a19eabc6fc50cf5cbec753 2b0f67a899e98cf5133d5aa45243d9ea267a6b3d44cf5a2a65a44caf522bd5457a915eb4 54c1a2e2bd48af5515ea457ad140cda2e2bd4a8f5495ea547ab513368be8f5611ea823d5 947a968c9a2f2355846aa28d5611ab368cda2f2353f755646a903566d19344e1a9435421 a943566e22b1386a50d5086a706acdc409835481eab06a707ae4ad02a25b5929e24aa424 a779b5e5d6a66b1917c4bef4f137bd670969c26f7af2ead235550d21353c4b59cb37bd48 b2d714e996aa1a024a7892a82cb522c95cb3814a65e12531a4a8049c535a4ae592073256 92a332542d2544d27bd6123094c9da5a8ccbef559a5f7a89a5f7ac24ce7954342396ad47 2d64472d5b8e5a4a4553a86b47255a8e4aca8e4ab91c95a291d94e669c6f5637f159f1bd 58dff2d68a476425a12b3d46cf51b3d46cf4390391233d46cf51b3d44cf52d9939923bf0 6b32e5fad5a77e0d675c3f5adb0ff111ce67dcbf5ac8b96eb5a370fd6b22e1bad7d26110 ee675cb75ac7b96eb5a772dd6b22e1bad7d46111456cd19a6668cd7ab618fcd19a6668cd 1601f9a334ccd19a2c07d826a36a90d30d7c45447b0c888a61152914c22b86a448642c2a 2615608a898570d4a622ab8a81c55b71503ad79d560345375a81d6adbad40eb5e6d58949 951d6abbad5c75a81d6b85ee36ca4eb503a55d75a81d2b44cc645174aaee957dd2a074ad 1331922914a614ab6c95194ad532394aa569a56ac15a8d96b543e52022841f353d85220f 9ab4486916a2157a2154e2157a2149c4b48b710abd10aa710abd10a9702d22dc42aca541 18e2a61574a1a9a244e8d53a3d540d4f0f5eb5045a897965a9d26f7acd1253c4def5ec50 355034bcff007a4fb47bd6719fdea3371ef5db72953353ed3ef49f6af7ac9373ef4c375e f4b987ec8d8fb5fbd21bbf7ac4377ef4c377ef47314a91b66f3de986f3deb0daf3dea337 9ef4b98a544dd37bef4c37bef582d7bef51b5efbd2e62d50378defbd30defbd6035efbd3 0defbd2e62d503a037bef4c37bef5806f7de986f7de8e61fb037cdefbd30defbd609bdf7 a69bdf7a5cc57b13a24bcf7a9d2efdeb998ef3dead4775ef4d4899523a34b9f7a9d2e3de b023b9f7ab51dc7bd526632a66ea4fef5309b8eb58f1cfef56565e3ad55cc5c0d0f369de 6552592a40f4ee4389683d2e6a00d5229a04d12521a050699234d34d3cd34d00308a6914 f22908a00cad4075ae57505eb5d65f8eb5cc5faf5aeca04b391d417ad72da8275aebefd7 ad7317e9d6bd9a0ccd9c76a09d6b9f78ff007a6ba9bf4eb580f1fef4d7af4a5a19b191a5 5a8c53112a741572663244d1d5b8cd554a9d0d632461245d46e2866a855b8a0b567ca656 1ccd5193416a61354a23421a8da9e4d30d348a420a9053053855240c941a78350834f06a ac43270d522b73558353d5b9a7625a2f23d5847aa08f53a3d4b466d1a08f56124ace47ab 092566d19389a29254824aa2b253c4959b899b8974494e12552125384952e22e52e8929c 24aa424a7092a5c45ca5cf328f32aaf9947995cd5201ca5bf328f32aaf994bbeb82a521d 8b3be9c1eaaefa50f5e7d4a2558baaf52abd5257a955eb82a5228baaf52abd5257a955eb cfa94c772e87a6b35421e82d5c1388390ac6a2634a4d34d72ce261218d5130a98d348ae4 9a39e4848d6ae442abc6b56e35acd174d162315722155e3156e315a23ba9a2cc42ace3e5 a8231563f86ad1db05a113544d52b542d556148631a898d3d8d42c6ab94ca431cf06b3ae 0f5abae78354273d6ba70f0f788332e3bd655c77ad49fbd664fdebe930913448c9b81d6b 2ae17ad6bce3ad664ebd6be9f088d1233f6d1b6a5db46daf54bb116da36d4bb68db40588 b6d1b6a5db46da02c7d7a69869e69a6be1e48f558c2298454845348ae79444464546c2a7 2298c2b9a74f424a8e2a075ab6e2a0715e65780151d6a075ab6eb50bad7915e21729bad4 2cb56d96a165af325b8365465a8592ae32d44c94d32594992a164abac95132534c868a2c 9513255d74a85d2b58b17294996a265ab6eb503ad74c4394acc29a83e6a91c53107cd5d1 143b16e2157a21d2a9c42af442af94691722157621552215762147214916e31c53e88c71 435694e1a9a4506ea4df51b3546cf5e8d246f1893f9949e77bd54692a269bdebd2a474c6 05d69fdea16b8f7aa4f3fbd577b8f7ae9b9b2a66835cfbd42d75ef59af73ef55deebde97 31a2a46a35dfbd44d77ef590f77ef5035dfbd4f31a2a46cb5e7bd44d79ef588d79ef5135 e7bd27235544db6bcf7a89af7deb0daf7dea16bdf7a9e635540dd6bdf7a61bdf7ae7daf7 de99f6df7a5cc69ec0e84defbd21bdf7ae7bedbef4d37bef47307b03a137bef4d37bef5c ff00db3de90defbd1cc2f6274d15e7bd5e8aefdeb9282f3deb460bbe9cd529194e91d545 739ef57a2b8f7ae620b9e9cd694171d39ab4ce69d33a28a7f7aba92f1d6b0609fa735a11 4bc55a6734a06aa4953abd66c725598dea9330944d046a994d5246ab519aa463245a5e94 a69a9d29d546434d2114ea4c500371498a7628c50065df0eb5ccdf2f5aea6f875ae6ef97 ad7551259ca5f2f5ae66f93ad7597cbd6b9bbe4eb5eb51643391bf4eb583247fbc35d3df 47d6b0658ff786bd5a52d0cd95952a4514fd94b8adae65240b52a9a8e9734ec63244c1a9 77543ba8dd4729958933499a6669734f9405a4a28a2c014b9a4a29a421d9a5dd4ccd2669 d809775395aa0dd406e69d8562eabd4caf5455ea657a4d12d17964a9d64acf57a9964a86 8cdc4d05929e24aa2b253c4950e24b8974494e125521253c4953ca4f2970494f12552125 384953ca2e52e7994be65541252892b29c05ca5cf32977d5412538495cd3a6162d6fa72b d540f4e57ae59d10b1795ea557aa4af52abd79b5a9099755ea557aa4af52abd7935a992d 9755e9dbaab2bd3c357995224364d9a2a3069e2b86a44962d18a5029e0571d444342c6b5 6a35a8a35ab318ac51a4113c62ad462a08c55a8c5523b69a2c462a73f76a28c54c7eed5a 3ae0b4217a81ea77aaef5ac509a21735039a95cd57735ac626522376e2a84e7ad5b90d51 98d7661e1a99a284fdeb367ef5a33567cd5f438589ac519b38eb59b3ad6a4c3ad67ccb5f 478546d1451db46da976d1b6bd32ec45b68db52eda36d01622db46da976d1b680b1f59d2 529a2be29a3d11b8a4c53a8a8710198a630a969ac38ace50d0456615030ab4c2a165af27 11024a8e2a175ab6cb5032d789888b115196a265ab4cb5195af26517724aacb5132d5b29 5194a8b3195192a264ab852985296a3b141d2abba568ba55674ad6171d8cf75aaeeb57de 3aace86bb2098ac517151a8f9aacbc66a2543babae082c598855e8855389715762ad9447 62ec42af442a8c4c055d8a402ad40762f4638a63d2a4abb6a29265ad610348a646ed55dd e8926155249c57653475c2239e5aaef37bd4324e2aa4971ef5d94cec840b124fef5524b8 f7aad2dc7bd54967f7ad9b3a634cb525cfbd5592ebdea9cb39f5aa72ce7d6a1c8de34cbb 25dfbd567bbf7acf9263eb551e66cf5a972378d234def3dea07bcf7acc799bd6abbccdeb 52e46f1a48d47bdf7a85ef7deb29e56f5aaef2b7ad4b91b4692359af7de986f7deb15a56 cf5a6f9adeb53cc6dec91b9f6df7a4fb6fbd61f9adeb479adeb47312e9236fedbef49f6c f7ac5f31bd693cc6f5a7cc4ba48e92def3a735a96f77d39ae46da56e39ad6b694f1cd526 613a475b6f739c735ab6f71d39ae52da63c735ad6d3f4e6b54ce2a94cea6de7f7ad3865e 057356f3f4e6b560b81815a2671ce06ec5255c89eb162b81c55f8a715699c9381af1355d 88d64c530abf0cc2b44ce59c4d28fa53ea08a518a93cc15673b43e93149bc51b8502b0b8 a31466968033af475ae72f57ad74d7a3ad73d7abd6ba69313397bd5eb5ce5ea75aeaaf53 ad73d7b11e6bd2a4ccd9c9dea75ac2963f9cd7517b09e6b0e680ef35e9d2910cce294d22 adb444542c86baa2ccda2b9a6935232d42d5b44c5a02d4a1aa166e680d5af299b44e1a9d 9a841a7834ac4b2506945301a78a5624534d34e34c345804269a4d069a69d8a14b5206a6 1cd346734ec3b1655ea557aa809a9149a4d09a2dabd4ab25530c69e18d4b44b45d5929e2 4aa618d3c39a9b11ca5c125384954c3d3839a5ca2e52e0929c24aa81e9c1ea7945ca5c12 5384954c3d3c3d4b893ca5b0f4e0f5503d383d43a62b16c3d395eaa07a7ab5672a4ac4b4 5d57a995ea92b54aad5e557a46722eabd4caf5495aa556af1311032932eabd4aad54d5aa 7435e3d58995cb4a6a55355d2a74af3ea44a44ab52a8a622d5845ae0a88a48746b565054 68b56105616368449505598c54295610d33aa089d054c47cb51230a91986daa475476217 aacf53c8e2aac8e2ba2099322173559cd4b2482aac920ae984199488e46aa529a9e49055 491c1aeea14ddc84b52acd5426abb21cd539066bdec344da28a128aa32ad694884d53962 26bdfc31bc51476d1b6ac79268f24d7a172ec57db46dab1e49a3c9345c2c57db46dab1e4 9a3c9345c2c7d4e6929692be2cee0a4a5a29084a69e94ea435325a010b0a89854ec2a361 5e7d685c92bb2d44cb56596a365af2eb51b8ac5564a88a55b64a8ca579d2c3ea2b154a53 0a55a294c2958ba0054294c2956ca530a566e80ca2e955de3ad164a81e3aa852199af1d5 778eb4de3a85e2ae9853032de2a87cae6b4de2a84c5cd754603b15d571532f14bb714878 ad544d1449d5f1532cd8ef5477e293cec77ad144d6303505c6075a864b9f7acf37381d6a bc973ef5ac626d0a45c92e7deaa4973ef54e4b9f7aa925cfbd6f1475c299724b9f7aa925 c7bd5392e3deaa4971ef5bc59d90a65c92e3deaac93fbd547b8f7a81e7f7ab6ce88c0b12 4def55a496a079bdea0796a5b368c492492ab3bd35e4f7a819ea5b368c4733d42cd48cf5 133549aa40cd50b1a733544c6a59b446353682693348d05a2928a620a28a2826c5880f4a d381f18aca88d5e89ea9194d1b3049d2b4e09ba7358314957a29b1dead3396703a382e31 8e6b4a1b9e9cd73115c63bd5e86e7deb44ce59d33a886e7deafc373ef5cc4373ef5a10dc fbd5a6724e99d3c373ef57e1b8f7ae661b9e9cd684371ef5a2672ce99d2c571c75a9d67f 7ac286e3deada4fef5699cb2a66b2cd52ac9598937bd5849334ee64e05f57a954e6a9a3e 6aca1aa3368af763ad61ddaf5adeb919cd63dcae735bd3666ce72ee3eb587770f5e2ba7b 98f39ac7b987af15dd4e44b393bb8339e2b1a7b6f98f15d6dcdbe73c5644f6dc9e2bbe9d 421a39c920f6aa92458add9a0ebc5674d16335d94e666d1912262aa48315a53263359d30 c576d3664d14dcf342b532538348ad5d2b63368b00d48a6aba9a954d221a2653520a894d 48b52c8638d34d38d34d021a69869e69a699486114dc54869b8a63145385345385201e29 c0d301a506908941a706a881a50d4ac2b1306a706a8435286a561589c353835401a9c1a9 5856270d4f0d558353c352b1362c06a706aae1a9e1aa6c2b1386a7ab5570d4f56a992d09 68b6ad532b55456a995abcbaf132922dab54cad5515aa756af16bc4c648b4ad5623354d1 aad466bc7ad033b1723ab518aab155c88579956268a24f1ad5a8d2a2896ae4495e65546a a00a952a8c53b652e2b9d23551156a5535152e6ad44d51615e9cd27cb55b7d35e4e2b48c 75345216492aa492d24b2553965aeea54ee0d8e925aa724def4c965aa72cdef5e852a172 5924937bd42d266aac9373d690499af46961ec2489d8e6a2619a50d9a7819af4a942c6f1 45668f351b419ed57c479a78833dabd1a52b1b45195f66f6a3ecded5aff66f6a3ecded5d 3ed0d2c647d9bda8fb37b56bfd9bda8fb37b51ed02c647d9bda8fb37b56bfd9bda8fb37b 51ed02c7bdd252d15f2e750945145200a434b4526844645308a948a691584e1711115a61 5a9cad34ad72ce8dc562b95a614ab2569a52b965870b150a530a55b294c29584b0e05429 4c2956ca530a573ca808a6c95134757992a268ea5521941a3a89a2f6ad068ea368ab554c 68cd68aa178bdab4da2f6a8648b8ad540a48ca75c5577e2afccb8acf9b8ad144e984481d f1559e6c77a599f159f34d8ad140ea853277b8c77aab25cfbd5396e31dea9c973ef5a289 d70a45e92e7deaa4973ef54a4b9f7aab25cfbd52474c299764b9f7aa925c7bd5392e7dea ac971ef568ea8532f35c7bd44d3fbd679b8f7a699fde8b9b28175a6f7a89a5aa866f7a69 9695cb512c3495197a80c94d2f4ae68a24a5e985aa3df4d2d48b48796a6134d2d484d229 01349484d14142d19a4cd2d218b9a2929680b12467156637aa8a6a556c5344491a092559 8e6c5652c98a9566f7aa4cc65036a3b8c77ab515cf3d6b016e3dea78ae79eb54998ca99d 44373d39ad186e7deb9682e7deb460b9f7ab4ce69d33a886e7a735a10dc7bd7310dcf4e6 b461b8f7ad148e69d33a786e3deaec53fbd7390dc7bd68c33f4e6ad339674cde8a6f7ab9 14958b0cdef5a10c9d2ad33927035e27ab911acc85eb4213d2b4472cd0b38eb5993af5ad 59aa84cb5b459898b3c7d6b3278739e2b7a68f35426873daba61224e727b7ce78accb8b6 ebc574f35be7b5675cdb7078ae985425a393b88319e2b26e22ebc575175075e2b12ea2eb c57a14a64347397098cd64dc0c66b76e9319ac4ba18cd7a34999b4644e7e6a6ab525c1f9 a98ad5dcb63268b4a6a5535594d4ea683368b0a6a55a814d4cb5266c90d21a28348434d3 69c69298c691498a76293140c4a29692801734b9a6d266801fba9775479a375160b12eea 76ea87752eea2c2b1306a50d50eea5dd4ac2b1386a706aae1a9c1a958562c86a706aae1a 9c1a958562c06a7ab5570d4f56a892d0968b88d532355346a9d1abcdaf132922e2b54cad 5511aa746af22bc4c648b68dcd5c88d67a37357a135e45681096a68c557a215461ed5a30 8af26b44da312dc4b57a24aad0ad68c295e4d6474460214a69156592a1615cd145b8909a 6134f6a85cd6f1892297a8a4938a633d41249c56f08ea2e6192c954a5969d2c9542696bd 4a14ee34c4965aa52cdef4934b54269abd9a142e521f24df375a923933596f37cdd6acc1 26715e9c685917146ac67356a319aa301ce2b4a019c55f258de289a38f356e3833da8823 ce2b4a0833da9f358da28a5f66f6a3ecded5aff66f6a3ecded47b434b191f66f6a3ecded 5aff0066f6a3ecded47b40b191f66f6a3ecded5aff0066f6a3ecded47b40b1e9d4514578 a6c1451450014628a280131498a71a4a56013149b69d454f2a10d2b4c2b529e94c353282 0232b4c2b529a61ae69c10888ad34a54a6986b9674d0ac44529850548e715033e2b2f663 48428298507ad31e4c542d363bd3e42d4498a2fad4132aedea2a16b8c77aad35d7cbd69f 29a460437000cf35937040cf353dc5cf5e6b26e2e3af356a27553895ee64c679ac9b99b1 9ab171375e6b26e25ebcd6aa276d3b15ee2e08354a4b83497127354ddeaf90ec8344925c 1aab25c1a6bbd5776a9e53a62d04939aad24e695cd56734ac7445a1de79a3ce350d2d4d8 d5344be69a3cc35152d052b126fa4de6994b48a1dbcd26ea4a2818b9a33494520b8b9a29 28a0771d40a4a5a0685a28a291485ce28dd4868a018ede68f34d3292990d1279c6a48ee0 eeaad4e4fbd4c968d782e0d68c17078ac584d5f85ea93309451bb05c1ad182e3a735810c 95a10cb5699cd281d0c171d39ad3827e9cd7350cdd39ad3b79fa735699cb52074d6f374e 6b52de5e9cd7336f3f4e6b52dee3a735aa670d481d35bc838e6b4edd871cd7356f71d39a d4b7b9e9cd6a99c35206c4841ef556400f7a89ae33dea369b3deb54ce671124406aac910 35333e6a3639ad5489712949003546e6dc6dad7233556e53295ac65a92d1ca5e43d6b9eb c8baf15d75e45d6b9fbc8bad7a346466d1c8de275e2b9ebc53cf15d7de43d78ae7ef20eb c57ab466434723759dfd29899ad2bab7f9ba54020c76af46335633688d335325288b14f0 b8aae632687a1a9d4d4238a786c5064d13e6933516fa5dd4ac4d8929299ba8cd0161d452 668cd00069b4a690d031a4d26694d2531899a334628c5300cd19a31462900b9346e34628 c5021c1a9c1a9a05380a0438353c35300a70a910f0d522b73510a7af5a996c265846a9d1 aab2d4ea6b82b44ca45a46a9d1aaa29a9d5abcbab032922da3722b4203d2b291b9157e07 e95e5d7a6425a9b3076ad3831c562c0fd2b4e093a578d5e9b3a208da800e2b4a0038e6b1 6097a569412fbd78f5e9b3a6162fc80555931eb44937bd54926f7ae685265485908f5aab 230f5a6493fbd54927f7aea850661244b249ef5525938eb50c93fbd54927f7aeba787773 1698e9a5f7acf9a5a7c92e6aa48f9af5f0f46c5c515e690d509a4356e4e6aa48b9af730f 048da28a2f21de2af5b3938aaad16585685ac5d2bd3b2e5358a34adb2715b36cb9c5675a c5d2b6ad63e95cb3b1bc517eda3ce2b66da1ce2a8dac7d2b6ad63e95c75246d143bc8147 902aeeca36561cc5d8a5e40a3c81577651b28e60b14bc8147902aeeca3651cc163aba28a 2b88b0a28a2800a28a2800a4a5a280128a28a420a69a7534d26030d30d3cd34d63243b0c 34c34f34c358ca2162190d5391f156a638cd674cf8cd65c85c62472498aa724def44d2e2 b3e69b19e69729bc604b25c63bd529aeb8eb55a6b8f7acf9ae7af34b94de34c9a7b9ebcd 664f71d79a8e6b9ebcd67cd71ef5a4626aa361679baf35993cbd69d34def59f34b5b4626 89d88a6939aaacf492c9cd5767ad390d6331ecf503350cf513354389d11988c6a1634e66 a8d8d4389d3198da5a6d2d4346ca63a8a4a5a868d5485a28a2a4d530a28a4cd03b8b4526 68a41716969b4b40263a81494b48b428a5a4a5a45a034514500c4a434a68a626252a75a4 a55eb412cb719ab91b550435611aa8ca48d38a4ab71cb5949255849714ee64e26cc5374e 6b4609fa735cf4737239abf04fd39ab4cc2703a5827e9cd69c171ef5ccc13f4e6b460b8e 9cd6899c552075105c74e6b4a0b9e9cd72d05c74e6b4a0b9e9cd6a99c55299d18b8cf7a5 1367bd6425c67bd5849b3deb44ce4940d10f9a7039aaa8f9ab08735aa6612892019a8e78 fe4ab08334e9a3fddd6b16632473577175ac1bb8baf15d55d45d6b12ee2eb5dd4a466ce4 aee1ebc560ddc1d78aebeee1ebc561ddc1d78af4a94c868e42eadfe6e9554c18ed5bd736 fcf4aa4f063b577c2a19b46598b14d2b8abcf1e2abba62b78c8868ac4629a5b14f7e2abb b62b7899b4481e9dbaab07a706abb1162c6ea5dd5086a706a561589b34b9a881a76690ac 3b34525140828a29681898a314ec518a043714b8a5c52e2801b8a314ec52e2810d029c05 0053a9080538520a75210a29eb4d14e1d693064ab52a9a856a4535c95119b275352ab557 535229ae2a9021a2d23722aec2f59aadcd5c89eb82b5225235e17e95a10c958d13d5e864 e95e457a26b136e196b42196b0e296af452f4e6bc8af44da2cd2966f7aa72cdef51cb37b d52966f7aca9d029b25967f7aa52cfef514b3fbd52967f7aefa78621a2696e3deaa3cfcf 5aaf2cfef550cff375aefa7852394bcd2e6a267cd5612e69c1f35db4e858d2311cdcd44c b9a90734e0b9aeca71b1ac6255f2b2c2b46d62e9512c5c8ad3b68ba715d0e5a1b28972da 2e95b36b1f4aa56d174ad8b68fa5725491a245eb68fa56cdac7d2a8db47d2b62da3e95c5 5246a912797479756b651b2b1b9655f2e8f2ead6ca3651702af97479756b651b28b81b14 5145738c28a28a0028a28a0028a28a0029314b45002534d3e9869301869a69e6986a5a1d 861a69a71a69a8712ac54b838cd64dc3e335a974719ac5ba7eb50e06d08942e24c66b2ae 26c679ab3752e3358b753633cd4389d70811dc5c75e6b2e6bae4f34dbab8ebcd644d75f3 1e6a394ea8d3d0b72dcfbd5296e3deaac973ef55649fdeb58c49946c4d2cdef54a596992 4def552497deba2313293b0b249cd445ea179299beb5e4d0853d494bd34b545be937564e 2744663c9a613484d266b2713a6130a5a6d3ab368e88cc5a5a4a5acda3a23216969296b3 67445852514549570a4a28a0570a51499a281a638528a414b48b43a969a29d5268828a28 a0a0a4a5a4a090a075a28a6224538a995aab034e0d412d17164a9565aa024a70969dc5ca 69a4dcf5abb0cfef582b373d6ae433fbd34cce703a286e3a735a10dc7bd7370cfef57e1b 8f7ad1338e703a586e3deb421b9f7ae661b8f7abf0dcfbd6899c73a674f15c67bd5e866c d7396f719c735a96f36715aa671ce06f42f9c55e84e6b22ddf38ad5b739c56899c7389a3 0ae6a795331d32dd738abaf1fee856b16724d1cfdd45d6b1aea2eb5d2dcc5d6b22e61eb5 d94e464ce5eea1ebc5635d41d78aeaae61ebc5645cc1d78aeda7325a393b9b7e7a567cb0 63b574b716fd78acb9e0c678aeda750868c0962c55295715b33c58cd664eb8cd76d3910d 1972f154a56c55e9f8cd664ed8aeea6434207a786aaaaf522b56d621a2d06a786aacad52 ab52b12d13834f06a15352034896892969829c29123852814829c29085c518a502971484 3714b8a5c52e2810dc518a7628c5002014b8a5a5c52100a50280294502169452528a4c07 8a783518a703594a2492834f0d50834e06b0940968b0adcd5a89eb3c37356637ae5ab4b4 158d389eaec52564c6f56e392bcbad44b46bc52d5d8a5f7ac68e5ab51cb5e4d6a25265f9 66ebcd51966f7a49a6f7aa134def4a8d02ae3a59fdea8cb3fbd3269fdeb3e69fdebd5a38 62ac4b2cfef557cff9bad569a7ebcd5559fe7eb5e9d3c2e835136525cd5847cd65452e6a f44f9aa742c6b1897d39ab08b9aaf17357a25ce2b271b1aa88f8e2c91c569db45d2a0862 ce2b52da2e9c563391a2896ada2e95b16d1f4aa96f174ad6b68fa5724e45a45cb68fa56c 5b47d2a95b47d2b5eda3e95c9391690ff2e8f2eaceca36563cc32b7974797567651b28e6 02b7974797567651b28e6026a28a2a06145145001494b486800a3349499a007669334d26 909a0761fbaa367c5213c54123e290d21ed2e2a269f1deabc92d55927c77a5734512eb5c e3bd44d778ef59b25cfbd5592ef1de95cd140bd75779cf35897573d79a6dcddf5e6b22e6 e7af348da30b0dbab8ce79ac4ba9b39e6a7b8b8ce79ac9b89b39e6a6c7445d8a77526735 912bfcc6ae5cc99cd6648ff31a390dd54b21ae6abbd48c6a26ada14cc275485c55775ab4 c2a265ae9853392754a6c94dd9565929bb2b7f65a1ceab6a57d946ca9f651b2b2952378d 62beda36d4fb6936d632a47446b90eda5c549b693158ca91d30ae3314b4b8a2b19533ae1 584a5cd25266b0940eb8551d9a4a4a2a394d55416928a2934529052d2528a92d0b4b4945 22d31f9a506999a5cd4d8b4c7e68cd37346682ae3b3494514861452d14009452d25300a2 8a4a0428eb566235545588cd089917e26abb13d66c6d56e37ab473cd1a9149576296b263 92ad472d5a6734a06f5b4bd2b62da6e9cd7336f2f4ad7b69ba735a2671d4a674f6d374e6 b62da7e9cd72d6d374e6b5ade7e9cd6a99c35299d55b4fd39ad133e631cd7376f3f4e6b4 3cfca0e6b58b38674c9679739acc9db39a9e497355246cd74c2462e0519c66b3678b39ad 69066aac91e6baa1333713067b7ce78acab8b6ebc57512c19078acdb8b7ebc57553999b4 727716dd78ac9b8b6ebc575b716dd78ac9b8b6ebc577d3a8434725716dd78acab8b6ebc5 75b716dd78acab8b6ebc57a14ea92d1ce0b6f6a78831dab4fecded49e47b574fb521a280 8bda9e23ab7e56293cba7ce43440169e053cae293147312d00a506929334ee4d8901a706 a87346ea09689c3d2efaafbe977d16158b1be8df506ea375161589f752eea83752eea2c2 b136ea5dd50eea5dd4ac2b136ea5dd50eea375160b13eea5dd506ea5dd4ac2b13eea5df5 06ea37d4b4162c6fa5df55f7d2efa9711729643f353a495403d4a92565523a0729a492d5 9497deb2965a9d25af3aad3b8f94d749bdeac24fef58c937bd4eb3fbd79d5680729a52cd 9ef54a593351b4d9ef503499a54a8d8a511b2b66a94a33561db350b8cd7a54a363448a12 a66a048be7e957dd334d8e2f9ebd084ac8d121f0435a7043d38a8ede1e9c56a5bc3d38ac 6a4cd121d041d38ad3820e9c525bc1d38ad5b783a715c35266890905bf4e2b52de0e9c51 05bf4e2b4a183dab8a73344875bc5d38ad4b78fa5430c5d2b4618eb967228b56eb8c56a5 b8c62a8c2bd2b4211d2b9e6c68b5451456430a28a2800a28a2800a28a2800a28a2800a43 4b4868010d309a71a613486213484d2134c2682ac2b1e2aa4cf8cd4ecdc1aa170f8cd22e 2882697154269f1de9d712e33595713f5e6a5b3a231249ae71dea84d778ef55ae2e719e6 b2ee2ef19e6a1b3a2302ecf77ef59b3dce7bd5396ef3dea94b739ef4d16e16279ee3af35 9b3cd9cf34d96e33dea8cb37bd6a910dd86cf275aa0edf31a92592aa33f35b46066ea589 09a69a6e696ba614ce5a9544229a56a4c52edaeb85338aa5520294852aceca694adfd968 737b6d4ae529a52ac94a695a8748d2358ae569a56ac15a695ac9d2368d72b95a6915395a 611584e91d34eb90914d352114c35cb3a67753ac30d26694d3335cb381dd4ea8ea29296b 1713aa1505a29296b268e98485a28a2b366e828cd1454d8a4c5a334dcd2e6958ab8ecd2d 301a70348a4c752d369c291685a28a5a46884a4a5a0d026252529a4a64b13bd4c86a1a91 4d32196d1aac23d5256a955e9dc868d0492ac24b59ab254cb2d3b90e06d5bcbd2b56de6e 9cd73904bd2b5209ba552673d4a67496f374e6b56de7e9cd73304dd39ad4827e9cd6a99c 35299d3dbcfd39ad159f2a39ae6e09fa735a31cf9039ad62ce0a94cd332e6985b355965c d4aad9ade3239a501c5734d3166a655cd4cb166ba23339a512835be41e2b3ee2dbaf15d2 0b7ca9e2a95c5bf5e2ba2133068e52e2dbaf1595716dd78aeaee2dbaf1597716dd78aeca 750968e4ee2dbaf1595716dd78aeb6e2dbaf1597716dd78aeda754868e61adbdaa2682b7 24b6f6aab241ed5d31aa4b463b438a89a3c56a491555923c56d1992d14196a222ad48b55 d8735aa912d119a6934e351935a264d809a696a426a32d56856242f46fa80bd01eaec4d8 b1be977557df4e0d4ec2b13eea5dd506ea50d4585627dd4bbaa0dd4bba8b0ac4fba8dd50 eea5dd4ac1626dd4bbaa0dd4bbe8b0589b751bea1df46fa560b13efa37d57df46fa5ca1c a58df522c954f7d3849512887297965a9565ace12d3c4b5cd3a771f29a4b37bd4ab3fbd6 509bde9e27f7ae69d0b8729a9e767bd1e666b3d66cf7a9564cd66a8d8a512d6ecd263351 ab66a6519ad146c5a4376669f145f3548a99ab3045f355735916913dbc3d38ad6b787a71 505b43d38ad7b687a715cb5265a44b6f074e2b5ade0e9c5476d074e2b62da0e9c570d499 a242dbdbf1d2afc507b54d6f6fc74ab8907b571ca65d88a28bdaae451e29c9163b55848e b17218e896ae462a145c559415936325a28a2a4028a28a0028a28a0028a4a33400b45266 8cd002d21a33485a801ad51934ace2a269052292149a8c9a6b4c2a269d691690f76e0d66 5cbe33569ee1706b26eee07349b35844a3752e3358d753e33cd5abb9c73cd61ddcfd79ac d9d708905d5ce33cd635d5de33cd497731e79ac2bb99b9e6a19d908a277bbcf7aacf739e f59ed2b7ad46d237ad6904151245c7b8f7aacf367bd57666f5a8d89f5aeb844e1a8ec3de 4a877734d6cd34039aeb840e2a9509c1a78a8541a994575c299c352a12014f0b48a2a651 5db0a670d4a8204a42953a8a422ba3d9e8727b4772b94a614ab245308a974ca55595cad3 0ad5822984566e91a2aacaecb5130ab2c2a1615cf5299d34ab3206151354ec2a1615c552 99e8d2aa42d4ccf35230a8b1cd714e07a14aa8ea5a6e296b9a503be9d41d4a292945734a 277d398b4514562d1d8a4ac14945254d87cc19a3349494583987034e14c14e152d15163c 53853453854b378b1c29d4d14ecd41b210d2529a4a64b10d34d29a4a643129e0d3294532 494353c3d402941a45245a1253c4b553269771a5729451a904bd2b4a09ba560c2c6b4217 3c73549995481d041374e6b4e09fa735cec321f5ad1865e9cd6a99c352074704fd39ad18 67e9cd7370cdd39ad2827e9cd6899c35299d0c52e6aec47358b6f374ad4b794715b46471 5481a910cd5e8a2cd51b790715ab6eebc56b191c55224c96f953c5549edfaf15b11326de 955e7da7b56d199cad1cddc5b75e2b2ee2dbaf15d34eabcf159b3a2f3c57542a10d1cc4f 6dd78acb9edbaf15d4cf1039e2b367801cf15d30a84d8e5e5b6c76aa32c1ed5d24d6fed5 9d35bfb57542a12d1cf4b1551963adf9ad8d674d6cd5d50a8268c3956a9b8e6b5e6b66e6 a8496af9ae98cc9b145aa163571ad9ea17b67ade3244d8a8c6a266ab2f6cf503dbbd6f19 2158819e80f435bbe68103d6a9a15850f4e0d4df25e97c96a7742b0f0d4a1a9a226a511b 53d0561fba9775336352ec6a3415876ea5dd4cd8d4bb0d1a0ac3f751ba99b4d1b4d0161f be937d3769a4da68d02c3b7d26fa6ed6a4d8d4590ec3f7d1e6547b1a936352b21f292f9b 4be6d43e5bd2794feb52e283949fcea5f3fdeab794feb4793254ba711f297a39b3deadc7 266b321864f5ad18607ac6708a2944bd1b66ae4633556181f8ad086ddb8ae59d914912c6 99abd6f1734d86dcf15a56f6e722b9673b149162da1e9c56cdb43d38aad6d074e2b66d61 e9c571549969162da0e9c56cdb41d38aaf6b174e2b66da31c715c35265244f6f6fc74ab4 b07b54f6e836f4ab1b07a571b96a515162a9163ab1b452ed15371912ad4aa2940a5a402d 145140051451400514514008692834d2680149a696a6934d2691561e5a98efc534b54523 e0503486c9262ab4937bd36593154659b1dea5b358c49a4b8f7aad25d63bd5396e319e6a 8cb75ef52d9bc60684979c1e6b2ee6ef39e6aacd79d79acd9eef39e695cd55324b9b8ce7 9ac7b99faf34b3dce73cd664f3e73cd3b1a2d086e65ce6b1ee5f39ab73cb9cd664ef9cd5 721a29d8809a69a4cd266b6a74cc6a5510d348a7d18aeda74ce0a95488ad204e6a6db4a1 6bb214cf3ea5418ab52aad285a902d75420724e60a2a5514d02a402ba6113966c78a434e 1d29a6b7b1cfd461a61a90d30d268a44669a69e69a454b8948898544c2a66151b0ac6713 a29b2bb0a8985586151b0ae49d33b29ccacc2a32b561854656b96748eda7508f14629f8a 4c5724e91dd4ea8da5a292b9674cefa7585a4cd2668cd734a99db1ac2e6928cd2566e06c aa0b4945159b46aa428a514d14eacda358b1c29c0d329c0d4b46d163c1a766a30697350d 1aa90ecd19a6e68cd01716928a2800a28c52d02b052d2514143a8a4a290ee4f11abd1356 7c66ad46d4d11235227abb1495931bd5b8e4ab4ce69c4d98a6abf04fcf5ac28e6ab904dc f5ab4ce69c0e9ade6e9cd6adbcdd39ae66de6e9cd6adbcdd39ad5338aa533a6b79ba735a b6f374e6b9ab79ba735ab6f374e6b54ce1a94ce9219be5eb4c964cd52866f97ad39a4cd6 b16714a012366a9c83353b366a2619ae88c8c9c4a32a66a9cb0e7b56ab266a26873dab78 c8cda30a5b7f6aa32db7b574725bfb55492dbdaba23322c7332dafb55196cfdabaa92d7d aaa4967ed5bc6a13639296cbdaa94963cf4aebe4b2f6aaaf63ed5d11aa2b1c93d8fb540f 63ed5d63d8fb5577b1f6ada358563937b1f6a81ecbdabab7b1f6aaef65ed5bc6b0ac72ad 65ed4cfb1fb574af65ed51359fb56aab0ac73a6d3da90dafb56f35a7b544d6bed5a2ac2b 1886dbda90c1ed5b0d6ded51341ed5a2aa4d8caf23da8f27dab44c14d30d57b4158cff00 2693caabe61a698a9f3858a3e551e5d5c31537cba39c2c55f2a8f2aadf974be551ce1629 f95ed479357bcaa5f27da8e71d8a1e4d384157843ed522c1ed49d40b19e2dfda9c2d7dab 516dfdaa65b5f6a8754763205a7b53859fb56d2da7b54cb67ed59bac3b18f0d97b55f86c fdab4a2b2f6abd159fb5613ac558cf86cfdab421b4e9c55f86cfdaaf4569ed5cb3aa5245 186d3dab460b5f6ab715a7b55f86d7dab927506910dbdbe31c56adbc38c714436f8ed5a1 0c38ed5cb3994496f174ad5b74c62ab431e2b4214c62b966ca2ec238a9aa388605495cec 614b4514805a28a280168a28a0028a28a0028a28a0069a8d8d48d5131a06869351934ac6 a266a45a4296a8257f969ccd55a77f969169156793ad664f375e6a7b99319ac7b99baf35 0d9d1088c9ee319e6b367bac679a6dcdc75e6b1ee6eb19e6a1b3ae10279ef3deb3e5bbf7 aa37177cf5aa4f759ef493d4d9c342f4b739ef54659f3deab3dce7bd5679f3deb78a3196 8492cb9aa32be69cf2e6ab3bd74c60734a760069c0d440d48a6baa9d3392a551e29c0522 d48a2bb29d3382a55102d38253c2d4816bb214ce0a9508c2d382d3c2d382d6ea060e6340 a7014a052815a2899362d34d3e9a6b4b1030d30d4869868b1488cd34d3cd34d1ca52226a 630a948a61151289ac59091519153114c22b1953378cc81854656ac114c2b58ca91bc6a1 0114d22a522984572ce91d94ea919a69a79a8cd714e99db4eb084d266909a335c93a6764 2b0b4b4dcd2d73ca07642a0b45252d73c91d90900a5a4a5ac5a3a1316969b4b52d1a290e cd2e6999a5cd43468a43f34669b9a5a45a63a9452528a965a0a314b4505584a294d25001 4525140ae4886ac235555352ab53259751ea7492b3d5ea5592825c4d3497dead433f3d6b 1966f7ab10cdf375a7721c0e9ade6e9cd6adbcdd39ae66de7e9cd6adbcdd39ad1338ea53 3a7b79ba735ab6f374e6b99b79ba735ad6f374e6b68b382a40e9609b8eb53893359104dc 55c49335ac59c338174366940cd428d9ab08335ac6473ca201334a21cf6ab0899ab090e7 b56d191cd2466bdbfb540f6ded5b8d6fed519b6f6ad54ccac73ef6bed503d9fb5746d6be d519b3f6ab5502c730f65ed503d8fb5754d65ed513d8f1d2b4554563917b1f6aaef63ed5 d6bd8fb5567b1f6ad156158e4dec7daab3d97b5758f63ed55decbdab65582c726f65ed55 decfdabab7b2f6aa9259fb56b1ac2b1cbbda7b5577b5f6ae964b4f6aa925afb56f1ac4d8 e75edbdaabbc1ed5bf25b7b554920f6ada35456314c3ed4c30fb56a343ed51343ed5aaa8 2b19862a618ab49a2a89a2aa55056338c74df2f9abcd1d33cbe6af9c2c5611d3845ed564 475208bda973858a822a7887daad88bdaa410d4fb41d8a421f6a9d20f6ab2b0f356a283d aa65502c554b7f6ab296bed5762b7f6abb15afb5612aa558ce4b4f6ab2967ed5a915a7b5 5c8acfdab09561d8ca8acbdaaec567ed5a91d97b55c8ecfdab09561d8cb8acfdaaec569e d5a51d9fb55c8ed3dab9e554ab19d15a7b55d8ed7daafc769ed56d2d78e9584aa0ec508e df1daadc70e3b55a5b7f6a9961c76ac9cc6431c78ab71a629562c54cab593604918e29f4 8a29d598c4a5a28a0028a28a005a28a2800a28a2800a28a28018c6a163448f556497148b 4891987ad42ce3d6a0926c77aab25c63bd4dcd544b6ce3d6aadc4836f5aa925d7bd52b8b bf97ad26cd630197728e79ac3bb9baf353dd5d673cd62dd5c673cd433aa112b5ddc75e6b 0eeee4f3572ea5ce79ac5ba7ce6a5a67542c8a37374775553724d25c1cb5414420ee6d39 2b1234e6a3698d34d2115db4e0cf3eacd0190d46cc4d3c8a42b5db4e99e755a8354d4eb4 c55a9956bb614cf3ea541eb5328a628a994575c22715498f55a942f14d51520e95d70470 ce4c4db4629d495a588bb13146296929d805c534d2e69a4d31a1a69a6949a6134ec5210d 34d04d349aab148434c34a4d349a1a290845308a5269a4d43896ae21151914e269a4d4b8 a2d3646c2a3615231a8cd72d481d1093226a8daa56a8d857154a675c26c88d25388a4c57 1ce99d74ea052d18a2b8e74cf429541696928ae49d33d1a5510b4514573b81d6aa20a334 94543896a62e69734da0543468a43c1a7034c14e150d1ac643c5385460d381a968da3224 a29a0d19a9b1a730b49499a4cd3b12e42d266933499a7621c87034e0d51d2d16129a250f 4a24a8b34b9a39594a68984a6a68663baaa66a484fcd472b1ba91b1b76f31e2b5ade53c5 61db9e95ad6e7a55a8b392a4d1b96f29e2b5ade53c561db9e95ad6e7a56a91c15248dbb7 94e0568c3266b22dcf4ad384d6891c5368d384e6afc23359b09ad187b5688e49b45f8533 57e1881aa50f6ad187b5688e4992790293ece2a7a2aae6457fb30a4fb28ab345176056fb 20a6359ae2ae535ba51ccc0cc7b35f6aad2598ad57155dc55a931192f662ab3da0ad675a 81d2b4526063c9662a94b683d2b71d2aa4b1d6b19b11cfcb6a3d2a8cb6ded5d0cb0d5296 0f6ae884d93639d96dbdaa8cb6fed5d1cb6fed54a5b6f6ae98d4158e79a0f6a85a03e95b ad6bed5135afb56caa0ac60b43ed50b427d2b79ad7daa26b4f6ab55056301a23e951f927 3d2b75ad3daa3fb1f3d2ad540b194b09f4a91613e95aab69ed522da7b527502c652c27d2 a5587dab516d3daa45b5f6a9750763316039e9572183daadadaf3d2ae456ded512a8162b c36fed5a10db7b54d15bfb55e8a0f6ae69d42922286d47a55f86d053e286afc51d734e6c 76238ed055a8ed054a8956234ac1cd8c6476a2ad476c29c8b5650564e4c62476c2acadb8 c5082a71d2b36d8c8840297caa968a57023f2e9db29d4520131452d14009452d14009452 d14005145140051451400514514019f33e2a8cd2e2a79df19acb9e5c66a1b3a6111b34d8 ef5426b8c77a6cf3633cd65cf71d79a86ce98409e6bac77acf9eef8eb5527baebcd66cd7 7cf5a8b9d31a65ab8b9ce79acab8b8ce79a8a6bacf7aa135c67bd5ad47cb60b89b39acbb 89339a9669b3dea84cf9ad542e2e6b15666e6a2cd2cadcd3456d0a6673aba0b4b8a05380 aeda74ce0ab546e28db4f029c16bba9d33ceab506aad4aab42ad4aab5d5181c529828a95 45228a91456d189cd390f5152638a6a8a7e38ada273498da4a752558843494521a630cd3 09a75318d34521a4d309a5635193548b4809a8c9a526a326a91490a4d309a4269a4d162d 2149a693484d349a2c52404d349a4269a4d268a4809a61a52690d61289ac461a611521a6 915cd2a66d191191498a791498ae69d23784c6628a76292b8e748eda7504a28a4ae39d33 b69d5168a4a2b9a54ceb8d5168a4a2b9e503a63505a2928ac6513a2321c2969b4b59b46c a43c1a5cd3334b9a868d5487e68cd373466a6c5f38ecd2669334669d8973173499a4cd14 ec4398b4b9a6d19aa5121d41d9a5cd3334b9ab5033754766a584fcd5066a484fcd56a999 bae6bdb9e95ad6e7a5635b9e95af6e7a55721cf3ac6c5b9e95ad6e7a563db9e95ad6e7a5 3e5396754d8b73d2b4e035956e7a569c07a5558e694cd380f4ad183b566407a56941da9a 461291a505694159b076ad282a8c24cb54514532028a28a0029ad4ea43401030a8996a76 151915480aacb50b255c65a8992a931145d2ab491d6932542f1e6ad3032648bdaaac907b 56cbc5ed55de0ad632118925bfb55592dbdab79edfdaa07b6f6ada33158c06b5f6a8dad7 dab74dafb530dafb568aa0ac60b5afb544d69ed5d01b5f6a61b4f6aa5542c73cd69ed4cf b1f3d2ba1369ed4dfb1f3d2abda858c3169ed4f169ed5b62cfda9c2d3da97b50b18a2d3d a9e2d7dab645a7b5385afb52f68163216d79e95623b6f6ad216bed5325b7b543a8162947 6fed56e383daad25bfb558483dab294c6411c356e38f152243ed56123ac65218c48ea754 a72a54aa959b631116a74148ab528150d80e51530e951a8a9074a963168a28a401451450 014514500145145001451450014514500145145001451450060dcbe3358d732e335a576f 8cd60ddcbd6b26cefa7129dccd8cf358d7371d79ab177375ac1bbb8c679ac9b3b69c06dc dd633cd64cd77c9e6a2bbbac679ac696efe73cd45f53b634f434e4bacf7aad25c67bd67b 5d67bd46d719ef5d14f530a91b16a49b355649335134d9ef51b499aeca71386a4ac0edcd 00d465b269eb5db4e99c352a928a7814c5a954576d3a67054aa380a785a1454aab5db4e9 9e7d4a8205a785a705a785ae8e4399d4100a7814014f029f299b90a053b1c50052e29d8c db1a69a69c69a698d0da69a71a61aa29084d309a71a8d8d34521a4d46c69cc6a263548b4 846351b1a56351b1aa46890134d269a4d349aab1761c4d349a693484d161d809a4269a4d 2668b1490ecd252668a8711852629697159ba65730cc521152629a45633a45c66464521a 79a69ae3a948e985418690d29a69ae3a948e98550a2928ae39d33ae9d5168a4a5ae59c0e ea7505a2928ae49c4ed8485a5a4a2b268d9487668cd373466a1a34531f9a334ccd2e6a2c 5f38ecd19a6e68cd5588731d9a29b9a5cd3b10e62d19a4cd266b48c4c67507668cd37346 6b68c0e69d51d9a9213f35419a9213f356ca99cb2ae6bdb9e95ad6e7a5635b9e95af6e7a 50e062eb1b16e7a56b5b9e958f6e7a56b5b9e952e266ea9b16e6b4e03d2b2adcf4ad380f 4a56337335603d2b4a03d2b2e03d2b4e0ed4ac4b91a7076ad282b320ed5a7076a086cb74 5145020a28a2800a434b486801845308a971498a0084ad30a558db49b29dc0ac63a89a2a bbb290c74ee067b45ed51b41ed5a462f6a430fb552908c96b7f6a8dadbdab60dbfb521b6 f6aa530b1886dbda90dafb56d7d9bda8fb2fb53f681630cdafb534da7b56efd97da93ec9 ed4fda858c1369ed4dfb1fb57406d3da93ec9ed4fda858c2169ed4a2d3dab77ec9ed47d9 3da8f6a1630c5a7b5385afb56dfd93da8fb2fb52f68163145afb548b6ded5aff0065f6a5 16ded4bda058cc5b7f6a9560ad016fed4a20f6a9730b14d62f6a9162ab422f6a708ea5c8 0ae23a784a9b65284a5719185a7814edb4b8a5700029e29b8a70a4014514500145145001 4514500145145001451450014514500145145001451450073378bd6b02f13ad74b76bd6b 0aed3ad64d1df4e472f791f5ac0bc8bad757771f5ac2bb8baf1593476d399c95e43d78ac 5960f9cf15d5ddc3d6b1e583e73c5472ea7646ae864187da9862ad3687daa268abb2944e 4ad54cf31d34a55d68ea364af4a940f2eb542a6ce69eab4f2bcd3956bd0a703cda931556 a55148ab5228aec844e29c87a8a95698a2a45aea8238e6c905380a68a900ad5988a05380 a00a900acdb0b0816976d3c2d3f6f150e41ca572b4d2b564ad34ad2e72d40ac529852ad1 4a694a3da16a0552951b255c294c64a1552d40a4c951347578a54452a955345029347513 47579a3a8da3ab554b502918e9a63ab863a618ea9552f90a8529852ae14a614aa5507ca5 42949b2ad14a614ab530e52beda315315a6914f985ca4745388a61a0561734d26909a426 94902404d34d19a435cb389ac469a6914f34d35c9381aa63714629d8a315c75299d34e42 628c53b1462b8ea533ba9d41314629714b8ae39d23b61586e28c53f1462b2748d5571b8a 314fc52e2a1d22d5723db4bb69fb69e16a7d90feb0441297cba98253c253f6443c415fcb a5f2aad08e9e22a6a912f1053f2a93caabde5527955ac69184eb94bcaa4f2aaf79549e55 6f1a4724eb147caa9228be6ab5e553e18be6add53396550b16d174e2b5eda2e9c556b68b a56bdb45d2a250279cb16f0f4e2b5ede1e9505b43d38ad7b687a7158490ee4d6f074e2b4 e087a71496f0715a114359318e863e95a50274a8628aaf449d2a40b302f4ad280552896a fc42901628a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a00 28a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a00 28a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a00 28a28a00c5ba5eb58b749d6ba0b95eb591729d6a1a3a63239cba8fad62dd45d6ba6b98fa d63dcc5d6a1a3a233398ba87af15912c1f31e2ba7b987af15952c1c9e2a5475375574311 e1f6a81e2f6ad8921f6aab2455df4627255aa653c7503a569491d56912bd5a303cdab50c f64e680b533af34816bd184343cf9cc40b4f02942d380ade3139e52140a78a6814f15bc5 1cf263d6a45151ad4ca2891287a8a9145228a954561265a42aad49b78a555a902f1584a4 68a242569bb2ac6da4d959b99a2815ca5214ab1b2936543a868a056294c2956f6534a54f b534502914a618eae14a618e9fb534502918e9863aba63a618e9fb52d40a263a618eae98 e9863ad23547c85231d30a55c31d4652b58d40e52a14a8ca55c64a8d92b58cc5ca5365a8 d855a65a81856d1912e240c2a36a958542d5b448686134dcd231e693356d684d87669293 34b58ca2520a4c52d2d6128149898a314b8a5c5734e99ac643714b8a5c52e2b9274cde35 06e29714b8a5c5724e91d11ac262940a5029c0566e915edc6e29d8a7014a054ba41edc68 5a7aad285a955697b217d60454a91529ea9532a53f644bc411ac7522c5532c753ac54fd9 12f1054f2a8f2aaf79549e55691a4672ae51f2a93caabde57b527955b469184ab14bcaa7 c317cdd2ad7954f862f9fa56aa9e862ea96ada2e9c56c5b43d2aadb45d38ad9b587a573d 481a4665ab687a56c5b43d38aad6d0f4e2b6ad61e9c5715446d164f6f0f1d2af470fb53e de0e3a55c487dab95ee6c88e38eadc694a9154e894807c6b56a315122d4e829012d14514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 00514514005145140051451400514514005145140051451400514514005145140146e17a d655c275ada9c75acd9d7ad22948c3b88fad655c45d78ae8274ce6b3678bad2b1a299ced c43d78acc9a0e4f15d1cf0f5e2b3a683da84b52bda68604b0fb553962adc9a1f6aa32c5d 6bd1a11392ad4662cb1d53952b5e68ea8cc95eb5089e7d59b32a45e69bb6acc89cd47b6b d38c558e294ddc8f6d2e29fb68c568a266e43714a2971455244363d6a75a812ac20ace63 892a0a9d454495610572cd9b450f45a982f14d415301c5724e46f1891eda4d953628c561 299b46043b28d953605181584aa1b46041b29a52ace05348159fb53554caa529a52ac902 9a40a3da96a05531d30c756c814c2053f6a5a8151a3a89a3abaca2a36515a46a83814992 a364ab8cb51b2d7446a12e25329513a55d64a85d38ae985425c4a0eb55dc55d916aac82b aa12337129bd577ab520aab25764199b45773cd20348e79a6835d16d0cda2506945301a7 0a97110e14ea414e159b80ae18a5c52d158ce00a42628c53b1462b9674cb531314a052e2 942d72ca98fdab0029c05285a784359fb313aac6814e0b4f0869e2334bd9a25d66302d4c 8b42c46ac24668f6689f6cc112ac247424756523a3d9a17b663523f6ab09153d12ac220f 4a7ecd13ed99079549e57b55dd829360f4ab54d12eab2979549e555dd829367b56aa0897 5194bcaa9608be7ab1b054904637d5f22b13ceee5cb58ba715b56b0f4e2a8daa0e2b6ed5 0715c756274424cbb6b0f4e2b6ad61e9c553b541c56ddaa0e38af36aa3b20cb76f071d2a d2c3ed525b20dbd2ac051e95c12dce95b15d63a9152a60a294014863156a4514629d400b 451450014514500145145001451450014514500145145001451450014514500145145001 451450014514500145145001451450014514500145145001451450014514500145145001 451450014514500145145001451450014514500145145001451450014514500145145004 130aa332d68482aa48b40ccb953ad519a3cd6bc8954e48e90cc5961f6aa3341ed5bd2439 aa5341c74a6b71dce76686b3a68baf15d0cf0f5e2b3278abd0a272d430668eb3a64eb5b9 3c7d6b3278fad7ad459c350c69539a84ad5d9939a80ad7a517a1c72441b6908a94ad348a d13336478a69a7914d356886392ac25578eaca56350d204e95610540956505705491d308 9320a9c0e2a2415381c5705499d5088dc525388a435c93a874460369294d34d72cea9d11 a62e69a4d04d349ac1d63754c0d34d29a4347b629531a69a69c690d1ed8a54c6114c22a4 34d22b585613810914c2b53914d2b5d50ac43815cad44ebc55b2b5148bc57542a99b899d 2ad5394568cab54a515e852a8632899f20aa72d5e9455296bd2a52b984914e4eb4d14b27 5a68aee5b18b2414e14c14e14892414e14c14e152c963c5385345385652421c052814014 f02b9e4857102d382d380a7aaf35cf288ae0a952ac74e44ab091d66e22b912c752ac5ed5 3a4753a45ed59b422b2c3ed53ac5ed56521f6a9961a8115922a9d63a9962a9163a2e2188 953a2d2aa548ab45c4376d1b6a5db46daa4c5621db46da9b6d2edad131588365490a7cf4 fd952429f355df4158d1b55e95b56abd2b2ed97a56cdb2f4ae3aace9a68d4b51d2b6ad47 4ac9b65e95b36c3a579b54ec81ad6e3e5a9ea1b7fbb53d704b73a96c14b452d21852d20a 5a005a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28 a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28 a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28 a2802371503ad59615132d005374aaef156832546d1d0332de1aad341f2f4ad9687daabc d07cbd285b81cd5c43d78ac9b88baf15d2dcc3d6b22e62eb5e85139a6739711f5acab88f ad743731f5ac7b98fad7a9459c7330a74e6ab15ad0b84e6aab2d7a307a1c9245565a6115 6196a2615aa666d101151b54cc2a26ad119b163ab2955a3ab31d6358d29a2cc75652abc7 566315e5d691db4d161054e07151462a7c715e5d599db4e2308a61a908a61ae0a950eb84 061a61a79a8cd7154aa75429884d266909a4cd72bada9d2a98b494669297b61fb30a4a5a 4a3db0fd989498a7518ad6158970198a4db5262976d7642b193810eda648bc559db4c917 e5aeca754ca5132e65aa130ad4996b3e615ead0a8734e2664c2a8cd5a330ace9bbd7b342 4734d1424eb4d14b2f5a68af523b1cec9053853053850c864829c29829c0d225920a9054 6b52ad6724431e05480535454aa2b294486c502a445e6855a9a35e6b194486c9234ab31c 74d8d2ae471d612885c48e3ab51c54e8a3ab9145ed58c9144490f1d2a410d5c4878e94ff 002bdab1632908a9e23ab5e57b51e5d4dc457094e0b536ca36d4dc446168db526da76da6 98588b6d2eda942d285ad130b116ca9614f9a9db2a5853e6abbe80917ad97a56c5b2f4ac db75e95af6cbd2b92ab3a208d2b61d2b5ed874accb61d2b5ad874af3ea9d703520fbb536 2a2807cb5362b89ee7420a29714521851451400b45145001451450014514500145145001 451450014514500145145001451450014514500145145001451450014514500145145001 451450014514500145145001451450014514500145145001451450014514500145145001 451450014514500145145001451450014514500262936d3a8a0066ca4f2ea4a28023f285 4334236d5aa8a7fbb4d6e0cc3ba887358b7518e6b7eebbd635d0eb5dd48e79981751f5ac 5b94eb5d05c8eb58b74bd6bd2a4ce49983729cd5375ad2b95e6a9bad7a107a1cb245365a 81855b75a81c56f1666d1558542d561c5577ada264c58ead475523ab51d73d735a65b8ea d475523ab71d7915cefa65a8c54f8e2abc7563b57935ae77d3b0c351b548d51b579b56e7 6d3b11b546d5235466bcfaad9d94d223269334a692b89b773a92560cd19a28a9e663b20a 5a4a5a39985905380a414a2b6a6d9124850297140a5aeca6d98c92176d3645f969d4d90f cb5dd49bb9848ce9d7ad66ce2b4e73d6b367af6b0d7396666ce3ad66cfdeb4a7ef59b3f7 af7b0c71ccce97ad3053e5eb4c15ec4763998f14e14d14e14c863c53853453c5221922d4 cb50a54ea2a190c91454ca2a34153a0acd9931ea2ac46bcd46a2ac4639a8664cb31255e8 92aac42aec42b9a6345b8a3157628c5558aaec5dab9a65a2dc710c538c4288cf14e26b9d 96446314d282a426984d4301854530ad3c9a61352c4005382d341a7034201c16942d029c 2ad31805a9a15f9a982a6887cd55cfa02342dd7a56adbaf4acdb7ed5a96fdab96a48e881 a76e3a56adb8e95976fdab56dfb570d467540d483eed4b50c1d2a6ae47b9ba0a28a290c2 8a28a005a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800 a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800 a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800 a28a2800a28a2800a28a2800a8e6fbb5254737dda6b706645c8eb58f723ad6cdc8eb5937 23ad76d239e6625c8eb58f72bd6b72e475ac9b95eb5e8526734cc2b85e6a93ad69dc2f35 4a45aef8339a48a122d577157645aa920ae98b3168a6e2abc956a415564ade264c48ead4 75552acc758d634a65b8ead475523ab51d795591db4d96a3ab1daabc753f6af2ab44eea6 c69a8cd3cd466bccaa8eea6c61a8cd3cd466bccaa8eea630d141a2b85ee75ad828a296a4 614514b40052d1456d4cce42d2d2515df4d1848753243f2d3b34c90fcb5dd496a612284e 7ad674f5a139ace9ebdac3a3966674fdeb3a7ef5a3377ace9bbd7bb873926674bd69829f 2f5a68af5e3b1ccc70a78a60a90533363853c53053c5492c912a74150a5584152ccd9320 a9d054482ac20ac999b24415623151a0ab118acdb326588855d8aaac62adc62b9e6345b8 aae4554e3ab71d7348b45d8cf14a4d310f14a4d60ca026984d2934c26958009a6134a4d3 09a5610e069e2a21520a4d0120a78a60a78acdb18f153443e6a8854d10f9aa1cca4695bf 6ad4b7ed599076ad383b573ce46f0352dfb569dbf6acc83b569dbf6ae59b3a606a43d2a6 cd410f4a9735cece843a8a4a5a06145145002d1451400514514005145140051451400514 514005145140051451400514514005145140051451400514514005145140051451400514 514005145140051451400514514005145140051451400514514005145140051451400514 5140051451400514514005145140051451400514514005145140054737dda92a397eed35 b819771deb26e075ad7b81d6b2ee075aeba661231ee075acab85eb5b370bd6b2ae17ad77 d3673c918b70bcd51916b5675aa12ad77419cd246748b54e415a12ad52945754198c9146 4154e4abd28aa52d7540c64312ad475552acc759d52a05a8ead475552acc75e5d5476419 6a3ab1daabc75376af32b44eca6c43519a79a8cd797591df4d8d3519a79a8cd797591e85 21868a0d15e74b73b16c2d2d252d218b4b494a2900514b495d148ce414668a4cd77d2473 c85cd3243f2d3b351c87e5af429239e45298d674d57e6acf9abd9c3a39a667cddeb3a6ef 5a335674ddebdcc39c9333e5eb4d14f97ad3057ab1d8e663c53c5305482990c70a78a68a 78a9219225594155d2aca0a86432741561054282acc62b2664c9905598c54282aca0aca4 ccd93462ad475020ab282b9e434588ead466ab25584ae79148b6878a52698878a09ac4a0 269a4d04d349a7610134d268269a4d3b0872d482a25a916a268689454ab512d4ab5cb363 4482a78bef542b53c5d6b9673291a3076ad383b566c1dab4a0ed58ca67440d383b569c1d ab320ed5a7076ac9b3a606943d2a6a861e952d6474216969294503168a28a602d1451400 514514005145140051451400514514005145140051451400514514005145140051451400 514514005145140051451400514514005145140051451400514514005145140051451400 514514005145140051451400514514005145140051451400514514005145140094514500 1451499a005a8e5fbb4ecd3253f2d084ccf9fbd664fdeb4e7acd9ebaa9b32919738eb599 38eb5ab38eb59b38eb5dd4d9cf232675aa12ad69ccb59f30aed848e7919d28aa328ad198 55098575c198c8cf96a8cb57e5aa1357640c24471d5a8eaac75663a9aa381692aca1aaa8 6aca579d551d5065a4a9f3c5578ea7ed5e75589d506213519a79a61af2ab23d0a4c61a61 a71a61af22b23d1a434d0290d28af365b9dcb616969294548c514e14829c28105252d257 45233909494b495e8d2473c84a8e4e95254727ddaf469239e4ca33567cd57e6ef5426af6 2823966ccf9bbd67cddeb426ef5426af6a81cb36674a39a681524a39a6815ea476399b1c 053c0a4029e05043140a78148053c0a921b248c5598c54082aca0a8910d93a0ab318a810 5594ac99936584ab295592aca56523364e95610d565a9d4d6124099650d5846aa8a6a756 ac648ab96d5b8a52d502b714a5ab1b0ee485a9a5aa32d485a80b8f2d4d2d4c2d4d2d4ee2 b932b54aa6ab2b54ca6b9eacec099654d4aa6ab29a994d79d56ad8a4cb0a6ac4479aaaa6 a788f35e7d4afa9499a901e95a501e959501e95a301a8f6d73a20cd681ba56940d5910b5 6940d4f9ee74c19af0b715286aa70b715386aab9d099386a506a10d4f06994480d3a980d 385318ea28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a 28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a 28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a 28a280128a290d0014945252105324fbb4e26a390f142028cd59d3568cd59f3574c198c8 ce9875ace9875ad39875acf98575c198c8cb996b3e65ad5996b3a61d6bb29c8c24664c2b 3e61d6b4e61d6b3a61d6bba9b30919b30aa135684d59f377aeea673c8892ac475590d594 a2a044b286aca5554ab295c3511d3165a4353678aae953e78ae0ab13a60c434d34a4d34d 7915d1e852634d30d38d30d78d5d1e9d21a68141a515e64b73bd6c2d38520a5152038538 5345385020a434e34d35d348ce434d2529a435e9524734869a8e4e9521a8e4e95e951473 499466ef5426abf35509abd6a08e699426aa135684b542615ec503966ca120e69a053e41 cd2015e9c7639d8a0548052014f02833628152014d02a402a590d8f41565054082aca0a8 64364c82aca54082ac20ac999b64e95616a04ab0b593336c956a553508a901acd8ae4ea6 a556aaea6a40d59b4172cab51baa20d46eacdc477242d485aa3dd4ddd59315c90b526ea6 6ea6eeacdb0b93ab54ca6aaab54ca6b86bcec099694d4ca6aaa9a9d4d78d5ead8a4cb2a6 ac4479aaaa6ac4479af22ad7d4a4cd284d68426b3213d2afc26aa15ae74419ab0b74ad08 5ba56542d5a10b57542773aa0cd589b8ab01aa8c4dc55856ae94ce94cb21aa406abab54a a6ad1489d4d3d6a25352ad52290fa28a298c28a28a0028a28a0028a28a0028a28a0028a2 8a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a2 8a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a2 8a0028a28a0028a28a0028a28a004a69a4328a699052ba15c752134c328a4320a5cc8571 d4c90f1486514c79062973215cab2f7aa3355b964154a5715bc248ce4ca728aa128abd2b 0aa52b0aea84d18c8a132f5ace9d7ad69ca47359f391cd75d39a31919738eb59b38eb5a9 39eb5993f7af429491cf23327ace9fbd694fdeb367ef5e8526612204ab2955d2ac255cc5 12c25594aac95612b8e68de2cb29538e955d0d4d9e2b8ea2d0de0c0d34d2934d35e3e211 e8d1634d34d38d34d7898847ab4469a514869457932dcef8ec385385345385218e14e14d 14f068101a69a71a69ae9a46531869a69c69a6bd3a48e698d351c9d2a435149d2bd3a28e 59b29cb5465abd2d519457ad451cd365196a84b5a128aa328af5a89cb3650907348053e4 1cd228af456c73b6380a78148053c0a0cdb1c053c0a4515201524363d054e82a24156105 4321b25415612a1415610564d99b264a9d6a14a9c74ac9b3363853c1a60a70152da15c90 1a786a885380350da15c94351ba9801a306a24d0ae3b751ba998349835cf2920b8fdd49b a9b8349835cd29a0b92a354e86ab20353a035e6626a0d32ca1a9d0d56406a7406be7f135 0699650d5888f355901ab11039af06b557cc5a668426afc2d59d10357a206b7a5519d106 6942d57e16acd881abd1035e9d2933aa0cd289b8ab2ad54a206aca035e845e874c4b4ad5 329aac80d4e95a23445853532d40953a55a2912514515450514514005145140051451400 514514005145140051451400514514005145140051451400514514005145140051451400 514514005145140051451400514514005145140051451400514514005145140051451400 514514005145140051451400514514005145140195e7fbd279fef59c67f7a4f3fdebcd75 8e5e7343cff7a433fbd6799fde9a67f7a875c39cd0f3bde98f371d6a8f9fef4c69b8eb51 f5817393c93554925a8de6f7aacf2fbd6d0c419b98e924aa923d0f255677ae88e20cdc86 cadd6a84cd56247e2a94cd5d94b11a99ca45398f5ace98f5abb31aa131eb5ebd0ad73193 284ddeb3a6ef5a33567cd5ebd09dcc644082a74a85454eb5d32611264a9d0d40b532d734 8d6259435283c557535283c573545a1b41ea3f34da33499af1f108f4a8b03494b4578788 47ab446e2940a5c518af225b9e8c761452d252d48c5a5069b466810f269a4d266909aeaa 265302690d1484d7a944e49886a393a5494c7e95ea51472cd94a5aa528abd2d539457a94 4e59b284a2a94a2b425154a515ead13966ca120e6900a9241cd00577ad8e76c02d3c2d01 6a40286c86c00a7814a053c0a96ccdb1505584151a8a9d4567264364882a7415120a9905 73ca4432641532f4a89454cb584a6431c05380a00a7815cf2ab610014e0b4a054816b9a5 88b00d0b46da942d1b6b9e58a021db49b6a6db49b6b9a58a110eda36d4bb6936d73cb122 1a8b56116988b53a2d7056af71a1e8b53a2d3116a745af2eb4ae5a43d16acc4bcd468b56 225e6bcda90bb2d22d42b57e15aab0ad5f856ba6940e9822d42b57a25aad0ad6842b5e8d 289d504588978ab0ab4d8978ab0ab5df15a1d2902ad4ca29aab52a8ab48a48728a996a35 152ad5a2d0fa28a298c28a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28 a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28 a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28 a0028a28a00e1bcff7a4f3fdeb3bcff7a4f3fdebe5e558f2b9cd1f3fde93cff7acef3fde 93cff7ac655c5ce68f9fef4d69bdeb3fcff7a4337bd64f102e72d3cd503cb55da6f7a8da 5ad2388139933c9503bd46d2544cf5d11c412e439db8aa72b54acd55656aeda188d48722 b4a6a8ca6adca6a94a6bdfc356b90d94e5aa32d5e96a94a2be830d3b99b215152ad46a2a 55aef6c1122d4cb50ad48a6b266a993a9a901e2a1535203594d686b17a92668a6034e15e 3e211e8d163a9690528af0b108f5a88628a7629315e3cf73d28ec251451525052668a6e6 900ecd266933466baa898cc5a4a33457ab44e398531fa53e9afd2bd6a28e29b29c955241 5764aa920af4e91cb3651905539055f905549057a748e69b284839a02d48e39a02d772d8 e76c40b5201405a900a4d99b62015201405a900a96c86c1454ca29aa2a55158cd92d8f51 5328a628a9545724e449228a996a35152ad71ce648f5152a8a628a95457055ab601ca2a4 55a45152aad79d57116000b415a9556976d704f14041b6936d4c56936d73cb14221db49b 6a6db4d2b5cf2c4923516a745a6a2d4e8b593af7290f45a9d16988b53a2d4b95cd121e82 acc4bcd448b56625e6a792ecd628b70ad5f857a554856b4215aeaa703a608b70ad6842bd 2aac2b5a10ad76d389d304598938a9c2d112f15285aea4b43a521a169e05285a70154300 2a414d029e298c5a28a298c28a28a0028a28a0028a28a0028a28a0028a28a0028a28a002 8a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a002 8a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a002 8a28a0028a28a00f22f38d1e71a8a9335f1124cf02ec97ce349e71a873499ae792905c9f ce34d329a877534b560d4ae2b931969864a88b534b55c798572532530bd465a9a5ab68b9 05c7b355691a9e5aa0735d9879bb8ae4121aa921ab4e6ab3d7d1616ad89b94e4aa920abc e2ab3ad7d26171090ae56029e053c253c257a5f598821a29e29c129e1297d6226898829e 334a129e16a65888d8d22f510538538253c2d79388ac99e8d190d14e029c169e16bc4c45 44cf568cd0d02908a942d215af2272d4f4635158848a6d4e569a52a798af68884d34d4c5 29a5295c7ed11151526ca5d95d34646552a223a2a4db46daf568cd1c552686535c71536d a6b2f15eb51a88e29c8a520aab20abf22d5674af46955472ce467482aac8b5a4e9559e3a f429574734d998ebcd016ad3c5cd022aec5888d8e76c802d4816a611d3c4749e22243642 16a40b5288e9c23a8788890d8c55a954538254812b0a98889371aa2a551405a902d7154a e82e2a8a9569a0548a2b86a574224515328a8d454ca2bccad54091454cab51a8a9945795 5aa318f55a52b4e514ec5799394ae3b10eda42b563652f9758cb98562a95f6a6943e9577 caa5f27dab19290b94a6887d2ac221f4a9d20f6a9d20f6aa84645460c8110fa54e8a7d2a 7483daa7483dabb21166b1890229f4ab3129cf4a9520f6ab11c3cf4aeb840da311d0af4a d1857a54514557a18eba6313a2112c42b5a10ad56892af44b5d30474c516e25e2a5db4d8 ba5495ba37426da5c514b4c618a28a280168a28a0028a28a0028a28a0028a28a0028a28a 0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a 0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a 0028a28a0028a28a0028a28a0028a28a00f1c34d2694d309af91940f0009a6134134c26b 09532452d4d2d4d2d4c2d58ba64dc796a696a616a616a390571e5a9a5a985a9a5a9a88ae 3cb544c690b5309ada9bb315c63542d529351915ea51ab615c818542cb5688a8cad7ab47 1360b958253c254a129e12bb3eb834c88253c2548129e1297d70a4c8c253c2548129e169 3c5e86917a9105a785a902d382d7155c4dceca72230b4e0b5205a705af3aad5b9df4ea0c 0b4856a60b46dae273d4ed5574202b4d2b5636d26da5cc57b62b94a4295636526ca3987e d8afb28d953eca4d95bd2919cea906da36d4fb6936d7a14aa1cb3a843b69acbc54fb69ac bc57a14eb1cd3994dd6a074abccb5032575c31073ca45074aaef1d68b4750b475d50c498 4a466b45cd022ab8d173408aba3eb7a18b65511d3847564474e11d43c590d95c474e11d4 e23a708ea1e2c96c80253c254bb29c12b19e2c57220b4f0b4f0b4bb6b9a78a15c6814f51 4014f51cd72cf10171ea2a65151a8a994572ceadc6891454ca2a3515328ae59cae5a2451 5228a628a9d16b9dab94902a548b1d488953a474b90b512158bdaa4587daaca45ed53a43 ed47b22940a8907b54c907b55c583daa7583dab48d23454ca6907b54e907b55b583daa65 83daba634cd540a8b07b5588e1e7a55a583daa6487daba2303450228e2ab71c74e48aac2 475b289b288b1a55b8d6a344ab08b5ac51ac513c7d29f4d414fad4d50514514005145140 0b4514500145145001451450014514500145145001451450014514500145145001451450 014514500145145001451450014514500145145001451450014514500145145001451450 014514500145145001451450014514500145145001451450014514500145145001451450 078d1a8c9a73546c6be76503c06349a8d8d2b1a8d8d652a64310b530b52335465ab174c8 6c716a696a616a696acdc096c796a616a616a696a87126e3cb53734c2d466a5682b8ea4a 296b58d5b05c6114856a5db4bb6b58e26c3b9084a784a942538255fd70699184a704a942 538251f5c29323094e0b5284a705a3eb652644129c16a50b4a16b39626e7442446169c16 a40b4e0b593ab73a61508f6d1b6a50b4bb6b3e73a15520db49b2a7db46ca7cc3f6c41b29 36558d946ca7cc3f6c562949b2ac94a694ad61226554afb69a56ac15a695aea854319542 0db4d2b5395a695aea8d63194caccb513255b2b4c295aac4193914da3a89a3abc63a618e b5589327233cc54795574c549e5557d6ccdb2a797479756fcba3cbacde2c9b957cba5d95 67cba36566f162b95f651b2ac6ca4d959bc58ae41b68db536da6edac9e285723c52814ec 50073593c405c7a8a994546a2a6514d55b96891454aa298a2a55154a572d1228ab31ad40 839ab912d5a57348a268d2ad471d3224abd1475b4606f1884717b55a8e1f6a7c5155e8a1 f6ad6348de302bac1ed532c1ed57160f6a9960f6ad552355029ac1ed532c1ed57160f6a9 960f6ad553345029ac1ed532c3ed57160f6a9443ed5a2816a05358aa558eac88bda9c23a b5129448552a555a704a705a76292156968a2a8a0a28a2800a28a280168a28a0028a28a0 028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0 028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0 028a28a0028a28a0028a28a0028a28a0028a28a0028a28a0028a28a00f20683daa36b7f6 ad7307b530dbfb5790e078ae06335bfb544d6fed5b46dfdaa336fed59b812e998ad6ded5 11b6f6adc36ded519b6f6acdd321d3314db7b530db7b56d9b6f6a69b6f6ac9d225d3310d b7b534db7b56d9b6f6a61b6f6ac9d225d3310dafb528b6f6ad836bed47d9bdab37449f66 648b7f6a70b7f6ad4fb3fb527d9fdab37443d999a20f6a7087dab43c8f6a3c9f6a87443d 9944434be555ef2bda93caa9f623e42a08e94255af2e93cba3d90729004a5db536ca36d1 ec87622db4b8a7eda3147b334486e296971453f6668828cd2504d3f666898b9a4cd37349 9a6a98ee3f346ea8f349baa9531dc90b530b530b534b5691a626c796a696a8cb534b56b1 819b6485a985aa32f4d2d5b2890c90b534b5465a90b55a810c796a696a616a42d4d40868 713499a6134669f21361f9a5a6e696a1d31728b4514b59ba41ca263349b6a4029c16a5d1 0e421f2f349e555a11d3c4550e88fd994bc9f6a041cf4abe21a7ac1ed53ec47ecca6b07b 54cb07b55c583daa7583dab58d22d5328ac1ed532dbfb55e5b7f6a9d6dfdab78d32d5328 25bf3d2ae4507b5594b7f6ab51c1ed5d1181a46045143ed57a28a9d1c3ed57238ab78c4e 88c458a3abd125471c756e34ade28e88a1eab52aad0ab522ad6a91aa42a8a99453545480 552290f5a9474a8d6a4154520a28a2818514514005145140051451400514514005145140 051451400514514005145140051451400514514005145140051451400514514005145140 051451400514514005145140051451400514514005145140051451400514514005145140 05145140051451400514514005145140051451400514514005145140051451401c3983da 986dfdab58c1ed4d36fed5c6e070f21906dfda986dfdab60dbfb521b6f6a874c5eccc636 ded4c36ded5b5f66f6a69b6f6a974c9f66629b6f6a69b6f6ada36ded4d36ded50e90bd99 8a6dbda9a6dbdab6cdb7b534db7b543a44fb3310db7b534db7b56d9b6f6a61b6f6a97445 ec8c536fed4d36fed5b06dfdaa336fed59ba24fb3328c1ed4d30fb56a183daa330fb543a 22f666698bda9a62ad0687daa33154fb125c0a063a694abad1d30c752e912e253294d2b5 6992a32b53ec89b1015a6915315a6114bd98ec464534d484530d1ecc6869a6934a6984d1 eccab8134d26826984d52a617149a42d4d26985aa9531dc716a696a616a616ab54c4d8f2 d4c2d4c2d4c2d56a04b63cb534bd465a985aad44964dba937545ba937568a0224dd49ba9 9ba93755280ac3f34e06a2dd4e06af902c4a0d385460d3c51ecc7ca3c5380a68a78a3d91 5ca39454cab4c4156516a5d12940163a9962a7a255948aa5d12d5320587daa6483daad24 3ed56120f6a5ec4a54ca8907b54e907b55c483daa7483daa9522d5329a5bfb54e96fed57 52dfdaa74b7f6ad15329532925bfb558483daaea5bfb54cb07b55a816a054487daaca455 3ac3532c5ed5a289a2891247561129cb1d4ca95a246890d0b5205a705a7015762ec2014f 028029c05318a29e29a29c29941451450014514500145145001451450014514500145145 001451450014514500145145001451450014514500145145001451450014514500145145 001451450014514500145145001451450014514500145145001451450014514500145145 00145145001451450014514500145145001451450014514500145145001451450066f91e d49f67f6ad1d83d28d8be953ca47219df67f6a436fed5a5b17d28d8be94b90390ccfb37b 521b6f6ad4d8be949b17d28e441c88ca36ded486dbdab5762fa5218d7d297b342e4324db 7b521b6f6ad628be94dd8be94bd9a17b34649b6f6a8dadbdab64c6be950bc6be949d3427 4cc66b7f6a85adfdab61e31e950bc63d2a1d24438190d07b542d0fb56b3c63d2a078c7a5 43a4887032da2a85a2ad378ea078eb374919b819ad1d42c95a2f1d40f1543a666e25064a 8596af3c46a1688d66e9993894d96a36156da2351344697b326c556151b559688d44d11a 9f662b15cd309a9da26a8cc4d47b316a424d464d4cd13546d13552806a444d465aa53135 46616aa501ea465a985a9e616a6185aab905a8c2d5196a90c2d51985a9f208616a66ea79 85a99e4b55288583751ba8f25a97c96ab510b09ba8dd4be4b52f92d5a280ec3734f5349e 43548b03568a05288a0d48291616a95616ab5045a882d48b42c2d52ac2d56a9a34511d10 ab912d451426af4509a3d9a2d407c51d5c8e2a48a2357a28ba52f668d54048a1f6ab71c1 ed524517b55d8e318e953ec91a2815d20f6ab0907b55848c7a55948c7a51ecd15c856483 daac25bfb559441e9561107a51c88a502b25bfb54820f6aba883d29db07a51ca3e429087 da9e22ab7b47a51b453e51f2958474f09536d146053b0ec47b6976d498a314c2c3314b8a 7628c5031294518a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a 2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a 2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a 2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a 2800a434b4868003494b49400d34869d49400d35130a988a630a426576150b2d5965a8d9 6a5a21a2a32542c957592a264a968868a4c950b4757d92a268ea1a21a33da2a85a2f6ad2 68aa368aa1c4871331a1a85a1f6ad4686a330fb54b899b8196d07b546d07b56a987da986 0f6a9e52790c9683daa3683dab5cc1ed4c36fed4b945c8639b7f6a8cdbfb56c9b7f6a61b 7f6a5c82e4318db7b530db7b56c9b7f6a69b6f6aa510e4314db7b5466dbdab70db7b530d b7b55288721866d7da9a6d7dab70dafb534dafb53e50e4308dafb530dafb56f1b5f6a61b 5f6a7ca1c8609b4f6a6fd93dab78da7b527d93da8e5172185f64f6a5fb27b56e7d93da8f b27b55a43e430fec9ed47d93dab73ec9ed47d93daad21f2189f64f6a78b5f6ad9fb27b53 85afb55a2940c816bed4f16bed5ae2d7da9e2d7daad14a2648b6f6a905b7b56a8b6f6a78 b6f6aa45a899d1dbfb55c8e0f6ab496fed56520f6a772d4482387daae45154890fb55948 bda91690d8e3ab68942475611291a2422254eab42ad4aab4862a8a9d0531454aa290c956 9d4d5a75030a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 800a28a2800a28a2800a28a2800a28a2800a434b486800a28a280128c52d26280108a611 5252114010914c2b53914d2b489b15ca530a55a2b4d294ac2b150a530c7570c74863a9b1 3ca5131d30c5ed57cc54d317b52e517299e61a6187dab48c54df27da97293c866987da9a 60f6ad3f27da9be47b52e517219860f6a61b7f6ad5f23da90c1ed4728721926dfda9a6df dab5fecfed49f67f6a5c82e4320dbfb534db7b56c7d9fda93ecded4f94390c636ded486d bdab67ecded49f66f6a7ca1c8629b5f6a436bed5b5f65f6a3ecbed4728721866d7da90da fb56e7d97da93ecbed4f94390c2369ed49f64f6addfb27b51f64f6a394390c2fb27b51f6 4f6addfb27b51f64f6a760e430fec9ed47d93dab73ec9ed47d93daaac3e430fec9ed4a2d 7dab6fec9ed4bf65f6a61c8630b5f6a516bed5b3f65f6a5fb2fb532b94c816ded4e16ded 5adf66f6a5fb37b531f2996b6fed53ac1ed57c5bfb54820f6a771f294961f6a9962ab421 a9045ed48ab15d63a9952a511d3c2503b1105a902d3c25382d2188ab4f028029c0500385 2d20a5a06145145001451450014514500145145001451450014514500145145001451450 014514500145145001451450014514500145145001451450014514500145145001451450 014514500145145001451450014514500145145001451450014514500145145001451450 014514500145145001451450014514500145145001451450014514500145145001451450 014514500145145001451450014514500145145002514b45002514b45002518a5a280131 49b69d4500376d1b29d450033651e5d3e8a00679749e5d494501623f2a8f285494516158 8bc9147922a5a29582c45e48a4f2454d45160b10f9028f2054d45160b221f2051f671535 14582c41f671ed47d9c7b54f453b05883ece3da8fb38f6a9e8a02c41f661ed49f661ed56 28a02c8aff00661ed47d987b558a280b22bfd987b51f6615628a02c8aff66147d98558a2 80b15fecc297ecc2a7a280b107d9851f67153d1405883ece28fb38a9e8a02c43e40a5f24 54b4503b11792297ca15251400cf2c51b29f4500376d1b69d45002628c52d140094b4514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 005145140051451400514514005145140051451400514514005145140051451400514514 01ffd91c02c80002000b1c02c900020001 S_CIDATHǭoTƟ3sg2`lc)RR4JnE@6-HT-ZĒU)$5IBU]&x0c{♹w4HMQ?ttsC4MB_Y*_p?|4{U1~D8Xϓ7=j ⢰.1B%{~]S&Ɔщ2J.Og|KsZhg | p&|~_%'blzc̓@w[+r~} lbhofY\h~/S]Uaw4ck9)-ץTS[s1L(l:1&Kjp{?v!4 D^l4{/V=Pp $!!?>>NLDbɱ(b7[:l{7̳;9‡eNQ7(ϫwqr2Hjtnu BH sK iغ=D *bQ.bu:^bQLIkOόŒXCO|%PiDN ENT!\E*!ozVNΨda^zlfp?` E90ci*Hq.{@tZJJn,J{#7rpmyǓ\Z0$~}#jO޲YTP^ݹs{ >1veeކHX\F*|t cET?Gkr r{=Ha 'Y-2 $a@oذa{Վ:FjvT]XCP-K? G.sWݲe  !n}ko_+M誐&XY` #^goah8"55F3RSIV  &u3Av׮u@gsm֟x@ohq$ 669\IUc-V'|rX!dIQ RL6Հ xyPWw=g,,vo:wtA@jtn4A ɣafI(Wdڱ'5q5ːN [_$&~EWp9h X6g1U,^?+ !PlQeC@0pX!9gp^OAiyFn /!B`Υ *k*Ovewn )ᓕjr1y%Kv 4U5'mjqß = JOSM-DirectUpload org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature josm-plugins-0.0.svn30137/DirectUpload/.classpath0000644000175000017500000000056412163162642021077 0ustar andrewandrew josm-plugins-0.0.svn30137/DirectUpload/README0000644000175000017500000000030211360310264017753 0ustar andrewandrewDirectly uploads GPX from active layer in JOSM to OpenStreetMap Server. More Details and FAQ's at : http://wiki.openstreetmap.org/index.php/User:Subhodip/GSoC_Doc#DirectUpload_Plugin_in_JOSM_: josm-plugins-0.0.svn30137/DirectUpload/data/0000755000175000017500000000000012275270064020022 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/build.xml0000644000175000017500000000260512233576561020742 0ustar andrewandrew josm-plugins-0.0.svn30137/DirectUpload/LICENSE0000644000175000017500000004316611127201641020116 0ustar andrewandrew GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. josm-plugins-0.0.svn30137/DirectUpload/nbproject/0000755000175000017500000000000012275270064021077 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/nbproject/genfiles.properties0000644000175000017500000000067711110156516025013 0ustar andrewandrewbuild.xml.data.CRC32=700b934e build.xml.script.CRC32=eedbed8a build.xml.stylesheet.CRC32=be360661 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=700b934e nbproject/build-impl.xml.script.CRC32=d2fe92a8 nbproject/build-impl.xml.stylesheet.CRC32=487672f9 josm-plugins-0.0.svn30137/DirectUpload/nbproject/project.xml0000644000175000017500000000106611110156516023262 0ustar andrewandrew org.netbeans.modules.java.j2seproject DirectUpload 1.6.5 josm-plugins-0.0.svn30137/DirectUpload/nbproject/private/0000755000175000017500000000000012275270064022551 5ustar andrewandrewjosm-plugins-0.0.svn30137/DirectUpload/nbproject/project.properties0000644000175000017500000000357612174301462024671 0ustar andrewandrewbuild.classes.dir=${build.dir}/classes build.classes.excludes=**/*.java,**/*.form # This directory is removed when the project is cleaned: build.dir=build build.generated.dir=${build.dir}/generated build.generated.sources.dir=${build.dir}/generated-sources # Only compile against the classpath explicitly listed here: build.sysclasspath=ignore build.test.classes.dir=${build.dir}/test/classes build.test.results.dir=${build.dir}/test/results debug.classpath=\ ${run.classpath} debug.test.classpath=\ ${run.test.classpath} # This directory is removed when the project is cleaned: dist.dir=dist dist.jar=${dist.dir}/DirectUpload.jar dist.javadoc.dir=${dist.dir}/javadoc excludes= includes=** jar.compress=false javac.classpath= # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false javac.source=1.5 javac.target=1.5 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ ${libs.junit.classpath}:\ ${libs.junit_4.classpath} javadoc.additionalparam= javadoc.author=false javadoc.encoding=${source.encoding} javadoc.noindex=false javadoc.nonavbar=false javadoc.notree=false javadoc.private=false javadoc.splitindex=true javadoc.use=true javadoc.version=false javadoc.windowtitle= main.class=org.openstreetmap.josm.plugins.DirectUpload.UploadDataGui manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF platform.active=default_platform run.classpath=\ ${javac.classpath}:\ ${build.classes.dir} # Space-separated list of JVM arguments used when running the project # (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value # or test-sys-prop.name=value to set system properties for unit tests): run.jvmargs= run.test.classpath=\ ${javac.test.classpath}:\ ${build.test.classes.dir} source.encoding=UTF-8 src.dir=src test.src.dir=test josm-plugins-0.0.svn30137/DirectUpload/nbproject/build-impl.xml0000644000175000017500000007747211127201641023666 0ustar andrewandrew Must set src.dir Must set test.src.dir Must set build.dir Must set dist.dir Must set build.classes.dir Must set dist.javadoc.dir Must set build.test.classes.dir Must set build.test.results.dir Must set build.classes.excludes Must set dist.jar Must set javac.includes Must select some files in the IDE or set javac.includes To run this application from the command line without Ant, try: java -cp "${run.classpath.with.dist.jar}" ${main.class} To run this application from the command line without Ant, try: java -jar "${dist.jar.resolved}" Must select one file in the IDE or set run.class Must select one file in the IDE or set debug.class Must set fix.includes Must select some files in the IDE or set javac.includes Some tests failed; see details above. Must select some files in the IDE or set test.includes Some tests failed; see details above. Must select one file in the IDE or set test.class Must select one file in the IDE or set applet.url Must select one file in the IDE or set applet.url josm-plugins-0.0.svn30137/measurement/0000755000175000017500000000000012275270070017054 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/.settings/0000755000175000017500000000000012275270070020772 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000001504312135470704025760 0ustar andrewandreweclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 josm-plugins-0.0.svn30137/measurement/src/0000755000175000017500000000000012275270070017643 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/src/org/0000755000175000017500000000000012275270070020432 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/0000755000175000017500000000000012275270070023320 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/0000755000175000017500000000000012275270070024270 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/0000755000175000017500000000000012275270070025751 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/0000755000175000017500000000000012275270070030276 5ustar andrewandrew././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementLayer.javajosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementLaye0000644000175000017500000002403712143057374033333 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.measurement; /// @author Raphael Mack import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collection; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.gpx.GpxTrack; import org.openstreetmap.josm.data.gpx.GpxTrackSegment; import org.openstreetmap.josm.data.gpx.WayPoint; import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.NavigatableComponent; import org.openstreetmap.josm.gui.dialogs.LayerListDialog; import org.openstreetmap.josm.gui.dialogs.LayerListPopup; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.tools.ImageProvider; /** * This is a layer that draws a grid */ public class MeasurementLayer extends Layer { public MeasurementLayer(String arg0) { super(arg0); } private static Icon icon = new ImageIcon(Toolkit.getDefaultToolkit().createImage(MeasurementPlugin.class.getResource("/images/measurement.png"))); private Collection points = new ArrayList(32); @Override public Icon getIcon() { return icon; } @Override public String getToolTipText() { return tr("Layer to make measurements"); } @Override public boolean isMergable(Layer other) { //return other instanceof MeasurementLayer; return false; } @Override public void mergeFrom(Layer from) { // TODO: nyi - doubts about how this should be done are around. Ideas? } @Override public void paint(Graphics2D g, final MapView mv, Bounds bounds) { g.setColor(Color.green); Point l = null; for(WayPoint p:points){ Point pnt = mv.getPoint(p.getCoor()); if (l != null){ g.drawLine(l.x, l.y, pnt.x, pnt.y); } g.drawOval(pnt.x - 2, pnt.y - 2, 4, 4); l = pnt; } } @Override public void visitBoundingBox(BoundingXYVisitor v) { // nothing to do here } @Override public Object getInfoComponent() { return getToolTipText(); } @Override public Action[] getMenuEntries() { return new Action[]{ LayerListDialog.getInstance().createShowHideLayerAction(), // TODO: implement new JMenuItem(new LayerListDialog.DeleteLayerAction(this)), SeparatorLayerAction.INSTANCE, new GPXLayerImportAction(this), SeparatorLayerAction.INSTANCE, new LayerListPopup.InfoAction(this)}; } public void removeLastPoint(){ WayPoint l = null; for(WayPoint p:points) l = p; if(l != null) points.remove(l); recalculate(); Main.map.repaint(); } public void mouseClicked(MouseEvent e){ if (e.getButton() != MouseEvent.BUTTON1) return; LatLon coor = Main.map.mapView.getLatLon(e.getX(), e.getY()); points.add(new WayPoint(coor)); Main.map.repaint(); recalculate(); } public void reset(){ points.clear(); recalculate(); Main.map.repaint(); } private void recalculate(){ double pathLength = 0.0, segLength = 0.0; // in meters WayPoint last = null; pathLength = 0.0; for(WayPoint p : points){ if(last != null){ segLength = calcDistance(last, p); pathLength += segLength; } last = p; } if (MeasurementPlugin.measurementDialog != null) { MeasurementPlugin.measurementDialog.pathLengthLabel.setText(NavigatableComponent.getDistText(pathLength)); } } /* * Use an equal area sinusoidal projection to improve accuracy and so we can still use normal polygon area calculation * http://stackoverflow.com/questions/4681737/how-to-calculate-the-area-of-a-polygon-on-the-earths-surface-using-python */ public static double calcX(LatLon p1){ return p1.lat() * Math.PI * 6367000 / 180; } public static double calcY(LatLon p1){ return p1.lon() * ( Math.PI * 6367000 / 180) * Math.cos(p1.lat() * Math.PI / 180); } public static double calcDistance(WayPoint p1, WayPoint p2){ return p1.getCoor().greatCircleDistance(p2.getCoor()); } public static double angleBetween(WayPoint p1, WayPoint p2){ return angleBetween(p1.getCoor(), p2.getCoor()); } public static double angleBetween(LatLon p1, LatLon p2){ double lat1, lon1, lat2, lon2; double dlon; lat1 = p1.lat() * Math.PI / 180.0; lon1 = p1.lon() * Math.PI / 180.0; lat2 = p2.lat() * Math.PI / 180.0; lon2 = p2.lon() * Math.PI / 180.0; dlon = lon2 - lon1; double coslat2 = Math.cos(lat2); return (180 * Math.atan2(coslat2 * Math.sin(dlon), (Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * coslat2 * Math.cos(dlon)))) / Math.PI; } public static double oldAngleBetween(LatLon p1, LatLon p2){ double lat1, lon1, lat2, lon2; double dlon, dlat; double heading; lat1 = p1.lat() * Math.PI / 180.0; lon1 = p1.lon() * Math.PI / 180.0; lat2 = p2.lat() * Math.PI / 180.0; lon2 = p2.lon() * Math.PI / 180.0; dlon = lon2 - lon1; dlat = lat2 - lat1; double a = (Math.pow(Math.sin(dlat/2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dlon/2), 2)); double d = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); heading = Math.acos((Math.sin(lat2) - Math.sin(lat1) * Math.cos(d)) / (Math.sin(d) * Math.cos(lat1))); if (Math.sin(lon2 - lon1) < 0) { heading = 2 * Math.PI - heading; } return heading * 180 / Math.PI; } private class GPXLayerImportAction extends AbstractAction { /** * The data model for the list component. */ private DefaultListModel model = new DefaultListModel(); /** * @param layer the targeting measurement layer */ public GPXLayerImportAction(MeasurementLayer layer) { super(tr("Import path from GPX layer"), ImageProvider.get("dialogs", "edit")); // TODO: find better image } @Override public void actionPerformed(ActionEvent e) { Box panel = Box.createVerticalBox(); final JList layerList = new JList(model); Collection data = Main.map.mapView.getAllLayers(); Layer lastLayer = null; int layerCnt = 0; for (Layer l : data){ if(l instanceof GpxLayer){ model.addElement(l); lastLayer = l; layerCnt++; } } if(layerCnt == 1){ layerList.setSelectedValue(lastLayer, true); } if(layerCnt > 0){ layerList.setCellRenderer(new DefaultListCellRenderer(){ @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Layer layer = (Layer)value; JLabel label = (JLabel)super.getListCellRendererComponent(list, layer.getName(), index, isSelected, cellHasFocus); Icon icon = layer.getIcon(); label.setIcon(icon); label.setToolTipText(layer.getToolTipText()); return label; } }); JCheckBox dropFirst = new JCheckBox(tr("Drop existing path")); panel.add(layerList); panel.add(dropFirst); final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){ @Override public void selectInitialValue() { layerList.requestFocusInWindow(); } }; final JDialog dlg = optionPane.createDialog(Main.parent, tr("Import path from GPX layer")); dlg.setVisible(true); Object answer = optionPane.getValue(); if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) { return; } GpxLayer gpx = (GpxLayer)layerList.getSelectedValue(); if(dropFirst.isSelected()){ points = new ArrayList(32); } for (GpxTrack trk : gpx.data.tracks) { for (GpxTrackSegment trkseg : trk.getSegments()) { for(WayPoint p: trkseg.getWayPoints()){ points.add(p); } } } recalculate(); Main.parent.repaint(); }else{ // TODO: register a listener and show menu entry only if gps layers are available // no gps layer JOptionPane.showMessageDialog(Main.parent,tr("No GPX data layer found.")); } } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementPlugin.javajosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementPlug0000644000175000017500000000433612015664155033347 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.measurement; /// @author Raphael Mack import static org.openstreetmap.josm.tools.I18n.tr; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.IconToggleButton; import org.openstreetmap.josm.gui.MapFrame; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.MapView.LayerChangeListener; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; public class MeasurementPlugin extends Plugin { private IconToggleButton btn; private MeasurementMode mode; protected static MeasurementDialog measurementDialog; protected static MeasurementLayer currentLayer; public MeasurementPlugin(PluginInformation info) { super(info); } @Override public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) { if (newFrame != null) { newFrame.addToggleDialog(measurementDialog = new MeasurementDialog()); mode = new MeasurementMode(newFrame, "measurement", tr("measurement mode")); btn = new IconToggleButton(mode); btn.setVisible(true); newFrame.addMapMode(btn); } else { btn = null; mode = null; measurementDialog = null; } } public static MeasurementLayer getCurrentLayer() { if (currentLayer == null) { currentLayer = new MeasurementLayer(tr("Measurements")); Main.main.addLayer(currentLayer); MapView.addLayerChangeListener(new LayerChangeListener(){ public void activeLayerChange(final Layer oldLayer, final Layer newLayer) { if(newLayer instanceof MeasurementLayer) MeasurementPlugin.currentLayer = (MeasurementLayer)newLayer; } public void layerAdded(final Layer newLayer) { } public void layerRemoved(final Layer oldLayer) { if (oldLayer != null && oldLayer == currentLayer) MapView.removeLayerChangeListener(this); } }); } return currentLayer; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementMode.javajosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementMode0000644000175000017500000000341511141405442033310 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.measurement; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.mapmode.MapMode; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.gui.MapFrame; public class MeasurementMode extends MapMode { private static final long serialVersionUID = 3853830673475744263L; public MeasurementMode(MapFrame mapFrame, String name, String desc) { super(name, "measurement.png", desc, mapFrame, Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } @Override public void enterMode() { super.enterMode(); Main.map.mapView.addMouseListener(this); } @Override public void exitMode() { super.exitMode(); Main.map.mapView.removeMouseListener(this); } /** * If user clicked with the left button, add a node at the current mouse * position. * * If in nodesegment mode, add the node to the line segment by splitting the * segment. The new created segment will be inserted in every way the segment * was part of. */ @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3){ MeasurementPlugin.getCurrentLayer().removeLastPoint(); }else if (e.getButton() == MouseEvent.BUTTON1){ LatLon coor = Main.map.mapView.getLatLon(e.getX(), e.getY()); if (coor.isOutSideWorld()) { JOptionPane.showMessageDialog(Main.parent,tr("Can not draw outside of the world.")); return; } MeasurementPlugin.getCurrentLayer().mouseClicked(e); } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootjosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.javajosm-plugins-0.0.svn30137/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDial0000644000175000017500000002275312245747563033326 0ustar andrewandrewpackage org.openstreetmap.josm.plugins.measurement; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.text.DecimalFormat; import java.util.Arrays; import java.util.Collection; import javax.swing.AbstractAction; import javax.swing.JLabel; import javax.swing.JPanel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.SelectionChangedListener; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; import org.openstreetmap.josm.data.osm.event.DataChangedEvent; import org.openstreetmap.josm.data.osm.event.DataSetListener; import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; import org.openstreetmap.josm.gui.NavigatableComponent; import org.openstreetmap.josm.gui.SideButton; import org.openstreetmap.josm.gui.NavigatableComponent.SoMChangeListener; import org.openstreetmap.josm.gui.dialogs.ToggleDialog; import org.openstreetmap.josm.gui.help.HelpUtil; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.tools.ImageProvider; import org.openstreetmap.josm.tools.Shortcut; import org.openstreetmap.josm.tools.SubclassFilteredCollection; /** * A small tool dialog for displaying the current measurement data. * * @author ramack */ public class MeasurementDialog extends ToggleDialog implements SelectionChangedListener, DataSetListener, SoMChangeListener { private static final long serialVersionUID = 4708541586297950021L; /** * The reset button */ private SideButton resetButton; /** * The measurement label for the path length */ protected JLabel pathLengthLabel; /** * The measurement label for the currently selected segments */ protected JLabel selectLengthLabel; /** * The measurement label for area of the currently selected loop */ protected JLabel selectAreaLabel; /** * The measurement label for the segment angle, actually updated, if 2 nodes are selected */ protected JLabel segAngleLabel; private DataSet ds; private Collection ways; private Collection nodes; /** * Constructor */ public MeasurementDialog() { super(tr("Measured values"), "measure", tr("Open the measurement window."), Shortcut.registerShortcut("subwindow:measurement", tr("Toggle: {0}", tr("Measured values")), KeyEvent.VK_U, Shortcut.CTRL_SHIFT), 150); resetButton = new SideButton(new AbstractAction() { { putValue(NAME, tr("Reset")); putValue(SMALL_ICON,ImageProvider.get("dialogs", "select")); putValue(SHORT_DESCRIPTION, tr("Reset current measurement results and delete measurement path.")); putValue("help", HelpUtil.ht("/Dialog/Measurement#Reset")); } @Override public void actionPerformed(ActionEvent e) { resetValues(); } }); JPanel valuePanel = new JPanel(new GridLayout(0,2)); valuePanel.add(new JLabel(tr("Path Length"))); pathLengthLabel = new JLabel(getDistText(0)); valuePanel.add(pathLengthLabel); valuePanel.add(new JLabel(tr("Selection Length"))); selectLengthLabel = new JLabel(getDistText(0)); valuePanel.add(selectLengthLabel); valuePanel.add(new JLabel(tr("Selection Area"))); selectAreaLabel = new JLabel(getAreaText(0)); valuePanel.add(selectAreaLabel); JLabel angle = new JLabel(tr("Angle")); angle.setToolTipText(tr("Angle between two selected Nodes")); valuePanel.add(angle); segAngleLabel = new JLabel("- \u00b0"); valuePanel.add(segAngleLabel); this.setPreferredSize(new Dimension(0, 92)); createLayout(valuePanel, false, Arrays.asList(new SideButton[] { resetButton })); DataSet.addSelectionListener(this); NavigatableComponent.addSoMChangeListener(this); } protected String getDistText(double v) { return NavigatableComponent.getSystemOfMeasurement().getDistText(v, new DecimalFormat("#0.000"), 1e-3); } protected String getAreaText(double v) { return NavigatableComponent.getSystemOfMeasurement().getAreaText(v, new DecimalFormat("#0.000"), 1e-3); } protected String getAngleText(double v) { return new DecimalFormat("#0.0").format(v) + " \u00b0"; } /** * Cleans the active Measurement Layer */ public void resetValues(){ MeasurementPlugin.getCurrentLayer().reset(); } @Override public void selectionChanged(Collection newSelection) { double length = 0.0; double segAngle = 0.0; double area = 0.0; Node lastNode = null; // Don't mix up way and nodes computation (fix #6872). Priority given to ways ways = new SubclassFilteredCollection(newSelection, OsmPrimitive.wayPredicate); if (ways.isEmpty()) { nodes = new SubclassFilteredCollection(newSelection, OsmPrimitive.nodePredicate); for (Node n : nodes) { if (n.getCoor() != null) { if (lastNode == null) { lastNode = n; } else { length += lastNode.getCoor().greatCircleDistance(n.getCoor()); segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor()); lastNode = n; } } } } else { nodes = null; for (Way w : ways) { Node lastN = null; double wayArea = 0.0; for (Node n: w.getNodes()) { if (lastN != null && lastN.getCoor() != null && n.getCoor() != null) { length += lastN.getCoor().greatCircleDistance(n.getCoor()); //http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ wayArea += (MeasurementLayer.calcX(n.getCoor()) * MeasurementLayer.calcY(lastN.getCoor())) - (MeasurementLayer.calcY(n.getCoor()) * MeasurementLayer.calcX(lastN.getCoor())); segAngle = MeasurementLayer.angleBetween(lastN.getCoor(), n.getCoor()); } lastN = n; } if (lastN != null && lastN == w.getNodes().iterator().next()) wayArea = Math.abs(wayArea / 2); else wayArea = 0; area += wayArea; } } final String lengthLabel = getDistText(length); final String angleLabel = getAngleText(segAngle); final String areaLabel = getAreaText(area); GuiHelper.runInEDT(new Runnable() { @Override public void run() { selectLengthLabel.setText(lengthLabel); segAngleLabel.setText(angleLabel); selectAreaLabel.setText(areaLabel); } }); DataSet currentDs = Main.main.getCurrentDataSet(); if (ds != currentDs) { if (ds != null) { ds.removeDataSetListener(this); } if (currentDs != null) { currentDs.addDataSetListener(this); } ds = currentDs; } } @Override public void destroy() { super.destroy(); NavigatableComponent.removeSoMChangeListener(this); DataSet.removeSelectionListener(this); if (ds != null) { ds.removeDataSetListener(this); ds = null; } } private boolean waysContain(Node n) { if (ways != null) { for (Way w : ways) { if (w.containsNode(n)) { return true; } } } return false; } @Override public void nodeMoved(NodeMovedEvent event) { Node n = event.getNode(); // Refresh selection if a node belonging to a selected member has moved (example: scale action) if ((nodes != null && nodes.contains(n)) || waysContain(n)) { selectionChanged(Main.main.getCurrentDataSet().getSelected()); } } @Override public void primitivesAdded(PrimitivesAddedEvent event) {} @Override public void primitivesRemoved(PrimitivesRemovedEvent event) {} @Override public void tagsChanged(TagsChangedEvent event) {} @Override public void wayNodesChanged(WayNodesChangedEvent event) { } @Override public void relationMembersChanged(RelationMembersChangedEvent event) {} @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {} @Override public void dataChanged(DataChangedEvent event) {} @Override public void systemOfMeasurementChanged(String oldSoM, String newSoM) { // Refresh selection to take into account new system of measurement selectionChanged(Main.main.getCurrentDataSet().getSelected()); } } josm-plugins-0.0.svn30137/measurement/images/0000755000175000017500000000000012275270070020321 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/images/measurement.png0000644000175000017500000000051511057050175023354 0ustar andrewandrewPNG  IHDRhIDAT8Oҿ+QW2ȏ XՍםd0N$?b$פt LA)0v/99cBcX3Z*R19F/c/ٗtHx ?Rs$I:(W3!Iq*h0p-y2F_aY, 7IENDB`josm-plugins-0.0.svn30137/measurement/images/mapmode/0000755000175000017500000000000012275270070021743 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/images/mapmode/measurement.png0000644000175000017500000000123011057050175024771 0ustar andrewandrewPNG  IHDRp n_IDATHKՕk`?oY,m/I((*ga zRЫl_`yQAgA)T(Te>wIdڋxIO :kD95ꢂw`dCS8iNAgw =@Yeў`ELخ#APa'9|7gV!Ua& 0|z?6{ ˷X2ot6Vp[g}D{zDULQG#^R𫓆XovFs$pxNM]hOG? ]`ʲaE~D{r& $="ĕGoCǔUc)qBNY @9f7خ)@,DO!ޗnǀ ;4V7NBNwP hOKhO䵃=-ţe#kخ#)TKA5,os<?qD̐BAF}Ә:mrEZvlT2:[?9P@xB( `*`;w T+~1 {^Ij*VI7aIENDB`josm-plugins-0.0.svn30137/measurement/images/dialogs/0000755000175000017500000000000012275270070021743 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/images/dialogs/measure.png0000644000175000017500000000136511057050175024116 0ustar andrewandrewPNG  IHDRp nIDATHK[UU8Q"Tiv1"$ȡfc(J,!*"D^zh2"I Dv3/%DCe9om̜._8,,o+/<>xz /ϳu80v̬_|І'q6bGaY1ovp*`}6j f>* (<+:obt~T܏FGm Ocq%g`'+c/>u)a6c[we!TQ>b܅8\l6~qSC"qDuF>Ws$by=n"*6U{pTz<"(է_jL9O&9F g~ Ye> vktx.*w w&|[R0g|Wo|+xM3KZIR )y| CwVaye~8ЍxP (I*bdsүwuoI;np;) DY]Vq ɚ۱XSl|GӁxWj!'"IdQ1Y;Ʉ$ŲUZ̀h{%p\@nks_&)*)o9 E IENDB`josm-plugins-0.0.svn30137/measurement/.project0000644000175000017500000000056711215762346020540 0ustar andrewandrew JOSM-Measurement org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature josm-plugins-0.0.svn30137/measurement/.classpath0000644000175000017500000000066112135470704021043 0ustar andrewandrew josm-plugins-0.0.svn30137/measurement/data/0000755000175000017500000000000012275270070017765 5ustar andrewandrewjosm-plugins-0.0.svn30137/measurement/build.xml0000644000175000017500000000215412245747563020714 0ustar andrewandrew josm-plugins-0.0.svn30137/measurement/LICENSE0000644000175000017500000000023111153256615020060 0ustar andrewandrew Plugin measurement This plugins is copyrighted 2007-2008 by Raphael Mack . It is distributed under a GPL-3 license or later.